37{
   40 
   41  string         login;
   42  string         locationID;
   43  int            elapsedTime = 0;
   44  
   47  
   49 
   50  try {
   51 
   53 
   57    
   58    JParser<> zap(
"Auxiliary program to merge high-voltage calibration results.");
 
   59 
   60    zap[
'f'] = 
make_field(inputFiles,   
"input  files");
 
   64 
   65    zap(argc, argv);
   66    
   67  } catch(const exception &error) {
   68    
   69    FATAL(error.what() << endl);
 
   70  }
   71 
   72  if (login.empty() || locationID.empty()) {
   73    FATAL(
"Missing user information (please specify via -#login and -#locationID)." << endl);
 
   74  }
   75 
   76 
   77  const JUUID& UUID = JUUID::rndm();
 
   78 
   80 
   81  timer.
sub(elapsedTime);
 
   82  
   83  
   84  
   85  
   89 
   91  
   92  for (vector<string>::const_iterator fileIt = inputFiles.cbegin(); fileIt != inputFiles.cend(); ++fileIt) {
   93 
   94    NOTICE(
"Merging " << (*fileIt) << endl);
 
   95 
   97 
   99      ifstream ifs(fileIt->c_str());
  100      
  101      ifs >> js;
  102      ifs.close();
  103 
  104      
  105    
  106      json::const_iterator i0 = js.find(APIVersion_t);
  107 
  108      if (i0 != js.cend()) {
  109      
  110        istringstream iss(i0->get<string>());
  111      
  112        iss >> DBAPIVersion;
  113      }
  114 
  116      
  117      json::const_iterator i1 = js.find(Data_t);
  118    
  120           (i1 != js.cend() && i1->size() > 0) ) {
  121 
  123 
  124        JHVCalibration_t::setVersion(getDBVersionTuneHV(*j));
  125        
  127        metaInfoStr   += (*i1)[0].at(Provenance_t + Info_t).at(Configuration_t).get<string>();
  128      
  129      } else {
  130        
  132 
  133        JHVCalibration_t::setVersion(getDBVersionTuneHV(*j));
  134        
  136      }
  137 
  138      
  139 
  140      for (JHVCalibration::const_iterator cal = HVcals.cbegin(); cal != HVcals.cend(); ++cal) {
  141        
  142        if (find_if(merged.cbegin(), merged.cend(), make_predicate(&JHVCalibration_t::getNumber, cal->getNumber())) == merged.cend()) {
  143          merged.push_back(*cal);
  144        }
  145      }
  146 
  147    } else {
  148 
  149      WARNING(*fileIt << 
" is not a JSON file; skip" << endl);
 
  150      continue;
  151    }
  152  }
  153 
  154  if (testTypes.size() > 1) {
  155   
  156    WARNING(
"Ambiguous database test types; Assuming " << *testTypes.crbegin() << endl);
 
  157    
  158  } else if (testTypes.size() == 0) {
  159    
  160    FATAL(
"No database test type specified.");
 
  161  }
  162 
  163 
  165 
  167 
  168    json error           = { {Message_t,              
""                      },
 
  169                             {Code_t,                 OK_t                    },
  170                             {Arguments_t,            json::array()           } };
  171    
  172    json metaData        = { {Configuration_t,        metaInfoStr             },
 
  174    
  176                             {User_t,                 login                   },
  177                             {Location_t,             locationID              },
  178                             {Start_t + Time_t,       timer.
toString()        },
 
  179                             {End_t   + Time_t,       timer().
toString()      },
 
  180                             {Test_t  + Type_t,     *(testTypes.crbegin())    },
  181                             {Tests_t,                
json(merged)            } };
 
  182      
  184    js[Data_t + Type_t]  = 
MAKE_STRING(
"ProductTestSession");
 
  186    js[Error_t]          = 
json(error);
 
  189    js[Data_t][0]        = 
json(data);
 
  190    
  191  } else {
  192 
  193    js[User_t]           = login;
  194    js[Location_t]       = locationID;
  195    js[Test_t + Type_t]  = *(testTypes.crbegin());
  196    js[Start_t + Time_t] = timer.
toString();
 
  197    js[End_t + Time_t]   = timer().
toString();
 
  198    js[Tests_t]          = 
json(merged);
 
  199  }
  200  
  202 
  203  ofs << setw(2) << setprecision(8);
  204  ofs << js;
  205 
  206  ofs.close();
  207 
  208  return 0;
  209}
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
#define MAKE_STRING(A)
Make string.
 
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
 
Utility class to parse parameter values.
 
Utility class to parse command line options.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
bool isJSONFile(const char *file_name)
Check file format.
 
Auxiliary data structure for general purpose version number.
 
version_type getMajorVersion() const
Get major version.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for date and time.
 
std::string toString() const
Get ASCII formatted date and time.
 
void sub(const time_t t1)
Subtract given time.