Jpp
JTriggerProcessor.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <set>
6 
7 #include "JDAQ/JDAQ.hh"
8 #include "JDAQ/JDAQClock.hh"
9 #include "JDAQ/JDAQTimeslice.hh"
10 #include "JDAQ/JDAQEvent.hh"
11 #include "JDAQ/JDAQSummaryslice.hh"
12 
13 
14 #include "JDetector/JDetector.hh"
17 
18 #include "JTrigger/JHit.hh"
19 #include "JTrigger/JHitToolkit.hh"
22 #include "JTrigger/JTimeslice.hh"
23 #include "JTrigger/JHitL0.hh"
24 #include "JTrigger/JHitL1.hh"
25 #include "JTrigger/JBuildL1.hh"
26 #include "JTrigger/JBuildL2.hh"
27 
31 #include "JTrigger/JTriggerNB.hh"
32 #include "JTrigger/JTriggerBits.hh"
36 #include "JTrigger/JTimesliceL1.hh"
39 
42 
45 #include "JSupport/JSupport.hh"
46 #include "JSupport/JMeta.hh"
47 
48 
49 #include "Jeep/JTimer.hh"
50 #include "Jeep/JParser.hh"
51 #include "Jeep/JMessage.hh"
52 
53 
54 /**
55  * \file
56  * Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data.
57  * Random KM3NETDAQ::JDAQTimeslice data can be produced with JRandomTimesliceWriter.cc application.
58  * \author mdejong
59  */
60 int main(int argc, char **argv)
61 {
62  using namespace std;
63  using namespace KM3NETDAQ;
64  using namespace JPP;
65 
67 
68  JMultipleFileScanner<JDAQTimesliceTypes_t> inputFile;
69  JLimit_t& numberOfEvents = inputFile.getLimit();
70  JFileRecorder<typelist> outputFile;
71  string detectorFile;
72  JTriggerParameters parameters;
73  JDAQClock clock;
74  JROOTClassSelector selector;
75  int debug;
76 
77  try {
78 
79  JParser<> zap("Auxiliary program to trigger time slice data.");
80 
81  zap['f'] = make_field(inputFile, "input file.");
82  zap['o'] = make_field(outputFile, "output file.") = "trigger_processor.dat";
83  zap['n'] = make_field(numberOfEvents) = JLimit::max();
84  zap['a'] = make_field(detectorFile, "detector file.");
85  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
86  zap['c'] = make_field(clock, "DAQ clock") = JDAQClock::KM3NET, JDAQClock::PPM_DU, JDAQClock::ANTARES;
87  zap['C'] = make_field(selector, "timeslice selector, e.g. JDAQTimesliceL1.") = getROOTClassSelection<JDAQTimesliceTypes_t>();
88  zap['d'] = make_field(debug, "debug flag.") = 1;
89 
90  zap(argc, argv);
91  }
92  catch(const exception &error) {
93  FATAL(error.what() << endl);
94  }
95 
96  cout.tie(&cerr);
97 
99 
100  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
101  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
102  DEBUG("Trigger" << endl << parameters << endl);
103 
104  JDetector detector;
105 
106  try {
107  load(detectorFile, detector);
108  }
109  catch(const JException& error) {
110  FATAL(error);
111  }
112 
113  parameters.set(getMaximalDistance(detector));
114 
115  const JModuleRouter moduleRouter(detector);
116 
117  //typedef JHit hit_type;
118  //typedef int hit_type;
119  typedef double hit_type;
120 
121  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
122  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
123  typedef JTimeslice <hit_type> JTimeslice_t;
124  typedef JBuildL1 <hit_type> JBuildL1_t;
125  typedef JBuildL2 <hit_type> JBuildL2_t;
126 
127  const JBuildL1_t buildL1(parameters);
128  const JBuildL2_t buildL2(parameters.L2);
129  const JBuildL2_t buildSN(parameters.SN);
130 
131  JTimer timerCC("Calibration");
132  JTimer timerL0("L0");
133  JTimer timerL1("L1");
134  JTimer timerL2("L2");
135  JTimer timerSN("SN");
136  JTimer timerRX("Timeslice router");
137  JTimer timerTR("Trigger");
138  JTimer timerTX("Trigger router");
139  JTimer timerTW("Timeslice writer");
140  JTimer timerSW("Summary writer");
141 
142  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
143 
144  const JTriggerNB triggerNB (parameters);
145  const JTrigger3DMuon trigger3DMuon (parameters);
146  const JTrigger3DShower trigger3DShower(parameters);
147  const JTriggerMXShower triggerMXShower(parameters, detector);
148 
149 
150  outputFile.open();
151 
152  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
153 
154  outputFile.put(JMeta(argc, argv));
155  outputFile.put(parameters);
156 
157  unsigned int numberOfTriggers = 0;
158 
159  JObjectMultiplexer<JDAQTimesliceTypes_t, JDAQTimeslice> in(inputFile, selector);
160 
161  counter_type counter = 0;
162 
163  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
164 
165  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
166 
167  const JDAQTimeslice* timeslice = in.next();
168 
169  DEBUG(*timeslice << endl);
170 
171  timerRX.start();
172 
173  timesliceRouter.configure(*timeslice);
174 
175  timerRX.stop();
176 
177 
178  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
179  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
180  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
181  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
182  JTimeslice_t timesliceNB(timeslice->getDAQChronometer());
183 
184  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
185 
186  if (!moduleRouter.hasModule(super_frame->getModuleID())) {
187  ERROR("Missing module: " << super_frame->getModuleID() << endl);
188  continue;
189  }
190 
191  // calibration
192 
193  timerCC.start();
194 
195  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
196  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
197 
198  timerCC.stop();
199 
200  // Apply high-rate veto
201 
202  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
203 
204  // L0
205 
206  timerL0.start();
207 
208  timesliceL0.push_back(JSuperFrame1D_t(buffer));
209 
210  timerL0.stop();
211 
212  // Nano-beacon trigger
213 
214  if (parameters.triggerNB.enabled) {
215 
216  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
217 
218  if (buffer.begin() != __end) {
219 
220  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
221  super_frame->getModuleIdentifier(),
222  module.getPosition()));
223 
224  buildL1(buffer.begin(), __end , back_inserter(*timesliceNB.rbegin()));
225  }
226  }
227 
228  // L1
229 
230  timerL1.start();
231 
232  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
233  super_frame->getModuleIdentifier(),
234  module.getPosition()));
235 
236  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
237 
238  timerL1.stop();
239 
240  // L2
241 
242  timerL2.start();
243 
244  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
245  super_frame->getModuleIdentifier(),
246  module.getPosition()));
247 
248  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
249 
250  timerL2.stop();
251 
252  // SN
253 
254  timerSN.start();
255 
256  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
257  super_frame->getModuleIdentifier(),
258  module.getPosition()));
259 
260  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
261 
262  timerSN.stop();
263  }
264 
265 
266  // Trigger
267 
268  if (parameters.triggerNB.enabled) {
269 
270  const JTriggerInput trigger_input(timesliceNB);
271 
272  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
273 
274  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
275  getTriggerMask(triggerNB.getTriggerBit()),
276  *hit,
277  timesliceRouter,
278  moduleRouter,
279  parameters.TMaxLocal_ns,
280  parameters.triggerNB.DMax_m,
281  getTimeRange(parameters.triggerNB));
282 
283  outputFile.put(tev);
284  }
285  }
286 
287  timerTR.start();
288 
289  JTriggerInput trigger_input(timesliceL2);
290  JTriggerOutput trigger_output;
291 
292  trigger3DMuon (trigger_input, back_inserter(trigger_output));
293  trigger3DShower(trigger_input, back_inserter(trigger_output));
294  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
295 
296  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
297 
298  numberOfTriggers += trigger_output.size();
299 
300  timerTR.stop();
301 
302  DEBUG("Number of triggers: " << trigger_output.size() << endl);
303 
304  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
305 
306  timerTX.start();
307 
308  JTriggeredEvent tev(*event,
309  timesliceRouter,
310  moduleRouter,
311  parameters.TMaxLocal_ns,
312  getTimeRange(parameters));
313 
314  timerTX.stop();
315 
316  outputFile.put(tev);
317  }
318 
319  if (parameters.writeL0()) {
320 
321  timerTW.start();
322 
323  outputFile.put(*timeslice);
324 
325  timerTW.stop();
326  }
327 
328  if (parameters.writeL1()) {
329 
330  timerTW.start();
331 
332  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
333 
334  timerTW.stop();
335  }
336 
337  if (parameters.writeL2()) {
338 
339  timerTW.start();
340 
341  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
342 
343  timerTW.stop();
344  }
345 
346  if (parameters.writeSN()) {
347 
348  timerTW.start();
349 
350  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
351 
352  timerTW.stop();
353  }
354 
355  if (parameters.writeSummary()) {
356 
357  timerSW.start();
358 
359  outputFile.put(JDAQSummaryslice(*timeslice));
360 
361  timerSW.stop();
362  }
363  }
364  STATUS(endl);
365 
366  if (debug >= JEEP::notice_t&& counter != 0) {
367 
368  const double factor = 1.0 / (double) counter;
369 
370  for (const JTimer* buffer[] = { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW, NULL }, **i = buffer; *i != NULL; ++i) {
371  (*i)->print(cout, factor);
372  }
373 
374  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
375  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
376  }
377 
378  JMultipleFileScanner<JMetaTypes_t> io(inputFile);
379 
380  io >> outputFile;
381 
382  outputFile.close();
383 }
JTRIGGER::JTriggerNB_t::JParameters::enabled
bool enabled
enabled status of trigger
Definition: JTriggerNB_t.hh:81
JMeta.hh
JDAQ.hh
JTRIGGER::JTriggerParameters::numberOfBins
int numberOfBins
number of bins for lookup table of timeslice
Definition: JTriggerParameters.hh:324
JTriggerNB.hh
JTriggerParameters.hh
JDETECTOR::getMaximalDistance
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector.
Definition: JDetectorToolkit.hh:76
JFileRecorder.hh
JSuperFrame2D.hh
JAANET::getTimeRange
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e.
Definition: JAAnetToolkit.hh:134
JTRIGGER::JTriggerNB_t::JParameters::pmts
JPMTSelector pmts
PMT selection.
Definition: JTriggerNB_t.hh:82
JTrigger3DMuon.hh
JTriggeredEvent.hh
JMessage.hh
KM3NETDAQ::getRTS
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
JTRIGGER::JTriggerParameters::set
void set(const double DMax_m=0.0)
Set dependent trigger parameters.
Definition: JTriggerParameters.hh:141
ANTARES
#define ANTARES
Definition: JDAQ.hh:21
JTRIGGER::JTriggerParameters::TMaxLocal_ns
double TMaxLocal_ns
maximal time difference between L0 hits for L1
Definition: JTriggerParameters.hh:322
JTRIGGER::JTriggerParameters
Data structure for all trigger parameters.
Definition: JTriggerParameters.hh:116
JEEP::notice_t
notice
Definition: JMessage.hh:32
JTriggerToolkit.hh
JTimeslice.hh
JPARSER::initialised
Empty structure for specification of parser element that is initialised (i.e.
Definition: JParser.hh:63
JDETECTOR::load
void load(const JString &file_name, JDetector &detector)
Load detector from input file.
Definition: JDetectorToolkit.hh:456
JTRIGGER::JTriggerParameters::triggerNB
JTriggerNB_t::JParameters triggerNB
Definition: JTriggerParameters.hh:314
JTRIGGER::JTriggerParameters::TMaxEvent_ns
double TMaxEvent_ns
maximal time before and after event for snapshot
Definition: JTriggerParameters.hh:323
JROOTClassSelector.hh
JSUPPORT::JLimit_t
JLimit JLimit_t
Type definition of limit.
Definition: JLimit.hh:215
KM3NETDAQ::JDAQTimeslice
Data time slice.
Definition: JDAQTimeslice.hh:36
JPARSER::JParser
Utility class to parse command line options.
Definition: JParser.hh:1493
JDAQClock.hh
NOTICE
#define NOTICE(A)
Definition: JMessage.hh:64
JDAQTimeslice.hh
JTriggerBits.hh
JTRIGGER::JTriggerParameters::L2
JL2Parameters L2
L2 processing.
Definition: JTriggerParameters.hh:327
JDAQSummaryslice.hh
JTRIGGER::JTriggerNB_t::JParameters::DMax_m
double DMax_m
maximal distance between PMTs [m]
Definition: JTriggerNB_t.hh:83
KM3NETDAQ::getFrameTime
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
JSupport.hh
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JBuildL1.hh
ERROR
#define ERROR(A)
Definition: JMessage.hh:66
JTriggerMXShower.hh
KM3NETDAQ::JDAQClock
Auxiliary class to set DAQ system clock parameters.
Definition: JDAQClock.hh:27
JTRIGGER::JTriggerParameters::writeL2
JPrescaler writeL2
write JDAQTimeslice with L2 data
Definition: JTriggerParameters.hh:334
debug
int debug
debug level
Definition: JSirene.cc:59
KM3NETDAQ::getTriggerMask
JTriggerMask_t getTriggerMask(const unsigned int bit)
Convert trigger bit to trigger mask.
Definition: JDAQTriggerMask.hh:40
JHitToolkit.hh
JTimesliceL1.hh
JSUPPORT::JLimit::getLimit
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
JEventOverlap.hh
KM3NETDAQ::JDAQSummaryslice
Data summary slice.
Definition: JDAQSummaryslice.hh:31
main
int main(int argc, char **argv)
Definition: JTriggerProcessor.cc:60
JHit.hh
JModuleRouter.hh
JObjectMultiplexer.hh
JMultipleFileScanner.hh
JLANG::JTypeList
Type list.
Definition: JTypeList.hh:22
STATUS
#define STATUS(A)
Definition: JMessage.hh:63
JBuildL2.hh
JParser.hh
JDetectorToolkit.hh
JHitL1.hh
JTRIGGER::JTriggerParameters::SN
JL2Parameters SN
Supernova trigger.
Definition: JTriggerParameters.hh:328
JTimesliceRouter.hh
JTRIGGER::JTriggerParameters::writeSummary
JPrescaler writeSummary
write JDAQSummaryslice
Definition: JTriggerParameters.hh:331
JTRIGGER::JTriggerParameters::highRateVeto_Hz
double highRateVeto_Hz
high-rate veto [Hz]
Definition: JTriggerParameters.hh:319
make_field
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1954
JTrigger3DShower.hh
KM3NETDAQ::JDAQChronometer::getDAQChronometer
const JDAQChronometer & getDAQChronometer() const
Get DAQ chronometer.
Definition: JDAQChronometer.hh:88
JSuperFrame1D.hh
JSUPPORT::JMeta
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:71
DEBUG
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
std
Definition: jaanetDictionary.h:36
JTRIGGER::JTriggerParameters::writeSN
JPrescaler writeSN
write JDAQTimeslice with SN data
Definition: JTriggerParameters.hh:335
KM3NETDAQ
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
JDAQEvent.hh
JTimer.hh
KM3NETDAQ::setDAQLongprint
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
JTRIGGER::JTriggerParameters::writeL1
JPrescaler writeL1
write JDAQTimeslice with L1 data
Definition: JTriggerParameters.hh:333
JDetector.hh
JHitL0.hh
FATAL
#define FATAL(A)
Definition: JMessage.hh:67
outputFile
string outputFile
Definition: JDAQTimesliceSelector.cc:37
JTRIGGER::JTriggerParameters::writeL0
JPrescaler writeL0
write JDAQTimeslice with L0 data
Definition: JTriggerParameters.hh:332
JROOT::counter_type
Long64_t counter_type
Type definition for counter.
Definition: JCounter.hh:24
KM3NET
#define KM3NET
Definition: JDAQ.hh:20
JEEP::debug_t
debug
Definition: JMessage.hh:29
JTRIGGER::JL2Parameters::TMaxLocal_ns
double TMaxLocal_ns
maximal time difference [ns]
Definition: JTriggerParameters.hh:108