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[])