Jpp  17.3.2
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 
17 #include "JDetector/JDetector.hh"
20 
21 #include "JTrigger/JHit.hh"
22 #include "JTrigger/JHitToolkit.hh"
25 #include "JTrigger/JTimeslice.hh"
26 #include "JTrigger/JHitL0.hh"
27 #include "JTrigger/JHitL1.hh"
28 #include "JTrigger/JBuildL1.hh"
29 #include "JTrigger/JBuildL2.hh"
30 
34 #include "JTrigger/JTriggerNB.hh"
35 #include "JTrigger/JTriggerBits.hh"
39 #include "JTrigger/JTimesliceL1.hh"
42 
45 
49 #include "JSupport/JSupport.hh"
50 #include "JSupport/JMeta.hh"
51 
52 
53 #include "Jeep/JTimer.hh"
54 #include "Jeep/JParser.hh"
55 #include "Jeep/JMessage.hh"
56 
57 
58 /**
59  * \file
60  * Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data.
61  * Random KM3NETDAQ::JDAQTimeslice data can be produced with JRandomTimesliceWriter.cc application.
62  * \author mdejong
63  */
64 int main(int argc, char **argv)
65 {
66  using namespace std;
67  using namespace KM3NETDAQ;
68  using namespace JPP;
69 
70  typedef JTYPELIST<JAllTypes_t>::typelist typelist;
71 
73  JLimit_t& numberOfEvents = inputFile.getLimit();
75  string detectorFile;
77  JDAQClock clock;
78  JROOTClassSelector selector;
79  int debug;
80 
81  try {
82 
83  JParser<> zap("Auxiliary program to trigger time slice data.");
84 
85  zap['f'] = make_field(inputFile, "input file.");
86  zap['o'] = make_field(outputFile, "output file.") = "trigger_processor.dat";
87  zap['n'] = make_field(numberOfEvents) = JLimit::max();
88  zap['a'] = make_field(detectorFile, "detector file.");
89  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
90  zap['c'] = make_field(clock, "DAQ clock") = JDAQClock::KM3NET, JDAQClock::PPM_DU, JDAQClock::ANTARES;
91  zap['C'] = make_field(selector, "timeslice selector, e.g. JDAQTimesliceL1.") = getROOTClassSelection<JDAQTimesliceTypes_t>();
92  zap['d'] = make_field(debug, "debug flag.") = 1;
93 
94  zap(argc, argv);
95  }
96  catch(const exception &error) {
97  FATAL(error.what() << endl);
98  }
99 
100 
101  clock.set();
102 
104 
105  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
106  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
107  DEBUG("Trigger" << endl << parameters << endl);
108 
110 
111  try {
112  load(detectorFile, detector);
113  }
114  catch(const JException& error) {
115  FATAL(error);
116  }
117 
118  // detector
119 
120  if (parameters.disableHighRateVeto) {
121 
122  NOTICE("Disabling high-rate veto of all PMTs." << endl);
123 
124  detector.setPMTStatus(HIGH_RATE_VETO_DISABLE);
125  }
126 
128 
129  const JModuleRouter moduleRouter(detector);
130 
131  //typedef JHit hit_type;
132  //typedef int hit_type;
133  typedef double hit_type;
134 
135  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
136  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
137  typedef JTimeslice <hit_type> JTimeslice_t;
138  typedef JBuildL1 <hit_type> JBuildL1_t;
139  typedef JBuildL2 <hit_type> JBuildL2_t;
140 
141  const JBuildL1_t buildL1(parameters);
142  const JBuildL2_t buildL2(parameters.L2);
143  const JBuildL2_t buildSN(parameters.SN);
144  const JBuildL2_t buildNB(parameters.NB);
145 
146  JTimer timerCC("Calibration");
147  JTimer timerL0("L0");
148  JTimer timerL1("L1");
149  JTimer timerL2("L2");
150  JTimer timerSN("SN");
151  JTimer timerRX("Timeslice router");
152  JTimer timerTR("Trigger");
153  JTimer timerTX("Trigger router");
154  JTimer timerTW("Timeslice writer");
155  JTimer timerSW("Summary writer");
156 
157  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
158 
159  const JTriggerNB triggerNB (parameters);
160  const JTrigger3DMuon trigger3DMuon (parameters);
161  const JTrigger3DShower trigger3DShower(parameters);
162  const JTriggerMXShower triggerMXShower(parameters, detector);
163 
164 
165  outputFile.open();
166 
167  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
168 
169  outputFile.put(JMeta(argc, argv));
170  outputFile.put(parameters);
171 
172  try {
173  Head header;
174  header = getHeader(inputFile);
175  outputFile.put(header);
176  }
177  catch (const JException& error) {
178  DEBUG("Input file has no Monte Carlo header.");
179  }
180 
181  unsigned int numberOfTriggers = 0;
182 
184 
185  counter_type counter = 0;
186 
187  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
188 
189  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
190 
191  const JDAQTimeslice* timeslice = in.next();
192 
193  DEBUG(*timeslice << endl);
194 
195  timerRX.start();
196 
197  timesliceRouter.configure(*timeslice);
198 
199  timerRX.stop();
200 
201 
202  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
203  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
204  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
205  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
206  JTimeslice_t timesliceNB(timeslice->getDAQChronometer());
207 
208  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
209 
210  if (moduleRouter.hasModule(super_frame->getModuleID())) {
211 
212  // calibration
213 
214  timerCC.start();
215 
216  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
217  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
218 
219  timerCC.stop();
220 
221  // Apply high-rate veto
222 
223  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
224 
225  // L0
226 
227  timerL0.start();
228 
229  timesliceL0.push_back(JSuperFrame1D_t(buffer));
230 
231  timerL0.stop();
232 
233  // Nano-beacon trigger
234 
235  if (parameters.triggerNB.enabled) {
236 
237  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
238 
239  if (buffer.begin() != __end) {
240 
241  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
242  super_frame->getModuleIdentifier(),
243  module.getPosition()));
244 
245  JSuperFrame1D_t zbuf;
246 
247  buildL1(buffer.begin(), __end , back_inserter(zbuf));
248 
249  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
250  }
251  }
252 
253  // L1
254 
255  timerL1.start();
256 
257  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
258  super_frame->getModuleIdentifier(),
259  module.getPosition()));
260 
261  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
262 
263  timerL1.stop();
264 
265  // L2
266 
267  timerL2.start();
268 
269  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
270  super_frame->getModuleIdentifier(),
271  module.getPosition()));
272 
273  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
274 
275  timerL2.stop();
276 
277  // SN
278 
279  timerSN.start();
280 
281  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
282  super_frame->getModuleIdentifier(),
283  module.getPosition()));
284 
285  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
286 
287  timerSN.stop();
288  }
289  }
290 
291  // Trigger
292 
293  if (parameters.triggerNB.enabled) {
294 
295  timerTX.start();
296 
297  const JTriggerInput trigger_input(timesliceNB);
298 
299  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
300 
301  if (parameters.triggerNB.write()) {
302 
303  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
304  getTriggerMask(triggerNB.getTriggerBit()),
305  *hit,
306  timesliceRouter,
307  moduleRouter,
308  parameters.TMaxLocal_ns,
309  parameters.triggerNB.DMax_m,
310  getTimeRange(parameters.triggerNB));
311 
312  outputFile.put(tev);
313  }
314  }
315 
316  timerTX.stop();
317  }
318 
319  timerTR.start();
320 
321  JTriggerInput trigger_input(timesliceL2);
322  JTriggerOutput trigger_output;
323 
324  trigger3DMuon (trigger_input, back_inserter(trigger_output));
325  trigger3DShower(trigger_input, back_inserter(trigger_output));
326  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
327 
328  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
329 
330  numberOfTriggers += trigger_output.size();
331 
332  timerTR.stop();
333 
334  DEBUG("Number of triggers: " << trigger_output.size() << endl);
335 
336  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
337 
338  timerTX.start();
339 
340  JTriggeredEvent tev(*event,
341  timesliceRouter,
342  moduleRouter,
343  parameters.TMaxLocal_ns,
345 
346  outputFile.put(tev);
347 
348  timerTX.stop();
349  }
350 
351  if (parameters.writeL0()) {
352 
353  timerTW.start();
354 
355  outputFile.put(*timeslice);
356 
357  timerTW.stop();
358  }
359 
360  if (parameters.writeL1()) {
361 
362  timerTW.start();
363 
364  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
365 
366  timerTW.stop();
367  }
368 
369  if (parameters.writeL2()) {
370 
371  timerTW.start();
372 
373  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
374 
375  timerTW.stop();
376  }
377 
378  if (parameters.writeSN()) {
379 
380  timerTW.start();
381 
382  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
383 
384  timerTW.stop();
385  }
386 
387  if (parameters.writeSummary()) {
388 
389  timerSW.start();
390 
391  outputFile.put(JDAQSummaryslice(*timeslice));
392 
393  timerSW.stop();
394  }
395  }
396  STATUS(endl);
397 
398  if (debug >= JEEP::notice_t&& counter != 0) {
399 
400  const double factor = 1.0 / (double) counter;
401 
402  for (const JTimer* p : { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW }) {
403  p->print(cout, factor);
404  }
405 
406  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
407  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
408  }
409 
411 
412  io >> outputFile;
413 
414  outputFile.close();
415 }
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:1517
General exception.
Definition: JException.hh:23
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:68
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.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
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:1993
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.
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition: Head.hh:65
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.
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:73
Setting of trigger bits.
do set_variable DETECTOR_TXT $WORKDIR detector
KM3NeT DAQ constants, bit handling, etc.
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:46
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