67{
68
70 JLimit_t& numberOfEvents = inputFile.getLimit();
72 string detectorFile;
73 double TMax_ns;
76 int binWidth_ms;
77 bool backVeto;
78 bool globalOutputOnly;
79 bool mode2D;
82
83
84 try {
85
86 JParser<> zap(
"Example program to examine rates as a function of time on ms-level timescales.");
87
93 zap[
'T'] =
make_field(TMax_ns,
"Time window for local coincidences (if 0 run in L0 mode)") = 0.0;
94 zap[
'B'] =
make_field(binWidth_ms,
"Bin width (experimental)") = 1;
95 zap[
'V'] =
make_field(backVeto,
"Apply retroactive veto.");
96 zap[
'D'] =
make_field(mode2D,
"L1 mode: create 2D histogram with time differences of coincidences (heavy memory usage, ignored if TMax_ns = 0)");
97 zap[
'O'] =
make_field(globalOutputOnly,
"Write only aggregate histograms");
98 zap[
'M'] =
make_field(multiplicityRange,
"L1 mode: multiplicity range (ignored if TMax_ns = 0)") =
JRange<int>(2,31);
101
102
103 zap(argc, argv);
104 }
105 catch(const exception &error) {
106 FATAL(error.what() << endl);
107 }
108
109
111 FATAL(
"Frame time must be an integer multiple of bin width");
112 }
113
115
116 try {
118 }
121 }
122
123
124
126
128
130
131 pts->configure(inputFile);
132
133 int fEnd = pts->rbegin()->getFrameIndex();
134 int fStart = pts->begin( )->getFrameIndex();
135
136 if (fEnd > inputFile.getUpperLimit()) {
137 fEnd = fStart + inputFile.getUpperLimit();
138 }
139
141 double tStart_ms = (fStart - 1) *
getFrameTime() / 1.0e6;
142
143 int runNumber = pts->begin()->getRunNumber();
144
145 TString runTag = Form("%d" , runNumber);
146
147 double tRun_ms = tEnd_ms - tStart_ms;
148
149 NOTICE(
"START/END/DURATION [s]: " << tStart_ms / 1000 <<
" " << tEnd_ms / 1000 <<
" " << tRun_ms / 1000 << endl);
150
151
152
156
158
161
163
164
165
167
168 int nx = (tEnd_ms - tStart_ms) / binWidth_ms;
169
170 JManager_t RT_DOM(new TH1F("RT_%", NULL, nx , tStart_ms, tEnd_ms));
171 JManager_t NC_DOM(new TH1F("NC_%", NULL, nx / 100, tStart_ms, tEnd_ms));
172
173 TString rt_tag = runTag + TString(".RT_DET_%");
174 TString nc_tag = runTag + TString(".NC_DET_%");
175
176 JManager_t RT_DET(new TH1F(rt_tag, NULL, nx, tStart_ms, tEnd_ms));
177 JManager_t NC_DET(new TH1F(nc_tag, NULL, nx / 100, tStart_ms, tEnd_ms));
178
180
181
182 if (mode2D) {
183
184 const int ny = 50;
185
187
188 if (nx >= max_size) {
189 FATAL(
"2D histogram size not supported by ROOT file output; limit input size (-n) below " << floor(max_size / 100.0) << endl);
190 }
191
192 TString rt2d_tag = runTag + TString(".RT2D_DET");
193
194 hT =
new h2d_t(rt2d_tag, NULL, nx, tStart_ms, tEnd_ms, ny, -TMax_ns, +TMax_ns);
195 hT->SetDirectory(0);
196
197 }
198
199
200
201
202
204
205
206
208
209 if (pts->hasNext()) {
210 curr = *(pts->next());
211 ++counter;
212 } else {
213 FATAL(
"Input file is too short.");
214 }
215
216
217
218 for ( ; pts->hasNext() && counter != inputFile.getLimit(); ++counter) {
219
220 STATUS(
"timeslice: " << setw(10) << counter <<
'\r');
DEBUG(endl);
221
223
225
227
229
230
231
233
234 if (backVeto && ((in - ic) == 1)) {
236 summaryRouter.
update(nextSummary);
237 }
238
239
240
241 for (JDAQTimeslice::const_iterator frame = curr.begin(); frame != curr.end(); ++frame) {
242
243 const int moduleID = frame->getModuleID();
244 const JModule& module = moduleRouter.getModule(moduleID);
245 const string moduleLabel =
getLabel(module);
246
247 TH1F* RD = RT_DOM[moduleLabel];
248
250
251
252
253 if (frame->testHighRateVeto() || frame->testFIFOStatus()) {
255 veto[pmt] = ( frame->testHighRateVeto(pmt) || frame->testFIFOStatus(pmt) );
256 }
257 }
258
259
260
261 if (nextSummary != NULL) {
262
264
268 }
269 }
270
271 }
272
273
274
275 NC_DOM[moduleLabel]->Fill(tTimeslice_ms, count(veto.begin(), veto.end(), false));
276
277
278
279 JSuperFrame2D_t& buffer2D = JSuperFrame2D_t::demultiplex(*frame, module, totSelector_ns);
280
281 for (JSuperFrame2D_t::iterator i = buffer2D.begin(); i != buffer2D.end(); ++i) {
282 if (veto[i->getPMTAddress()]) {
283 i->reset();
284 }
285 }
286
288
289 JSuperFrame1D_t&
data = JSuperFrame1D_t::multiplex(buffer2D);
290
291
292
293
294 if (
data.size() > 1) {
295
296
297
298 if (TMax_ns > 0) {
300 }
301
302
303
304 for (vector<hit_type>::const_iterator p =
data.begin(); p !=
data.end(); p++) {
305
306 const double tHit_ms = tTimeslice_ms + (p->getT() / 1.0e6);
307
308 if (TMax_ns == 0.0) {
309
310 RD->Fill(tHit_ms);
311
312 } else {
313
314 vector<hit_type>::const_iterator q = p;
315
316 while (++q !=
data.end() && q->getT() - p->getT() <= TMax_ns) {}
317
319
320 if (multiplicityRange(M)) {
321
322 RD->Fill(tHit_ms);
323
324 if (mode2D) {
325
327
328 for (vector<hit_type>::const_iterator __p = p; __p != q; ++__p) {
329
330 for (vector<hit_type>::const_iterator __q = __p; ++__q != q; ) {
331
333
334 hT->Fill(tHit_ms, dt, 1.0 / W);
335
336 }
337 }
338 }
339
340 }
341
342 p = (q - 1);
343
344 }
345
346 }
347 }
348 }
349
350
351
352 if (nextSummary != NULL) { delete nextSummary; }
353
354
355
356 curr = next;
357
358 }
359
360
361
362
363
364
365 NOTICE(
"Processing histograms." << endl);
366
367 for (JDetector::const_iterator module =
detector.begin(); module !=
detector.end(); ++module) {
368
369 string moduleLabel =
getLabel(*module);
370
371 if (RT_DOM.count(moduleLabel) && NC_DOM.count(moduleLabel)) {
372
373 TH1F* rt = RT_DOM.at(moduleLabel);
374 TH1F* nc = NC_DOM.at(moduleLabel);
375
376 for (int b = 1; b <= rt->GetXaxis()->GetNbins(); b++) {
377
378 double r = rt->GetBinContent(b);
379 double t = rt->GetBinCenter( b);
380
381 RT_DET["SUM"]->Fill(t, r);
382
383 }
384
385
386 for (int b = 1; b <= nc->GetXaxis()->GetNbins(); b++) {
387
388 double n = nc->GetBinContent(b);
389 double t = nc->GetBinCenter( b);
390
391 NC_DET[
"SUM"]->Fill(t,
n);
392
393 }
394
395 } else {
396
397 DEBUG(moduleLabel <<
" not active." << endl);
398
399 }
400
401 }
402
403 NOTICE(
"Writing output file" << endl);
404
406
408
409 NOTICE(
"Writing 1D histograms" << endl);
410
411 RT_DET.Write(out);
412 NC_DET.Write(out);
413
414 NOTICE(
"Writing 2D histogram" << endl);
415
416 if (hT != NULL) {
417 hT->Write();
418 }
419
420 if (!globalOutputOnly) {
421
422 TString dir_tag = runTag + TString(".Modules");
423
424 NOTICE(
"Writing individual modules histograms" << endl);
425
426 TDirectory* dir = out.mkdir(dir_tag);
427 RT_DOM.Write(*dir);
428 NC_DOM.Write(*dir);
429 }
430
431 NOTICE(
"Closing file" << endl);
432
433 out.Close();
434 }
435
436}
#define DEBUG(A)
Message macros.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Simple wrapper around JModuleRouter class for direct addressing of PMT data in detector data structur...
Router for direct addressing of module data in detector data structure.
Data structure for a composite optical module.
Utility class to parse command line options.
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys.
Router for fast addressing of summary data in KM3NETDAQ::JDAQSummaryslice data structure as a functio...
const JDAQSummaryFrame & getSummaryFrame(const JDAQModuleIdentifier &module) const
Get summary frame.
void update(const JDAQSummaryslice *ps)
Update router.
Auxiliary interface for direct access of elements in ROOT TChain.
Template definition for direct access of elements in ROOT TChain.
Reduced data structure for L0 hit.
1-dimensional frame with time calibrated data from one optical module.
2-dimensional frame with time calibrated data from one optical module.
int getFrameIndex() const
Get frame index.
bool testFIFOStatus() const
Test FIFO status.
bool testHighRateVeto() const
Test high-rate veto status.
Data storage class for rate measurements of all PMTs in one module.
std::string getLabel(const JLocation &location)
Get module label for monitoring and other applications.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
long long int factorial(const long long int n)
Determine factorial.
std::set< JROOTClassSelector > getROOTClassSelection(const bool option=false)
Get ROOT class selection.
Long64_t counter_type
Type definition for counter.
const unsigned int h2d_limit
double getFrameTime()
Get frame time duration.
double getTimeOfRTS(const JDAQChronometer &chronometer)
Get time of last RTS in ns since start of run for a given chronometer.
static const int NUMBER_OF_PMTS
Total number of PMTs in module.
Auxiliary class for a type holder.
Auxiliary class to select ROOT class based on class name.
Auxiliary class to select JTreeScanner based on ROOT class name.
Auxiliary class for defining the range of iterations of objects.
static counter_type max()
Get maximum counter value.
Auxiliary class to select DAQ hits based on time-over-treshold value.
@ join_t
join consecutive hits according match criterion