From 172082af59152be0aab0b73006a01ef0a8fcd5e4 Mon Sep 17 00:00:00 2001
From: "s.zharko@gsi.de" <s.zharko@gsi.de>
Date: Tue, 11 Feb 2025 05:59:27 +0100
Subject: [PATCH] online: Adding BMON hit-finder to event reconstruction

---
 algo/global/Reco.cxx        | 41 +++++++++++++++++++++++--------------
 algo/global/RecoResults.h   |  2 ++
 algo/kfp/KfpV0FinderChain.h |  1 +
 3 files changed, 29 insertions(+), 15 deletions(-)

diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index e9d10bdd3..0f933400d 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -212,21 +212,6 @@ void Reco::Init(const Options& opts)
     fStsHitFinder->SetParameters(hitFinderPars);
   }
 
-  // BMON Hitfinder
-  if (Opts().Has(fles::Subsystem::BMON) && Opts().Has(Step::LocalReco)) {
-    auto calibSetup = yaml::ReadFromFile<bmon::CalibrateSetup>(opts.ParamsDir() / parFiles.bmon.calibrate);
-    fBmonCalibrator = std::make_unique<bmon::Calibrate>(calibSetup);
-
-    auto hitfindSetup = yaml::ReadFromFile<bmon::HitfindSetup>(opts.ParamsDir() / parFiles.bmon.hitfinder);
-    fBmonHitFinder    = std::make_unique<bmon::Hitfind>(hitfindSetup);
-
-    if (fQaManager != nullptr && Opts().Has(QaStep::RecoBmon)) {
-      fBmonHitFinderQa = std::make_unique<bmon::HitfindQa>(fQaManager, "BmonHitfindEvent");
-      fBmonHitFinderQa->InitParameters(calibSetup, hitfindSetup);
-      fBmonHitFinderQa->Init();
-    }
-  }
-
   // TOF Hitfinder
   if (Opts().Has(fles::Subsystem::TOF) && Opts().Has(Step::LocalReco)) {
     auto calibSetup = yaml::ReadFromFile<tof::CalibrateSetup>(opts.ParamsDir() / parFiles.tof.calibrate);
@@ -249,6 +234,7 @@ void Reco::Init(const Options& opts)
     fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::STS);
     fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::TRD);
     fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::TOF);
+    fbReconstructDigiEvents &= Opts().Has(fles::Subsystem::BMON);
   }
 
   // Tracking
@@ -267,6 +253,18 @@ void Reco::Init(const Options& opts)
   if (fbReconstructDigiEvents) {
     fEvSelectingMonitor.Reset();
 
+    // BMON hit finding in event reconstruction
+    auto bmonCalSetup = yaml::ReadFromFile<bmon::CalibrateSetup>(opts.ParamsDir() / parFiles.bmon.calibrate);
+    auto bmonHitSetup = yaml::ReadFromFile<bmon::HitfindSetup>(opts.ParamsDir() / parFiles.bmon.hitfinder);
+    fBmonCalibrator   = std::make_unique<bmon::Calibrate>(bmonCalSetup);
+    fBmonHitFinder    = std::make_unique<bmon::Hitfind>(bmonHitSetup);
+    if (fQaManager != nullptr && Opts().Has(QaStep::RecoBmon)) {
+      fBmonHitFinderQa = std::make_unique<bmon::HitfindQa>(fQaManager, "BmonHitfindEvent");
+      fBmonHitFinderQa->InitParameters(bmonCalSetup, bmonHitSetup);
+      fBmonHitFinderQa->Init();
+    }
+
+    // Tracking in event reconstruction
     if (fQaManager != nullptr && Opts().Has(QaStep::Tracking)) {
       fTracking = std::make_unique<TrackingChain>(ECbmRecoMode::EventByEvent, fQaManager, "CaEvent");
     }
@@ -524,6 +522,19 @@ void Reco::PrintTimings(xpu::timings& timings)
 bool Reco::ReconstructEvent(const DigiEvent& digiEvent)
 {
   RecoResults recoEvent;
+  //* BMON hit reconstruction
+  {
+    auto [calDigis, calMonitor]          = (*fBmonCalibrator)(recoEvent.fBmon);
+    auto [hits, hitMonitor, digiIndices] = (*fBmonHitFinder)(calDigis);
+    if (fBmonHitFinderQa != nullptr) {
+      fBmonHitFinderQa->RegisterDigis(&calDigis);
+      fBmonHitFinderQa->RegisterHits(&hits);
+      fBmonHitFinderQa->RegisterDigiIndices(&digiIndices);
+      fBmonHitFinderQa->Exec();
+    }
+    recoEvent.bmonHits = std::move(hits);
+  }
+
   //* STS hit reconstruction
   {
     fEvSelectingMonitor.StartTimer(evselect::ETimer::StsHitFinder);
diff --git a/algo/global/RecoResults.h b/algo/global/RecoResults.h
index 670927953..25a3f73a2 100644
--- a/algo/global/RecoResults.h
+++ b/algo/global/RecoResults.h
@@ -12,6 +12,7 @@
 #include "DigiData.h"
 #include "PartitionedSpan.h"
 #include "PartitionedVector.h"
+#include "bmon/Hit.h"
 #include "ca/core/data/CaTrack.h"
 #include "ca/core/utils/CaVector.h"
 #include "sts/Cluster.h"
@@ -41,6 +42,7 @@ namespace cbm::algo
     PartitionedSpan<sts::Hit> stsHits;
     PartitionedVector<tof::Hit> tofHits;
     PartitionedVector<trd::Hit> trdHits;
+    PartitionedVector<bmon::Hit> bmonHits;
 
     ca::Vector<ca::Track> tracks;
     ca::Vector<std::vector<std::pair<uint32_t, uint32_t>>> trackStsHitIndices;
diff --git a/algo/kfp/KfpV0FinderChain.h b/algo/kfp/KfpV0FinderChain.h
index 2be7ddf5d..c328750aa 100644
--- a/algo/kfp/KfpV0FinderChain.h
+++ b/algo/kfp/KfpV0FinderChain.h
@@ -59,5 +59,6 @@ namespace cbm::algo
    private:
     kfp::V0Finder fFinder;             ///< Instance of the V0-finding algorithm
     kfp::V0FinderMonitor fMonitorRun;  ///< Monitor per run
+    uint32_t fBmonAddress;             ///< Address of selected BMON
   };
 }  // namespace cbm::algo
-- 
GitLab