From 06aa86d3c7d693d2b3fb08775887c01dd39bbe92 Mon Sep 17 00:00:00 2001
From: Dominik Smith <d.smith@gsi.de>
Date: Thu, 24 Feb 2022 14:31:05 +0100
Subject: [PATCH] CbmSeedFinderSlidingWindow now has an ideal mode'', in which
 seed times are copied directly from MC events and no additional algorithm is
 run. Filtering the input by file ID is also supported.

---
 .../digis/CbmSeedFinderSlidingWindow.cxx      | 44 ++++++++++++++++++-
 .../digis/CbmSeedFinderSlidingWindow.h        | 19 ++++++++
 .../digis/CbmTaskBuildRawEvents.cxx           |  6 +++
 .../digis/CbmTaskBuildRawEvents.h             |  1 +
 4 files changed, 68 insertions(+), 2 deletions(-)

diff --git a/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx b/reco/eventbuilder/digis/CbmSeedFinderSlidingWindow.cxx
index 212bb07046..a9ed094354 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 9da592f29f..e85bf76969 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 ff3447e72b..658e741aee 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 4cc55893db..54c8b53676 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); }
-- 
GitLab