85{
   88 
   90  JLimit_t&              numberOfEvents = inputFile.getLimit();
 
   91  string                 detectorFileA;
   92  string                 detectorFileB;
   97 
   98  try { 
   99 
  100    JParser<> zap(
"Auxiliary program to verify processing of Monte Carlo events.");
 
  101    
  102    zap[
'f'] = 
make_field(inputFile,           
"input file (output of detector simulation)");
 
  104    zap[
'a'] = 
make_field(detectorFileA,       
"detector used for converion from Monte Carlo truth to raw data.");
 
  105    zap[
'b'] = 
make_field(detectorFileB,       
"detector used for conversion of raw data to calibrated data.")     = 
"";
 
  110 
  111    zap(argc, argv);
  112  }
  113  catch(const exception &error) {
  114    FATAL(error.what() << endl);
 
  115  }
  116 
  117 
  118  if (detectorFileB == "") {
  119    detectorFileB = detectorFileA;
  120  }
  121 
  122 
  125 
  126  try {
  127    load(detectorFileA, detectorA);
 
  128    load(detectorFileB, detectorB);
 
  129  }
  132  }
  133 
  134  NOTICE(
"Number of modules in detector A <" << detectorFileA << 
">: " << setw(4) << detectorA.size() << endl);
 
  135  NOTICE(
"Number of modules in detector B <" << detectorFileB << 
">: " << setw(4) << detectorB.size() << endl);
 
  136 
  138 
  140    FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
 
  141  }
  142 
  143  if (pmtParameters.
getQE() != 1.0) {
 
  144 
  145    NOTICE(
"Correct background rates with global efficiency " << pmtParameters.
getQE() << endl);
 
  146 
  148 
  149    NOTICE(
"Back ground rates: " << rates_Hz << endl);
 
  150  }
  151 
  154 
  156 
  157  DEBUG(
"Trigger:"        << endl << parameters   << endl);
 
  158  DEBUG(
"PMT parameters:" << endl << pmtParameters << endl); 
 
  159  
  161 
  162  try {
  164  }
  167  }
  168 
  169 
  174 
  176  
  178 
  180    
  182 
  183    if (!event->mc_hits.empty()) {
  185    }
  186 
  187    for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
  188 
  189      if (!pmtRouter.hasPMT(hit->pmt_id)) {
  190 
  192 
  193        continue;
  194      }
  195 
  197 
  198      if (!moduleRouter.hasModule(pmt.
getID())) {
 
  199 
  201 
  202        continue;
  203      }
  204 
  205      const double t0 = 
getTime(*hit);
 
  206      const double t1 = 
putTime(t0, pmtRouter   .getPMT(hit->pmt_id));
 
  207      const double t2 = 
getTime(t1, moduleRouter.getPMT(pmt));
 
  208 
  209      if (fabs(t2 - t0) > parameters.TMaxLocal_ns) {
  211      }
  212 
  215 
  219    }
  220  }  
  222 
  223  
  224  NOTICE(
"Number of PMTs absent in detector A:               " << setw(6) << miss.size() << endl);
 
  225 
  227    DEBUG(setw(5) << i->first << 
' ' << 
FIXED(8,0) << i->second.getTotal() << endl);
 
  228  }
  229 
  230  NOTICE(
"Number of PMTs absent in detector B:               " << setw(6) << lost.size() << endl);
 
  231  
  233    DEBUG(setw(8) << i->first.getModuleID() << 
"[" << setw(2) << i->first.getPMTAddress() << 
"] " << 
FIXED(8,0) << i->second.getTotal() << endl);
 
  234  }
  235 
  236  NOTICE(
"Number of PMTs with t0 detector A - B > " << 
FIXED(4,1) << parameters.TMaxLocal_ns << 
" [ns]: " << setw(6) << slip.size() << endl);
 
  237 
  239    DEBUG(setw(8) << i->first.getModuleID() << 
"[" << setw(2) << i->first.getPMTAddress() << 
"] " << 
FIXED(8,0) << i->second.getTotal() << endl);
 
  240  }
  241 
  242 
  243  NOTICE(
"Number of true photo-electrons, passed threshold and survived QE." << endl);
 
  244  
  245  tuple_type total;
  246 
  248 
  249    DEBUG(setw(8) << p->first.getModuleID() << 
"[" << setw(2) << p->first.getPMTAddress() << 
"]");
 
  250 
  251    for (size_t i = 0; i != p->second.size(); ++i) {
  252      DEBUG(
' ' << 
FIXED(8,0) << p->second[i].getTotal());
 
  253    }
  255 
  256    for (size_t i = 0; i != p->second.size(); ++i) {
  257      total[i].put(p->second[i].getTotal());
  258    }
  259  }
  260 
  261  NOTICE(setw(12) << 
"total");
 
  262 
  263  for (size_t i = 0; i != total.size(); ++i) {
  265  }
  266 
  268 
  270}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
Router for direct addressing of module data in detector data structure.
 
Auxiliary class for map of PMT parameters.
 
const JPMTParameters & getPMTParameters(const JPMTIdentifier &id) const
Get PMT parameters.
 
double getQE(const JPMTIdentifier &id) const
Get QE of given PMT.
 
bool is_valid() const
Check validity of PMT parameters.
 
Data structure for PMT parameters.
 
Router for direct addressing of PMT data in detector data structure.
 
int getID() const
Get identifier.
 
static void Throw(const bool option)
Enable/disable throw option.
 
Utility class to parse command line options.
 
General purpose class for object reading from a list of file names.
 
virtual bool hasNext() override
Check availability of next element.
 
counter_type getCounter() const
Get counter.
 
virtual const pointer_type & next() override
Get next element.
 
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
 
double getNPE(const Hit &hit)
Get true charge of hit.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getSurvivalProbability(const JPMTParameters ¶meters)
Get model dependent probability that a one photo-electron hit survives the simulation of the PMT assu...
 
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
 
double putTime(const T &t1, const JCalibration &cal)
Get de-calibrated time.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
const char * getTime()
Get current local time conform ISO-8601 standard.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
Auxiliary data structure for floating point format specification.
 
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for K40 rates.
 
void correct(const double QE)
Correct rates for global efficiency,.
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.