291{
295
297 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
301
303 JLimit_t& numberOfEvents = inputFile.getLimit();
304 string detectorFile;
305 JCalibration_t calibrationFile;
306 double Tmax_s;
307 string pdfFile;
309 bool overwriteDetector;
312 int number_of_iterations = 1000;
313 int number_of_extra_steps = 0;
314 double epsilon = 1.0e-4;
315 double T_ns = 2.5;
316 size_t threads;
318
319 const int DEFAULT_ID = -1;
320
321 try {
322
324
329
330 JParser<> zap(
"Program to determine string or optical module time calibrations.");
331
339 zap[
'A'] =
make_field(overwriteDetector,
"overwrite detector file provided through '-a' with fitted time offsets.");
343 zap[
'N'] =
make_field(threads,
"number of threads") = 1;
345
346 zap(argc, argv);
347 }
348 catch(const exception& error) {
349 FATAL(error.what() << endl);
350 }
351
352
353 if (strings.empty() == modules.empty()) {
354 FATAL(
"Set either strings (option -S) or modules (option -M)." << endl);
355 }
356
358
359 try {
361 }
364 }
365
366 unique_ptr<JDynamics> dynamics;
367
368 try {
369
371
372 dynamics->load(calibrationFile);
373 }
374 catch(const exception& error) {
375 if (!calibrationFile.empty()) {
377 }
378 }
379
381
382 NOTICE(
"Reading PDFs... " << flush);
383
385
387
388 JRegressor_t::debug =
debug;
389 JRegressor_t::Vmax_npe = parameters.
VMax_npe;
390 JRegressor_t::MAXIMUM_ITERATIONS = parameters.
NMax;
391
392
393
394 NOTICE(
"Reading data" << endl);
395
397
399
402
404
406
407 for (JParallelFileScanner_t in(*i); (skip -= in.skip(skip)) == 0 && in.hasNext() && counter != numberOfEvents; ++counter) {
408
409 STATUS(
"event: " << setw(10) << counter <<
'\r');
DEBUG(endl);
410
411 multi_pointer_type ps = in.next();
412
415
416 summary.update(*tev);
417
418 if (dynamics) {
419 dynamics->update(*tev);
420 }
421
423
424 if (evt->begin() != __end) {
425
427
429
430 buildL0(*tev, router, true, back_inserter(dataL0));
431
433
437
441 }
442
444
445
446
448
449 for (vector<JHitL0>::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
450
451 JHitW0 hit(*i, summary.getRate(i->getPMTIdentifier(), parameters.
R_Hz));
452
453 hit.rotate(R);
454
455 if (match(hit)) {
456 buffer.push_back(hit);
457 }
458 }
459
460
461
463
464 buffer_type::const_iterator __end = unique(buffer.begin(), buffer.end(), equal_to<JDAQPMTIdentifier>());
465
466
467
469
470 for (buffer_type::const_iterator hit = buffer.begin(); hit != __end; ++hit) {
471
472 const JModule& module = router.getModule(hit->getModuleID());
473
474 if (!strings.empty()) {
map[module.
getString()].push_back(*hit); }
475 if (!modules.empty()) {
map[module.
getID()] .push_back(*hit); }
476 }
477
478 data.push_back({
map, tz,
true});
479 }
480 }
481 }
484
485
486
487
488 JGradient fit(number_of_iterations, number_of_extra_steps, epsilon, 3);
489
492
495
497
498 const double chi2 = fit(perth);
499
500 STATUS(
"result: " <<
FIXED(12,6) << chi2 <<
' ' << setw(6) << fit.numberOfIterations << endl);
501
502 for (size_t i = 0; i != fit.size(); ++i) {
503 {
505
506 if (p != NULL) {
STATUS(fit[i].name <<
' ' <<
FIXED(9,3) << p->
t0 <<
" [ns]" << endl); }
507 }
508 }
509
510
511 if (overwriteDetector) {
512
514
516
517 for (size_t i = 0; i != fit.size(); ++i) {
518
520
521 if (p != NULL) {
523 }
524 }
525
527
528 for (JDetector::iterator module =
detector.begin(); module !=
detector.end(); ++module) {
529
530 if (!module->empty()) {
531
537 module->getPMT(pmt).addT0(p->second - t0);
538 }
539 }
540 }
541 }
542
543 NOTICE(
"Store calibration data on file " << detectorFile << endl);
544
546 }
547}
#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).
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
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 test history.
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.