From e8770d9713f0bcb68e5b72813b114dcacae008d3 Mon Sep 17 00:00:00 2001
From: Dominik Smith <d.smith@gsi.de>
Date: Fri, 27 Oct 2023 13:44:43 +0200
Subject: [PATCH] Integrated cbm::algo::Calibrate into cbm::algo::Reco.

---
 algo/CMakeLists.txt                    |  1 +
 algo/detectors/tof/Calibrate.cxx       |  3 +--
 algo/detectors/tof/Calibrate.h         |  5 ++--
 algo/detectors/tof/CalibratorChain.cxx | 24 +++++++++++++++++
 algo/detectors/tof/CalibratorChain.h   | 37 ++++++++++++++++++++++++++
 algo/detectors/tof/Hitfind.cxx         |  1 -
 algo/global/Reco.cxx                   | 23 +++++++++++++---
 algo/global/Reco.h                     |  3 +++
 8 files changed, 88 insertions(+), 9 deletions(-)
 create mode 100644 algo/detectors/tof/CalibratorChain.cxx
 create mode 100644 algo/detectors/tof/CalibratorChain.h

diff --git a/algo/CMakeLists.txt b/algo/CMakeLists.txt
index 1811fe30e8..fe4e905d41 100644
--- a/algo/CMakeLists.txt
+++ b/algo/CMakeLists.txt
@@ -95,6 +95,7 @@ set(SRCS
   detectors/tof/Unpack.cxx
   detectors/tof/Hitfind.cxx
   detectors/tof/HitfinderChain.cxx
+  detectors/tof/CalibratorChain.cxx
   detectors/bmon/ReadoutConfig.cxx
   detectors/bmon/Unpack.cxx
   detectors/trd/ReadoutConfig.cxx
diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx
index b94cdc8cc1..9b5697daa7 100644
--- a/algo/detectors/tof/Calibrate.cxx
+++ b/algo/detectors/tof/Calibrate.cxx
@@ -15,7 +15,7 @@ using fles::Subsystem;
 namespace cbm::algo::tof
 {
   // -----   Execution   -------------------------------------------------------
-  Calibrate::resultType Calibrate::operator()(gsl::span<CbmTofDigi> digiIn)
+  Calibrate::resultType Calibrate::operator()(gsl::span<const CbmTofDigi> digiIn)
   {
     xpu::push_timer("TofCalibrate");
     xpu::t_add_bytes(digiIn.size_bytes());
@@ -97,7 +97,6 @@ namespace cbm::algo::tof
     }
 
     monitor.fTime = xpu::pop_timer();
-    L_(debug) << MakeReport("Calibrate", monitor.fTime);
 
     return result;
   }
diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h
index 9d8a60b0dd..1e3f2b3a7d 100644
--- a/algo/detectors/tof/Calibrate.h
+++ b/algo/detectors/tof/Calibrate.h
@@ -29,6 +29,7 @@ namespace cbm::algo::tof
    **/
   struct CalibrateMonitorData {
     xpu::timings fTime;
+    size_t fNumDigis            = 0;
     size_t fDigiCalibUnknownRPC = 0;
 
     std::string print() const
@@ -56,7 +57,7 @@ namespace cbm::algo::tof
      **
      ** @note Modifies input digis for time calibration
      **/
-    resultType operator()(gsl::span<CbmTofDigi> digiIn);
+    resultType operator()(gsl::span<const CbmTofDigi> digiIn);
 
     /** @brief Default constructor **/
     Calibrate() {};
@@ -68,8 +69,6 @@ namespace cbm::algo::tof
     tof::HitfindSetup fTofConfig {};
 
   private:  // members
-    /** @brief Applies calibration to input digis **/
-    std::vector<CbmTofDigi> CalibRawDigis(gsl::span<CbmTofDigi> digiVec, CalibrateMonitorData& monitor);
   };
 }  // namespace cbm::algo::tof
 
diff --git a/algo/detectors/tof/CalibratorChain.cxx b/algo/detectors/tof/CalibratorChain.cxx
new file mode 100644
index 0000000000..4a9a35147a
--- /dev/null
+++ b/algo/detectors/tof/CalibratorChain.cxx
@@ -0,0 +1,24 @@
+/* Copyright (C) 2023 Facility for Antiproton and Ion Research in Europe, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Dominik Smith [committer], Felix Weiglhofer */
+#include "CalibratorChain.h"
+
+#include "config/Yaml.h"
+
+using namespace cbm::algo;
+using namespace cbm::algo::tof;
+
+void CalibratorChain::Init()
+{
+  auto setup             = config::ReadFromFile<HitfindSetup>(Opts().ParamsDir() / "TofHitfinderPar.yaml");
+  fCalibrate             = std::make_unique<Calibrate>();
+  fCalibrate->fTofConfig = setup;
+}
+
+CalibratorChain::ReturnType CalibratorChain::Run(gsl::span<CbmTofDigi> digis)
+{
+  auto ret = (*fCalibrate)(digis);
+
+  L_(error) << "TOF Digis with unknown RPCs: " << std::get<1>(ret).fDigiCalibUnknownRPC;
+  return ret;
+}
diff --git a/algo/detectors/tof/CalibratorChain.h b/algo/detectors/tof/CalibratorChain.h
new file mode 100644
index 0000000000..e22780d3ca
--- /dev/null
+++ b/algo/detectors/tof/CalibratorChain.h
@@ -0,0 +1,37 @@
+/* Copyright (C) 2023 Facility for Antiproton and Ion Research in Europe, Darmstadt
+   SPDX-License-Identifier: GPL-3.0-only
+   Authors: Dominik Smith [committer], Felix Weiglhofer */
+#pragma once
+
+#include "CbmTofDigi.h"
+
+#include <gsl/span>
+#include <memory>
+
+#include "Calibrate.h"
+#include "HitfindSetup.h"
+#include "SubChain.h"
+
+namespace cbm::algo::tof
+{
+
+  class CalibratorChain : public SubChain {
+
+  public:
+    using ReturnType = Calibrate::resultType;
+
+    CalibratorChain()  = default;
+    ~CalibratorChain() = default;
+
+    void Init();
+
+    /**
+     * @brief Apply calibration to digis
+     */
+    ReturnType Run(gsl::span<CbmTofDigi> digis);
+
+  private:
+    std::unique_ptr<Calibrate> fCalibrate;
+  };
+
+}  // namespace cbm::algo::tof
diff --git a/algo/detectors/tof/Hitfind.cxx b/algo/detectors/tof/Hitfind.cxx
index 92bee7da8a..72fed21efc 100644
--- a/algo/detectors/tof/Hitfind.cxx
+++ b/algo/detectors/tof/Hitfind.cxx
@@ -81,7 +81,6 @@ namespace cbm::algo::tof
     monitor.fTime     = xpu::pop_timer();
     monitor.fNumDigis = digiIn.size();
     monitor.fNumHits  = clustersFlat.size();
-    L_(debug) << MakeReport("Hitfind", monitor.fTime);
 
     // Create ouput vector
     clusterTs = PartitionedVector(std::move(clustersFlat), rpcSizes, rpcAddresses);
diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index 674372b5ba..83ebb30c9d 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -87,6 +87,7 @@ void Reco::Init(const Options& opts)
 
   // TOF Hitfinder
   fTofHitFinder.Init();
+  fTofCalibrator.Init();
 
   // Tracking
   fTracking.Init();
@@ -153,9 +154,11 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
 
     PartitionedVector<tof::Hit> tofHits;
     if (Opts().HasStep(Step::LocalReco) && Opts().HasDetector(fles::Subsystem::TOF)) {
-      auto [hits, monitor, caldigis] = fTofHitFinder.Run(unpackResult.first.fTof);
-      tofHits                        = std::move(hits);
-      QueueTofRecoMetrics(monitor);
+      auto [caldigis, calmonitor] = fTofCalibrator.Run(unpackResult.first.fTof);
+      auto [hits, hitmonitor]     = fTofHitFinder.Run(caldigis);
+      tofHits                     = std::move(hits);
+      QueueTofCalibMetrics(calmonitor);
+      QueueTofRecoMetrics(hitmonitor);
     }
 
     // --- Tracking
@@ -294,6 +297,20 @@ void Reco::QueueTofRecoMetrics(const tof::HitfindMonitorData& mon)
                            });
 }
 
+void Reco::QueueTofCalibMetrics(const tof::CalibrateMonitorData& mon)
+{
+  if (!HasMonitor()) return;
+
+  GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}, {"child", Opts().ChildId()}},
+                           {
+                             {"tofCalibTimeTotal", mon.fTime.wall()},
+                             {"tofCalibThroughput", mon.fTime.throughput()},
+                             {"tofCalibNumDigisIn", mon.fNumDigis},
+                             {"tofCalibUnknownRPC", mon.fDigiCalibUnknownRPC},
+                           });
+}
+
+
 void Reco::QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData& mon)
 {
   if (!HasMonitor()) return;
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index da5aa97748..f0a7c2b6d6 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -4,6 +4,7 @@
 #ifndef CBM_ALGO_GLOBAL_RECO_H
 #define CBM_ALGO_GLOBAL_RECO_H
 
+#include "tof/CalibratorChain.h"
 #include "tof/HitfinderChain.h"
 
 #include <xpu/host.h>
@@ -58,6 +59,7 @@ namespace cbm::algo
 
     // TOF
     tof::HitfinderChain fTofHitFinder;
+    tof::CalibratorChain fTofCalibrator;
 
     // Eventbuilding
     std::unique_ptr<evbuild::EventbuildChain> fEventBuild;
@@ -70,6 +72,7 @@ namespace cbm::algo
     void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&, const DigiData&);
     void QueueStsRecoMetrics(const sts::HitfinderMonitor&);
     void QueueTofRecoMetrics(const tof::HitfindMonitorData&);
+    void QueueTofCalibMetrics(const tof::CalibrateMonitorData&);
     void QueueEvbuildMetrics(const evbuild::EventbuildChainMonitorData&);
     void QueueTrackingMetrics(const ca::TrackingMonitorData&);
     void QueueProcessingMetrics(const ProcessingMonitor&);
-- 
GitLab