CbmRoot
Loading...
Searching...
No Matches
CbmMcbm2018EventBuilder.cxx
Go to the documentation of this file.
1/* Copyright (C) 2019-2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Florian Uhlig [committer] */
4
6
8#include "CbmMuchDigi.h"
9#include "CbmPsdDigi.h"
10#include "CbmRichDigi.h"
11#include "CbmStsDigi.h"
12#include "CbmTofDigi.h"
13#include "CbmTrdDigi.h"
14
15#include "FairRootManager.h"
16#include "FairRunOnline.h"
17#include <Logger.h>
18
19#include "TClonesArray.h"
20#include "TH1.h"
21#include "TH2.h"
22#include "THttpServer.h"
23#include <TDirectory.h>
24#include <TFile.h>
25
26#include <iomanip>
27using std::fixed;
28using std::make_pair;
29using std::setprecision;
30
31#include "CbmDigiManager.h"
32
33// ---- Default constructor -------------------------------------------
34CbmMcbm2018EventBuilder::CbmMcbm2018EventBuilder() : FairTask("CbmMcbm2018EventBuilder") {}
35
36// ---- Destructor ----------------------------------------------------
38
39// ---- Initialisation ----------------------------------------------
41{
42 // Load all necessary parameter containers from the runtime data base
43 /*
44 FairRunAna* ana = FairRunAna::Instance();
45 FairRuntimeDb* rtdb=ana->GetRuntimeDb();
46
47 <CbmMcbm2018EventBuilderDataMember> = (<ClassPointer>*)
48 (rtdb->getContainer("<ContainerName>"));
49 */
50}
51
52// ---- Init ----------------------------------------------------------
54{
55
56 // Get a handle from the IO manager
57 FairRootManager* ioman = FairRootManager::Instance();
58
59 // Get a pointer to the previous already existing data level
62 fDigiMan->Init();
63
64 // Bmon is not included in DigiManager
65 fBmonDigiVec = ioman->InitObjectAs<std::vector<CbmTofDigi> const*>("BmonDigi");
66 if (!fBmonDigiVec) {
67 fBmonDigiArr = static_cast<TClonesArray*>(ioman->GetObject("BmonDigi"));
68 if (!fBmonDigiArr) { LOG(info) << "No Bmon digi input."; }
69 }
70
71 if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No STS digi input."; }
72
73 if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digi input."; }
74
75 if (!fDigiMan->IsPresent(ECbmModuleId::kTrd)) { LOG(info) << "No TRD digi input."; }
76
77 if (!fDigiMan->IsPresent(ECbmModuleId::kTof)) { LOG(info) << "No TOF digi input."; }
78
79 if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { LOG(info) << "No RICH digi input."; }
80
81 if (!fDigiMan->IsPresent(ECbmModuleId::kPsd)) { LOG(info) << "No PSD digi input."; }
82
83 // Register output array (CbmEvent)
84 fEvents = new TClonesArray("CbmEvent", 100);
85 ioman->Register("CbmEvent", "Cbm_Event", fEvents, IsOutputBranchPersistent("CbmEvent"));
86
87 if (!fEvents) LOG(fatal) << "Output branch was not created";
88
89
90 if (fFillHistos) {
91 fDiffTime =
92 new TH1F("fDiffTime", "Time difference between two consecutive digis;time diff [ns];Counts", 420, -100.5, 1999.5);
93 fhEventTime = new TH1F("hEventTime", "seed time of the events; Seed time [s]; Events", 60000, 0, 600);
94 fhEventDt =
95 new TH1F("fhEventDt", "interval in seed time of consecutive events; Seed time [s]; Events", 2100, -100.5, 1999.5);
96 fhEventSize = new TH1F("hEventSize", "nb of all digis in the event; Nb Digis []; Events []", 10000, 0, 10000);
97 fhNbDigiPerEvtTime = new TH2I("hNbDigiPerEvtTime",
98 "nb of all digis per event vs seed time of the events; Seed "
99 "time [s]; Nb Digis []; Events []",
100 600, 0, 600, 1000, 0, 10000);
101
102 fhNbDigiPerEvtTimeBmon = new TH2I("hNbDigiPerEvtTimeBmon",
103 "nb of Bmon digis per event vs seed time of the events; Seed "
104 "time [s]; Nb Digis []; Events []",
105 600, 0, 600, 4000, 0, 4000);
106 fhNbDigiPerEvtTimeSts = new TH2I("hNbDigiPerEvtTimeSts",
107 "nb of STS digis per event vs seed time of the events; Seed "
108 "time [s]; Nb Digis []; Events []",
109 600, 0, 600, 4000, 0, 4000);
110 fhNbDigiPerEvtTimeMuch = new TH2I("hNbDigiPerEvtTimeMuch",
111 "nb of MUCH digis per event vs seed time of the events; Seed "
112 "time [s]; Nb Digis []; Events []",
113 600, 0, 600, 4000, 0, 4000);
114 fhNbDigiPerEvtTimeTrd = new TH2I("hNbDigiPerEvtTimeTrd",
115 "nb of TRD digis per event vs seed time of the events; Seed "
116 "time [s]; Nb Digis []; Events []",
117 600, 0, 600, 4000, 0, 4000);
118 fhNbDigiPerEvtTimeTof = new TH2I("hNbDigiPerEvtTimeTof",
119 "nb of TOF digis per event vs seed time of the events; Seed "
120 "time [s]; Nb Digis []; Events []",
121 600, 0, 600, 4000, 0, 4000);
122 fhNbDigiPerEvtTimeRich = new TH2I("hNbDigiPerEvtTimeRich",
123 "nb of RICH digis per event vs seed time of the events; Seed "
124 "time [s]; Nb Digis []; Events []",
125 600, 0, 600, 4000, 0, 4000);
126 fhNbDigiPerEvtTimePsd = new TH2I("hNbDigiPerEvtTimePsd",
127 "nb of PSD digis per event vs seed time of the events; Seed "
128 "time [s]; Nb Digis []; Events []",
129 600, 0, 600, 4000, 0, 4000);
130 } // if( fFillHistos )
131
132 return kSUCCESS;
133}
134
135// ---- ReInit -------------------------------------------------------
136InitStatus CbmMcbm2018EventBuilder::ReInit() { return kSUCCESS; }
137
138// ---- Exec ----------------------------------------------------------
139void CbmMcbm2018EventBuilder::Exec(Option_t* /*option*/)
140{
141
142 LOG_IF(info, fNrTs % 1000 == 0) << "Begin of TS " << fNrTs;
143
144 InitSorter();
145
146 BuildEvents();
147
148 LOG(debug) << "Found " << fEventVector.size() << " events";
149
151
152 if (fFillHistos) { FillHisto(); } // if( fFillHistos )
153
154 LOG(debug) << "Found " << fEventVector.size() << " triggered events";
155
156 FillOutput();
157
158 fNrTs++;
159}
160
162{
163 // Fill the first entry of each TClonesarray to the std::set
164 // The sorting should be done using the time of the digi which
165 // can be received using the GetTime() function of CbmDigi
166
167 Int_t nrBmonDigis {0};
168 if (fBmonDigiVec) nrBmonDigis = fBmonDigiVec->size();
169 else if (fBmonDigiArr)
170 nrBmonDigis = fBmonDigiArr->GetEntriesFast();
171 Int_t nrStsDigis = fDigiMan->GetNofDigis(ECbmModuleId::kSts);
172 Int_t nrMuchDigis = fDigiMan->GetNofDigis(ECbmModuleId::kMuch);
173 Int_t nrTrdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTrd);
174 Int_t nrTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof);
175 Int_t nrRichDigis = fDigiMan->GetNofDigis(ECbmModuleId::kRich);
176 Int_t nrPsdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kPsd);
177
178 LOG(debug) << "BmonDigis: " << nrBmonDigis;
179 LOG(debug) << "StsDigis: " << nrStsDigis;
180 LOG(debug) << "MuchDigis: " << nrMuchDigis;
181 LOG(debug) << "TrdDigis: " << nrTrdDigis;
182 LOG(debug) << "TofDigis: " << nrTofDigis;
183 LOG(debug) << "RichDigis: " << nrRichDigis;
184 LOG(debug) << "PsdDigis: " << nrPsdDigis;
185
186 // CbmDigi* digi = nullptr;
187
188 if (nrBmonDigis > 0) { AddDigiToSorter<CbmTofDigi>(ECbmModuleId::kHodo, 0); }
189 if (nrStsDigis > 0) { AddDigiToSorter<CbmStsDigi>(ECbmModuleId::kSts, 0); }
190 if (nrMuchDigis > 0) {
191 if (fbUseBaseMuchDigi) { AddDigiToSorter<CbmMuchDigi>(ECbmModuleId::kMuch, 0); } // if( fbUseBaseMuchDigi )
192 else {
194 } // else of if( fbUseBaseMuchDigi )
195 }
196 if (nrTrdDigis > 0) { AddDigiToSorter<CbmTrdDigi>(ECbmModuleId::kTrd, 0); }
197 if (nrTofDigis > 0) { AddDigiToSorter<CbmTofDigi>(ECbmModuleId::kTof, 0); }
198 if (nrRichDigis > 0) { AddDigiToSorter<CbmRichDigi>(ECbmModuleId::kRich, 0); }
199 if (nrPsdDigis > 0) { AddDigiToSorter<CbmPsdDigi>(ECbmModuleId::kPsd, 0); }
200 for (const auto& data : fSorter) {
201 LOG(debug) << "Array, Entry(" << data.second.first << ", " << data.second.second << "): " << fixed
202 << setprecision(15) << data.first << " ns";
203 }
204
205 // Get the first element of the set from which one gets the first
206 // element of the tuple (digi) from which one gets the smallest time
207 // of all digis of the new TS
208 if (fSorter.size() > 0) {
209 fPrevTime = fSorter.begin()->first;
211 }
212}
213
215{
216 // Create a first CbmEvent
218
219 while (fSorter.size() > 0) {
220
221 // Extract the needed information from the first element of the set
222 // The first element is the one with the smallest time
223 auto it = fSorter.begin();
224 Double_t time = it->first;
225 ECbmModuleId system = it->second.first;
226 Int_t entry = it->second.second;
227
228 // Decide if the digi belongs to the current event or if
229 // it starts a new event
230 if (!IsDigiInEvent(time)) {
232 fEventVector.push_back(fCurrentEvent);
233 // Create then next CbmEvent
234 fStartTimeEvent = time;
236 }
237 AddDigiToEvent(system, entry);
238
239 if (fFillHistos) fVect.emplace_back(make_pair(system, entry));
240
241 // Remove the first element from the set and insert the next digi
242 // from the same system
243 fSorter.erase(fSorter.begin());
244
245 switch (system) {
246 case ECbmModuleId::kSts: {
247 AddDigiToSorter<CbmStsDigi>(system, ++entry);
248 break;
249 } // case ECbmModuleId::kSts
250 case ECbmModuleId::kMuch: {
251 if (fbUseBaseMuchDigi) { AddDigiToSorter<CbmMuchDigi>(system, ++entry); } // if( fbUseBaseMuchDigi )
252 else {
254 } // else of if( fbUseBaseMuchDigi )
255 break;
256 } // case ECbmModuleId::kMuch
257 case ECbmModuleId::kTrd: {
258 AddDigiToSorter<CbmTrdDigi>(system, ++entry);
259 break;
260 } // case ECbmModuleId::kTrd
261 case ECbmModuleId::kTof: {
262 AddDigiToSorter<CbmTofDigi>(system, ++entry);
263 break;
264 } // case ECbmModuleId::kTof
265 case ECbmModuleId::kRich: {
266 AddDigiToSorter<CbmRichDigi>(system, ++entry);
267 break;
268 } // case ECbmModuleId::kRich
269 case ECbmModuleId::kPsd: {
270 AddDigiToSorter<CbmPsdDigi>(system, ++entry);
271 break;
272 } // case ECbmModuleId::kPsd
273 case ECbmModuleId::kHodo: {
274 AddDigiToSorter<CbmTofDigi>(system, ++entry);
275 break;
276 } // case ECbmModuleId::kHodo
277 default: {
278 break;
279 } // default:
280 } //? system
281
282 if (fFillHistos) fDiffTime->Fill(time - fPrevTime);
283
284 fPrevTime = time;
285 }
287 fEventVector.push_back(fCurrentEvent);
288}
289
291{
292 // here the different possibilities have to be implemented
294 return ((time - fStartTimeEvent < fFixedTimeWindow) ? kTRUE : kFALSE);
295 }
296 else {
297 return ((time - fPrevTime < fMaximumTimeGap) ? kTRUE : kFALSE);
298 }
299}
300
302{
303 Bool_t hasTrigger {kTRUE};
304 if (hasTrigger && (fBmonDigiVec || fBmonDigiArr) && fTriggerMinBmonDigis > 0) {
305 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kBmonDigi) >= fTriggerMinBmonDigis);
306 }
307 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMinStsDigis > 0) {
308 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kStsDigi) >= fTriggerMinStsDigis);
309 }
310 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) {
311 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kMuchDigi) >= fTriggerMinMuchDigis);
312 }
313 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) {
314 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kTrdDigi) >= fTriggerMinTrdDigis);
315 }
316 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) {
317 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kTofDigi) >= fTriggerMinTofDigis);
318 }
319 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMinRichDigis > 0) {
320 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kRichDigi) >= fTriggerMinRichDigis);
321 }
322 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMinPsdDigis > 0) {
323 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kPsdDigi) >= fTriggerMinPsdDigis);
324 }
325
326 if (hasTrigger && (fBmonDigiVec || fBmonDigiArr) && fTriggerMaxBmonDigis >= 0) {
327 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kBmonDigi) < fTriggerMaxBmonDigis);
328 }
329 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kSts) && fTriggerMaxStsDigis >= 0) {
330 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kStsDigi) < fTriggerMaxStsDigis);
331 }
332 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMaxMuchDigis >= 0) {
333 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kMuchDigi) < fTriggerMaxMuchDigis);
334 }
335 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMaxTrdDigis >= 0) {
336 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kTrdDigi) < fTriggerMaxTrdDigis);
337 }
338 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMaxTofDigis >= 0) {
339 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kTofDigi) < fTriggerMaxTofDigis);
340 }
341 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kRich) && fTriggerMaxRichDigis >= 0) {
342 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kRichDigi) < fTriggerMaxRichDigis);
343 }
344 if (hasTrigger && fDigiMan->IsPresent(ECbmModuleId::kPsd) && fTriggerMaxPsdDigis >= 0) {
345 hasTrigger = hasTrigger && ((int) event->GetNofData(ECbmDataType::kPsdDigi) < fTriggerMaxPsdDigis);
346 }
347
348 return hasTrigger;
349}
350
352{
353 /*
354 fPrevTime = 0.;
355
356 ECbmModuleId prevSystem{ECbmModuleId::kNofSystems};
357 Int_t prevEntry{-1};
358
359
360 for ( const auto& _pair: fVect) {
361 ECbmModuleId _system = _pair.first;
362 Int_t _entry = _pair.second;
363 CbmDigi* digi = static_cast<CbmDigi*>(fLinkArray[_system]->At(_entry));
364 Double_t difftime = digi->GetTime() - fPrevTime;
365 fDiffTime->Fill(difftime);
366 if (difftime < 0.) {
367 fErrors++;
368 LOG(info) << fixed << setprecision(15)
369 << "DiffTime: " << difftime *1.e-9
370 << " Previous digi(" << prevSystem << ", "
371 << prevEntry << "): "
372 << fPrevTime * 1.e-9 << ", Current digi("
373 << _system << ", " <<_entry << "): "
374 << digi->GetTime() * 1.e-9;
375 }
376
377 fPrevTime = digi->GetTime();
378 prevSystem = _system;
379 prevEntry = _entry;
380 }
381 */
382 fVect.clear();
383
384 Double_t dPreEvtTime = -1.0;
385 for (CbmEvent* evt : fEventVector) {
386 fhEventTime->Fill(evt->GetStartTime() * 1e-9);
387 if (0.0 <= dPreEvtTime) { fhEventDt->Fill(evt->GetStartTime() - dPreEvtTime); } // if( 0.0 <= dPreEvtTime )
388 fhEventSize->Fill(evt->GetNofData());
389 fhNbDigiPerEvtTime->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData());
390
391 fhNbDigiPerEvtTimeBmon->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kBmonDigi));
392 fhNbDigiPerEvtTimeSts->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kStsDigi));
393 fhNbDigiPerEvtTimeMuch->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kMuchDigi));
394 fhNbDigiPerEvtTimeTrd->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kTrdDigi));
395 fhNbDigiPerEvtTimeTof->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kTofDigi));
396 fhNbDigiPerEvtTimeRich->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kRichDigi));
397 fhNbDigiPerEvtTimePsd->Fill(evt->GetStartTime() * 1e-9, evt->GetNofData(ECbmDataType::kPsdDigi));
398
399 dPreEvtTime = evt->GetStartTime();
400 } // for( CbmEvent * evt: fEventVector )
401}
402
404{
405 for (auto it = fEventVector.begin(); it != fEventVector.end();
406 /*increased in the loop*/) {
407 if (!HasTrigger((*it))) {
408 delete (*it);
409 it = fEventVector.erase(it);
410 }
411 else {
412 ++it;
413 }
414 }
415}
416
418{
419 // Clear TClonesArray before usage.
420 fEvents->Delete();
421
422 // Move CbmEvent from temporary vector to TClonesArray
423 for (auto event : fEventVector) {
424 LOG(debug) << "Vector: " << event->ToString();
425 new ((*fEvents)[fEvents->GetEntriesFast()]) CbmEvent(std::move(*event));
426 LOG(debug) << "TClonesArray: " << static_cast<CbmEvent*>(fEvents->At(fEvents->GetEntriesFast() - 1))->ToString();
427 }
428
429 // Clear event vector after usage
430 // Need to delete the object the pointer points to first
431 int counter = 0;
432 for (auto event : fEventVector) {
433 LOG(debug) << "Event " << counter << " has " << event->GetNofData() << " digis";
434 delete event;
435 counter++;
436 }
437
438 fEventVector.clear();
439}
440
442{
443 // Fill digi index into event
444 switch (_system) {
453 default: break;
454 }
455}
456
457template<class Digi>
459{
460 LOG(debug4) << "Entry: " << _entry;
461
462 Double_t time = -1.;
463
464 switch (_system) {
470 case ECbmModuleId::kPsd: {
471 const Digi* pDigi = fDigiMan->Get<Digi>(_entry);
472
474 if (nullptr != pDigi) {
475 time = pDigi->GetTime();
476 fSorter.emplace(make_pair(time, make_pair(_system, _entry)));
477 } // if( nullptr != pDigi )
478 break;
479 } // Digi containers controlled by DigiManager
480 case ECbmModuleId::kHodo: {
481 // CbmTofDigi * pDigi;
482 if (fBmonDigiVec) {
483 if (static_cast<UInt_t>(_entry) < fBmonDigiVec->size()) {
484 time = fBmonDigiVec->at(_entry).GetTime();
485 fSorter.emplace(make_pair(time, make_pair(_system, _entry)));
486 } // if( _entry < fBmonDigiVec->size() )
487 } // if ( fBmonDigiVec )
488 else if (fBmonDigiArr) {
489 if (_entry < fBmonDigiArr->GetEntriesFast()) {
490 time = dynamic_cast<CbmTofDigi*>(fBmonDigiArr->At(_entry))->GetTime();
491 fSorter.emplace(make_pair(time, make_pair(_system, _entry)));
492 } // if( _entry < fBmonDigiArr->GetEntriesFast() )
493 } // else if ( fBmonDigiArr )
494 else
495 return;
496 break;
497 } // case ECbmModuleId::kHodo
498 default: {
499 return;
500 break;
501 } // default:
502 } //? system
503}
504
505// ---- Finish --------------------------------------------------------
507{
508 if (fFillHistos) {
509 TFile* oldFile = gFile;
510 TDirectory* oldDir = gDirectory;
511
512 TFile* outfile = TFile::Open(fOutFileName, "RECREATE");
513
514 fDiffTime->Write();
515
516 fhEventTime->Write();
517 fhEventDt->Write();
518 fhEventSize->Write();
519 fhNbDigiPerEvtTime->Write();
520
521 fhNbDigiPerEvtTimeBmon->Write();
522 fhNbDigiPerEvtTimeSts->Write();
523 fhNbDigiPerEvtTimeMuch->Write();
524 fhNbDigiPerEvtTimeTrd->Write();
525 fhNbDigiPerEvtTimeTof->Write();
526 fhNbDigiPerEvtTimeRich->Write();
527 fhNbDigiPerEvtTimePsd->Write();
528
529 outfile->Close();
530 delete outfile;
531
532 gFile = oldFile;
533 gDirectory = oldDir;
534 }
535 LOG(info) << "Total errors: " << fErrors;
536}
537
538
ClassImp(CbmConverterManager)
ECbmModuleId
Definition CbmDefs.h:39
@ kMvd
Micro-Vertex Detector.
@ kHodo
Hodoscope (for test beam times)
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kMuch
Muon detection system.
@ kRich
Ring-Imaging Cherenkov Detector.
static Int_t GetNofDigis(ECbmModuleId systemId)
static Bool_t IsPresent(ECbmModuleId systemId)
Presence of a digi branch.
void UseMuchBeamTimeDigi(Bool_t)
Use CbmMuchBeamTimeDigi instead of CbmMuchDigi for MUCH.
InitStatus Init()
Initialisation.
const Digi * Get(Int_t index) const
Get a digi object.
static CbmDigiManager * Instance()
Static instance.
Class characterising one event by a collection of links (indices) to data objects,...
Definition CbmEvent.h:34
void AddData(ECbmDataType type, uint32_t index)
Definition CbmEvent.cxx:33
void SetEndTime(double endTime)
Definition CbmEvent.h:157
std::string ToString() const
Definition CbmEvent.cxx:101
Bool_t fFillHistos
histogram with the nb of PSD digis per event vs seed time of the events
std::multimap< Double_t, digituple > fSorter
array with pointers to input containers
TH1 * fhEventDt
histogram with the seed time of the events
Double_t fPrevTime
Timeslice Counter.
TH1 * fDiffTime
vector with all created events
TH2 * fhNbDigiPerEvtTime
histogram with the nb of all digis in the event
TClonesArray * fEvents
input container of TO digis
TH2 * fhNbDigiPerEvtTimeTrd
histogram with the nb of MUCH digis per event vs seed time of the events
std::vector< std::pair< ECbmModuleId, Int_t > > fVect
for digi sorting
TH1 * fhEventTime
histogram with the time difference between two consecutive digis
EventBuilderAlgo fEventBuilderAlgo
Switch ON/OFF filling of histograms.
TH2 * fhNbDigiPerEvtTimeMuch
histogram with the nb of STS digis per event vs seed time of the events
TH2 * fhNbDigiPerEvtTimeBmon
histogram with the nb of all digis per event vs seed time of the events
TH2 * fhNbDigiPerEvtTimeTof
histogram with the nb of TRD digis per event vs seed time of the events
TH1 * fhEventSize
histogram with the interval in seed time of consecutive events
std::vector< CbmEvent * > fEventVector
pointer to the event which is currently build
Bool_t fbUseBaseMuchDigi
Save previous time information.
TH2 * fhNbDigiPerEvtTimePsd
histogram with the nb of RICH digis per event vs seed time of the events
virtual void Exec(Option_t *)
TH2 * fhNbDigiPerEvtTimeRich
histogram with the nb of TOF digis per event vs seed time of the events
void AddDigiToEvent(ECbmModuleId, Int_t)
const std::vector< CbmTofDigi > * fBmonDigiVec
TH2 * fhNbDigiPerEvtTimeSts
histogram with the nb of Bmon digis per event vs seed time of the events
void AddDigiToSorter(ECbmModuleId, Int_t)
Data class for expanded digital TOF information.
Definition CbmTofDigi.h:47
double GetTime() const
Inherited from CbmDigi.
Definition CbmTofDigi.h:131