From 4abe765e770fbd58b53c325952af465df11fa94c Mon Sep 17 00:00:00 2001
From: Alexandru Bercuci <abercuci@niham.nipne.ro>
Date: Thu, 25 May 2023 12:00:26 +0300
Subject: [PATCH]  add support for full TS reconstruction in TRD2D

---
 reco/detectors/trd/CbmTrdClusterFinder.cxx | 22 ++++++++++++++++++----
 reco/detectors/trd/CbmTrdClusterFinder.h   |  7 ++++---
 reco/detectors/trd/CbmTrdModuleRec.h       |  2 +-
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/reco/detectors/trd/CbmTrdClusterFinder.cxx b/reco/detectors/trd/CbmTrdClusterFinder.cxx
index 2d239d67ca..d470d6825f 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.cxx
+++ b/reco/detectors/trd/CbmTrdClusterFinder.cxx
@@ -79,12 +79,24 @@ Bool_t CbmTrdClusterFinder::AddCluster(CbmTrdCluster* c)
 // ---- addDigisToModules ----
 UInt_t CbmTrdClusterFinder::addDigisToModules()
 {
+  const int NDIGICHUNK = 100;  // force flush of cluster buffer once every NDIGICHUNK digi to avoid memory exhaustion
+
   UInt_t ndigis = static_cast<UInt_t>(std::abs(CbmDigiManager::Instance()->GetNofDigis(ECbmModuleId::kTrd)));
   if (ndigis == 0) return 0;
-  for (size_t idigi = 0; idigi < ndigis; idigi++) {
+
+  int jdigi(0);
+  for (size_t idigi(0); idigi < ndigis; idigi++) {
     addDigiToModule(idigi);
+    // once in a while dump finished clusters
+    // TODO ad hoc condition. Maybe a find a better one
+    if (jdigi >= NDIGICHUNK) {
+      processDigisInModules(jdigi, nullptr, false);
+      jdigi = 0;
+    }
+    else
+      jdigi++;
   }
-  return ndigis;
+  return jdigi;
 }
 
 // ---- addDigisToModules ----
@@ -118,14 +130,16 @@ void CbmTrdClusterFinder::addDigiToModule(UInt_t digiIdx)
 }
 
 // ---- processDigisInModules ----
-void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event)
+void CbmTrdClusterFinder::processDigisInModules(UInt_t ndigis, CbmEvent* event, bool clr)
 {
+  // printf("AB :: processDigisInModules(%d, %p) clr[%c]\n", ndigis, (void*) event, (clr?'Y':'N'));
+
   CbmTrdModuleRec* mod(NULL);
   Int_t digiCounter(0), clsCounter(0);
   for (std::map<Int_t, CbmTrdModuleRec*>::iterator imod = fModules.begin(); imod != fModules.end(); imod++) {
     mod = imod->second;
     digiCounter += mod->GetOverThreshold();
-    clsCounter += mod->FindClusters();
+    clsCounter += mod->FindClusters(event || clr);
     AddClusters(mod->GetClusters(), event, kTRUE);
   }
 
diff --git a/reco/detectors/trd/CbmTrdClusterFinder.h b/reco/detectors/trd/CbmTrdClusterFinder.h
index 99a48d1ee8..c01df96f91 100644
--- a/reco/detectors/trd/CbmTrdClusterFinder.h
+++ b/reco/detectors/trd/CbmTrdClusterFinder.h
@@ -187,10 +187,11 @@ private:
   /**
    * @brief Call the clusterizer function of each module
    * 
-   * @param ndigis 
-   * @param event 
+   * @param ndigis total number of digis processed
+   * @param event link to digi event in case event-by-event reco is activated
+   * @param clr force clear clusters buffers
    */
-  void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr);
+  void processDigisInModules(UInt_t ndigis, CbmEvent* event = nullptr, bool clr = true);
 
   /**
    * @brief Adds the module corresponding to the address of the passed digi to the ModuleMap (fModules)
diff --git a/reco/detectors/trd/CbmTrdModuleRec.h b/reco/detectors/trd/CbmTrdModuleRec.h
index 93dbc1c2e8..bace9c2a79 100644
--- a/reco/detectors/trd/CbmTrdModuleRec.h
+++ b/reco/detectors/trd/CbmTrdModuleRec.h
@@ -45,7 +45,7 @@ public:
   /**
    * \brief Steering routine for finding digits clusters
    **/
-  virtual Int_t FindClusters() = 0;
+  virtual Int_t FindClusters(bool clr = true) = 0;
   virtual Int_t GetOverThreshold() const { return 0; }
   virtual TClonesArray* GetClusters() { return fClusters; }
   virtual const TClonesArray* GetClusters() const { return fClusters; }
-- 
GitLab