From 5895669f44e096f9bf12a87d660462032d73214f Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Wed, 12 Jul 2023 00:02:48 +0200
Subject: [PATCH] cbmreco: Monitor STS Reco.

---
 algo/detectors/sts/StsHitfinder.h        |  7 +++++--
 algo/detectors/sts/StsHitfinderChain.cxx | 11 +++++++++--
 algo/detectors/sts/StsHitfinderChain.h   |  2 +-
 algo/global/Reco.cxx                     | 19 +++++++++++++++++--
 algo/global/Reco.h                       |  1 +
 5 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/algo/detectors/sts/StsHitfinder.h b/algo/detectors/sts/StsHitfinder.h
index f41ce3354c..e1f80a47e7 100644
--- a/algo/detectors/sts/StsHitfinder.h
+++ b/algo/detectors/sts/StsHitfinder.h
@@ -112,8 +112,11 @@ namespace cbm::algo::sts
   };
 
   struct HitfinderMonitor {
-    u32 fNumClusterBucketOverflow = 0;
-    u32 fNumHitBucketOverflow     = 0;
+    i32 fNumClusterBucketOverflow = 0;
+    i32 fNumHitBucketOverflow     = 0;
+    u64 fNumClusterTotal          = 0;
+    u64 fNumHitsTotal             = 0;
+    f64 fTimeTotal                = 0.;
 
     bool HasErrors() const { return fNumClusterBucketOverflow > 0 || fNumHitBucketOverflow > 0; }
   };
diff --git a/algo/detectors/sts/StsHitfinderChain.cxx b/algo/detectors/sts/StsHitfinderChain.cxx
index e1bde280a4..5fe1579989 100644
--- a/algo/detectors/sts/StsHitfinderChain.cxx
+++ b/algo/detectors/sts/StsHitfinderChain.cxx
@@ -23,11 +23,11 @@ void sts::HitfinderChain::Finalize()
   xpu::set<TheHitfinder>(fHitfinder);
 }
 
-void sts::HitfinderChain::operator()(gsl::span<const CbmStsDigi> digis)
+sts::HitfinderMonitor sts::HitfinderChain::operator()(gsl::span<const CbmStsDigi> digis)
 {
   EnsureParameters();
 
-  xpu::scoped_timer t_("STS Hitfinder");
+  xpu::push_timer("STS Hitfinder");
 
   int nModules       = fPars->modules.size();
   int nModuleSides   = nModules * 2;
@@ -197,6 +197,13 @@ void sts::HitfinderChain::operator()(gsl::span<const CbmStsDigi> digis)
   xpu::k_add_bytes<FindHits>(nClustersTotal * sizeof(sts::Cluster));
 
   L_(info) << "Timeslice contains " << nHitsTotal << " STS hits and " << nClustersTotal << " STS clusters";
+
+  auto timings = xpu::pop_timer();
+
+  monitor[0].fTimeTotal       = timings.wall();
+  monitor[0].fNumClusterTotal = nClustersTotal;
+  monitor[0].fNumHitsTotal    = nHitsTotal;
+  return monitor[0];
 }
 
 void sts::HitfinderChain::EnsureParameters()
diff --git a/algo/detectors/sts/StsHitfinderChain.h b/algo/detectors/sts/StsHitfinderChain.h
index 7bd7e0e6d0..c811a19ab9 100644
--- a/algo/detectors/sts/StsHitfinderChain.h
+++ b/algo/detectors/sts/StsHitfinderChain.h
@@ -48,7 +48,7 @@ namespace cbm::algo::sts
      */
     void Finalize();
 
-    void operator()(gsl::span<const CbmStsDigi>);
+    sts::HitfinderMonitor operator()(gsl::span<const CbmStsDigi>);
 
   private:
     // Shorthands to map module-address onto digis in that module
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index 3dad3a6a01..72d87493c5 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -118,13 +118,14 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
   std::vector<CbmDigiEvent> events;
   if (Opts().HasStep(Step::DigiTrigger)) events = fEventBuild.Run(digiTs);
 
-
+  sts::HitfinderMonitor stsHitfinderMonitor;
   if (Opts().HasStep(Step::LocalReco) && Opts().HasDetector(fles::Subsystem::STS))
-    fStsHitFinder(unpackResult.first.fData.fSts.fDigis);
+    stsHitfinderMonitor = fStsHitFinder(unpackResult.first.fData.fSts.fDigis);
 
   xpu::timings ts_times = xpu::pop_timer();
 
   QueueUnpackerMetrics(ts, unpackMonitor, unpackResult.first);
+  QueueStsRecoMetrics(stsHitfinderMonitor);
 
   PrintTimings(ts_times);
 
@@ -214,3 +215,17 @@ void Reco::QueueUnpackerMetrics(const fles::Timeslice& ts, const UnpackMonitorDa
                              {"unpackNumErrInvalidSysVer", monitor.fNumErrInvalidSysVer},
                            });
 }
+
+void Reco::QueueStsRecoMetrics(const sts::HitfinderMonitor& monitor)
+{
+  if (!HasMonitor()) return;
+
+  GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}},
+                           {
+                             {"stsRecoTimeTotal", monitor.fTimeTotal},
+                             {"stsRecoNumClusters", monitor.fNumClusterTotal},
+                             {"stsRecoNumHits", monitor.fNumHitsTotal},
+                             {"stsRecoNumClusterBucketOverflow", monitor.fNumClusterBucketOverflow},
+                             {"stsRecoNumHitBucketOverflow", monitor.fNumHitBucketOverflow},
+                           });
+}
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index 8cd099c806..ce048fe559 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -50,6 +50,7 @@ namespace cbm::algo
     void Validate(const Options& opts);
 
     void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&, const CbmDigiTimeslice&);
+    void QueueStsRecoMetrics(const sts::HitfinderMonitor&);
   };
 }  // namespace cbm::algo
 
-- 
GitLab