11 #include "evt/Head.hh" 
   85 int main(
int argc, 
char **argv)
 
   89   using namespace KM3NETDAQ;
 
  100   bool                   triggeredEventsOnly;
 
  101   JPMTParametersMap      pmtParameters;
 
  109     JParser<> zap(
"Auxiliary program to trigger Monte Carlo events.");
 
  111     zap[
'f'] = 
make_field(inputFile,           
"input file (output of detector simulation)");
 
  113     zap[
'n'] = 
make_field(numberOfEvents)                     = JLimit::max();
 
  114     zap[
'a'] = 
make_field(detectorFileA,       
"detector used for converion from Monte Carlo truth to raw data.");
 
  115     zap[
'b'] = 
make_field(detectorFileB,       
"detector used for conversion of raw data to calibrated data.")     = 
"";
 
  116     zap[
'R'] = 
make_field(run,                 
"run number")  = -1;
 
  119     zap[
'O'] = 
make_field(triggeredEventsOnly, 
"optionally write only triggered events.");
 
  127   catch(
const exception &error) {
 
  128     FATAL(error.what() << endl);
 
  131   gRandom->SetSeed(seed);
 
  137   if (detectorFileB == 
"") {
 
  138     detectorFileB = detectorFileA;
 
  146     load(detectorFileA, detectorA);
 
  147     load(detectorFileB, detectorB);
 
  149   catch(
const JException& error) {
 
  153   DEBUG(
"Detector " << detectorFileA << 
' ' << detectorA.size() << endl);
 
  154   DEBUG(
"Detector " << detectorFileB << 
' ' << detectorB.size() << endl);
 
  156   JPMTParametersMap::Throw(
true);
 
  158   if (!pmtParameters.is_valid()) {
 
  159     FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
 
  162   if (pmtParameters.getQE() != 1.0) {
 
  164     WARNING(
"Correct background rates with global efficiency " << pmtParameters.getQE() << endl);
 
  166     rates_Hz.correct(pmtParameters.getQE());
 
  169   const JModuleRouter moduleRouter(detectorB);
 
  170   JDetectorSimulator  simbad      (detectorA);
 
  171   JSummaryRouter      summaryRouter;
 
  173   if (runbyrun.is_valid()) {
 
  175     NOTICE(
"Using run-by-run:" << endl << runbyrun << endl);
 
  177     if (!runbyrun.hasNext()) {
 
  178       FATAL(
"Run-by-run simulation yields no input." << endl);
 
  181     if (rates_Hz.getSinglesRate() != 0.0) {
 
  182       WARNING(
"Run-by-run simulation discards singles rate [Hz] " << rates_Hz.getSinglesRate() << endl);
 
  186       simbad.reset(
new JK40RunByRunSimulator(summaryRouter, rates_Hz));
 
  187       simbad.reset(
new JPMTRunByRunSimulator(summaryRouter, pmtParameters, detectorA, runbyrun.range_Hz));
 
  188       simbad.reset(
new JCLBDefaultSimulator());
 
  190     catch(
const JException& error) {
 
  191       FATAL(error.what() << endl);
 
  198       NOTICE(
"Set trigger parameters from run-by-run input." << endl);
 
  200     catch(
const JException& error) {
 
  201       WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
 
  206     NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
 
  209       simbad.reset(
new JK40DefaultSimulator(rates_Hz));
 
  210       simbad.reset(
new JPMTDefaultSimulator(pmtParameters, detectorA));
 
  211       simbad.reset(
new JCLBDefaultSimulator());
 
  213     catch(
const JException& error) {
 
  214       FATAL(error.what() << endl);
 
  220   DEBUG(
"Trigger:"        << endl << parameters   << endl);
 
  221   DEBUG(
"PMT parameters:" << endl << pmtParameters << endl); 
 
  225   const JTimeRange period(-(Tmax + parameters.TMaxLocal_ns), 
 
  226                           +(Tmax + parameters.TMaxLocal_ns));
 
  240   JTimesliceRouter timesliceRouter(parameters.numberOfBins);
 
  242   const JTrigger3DMuon   trigger3DMuon  (parameters);
 
  243   const JTrigger3DShower trigger3DShower(parameters);
 
  244   const JTriggerMXShower triggerMXShower(parameters, detectorB);
 
  252   catch(
const JException& error) {
 
  256   const JPosition3D center = get<JPosition3D>(header);
 
  258   NOTICE(
"Apply detector offset " << center << endl);
 
  281   for (JMultipleFileScanner<>::const_iterator file = inputFile.begin(); file != inputFile.end(); ++file) {
 
  291     catch(
const JException& error) {
 
  295     JMultipleFileScanner<Evt> in(*file);
 
  297     limit.setLowerLimit(limit.getLowerLimit() - in.skip(limit.getLowerLimit()));
 
  299     for ( ; in.hasNext() && number_of_events != limit; ++number_of_events) {
 
  301       STATUS(
"event: " << setw(10) << number_of_events << 
'\r'); 
DEBUG(endl);
 
  303       Evt* 
event = in.next();
 
  305       event->mc_run_id = mc_run_id;
 
  309       bool trigger = 
false;
 
  311       if (!
event->mc_hits.empty()) {
 
  313         int frame_index = (int) in.getCounter() + 1;                        
 
  315         if (runbyrun.is_valid() && runbyrun.hasNext()) {
 
  317           summaryRouter.update(runbyrun.next());
 
  319           summaryRouter.correct(dynamic_cast<const JPMTDefaultSimulatorInterface&>(simbad.getPMTSimulator()));
 
  321           frame_index = summaryRouter.getFrameIndex();
 
  322           run         = summaryRouter.getRunNumber();
 
  329         if (!timeRange.is_valid()) {
 
  330           timeRange.setRange(0.0,0.0);
 
  333         const double t0 = 0.5 * (timeRange.getLowerLimit() + timeRange.getUpperLimit());
 
  336         event->mc_t = t1 - t0;                                             
 
  338         timeRange.add(
event->mc_t);
 
  339         timeRange.add(period);
 
  345         DEBUG(timeslice << endl);
 
  348         timesliceRouter.configure(timeslice);
 
  355         for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
 
  357           if (moduleRouter.hasModule(super_frame->getModuleID())) {
 
  361             const JModule&         module = moduleRouter.getModule(super_frame->getModuleID()); 
 
  362             const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
 
  370             timesliceL1.push_back(
JSuperFrame1D_t(super_frame->getDAQChronometer(),
 
  371                                                   super_frame->getModuleIdentifier(),
 
  372                                                   module.getPosition()));
 
  374             buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
 
  378             timesliceL2.push_back(
JSuperFrame1D_t(super_frame->getDAQChronometer(),
 
  379                                                   super_frame->getModuleIdentifier(),
 
  380                                                   module.getPosition()));
 
  382             buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
 
  386             timesliceSN.push_back(
JSuperFrame1D_t(super_frame->getDAQChronometer(),
 
  387                                                   super_frame->getModuleIdentifier(),
 
  388                                                   module.getPosition()));
 
  390             buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
 
  392             DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL0.rbegin()->size() << endl);
 
  393             DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL1.rbegin()->size() << endl);
 
  394             DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceL2.rbegin()->size() << endl);
 
  395             DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() << 
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
 
  402         JTriggerInput  trigger_input(timesliceL2);
 
  403         JTriggerOutput trigger_output;
 
  405         trigger3DMuon  (trigger_input, back_inserter(trigger_output));
 
  406         trigger3DShower(trigger_input, back_inserter(trigger_output));
 
  407         triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
 
  409         trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
 
  411         for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
 
  413           for (
int i = 0; i != h1.GetNbinsX(); ++i) {
 
  414             if (to->hasTriggerBit(i)) {
 
  422                 << to->getFrameIndex() << 
' '  
  424                 << timeRange           << endl);
 
  426           if (timeRange.overlap(eventTime)) {
 
  428             JTriggeredEvent tev(*to, 
 
  431                                 parameters.TMaxLocal_ns, 
 
  436             tev.setCounter(trigger_counter);
 
  445         if (!triggeredEventsOnly || trigger) {
 
  447           if (parameters.writeL0()) {
 
  451           if (parameters.writeL1()) {
 
  452             outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
 
  455           if (parameters.writeL2()) {
 
  456             outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
 
  459           if (parameters.writeSN()) {
 
  460             outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
 
  463           if (parameters.writeSummary()) {
 
  464             outputFile.put(JSummaryslice(chronometer,simbad));
 
  469       if (!triggeredEventsOnly || trigger) {
 
  480   JMultipleFileScanner<JMetaTypes_t> io(inputFile);
 
Utility class to parse command line options. 
 
Data structure for all trigger parameters. 
 
static const unsigned int NUMBER_OF_TRIGGER_BITS
Number of trigger bits. 
 
JBuildL2< hit_type > JBuildL2_t
 
Timeslice with Monte Carlo event. 
 
Recording of objects on file according a format that follows from the file name extension. 
 
Structure to store the ToT mean and standard deviation of the hits produced by a nanobeacon in a sour...
 
Empty structure for specification of parser element that is initialised (i.e. 
 
Long64_t counter_type
Type definition for counter. 
 
JSuperFrame2D< hit_type > JSuperFrame2D_t
 
double getTimeOfRTS(const JDAQChronometer &chronometer)
Get time of last RTS in ns since start of run for a given chronometer. 
 
Data structure for UTC time. 
 
Data structure for detector geometry and calibration. 
 
unsigned long long int JTriggerCounter_t
Type definition of trigger counter. 
 
double getTimeOfFrame(const int frame_index)
Get start time of frame in ns since start of run for a given frame index. 
 
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. 
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header. 
 
Basic data structure for L0 hit. 
 
JLimit JLimit_t
Type definition of limit. 
 
JBuildL1< hit_type > JBuildL1_t
 
Basic data structure for time and time over threshold information of hit. 
 
void setDAQLongprint(const bool option)
Set DAQ print option. 
 
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector. 
 
I/O formatting auxiliaries. 
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object 
 
double getFrameTime()
Get frame time duration. 
 
JAANET::start_run start_run
 
const JDAQChronometer & getDAQChronometer() const 
Get DAQ chronometer. 
 
void load(const JString &file_name, JDetector &detector)
Load detector from input file. 
 
Direct access to PMT in detector data structure. 
 
JTimeslice< hit_type > JTimeslice_t
 
double getMaximalTime(const JDetector &detector)
Get maximal time between modules in detector following causality. 
 
General purpose messaging. 
 
Scanning of objects from multiple files according a format that follows from the extension of each fi...
 
Auxiliaries for creation of summary data. 
 
Utility class to parse command line options. 
 
Map of associated modules in detector. 
 
ROOT TTree parameter settings. 
 
2-dimensional frame with time calibrated data from one optical module. 
 
const JLimit & getLimit() const 
Get limit. 
 
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters. 
 
Basic data structure for L1 hit. 
 
Time slice with calibrated data. 
 
#define DEBUG(A)
Message macros. 
 
JSuperFrame1D< hit_type > JSuperFrame1D_t
 
int main(int argc, char *argv[])