Jpp 21.0.0-rc.1-88-g0130508c4
the software that should make you happy
Loading...
Searching...
No Matches
JTriggerReprocessor.cc
Go to the documentation of this file.
1
2#include <string>
3#include <iostream>
4#include <iomanip>
5
12
14#include "JDAQ/JDAQEventIO.hh"
16#include "JDAQ/JDAQEvaluator.hh"
17
21
22#include "JTrigger/JHit.hh"
27#include "JTrigger/JHitL0.hh"
28#include "JTrigger/JHitL1.hh"
29#include "JTrigger/JBuildL1.hh"
30#include "JTrigger/JBuildL2.hh"
42
43#include "JLang/JPipe.hh"
45
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 */
62int 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;
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 ERROR("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 DEBUG("L0 " << setw(8) << timesliceL0.rbegin()->getModuleID() << ' ' << setw(8) << timesliceL0.rbegin()->size() << LAMBDA([ps = timesliceL0.rbegin()](ostream& out) { for (const auto& i : *ps) { out << " " << i; } }) << endl);
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 buildNB(buffer.begin(), __end, zbuf, back_inserter(*timesliceNB.rbegin()));
252 }
253 }
254
255 // L1
256
257 timesliceL1.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
258 super_frame->getModuleIdentifier(),
259 module.getPosition()));
260
261 buildL1(*timesliceL0.rbegin(), back_inserter(*timesliceL1.rbegin()));
262
263 DEBUG("L1 " << setw(8) << timesliceL1.rbegin()->getModuleID() << ' ' << setw(8) << timesliceL1.rbegin()->size() << LAMBDA([ps = timesliceL1.rbegin()](ostream& out) { for (const auto& i : *ps) { out << " " << i; } }) << endl);
264
265 // L2
266
267 timesliceL2.push_back(JSuperFrame1D_t(super_frame->getDAQChronometer(),
268 super_frame->getModuleIdentifier(),
269 module.getPosition()));
270
271 buildL2(buffer, *timesliceL1.rbegin(), back_inserter(*timesliceL2.rbegin()));
272
273 DEBUG("L2 " << setw(8) << timesliceL2.rbegin()->getModuleID() << ' ' << setw(8) << timesliceL2.rbegin()->size() << LAMBDA([ps = timesliceL2.rbegin()](ostream& out) { for (const auto& i : *ps) { out << " " << i; } }) << endl);
274
275 // SN
276 {
277 JTimeslice_t::value_type tv(super_frame->getDAQChronometer(),
278 super_frame->getModuleIdentifier(),
279 module.getPosition());
280
281 buildSN(buffer, *timesliceL1.rbegin(), back_inserter(tv));
282
283 if (!tv.empty()) {
284
285 timesliceSN.push_back(tv);
286
287 DEBUG("SN " << setw(8) << timesliceSN.rbegin()->getModuleID() << ' ' << setw(8) << timesliceSN.rbegin()->size() << LAMBDA([ps = timesliceL0.rbegin()](ostream& out) { for (const auto& i : *ps) { out << " " << i; } }) << endl);
288 }
289 }
290 }
291 }
292
293
294 // Trigger
295
296 if (parameters.triggerNB.enabled) {
297
298 const JTriggerInput trigger_input(timesliceNB);
299
300 for (JTriggerInput::const_iterator hit = trigger_input.begin(); hit != trigger_input.end(); ++hit) {
301
302 if (parameters.triggerNB.write()) {
303
304 JTriggeredEvent tev(timesliceNB.getDAQChronometer(),
305 getTriggerMask(triggerNB.getTriggerBit()),
306 *hit,
307 timesliceRouter,
308 moduleRouter,
309 parameters.TMaxLocal_ns,
310 parameters.triggerNB.DMax_m,
311 getTimeRange(parameters.triggerNB));
312
313 outputFile.put(tev);
314 }
315 }
316 }
317
318 JTriggerInput trigger_input(timesliceL2);
319 JTriggerOutput trigger_output;
320
321 trigger3DMuon (trigger_input, back_inserter(trigger_output));
322 trigger3DShower(trigger_input, back_inserter(trigger_output));
323 triggerMXShower(trigger_input, timesliceL0, back_inserter(trigger_output));
324
325 trigger_output.merge(JEventOverlap(parameters.TMaxEvent_ns));
326
327 DEBUG("Number of triggers: " << trigger_output.size() << endl);
328
329 for (JTriggerOutput::const_iterator event = trigger_output.begin(); event != trigger_output.end(); ++event) {
330
331 JTriggeredEvent tev(*event,
332 timesliceRouter,
333 moduleRouter,
334 parameters.TMaxLocal_ns,
335 getTimeRange(parameters));
336
337 tev.setCounter(evt->getCounter());
338
339 outputFile.put(tev);
340 }
341 }
342 STATUS(endl);
343
344 JSingleFileScanner<typelist> io(inputFile);
345
346 selection.remove<JDAQEvent>();
347
348 io | JValve<typelist>(selection) | outputFile;
349
350 outputFile.close();
351}
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:74
#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:2140
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.
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.
bool hasModule(const JModuleIdentifier &id) const
Has module.
const JModule & getModule(const JModuleIdentifier &id) const
Get module parameters.
Data structure for a composite optical module.
Definition JModule.hh:76
General exception.
Definition JException.hh:25
Auxiliary class for selection of data type.
Definition JValve.hh:23
Utility class to parse command line options.
Definition JParser.hh:1697
Object writing to file.
Object reading from a list of files.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
Template definition for direct access of elements in ROOT TChain.
1-dimensional frame with time calibrated data from one optical module.
2-dimensional frame with time calibrated data from one optical module.
Data structure for input to trigger algorithm.
Nano-beacon trigger.
Definition JTriggerNB.hh:21
Auxiliary class to build KM3NETDAQ::JDAQEvent for a triggered event.
const JDAQChronometer & getDAQChronometer() const
Get DAQ chronometer.
int getFrameIndex() const
Get frame index.
int main()
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).
std::set< JROOTClassSelector > getROOTClassSelection(const bool option=false)
Get ROOT class selection.
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
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:14
Detector file.
Definition JHead.hh:227
Match of two events considering overlap in time and position.
Transmission with position.
Definition JBillabong.cc:70
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:67
Auxiliary class for ROOT class selection.
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
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.
Auxiliary data structure to convert (lambda) function to printable object.
Definition JManip.hh:726