Jpp  19.0.0
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 
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 
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,
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 }
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:1711
General exception.
Definition: JException.hh:24
#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:67
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
Match of two events considering overlap in time.
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:84
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
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:2158
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.
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
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:84
Setting of trigger bits.
do set_variable DETECTOR_TXT $WORKDIR detector
KM3NeT DAQ constants, bit handling, etc.
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