135{
  139 
  141 
  144  JLimit_t&              numberOfEvents = inputFile.getLimit();
 
  145  string                 detectorFileA;
  146  string                 detectorFileB;
  147  int                    run;
  149  bool                   triggeredEventsOnly;
  153  double                 sigma_ns;
  156 
  157  try { 
  158 
  159    JParser<> zap(
"Auxiliary program to trigger Monte Carlo events.");
 
  160    
  161    zap[
'f'] = 
make_field(inputFile,           
"input file (output of detector simulation)");
 
  164    zap[
'a'] = 
make_field(detectorFileA,       
"detector used for conversion from Monte Carlo truth to raw data.");
 
  165    zap[
'b'] = 
make_field(detectorFileB,       
"detector used for conversion of raw data to calibrated data.")     = 
"";
 
  166    zap[
'R'] = 
make_field(run,                 
"run number")  = -1;
 
  169    zap[
'O'] = 
make_field(triggeredEventsOnly, 
"optionally write only triggered events.");
 
  175 
  176    zap(argc, argv);
  177  }
  178  catch(const exception &error) {
  179    FATAL(error.what() << endl);
 
  180  }
  181 
  182  seed.set(gRandom);
  183 
  185 
  187 
  188  if (detectorFileB == "") {
  189    detectorFileB = detectorFileA;
  190  }
  191 
  192 
  195 
  196  try {
  197    load(detectorFileA, detectorA);
 
  198    load(detectorFileB, detectorB);
 
  199  }
  202  }
  203 
  204  const double TA_ns = getT0(detectorA);
  205  const double TB_ns = getT0(detectorB);
  206 
  208 
  210    FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
 
  211  }
  212 
  213  if (pmtParameters.
getQE() != 1.0) {
 
  214 
  215    WARNING(
"Correct background rates with global efficiency " << pmtParameters.
getQE() << endl);
 
  216    
  218  }
  219 
  221 
  222  try {
  224  }
  227  }
  228  
  232 
  234 
  235    NOTICE(
"Using run-by-run:" << endl << runbyrun << endl);
 
  236 
  238      FATAL(
"Run-by-run simulation yields no input." << endl);
 
  239    }
  240 
  243    }
  244 
  245    try {    
  249    }
  252    }
  253 
  254    try {
  255 
  257 
  258      NOTICE(
"Set trigger parameters from run-by-run input." << endl);
 
  259    }
  261      WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
 
  262    }
  263 
  264    
  265 
  266    JHead buffer(header);
 
  267 
  268    buffer.DAQ.livetime_s = 
getLivetime(runbyrun->getFilelist());
 
  270 
  271    copy(buffer, header);
 
  272 
  273  } else {
  274 
  275    NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
 
  276 
  277    try {    
  281    }
  284    }
  285  }
  286 
  287  
  288 
  289  if (parameters.disableHighRateVeto) {
  290 
  291    NOTICE(
"Disabling high-rate veto of all PMTs." << endl);
 
  292 
  294  }
  295 
  297 
  298  DEBUG(
"Trigger:"        << endl << parameters   << endl);
 
  299  DEBUG(
"PMT parameters:" << endl << pmtParameters << endl); 
 
  300  
  303 
  304  const JTimeRange period(-(Tmax + parameters.TMaxLocal_ns), 
 
  305                          +(Tmax + parameters.TMaxLocal_ns));
  306 
  308 
  311  typedef JTimeslice   <hit_type>   JTimeslice_t;
  312  typedef JBuildL1     <hit_type>   JBuildL1_t;
  313  typedef JBuildL2     <hit_type>   JBuildL2_t;
  314 
  315  const JBuildL1_t buildL1(parameters);
  316  const JBuildL2_t buildL2(parameters.L2);
  317  const JBuildL2_t buildSN(parameters.SN);
  318 
  320 
  324 
  325 
  326  TH1D h1("Trigger bits", NULL, NUMBER_OF_TRIGGER_BITS, -0.5, NUMBER_OF_TRIGGER_BITS - 0.5);
  327 
  328 
  330 
  333  }
  334 
  339 
  340  JLimit_t     limit            = inputFile.getLimit();
 
  342  int          trigger_counter  = 0;
  343  
  345 
  346    int mc_run_id = 0;
  347    
  348    try {
  349 
  351 
  352      mc_run_id = head.start_run.run_id;
  353    }
  356    }
  357    
  359 
  361    
  362    for ( ; in.hasNext() && number_of_events != limit; ++number_of_events) {
  363 
  364      STATUS(
"event: " << setw(10) << number_of_events << 
'\r'); 
DEBUG(endl);
 
  365    
  366      Evt* 
event = in.next();
 
  367 
  369    
  370      DEBUG(*event << endl);
 
  371 
  373 
  374      if (!event->mc_hits.empty()) {
  375      
  376        int frame_index = (int) in.getCounter() + 1;                        
  377 
  379 
  381 
  383      
  384          frame_index = summaryRouter.getFrameIndex();
  385          run         = summaryRouter.getRunNumber();
  386        }
  387 
  388        
  389 
  391 
  394        }
  395 
  397        const double t1 = gRandom->Rndm() * 
getFrameTime() + TA_ns;
 
  398 
  399        DEBUG(
"Start time: " << 
FIXED(12,2) << t0 << 
' ' << 
FIXED(12,2) << t1 << 
' ' << 
FIXED(9,2) << TA_ns << endl);
 
  400 
  402 
  403        timeRange.
add(event->mc_t);
 
  404        timeRange.
add(period);
 
  405 
  408 
  409        if (event->mc_event_time != TTimeStamp(0)) {
  411        }
  412 
  413        const JDAQChronometer chronometer(detectorB.
getID(), (run != -1 ? run : mc_run_id), frame_index, utc);
 
  414 
  416 
  417        DEBUG(timeslice << endl);
 
  418 
  419    
  420        timesliceRouter.configure(timeslice);
  421 
  422        JTimeslice_t    timesliceL0(timeslice.getDAQChronometer());
  423        JTimeslice_t    timesliceL1(timeslice.getDAQChronometer());
  424        JTimeslice_t    timesliceL2(timeslice.getDAQChronometer());
  425        JTimeslice_t    timesliceSN(timeslice.getDAQChronometer());
  426 
  427        for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
  428 
  429          if (moduleRouter.hasModule(super_frame->getModuleID())) {
  430 
  431            
  432 
  433            const JModule&         module = moduleRouter.getModule(super_frame->getModuleID()); 
 
  434            const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
  435 
  436            
  437        
  438            timesliceL0.push_back(JSuperFrame1D_t(buffer));
  439 
  440            
  441        
  442            timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
  443                                                  super_frame->getModuleIdentifier(),
  445 
  446            buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
  447        
  448            
  449        
  450            timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
  451                                                  super_frame->getModuleIdentifier(),
  453        
  454            buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
  455 
  456            
  457        
  458            timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
  459                                                  super_frame->getModuleIdentifier(),
  461        
  462            buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
  463 
  464            DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL0.rbegin()->size() << endl);
 
  465            DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL1.rbegin()->size() << endl);
 
  466            DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL2.rbegin()->size() << endl);
 
  467            DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
 
  468          }
  469        }
  470 
  471 
  472        
  473 
  476 
  477        trigger3DMuon  (trigger_input, back_inserter(trigger_output));
  478        trigger3DShower(trigger_input, back_inserter(trigger_output));
  479        triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
  480 
  482 
  483        for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
  484 
  485          for (int i = 0; i != h1.GetNbinsX(); ++i) {
  486            if (to->hasTriggerBit(i)) {
  487              h1.Fill((double) i);
  488            }
  489          }
  490 
  492 
  493          eventTime.
add(TA_ns);
 
  494          eventTime.
sub(TB_ns);
 
  495 
  497                << to->getFrameIndex() << ' ' 
  498                << eventTime           << ' '
  499                << timeRange           << ' '
  500                << (timeRange.
overlap(eventTime) ? 
"Y" : 
"N") << endl);
 
  501 
  502          if (timeRange.
overlap(eventTime)) {
 
  503        
  505                                timesliceRouter, 
  506                                moduleRouter, 
  507                                parameters.TMaxLocal_ns, 
  508                                getTimeRange(parameters));
  509 
  510            
  511 
  512            tev.setCounter(trigger_counter);
  513 
  515        
  517          }
  518        }
  519   
  520 
  521        if (!triggeredEventsOnly || 
trigger) {
 
  522      
  523          if (parameters.writeL0()) {
  525          }
  526      
  527          if (parameters.writeL1()) {
  529          }
  530      
  531          if (parameters.writeL2()) {
  533          }
  534      
  535          if (parameters.writeSN()) {
  537          }
  538 
  539          if (parameters.writeSummary()) {
  541          }      
  542        }
  543      }
  544 
  545      if (!triggeredEventsOnly || 
trigger) {
 
  546      
  548 
  549        ++trigger_counter;
  550      }
  551    }
  552  }  
  554 
  555 
  557 
  559 
  563}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
void merge(const JMatch_t &match)
Merge events.
 
void setPMTStatus(const int bit)
Set status of all PMTs.
 
static double getSigma()
Get intrinsic time smearing of K40 coincidences.
 
static void setSigma(const double sigma)
Set intrinsic time smearing of K40 coincidences.
 
Default implementation of the simulation of K40 background.
 
Router for direct addressing of module data in detector data structure.
 
Data structure for a composite optical module.
 
Default PMT simulation interface.
 
Auxiliary class for map of PMT parameters.
 
double getQE(const JPMTIdentifier &id) const
Get QE of given PMT.
 
bool is_valid() const
Check validity of PMT parameters.
 
const JPosition3D & getPosition() const
Get position.
 
virtual const char * what() const override
Get error message.
 
int getID() const
Get identifier.
 
virtual bool hasNext() override
Check availability of next element.
 
virtual const pointer_type & next() override
Get next element.
 
static void Throw(const bool option)
Enable/disable throw option.
 
Utility class to parse command line options.
 
Router for fast addressing of summary data in KM3NETDAQ::JDAQSummaryslice data structure as a functio...
 
void update(const JDAQSummaryslice *ps)
Update router.
 
CLB simulation based on run-by-run information.
 
K40 simulation based on run-by-run information.
 
PMT simulation based on run-by-run information.
 
1-dimensional frame with time calibrated data from one optical module.
 
2-dimensional frame with time calibrated data from one optical module.
 
Auxiliary class to build JDAQTimeslice for L1 timeslice.
 
Auxiliary class to build JDAQEvent for a triggered event.
 
Data structure for UTC time.
 
static const JDAQUTCExtended & getInstance()
Get arbitrary offset (e.g.
 
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
 
void copy(const Head &from, JHead &to)
Copy header from from to to.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Long64_t counter_type
Type definition for counter.
 
double getLivetime(const std::string &file_name)
Get data taking live time.
 
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
KM3NeT DAQ data structures and auxiliaries.
 
double getFrameTime()
Get frame time duration.
 
void setDAQLongprint(const bool option)
Set DAQ print option.
 
double getTimeOfFrame(const int frame_index)
Get start time of frame in ns since start of run for a given frame index.
 
double getMaximalTime(const double R_Hz)
Get maximal time for given rate.
 
JDAQUTCExtended getDAQUTCExtended(const TTimeStamp &t0, const double t1=0.0)
Get DAQ UTC time.
 
static const int HIGH_RATE_VETO_DISABLE
Enable (disable) use of high-rate veto test if this status bit is 0 (1);.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
int mc_run_id
MC run identifier.
 
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 ...
 
Match of two events considering overlap in time and position.
 
Transmission with position.
 
Template definition of random value generator.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Auxiliary class for K40 rates.
 
double getSinglesRate() const
Get singles rate.
 
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.
 
Auxiliary class to select summary data (KM3NETDAQ::JDAQSummaryslice) from the specified raw data file...
 
bool is_valid() const
Check validity of run by run options.
 
Router for fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
 
Timeslice with Monte Carlo event.
 
Auxiliary class to create summary data.