Jpp  17.1.1
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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;
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 
101  cout.tie(&cerr);
102 
104 
106 
107  try {
108  load(detectorFile, detector);
109  }
110  catch(const JException& error) {
111  FATAL(error);
112  }
113 
114  if (reuse_parameters) {
115 
116  try {
117 
118  parameters = getTriggerParameters(inputFile);
119 
120  NOTICE("Set trigger parameters from input." << endl);
121  }
122  catch(const JException& error) {
123  FATAL("No trigger parameters from input." << endl);
124  }
125  }
126 
127  // detector
128 
129  if (parameters.disableHighRateVeto) {
130 
131  NOTICE("Disabling high-rate veto of all PMTs." << endl);
132 
133  detector.setPMTStatus(HIGH_RATE_VETO_DISABLE);
134  }
135 
137 
138  parameters.triggerNB.write.prescale = 1;
139 
140  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
141  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
142  DEBUG("Trigger" << endl << parameters << endl);
143 
144  const JModuleRouter moduleRouter(detector);
145 
146  if (parameters.writeSummary()) { WARNING("Discard writeSummary option during reprocesing of data." << endl); }
147  if (parameters.writeL1()) { WARNING("Discard writeL1 option during reprocesing of data." << endl); }
148  if (parameters.writeL2()) { WARNING("Discard writeL2 option during reprocesing of data." << endl); }
149  if (parameters.writeSN()) { WARNING("Discard writeSN option during reprocesing of data." << endl); }
150 
151  //typedef JHit hit_type;
152  //typedef int hit_type;
153  typedef double hit_type;
154 
155  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
156  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
157  typedef JTimeslice <hit_type> JTimeslice_t;
158  typedef JBuildL1 <hit_type> JBuildL1_t;
159  typedef JBuildL2 <hit_type> JBuildL2_t;
160 
161  const JBuildL1_t buildL1(parameters);
162  const JBuildL2_t buildL2(parameters.L2);
163  const JBuildL2_t buildSN(parameters.SN);
164  const JBuildL2_t buildNB(parameters.NB);
165 
166  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
167 
168  const JTriggerNB triggerNB (parameters);
169  const JTrigger3DMuon trigger3DMuon (parameters);
170  const JTrigger3DShower trigger3DShower(parameters);
171  const JTriggerMXShower triggerMXShower(parameters, detector);
172 
173 
174  outputFile.open();
175 
176  if (!outputFile.is_open()) {
177  FATAL("Error opening file " << outputFile << endl);
178  }
179 
180  outputFile.put(JMeta(argc, argv));
181  outputFile.put(parameters);
182 
183 
185 
187 
188  if (scan.getEntries() == 0) {
189  FATAL("No summary data." << endl);
190  }
191 
192  while (inputFile.hasNext()) {
193 
194  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
195 
196  JDAQEvent* evt = inputFile.next();
197  Long64_t index = scan.find(*evt);
198  JDAQSummaryslice* summary = scan.getEntry(index);
199 
200  if (evt->getFrameIndex() != summary->getFrameIndex()) {
201  DEBUG("Frame indices " << evt->getFrameIndex() << " != " << summary->getFrameIndex() << endl);
202  }
203 
204  JDAQTimeslice timeslice(*evt, *summary, snapshot);
205 
206  DEBUG(timeslice << endl);
207 
208  timesliceRouter.configure(timeslice);
209 
210 
211  JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
212  JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
213  JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
214  JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
215  JTimeslice_t timesliceNB(timeslice.getDAQChronometer());
216 
217  for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
218 
219  if (moduleRouter.hasModule(super_frame->getModuleID())) {
220 
221  // calibration
222 
223  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
224  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
225 
226  // Apply high-rate veto
227 
228  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
229 
230  // L0
231 
232  timesliceL0.push_back(JSuperFrame1D_t(buffer));
233 
234  // Nano-beacon trigger
235 
236  if (parameters.triggerNB.enabled) {
237 
238  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
239 
240  if (buffer.begin() != __end) {
241 
242  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
243  super_frame->getModuleIdentifier(),
244  module.getPosition()));
245 
246 
247  JSuperFrame1D_t zbuf;
248 
249  buildL1(buffer.begin(), __end , back_inserter(zbuf));
250 
251 
252  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
253  }
254  }
255 
256  // L1
257 
258  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
259  super_frame->getModuleIdentifier(),
260  module.getPosition()));
261 
262  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
263 
264  // L2
265 
266  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
267  super_frame->getModuleIdentifier(),
268  module.getPosition()));
269 
270  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
271 
272  // SN
273 
274  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
275  super_frame->getModuleIdentifier(),
276  module.getPosition()));
277 
278  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
279  }
280  }
281 
282 
283  // Trigger
284 
285  if (parameters.triggerNB.enabled) {
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 
307  JTriggerInput trigger_input(timesliceL2);
308  JTriggerOutput trigger_output;
309 
310  trigger3DMuon (trigger_input, back_inserter(trigger_output));
311  trigger3DShower(trigger_input, back_inserter(trigger_output));
312  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
313 
314  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
315 
316  DEBUG("Number of triggers: " << trigger_output.size() << endl);
317 
318  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
319 
320  JTriggeredEvent tev(*event,
321  timesliceRouter,
322  moduleRouter,
323  parameters.TMaxLocal_ns,
325 
326  tev.setCounter(evt->getCounter());
327 
328  outputFile.put(tev);
329  }
330  }
331  STATUS(endl);
332 
333  JSingleFileScanner<typelist> io(inputFile);
334 
335  selection.remove<JDAQEvent>();
336 
337  io | JValve<typelist>(selection) | outputFile;
338 
339  outputFile.close();
340 }
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:1517
General exception.
Definition: JException.hh:23
#define WARNING(A)
Definition: JMessage.hh:65
JTriggerMask_t getTriggerMask(const unsigned int bit)
Convert trigger bit to trigger mask.
debug
Definition: JMessage.hh:29
int main(int argc, char *argv[])
Definition: Main.cc:15
ROOT TTree parameter settings of various packages.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
Data structure for a composite optical module.
Definition: JModule.hh:68
Router for fast addressing of hits in KM3NETDAQ::JDAQTimeslice data structure as a function of the op...
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
void configure(const JDAQTimeslice &timeslice)
Configure.
Recording of objects on file according a format that follows from the file name extension.
Router for direct addressing of module data in detector data structure.
Auxiliary class for ROOT class selection.
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
*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:83
Basic data structure for time and time over threshold information of hit.
string outputFile
Template definition for direct access of elements in ROOT TChain.
Data structure for detector geometry and calibration.
Tools for handling different hit types.
Auxiliary class for selection of data type.
int getFrameIndex() const
Get frame index.
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.
Basic data structure for L0 hit.
Type list.
Definition: JTypeList.hh:22
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
Scanning of objects from a single file according a format that follows from the extension of each fil...
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:226
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
Implementation of pipe operation for object iterators.
ROOT I/O of application specific meta data.
#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.
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Nano-beacon trigger.
Definition: JTriggerNB.hh:19
General purpose messaging.
Template L1 hit builder.
Definition: JBuildL1.hh:85
#define FATAL(A)
Definition: JMessage.hh:67
Direct access to module in detector data structure.
void setCounter(const JTriggerCounter_t counter)
Set trigger counter.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
Utility class to parse command line options.
JTriggerbit_t getTriggerBit() const
Get the trigger bit.
bool hasModule(const JObjectID &id) const
Has module.
2-dimensional frame with time calibrated data from one optical module.
Data structure for input to trigger algorithm.
Object reading from a list of files.
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
Setting of trigger bits.
do set_variable DETECTOR_TXT $WORKDIR detector
KM3NeT DAQ constants, bit handling, etc.
Match of two events considering overlap in time.
JTriggerCounter_t getCounter() const
Get trigger counter.
JTriggerParameters getTriggerParameters(const JMultipleFileScanner_t &file_list)
Get trigger parameters.
Basic data structure for L1 hit.
int debug
debug level
JTriggerCounter_t next()
Increment trigger counter.
Time slice with calibrated data.
Definition: JTimeslice.hh:26
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62