Jpp  16.0.0-rc.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 
11 #include "JDAQ/JDAQTimesliceIO.hh"
12 #include "JDAQ/JDAQEventIO.hh"
14 #include "JDAQ/JDAQEvaluator.hh"
15 
16 #include "JDetector/JDetector.hh"
19 
20 #include "JTrigger/JHit.hh"
21 #include "JTrigger/JHitToolkit.hh"
24 #include "JTrigger/JTimeslice.hh"
25 #include "JTrigger/JHitL0.hh"
26 #include "JTrigger/JHitL1.hh"
27 #include "JTrigger/JBuildL1.hh"
28 #include "JTrigger/JBuildL2.hh"
32 #include "JTrigger/JTriggerNB.hh"
33 #include "JTrigger/JTriggerBits.hh"
37 #include "JTrigger/JTimesliceL1.hh"
40 
41 #include "JLang/JPipe.hh"
43 
45 #include "JSupport/JTreeScanner.hh"
47 #include "JSupport/JSupport.hh"
48 #include "JSupport/JMeta.hh"
50 
51 #include "Jeep/JParser.hh"
52 #include "Jeep/JMessage.hh"
53 
54 
55 /**
56  * \file
57  * Auxiliary program to re-trigger KM3NETDAQ::JDAQEvent data.
58  * \author mdejong
59  */
60 int main(int argc, char **argv)
61 {
62  using namespace std;
63  using namespace JPP;
64  using namespace KM3NETDAQ;
65 
66  typedef JAllTypes_t typelist;
67 
70  JLimit_t& numberOfEvents = inputFile.getLimit();
71  string detectorFile;
73  bool reuse_parameters;
74  bool snapshot;
75  JROOTClassSelection selection = getROOTClassSelection<typelist>();
76  int debug;
77 
78  try {
79 
80  JParser<> zap("Auxiliary program to re-trigger event data.");
81 
82  zap['f'] = make_field(inputFile, "input file.");
83  zap['o'] = make_field(outputFile, "output file.") = "trigger_reprocessor.root";
84  zap['n'] = make_field(numberOfEvents) = JLimit::max();
85  zap['a'] = make_field(detectorFile, "detector file.");
86  zap['@'] = make_field(parameters, "trigger parameters") = JPARSER::initialised();
87  zap['U'] = make_field(reuse_parameters, "reuse trigger parameters from input file.");
88  zap['S'] = make_field(snapshot, "use snapshot hits instead of triggered hits.");
89  zap['C'] = make_field(selection, "selection of data types for output.") = JPARSER::initialised();
90  zap['d'] = make_field(debug, "debug flag.") = 1;
91 
92  zap(argc, argv);
93  }
94  catch(const exception &error) {
95  FATAL(error.what() << endl);
96  }
97 
98 
99  cout.tie(&cerr);
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 
126 
127  parameters.triggerNB.write.prescale = 1;
128 
129  DEBUG("Frame time [ms] " << getFrameTime() * 1e-6 << endl);
130  DEBUG("Reset time [ms] " << getRTS() * 1e-6 << endl);
131  DEBUG("Trigger" << endl << parameters << endl);
132 
133  const JModuleRouter moduleRouter(detector);
134 
135  if (parameters.writeSummary()) { WARNING("Discard writeSummary option during reprocesing of data." << endl); }
136  if (parameters.writeL1()) { WARNING("Discard writeL1 option during reprocesing of data." << endl); }
137  if (parameters.writeL2()) { WARNING("Discard writeL2 option during reprocesing of data." << endl); }
138  if (parameters.writeSN()) { WARNING("Discard writeSN option during reprocesing of data." << endl); }
139 
140  //typedef JHit hit_type;
141  //typedef int hit_type;
142  typedef double hit_type;
143 
144  typedef JSuperFrame1D<hit_type> JSuperFrame1D_t;
145  typedef JSuperFrame2D<hit_type> JSuperFrame2D_t;
146  typedef JTimeslice <hit_type> JTimeslice_t;
147  typedef JBuildL1 <hit_type> JBuildL1_t;
148  typedef JBuildL2 <hit_type> JBuildL2_t;
149 
150  const JBuildL1_t buildL1(parameters);
151  const JBuildL2_t buildL2(parameters.L2);
152  const JBuildL2_t buildSN(parameters.SN);
153  const JBuildL2_t buildNB(parameters.NB);
154 
155  JTimesliceRouter timesliceRouter(parameters.numberOfBins);
156 
157  const JTriggerNB triggerNB (parameters);
158  const JTrigger3DMuon trigger3DMuon (parameters);
159  const JTrigger3DShower trigger3DShower(parameters);
160  const JTriggerMXShower triggerMXShower(parameters, detector);
161 
162 
163  outputFile.open();
164 
165  if (!outputFile.is_open()) {
166  FATAL("Error opening file " << outputFile << endl);
167  }
168 
169  outputFile.put(JMeta(argc, argv));
170  outputFile.put(parameters);
171 
172 
174 
176 
177  if (scan.getEntries() == 0) {
178  FATAL("No summary data." << endl);
179  }
180 
181  while (inputFile.hasNext()) {
182 
183  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
184 
185  JDAQEvent* evt = inputFile.next();
186  Long64_t index = scan.find(*evt);
187  JDAQSummaryslice* summary = scan.getEntry(index);
188 
189  if (evt->getFrameIndex() != summary->getFrameIndex()) {
190  DEBUG("Frame indices " << evt->getFrameIndex() << " != " << summary->getFrameIndex() << endl);
191  }
192 
193  JDAQTimeslice timeslice(*evt, *summary, snapshot);
194 
195  DEBUG(timeslice << endl);
196 
197  timesliceRouter.configure(timeslice);
198 
199 
200  JTimeslice_t timesliceL0(timeslice.getDAQChronometer());
201  JTimeslice_t timesliceL1(timeslice.getDAQChronometer());
202  JTimeslice_t timesliceL2(timeslice.getDAQChronometer());
203  JTimeslice_t timesliceSN(timeslice.getDAQChronometer());
204  JTimeslice_t timesliceNB(timeslice.getDAQChronometer());
205 
206  for (JDAQTimeslice::const_iterator super_frame = timeslice.begin(); super_frame != timeslice.end(); ++super_frame) {
207 
208  if (moduleRouter.hasModule(super_frame->getModuleID())) {
209 
210  // calibration
211 
212  const JModule& module = moduleRouter.getModule(super_frame->getModuleID());
213  JSuperFrame2D_t& buffer = JSuperFrame2D_t::demultiplex(*super_frame, module);
214 
215  // Apply high-rate veto
216 
217  buffer.applyHighRateVeto(parameters.highRateVeto_Hz);
218 
219  // L0
220 
221  timesliceL0.push_back(JSuperFrame1D_t(buffer));
222 
223  // Nano-beacon trigger
224 
225  if (parameters.triggerNB.enabled) {
226 
227  JSuperFrame2D_t::iterator __end = partition(buffer.begin(), buffer.end(), parameters.triggerNB.pmts);
228 
229  if (buffer.begin() != __end) {
230 
231  timesliceNB.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
232  super_frame->getModuleIdentifier(),
233  module.getPosition()));
234 
235 
236  JSuperFrame1D_t zbuf;
237 
238  buildL1(buffer.begin(), __end , back_inserter(zbuf));
239 
240 
241  buildNB(buffer.begin() , __end, zbuf, back_inserter(*timesliceNB.rbegin()));
242  }
243  }
244 
245  // L1
246 
247  timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
248  super_frame->getModuleIdentifier(),
249  module.getPosition()));
250 
251  buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
252 
253  // L2
254 
255  timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
256  super_frame->getModuleIdentifier(),
257  module.getPosition()));
258 
259  buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
260 
261  // SN
262 
263  timesliceSN.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
264  super_frame->getModuleIdentifier(),
265  module.getPosition()));
266 
267  buildSN(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceSN.rbegin()));
268  }
269  }
270 
271 
272  // Trigger
273 
274  if (parameters.triggerNB.enabled) {
275 
276  const JTriggerInput trigger_input(timesliceNB);
277 
278  for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
279 
280  if (parameters.triggerNB.write()) {
281 
282  JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
283  getTriggerMask(triggerNB.getTriggerBit()),
284  *hit,
285  timesliceRouter,
286  moduleRouter,
287  parameters.TMaxLocal_ns,
288  parameters.triggerNB.DMax_m,
289  getTimeRange(parameters.triggerNB));
290 
291  outputFile.put(tev);
292  }
293  }
294  }
295 
296  JTriggerInput trigger_input(timesliceL2);
297  JTriggerOutput trigger_output;
298 
299  trigger3DMuon (trigger_input, back_inserter(trigger_output));
300  trigger3DShower(trigger_input, back_inserter(trigger_output));
301  triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
302 
303  trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
304 
305  DEBUG("Number of triggers: " << trigger_output.size() << endl);
306 
307  for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
308 
309  JTriggeredEvent tev(*event,
310  timesliceRouter,
311  moduleRouter,
312  parameters.TMaxLocal_ns,
314 
315  tev.setCounter(evt->getCounter());
316 
317  outputFile.put(tev);
318  }
319  }
320  STATUS(endl);
321 
322  JSingleFileScanner<typelist> io(inputFile);
323 
324  selection.remove<JDAQEvent>();
325 
326  io | JValve<typelist>(selection) | outputFile;
327 
328  outputFile.close();
329 }
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:1500
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.
*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:66
Basic data structure for time and time over threshold information of hit.
string outputFile
Template definition for direct access of elements in ROOT TChain.
Definition: JTreeScanner.hh:91
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:224
void merge(const JMatch_t &match)
Merge events.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
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.
int debug
debug level
Definition: JSirene.cc:63
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.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
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.
JTriggerCounter_t next()
Increment trigger counter.
Time slice with calibrated data.
Definition: JTimeslice.hh:26