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

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  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 
119  // detector
120 
121  if (parameters.disableHighRateVeto) {
122 
123  NOTICE("Disabling high-rate veto of all PMTs." << endl);
124 
125  detector.setPMTStatus(HIGH_RATE_VETO_DISABLE);
126  }
127 
129 
130  const JModuleRouter moduleRouter(detector);
131 
132  //typedef JHit hit_type;
133  //typedef int hit_type;
134  typedef double hit_type;
135 
136  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
137  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
138  typedef JTimeslice <hit_type> JTimeslice_t;
139  typedef JBuildL1 <hit_type> JBuildL1_t;
140  typedef JBuildL2 <hit_type> JBuildL2_t;
141 
142  const JBuildL1_t buildL1(parameters);
143  const JBuildL2_t buildL2(parameters.L2);
144  const JBuildL2_t buildSN(parameters.SN);
145  const JBuildL2_t buildNB(parameters.NB);
146 
147  JTimer timerCC("Calibration");
148  JTimer timerL0("L0");
149  JTimer timerL1("L1");
150  JTimer timerL2("L2");
151  JTimer timerSN("SN");
152  JTimer timerRX("Timeslice router");
153  JTimer timerTR("Trigger");
154  JTimer timerTX("Trigger router");
155  JTimer timerTW("Timeslice writer");
156  JTimer timerSW("Summary writer");
157 
158  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
159 
160  const JTriggerNB triggerNB (parameters);
161  const JTrigger3DMuon trigger3DMuon (parameters);
162  const JTrigger3DShower trigger3DShower(parameters);
163  const JTriggerMXShower triggerMXShower(parameters, detector);
164 
165 
166  outputFile.open();
167 
168  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
169 
170  outputFile.put(JMeta(argc, argv));
171  outputFile.put(parameters);
172 
173  try {
174  Head header;
175  header = getHeader(inputFile);
176  outputFile.put(header);
177  }
178  catch (const JException& error) {
179  DEBUG("Input file has no Monte Carlo header.");
180  }
181 
182  unsigned int numberOfTriggers = 0;
183 
185 
186  counter_type counter = 0;
187 
188  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
189 
190  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
191 
192  const JDAQTimeslice* timeslice = in.next();
193 
194  DEBUG(*timeslice << endl);
195 
196  timerRX.start();
197 
198  timesliceRouter.configure(*timeslice);
199 
200  timerRX.stop();
201 
202 
203  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
204  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
205  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
206  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
207  JTimeslice_t timesliceNB(timeslice->getDAQChronometer());
208 
209  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
210 
211  if (moduleRouter.hasModule(super_frame->getModuleID())) {
212 
213  // calibration
214 
215  timerCC.start();
216 
217  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
218  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
219 
220  timerCC.stop();
221 
222  // Apply high-rate veto
223 
224  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
225 
226  // L0
227 
228  timerL0.start();
229 
230  timesliceL0.push_back(JSuperFrame1D_t(buffer));
231 
232  timerL0.stop();
233 
234  // Nano-beacon trigger
235 
236  if (parameters.triggerNB.enabled) {
237 
238  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
239 
240  if (buffer.begin() != __end) {
241 
242  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
243  super_frame->getModuleIdentifier(),
244  module.getPosition()));
245 
246  JSuperFrame1D_t zbuf;
247 
248  buildL1(buffer.begin(), __end , back_inserter(zbuf));
249 
250  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
251  }
252  }
253 
254  // L1
255 
256  timerL1.start();
257 
258  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
259  super_frame->getModuleIdentifier(),
260  module.getPosition()));
261 
262  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
263 
264  timerL1.stop();
265 
266  // L2
267 
268  timerL2.start();
269 
270  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
271  super_frame->getModuleIdentifier(),
272  module.getPosition()));
273 
274  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
275 
276  timerL2.stop();
277 
278  // SN
279 
280  timerSN.start();
281 
282  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
283  super_frame->getModuleIdentifier(),
284  module.getPosition()));
285 
286  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
287 
288  timerSN.stop();
289  }
290  }
291 
292  // Trigger
293 
294  if (parameters.triggerNB.enabled) {
295 
296  timerTX.start();
297 
298  const JTriggerInput trigger_input(timesliceNB);
299 
300  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
301 
302  if (parameters.triggerNB.write()) {
303 
304  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
305  getTriggerMask(triggerNB.getTriggerBit()),
306  *hit,
307  timesliceRouter,
308  moduleRouter,
309  parameters.TMaxLocal_ns,
310  parameters.triggerNB.DMax_m,
311  getTimeRange(parameters.triggerNB));
312 
313  outputFile.put(tev);
314  }
315  }
316 
317  timerTX.stop();
318  }
319 
320  timerTR.start();
321 
322  JTriggerInput trigger_input(timesliceL2);
323  JTriggerOutput trigger_output;
324 
325  trigger3DMuon (trigger_input, back_inserter(trigger_output));
326  trigger3DShower(trigger_input, back_inserter(trigger_output));
327  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
328 
329  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
330 
331  numberOfTriggers += trigger_output.size();
332 
333  timerTR.stop();
334 
335  DEBUG("Number of triggers: " << trigger_output.size() << endl);
336 
337  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
338 
339  timerTX.start();
340 
341  JTriggeredEvent tev(*event,
342  timesliceRouter,
343  moduleRouter,
344  parameters.TMaxLocal_ns,
346 
347  outputFile.put(tev);
348 
349  timerTX.stop();
350  }
351 
352  if (parameters.writeL0()) {
353 
354  timerTW.start();
355 
356  outputFile.put(*timeslice);
357 
358  timerTW.stop();
359  }
360 
361  if (parameters.writeL1()) {
362 
363  timerTW.start();
364 
365  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
366 
367  timerTW.stop();
368  }
369 
370  if (parameters.writeL2()) {
371 
372  timerTW.start();
373 
374  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
375 
376  timerTW.stop();
377  }
378 
379  if (parameters.writeSN()) {
380 
381  timerTW.start();
382 
383  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
384 
385  timerTW.stop();
386  }
387 
388  if (parameters.writeSummary()) {
389 
390  timerSW.start();
391 
392  outputFile.put(JDAQSummaryslice(*timeslice));
393 
394  timerSW.stop();
395  }
396  }
397  STATUS(endl);
398 
399  if (debug >= JEEP::notice_t&& counter != 0) {
400 
401  const double factor = 1.0 / (double) counter;
402 
403  for (const JTimer* p : { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW }) {
404  p->print(cout, factor);
405  }
406 
407  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
408  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
409  }
410 
412 
413  io >> outputFile;
414 
415  outputFile.close();
416 }
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
#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.
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: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
#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
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
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.
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 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