Jpp  19.1.0-rc.1
the software that should make you happy
JTriggerReprocessor.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 
12 
13 #include "JDAQ/JDAQTimesliceIO.hh"
14 #include "JDAQ/JDAQEventIO.hh"
16 #include "JDAQ/JDAQEvaluator.hh"
17 
18 #include "JDetector/JDetector.hh"
21 
22 #include "JTrigger/JHit.hh"
23 #include "JTrigger/JHitToolkit.hh"
26 #include "JTrigger/JTimeslice.hh"
27 #include "JTrigger/JHitL0.hh"
28 #include "JTrigger/JHitL1.hh"
29 #include "JTrigger/JBuildL1.hh"
30 #include "JTrigger/JBuildL2.hh"
34 #include "JTrigger/JTriggerNB.hh"
35 #include "JTrigger/JTriggerBits.hh"
39 #include "JTrigger/JTimesliceL1.hh"
42 
43 #include "JLang/JPipe.hh"
45 
47 #include "JSupport/JTreeScanner.hh"
49 #include "JSupport/JSupport.hh"
50 #include "JSupport/JMeta.hh"
52 
53 #include "Jeep/JParser.hh"
54 #include "Jeep/JMessage.hh"
55 
56 
57 /**
58  * \file
59  * Auxiliary program to re-trigger KM3NETDAQ::JDAQEvent data.
60  * \author mdejong
61  */
62 int main(int argc, char **argv)
63 {
64  using namespace std;
65  using namespace JPP;
66  using namespace KM3NETDAQ;
67 
68  typedef JAllTypes_t typelist;
69 
72  JLimit_t& numberOfEvents = inputFile.getLimit();
73  string detectorFile;
74  JTriggerParameters parameters;
75  bool reuse_parameters;
76  bool snapshot;
77  JROOTClassSelection selection = getROOTClassSelection<typelist>();
78  int debug;
79 
80  try {
81 
82  JParser<> zap("Auxiliary program to re-trigger event data.");
83 
84  zap['f'] = make_field(inputFile, "input file.");
85  zap['o'] = make_field(outputFile, "output file.") = "trigger_reprocessor.root";
86  zap['n'] = make_field(numberOfEvents) = JLimit::max();
87  zap['a'] = make_field(detectorFile, "detector file.");
88  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
89  zap['U'] = make_field(reuse_parameters, "reuse trigger parameters from input file.");
90  zap['S'] = make_field(snapshot, "use snapshot hits instead of triggered hits.");
91  zap['C'] = make_field(selection, "selection of data types for output.") = JPARSER::initialised();
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 
102 
104 
105  try {
106  load(detectorFile, detector);
107  }
108  catch(const JException& error) {
109  FATAL(error);
110  }
111 
112  if (reuse_parameters) {
113 
114  try {
115 
116  parameters = getTriggerParameters(inputFile);
117 
118  NOTICE("Set trigger parameters from input." << endl);
119  }
120  catch(const JException& error) {
121  FATAL("No trigger parameters from input." << endl);
122  }
123  }
124 
125  // detector
126 
127  if (parameters.disableHighRateVeto) {
128 
129  NOTICE("Disabling high-rate veto of all PMTs." << endl);
130 
131  detector.setPMTStatus(HIGH_RATE_VETO_DISABLE);
132  }
133 
134  parameters.set(getMaximalDistance(detector));
135 
136  parameters.triggerNB.write.prescale = 1;
137 
138  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
139  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
140  DEBUG("Trigger" << endl << parameters << endl);
141 
142  const JModuleRouter moduleRouter(detector);
143 
144  if (parameters.writeSummary()) { WARNING("Discard writeSummary option during reprocesing of data." << endl); }
145  if (parameters.writeL1()) { WARNING("Discard writeL1 option during reprocesing of data." << endl); }
146  if (parameters.writeL2()) { WARNING("Discard writeL2 option during reprocesing of data." << endl); }
147  if (parameters.writeSN()) { WARNING("Discard writeSN option during reprocesing of data." << endl); }
148 
149  //typedef JHit hit_type;
150  //typedef int hit_type;
151  typedef double hit_type;
152 
153  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
154  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
155  typedef JTimeslice <hit_type> JTimeslice_t;
156  typedef JBuildL1 <hit_type> JBuildL1_t;
157  typedef JBuildL2 <hit_type> JBuildL2_t;
158 
159  const JBuildL1_t buildL1(parameters);
160  const JBuildL2_t buildL2(parameters.L2);
161  const JBuildL2_t buildSN(parameters.SN);
162  const JBuildL2_t buildNB(parameters.NB);
163 
164  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
165 
166  const JTriggerNB triggerNB (parameters);
167  const JTrigger3DMuon trigger3DMuon (parameters);
168  const JTrigger3DShower trigger3DShower(parameters);
169  const JTriggerMXShower triggerMXShower(parameters, detector);
170 
171 
172  outputFile.open();
173 
174  if (!outputFile.is_open()) {
175  FATAL("Error opening file " << outputFile << endl);
176  }
177 
178  outputFile.put(JMeta(argc, argv));
179  outputFile.put(parameters);
180 
181 
183 
185 
186  if (scan.getEntries() == 0) {
187  FATAL("No summary data." << endl);
188  }
189 
190  while (inputFile.hasNext()) {
191 
192  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
193 
194  JDAQEvent* evt = inputFile.next();
195  Long64_t index = scan.find(*evt);
196  JDAQSummaryslice* summary = scan.getEntry(index);
197 
198  if (evt->getFrameIndex() != summary->getFrameIndex()) {
199  DEBUG("Frame indices " << evt->getFrameIndex() << " != " << summary->getFrameIndex() << endl);
200  }
201 
202  JDAQTimeslice timeslice(*evt, *summary, snapshot);
203 
204  DEBUG(timeslice << endl);
205 
206  timesliceRouter.configure(timeslice);
207 
208 
209  JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
210  JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
211  JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
212  JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
213  JTimeslice_t timesliceNB(timeslice.getDAQChronometer());
214 
215  for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
216 
217  if (moduleRouter.hasModule(super_frame->getModuleID())) {
218 
219  // calibration
220 
221  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
222  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
223 
224  // Apply high-rate veto
225 
226  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
227 
228  // L0
229 
230  timesliceL0.push_back(JSuperFrame1D_t(buffer));
231 
232  // Nano-beacon trigger
233 
234  if (parameters.triggerNB.enabled) {
235 
236  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
237 
238  if (buffer.begin() != __end) {
239 
240  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
241  super_frame->getModuleIdentifier(),
242  module.getPosition()));
243 
244 
245  JSuperFrame1D_t zbuf;
246 
247  buildL1(buffer.begin(), __end , back_inserter(zbuf));
248 
249 
250  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
251  }
252  }
253 
254  // L1
255 
256  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
257  super_frame->getModuleIdentifier(),
258  module.getPosition()));
259 
260  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
261 
262  // L2
263 
264  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
265  super_frame->getModuleIdentifier(),
266  module.getPosition()));
267 
268  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
269 
270  // SN
271 
272  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
273  super_frame->getModuleIdentifier(),
274  module.getPosition()));
275 
276  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
277  }
278  }
279 
280 
281  // Trigger
282 
283  if (parameters.triggerNB.enabled) {
284 
285  const JTriggerInput trigger_input(timesliceNB);
286 
287  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
288 
289  if (parameters.triggerNB.write()) {
290 
291  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
292  getTriggerMask(triggerNB.getTriggerBit()),
293  *hit,
294  timesliceRouter,
295  moduleRouter,
296  parameters.TMaxLocal_ns,
297  parameters.triggerNB.DMax_m,
298  getTimeRange(parameters.triggerNB));
299 
300  outputFile.put(tev);
301  }
302  }
303  }
304 
305  JTriggerInput trigger_input(timesliceL2);
306  JTriggerOutput trigger_output;
307 
308  trigger3DMuon (trigger_input, back_inserter(trigger_output));
309  trigger3DShower(trigger_input, back_inserter(trigger_output));
310  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
311 
312  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
313 
314  DEBUG("Number of triggers: " << trigger_output.size() << endl);
315 
316  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
317 
318  JTriggeredEvent tev(*event,
319  timesliceRouter,
320  moduleRouter,
321  parameters.TMaxLocal_ns,
322  getTimeRange(parameters));
323 
324  tev.setCounter(evt->getCounter());
325 
326  outputFile.put(tev);
327  }
328  }
329  STATUS(endl);
330 
331  JSingleFileScanner<typelist> io(inputFile);
332 
333  selection.remove<JDAQEvent>();
334 
335  io | JValve<typelist>(selection) | outputFile;
336 
337  outputFile.close();
338 }
string outputFile
KM3NeT DAQ constants, bit handling, etc.
Data structure for detector geometry and calibration.
Recording of objects on file according a format that follows from the file name extension.
Basic data structure for L0 hit.
Basic data structure for L1 hit.
Tools for handling different hit types.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
#define STATUS(A)
Definition: JMessage.hh:63
#define NOTICE(A)
Definition: JMessage.hh:64
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
#define WARNING(A)
Definition: JMessage.hh:65
ROOT I/O of application specific meta data.
Direct access to module in detector data structure.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
Implementation of pipe operation for object iterators.
Scanning of objects from a single file according a format that follows from the extension of each fil...
ROOT TTree parameter settings of various packages.
Setting of trigger bits.
int main(int argc, char **argv)
Basic data structure for time and time over threshold information of hit.
void merge(const JMatch_t &match)
Merge events.
Detector data structure.
Definition: JDetector.hh:96
Router for direct addressing of module data in detector data structure.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
bool hasModule(const JObjectID &id) const
Has module.
Data structure for a composite optical module.
Definition: JModule.hh:75
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
General exception.
Definition: JException.hh:24
Auxiliary class for selection of data type.
Definition: JValve.hh:23
Utility class to parse command line options.
Definition: JParser.hh:1714
Object writing to file.
Object reading from a list of files.
virtual const pointer_type & next() override
Get next element.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
Template definition for direct access of elements in ROOT TChain.
Template L1 hit builder.
Definition: JBuildL1.hh:90
Template L2 builder.
Definition: JBuildL2.hh:49
1-dimensional frame with time calibrated data from one optical module.
2-dimensional frame with time calibrated data from one optical module.
Time slice with calibrated data.
Definition: JTimeslice.hh:29
Data structure for input to trigger algorithm.
JTriggerbit_t getTriggerBit() const
Get the trigger bit.
Nano-beacon trigger.
Definition: JTriggerNB.hh:21
Auxiliary class to build JDAQEvent for a triggered event.
const JDAQChronometer & getDAQChronometer() const
Get DAQ chronometer.
int getFrameIndex() const
Get frame index.
JTriggerCounter_t getCounter() const
Get trigger counter.
void setCounter(const JTriggerCounter_t counter)
Set trigger counter.
JTimeRange getTimeRange(const Evt &event)
Get time range (i.e. time between earliest and latest hit) of Monte Carlo event.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
@ debug_t
debug
Definition: JMessage.hh:29
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
JTriggerMask_t getTriggerMask(const unsigned int bit)
Convert trigger bit to trigger mask.
Definition: JSTDTypes.hh:14
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
Detector file.
Definition: JHead.hh:227
Match of two events considering overlap in time.
Type list.
Definition: JTypeList.hh:23
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Auxiliary class for ROOT class selection.
void remove()
Remove data type.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:45
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72
Router for fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
void configure(const JDAQTimeslice &timeslice)
Configure.