From 4d73a9c92095bce29d2cfbb725debe44dc9b4f4e Mon Sep 17 00:00:00 2001
From: Felix Weiglhofer <weiglhofer@fias.uni-frankfurt.de>
Date: Tue, 11 Jul 2023 22:28:58 +0200
Subject: [PATCH] cbmreco: Monitor output bytes for all detectors.

---
 algo/global/Reco.cxx             | 31 ++++++++++++++++++++++++-------
 algo/global/Reco.h               |  2 +-
 algo/unpack/Unpack.cxx           | 10 +++++-----
 algo/unpack/UnpackChain.cxx      | 11 ++++++++---
 core/data/much/CbmMuchDigiData.h |  3 +++
 core/data/rich/CbmRichDigiData.h |  2 ++
 core/data/trd/CbmTrdDigiData.h   |  2 ++
 7 files changed, 45 insertions(+), 16 deletions(-)

diff --git a/algo/global/Reco.cxx b/algo/global/Reco.cxx
index f40d61430a..2a01f59149 100644
--- a/algo/global/Reco.cxx
+++ b/algo/global/Reco.cxx
@@ -97,7 +97,7 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
   L_(info) << ">>> Processing TS " << ts.index();
   xpu::set<cbm::algo::Params>(Params());
 
-  std::vector<CbmStsDigi> digis;
+  Unpack::resultType unpackResult;
   UnpackMonitorData unpackMonitor;
 
   if (Opts().HasStep(Step::Unpack)) {
@@ -108,9 +108,8 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
         break;
       default:
       case RecoParams::UnpackMode::CPU:
-        auto result   = fUnpack.Run(ts);
-        digis         = result.first.fData.fSts.fDigis;
-        unpackMonitor = result.second;
+        unpackResult  = fUnpack.Run(ts);
+        unpackMonitor = unpackResult.second;
         break;
     }
   }
@@ -121,11 +120,11 @@ RecoResults Reco::Run(const fles::Timeslice& ts)
 
 
   if (Opts().HasStep(Step::LocalReco) && Opts().HasDetector(fles::Subsystem::STS))
-    fStsHitFinder(digiTs.fData.fSts.fDigis);
+    fStsHitFinder(unpackResult.first.fData.fSts.fDigis);
 
   xpu::timings ts_times = xpu::pop_timer();
 
-  QueueUnpackerMetrics(ts, unpackMonitor);
+  QueueUnpackerMetrics(ts, unpackMonitor, unpackResult.first);
 
   PrintTimings(ts_times);
 
@@ -162,10 +161,21 @@ void Reco::PrintTimings(xpu::timings& timings)
   }
 }
 
-void Reco::QueueUnpackerMetrics(const fles::Timeslice& ts, const UnpackMonitorData& monitor)
+void Reco::QueueUnpackerMetrics(const fles::Timeslice& ts, const UnpackMonitorData& monitor,
+                                const CbmDigiTimeslice& digis)
 {
   if (!HasMonitor()) return;
 
+  auto sizeBytes = [](const auto& d) { return d.size() * sizeof(d[0]); };
+
+  auto& stsDigis   = digis.fData.fSts.fDigis;
+  auto& muchDigis  = digis.fData.fMuch.fDigis;
+  auto& tofDigis   = digis.fData.fTof.fDigis;
+  auto& bmonDigis  = digis.fData.fT0.fDigis;
+  auto& trdDigis   = digis.fData.fTrd.fDigis;
+  auto& trd2dDigis = digis.fData.fTrd2d.fDigis;
+  auto& richDigis  = digis.fData.fRich.fDigis;
+
   GetMonitor().QueueMetric("cbmreco", {{"hostname", fles::system::current_hostname()}},
                            {
                              {"unpackBytesInSts", monitor.fNumBytesInSts},
@@ -175,6 +185,13 @@ void Reco::QueueUnpackerMetrics(const fles::Timeslice& ts, const UnpackMonitorDa
                              {"unpackBytesInTrd", monitor.fNumBytesInTrd},
                              {"unpackBytesInTrd2d", monitor.fNumBytesInTrd2d},
                              {"unpackBytesInRich", monitor.fNumBytesInRich},
+                             {"unpackBytesOutSts", sizeBytes(stsDigis)},
+                             {"unpackBytesOutMuch", sizeBytes(muchDigis)},
+                             {"unpackBytesOutTof", sizeBytes(tofDigis)},
+                             {"unpackBytesOutBmon", sizeBytes(bmonDigis)},
+                             {"unpackBytesOutTrd", sizeBytes(trdDigis)},
+                             {"unpackBytesOutTrd2d", sizeBytes(trd2dDigis)},
+                             {"unpackBytesOutRich", sizeBytes(richDigis)},
                              {"unpackNumErrInvalidEqId", monitor.fNumErrInvalidEqId},
                              {"unpackNumErrInvalidSysVer", monitor.fNumErrInvalidSysVer},
                            });
diff --git a/algo/global/Reco.h b/algo/global/Reco.h
index ed30d43d1c..8cd099c806 100644
--- a/algo/global/Reco.h
+++ b/algo/global/Reco.h
@@ -49,7 +49,7 @@ namespace cbm::algo
 
     void Validate(const Options& opts);
 
-    void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&);
+    void QueueUnpackerMetrics(const fles::Timeslice&, const UnpackMonitorData&, const CbmDigiTimeslice&);
   };
 }  // namespace cbm::algo
 
diff --git a/algo/unpack/Unpack.cxx b/algo/unpack/Unpack.cxx
index 2dbc219cdf..053383c12a 100644
--- a/algo/unpack/Unpack.cxx
+++ b/algo/unpack/Unpack.cxx
@@ -208,9 +208,9 @@ namespace cbm::algo
 
   // ----------------- Microslice loop ------------------------------------------
   template<class Digi, class UnpackAlgo, class MonitorData>
-  void Unpack::MsLoop(const fles::Timeslice* timeslice, std::map<uint16_t, UnpackAlgo>& algoMap, const uint64_t comp,
-                      const uint16_t eqId, std::vector<Digi>* digis, UnpackMonitorData& monitor,
-                      std::vector<MonitorData>* monitorMs, uint8_t sys_ver)
+  size_t Unpack::MsLoop(const fles::Timeslice* timeslice, std::map<uint16_t, UnpackAlgo>& algoMap, const uint64_t comp,
+                        const uint16_t eqId, std::vector<Digi>* digis, UnpackMonitorData& monitor,
+                        std::vector<MonitorData>* monitorMs, uint8_t sys_ver)
   {
     // --- Component log
     size_t numBytesInComp = 0;
@@ -223,13 +223,13 @@ namespace cbm::algo
     const auto algoIt = algoMap.find(eqId);
     if (algoIt == algoMap.end()) {
       monitor.fNumErrInvalidEqId++;
-      return;
+      return 0;
     }
     UnpackAlgo& algo = algoIt->second;
 
     if (timeslice->descriptor(comp, 0).sys_ver != sys_ver) {
       monitor.fNumErrInvalidSysVer++;
-      return;
+      return 0;
     }
 
     const uint64_t numMsInComp = timeslice->num_microslices(comp);
diff --git a/algo/unpack/UnpackChain.cxx b/algo/unpack/UnpackChain.cxx
index 52efc0a03d..153706642b 100644
--- a/algo/unpack/UnpackChain.cxx
+++ b/algo/unpack/UnpackChain.cxx
@@ -4,6 +4,7 @@
 #include "UnpackChain.h"
 
 using namespace cbm::algo;
+using fles::Subsystem;
 
 void UnpackChain::Init()
 {
@@ -17,9 +18,13 @@ Unpack::resultType UnpackChain::Run(const fles::Timeslice& timeslice)
 
   auto& digis = result.first.fData;
 
-  L_(info) << "Timeslice contains " << digis.fSts.Size() << " STS Digis";
-  L_(info) << "Timeslice contains " << digis.fTof.Size() << " TOF Digis";
-  L_(info) << "Timeslice contains " << digis.fT0.Size() << " T0 Digis";
+  if (Opts().HasDetector(Subsystem::STS)) L_(info) << "Timeslice contains " << digis.fSts.Size() << " STS Digis";
+  if (Opts().HasDetector(Subsystem::TOF)) L_(info) << "Timeslice contains " << digis.fTof.Size() << " TOF Digis";
+  if (Opts().HasDetector(Subsystem::BMON)) L_(info) << "Timeslice contains " << digis.fT0.Size() << " BMON Digis";
+  if (Opts().HasDetector(Subsystem::MUCH)) L_(info) << "Timeslice contains " << digis.fMuch.Size() << " MUCH Digis";
+  if (Opts().HasDetector(Subsystem::TRD)) L_(info) << "Timeslice contains " << digis.fTrd.Size() << " TRD Digis";
+  if (Opts().HasDetector(Subsystem::TRD2D)) L_(info) << "Timeslice contains " << digis.fTrd2d.Size() << " TRD2D Digis";
+  if (Opts().HasDetector(Subsystem::RICH)) L_(info) << "Timeslice contains " << digis.fRich.Size() << " RICH Digis";
 
   return result;
 }
diff --git a/core/data/much/CbmMuchDigiData.h b/core/data/much/CbmMuchDigiData.h
index 9e748a8334..4c3b2f08f2 100644
--- a/core/data/much/CbmMuchDigiData.h
+++ b/core/data/much/CbmMuchDigiData.h
@@ -43,6 +43,9 @@ public:
   /** @brief Clear content **/
   void Clear() { fDigis.clear(); }
 
+  /** @brief Size */
+  size_t Size() const { return fDigis.size(); }
+
   // --- ROOT serializer
 #ifndef NO_ROOT
   ClassDefNV(CbmMuchDigiData, 1);
diff --git a/core/data/rich/CbmRichDigiData.h b/core/data/rich/CbmRichDigiData.h
index 07597098c3..4e9c927d22 100644
--- a/core/data/rich/CbmRichDigiData.h
+++ b/core/data/rich/CbmRichDigiData.h
@@ -43,6 +43,8 @@ public:
   /** @brief Clear content **/
   void Clear() { fDigis.clear(); }
 
+  size_t Size() const { return fDigis.size(); }
+
   // --- ROOT serializer
 #ifndef NO_ROOT
   ClassDefNV(CbmRichDigiData, 1);
diff --git a/core/data/trd/CbmTrdDigiData.h b/core/data/trd/CbmTrdDigiData.h
index a3c3b750ce..4a7db7a23b 100644
--- a/core/data/trd/CbmTrdDigiData.h
+++ b/core/data/trd/CbmTrdDigiData.h
@@ -43,6 +43,8 @@ public:
   /** @brief Clear content **/
   void Clear() { fDigis.clear(); }
 
+  size_t Size() const { return fDigis.size(); }
+
   // --- ROOT serializer
 #ifndef NO_ROOT
   ClassDefNV(CbmTrdDigiData, 1);
-- 
GitLab