CbmRoot
Loading...
Searching...
No Matches
CbmTaskBuildEvents.cxx
Go to the documentation of this file.
1/* Copyright (C) 2021 GSI Helmholtzzentrum fuer Schwerionenforschung, Darmstadt
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Volker Friese [committer] */
4
6
7#include "CbmDigiBranchBase.h"
8#include "CbmDigiManager.h"
9#include "CbmDigiTimeslice.h"
10#include "CbmMvdDigi.h"
11
12#include <FairRootManager.h>
13#include <Logger.h>
14
15#include <TStopwatch.h>
16
17#include <cassert>
18#include <iomanip>
19
20using namespace std;
21
22// ----- Constructor -----------------------------------------------------
23CbmTaskBuildEvents::CbmTaskBuildEvents() : FairTask("BuildEvents") {}
24// ---------------------------------------------------------------------------
25
26
27// ----- Destructor ------------------------------------------------------
32// ---------------------------------------------------------------------------
33
34
35// ------ Construct a DigiTimeslice from the data in CbmDigiManager ----------
37{
39 for (const auto& entry : fConfig->fWindows) {
40 auto system = entry.first;
41 CbmDigiBranchBase* digiBranch = fDigiMan->GetBranch(system);
42 if (digiBranch == nullptr) continue;
43 switch (system) {
44 // MVD is (temporarily) special, since there are two digi classes (CbmMvdRawDigi in CbmDigiTimeslice
45 // and CbmMvdDigi in the MVD branch of the ROOT tree), which have to be converted.
46 case ECbmModuleId::kMvd: {
47 const vector<CbmMvdDigi>* digiVec =
48 boost::any_cast<const vector<CbmMvdDigi>*>(digiBranch->GetBranchContainer());
49 assert(digiVec);
50 for (auto& mvdDigi : *(digiVec)) {
51 ts.fData.fMvd.fDigis.push_back(CbmMvdDigi::ConvertToRawDigi(mvdDigi));
52 }
53 break;
54 }
55 case ECbmModuleId::kSts: {
56 const vector<CbmStsDigi>* digiVec =
57 boost::any_cast<const vector<CbmStsDigi>*>(digiBranch->GetBranchContainer());
58 assert(digiVec);
59 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fSts.fDigis));
60 break;
61 }
63 const vector<CbmRichDigi>* digiVec =
64 boost::any_cast<const vector<CbmRichDigi>*>(digiBranch->GetBranchContainer());
65 assert(digiVec);
66 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fRich.fDigis));
67 break;
68 }
70 const vector<CbmMuchDigi>* digiVec =
71 boost::any_cast<const vector<CbmMuchDigi>*>(digiBranch->GetBranchContainer());
72 assert(digiVec);
73 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fMuch.fDigis));
74 break;
75 }
76 case ECbmModuleId::kTrd: {
77 const vector<CbmTrdDigi>* digiVec =
78 boost::any_cast<const vector<CbmTrdDigi>*>(digiBranch->GetBranchContainer());
79 assert(digiVec);
80 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fTrd.fDigis));
81 break;
82 }
84 const vector<CbmTrdDigi>* digiVec =
85 boost::any_cast<const vector<CbmTrdDigi>*>(digiBranch->GetBranchContainer());
86 assert(digiVec);
87 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fTrd2d.fDigis));
88 break;
89 }
90 case ECbmModuleId::kTof: {
91 const vector<CbmTofDigi>* digiVec =
92 boost::any_cast<const vector<CbmTofDigi>*>(digiBranch->GetBranchContainer());
93 assert(digiVec);
94 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fTof.fDigis));
95 break;
96 }
97 case ECbmModuleId::kFsd: {
98 const vector<CbmFsdDigi>* digiVec =
99 boost::any_cast<const vector<CbmFsdDigi>*>(digiBranch->GetBranchContainer());
100 assert(digiVec);
101 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fFsd.fDigis));
102 break;
103 }
104 case ECbmModuleId::kPsd: {
105 const vector<CbmPsdDigi>* digiVec =
106 boost::any_cast<const vector<CbmPsdDigi>*>(digiBranch->GetBranchContainer());
107 assert(digiVec);
108 ts.fData.fPsd.fDigis = *digiVec;
109 break;
110 }
111 case ECbmModuleId::kBmon: { //Bmon has Tof digis
112 const vector<CbmBmonDigi>* digiVec =
113 boost::any_cast<const vector<CbmBmonDigi>*>(digiBranch->GetBranchContainer());
114 assert(digiVec);
115 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.fData.fTof.fDigis));
116 break;
117 }
118 default: LOG(fatal) << GetName() << ": Unknown detector type!";
119 }
120 }
121 return ts;
122}
123// ---------------------------------------------------------------------------
124
125
126// ----- Execution -------------------------------------------------------
128{
129
130 // --- Timer and counters
131 TStopwatch timerStep;
132 TStopwatch timerTot;
133 timerTot.Start();
134 std::map<ECbmModuleId, size_t> numDigisTs;
135 std::map<ECbmModuleId, size_t> numDigisEv;
136
137 // --- Clear output vector
138 fEvents->clear();
139
140 // --- If the input is already CbmDigiTimeslice (from unpacking), use that directly
141 if (fTimeslice) {
142 timerStep.Start();
144 (*fAlgo)(cbm::algo::DigiData(fTimeslice->fData), *fTriggers, std::nullopt).first);
145 timerStep.Stop();
146 fTimeBuildEvt += timerStep.RealTime();
147 for (const auto& entry : fConfig->fWindows)
148 numDigisTs[entry.first] = GetNumDigis(fTimeslice->fData, entry.first);
149 }
150
151 // --- If input is not DigiTimeslice: construct a transientDigiTimeslice from the data in CbmDigiManager
152 else {
153 timerStep.Start();
155 for (const auto& entry : fConfig->fWindows)
156 numDigisTs[entry.first] = ts.fData.Size(entry.first);
157 timerStep.Stop();
158 fTimeFillTs += timerStep.RealTime();
159 timerStep.Start();
160 *fEvents =
162 timerStep.Stop();
163 fTimeBuildEvt += timerStep.RealTime();
164 }
165
166 // Apply event selector if desired
167 if (fSelector) {
168 timerStep.Start();
169 auto noTrigger = [&](CbmDigiEvent& ev) { return !(*fSelector)(cbm::algo::DigiEvent(ev)); };
170 auto removeIt = std::remove_if(fEvents->begin(), fEvents->end(), noTrigger);
171 fEvents->erase(removeIt, fEvents->end());
172 timerStep.Stop();
173 fTimeSelectorEvt += timerStep.RealTime();
174 }
175
176 // --- Timeslice statistics
177 size_t numTriggers = fTriggers->size();
178 size_t numEvents = fEvents->size();
179 for (const auto& entry : fConfig->fWindows) {
180 for (auto& event : (*fEvents)) {
181 numDigisEv[entry.first] += GetNumDigis(event.fData, entry.first);
182 }
183 }
184
185 // --- Timeslice log
186 timerTot.Stop();
187 fTimeTot += timerTot.RealTime();
188 stringstream logOut;
189 logOut << setw(15) << left << GetName() << " [";
190 logOut << fixed << setw(8) << setprecision(1) << right << timerTot.RealTime() * 1000. << " ms] ";
191 logOut << "TS " << fNumTs << ", triggers " << numTriggers << ", events " << numEvents;
192
193 for (const auto& entry : fConfig->fWindows) {
194 auto system = entry.first;
195 logOut << ", frac " << system << " digis " << 100. * double(numDigisEv[system]) / double(numDigisTs[system])
196 << " %";
197 }
198
199 LOG(info) << logOut.str();
200
201 // --- Run statistics
202 fNumTs++;
203 fNumTriggers += numTriggers;
204 fNumEvents += numEvents;
205
206 for (const auto& entry : fConfig->fWindows) {
207 auto system = entry.first;
208 fNumDigisTs[system] += numDigisTs[system];
209 fNumDigisEv[system] += numDigisEv[system];
210 }
211}
212// ----------------------------------------------------------------------------
213
214
215// ----- End-of-timeslice action ------------------------------------------
217{
218 LOG(info) << "=====================================";
219 LOG(info) << GetName() << ": Run summary";
220 LOG(info) << "Timeslices : " << fNumTs;
221 LOG(info) << "Triggers : " << fNumTriggers;
222 LOG(info) << "Events : " << fNumEvents;
223 for (const auto& entry : fConfig->fWindows) {
224 auto system = entry.first;
225 LOG(info) << setw(4) << left << system << " digis in TS : " << fNumDigisTs[system];
226 LOG(info) << setw(4) << left << system << " digis in events : " << fNumDigisEv[system] << " = " << fixed
227 << setprecision(2) << 100. * double(fNumDigisEv[system]) / double(fNumDigisTs[system]) << " %";
228 }
229 LOG(info) << "Time / TS : " << fixed << setprecision(2) << 1000. * fTimeTot / double(fNumTs) << " ms";
230 LOG(info) << "Time fill TS : " << fixed << setprecision(2) << 1000. * fTimeFillTs / double(fNumTs)
231 << " ms = " << 100. * fTimeFillTs / fTimeTot << " %";
232 LOG(info) << "Time build events : " << fixed << setprecision(2) << 1000. * fTimeBuildEvt / double(fNumTs)
233 << " ms = " << 100. * fTimeBuildEvt / fTimeTot << " %";
234 LOG(info) << "Time selector events : " << fixed << setprecision(2) << 1000. * fTimeSelectorEvt / double(fNumTs)
235 << " ms = " << 100. * fTimeSelectorEvt / fTimeTot << " %";
236 LOG(info) << "=====================================";
237}
238// ----------------------------------------------------------------------------
239
240
241// ----- Number of digis in the timeslice ----------------------------------
243{
244 size_t result = 0;
245 switch (system) {
246 case ECbmModuleId::kSts: result = data.fSts.fDigis.size(); break;
247 case ECbmModuleId::kRich: result = data.fRich.fDigis.size(); break;
248 case ECbmModuleId::kMuch: result = data.fMuch.fDigis.size(); break;
249 case ECbmModuleId::kTrd: result = data.fTrd.fDigis.size(); break;
250 case ECbmModuleId::kTrd2d: result = data.fTrd2d.fDigis.size(); break;
251 case ECbmModuleId::kTof: result = data.fTof.fDigis.size(); break;
252 case ECbmModuleId::kPsd: result = data.fPsd.fDigis.size(); break;
253 case ECbmModuleId::kBmon: result = data.fBmon.fDigis.size(); break;
254 default: result = 0; break;
255 }
256 return result;
257}
258// ----------------------------------------------------------------------------
259
260
261// ----- Initialisation ---------------------------------------------------
263{
264 // --- Get FairRootManager instance
265 FairRootManager* ioman = FairRootManager::Instance();
266 assert(ioman);
267
268 LOG(info) << "==================================================";
269 LOG(info) << GetName() << ": Initialising...";
270
271 // --- Check input data
272 // --- DigiTimeslice: Unpacked data from FLES
273 fTimeslice = ioman->InitObjectAs<const CbmDigiTimeslice*>("DigiTimeslice.");
274 if (fTimeslice) {
275 LOG(info) << "--- Found branch DigiTimeslice.";
276 }
277 // --- DigiManager: Simulated digi data
278 else {
280 fDigiMan->Init();
281 for (const auto& entry : fConfig->fWindows) {
282 auto system = entry.first;
283 if (!fDigiMan->IsPresent(system)) {
284 LOG(warn) << GetName() << ": No digi branch for " << system;
285 }
286 LOG(info) << "--- Found digi branch for " << system;
287 }
288 }
289
290 // --- Initialize diagnostics
291 for (const auto& entry : fConfig->fWindows) {
292 auto system = entry.first;
293 fNumDigisTs[system] = 0;
294 fNumDigisEv[system] = 0;
295 }
296
297 // --- Get input data (triggers)
298 fTriggers = ioman->InitObjectAs<std::vector<double> const*>("Trigger");
299 if (!fTriggers) {
300 LOG(fatal) << GetName() << ": No Trigger branch!" << endl;
301 return kFATAL;
302 }
303 LOG(info) << "--- Found branch Trigger";
304
305 // --- Register output array (CbmDigiEvent)
306 if (ioman->GetObject("DigiEvent")) {
307 LOG(fatal) << GetName() << ": Branch DigiEvent already exists!";
308 return kFATAL;
309 }
310 fEvents = new vector<CbmDigiEvent>;
311 ioman->RegisterAny("DigiEvent", fEvents, IsOutputBranchPersistent("DigiEvent"));
312 if (!fEvents) {
313 LOG(fatal) << GetName() << ": Output branch could not be created!";
314 return kFATAL;
315 }
316 LOG(info) << "--- Registered branch DigiEvent";
317
318 // --- Configure algorithm
320 LOG(info) << fAlgo->ToString();
321
322 // --- Log selector
323 if (fSelector)
324 LOG(info) << fSelector->ToString();
325 else
326 LOG(info) << "--- No event selection";
327
328 LOG(info) << "==================================================";
329
330 return kSUCCESS;
331}
332// ----------------------------------------------------------------------------
333
ClassImp(CbmConverterManager)
ECbmModuleId
Enumerator for module Identifiers.
Definition CbmDefs.h:45
@ kMvd
Micro-Vertex Detector.
Definition CbmDefs.h:47
@ kTrd
Transition Radiation Detector.
Definition CbmDefs.h:51
@ kTof
Time-of-flight Detector.
Definition CbmDefs.h:52
@ kPsd
Projectile spectator detector.
Definition CbmDefs.h:54
@ kSts
Silicon Tracking System.
Definition CbmDefs.h:48
@ kTrd2d
TRD-FASP Detector (FIXME)
Definition CbmDefs.h:58
@ kMuch
Muon detection system.
Definition CbmDefs.h:50
@ kFsd
Forward spectator detector.
Definition CbmDefs.h:59
@ kBmon
Bmon Counter.
Definition CbmDefs.h:57
@ kRich
Ring-Imaging Cherenkov Detector.
Definition CbmDefs.h:49
std::vector< CbmBmonDigi > fDigis
Data vector.
Abstract base class for CBM digi branches.
virtual boost::any GetBranchContainer() const
Get branch pointer.
Collection of digis from all detector systems.
Definition CbmDigiData.h:33
CbmPsdDigiData fPsd
PSD data.
Definition CbmDigiData.h:44
CbmTrdDigiData fTrd2d
TRD2D data.
Definition CbmDigiData.h:42
CbmTrdDigiData fTrd
TRD data.
Definition CbmDigiData.h:41
CbmTofDigiData fTof
TOF data.
Definition CbmDigiData.h:43
CbmMvdDigiData fMvd
MVD data.
Definition CbmDigiData.h:39
CbmStsDigiData fSts
STS data.
Definition CbmDigiData.h:37
CbmFsdDigiData fFsd
FSD data.
Definition CbmDigiData.h:45
size_t Size(ECbmModuleId system) const
Size of detector data.
Definition CbmDigiData.h:86
CbmRichDigiData fRich
RICH data.
Definition CbmDigiData.h:40
CbmMuchDigiData fMuch
MUCH data.
Definition CbmDigiData.h:38
CbmBmonDigiData fBmon
Beam monitor data.
Definition CbmDigiData.h:36
Collection of digis from all detector systems within one event.
static CbmDigiManager * Instance()
Static instance.
Collection of digis from all detector systems within one timeslice.
CbmDigiData fData
Timeslice data.
std::vector< CbmFsdDigi > fDigis
Data vector.
std::vector< CbmMuchDigi > fDigis
Data vector.
std::vector< CbmMvdRawDigi > fDigis
Data vector.
static CbmMvdRawDigi ConvertToRawDigi(const CbmMvdDigi &rhs)
std::vector< CbmPsdDigi > fDigis
Data vector.
std::vector< CbmRichDigi > fDigis
Data vector.
std::vector< CbmStsDigi > fDigis
Data vector.
Task class for associating digis to events.
std::map< ECbmModuleId, size_t > fNumDigisTs
Event builder configuration.
virtual InitStatus Init()
Task initialisation.
const CbmDigiTimeslice * fTimeslice
CbmDigiTimeslice FillTimeSlice()
Construct a DigiTimeslice from the data in CbmDigiManager.
CbmTaskBuildEvents()
Constructor.
std::unique_ptr< cbm::algo::evbuild::EventBuilder > fAlgo
Event selector.
size_t GetNumDigis(const CbmDigiData &data, ECbmModuleId system)
Number of digis for a given system.
virtual ~CbmTaskBuildEvents()
Destructor.
const std::vector< double > * fTriggers
Input data (from simulation)
std::map< ECbmModuleId, size_t > fNumDigisEv
std::vector< CbmDigiEvent > * fEvents
Input data (triggers)
virtual void Finish()
Finish timeslice.
std::unique_ptr< cbm::algo::evbuild::DigiEventSelector > fSelector
Output data (events)
virtual void Exec(Option_t *opt)
Task execution.
CbmDigiManager * fDigiMan
Input data (from unpacking)
std::unique_ptr< cbm::algo::evbuild::EventBuilderConfig > fConfig
Algorithm.
std::vector< CbmTofDigi > fDigis
Data vector.
std::vector< CbmTrdDigi > fDigis
Data vector.
Constructs CbmDigiEvents out of CbmDigiTimeslices.
Hash for CbmL1LinkKey.
Collection of digis from all detector systems.
Definition DigiData.h:33
static std::vector< CbmDigiEvent > ToCbmDigiEvents(const std::vector< DigiEvent > &events)
Definition DigiData.cxx:116