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