12#include <FairRootManager.h>
15#include <TStopwatch.h>
39 for (
const auto& entry :
fConfig->fWindows) {
40 auto system = entry.first;
42 if (digiBranch ==
nullptr)
continue;
47 const vector<CbmMvdDigi>* digiVec =
50 for (
auto& mvdDigi : *(digiVec)) {
56 const vector<CbmStsDigi>* digiVec =
59 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fSts.
fDigis));
63 const vector<CbmRichDigi>* digiVec =
66 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fRich.
fDigis));
70 const vector<CbmMuchDigi>* digiVec =
73 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fMuch.
fDigis));
77 const vector<CbmTrdDigi>* digiVec =
80 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fTrd.
fDigis));
84 const vector<CbmTrdDigi>* digiVec =
87 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fTrd2d.
fDigis));
91 const vector<CbmTofDigi>* digiVec =
94 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fTof.
fDigis));
98 const vector<CbmFsdDigi>* digiVec =
101 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fFsd.
fDigis));
105 const vector<CbmPsdDigi>* digiVec =
112 const vector<CbmBmonDigi>* digiVec =
115 std::copy(digiVec->begin(), digiVec->end(), std::back_inserter(ts.
fData.
fTof.
fDigis));
118 default: LOG(fatal) << GetName() <<
": Unknown detector type!";
131 TStopwatch timerStep;
134 std::map<ECbmModuleId, size_t> numDigisTs;
135 std::map<ECbmModuleId, size_t> numDigisEv;
147 for (
const auto& entry :
fConfig->fWindows)
155 for (
const auto& entry :
fConfig->fWindows)
156 numDigisTs[entry.first] = ts.
fData.
Size(entry.first);
170 auto removeIt = std::remove_if(
fEvents->begin(),
fEvents->end(), noTrigger);
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);
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;
193 for (
const auto& entry :
fConfig->fWindows) {
194 auto system = entry.first;
195 logOut <<
", frac " << system <<
" digis " << 100. * double(numDigisEv[system]) / double(numDigisTs[system])
199 LOG(info) << logOut.str();
206 for (
const auto& entry :
fConfig->fWindows) {
207 auto system = entry.first;
218 LOG(info) <<
"=====================================";
219 LOG(info) << GetName() <<
": Run summary";
220 LOG(info) <<
"Timeslices : " <<
fNumTs;
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
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)
232 LOG(info) <<
"Time build events : " << fixed << setprecision(2) << 1000. *
fTimeBuildEvt / double(
fNumTs)
234 LOG(info) <<
"Time selector events : " << fixed << setprecision(2) << 1000. *
fTimeSelectorEvt / double(
fNumTs)
236 LOG(info) <<
"=====================================";
254 default: result = 0;
break;
265 FairRootManager* ioman = FairRootManager::Instance();
268 LOG(info) <<
"==================================================";
269 LOG(info) << GetName() <<
": Initialising...";
275 LOG(info) <<
"--- Found branch DigiTimeslice.";
281 for (
const auto& entry :
fConfig->fWindows) {
282 auto system = entry.first;
284 LOG(warn) << GetName() <<
": No digi branch for " << system;
286 LOG(info) <<
"--- Found digi branch for " << system;
291 for (
const auto& entry :
fConfig->fWindows) {
292 auto system = entry.first;
298 fTriggers = ioman->InitObjectAs<std::vector<double>
const*>(
"Trigger");
300 LOG(fatal) << GetName() <<
": No Trigger branch!" << endl;
303 LOG(info) <<
"--- Found branch Trigger";
306 if (ioman->GetObject(
"DigiEvent")) {
307 LOG(fatal) << GetName() <<
": Branch DigiEvent already exists!";
310 fEvents =
new vector<CbmDigiEvent>;
311 ioman->RegisterAny(
"DigiEvent",
fEvents, IsOutputBranchPersistent(
"DigiEvent"));
313 LOG(fatal) << GetName() <<
": Output branch could not be created!";
316 LOG(info) <<
"--- Registered branch DigiEvent";
320 LOG(info) <<
fAlgo->ToString();
326 LOG(info) <<
"--- No event selection";
328 LOG(info) <<
"==================================================";
ClassImp(CbmConverterManager)
ECbmModuleId
Enumerator for module Identifiers.
@ kMvd
Micro-Vertex Detector.
@ kTrd
Transition Radiation Detector.
@ kTof
Time-of-flight Detector.
@ kPsd
Projectile spectator detector.
@ kSts
Silicon Tracking System.
@ kTrd2d
TRD-FASP Detector (FIXME)
@ kMuch
Muon detection system.
@ kFsd
Forward spectator detector.
@ kRich
Ring-Imaging Cherenkov Detector.
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.
CbmPsdDigiData fPsd
PSD data.
CbmTrdDigiData fTrd2d
TRD2D data.
CbmTrdDigiData fTrd
TRD data.
CbmTofDigiData fTof
TOF data.
CbmMvdDigiData fMvd
MVD data.
CbmStsDigiData fSts
STS data.
CbmFsdDigiData fFsd
FSD data.
size_t Size(ECbmModuleId system) const
Size of detector data.
CbmRichDigiData fRich
RICH data.
CbmMuchDigiData fMuch
MUCH data.
CbmBmonDigiData fBmon
Beam monitor data.
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.
Collection of digis from all detector systems.
static std::vector< CbmDigiEvent > ToCbmDigiEvents(const std::vector< DigiEvent > &events)