Jpp  18.0.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JTriggerProcessor.cc File Reference

Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <set>
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/MultiHead.hh"
#include "km3net-dataformat/online/JDAQ.hh"
#include "km3net-dataformat/online/JDAQClock.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JDAQ/JDAQSummarysliceIO.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JTrigger/JHit.hh"
#include "JTrigger/JHitToolkit.hh"
#include "JTrigger/JSuperFrame1D.hh"
#include "JTrigger/JSuperFrame2D.hh"
#include "JTrigger/JTimeslice.hh"
#include "JTrigger/JHitL0.hh"
#include "JTrigger/JHitL1.hh"
#include "JTrigger/JBuildL1.hh"
#include "JTrigger/JBuildL2.hh"
#include "JTrigger/JTrigger3DShower.hh"
#include "JTrigger/JTriggerMXShower.hh"
#include "JTrigger/JTrigger3DMuon.hh"
#include "JTrigger/JTriggerNB.hh"
#include "JTrigger/JTriggerBits.hh"
#include "JTrigger/JEventOverlap.hh"
#include "JTrigger/JTimesliceRouter.hh"
#include "JTrigger/JTriggeredEvent.hh"
#include "JTrigger/JTimesliceL1.hh"
#include "JTrigger/JTriggerParameters.hh"
#include "JTrigger/JTriggerToolkit.hh"
#include "JROOT/JROOTClassSelector.hh"
#include "JLang/JObjectMultiplexer.hh"
#include "JSupport/JMonteCarloFileSupportkit.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JSupport/JSupport.hh"
#include "JSupport/JMeta.hh"
#include "Jeep/JTimer.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data.

Random KM3NETDAQ::JDAQTimeslice data can be produced with JRandomTimesliceWriter.cc application.

Author
mdejong

Definition in file JTriggerProcessor.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 62 of file JTriggerProcessor.cc.

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:23
JTriggerMask_t getTriggerMask(const unsigned int bit)
Convert trigger bit to trigger mask.
debug
Definition: JMessage.hh:29
#define ANTARES
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
Auxiliary class to select ROOT class based on class name.
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.
string outputFile
#define KM3NET
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.
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
#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.
Auxiliary class to set DAQ system clock parameters.
Definition: JDAQClock.hh:27
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Nano-beacon trigger.
Definition: JTriggerNB.hh:19
Template L1 hit builder.
Definition: JBuildL1.hh:85
#define FATAL(A)
Definition: JMessage.hh:67
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.
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
do set_variable DETECTOR_TXT $WORKDIR detector
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.
int debug
debug level
Time slice with calibrated data.
Definition: JTimeslice.hh:26
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62