diff --git a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx index 79c9f59fcb8cc7509203082dddbcb19fab7aecfc..7a1eb026551ead4fc9e3a907bb562fd03c412f5e 100644 --- a/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx +++ b/MQ/mcbm/CbmDeviceBuildDigiEvents.cxx @@ -279,12 +279,12 @@ try { /// Digis storage fpAlgo->SetT0Digis(fvDigiT0); - fpAlgo->SetStsDigis(fvDigiSts); - fpAlgo->SetMuchDigis(fvDigiMuch); - fpAlgo->SetTrdDigis(fvDigiTrd); - fpAlgo->SetTofDigis(fvDigiTof); - fpAlgo->SetRichDigis(fvDigiRich); - fpAlgo->SetPsdDigis(fvDigiPsd); + fpAlgo->SetDigis(fvDigiSts); + fpAlgo->SetDigis(fvDigiMuch); + fpAlgo->SetDigis(fvDigiTrd); + fpAlgo->SetDigis(fvDigiTof); + fpAlgo->SetDigis(fvDigiRich); + fpAlgo->SetDigis(fvDigiPsd); // Mvd currently not implemented in event builder //std::vector<CbmMvdDigi>* pMvdDigi = new std::vector<CbmMvdDigi>(); diff --git a/MQ/mcbm/CbmDeviceBuildRawEvents.cxx b/MQ/mcbm/CbmDeviceBuildRawEvents.cxx index 993be7537a90c3d708bb6b6cbfd20c761a633178..e4fccbfee340fa20a9c0f9d430c554dbc814511d 100644 --- a/MQ/mcbm/CbmDeviceBuildRawEvents.cxx +++ b/MQ/mcbm/CbmDeviceBuildRawEvents.cxx @@ -282,12 +282,12 @@ try { /// Digis storage fpAlgo->SetT0Digis(fvDigiT0); - fpAlgo->SetStsDigis(fvDigiSts); - fpAlgo->SetMuchBeamTimeDigis(fvDigiMuch); - fpAlgo->SetTrdDigis(fvDigiTrd); - fpAlgo->SetTofDigis(fvDigiTof); - fpAlgo->SetRichDigis(fvDigiRich); - fpAlgo->SetPsdDigis(fvDigiPsd); + fpAlgo->SetDigis(fvDigiSts); + fpAlgo->SetDigis(fvDigiMuch); + fpAlgo->SetDigis(fvDigiTrd); + fpAlgo->SetDigis(fvDigiTof); + fpAlgo->SetDigis(fvDigiRich); + fpAlgo->SetDigis(fvDigiPsd); // Mvd currently not implemented in event builder //std::vector<CbmMvdDigi>* pMvdDigi = new std::vector<CbmMvdDigi>(); diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h index fda3e2835c62413fb1ddb9fd9cc792252619f06f..a4cd0b5099807c96924bc92abbcd39042a8618e2 100644 --- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h @@ -184,16 +184,13 @@ public: /// Set digi containers void SetT0Digis(const std::vector<CbmTofDigi>* T0DigiVec) { fT0DigiVec = T0DigiVec; } - void SetStsDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; } - void SetMuchDigis(std::vector<CbmMuchDigi>* MuchDigis) { fMuchDigis = MuchDigis; } - void SetTrdDigis(std::vector<CbmTrdDigi>* TrdDigis) { fTrdDigis = TrdDigis; } - void SetTofDigis(std::vector<CbmTofDigi>* TofDigis) { fTofDigis = TofDigis; } - void SetRichDigis(std::vector<CbmRichDigi>* RichDigis) { fRichDigis = RichDigis; } - void SetPsdDigis(std::vector<CbmPsdDigi>* PsdDigis) { fPsdDigis = PsdDigis; } - void SetMuchBeamTimeDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis) - { - fMuchBeamTimeDigis = MuchBeamTimeDigis; - } + void SetDigis(std::vector<CbmStsDigi>* StsDigis) { fStsDigis = StsDigis; } + void SetDigis(std::vector<CbmMuchDigi>* MuchDigis) { fMuchDigis = MuchDigis; } + void SetDigis(std::vector<CbmTrdDigi>* TrdDigis) { fTrdDigis = TrdDigis; } + void SetDigis(std::vector<CbmTofDigi>* TofDigis) { fTofDigis = TofDigis; } + void SetDigis(std::vector<CbmRichDigi>* RichDigis) { fRichDigis = RichDigis; } + void SetDigis(std::vector<CbmPsdDigi>* PsdDigis) { fPsdDigis = PsdDigis; } + void SetDigis(std::vector<CbmMuchBeamTimeDigi>* MuchBeamTimeDigis) { fMuchBeamTimeDigis = MuchBeamTimeDigis; } void SetSeedTimes(std::vector<Double_t>* SeedTimes) { fSeedTimes = SeedTimes; } diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx index fbbced420d682de1d2bfaab622fa19bf02783d02..28a6cf3d795b25bfa59188625bc1a0fd917cca0d 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx @@ -7,6 +7,7 @@ #include "CbmDigiManager.h" #include "CbmEvent.h" #include "CbmMatch.h" +#include "CbmModuleList.h" #include "CbmSeedFinderSlidingWindow.h" #include <FairLogger.h> @@ -83,6 +84,18 @@ void CbmTaskBuildRawEvents::SetSeedFinderQa(Bool_t bFlagIn) if (fSeedFinderSlidingWindow != nullptr) fSeedFinderSlidingWindow->SetQa(bFlagIn); } +template<class TDigi> +void CbmTaskBuildRawEvents::InitDigis(ECbmModuleId detId, std::vector<TDigi>** vDigi) +{ + TString detName = CbmModuleList::GetModuleNameCaps(detId); + if (!fDigiMan->IsPresent(detId)) { LOG(info) << "No " << detName << " digi input."; } + else { + LOG(info) << detName << " digi input."; + *vDigi = new std::vector<TDigi>; + fpAlgo->SetDigis(*vDigi); + } +} + InitStatus CbmTaskBuildRawEvents::Init() { if (fbGetTimings) { @@ -108,59 +121,16 @@ InitStatus CbmTaskBuildRawEvents::Init() if (fbUseMuchBeamtimeDigi) { fDigiMan->UseMuchBeamTimeDigi(); } fDigiMan->Init(); - //Init STS digis - if (!fDigiMan->IsPresent(ECbmModuleId::kSts)) { LOG(info) << "No STS digi input."; } - else { - LOG(info) << "STS digi input."; - fStsDigis = new std::vector<CbmStsDigi>; - fpAlgo->SetStsDigis(fStsDigis); - } - - //Init MUCH digis - if (!fDigiMan->IsPresent(ECbmModuleId::kMuch)) { LOG(info) << "No MUCH digi input."; } - else { - LOG(info) << "MUCH digi input."; - if (fbUseMuchBeamtimeDigi) { - fMuchBeamTimeDigis = new std::vector<CbmMuchBeamTimeDigi>; - fpAlgo->SetMuchBeamTimeDigis(fMuchBeamTimeDigis); - } - else { - fMuchDigis = new std::vector<CbmMuchDigi>; - fpAlgo->SetMuchDigis(fMuchDigis); - } - } - - //Init TRD digis - if (!fDigiMan->IsPresent(ECbmModuleId::kTrd)) { LOG(info) << "No TRD digi input."; } - else { - LOG(info) << "TRD digi input."; - fTrdDigis = new std::vector<CbmTrdDigi>; - fpAlgo->SetTrdDigis(fTrdDigis); - } - - //Init TOF digis - if (!fDigiMan->IsPresent(ECbmModuleId::kTof)) { LOG(info) << "No TOF digi input."; } - else { - LOG(info) << "TOF digi input."; - fTofDigis = new std::vector<CbmTofDigi>; - fpAlgo->SetTofDigis(fTofDigis); - } - - //Init RICH digis - if (!fDigiMan->IsPresent(ECbmModuleId::kRich)) { LOG(info) << "No RICH digi input."; } - else { - LOG(info) << "RICH digi input."; - fRichDigis = new std::vector<CbmRichDigi>; - fpAlgo->SetRichDigis(fRichDigis); - } - - //Init PSD digis - if (!fDigiMan->IsPresent(ECbmModuleId::kPsd)) { LOG(info) << "No PSD digi input."; } + //Init digis + if (fbUseMuchBeamtimeDigi) { InitDigis(ECbmModuleId::kMuch, &fMuchBeamTimeDigis); } else { - LOG(info) << "PSD digi input."; - fPsdDigis = new std::vector<CbmPsdDigi>; - fpAlgo->SetPsdDigis(fPsdDigis); + InitDigis(ECbmModuleId::kMuch, &fMuchDigis); } + InitDigis(ECbmModuleId::kSts, &fStsDigis); + InitDigis(ECbmModuleId::kTrd, &fTrdDigis); + InitDigis(ECbmModuleId::kTof, &fTofDigis); + InitDigis(ECbmModuleId::kRich, &fRichDigis); + InitDigis(ECbmModuleId::kPsd, &fPsdDigis); /// Register output array (CbmEvent) fEvents = new TClonesArray("CbmEvent", 100); @@ -188,115 +158,40 @@ InitStatus CbmTaskBuildRawEvents::Init() InitStatus CbmTaskBuildRawEvents::ReInit() { return kSUCCESS; } -void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) +template<class TDigi> +void CbmTaskBuildRawEvents::ReadDigis(ECbmModuleId detId, std::vector<TDigi>* vDigis) { - if (fTimer != nullptr) { fTimer->Start(kFALSE); } - TStopwatch timer; - timer.Start(); - - LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence"; //Warning: Int_t must be used for the loop counters instead of UInt_t, //as the digi manager can return -1, which would be casted to +1 //during comparison, leading to an error. - - //Reset explicit seed times if set - if (fSeedTimes != nullptr) { fSeedTimes->clear(); } - if (fCopyTimer != nullptr) { fCopyTimer->Start(kFALSE); } - //Read STS digis - if (fDigiMan->IsPresent(ECbmModuleId::kSts)) { - fStsDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kSts); i++) { - const CbmStsDigi* Digi = fDigiMan->Get<CbmStsDigi>(i); - fStsDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fStsDigis->size() << " STS digis."; - LOG(debug) << "In DigiManager: " << fDigiMan->GetNofDigis(ECbmModuleId::kSts) << " STS digis."; - } - - //Read MUCH digis - if (fDigiMan->IsPresent(ECbmModuleId::kMuch)) { - if (fbUseMuchBeamtimeDigi) { - fMuchBeamTimeDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) { - const CbmMuchBeamTimeDigi* Digi = fDigiMan->Get<CbmMuchBeamTimeDigi>(i); - fMuchBeamTimeDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis."; - LOG(debug) << "In DigiManager: " << fMuchBeamTimeDigis->size() << " MUCH digis."; - } - else { - fMuchDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kMuch); i++) { - const CbmMuchDigi* Digi = fDigiMan->Get<CbmMuchDigi>(i); - fMuchDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kMuch) << " MUCH digis."; - LOG(debug) << "In DigiManager: " << fMuchDigis->size() << " MUCH digis."; - } - } - - //Read TRD digis - if (fDigiMan->IsPresent(ECbmModuleId::kTrd)) { - fTrdDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTrd); i++) { - const CbmTrdDigi* Digi = fDigiMan->Get<CbmTrdDigi>(i); - fTrdDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTrd) << " TRD digis."; - LOG(debug) << "In DigiManager: " << fTrdDigis->size() << " TRD digis."; - } - - //Read TOF digis - if (fDigiMan->IsPresent(ECbmModuleId::kTof)) { - fTofDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kTof); i++) { - const CbmTofDigi* Digi = fDigiMan->Get<CbmTofDigi>(i); - fTofDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kTof) << " TOF digis."; - LOG(debug) << "In DigiManager: " << fTofDigis->size() << " TOF digis."; - } + const TString detName = CbmModuleList::GetModuleNameCaps(detId); - //Read RICH digis - if (fDigiMan->IsPresent(ECbmModuleId::kRich)) { - fRichDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kRich); i++) { - const CbmRichDigi* Digi = fDigiMan->Get<CbmRichDigi>(i); - fRichDigis->push_back(*Digi); - } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kRich) << " RICH digis."; - LOG(debug) << "In DigiManager: " << fRichDigis->size() << " RICH digis."; - } + if (fDigiMan->IsPresent(detId)) { + vDigis->clear(); + const Int_t nDigis = fDigiMan->GetNofDigis(detId); - //Read PSD digis - if (fDigiMan->IsPresent(ECbmModuleId::kPsd)) { - fPsdDigis->clear(); - for (Int_t i = 0; i < fDigiMan->GetNofDigis(ECbmModuleId::kPsd); i++) { - const CbmPsdDigi* Digi = fDigiMan->Get<CbmPsdDigi>(i); - fPsdDigis->push_back(*Digi); + for (Int_t i = 0; i < nDigis; i++) { + const TDigi* Digi = fDigiMan->Get<TDigi>(i); + vDigis->push_back(*Digi); } - LOG(debug) << "Read: " << fDigiMan->GetNofDigis(ECbmModuleId::kPsd) << " PSD digis."; - LOG(debug) << "In DigiManager: " << fPsdDigis->size() << " PSD digis."; + LOG(debug) << "Read: " << vDigis->size() << " " << detName << " digis."; + LOG(debug) << "In DigiManager: " << nDigis << " " << detName << " digis."; } if (fCopyTimer != nullptr) { fCopyTimer->Stop(); } +} - if (fSeedFinderSlidingWindow != nullptr) { FillSeedTimesFromSlidingWindow(); } - else if (fSeedTimeDetList.size() > 0) { - FillSeedTimesFromDetList(fSeedTimes); - } - - //DumpSeedTimesFromDetList(); - - /// Call Algo ProcessTs method - fpAlgo->ProcessTs(); - - /// Save the resulting vector of events in TClonesArray - FillOutput(); - LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done"; +void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) +{ + if (fTimer != nullptr) { fTimer->Start(kFALSE); } + TStopwatch timer; + timer.Start(); + LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Starting sequence"; + // Process Timeslice + BuildEvents(); if (fTimer != nullptr) { fTimer->Stop(); } // --- Timeslice log and statistics @@ -315,6 +210,38 @@ void CbmTaskBuildRawEvents::Exec(Option_t* /*option*/) fNofTs++; fNofEvents += fEvents->GetEntriesFast(); fTime += timer.RealTime(); + + LOG(debug2) << "CbmTaskBuildRawEvents::Exec => Done"; +} + +void CbmTaskBuildRawEvents::BuildEvents() +{ + //Reset explicit seed times if set + if (fSeedTimes != nullptr) { fSeedTimes->clear(); } + + //Read digis + if (fbUseMuchBeamtimeDigi) { ReadDigis(ECbmModuleId::kMuch, fMuchBeamTimeDigis); } + else { + ReadDigis(ECbmModuleId::kMuch, fMuchDigis); + } + ReadDigis(ECbmModuleId::kSts, fStsDigis); + ReadDigis(ECbmModuleId::kTrd, fTrdDigis); + ReadDigis(ECbmModuleId::kTof, fTofDigis); + ReadDigis(ECbmModuleId::kRich, fRichDigis); + ReadDigis(ECbmModuleId::kPsd, fPsdDigis); + + //Fill seeds + if (fSeedFinderSlidingWindow != nullptr) { FillSeedTimesFromSlidingWindow(); } + else if (fSeedTimeDetList.size() > 0) { + FillSeedTimesFromDetList(fSeedTimes); + } + //DumpSeedTimesFromDetList(); + + /// Call Algo ProcessTs method + fpAlgo->ProcessTs(); + + /// Save the resulting vector of events in TClonesArray + FillOutput(); } void CbmTaskBuildRawEvents::FillSeedTimesFromDetList(std::vector<Double_t>* vdSeedTimes, diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h index 54c8b536767711e947ad0dc48dfac186b85b358d..39b18c2f498a1a9cb390a7693eae7e42edccf95f 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h @@ -129,6 +129,9 @@ public: void SetSeedTimeWindow(Double_t beg, Double_t end) { fpAlgo->SetSeedTimeWindow(beg, end); } private: + /** Read digis from input, call seed finder, then build events **/ + void BuildEvents(); + void FillOutput(); void SaveHistos(); @@ -147,11 +150,19 @@ private: std::vector<CbmPsdDigi>* fPsdDigis = nullptr; std::vector<Double_t>* fSeedTimes = nullptr; + /** Create digi vector and pass to algo **/ + template<class TDigi> + void InitDigis(ECbmModuleId detId, std::vector<TDigi>** vDigi); + std::vector<Double_t>* fTempDigiTimes = nullptr; //used when multiple seed detectors are combined with sliding window seed finder std::vector<RawEventBuilderDetector> fSeedTimeDetList; //for multiple seed detectors + /** Read digis from digi manager **/ + template<class TDigi> + void ReadDigis(ECbmModuleId detId, std::vector<TDigi>* vDigis); + // Store digi matches for QA tasks std::vector<CbmMatch>* fvDigiMatchQa = nullptr;