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) {
289 mc_run_id = head.start_run.run_id;
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);
350 JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
351 JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
352 JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
353 JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
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.
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.
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.
JLimit JLimit_t
Type definition of limit.
JBuildL1< hit_type > JBuildL1_t
void setDAQLongprint(const bool option)
Set DAQ print option.
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
double getFrameTime()
Get frame time duration.
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
JTimeslice< hit_type > JTimeslice_t
double getMaximalTime(const JDetector &detector)
Get maximal time between modules in detector following causality.
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.
Time slice with calibrated data.
#define DEBUG(A)
Message macros.
JSuperFrame1D< hit_type > JSuperFrame1D_t