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 
135  JTimer timerCC("Calibration");
136  JTimer timerL0("L0");
137  JTimer timerL1("L1");
138  JTimer timerL2("L2");
139  JTimer timerSN("SN");
140  JTimer timerRX("Timeslice router");
141  JTimer timerTR("Trigger");
142  JTimer timerTX("Trigger router");
143  JTimer timerTW("Timeslice writer");
144  JTimer timerSW("Summary writer");
145 
146  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
147 
148  const JTriggerNB triggerNB (parameters);
149  const JTrigger3DMuon trigger3DMuon (parameters);
150  const JTrigger3DShower trigger3DShower(parameters);
151  const JTriggerMXShower triggerMXShower(parameters, detector);
152 
153 
154  outputFile.open();
155 
156  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
157 
158  outputFile.put(JMeta(argc, argv));
159  outputFile.put(parameters);
160 
161  try {
162  Head header;
163  header = getHeader(inputFile);
164  outputFile.put(header);
165  }
166  catch (const JLANG::JNullPointerException error) {
167  DEBUG("Input file has no Monte Carlo header.");
168  }
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  buildL1(buffer.begin(), __end , back_inserter(*timesliceNB.rbegin()));
235  }
236  }
237 
238  // L1
239 
240  timerL1.start();
241 
242  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
243  super_frame->getModuleIdentifier(),
244  module.getPosition()));
245 
246  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
247 
248  timerL1.stop();
249 
250  // L2
251 
252  timerL2.start();
253 
254  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
255  super_frame->getModuleIdentifier(),
256  module.getPosition()));
257 
258  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
259 
260  timerL2.stop();
261 
262  // SN
263 
264  timerSN.start();
265 
266  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
267  super_frame->getModuleIdentifier(),
268  module.getPosition()));
269 
270  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
271 
272  timerSN.stop();
273  }
274  }
275 
276  // Trigger
277 
278  if (parameters.triggerNB.enabled) {
279 
280  timerTX.start();
281 
282  const JTriggerInput trigger_input(timesliceNB);
283 
284  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
285 
286  if (parameters.triggerNB.write()) {
287 
288  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
289  getTriggerMask(triggerNB.getTriggerBit()),
290  *hit,
291  timesliceRouter,
292  moduleRouter,
293  parameters.TMaxLocal_ns,
294  parameters.triggerNB.DMax_m,
295  getTimeRange(parameters.triggerNB));
296 
297  outputFile.put(tev);
298  }
299  }
300 
301  timerTX.stop();
302  }
303 
304  timerTR.start();
305 
306  JTriggerInput trigger_input(timesliceL2);
307  JTriggerOutput trigger_output;
308 
309  trigger3DMuon (trigger_input, back_inserter(trigger_output));
310  trigger3DShower(trigger_input, back_inserter(trigger_output));
311  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
312 
313  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
314 
315  numberOfTriggers += trigger_output.size();
316 
317  timerTR.stop();
318 
319  DEBUG("Number of triggers: " << trigger_output.size() << endl);
320 
321  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
322 
323  timerTX.start();
324 
325  JTriggeredEvent tev(*event,
326  timesliceRouter,
327  moduleRouter,
328  parameters.TMaxLocal_ns,
330 
331  outputFile.put(tev);
332 
333  timerTX.stop();
334  }
335 
336  if (parameters.writeL0()) {
337 
338  timerTW.start();
339 
340  outputFile.put(*timeslice);
341 
342  timerTW.stop();
343  }
344 
345  if (parameters.writeL1()) {
346 
347  timerTW.start();
348 
349  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
350 
351  timerTW.stop();
352  }
353 
354  if (parameters.writeL2()) {
355 
356  timerTW.start();
357 
358  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
359 
360  timerTW.stop();
361  }
362 
363  if (parameters.writeSN()) {
364 
365  timerTW.start();
366 
367  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
368 
369  timerTW.stop();
370  }
371 
372  if (parameters.writeSummary()) {
373 
374  timerSW.start();
375 
376  outputFile.put(JDAQSummaryslice(*timeslice));
377 
378  timerSW.stop();
379  }
380  }
381  STATUS(endl);
382 
383  if (debug >= JEEP::notice_t&& counter != 0) {
384 
385  const double factor = 1.0 / (double) counter;
386 
387  for (const JTimer* buffer[] = { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW, NULL }, **i = buffer; *i != NULL; ++i) {
388  (*i)->print(cout, factor);
389  }
390 
391  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
392  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
393  }
394 
396 
397  io >> outputFile;
398 
399  outputFile.close();
400 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:71
Object writing to file.
Utility class to parse command line options.
Definition: JParser.hh:1493
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:50
#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.
esac print_variable DETECTOR INPUT_FILE OUTPUT_FILE CDF for TYPE in
Definition: JSirene.sh:45
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:63
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:130
Exception for null pointer operation.
Definition: JException.hh:216
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1954
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
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
int debug
debug level
Definition: JSirene.cc:61
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:129
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
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
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