Jpp  17.1.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JTriggerReprocessor.cc File Reference

Auxiliary program to re-trigger KM3NETDAQ::JDAQEvent data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/MultiHead.hh"
#include "km3net-dataformat/offline/Evt.hh"
#include "km3net-dataformat/offline/Hit.hh"
#include "km3net-dataformat/online/JDAQ.hh"
#include "km3net-dataformat/online/JDAQClock.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JDAQ/JDAQSummarysliceIO.hh"
#include "JDAQ/JDAQEvaluator.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JTrigger/JHit.hh"
#include "JTrigger/JHitToolkit.hh"
#include "JTrigger/JSuperFrame1D.hh"
#include "JTrigger/JSuperFrame2D.hh"
#include "JTrigger/JTimeslice.hh"
#include "JTrigger/JHitL0.hh"
#include "JTrigger/JHitL1.hh"
#include "JTrigger/JBuildL1.hh"
#include "JTrigger/JBuildL2.hh"
#include "JTrigger/JTrigger3DShower.hh"
#include "JTrigger/JTriggerMXShower.hh"
#include "JTrigger/JTrigger3DMuon.hh"
#include "JTrigger/JTriggerNB.hh"
#include "JTrigger/JTriggerBits.hh"
#include "JTrigger/JEventOverlap.hh"
#include "JTrigger/JTimesliceRouter.hh"
#include "JTrigger/JTriggeredEvent.hh"
#include "JTrigger/JTimesliceL1.hh"
#include "JTrigger/JTriggerParameters.hh"
#include "JTrigger/JTriggerToolkit.hh"
#include "JLang/JPipe.hh"
#include "JROOT/JROOTClassSelector.hh"
#include "JSupport/JSingleFileScanner.hh"
#include "JSupport/JTreeScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JSupport/JSupport.hh"
#include "JSupport/JMeta.hh"
#include "JSupport/JTriggerParametersSupportkit.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Auxiliary program to re-trigger KM3NETDAQ::JDAQEvent data.

Author
mdejong

Definition in file JTriggerReprocessor.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 62 of file JTriggerReprocessor.cc.

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: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
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
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:66
string outputFile
Template definition for direct access of elements in ROOT TChain.
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.
Type list.
Definition: JTypeList.hh:22
void setDAQLongprint(const bool option)
Set DAQ print option.
Definition: JDAQPrint.hh:28
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:1961
double getFrameTime()
Get frame time duration.
Definition: JDAQClock.hh:162
#define NOTICE(A)
Definition: JMessage.hh:64
Data time slice.
Auxiliary class to build JDAQEvent for a triggered event.
int debug
debug level
Definition: JSirene.cc:67
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Nano-beacon trigger.
Definition: JTriggerNB.hh:19
Template L1 hit builder.
Definition: JBuildL1.hh:85
#define FATAL(A)
Definition: JMessage.hh:67
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getRTS()
Get TDC dynamic range.
Definition: JDAQClock.hh:173
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
do set_variable DETECTOR_TXT $WORKDIR detector
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.
JTriggerCounter_t next()
Increment trigger counter.
Time slice with calibrated data.
Definition: JTimeslice.hh:26
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62