Jpp  18.5.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JTriggerProcessor.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <set>
6 
11 
12 #include "JDAQ/JDAQTimesliceIO.hh"
13 #include "JDAQ/JDAQEventIO.hh"
15 
16 #include "JDetector/JDetector.hh"
19 
20 #include "JTrigger/JHit.hh"
21 #include "JTrigger/JHitToolkit.hh"
24 #include "JTrigger/JTimeslice.hh"
25 #include "JTrigger/JHitL0.hh"
26 #include "JTrigger/JHitL1.hh"
27 #include "JTrigger/JBuildL1.hh"
28 #include "JTrigger/JBuildL2.hh"
29 
33 #include "JTrigger/JTriggerNB.hh"
34 #include "JTrigger/JTriggerBits.hh"
38 #include "JTrigger/JTimesliceL1.hh"
41 
44 
48 #include "JSupport/JSupport.hh"
49 #include "JSupport/JMeta.hh"
50 
51 #include "Jeep/JTimer.hh"
52 #include "Jeep/JParser.hh"
53 #include "Jeep/JMessage.hh"
54 
55 
56 /**
57  * \file
58  * Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data.
59  * Random KM3NETDAQ::JDAQTimeslice data can be produced with JRandomTimesliceWriter.cc application.
60  * \author mdejong
61  */
62 int main(int argc, char **argv)
63 {
64  using namespace std;
65  using namespace KM3NETDAQ;
66  using namespace JPP;
67 
68  typedef JTYPELIST<JAllTypes_t>::typelist typelist;
69 
71  JLimit_t& numberOfEvents = inputFile.getLimit();
73  string detectorFile;
75  JDAQClock clock;
76  JROOTClassSelector selector;
77  int debug;
78 
79  try {
80 
81  JParser<> zap("Auxiliary program to trigger time slice data.");
82 
83  zap['f'] = make_field(inputFile, "input file.");
84  zap['o'] = make_field(outputFile, "output file.") = "trigger_processor.dat";
85  zap['n'] = make_field(numberOfEvents) = JLimit::max();
86  zap['a'] = make_field(detectorFile, "detector file.");
87  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
88  zap['c'] = make_field(clock, "DAQ clock") = JDAQClock::KM3NET, JDAQClock::PPM_DU, JDAQClock::ANTARES;
89  zap['C'] = make_field(selector, "timeslice selector, e.g. JDAQTimesliceL1.") = getROOTClassSelection<JDAQTimesliceTypes_t>();
90  zap['d'] = make_field(debug, "debug flag.") = 1;
91 
92  zap(argc, argv);
93  }
94  catch(const exception &error) {
95  FATAL(error.what() << endl);
96  }
97 
98 
99  clock.set();
100 
102 
103  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
104  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
105  DEBUG("Trigger" << endl << parameters << endl);
106 
108 
109  try {
110  load(detectorFile, detector);
111  }
112  catch(const JException& error) {
113  FATAL(error);
114  }
115 
116  // detector
117 
118  if (parameters.disableHighRateVeto) {
119 
120  NOTICE("Disabling high-rate veto of all PMTs." << endl);
121 
122  detector.setPMTStatus(HIGH_RATE_VETO_DISABLE);
123  }
124 
126 
127  const JModuleRouter moduleRouter(detector);
128 
129  //typedef JHit hit_type;
130  //typedef int hit_type;
131  typedef double hit_type;
132 
133  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
134  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
135  typedef JTimeslice <hit_type> JTimeslice_t;
136  typedef JBuildL1 <hit_type> JBuildL1_t;
137  typedef JBuildL2 <hit_type> JBuildL2_t;
138 
139  const JBuildL1_t buildL1(parameters);
140  const JBuildL2_t buildL2(parameters.L2);
141  const JBuildL2_t buildSN(parameters.SN);
142  const JBuildL2_t buildNB(parameters.NB);
143 
144  JTimer timerCC("Calibration");
145  JTimer timerL0("L0");
146  JTimer timerL1("L1");
147  JTimer timerL2("L2");
148  JTimer timerSN("SN");
149  JTimer timerRX("Timeslice router");
150  JTimer timerTR("Trigger");
151  JTimer timerTX("Trigger router");
152  JTimer timerTW("Timeslice writer");
153  JTimer timerSW("Summary writer");
154 
155  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
156 
157  const JTriggerNB triggerNB (parameters);
158  const JTrigger3DMuon trigger3DMuon (parameters);
159  const JTrigger3DShower trigger3DShower(parameters);
160  const JTriggerMXShower triggerMXShower(parameters, detector);
161 
162 
163  outputFile.open();
164 
165  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
166 
167  outputFile.put(JMeta(argc, argv));
168  outputFile.put(parameters);
169 
170  unsigned int numberOfTriggers = 0;
171 
173 
174  counter_type counter = 0;
175 
176  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
177 
178  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
179 
180  const JDAQTimeslice* timeslice = in.next();
181 
182  DEBUG(*timeslice << endl);
183 
184  timerRX.start();
185 
186  timesliceRouter.configure(*timeslice);
187 
188  timerRX.stop();
189 
190 
191  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
192  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
193  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
194  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
195  JTimeslice_t timesliceNB(timeslice->getDAQChronometer());
196 
197  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
198 
199  if (moduleRouter.hasModule(super_frame->getModuleID())) {
200 
201  // calibration
202 
203  timerCC.start();
204 
205  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
206  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
207 
208  timerCC.stop();
209 
210  // Apply high-rate veto
211 
212  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
213 
214  // L0
215 
216  timerL0.start();
217 
218  timesliceL0.push_back(JSuperFrame1D_t(buffer));
219 
220  timerL0.stop();
221 
222  // Nano-beacon trigger
223 
224  if (parameters.triggerNB.enabled) {
225 
226  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
227 
228  if (buffer.begin() != __end) {
229 
230  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
231  super_frame->getModuleIdentifier(),
232  module.getPosition()));
233 
234  JSuperFrame1D_t zbuf;
235 
236  buildL1(buffer.begin(), __end , back_inserter(zbuf));
237 
238  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
239  }
240  }
241 
242  // L1
243 
244  timerL1.start();
245 
246  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
247  super_frame->getModuleIdentifier(),
248  module.getPosition()));
249 
250  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
251 
252  timerL1.stop();
253 
254  // L2
255 
256  timerL2.start();
257 
258  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
259  super_frame->getModuleIdentifier(),
260  module.getPosition()));
261 
262  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
263 
264  timerL2.stop();
265 
266  // SN
267 
268  timerSN.start();
269 
270  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
271  super_frame->getModuleIdentifier(),
272  module.getPosition()));
273 
274  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
275 
276  timerSN.stop();
277  }
278  }
279 
280  // Trigger
281 
282  if (parameters.triggerNB.enabled) {
283 
284  timerTX.start();
285 
286  const JTriggerInput trigger_input(timesliceNB);
287 
288  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
289 
290  if (parameters.triggerNB.write()) {
291 
292  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
293  getTriggerMask(triggerNB.getTriggerBit()),
294  *hit,
295  timesliceRouter,
296  moduleRouter,
297  parameters.TMaxLocal_ns,
298  parameters.triggerNB.DMax_m,
299  getTimeRange(parameters.triggerNB));
300 
301  outputFile.put(tev);
302  }
303  }
304 
305  timerTX.stop();
306  }
307 
308  timerTR.start();
309 
310  JTriggerInput trigger_input(timesliceL2);
311  JTriggerOutput trigger_output;
312 
313  trigger3DMuon (trigger_input, back_inserter(trigger_output));
314  trigger3DShower(trigger_input, back_inserter(trigger_output));
315  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
316 
317  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
318 
319  numberOfTriggers += trigger_output.size();
320 
321  timerTR.stop();
322 
323  DEBUG("Number of triggers: " << trigger_output.size() << endl);
324 
325  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
326 
327  timerTX.start();
328 
329  JTriggeredEvent tev(*event,
330  timesliceRouter,
331  moduleRouter,
332  parameters.TMaxLocal_ns,
334 
335  outputFile.put(tev);
336 
337  timerTX.stop();
338  }
339 
340  if (parameters.writeL0()) {
341 
342  timerTW.start();
343 
344  outputFile.put(*timeslice);
345 
346  timerTW.stop();
347  }
348 
349  if (parameters.writeL1()) {
350 
351  timerTW.start();
352 
353  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
354 
355  timerTW.stop();
356  }
357 
358  if (parameters.writeL2()) {
359 
360  timerTW.start();
361 
362  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
363 
364  timerTW.stop();
365  }
366 
367  if (parameters.writeSN()) {
368 
369  timerTW.start();
370 
371  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
372 
373  timerTW.stop();
374  }
375 
376  if (parameters.writeSummary()) {
377 
378  timerSW.start();
379 
380  outputFile.put(JDAQSummaryslice(*timeslice));
381 
382  timerSW.stop();
383  }
384  }
385  STATUS(endl);
386 
387  if (debug >= JEEP::notice_t&& counter != 0) {
388 
389  const double factor = 1.0 / (double) counter;
390 
391  for (const JTimer* p : { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW }) {
392  p->print(cout, factor);
393  }
394 
395  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
396  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
397  }
398 
400 
401  io >> outputFile;
402 
403  outputFile.close();
404 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Object writing to file.
Utility class to parse command line options.
Definition: JParser.hh:1514
General exception.
Definition: JException.hh:24
JTriggerMask_t getTriggerMask(const unsigned int bit)
Convert trigger bit to trigger mask.
debug
Definition: JMessage.hh:29
int main(int argc, char *argv[])
Definition: Main.cc:15
#define ANTARES
ROOT TTree parameter settings of various packages.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for a composite optical module.
Definition: JModule.hh:67
Router for fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
void configure(const JDAQTimeslice &timeslice)
Configure.
Auxiliary class to select ROOT class based on class name.
Recording of objects on file according a format that follows from the file name extension.
Router for direct addressing of module data in detector data structure.
notice
Definition: JMessage.hh:32
static const int HIGH_RATE_VETO_DISABLE
Enable (disable) use of high-rate veto test if this status bit is 0 (1);.
Definition: pmt_status.hh:13
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:83
Long64_t counter_type
Type definition for counter.
Auxiliary class for multiplexing object iterators.
Basic data structure for time and time over threshold information of hit.
string outputFile
#define KM3NET
Data structure for detector geometry and calibration.
void stop()
Stop timer.
Definition: JTimer.hh:113
Tools for handling different hit types.
1-dimensional frame with time calibrated data from one optical module.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
Basic data structure for L0 hit.
Type list.
Definition: JTypeList.hh:22
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
Template L2 builder.
Definition: JBuildL2.hh:45
Detector file.
Definition: JHead.hh:226
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
Auxiliary class for CPU timing and usage.
Definition: JTimer.hh:32
ROOT I/O of application specific meta data.
#define NOTICE(A)
Definition: JMessage.hh:64
const JDAQChronometer & getDAQChronometer() const
Get DAQ chronometer.
Data time slice.
Auxiliary class to build JDAQEvent for a triggered event.
virtual const pointer_type & next() override
Get next element.
Auxiliary class to set DAQ system clock parameters.
Definition: JDAQClock.hh:27
virtual bool hasNext() override
Check availability of next element.
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Nano-beacon trigger.
Definition: JTriggerNB.hh:19
General purpose messaging.
Template L1 hit builder.
Definition: JBuildL1.hh:85
#define FATAL(A)
Definition: JMessage.hh:67
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Direct access to module in detector data structure.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Auxiliary class to build JDAQTimeslice for L1 timeslice.
Definition: JTimesliceL1.hh:36
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
General purpose class for object reading from a list of file names.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:48
Utility class to parse command line options.
JTriggerbit_t getTriggerBit() const
Get the trigger bit.
bool hasModule(const JObjectID &id) const
Has module.
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
2-dimensional frame with time calibrated data from one optical module.
Data structure for input to trigger algorithm.
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
Setting of trigger bits.
do set_variable DETECTOR_TXT $WORKDIR detector
KM3NeT DAQ constants, bit handling, etc.
Match of two events considering overlap in time.
Basic data structure for L1 hit.
int debug
debug level
void start()
Start timer.
Definition: JTimer.hh:89
Time slice with calibrated data.
Definition: JTimeslice.hh:26
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62