144 JLimit_t& numberOfEvents = inputFile.getLimit();
145 string detectorFileA;
146 string detectorFileB;
149 bool triggeredEventsOnly;
160 JParser<> zap(
"Auxiliary program to trigger Monte Carlo events.");
162 zap[
'f'] =
make_field(inputFile,
"input file (output of detector simulation)");
165 zap[
'a'] =
make_field(detectorFileA,
"detector used for conversion from Monte Carlo truth to raw data.");
166 zap[
'b'] =
make_field(detectorFileB,
"detector used for conversion of raw data to calibrated data.") =
"";
167 zap[
'R'] =
make_field(run,
"run number") = -1;
170 zap[
'O'] =
make_field(triggeredEventsOnly,
"optionally write only triggered events.");
180 catch(
const exception &error) {
181 FATAL(error.what() << endl);
190 if (detectorFileB ==
"") {
191 detectorFileB = detectorFileA;
199 load(detectorFileA, detectorA);
200 load(detectorFileB, detectorB);
206 const double TA_ns = getT0(detectorA);
207 const double TB_ns = getT0(detectorB);
212 FATAL(
"Invalid PMT parameters " << pmtParameters << endl);
215 if (pmtParameters.
getQE() != 1.0) {
217 WARNING(
"Correct background rates with global efficiency " << pmtParameters.
getQE() << endl);
241 if (runbyrun !=
"") {
243 NOTICE(
"Using run-by-run: " << runbyrun << endl);
245 scanner.configure(runbyrun);
247 if (!scanner.empty()) {
248 UTC = scanner.begin()->getTimesliceStart();
250 FATAL(
"Run-by-run simulation misses summary data." << endl);
266 NOTICE(
"Set trigger parameters from run-by-run input." << endl);
269 WARNING(
"No trigger parameters from run-by-run input;\nrun with default/user input." << endl);
274 JHead buffer(header);
279 copy(buffer, header);
283 NOTICE(
"Using fixed rates [Hz]: " << rates_Hz << endl);
297 if (parameters.disableHighRateVeto) {
299 NOTICE(
"Disabling high-rate veto of all PMTs." << endl);
306 DEBUG(
"Trigger:" << endl << parameters << endl);
307 DEBUG(
"PMT parameters:" << endl << pmtParameters << endl);
312 const JTimeRange period(-(Tmax + parameters.TMaxLocal_ns),
313 +(Tmax + parameters.TMaxLocal_ns));
323 typedef JTimeslice <hit_type> JTimeslice_t;
324 typedef JBuildL1 <hit_type> JBuildL1_t;
325 typedef JBuildL2 <hit_type> JBuildL2_t;
327 const JBuildL1_t buildL1(parameters);
328 const JBuildL2_t buildL2(parameters.L2);
329 const JBuildL2_t buildSN(parameters.SN);
338 TH1D h1(
"Trigger bits", NULL, NUMBER_OF_TRIGGER_BITS, -0.5, NUMBER_OF_TRIGGER_BITS - 0.5);
353 int trigger_counter = 0;
355 for (
string file_name; inputFile.
hasNext(); ) {
361 DEBUG(*event << endl);
372 run =
event->mc_run_id;
381 if (runbyrun !=
"") {
383 if (event->mc_event_time == TTimeStamp(0)) {
384 FATAL(
"Monte Carlo event time undefined." << endl);
390 if (!frame_time(t1)) {
392 const Long64_t index = scanner.find(utc);
396 p = scanner.getEntry(index - 1);
410 <<
FIXED(15,3) << event->mc_event_time.AsDouble() <<
" [s] "
412 <<
FIXED(12,0) << t1 <<
" [ns] "
413 << frame_time(t1) << endl);
416 if (!event->mc_hits.empty() && frame_time(t1)) {
422 DEBUG(
"Start time: " <<
FIXED(12,2) << t0 <<
' ' <<
FIXED(12,2) << t1 <<
' ' <<
FIXED(9,2) << TA_ns << endl);
428 timeRange.
add(event->mc_t);
429 timeRange.
add(period);
435 DEBUG(timeslice << endl);
445 for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
447 if (moduleRouter.
hasModule(super_frame->getModuleID())) {
452 const JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
456 timesliceL0.push_back(JSuperFrame1D_t(buffer));
458 DEBUG(
"L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL0.rbegin()->size() <<
LAMBDA([ps = timesliceL0.rbegin()](ostream& out) { for (const auto& i : *ps) { out <<
" " << i; } }) << endl);
462 timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
463 super_frame->getModuleIdentifier(),
464 module.getPosition()));
466 buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
468 DEBUG(
"L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL1.rbegin()->size() <<
LAMBDA([ps = timesliceL1.rbegin()](ostream& out) { for (const auto& i : *ps) { out <<
" " << i; } }) << endl);
472 timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
473 super_frame->getModuleIdentifier(),
474 module.getPosition()));
476 buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
478 DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL2.rbegin()->size() <<
LAMBDA([ps = timesliceL2.rbegin()](ostream& out) { for (const auto& i : *ps) { out <<
" " << i; } }) << endl);
482 JTimeslice_t::value_type tv(super_frame->getDAQChronometer(),
483 super_frame->getModuleIdentifier(),
484 module.getPosition());
486 buildSN(buffer, *timesliceL1.rbegin(), back_inserter(tv));
490 timesliceSN.push_back(tv);
492 DEBUG(
"SN " << setw(8) << timesliceSN.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceSN.rbegin()->size() << endl);
493 DEBUG(
"L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() <<
' ' << setw(8) << timesliceL2.rbegin()->size() <<
LAMBDA([ps = timesliceL2.rbegin()](ostream& out) { for (const auto& i : *ps) { out <<
" " << i; } }) << endl);
505 trigger3DMuon (trigger_input, back_inserter(trigger_output));
506 trigger3DShower(trigger_input, back_inserter(trigger_output));
507 triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
511 for (JTriggerOutput::const_iterator to = trigger_output.begin(); to != trigger_output.end(); ++to) {
513 for (
int i = 0; i != h1.GetNbinsX(); ++i) {
514 if (to->hasTriggerBit(i)) {
521 eventTime.
add(TA_ns);
522 eventTime.
sub(TB_ns);
525 cout <<
"Event time: "
526 << to->getFrameIndex() <<
' '
529 << (timeRange.overlap(eventTime) ?
"Y" :
"N") << endl;
532 if (timeRange.overlap(eventTime)) {
537 parameters.TMaxLocal_ns,
538 getTimeRange(parameters));
540 tev.setCounter(trigger_counter);
549 if (!triggeredEventsOnly ||
trigger) {
551 if (parameters.writeL0()) {
555 if (parameters.writeL1()) {
559 if (parameters.writeL2()) {
563 if (parameters.writeSN()) {
567 if (parameters.writeSummary()) {
569 if (fs.count(chronometer.getFrameIndex()) == 0) {
573 fs.insert(chronometer.getFrameIndex());
579 if (!triggeredEventsOnly ||
trigger) {