281{
  285 
  287  typedef JParallelFileScanner_t::multi_pointer_type               multi_pointer_type;
  291 
  293  JLimit_t&                numberOfEvents = inputFile.getLimit();
 
  294  string                   detectorFile;
  295  JCalibration_t           calibrationFile;
  296  double                   Tmax_s;
  297  string                   pdfFile;
  299  bool                     overwriteDetector;
  302  int                      number_of_iterations    =  1000;
  303  int                      number_of_extra_steps   =     0;
  305  double                   T_ns                    =   2.5;      
  306  size_t                   threads;                              
  308 
  309  const int DEFAULT_ID = -1;
  310 
  311  try { 
  312 
  314 
  319 
  320    JParser<> zap(
"Program to determine string or optical module time calibrations.");
 
  321    
  329    zap[
'A'] = 
make_field(overwriteDetector, 
"overwrite detector file provided through '-a' with fitted time offsets.");
 
  333    zap[
'N'] = 
make_field(threads,           
"number of threads")                                = 1;
 
  335    
  336    zap(argc, argv);
  337  }
  338  catch(const exception& error) {
  339    FATAL(error.what() << endl);
 
  340  }
  341 
  342 
  343  if (strings.empty() == modules.empty()) {
  344    FATAL(
"Set either strings (option -S) or modules (option -M)." << endl);
 
  345  }
  346 
  348 
  349  try {
  351  }
  354  }
  355 
  356  unique_ptr<JDynamics> dynamics;
  357 
  358  try {
  359 
  361 
  362    dynamics->load(calibrationFile);
  363  }
  364  catch(const exception& error) {
  365    if (!calibrationFile.empty()) {
  367    }
  368  }
  369 
  371 
  372  NOTICE(
"Reading PDFs... " << flush);
 
  373 
  375 
  377 
  378  JRegressor_t::debug              = 
debug;
 
  379  JRegressor_t::Vmax_npe           = parameters.
VMax_npe;
 
  380  JRegressor_t::MAXIMUM_ITERATIONS = parameters.
NMax;
 
  381 
  382  
  383  
  385 
  387 
  390  
  392 
  394 
  395    for (JParallelFileScanner_t in(*i); (skip -= in.skip(skip)) == 0 && in.hasNext() && counter != numberOfEvents; ++counter) {
  396 
  397      STATUS(
"event: " << setw(10) << counter << 
'\r'); 
DEBUG(endl);
 
  398 
  399      multi_pointer_type ps  = in.next();
  400    
  403 
  404      summary.update(*tev);
  405 
  406      if (dynamics) {
  407        dynamics->update(*tev);
  408      }
  409 
  410      if (!evt->empty()) {
  411 
  413              
  414        buildL0(*tev, router, true, back_inserter(dataL0));
  415 
  417      
  421 
  425        }
  426 
  428 
  429        
  430 
  432 
  433        for (vector<JHitL0>::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
  434 
  435          JHitW0 hit(*i, summary.getRate(i->getPMTIdentifier(), parameters.
R_Hz));
 
  436 
  437          hit.rotate(R);
  438 
  439          if (match(hit)) {
  440            buffer.push_back(hit);
  441          }
  442        }
  443 
  444        
  445 
  447 
  448        buffer_type::const_iterator __end = unique(buffer.begin(), buffer.end(), equal_to<JDAQPMTIdentifier>());
  449 
  450        
  451        
  453 
  454        for (buffer_type::const_iterator hit = buffer.begin(); hit != __end; ++hit) {
  455          
  456          const JModule& module = router.getModule(hit->getModuleID());
 
  457 
  458          if (!strings.empty()) { 
map[module.
getString()].push_back(*hit); }
 
  459          if (!modules.empty()) { 
map[module.
getID()]    .push_back(*hit); }
 
  460        }
  461        
  463      }
  464    }
  465  }
  467 
  468 
  469  
  470 
  471  JGradient fit(number_of_iterations, number_of_extra_steps, epsilon, 3);
 
  472 
  475 
  478 
  480 
  481  const double   chi2  = fit(perth);
  482 
  483  STATUS(
"result: " << 
FIXED(12,6) << chi2 << 
' ' << setw(6) << fit.numberOfIterations << endl);
 
  484 
  485  for (size_t i = 0; i != fit.size(); ++i) {
  486    {
  488 
  489      if (p != NULL) { 
STATUS(fit[i].name << 
' ' << 
FIXED(9,3) << p->
t0 << 
" [ns]" << endl); }
 
  490    }
  491  }
  492 
  493 
  494  if (overwriteDetector) {
  495 
  497 
  499 
  500    for (size_t i = 0; i != fit.size(); ++i) {
  501 
  503 
  504      if (p != NULL) {
  506      }
  507    }
  508 
  510 
  511    for (JDetector::iterator module = 
detector.begin(); module != 
detector.end(); ++module) {
 
  512 
  513      if (!module->empty()) {
  514 
  520            module->getPMT(pmt).addT0(p->second - t0);
  521          }
  522        }
  523      }
  524    }
  525 
  526    NOTICE(
"Store calibration data on file " << detectorFile << endl);
 
  527 
  529  }
  530}
#define DEBUG(A)
Message macros.
 
#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
 
int getString() const
Get string number.
 
Router for direct addressing of module data in detector data structure.
 
Data structure for a composite optical module.
 
Utility class to parse parameter values.
 
Data structure for set of track fit results.
 
Data structure for track fit results with history and optional associated values.
 
const std::vector< double > & getW() const
Get associated values.
 
double getT() const
Get time.
 
bool hasW(const int i) const
Check availability of value.
 
Data structure for fit of straight line paralel to z-axis.
 
int getID() const
Get identifier.
 
Utility class to parse command line options.
 
Auxiliary class for a hit with background rate value.
 
General purpose class for object reading from a list of file names.
 
General purpose class for parallel reading of objects from a single file or multiple files.
 
File router for fast addressing of summary data.
 
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
JTOOLS::JRange< double > JTimeRange
Type definition for time range (unit [s]).
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
void store(const std::string &file_name, const JDetector &detector)
Store detector to output file.
 
std::set< int > getStringIDs(const JDetector &detector)
Get list of strings identifiers.
 
std::set< int > getModuleIDs(const JDetector &detector, const bool option=false)
Get list of modules identifiers.
 
JTOOLS::JRange< double > JZRange
 
const array_type< JValue_t > & get_values(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of values of map.
 
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Long64_t counter_type
Type definition for counter.
 
KM3NeT DAQ data structures and auxiliaries.
 
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
 
Auxiliary data structure for sequence of same character.
 
Auxiliary data structure for floating point format specification.
 
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
 
Dynamic detector calibration.
 
Auxiliary class to match data points with given model.
 
Auxiliary data structure for editable parameter.
 
Template data structure for storage of internal data.
 
Auxiliary class for recursive type list generation.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for editing time offset.
 
double t0
time offset [ns]
 
Data structure for fit parameters.
 
double TTS_ns
transition-time spread [ns]
 
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
 
double roadWidth_m
road width [m]
 
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
 
double VMax_npe
maximum number of of photo-electrons
 
double ZMax_m
maximal z-positon [m]
 
double ZMin_m
minimal z-positon [m]
 
int NMax
maximum number of iterations
 
double R_Hz
default rate [Hz]
 
Auxiliary data structure for chi2 function object.
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary data structure for sorting of hits.