Jpp  debug
the software that should make you happy
Classes | Namespaces | Typedefs | Functions
JPerth.cc File Reference

Program to determine inter-string time calibration. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <type_traits>
#include <functional>
#include <future>
#include <mutex>
#include <thread>
#include <vector>
#include <set>
#include <memory>
#include <algorithm>
#include "km3net-dataformat/online/JDAQEvent.hh"
#include "km3net-dataformat/definitions/fitparameters.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDynamics/JDynamics.hh"
#include "JSupport/JMeta.hh"
#include "JSupport/JSupport.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JParallelFileScanner.hh"
#include "JSupport/JSummaryFileRouter.hh"
#include "JReconstruction/JHitW0.hh"
#include "JReconstruction/JEvt.hh"
#include "JReconstruction/JEvtToolkit.hh"
#include "JReconstruction/JMuonGandalfParameters_t.hh"
#include "JTrigger/JHitL0.hh"
#include "JTrigger/JBuildL0.hh"
#include "JFit/JFitToolkit.hh"
#include "JFit/JLine1Z.hh"
#include "JFit/JLine3Z.hh"
#include "JFit/JModel.hh"
#include "JFit/JGandalf.hh"
#include "JFit/JRegressorHelper.hh"
#include "JFit/JLine3ZRegressor.hh"
#include "JFit/JGradient.hh"
#include "JLang/JSTDObjectReader.hh"
#include "JLang/JVectorize.hh"
#include "JGeometry3D/JRotation3D.hh"
#include "JMath/JMath.hh"
#include "JMath/JQuantile_t.hh"
#include "JTools/JRange.hh"
#include "Jeep/JProperties.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Classes

struct  JRECONSTRUCTION::event_type
 Auxiliary data structure to store data and fit in memory. More...
 
struct  JRECONSTRUCTION::JStringEditor
 Auxiliary class to edit time offset of data per string. More...
 
struct  JRECONSTRUCTION::JPerth
 Thread pool for fits to data. More...
 
struct  JRECONSTRUCTION::JPerth_t
 Auxiliary data structure for chi2 function object. More...
 

Namespaces

 JRECONSTRUCTION
 Model fits to data.
 

Typedefs

typedef std::vector< JHitW0JRECONSTRUCTION::buffer_type
 hits More...
 
typedef std::map< int, buffer_typeJRECONSTRUCTION::map_type
 string -> hits More...
 
typedef std::vector< event_typeJRECONSTRUCTION::data_type
 
typedef JLANG::JSTDObjectReader< const event_typeJRECONSTRUCTION::input_type
 
typedef JFIT::JRegressorStorage< JFIT::JLine3Z, JFIT::JGandalfJRECONSTRUCTION::JRegressorStorage_t
 
typedef JFIT::JRegressor< JFIT::JLine3Z, JFIT::JGandalfJRECONSTRUCTION::JRegressor_t
 

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to determine inter-string time calibration.

Author
mdejong

Definition in file JPerth.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 280 of file JPerth.cc.

281 {
282  using namespace std;
283  using namespace JPP;
284  using namespace KM3NETDAQ;
285 
286  typedef JParallelFileScanner< JTypeList<JDAQEvent, JFIT::JEvt> > JParallelFileScanner_t;
287  typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
289  JACOUSTICS::JEvt>::typelist calibration_types;
290  typedef JMultipleFileScanner<calibration_types> JCalibration_t;
291 
292  JMultipleFileScanner<> inputFile;
293  JLimit_t& numberOfEvents = inputFile.getLimit();
294  string detectorFile;
295  JCalibration_t calibrationFile;
296  double Tmax_s;
297  string pdfFile;
298  JMuonGandalfParameters_t parameters;
299  bool overwriteDetector;
300  set<int> ids; // string identifiers
301  int number_of_iterations = 1000;
302  int number_of_extra_steps = 0;
303  double epsilon = 1.0e-4;
304  double T_ns = 2.5; // step size
305  size_t threads; // number of threads
306  int debug;
307 
308  try {
309 
310  JProperties properties;
311 
312  properties.insert(gmake_property(number_of_iterations));
313  properties.insert(gmake_property(number_of_extra_steps));
314  properties.insert(gmake_property(epsilon));
315  properties.insert(gmake_property(T_ns));
316 
317  JParser<> zap("Program to determine inter-string time calibration.");
318 
319  zap['f'] = make_field(inputFile);
320  zap['a'] = make_field(detectorFile);
321  zap['+'] = make_field(calibrationFile) = JPARSER::initialised();
322  zap['T'] = make_field(Tmax_s) = 100.0;
323  zap['n'] = make_field(numberOfEvents) = JLimit::max();
324  zap['P'] = make_field(pdfFile);
325  zap['@'] = make_field(parameters) = JPARSER::initialised();
326  zap['A'] = make_field(overwriteDetector, "overwrite detector file provided through '-a' with fitted time offsets.");
327  zap['S'] = make_field(ids, "string identifiers (none = all)") = JPARSER::initialised();
328  zap['%'] = make_field(properties, "fit parameters") = JPARSER::initialised();
329  zap['N'] = make_field(threads, "number of threads") = 1;
330  zap['d'] = make_field(debug) = 1;
331 
332  zap(argc, argv);
333  }
334  catch(const exception& error) {
335  FATAL(error.what() << endl);
336  }
337 
338 
340 
341  try {
342  load(detectorFile, detector);
343  }
344  catch(const JException& error) {
345  FATAL(error);
346  }
347 
348  unique_ptr<JDynamics> dynamics;
349 
350  try {
351 
352  dynamics.reset(new JDynamics(detector, Tmax_s));
353 
354  dynamics->load(calibrationFile);
355  }
356  catch(const exception& error) {
357  if (!calibrationFile.empty()) {
358  FATAL(error.what());
359  }
360  }
361 
362  const JModuleRouter router(dynamics ? dynamics->getDetector() : detector);
363 
364  NOTICE("Reading PDFs... " << flush);
365 
366  const JRegressorStorage_t storage(pdfFile, parameters.TTS_ns);
367 
368  NOTICE("OK" << endl);
369 
371  JRegressor_t::T_ns.setRange(parameters.TMin_ns, parameters.TMax_ns);
372  JRegressor_t::Vmax_npe = parameters.VMax_npe;
373  JRegressor_t::MAXIMUM_ITERATIONS = parameters.NMax;
374 
375 
376  // preprocess input data
377 
378  const JBuildL0<JHitL0> buildL0;
379 
380  data_type data;
381 
382  counter_type skip = inputFile.getLowerLimit();
383  counter_type counter = inputFile.getLowerLimit();
384 
385  for (JMultipleFileScanner<>::const_iterator i = inputFile.begin(); i != inputFile.end(); ++i) {
386 
387  JSummaryFileRouter summary(*i, parameters.R_Hz);
388 
389  for (JParallelFileScanner_t in(*i); (skip -= in.skip(skip)) == 0 && in.hasNext() && counter != numberOfEvents; ++counter) {
390 
391  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
392 
393  multi_pointer_type ps = in.next();
394 
395  const JDAQEvent* tev = ps;
396  const JFIT::JEvt* evt = ps;
397 
398  summary.update(*tev);
399 
400  if (dynamics) {
401  dynamics->update(*tev);
402  }
403 
404  if (!evt->empty()) {
405 
406  vector<JHitL0> dataL0;
407 
408  buildL0(*tev, router, true, back_inserter(dataL0));
409 
410  const JFIT::JFit& fit = (*evt)[0];
411 
412  const JRotation3D R (getDirection(fit));
413  const JLine1Z tz(getPosition (fit).rotate(R), fit.getT());
414  JRange<double> Z_m;
415 
416  if (fit.hasW(JSTART_LENGTH_METRES) &&
417  fit.getW(JSTART_LENGTH_METRES) > 0.0) {
418  Z_m = JZRange(parameters.ZMin_m, parameters.ZMax_m + fit.getW(JSTART_LENGTH_METRES));
419  }
420 
421  const JFIT::JModel<JLine1Z> match(tz, parameters.roadWidth_m, JRegressor_t::T_ns, Z_m);
422 
423  // hit selection based on start value
424 
425  buffer_type buffer;
426 
427  for (vector<JHitL0>::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
428 
429  JHitW0 hit(*i, summary.getRate(i->getPMTIdentifier()));
430 
431  hit.rotate(R);
432 
433  if (match(hit)) {
434  buffer.push_back(hit);
435  }
436  }
437 
438  // select first hit
439 
440  sort(buffer.begin(), buffer.end(), JHitL0::compare);
441 
442  buffer_type::const_iterator __end = unique(buffer.begin(), buffer.end(), equal_to<JDAQPMTIdentifier>());
443 
444  // re-organise data
445 
446  map_type map;
447 
448  for (buffer_type::const_iterator hit = buffer.begin(); hit != __end; ++hit) {
449 
450  const JModule& module = router.getModule(hit->getModuleID());
451 
452  map[module.getString()].push_back(*hit);
453  }
454 
455  data.push_back({map, tz});
456  }
457  }
458  }
459  STATUS(endl);
460 
461 
462  // fit
463 
464  JGradient fit(number_of_iterations, number_of_extra_steps, epsilon, 3);
465 
466  for (int id : (!ids.empty() ? ids : getStringIDs(detector))) {
467  fit.push_back(JModifier_t(MAKE_STRING("string: " << FILL(4,'0') << id << FILL()), new JStringEditor(data, id), T_ns));
468  }
469 
470  const JPerth_t perth = {storage, data, threads};
471 
472  const double chi2 = fit(perth);
473 
474  STATUS("result: " << FIXED(12,6) << chi2 << ' ' << setw(6) << fit.numberOfIterations << endl);
475 
476  for (size_t i = 0; i != fit.size(); ++i) {
477 
478  const JStringEditor* p = dynamic_cast<const JStringEditor*>(fit[i].get());
479 
480  if (p != NULL) {
481  STATUS("string: " << FILL(4,'0') << p->id << FILL() << ' ' << FIXED(9,3) << p->t0 << " [ns]" << endl);
482  }
483  }
484 
485 
486  if (overwriteDetector) {
487 
488  detector.comment.add(JMeta(argc, argv));
489 
491 
492  for (size_t i = 0; i != fit.size(); ++i) {
493 
494  const JStringEditor* p = dynamic_cast<const JStringEditor*>(fit[i].get());
495 
496  if (p != NULL) {
497  calibration[p->id] = p->t0;
498  }
499  }
500 
501  const double t0 = getAverage(get_values(calibration), 0.0);
502 
503  for (JDetector::iterator module = detector.begin(); module != detector.end(); ++module) {
504 
505  if (!module->empty()) {
506 
508 
509  if (p != calibration.end()) {
510  for (int pmt = 0; pmt != NUMBER_OF_PMTS; ++pmt) {
511  module->getPMT(pmt).addT0(p->second - t0);
512  }
513  }
514  }
515  }
516 
517  NOTICE("Store calibration data on file " << detectorFile << endl);
518 
519  store(detectorFile, detector);
520  }
521 }
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define STATUS(A)
Definition: JMessage.hh:63
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
#define MAKE_STRING(A)
Make string.
Definition: JPrint.hh:127
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
void addT0(const double t0)
Add time offset.
Detector data structure.
Definition: JDetector.hh:96
int getString() const
Get string number.
Definition: JLocation.hh:134
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Definition: JModule.hh:75
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:172
Utility class to parse parameter values.
Definition: JProperties.hh:501
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.
Definition: JLine1Z.hh:29
Rotation matrix.
Definition: JRotation3D.hh:114
General exception.
Definition: JException.hh:24
Utility class to parse command line options.
Definition: JParser.hh:1714
Auxiliary class for a hit with background rate value.
Definition: JHitW0.hh:23
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.
Template specialisation of L0 builder for JHitL0 data type.
Definition: JBuildL0.hh:105
const char * map
Definition: elog.cc:87
static const int JSTART_LENGTH_METRES
distance between first and last hits in metres from JStart.cc
const double epsilon
Definition: JQuadrature.cc:21
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
std::set< int > getStringIDs(const JDetector &detector)
Get list of strings identifiers.
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.
JTOOLS::JRange< double > JZRange
Definition: JFit/JModel.hh:21
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.
Definition: JVectorize.hh:152
std::iterator_traits< T >::value_type getAverage(T __begin, T __end)
Get average.
Definition: JMath.hh:494
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
std::map< int, buffer_type > map_type
string -> hits
Definition: JPerth.cc:71
Long64_t counter_type
Type definition for counter.
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Definition: JDAQ.hh:26
Definition: JSTDTypes.hh:14
Auxiliary data structure for sequence of same character.
Definition: JManip.hh:330
Auxiliary data structure for floating point format specification.
Definition: JManip.hh:448
Calibration.
Definition: JHead.hh:330
Detector file.
Definition: JHead.hh:227
Acoustic event fit.
Data structure for measured coincidence rates of all pairs of PMTs in optical module.
Definition: JFitK40.hh:103
Orientation of module.
Dynamic detector calibration.
Definition: JDynamics.hh:84
Conjugate gradient fit.
Definition: JGradient.hh:75
Template specialisation of class JModel to match hit with muon trajectory along z-axis.
Definition: JFit/JModel.hh:36
Auxiliary data structure for editable parameter.
Definition: JGradient.hh:49
Template data structure for storage for PDF tables.
Auxiliary class for recursive type list generation.
Definition: JTypeList.hh:351
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
double VMax_npe
maximum number of of photo-electrons
Auxiliary data structure for chi2 function object.
Definition: JPerth.cc:252
Auxiliary class to edit time offset of data per string.
Definition: JPerth.cc:90
int id
string identifier
Definition: JPerth.cc:126
double t0
time offset [ns]
Definition: JPerth.cc:127
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:45
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72
Auxiliary data structure for sorting of hits.
Definition: JHitL0.hh:85