66{
   70  
   72  typedef JParallelFileScanner_t::multi_pointer_type               multi_pointer_type;
   77 
   78  JParallelFileScanner_t   inputFile;
   81  string                   detectorFile;
   82  JCalibration_t           calibrationFile;
   83  double                   Tmax_s;
   84  string                   pdfFile;
   86  histogram_type           calibrate;
   89 
   90  try { 
   91 
   93 
   94    JParser<> zap(
"Program to perform detector calibration using reconstructed muon trajectories.");
 
   95    
  103    zap[
'c'] = 
make_field(calibrate, 
"histogram for time calibration.");
 
  107    
  108    zap(argc, argv);
  109  }
  110  catch(const exception& error) {
  111    FATAL(error.what() << endl);
 
  112  }
  113 
  114 
  115  if (!calibrate.is_valid()) {
  116    FATAL(
"Invalid calibration data " << calibrate << endl);
 
  117  }
  118 
  121  }
  122 
  124 
  125  try {
  127  }
  130  }
  131 
  132  unique_ptr<JDynamics> dynamics;
  133 
  134  if (!calibrationFile.empty()) {
  135 
  136    try {
  137 
  139 
  140      dynamics->load(calibrationFile);
  141    }
  142    catch(const exception& error) {
  144    }
  145  }
  146 
  148 
  153  else
  154    FATAL(
"No valid target; check option -R" << endl);
 
  155 
  157 
  159 
  160  const JMuonGandalf::storage_type storage(pdfFile, parameters.
TTS_ns);
 
  161 
  163 
  166 
  168 
  169 
  171 
  172  TH2D       ha("ha", NULL, 256, -0.5, 255.5, 
  173                calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
  174 
  175  TProfile   hb("hb", NULL, 256, -0.5, 255.5);
  176 
  177  TProfile   hr("hr", NULL,  60,  0.0, 150.0);
  178 
  179  TH2D       h2(
"h2", NULL, rpm->
getN(), -0.5, rpm->
getN() - 0.5,
 
  180                calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
  181 
  182  JManager_t 
g1(
new TProfile(
"%", NULL, rpm->
getN(), -0.5, rpm->
getN() - 0.5, -1.0, +1.0));
 
  183 
  184 
  185  while (inputFile.hasNext()) {
  186 
  187    STATUS(
"event: " << setw(10) << inputFile.getCounter() << 
'\r'); 
DEBUG(endl);
 
  188 
  189    multi_pointer_type ps = inputFile.next();
  190 
  193 
  194    summary.update(*tev);
  195 
  196    if (dynamics) {
  197      dynamics->update(*tev);
  198    }
  199 
  201 
  202    JDataL0_t dataL0;
  203      
  204    buildL0(*tev, router, true, back_inserter(dataL0));
  205      
  206    for (JFIT::JEvt::const_iterator track = in->begin(); track != in->end(); ++track) {
  207 
  211 
  214      }
  215 
  217 
  218      
  219 
  221          
  222      for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
  223            
  224        double rate_Hz = summary.getRate(*i);
  225 
  226        if (rate_Hz <= 0.0) {
  227          rate_Hz = summary.getRate();
  228        }
  229 
  231            
  232        hit.rotate(R);
  233 
  234        if (match(hit)) {
  236        }
  237      }
  238          
  239      
  240          
  242 
  243      JDataW0_t::iterator __end = unique(
data.begin(), 
data.end(), equal_to<JDAQPMTIdentifier>());
 
  244          
  245 
  246      
  247 
  248      if (track->getE() > 0.1)
  249        fit.JRegressor_t::E_GeV   = track->getE();
  250      else
  251        fit.JRegressor_t::E_GeV   = parameters.
E_GeV;
 
  252 
  254 
  255      for (JDataW0_t::const_iterator hit = 
data.begin(); hit != __end; ++hit) {
 
  256        buffer.insert(rpm->
getIndex(hit->getModuleID()));
 
  257      }
  258 
  260 
  261      for (const int index : buffer) {
  262 
  263        JDataW0_t::iterator q = partition(
data.begin(), __end, [rpm, index](
const JHitW0& hit) { return rpm->getIndex(hit.getModuleID()) != index; });
 
  264 
  265        if (
distance(
data.begin(), q) - fit.parameters.size() > 0) {
 
  266 
  267          fit(ta, 
data.begin(), q);                   
 
  268 
  269          for (JDataW0_t::const_iterator hit = q; hit != __end; ++hit) {
  270 
  271            const double t1       = fit.value.getT(hit->getPosition());
  272            JTrack3D     gradient = fit(fit.value, *hit).gradient;
 
  273 
  275 
  276            ha.Fill(hit->getToT(), hit->getT1() - t1);
  277            hb.Fill(hit->getToT(), gradient.
getT());
 
  278 
  279            hr.Fill(fit.value.getDistance(*hit), gradient.
getT());
 
  280 
  281            h2.Fill(index, hit->getT() - t1);
  282 
  283            g1[
"T"]->Fill(index, gradient.
getT());
 
  284            g1[
"X"]->Fill(index, gradient.
getX());
 
  285            g1[
"Y"]->Fill(index, gradient.
getY());
 
  286            g1[
"Z"]->Fill(index, gradient.
getZ());
 
  287          }
  288        }
  289      }
  290    }
  291  }
  293 
  295 
  297 
  298  out << ha;
  299  out << hb;
  300  out << hr;
  301  out << h2;
  303 
  304  out.Write();
  305  out.Close();
  306 
  307  delete rpm;
  308}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Double_t g1(const Double_t x)
Function.
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
 
Router for direct addressing of module data in detector data structure.
 
Data structure for set of track fit results.
 
void select(const JSelector_t &selector)
Select fits.
 
Data structure for fit of straight line paralel to z-axis.
 
Data structure for fit of straight line in positive z-direction.
 
JAxis3D & rotate_back(const JRotation3D &R)
Rotate back axis.
 
JPosition3D & rotate(const JRotation3D &R)
Rotate.
 
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
 
double getY() const
Get y position.
 
double getZ() const
Get z position.
 
double getX() const
Get x position.
 
Utility class to parse command line options.
 
Auxiliary class for a hit with background rate value.
 
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
 
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.
 
static const std::string string_t
string
 
const char *const module_t
routing by module
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
JTOOLS::JRange< double > JZRange
 
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.
 
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
 
KM3NeT DAQ data structures and auxiliaries.
 
Interface for routing module identifier to index and vice versa.
 
virtual int getIndex(const int id) const =0
Get index.
 
virtual size_t getN() const =0
Get number of indices.
 
Dynamic detector calibration.
 
Auxiliary class to match data points with given model.
 
Auxiliary class for recursive type list generation.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
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 ZMax_m
maximal z-positon [m]
 
double ZMin_m
minimal z-positon [m]
 
double R_Hz
default rate [Hz]
 
size_t numberOfPrefits
number of prefits
 
Wrapper class to make final fit of muon trajectory.
 
Auxiliary class for defining the range of iterations of objects.
 
const JLimit & getLimit() const
Get limit.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary data structure for sorting of hits.