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.
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.