Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JTriggerProcessor.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 
6 #include "JDAQ/JDAQ.hh"
7 #include "JDAQ/JDAQClock.hh"
8 #include "JDAQ/JDAQTimeslice.hh"
9 #include "JDAQ/JDAQEvent.hh"
10 #include "JDAQ/JDAQSummaryslice.hh"
11 
12 #include "JDetector/JDetector.hh"
15 
16 #include "JTrigger/JHit.hh"
17 #include "JTrigger/JHitToolkit.hh"
20 #include "JTrigger/JTimeslice.hh"
21 #include "JTrigger/JHitL0.hh"
22 #include "JTrigger/JHitL1.hh"
23 #include "JTrigger/JBuildL1.hh"
24 #include "JTrigger/JBuildL2.hh"
28 #include "JTrigger/JTriggerBits.hh"
32 #include "JTrigger/JTimesliceL1.hh"
35 
38 
41 #include "JSupport/JSupport.hh"
42 #include "JSupport/JMeta.hh"
43 
44 #include "Jeep/JTimer.hh"
45 #include "Jeep/JParser.hh"
46 #include "Jeep/JMessage.hh"
47 
48 
49 /**
50  * \file
51  * Auxiliary program to trigger KM3NETDAQ::JDAQTimeslice data.
52  * Random KM3NETDAQ::JDAQTimeslice data can be produced with JRandomTimesliceWriter.cc application.
53  * \author mdejong
54  */
55 int main(int argc, char **argv)
56 {
57  using namespace std;
58  using namespace KM3NETDAQ;
59  using namespace JPP;
60 
62 
63  JMultipleFileScanner<JDAQTimesliceTypes_t> inputFile;
64  JLimit_t& numberOfEvents = inputFile.getLimit();
65  JFileRecorder<typelist> outputFile;
66  string detectorFile;
67  JTriggerParameters parameters;
68  JDAQClock clock;
69  JROOTClassSelector selector;
70  int debug;
71 
72  try {
73 
74  JParser<> zap("Auxiliary program to trigger time slice data.");
75 
76  zap['f'] = make_field(inputFile, "input file.");
77  zap['o'] = make_field(outputFile, "output file.") = "trigger_processor.dat";
78  zap['n'] = make_field(numberOfEvents) = JLimit::max();
79  zap['a'] = make_field(detectorFile, "detector file.");
80  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
81  zap['c'] = make_field(clock, "DAQ clock") = JDAQClock::KM3NET, JDAQClock::PPM_DU, JDAQClock::ANTARES;
82  zap['C'] = make_field(selector, "timeslice selector, e.g. JDAQTimesliceL1.") = getROOTClassSelection<JDAQTimesliceTypes_t>();
83  zap['d'] = make_field(debug, "debug flag.") = 1;
84 
85  zap(argc, argv);
86  }
87  catch(const exception &error) {
88  FATAL(error.what() << endl);
89  }
90 
91 
92  cout.tie(&cerr);
93 
95 
96  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
97  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
98  DEBUG("Trigger" << endl << parameters << endl);
99 
100  JDetector detector;
101 
102  try {
103  load(detectorFile, detector);
104  }
105  catch(const JException& error) {
106  FATAL(error);
107  }
108 
109  parameters.set(getMaximalDistance(detector));
110 
111  const JModuleRouter moduleRouter(detector);
112 
113 
114  //typedef JHit hit_type;
115  //typedef int hit_type;
116  typedef double hit_type;
117 
118  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
119  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
120  typedef JTimeslice <hit_type> JTimeslice_t;
121  typedef JBuildL1 <hit_type> JBuildL1_t;
122  typedef JBuildL2 <hit_type> JBuildL2_t;
123 
124  const JBuildL1_t buildL1(parameters);
125  const JBuildL2_t buildL2(parameters.L2);
126  const JBuildL2_t buildSN(parameters.SN);
127 
128  JTimer timerCC("Calibration");
129  JTimer timerL0("L0");
130  JTimer timerL1("L1");
131  JTimer timerL2("L2");
132  JTimer timerSN("SN");
133  JTimer timerRX("Timeslice router");
134  JTimer timerTR("Trigger");
135  JTimer timerTX("Trigger router");
136  JTimer timerTW("Timeslice writer");
137  JTimer timerSW("Summary writer");
138 
139  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
140 
141  const JTrigger3DMuon trigger3DMuon (parameters);
142  const JTrigger3DShower trigger3DShower(parameters);
143  const JTriggerMXShower triggerMXShower(parameters, detector);
144 
145 
146  outputFile.open();
147 
148  if (!outputFile.is_open()) FATAL("Error opening file " << outputFile << endl);
149 
150  outputFile.put(JMeta(argc, argv));
151  outputFile.put(parameters);
152 
153  unsigned int numberOfTriggers = 0;
154 
155  JObjectMultiplexer<JDAQTimesliceTypes_t, JDAQTimeslice> in(inputFile, selector);
156 
157  counter_type counter = 0;
158 
159  for ( ; in.hasNext() && counter != inputFile.getLimit(); ++counter) {
160 
161  STATUS("event: " << setw(10) << counter << '\r'); DEBUG(endl);
162 
163  const JDAQTimeslice* timeslice = in.next();
164 
165  DEBUG(*timeslice << endl);
166 
167  timerRX.start();
168 
169  timesliceRouter.configure(*timeslice);
170 
171  timerRX.stop();
172 
173 
174  JTimeslice_t timesliceL0(timeslice->getDAQChronometer());
175  JTimeslice_t timesliceL1(timeslice->getDAQChronometer());
176  JTimeslice_t timesliceL2(timeslice->getDAQChronometer());
177  JTimeslice_t timesliceSN(timeslice->getDAQChronometer());
178 
179  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
180 
181  if (!moduleRouter.hasModule(super_frame->getModuleID())) {
182  ERROR("Missing module: " << super_frame->getModuleID() << endl);
183  continue;
184  }
185 
186  // calibration
187 
188  timerCC.start();
189 
190  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
191  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
192 
193  timerCC.stop();
194 
195  // Apply high-rate veto
196 
197  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
198 
199  // L0
200 
201  timerL0.start();
202 
203  timesliceL0.push_back(JSuperFrame1D_t(buffer));
204 
205  timerL0.stop();
206 
207  // L1
208 
209  timerL1.start();
210 
211  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
212  super_frame->getModuleIdentifier(),
213  module.getPosition()));
214 
215  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
216 
217  timerL1.stop();
218 
219  // L2
220 
221  timerL2.start();
222 
223  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
224  super_frame->getModuleIdentifier(),
225  module.getPosition()));
226 
227  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
228 
229  timerL2.stop();
230 
231  // SN
232 
233  timerSN.start();
234 
235  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
236  super_frame->getModuleIdentifier(),
237  module.getPosition()));
238 
239  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
240 
241  timerSN.stop();
242  }
243 
244 
245  // Trigger
246 
247  timerTR.start();
248 
249  JTriggerInput trigger_input(timesliceL2);
250  JTriggerOutput trigger_output;
251 
252  trigger3DMuon (trigger_input, back_inserter(trigger_output));
253  trigger3DShower(trigger_input, back_inserter(trigger_output));
254  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
255 
256  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
257 
258  numberOfTriggers += trigger_output.size();
259 
260  timerTR.stop();
261 
262  DEBUG("Number of triggers: " << trigger_output.size() << endl);
263 
264  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
265 
266  timerTX.start();
267 
268  JTriggeredEvent tev(*event,
269  timesliceRouter,
270  moduleRouter,
271  parameters.TMaxLocal_ns,
272  getTimeRange(parameters));
273 
274  timerTX.stop();
275 
276  outputFile.put(tev);
277  }
278 
279  if (parameters.writeL0()) {
280 
281  timerTW.start();
282 
283  outputFile.put(*timeslice);
284 
285  timerTW.stop();
286  }
287 
288  if (parameters.writeL1()) {
289 
290  timerTW.start();
291 
292  outputFile.put(JTimesliceL1<JDAQTimesliceL1>(timesliceL1, timesliceRouter, moduleRouter, parameters.TMaxLocal_ns));
293 
294  timerTW.stop();
295  }
296 
297  if (parameters.writeL2()) {
298 
299  timerTW.start();
300 
301  outputFile.put(JTimesliceL1<JDAQTimesliceL2>(timesliceL2, timesliceRouter, moduleRouter, parameters.L2.TMaxLocal_ns));
302 
303  timerTW.stop();
304  }
305 
306  if (parameters.writeSN()) {
307 
308  timerTW.start();
309 
310  outputFile.put(JTimesliceL1<JDAQTimesliceSN>(timesliceSN, timesliceRouter, moduleRouter, parameters.SN.TMaxLocal_ns));
311 
312  timerTW.stop();
313  }
314 
315  if (parameters.writeSummary()) {
316 
317  timerSW.start();
318 
319  outputFile.put(JDAQSummaryslice(*timeslice));
320 
321  timerSW.stop();
322  }
323  }
324  STATUS(endl);
325 
326  if (debug >= JEEP::notice_t&& counter != 0) {
327 
328  const double factor = 1.0 / (double) counter;
329 
330  for (const JTimer* buffer[] = { &timerCC, &timerL0, &timerL1, &timerL2, &timerSN, &timerRX, &timerTR, &timerTX, &timerTW, &timerSW, NULL }, **i = buffer; *i != NULL; ++i) {
331  (*i)->print(cout, factor);
332  }
333 
334  NOTICE("Number of trigger/slices " << numberOfTriggers << "/" << counter << endl);
335  NOTICE("Trigger rate [Hz] " << numberOfTriggers * 1.0e9 * factor / getFrameTime() << endl);
336  }
337 
338  JMultipleFileScanner<JMetaTypes_t> io(inputFile);
339 
340  io >> outputFile;
341 
342  outputFile.close();
343 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:71
Utility class to parse command line options.
Definition: JParser.hh:1410
#define KM3NET
Definition: JDAQ.hh:20
Data structure for all trigger parameters.
debug
Definition: JMessage.hh:27
JBuildL2< hit_type > JBuildL2_t
Definition: JDataFilter.cc:96
#define STATUS(A)
Definition: JMessage.hh:61
Recording of objects on file according a format that follows from the file name extension.
#define ANTARES
Definition: JDAQ.hh:21
notice
Definition: JMessage.hh:30
Structure to store the ToT mean and standard deviation of the hits produced by a nanobeacon in a sour...
Empty structure for specification of parser element that is initialised (i.e.
Definition: JParser.hh:64
Long64_t counter_type
Type definition for counter.
Definition: JCounter.hh:24
JSuperFrame2D< hit_type > JSuperFrame2D_t
Definition: JDataFilter.cc:93
string outputFile
Data structure for detector geometry and calibration.
Tools for handling different hit types.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e.
Basic data structure for L0 hit.
JLimit JLimit_t
Type definition of limit.
Definition: JLimit.hh:214
JBuildL1< hit_type > JBuildL1_t
Definition: JDataFilter.cc:95
Basic data structure for time and time over threshold information of hit.
Type list.
Definition: JTypeList.hh:22
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
Template L2 builder.
Definition: JBuildL2.hh:47
double getMaximalDistance(const JDetector &detector)
Get maximal distance between modules in detector.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1836
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
ROOT I/O of application specific meta data.
#define NOTICE(A)
Definition: JMessage.hh:62
#define ERROR(A)
Definition: JMessage.hh:64
const JDAQChronometer & getDAQChronometer() const
Get DAQ chronometer.
Data time slice.
void applyHighRateVeto(const double rate_Hz)
Apply high-rate veto.
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:59
JTimeslice< hit_type > JTimeslice_t
Definition: JDataFilter.cc:94
General purpose messaging.
Template L1 hit builder.
Definition: JBuildL1.hh:76
#define FATAL(A)
Definition: JMessage.hh:65
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Direct access to module in detector data structure.
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
Utility class to parse command line options.
ROOT TTree parameter settings.
2-dimensional frame with time calibrated data from one optical module.
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:72
Setting of trigger bits.
KM3NeT DAQ constants, bit handling, etc.
Basic data structure for L1 hit.
double hit_type
Definition: JDataFilter.cc:89
Time slice with calibrated data.
Definition: JTimeslice.hh:26
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:60
JSuperFrame1D< hit_type > JSuperFrame1D_t
Definition: JDataFilter.cc:92
int main(int argc, char *argv[])
Definition: Main.cpp:15