Jpp  15.0.1
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/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 64 of file JTriggerProcessor.cc.

65 {
66  using namespace std;
67  using namespace KM3NETDAQ;
68  using namespace JPP;
69 
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  cout.tie(&cerr);
101 
102  clock.set();
103 
105 
106  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
107  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
108  DEBUG("Trigger" << endl << parameters << endl);
109 
111 
112  try {
113  load(detectorFile, detector);
114  }
115  catch(const JException& error) {
116  FATAL(error);
117  }
118 
120 
121  const JModuleRouter moduleRouter(detector);
122 
123  //typedef JHit hit_type;
124  //typedef int hit_type;
125  typedef double hit_type;
126 
127  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
128  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
129  typedef JTimeslice <hit_type> JTimeslice_t;
130  typedef JBuildL1 <hit_type> JBuildL1_t;
131  typedef JBuildL2 <hit_type> JBuildL2_t;
132 
133  const JBuildL1_t buildL1(parameters);
134  const JBuildL2_t buildL2(parameters.L2);
135  const JBuildL2_t buildSN(parameters.SN);
136  const JBuildL2_t buildNB(parameters.NB);
137 
138  JTimer timerCC("Calibration");
139  JTimer timerL0("L0");
140  JTimer timerL1("L1");
141  JTimer timerL2("L2");
142  JTimer timerSN("SN");
143  JTimer timerRX("Timeslice router");
144  JTimer timerTR("Trigger");
145  JTimer timerTX("Trigger router");
146  JTimer timerTW("Timeslice writer");
147  JTimer timerSW("Summary writer");
148 
149  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
150 
151  const JTriggerNB triggerNB (parameters);
152  const JTrigger3DMuon trigger3DMuon (parameters);
153  const JTrigger3DShower trigger3DShower(parameters);
154  const JTriggerMXShower triggerMXShower(parameters, detector);
155 
156 
157  outputFile.open();
158 
159  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
160 
161  outputFile.put(JMeta(argc, argv));
162  outputFile.put(parameters);
163 
164  try {
165  Head header;
166  header = getHeader(inputFile);
167  outputFile.put(header);
168  }
169  catch (const JException& error) {
170  DEBUG("Input file has no Monte Carlo header.");
171  }
172 
173  unsigned int numberOfTriggers = 0;
174 
176 
177  counter_type counter = 0;
178 
179  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
180 
181  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
182 
183  const JDAQTimeslice* timeslice = in.next();
184 
185  DEBUG(*timeslice << endl);
186 
187  timerRX.start();
188 
189  timesliceRouter.configure(*timeslice);
190 
191  timerRX.stop();
192 
193 
194  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
195  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
196  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
197  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
198  JTimeslice_t timesliceNB(timeslice->getDAQChronometer());
199 
200  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
201 
202  if (moduleRouter.hasModule(super_frame->getModuleID())) {
203 
204  // calibration
205 
206  timerCC.start();
207 
208  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
209  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
210 
211  timerCC.stop();
212 
213  // Apply high-rate veto
214 
215  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
216 
217  // L0
218 
219  timerL0.start();
220 
221  timesliceL0.push_back(JSuperFrame1D_t(buffer));
222 
223  timerL0.stop();
224 
225  // Nano-beacon trigger
226 
227  if (parameters.triggerNB.enabled) {
228 
229  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
230 
231  if (buffer.begin() != __end) {
232 
233  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
234  super_frame->getModuleIdentifier(),
235  module.getPosition()));
236 
237  JSuperFrame1D_t zbuf;
238 
239  buildL1(buffer.begin(), __end , back_inserter(zbuf));
240 
241  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
242  }
243  }
244 
245  // L1
246 
247  timerL1.start();
248 
249  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
250  super_frame->getModuleIdentifier(),
251  module.getPosition()));
252 
253  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
254 
255  timerL1.stop();
256 
257  // L2
258 
259  timerL2.start();
260 
261  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
262  super_frame->getModuleIdentifier(),
263  module.getPosition()));
264 
265  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
266 
267  timerL2.stop();
268 
269  // SN
270 
271  timerSN.start();
272 
273  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
274  super_frame->getModuleIdentifier(),
275  module.getPosition()));
276 
277  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
278 
279  timerSN.stop();
280  }
281  }
282 
283  // Trigger
284 
285  if (parameters.triggerNB.enabled) {
286 
287  timerTX.start();
288 
289  const JTriggerInput trigger_input(timesliceNB);
290 
291  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
292 
293  if (parameters.triggerNB.write()) {
294 
295  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
296  getTriggerMask(triggerNB.getTriggerBit()),
297  *hit,
298  timesliceRouter,
299  moduleRouter,
300  parameters.TMaxLocal_ns,
301  parameters.triggerNB.DMax_m,
302  getTimeRange(parameters.triggerNB));
303 
304  outputFile.put(tev);
305  }
306  }
307 
308  timerTX.stop();
309  }
310 
311  timerTR.start();
312 
313  JTriggerInput trigger_input(timesliceL2);
314  JTriggerOutput trigger_output;
315 
316  trigger3DMuon (trigger_input, back_inserter(trigger_output));
317  trigger3DShower(trigger_input, back_inserter(trigger_output));
318  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
319 
320  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
321 
322  numberOfTriggers += trigger_output.size();
323 
324  timerTR.stop();
325 
326  DEBUG("Number of triggers: " << trigger_output.size() << endl);
327 
328  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
329 
330  timerTX.start();
331 
332  JTriggeredEvent tev(*event,
333  timesliceRouter,
334  moduleRouter,
335  parameters.TMaxLocal_ns,
337 
338  outputFile.put(tev);
339 
340  timerTX.stop();
341  }
342 
343  if (parameters.writeL0()) {
344 
345  timerTW.start();
346 
347  outputFile.put(*timeslice);
348 
349  timerTW.stop();
350  }
351 
352  if (parameters.writeL1()) {
353 
354  timerTW.start();
355 
356  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
357 
358  timerTW.stop();
359  }
360 
361  if (parameters.writeL2()) {
362 
363  timerTW.start();
364 
365  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
366 
367  timerTW.stop();
368  }
369 
370  if (parameters.writeSN()) {
371 
372  timerTW.start();
373 
374  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
375 
376  timerTW.stop();
377  }
378 
379  if (parameters.writeSummary()) {
380 
381  timerSW.start();
382 
383  outputFile.put(JDAQSummaryslice(*timeslice));
384 
385  timerSW.stop();
386  }
387  }
388  STATUS(endl);
389 
390  if (debug >= JEEP::notice_t&& counter != 0) {
391 
392  const double factor = 1.0 / (double) counter;
393 
394  for (const JTimer* p : { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW }) {
395  p->print(cout, factor);
396  }
397 
398  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
399  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
400  }
401 
403 
404  io >> outputFile;
405 
406  outputFile.close();
407 }
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:1500
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
*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:66
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.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
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
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector.
Detector file.
Definition: JHead.hh:196
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
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
int debug
debug level
Definition: JSirene.cc:63
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Nano-beacon trigger.
Definition: JTriggerNB.hh:19
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition: Head.hh:67
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.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
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
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 source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:41
Match of two events considering overlap in time.
Time slice with calibrated data.
Definition: JTimeslice.hh:26