From 7c451e71bdc8c562ea67cd12711f59b344084a9e Mon Sep 17 00:00:00 2001
From: Dominik Smith <smith@th.physik.uni-frankfurt.de>
Date: Tue, 7 Nov 2023 12:20:58 +0100
Subject: [PATCH] More improvements to cbm::algo::tof::Calibrate.

---
 algo/detectors/tof/Calibrate.cxx       | 56 ++++++++++++++++++--------
 algo/detectors/tof/Calibrate.h         | 35 ++++------------
 algo/detectors/tof/CalibratorChain.cxx |  3 +-
 reco/tasks/CbmTaskTofClusterizer.cxx   |  7 ++--
 reco/tasks/CbmTaskTofClusterizer.h     |  2 +-
 5 files changed, 54 insertions(+), 49 deletions(-)

diff --git a/algo/detectors/tof/Calibrate.cxx b/algo/detectors/tof/Calibrate.cxx
index f21207af04..36a6efaf82 100644
--- a/algo/detectors/tof/Calibrate.cxx
+++ b/algo/detectors/tof/Calibrate.cxx
@@ -14,6 +14,29 @@ using fles::Subsystem;
 
 namespace cbm::algo::tof
 {
+  // -----   Constructor  ------------------------------------------------------
+  Calibrate::Calibrate(tof::CalibrateSetup params) : fTofConfig(params)
+  {
+    smTypeOffset.resize(1, 0);
+    smOffset.resize(1, 0);
+    rpcOffset.resize(1, 0);
+
+    for (uint32_t SmType = 0; SmType < fTofConfig.NbSm.size(); SmType++) {
+      int32_t NbSm  = fTofConfig.NbSm[SmType];
+      int32_t NbRpc = fTofConfig.NbRpc[SmType];
+      smTypeOffset.push_back(smTypeOffset.back() + NbSm);
+      for (int32_t Sm = 0; Sm < NbSm; Sm++) {
+        smOffset.push_back(smOffset.back() + NbRpc);
+        for (int32_t Rpc = 0; Rpc < NbRpc; Rpc++) {
+          int32_t NbChan = fTofConfig.rpcs[SmType][Sm * NbRpc + Rpc].chanPar.size();
+          rpcOffset.push_back(rpcOffset.back() + 2 * NbChan);  //Factor 2 for channel sides
+        }
+      }
+    }
+    mChannelDeadTime = std::vector<double>(rpcOffset.back(), std::numeric_limits<double>::quiet_NaN());
+  }
+
+
   // -----   Execution   -------------------------------------------------------
   Calibrate::resultType Calibrate::operator()(gsl::span<const CbmTofDigi> digiIn)
   {
@@ -29,14 +52,13 @@ namespace cbm::algo::tof
 
     std::fill(mChannelDeadTime.begin(), mChannelDeadTime.end(), std::numeric_limits<double>::quiet_NaN());
 
-    for (size_t iDigi = 0; iDigi < digiIn.size(); iDigi++) {
-
-      CbmTofDigi pDigi    = digiIn[iDigi];
-      const double SmType = pDigi.GetType();
-      const double Sm     = pDigi.GetSm();
-      const double Rpc    = pDigi.GetRpc();
-      const double Chan   = pDigi.GetChannel();
-      const double Side   = pDigi.GetSide();
+    for (const auto& entry : digiIn) {
+      CbmTofDigi digi     = entry;
+      const double SmType = digi.GetType();
+      const double Sm     = digi.GetSm();
+      const double Rpc    = digi.GetRpc();
+      const double Chan   = digi.GetChannel();
+      const double Side   = digi.GetSide();
       const int NbRpc     = fTofConfig.NbRpc[SmType];
 
       auto& rpcs = fTofConfig.rpcs;
@@ -48,22 +70,24 @@ namespace cbm::algo::tof
       CalibrateSetup::Rpc& rpcPar      = fTofConfig.rpcs.at(SmType).at(Sm * NbRpc + Rpc);
       CalibrateSetup::Channel& chanPar = rpcPar.chanPar[Chan];
 
-      if (rpcPar.swapChannelSides && 5 != SmType && 8 != SmType) {
-        pDigi.SetAddress(Sm, Rpc, Chan, (0 == Side) ? 1 : 0, SmType);
-      }
-
       // Check dead time
       const size_t chanIdx = rpcOffset[smOffset[smTypeOffset[SmType] + Sm] + Rpc] + Chan + Side * rpcPar.chanPar.size();
       double& deadTime     = mChannelDeadTime[chanIdx];
 
-      if (!std::isnan(deadTime) && pDigi.GetTime() <= deadTime) {
-        mChannelDeadTime[chanIdx] = pDigi.GetTime() + rpcPar.channelDeadtime;
+      if (!std::isnan(deadTime) && digi.GetTime() <= deadTime) {
+        mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime;
+        monitor.fDigiDeadTimeCount++;
         continue;
       }
-      mChannelDeadTime[chanIdx] = pDigi.GetTime() + rpcPar.channelDeadtime;
+      mChannelDeadTime[chanIdx] = digi.GetTime() + rpcPar.channelDeadtime;
+
+      // Check if channel sides need to be swapped
+      if (rpcPar.swapChannelSides && 5 != SmType && 8 != SmType) {
+        digi.SetAddress(Sm, Rpc, Chan, (0 == Side) ? 1 : 0, SmType);
+      }
 
       // Create calibrated digi
-      CbmTofDigi& pCalDigi = calDigiOut.emplace_back(pDigi);
+      CbmTofDigi& pCalDigi = calDigiOut.emplace_back(digi);
 
       // calibrate Digi Time
       pCalDigi.SetTime(pCalDigi.GetTime() - chanPar.vCPTOff[Side]);
diff --git a/algo/detectors/tof/Calibrate.h b/algo/detectors/tof/Calibrate.h
index 00005a3804..7523e77d51 100644
--- a/algo/detectors/tof/Calibrate.h
+++ b/algo/detectors/tof/Calibrate.h
@@ -31,6 +31,7 @@ namespace cbm::algo::tof
     xpu::timings fTime;
     size_t fNumDigis            = 0;
     size_t fDigiCalibUnknownRPC = 0;
+    size_t fDigiDeadTimeCount   = 0;
 
     std::string print() const
     {
@@ -59,37 +60,12 @@ namespace cbm::algo::tof
      **/
     resultType operator()(gsl::span<const CbmTofDigi> digiIn);
 
-    /** @brief Default constructor **/
-    Calibrate() {};
+    /** @brief Constructor **/
+    Calibrate(tof::CalibrateSetup params);
 
     /** @brief Destructor **/
     ~Calibrate() {};
 
-    /** @brief Set parameters for TOF calibrator and initialize channel dead time arrays **/
-    void SetParams(tof::CalibrateSetup params)
-    {
-      fTofConfig = params;
-      smTypeOffset.resize(1, 0);
-      smOffset.resize(1, 0);
-      rpcOffset.resize(1, 0);
-
-      for (uint32_t SmType = 0; SmType < fTofConfig.NbSm.size(); SmType++) {
-        int32_t NbSm  = fTofConfig.NbSm[SmType];
-        int32_t NbRpc = fTofConfig.NbRpc[SmType];
-        smTypeOffset.push_back(smTypeOffset.back() + NbSm);
-
-        for (int32_t Sm = 0; Sm < NbSm; Sm++) {
-          smOffset.push_back(smOffset.back() + NbRpc);
-
-          for (int32_t Rpc = 0; Rpc < NbRpc; Rpc++) {
-            int32_t NbChan = fTofConfig.rpcs[SmType][Sm * NbRpc + Rpc].chanPar.size();
-            rpcOffset.push_back(rpcOffset.back() + 2 * NbChan);  //Factor 2 for channel sides
-          }
-        }
-      }
-      mChannelDeadTime = std::vector<double>(rpcOffset.back(), std::numeric_limits<double>::quiet_NaN());
-    }
-
   private:  // members
     /** @brief Parameters for TOF calibrator **/
     tof::CalibrateSetup fTofConfig {};
@@ -97,8 +73,13 @@ namespace cbm::algo::tof
     /** @brief Storage for deadtime check **/
     std::vector<double> mChannelDeadTime;
 
+    /** @brief Offset of super module type **/
     std::vector<size_t> smTypeOffset;
+
+    /** @brief Offset of super module **/
     std::vector<size_t> smOffset;
+
+    /** @brief Offset of RPC **/
     std::vector<size_t> rpcOffset;
   };
 }  // namespace cbm::algo::tof
diff --git a/algo/detectors/tof/CalibratorChain.cxx b/algo/detectors/tof/CalibratorChain.cxx
index adddf722ce..075413a691 100644
--- a/algo/detectors/tof/CalibratorChain.cxx
+++ b/algo/detectors/tof/CalibratorChain.cxx
@@ -11,8 +11,7 @@ using namespace cbm::algo::tof;
 void CalibratorChain::Init()
 {
   auto setup = config::ReadFromFile<CalibrateSetup>(Opts().ParamsDir() / "TofCalibratePar.yaml");
-  fCalibrate = std::make_unique<Calibrate>();
-  fCalibrate->SetParams(setup);
+  fCalibrate = std::make_unique<Calibrate>(setup);
 }
 
 CalibratorChain::ReturnType CalibratorChain::Run(gsl::span<CbmTofDigi> digis)
diff --git a/reco/tasks/CbmTaskTofClusterizer.cxx b/reco/tasks/CbmTaskTofClusterizer.cxx
index d818277c29..4af3613f00 100644
--- a/reco/tasks/CbmTaskTofClusterizer.cxx
+++ b/reco/tasks/CbmTaskTofClusterizer.cxx
@@ -313,8 +313,9 @@ bool CbmTaskTofClusterizer::InitAlgos()
   fAlgo = std::make_unique<cbm::algo::tof::Hitfind>(
     cbm::algo::config::ReadFromFile<cbm::algo::tof::HitfindSetup>("TofHitfinderPar.yaml"));
 
-  // Read calibration parameters pass to algo
-  fCalibrate.SetParams(cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml"));
+  // Read calibration parameters initialize algo
+  fCalibrate = std::make_unique<cbm::algo::tof::Calibrate>(
+    cbm::algo::config::ReadFromFile<cbm::algo::tof::CalibrateSetup>("TofCalibratePar.yaml"));
 
   return true;
 }
@@ -350,7 +351,7 @@ bool CbmTaskTofClusterizer::BuildClusters()
   }
 
   //Calibrate digis
-  *fTofCalDigiVec = fCalibrate(fTofDigiVec).first;
+  *fTofCalDigiVec = (*fCalibrate)(fTofDigiVec).first;
 
   //Call cluster finder
   auto [clusters, monitor, indices] = (*fAlgo)(*fTofCalDigiVec);
diff --git a/reco/tasks/CbmTaskTofClusterizer.h b/reco/tasks/CbmTaskTofClusterizer.h
index 78fb5059bc..049daf203a 100644
--- a/reco/tasks/CbmTaskTofClusterizer.h
+++ b/reco/tasks/CbmTaskTofClusterizer.h
@@ -131,7 +131,7 @@ private:
   std::unique_ptr<cbm::algo::tof::Hitfind> fAlgo;
 
   // Calibrator algo
-  cbm::algo::tof::Calibrate fCalibrate;
+  std::unique_ptr<cbm::algo::tof::Calibrate> fCalibrate;
 
   const CbmTsEventHeader* fTsHeader;
 
-- 
GitLab