diff --git a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx index 212bb070463305a98603adf7df9b30962ecc2378..a9ed0943548a38dd076d8f5dd14b9a12691872b6 100644 --- a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx +++ b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx @@ -4,6 +4,7 @@ #include "CbmSeedFinderSlidingWindow.h" +#include "CbmMCEventList.h" #include "CbmMatch.h" #include "CbmMuchBeamTimeDigi.h" #include "CbmMuchDigi.h" @@ -14,6 +15,9 @@ #include "CbmTofDigi.h" #include "CbmTrdDigi.h" +#include "FairRootManager.h" +#include <Logger.h> + CbmSeedFinderSlidingWindow::~CbmSeedFinderSlidingWindow() { if (fQa != nullptr) { delete fQa; } @@ -25,13 +29,41 @@ double CbmSeedFinderSlidingWindow::GetTime(const std::vector<double>* vIn, int32 template<class inType> void CbmSeedFinderSlidingWindow::FillSeedTimes(const std::vector<inType>* vIn, const std::vector<CbmMatch>* vDigiMatch) { + // Reset output array + fvSeedTimes->clear(); + + // Ideal mode ignores digi input and copies MC event list + if (fbIdealMode) { + + std::vector<CbmMatch> eventMatches; + + for (uint32_t i = 0; i < fEventList->GetNofEvents(); i++) { + + if (fIdealModeFileId != -1 && fEventList->GetFileIdByIndex(i) != fIdealModeFileId) { continue; } + const double seedTime = fEventList->GetEventTimeByIndex(i); + fvSeedTimes->push_back(seedTime); + + if (fQa) { + const uint32_t eventId = fEventList->GetEventIdByIndex(i); + const uint32_t fileId = fEventList->GetFileIdByIndex(i); + CbmMatch eventMatch; + eventMatch.AddLink(1.0, 0, eventId, fileId); + eventMatches.push_back(eventMatch); + } + } + if (fQa) { + for (uint32_t i = 0; i < fvSeedTimes->size(); i++) { + fQa->FillQaInfo(i, i, &eventMatches, fvSeedTimes->at(i)); + } + } + return; + } + const int32_t nDigisTot = vIn->size(); int32_t nDigisWin = 0; int32_t winStartN = 0; double winStartT = -1111; - // Reset output array - fvSeedTimes->clear(); //LOG(debug) << "CbmTaskBuildRawEvents::FillSeedTimesSlidingWindow: digis in slice " << nDigisTot; for (int32_t i = 0; i < nDigisTot; i++) { @@ -129,6 +161,14 @@ void CbmSeedFinderSlidingWindow::SetQa(bool doQA) void CbmSeedFinderSlidingWindow::Init() { if (fQa) { fQa->Init(); } + + if (fbIdealMode) { + if (!FairRootManager::Instance() || !FairRootManager::Instance()->GetObject("MCEventList.")) { + LOG(error) << "No MC event list found"; + return; + } + fEventList = (CbmMCEventList*) FairRootManager::Instance()->GetObject("MCEventList."); + } } void CbmSeedFinderSlidingWindow::OutputQa() diff --git a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h index 9da592f29f31a711dcefcac5474ae3959537e2d3..e85bf76969b60489d02f1eeabfe7f216e9b9b262 100644 --- a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h +++ b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.h @@ -26,6 +26,7 @@ #include <vector> class CbmMatch; +class CbmMCEventList; class CbmSeedFinderQa; class CbmSeedFinderSlidingWindow { @@ -67,6 +68,15 @@ public: **/ void SetOffset(double offset) { fdOffset = offset; } + /** @brief Switches to ``ideal mode'' in which event times from MC data are used as triggers + * (no algorithm is run in this case) + **/ + void SetIdealMode(const int32_t fileId = -1) + { + fbIdealMode = true; + fIdealModeFileId = fileId; + } + /** @brief Returns number of seed times currently stored in buffer. */ size_t GetNofSeeds() { return fvSeedTimes->size(); } @@ -90,6 +100,15 @@ private: /** @brief Global time offset which is applied to each trigger time. */ double fdOffset = 0.; + /** @brief ``ideal mode'' uses MC truth as trigger times. */ + bool fbIdealMode = false; + + /** @brief If only a single file is to be used in ``ideal mode'' (-1 = all files). */ + int32_t fIdealModeFileId = -1; + + /** @brief To access MC truth in ``ideal mode''. */ + CbmMCEventList* fEventList = nullptr; + /** @brief Fetches time at position i of either a digi vector or vector of times. */ template<class inType> double GetTime(const std::vector<inType>* vIn, int32_t i); diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx index ff3447e72b9321f8cf935cfa228368d91122c8e3..658e741aeecf57d816f2c6210a4e30f327d27929 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.cxx @@ -47,6 +47,12 @@ void CbmTaskBuildRawEvents::AddSeedTimeFillerToList(RawEventBuilderDetector seed fpAlgo->SetSeedTimes(fSeedTimes); } +void CbmTaskBuildRawEvents::SetIdealSeedFinder(const int32_t fileId) +{ + SetSlidingWindowSeedFinder(1, 0.0, 0.0, 0.0); + fSeedFinderSlidingWindow->SetIdealMode(fileId); +} + void CbmTaskBuildRawEvents::SetSlidingWindowSeedFinder(int32_t minDigis, double dWindDur, double dDeadT, double dOffset) { if (fSeedFinderSlidingWindow) { diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h index 4cc55893db5b80b3eb114298d229eb6d4be1357d..54c8b536767711e947ad0dc48dfac186b85b358d 100644 --- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h +++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h @@ -123,6 +123,7 @@ public: void PrintTimings(); void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet); void SetSlidingWindowSeedFinder(int32_t minDigis, double dWindDur, double dDeadT, double dOffset = 0.0); + void SetIdealSeedFinder(const int32_t fileId = -1); void DumpSeedTimesFromDetList(); void SetSeedTimeWindow(Double_t beg, Double_t end) { fpAlgo->SetSeedTimeWindow(beg, end); }