282{
286
288 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
292
294 JLimit_t& numberOfEvents = inputFile.getLimit();
295 string detectorFile;
296 JCalibration_t calibrationFile;
297 double Tmax_s;
298 string pdfFile;
300 bool overwriteDetector;
303 int number_of_iterations = 1000;
304 int number_of_extra_steps = 0;
306 double T_ns = 2.5;
307 size_t threads;
309
310 const int DEFAULT_ID = -1;
311
312 try {
313
315
320
321 JParser<> zap(
"Program to determine inter-string time calibration.");
322
330 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with fitted time offsets.");
334 zap[
'N'] =
make_field(threads,
"number of threads") = 1;
336
337 zap(argc, argv);
338 }
339 catch(const exception& error) {
340 FATAL(error.what() << endl);
341 }
342
343
344 if (strings.empty() == modules.empty()) {
345 FATAL(
"Set either strings (option -S) or modules (option -M)." << endl);
346 }
347
349
350 try {
352 }
355 }
356
357 unique_ptr<JDynamics> dynamics;
358
359 try {
360
362
363 dynamics->load(calibrationFile);
364 }
365 catch(const exception& error) {
366 if (!calibrationFile.empty()) {
368 }
369 }
370
372
373 NOTICE(
"Reading PDFs... " << flush);
374
376
378
379 JRegressor_t::debug =
debug;
380 JRegressor_t::T_ns.setRange(parameters.
TMin_ns, parameters.
TMax_ns);
381 JRegressor_t::Vmax_npe = parameters.
VMax_npe;
382 JRegressor_t::MAXIMUM_ITERATIONS = parameters.
NMax;
383
384
385
386
388
390
393
395
397
398 for (JParallelFileScanner_t in(*i); (skip -= in.skip(skip)) == 0 && in.hasNext() && counter != numberOfEvents; ++counter) {
399
400 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
401
402 multi_pointer_type ps = in.next();
403
406
407 summary.update(*tev);
408
409 if (dynamics) {
410 dynamics->update(*tev);
411 }
412
413 if (!evt->empty()) {
414
416
417 buildL0(*tev, router, true, back_inserter(dataL0));
418
420
424
428 }
429
431
432
433
435
436 for (vector<JHitL0>::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
437
438 JHitW0 hit(*i, summary.getRate(i->getPMTIdentifier()));
439
440 hit.rotate(R);
441
442 if (match(hit)) {
443 buffer.push_back(hit);
444 }
445 }
446
447
448
450
451 buffer_type::const_iterator __end = unique(buffer.begin(), buffer.end(), equal_to<JDAQPMTIdentifier>());
452
453
454
456
457 for (buffer_type::const_iterator hit = buffer.begin(); hit != __end; ++hit) {
458
459 const JModule& module = router.getModule(hit->getModuleID());
460
461 if (!strings.empty()) {
map[module.
getString()].push_back(*hit); }
462 if (!modules.empty()) {
map[module.
getID()] .push_back(*hit); }
463 }
464
466 }
467 }
468 }
470
471
472
473
474 JGradient fit(number_of_iterations, number_of_extra_steps, epsilon, 3);
475
478
481
483
484 const double chi2 = fit(perth);
485
486 STATUS(
"result: " <<
FIXED(12,6) << chi2 <<
' ' << setw(6) << fit.numberOfIterations << endl);
487
488 for (size_t i = 0; i != fit.size(); ++i) {
489 {
491
492 if (p != NULL) {
STATUS(fit[i].name <<
' ' <<
FIXED(9,3) << p->
t0 <<
" [ns]" << endl); }
493 }
494 }
495
496
497 if (overwriteDetector) {
498
500
502
503 for (size_t i = 0; i != fit.size(); ++i) {
504
506
507 if (p != NULL) {
509 }
510 }
511
513
514 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
515
516 if (!module->empty()) {
517
523 module->getPMT(pmt).addT0(p->second - t0);
524 }
525 }
526 }
527 }
528
529 NOTICE(
"Store calibration data on file " << detectorFile << endl);
530
532 }
533}
#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 first and last hits in metres from JStart.cc
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
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 for PDF tables.
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.