From 4f4719df566e5b2aa4728330940dc4701968e447 Mon Sep 17 00:00:00 2001
From: Dominik Smith <smith@th.physik.uni-frankfurt.de>
Date: Fri, 23 Jul 2021 14:23:24 +0200
Subject: [PATCH] Added deconstructor to CbmStsUnpackMonitor which deletes all
 histograms and canvases. Set axes of several histograms to adaptive and
 adjusted ranges to account for new timing convention.

---
 .../detectors/sts/unpack/CbmStsUnpackAlgo.cxx |  9 +---
 .../sts/unpack/CbmStsUnpackMonitor.cxx        | 47 ++++++++++++-------
 .../sts/unpack/CbmStsUnpackMonitor.h          |  2 -
 3 files changed, 33 insertions(+), 25 deletions(-)

diff --git a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
index d9e52e169b..7eb60a6fd6 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackAlgo.cxx
@@ -33,7 +33,6 @@ uint32_t CbmStsUnpackAlgo::getAsicIndex(uint32_t dpbidx, uint32_t crobidx, uint1
   if (febtype == 1) asicidx = fElinkIdxToAsicIdxVec.at(elinkidx).second;
   // else would be inactive feb, this was not handled in the previous implementation, this I expect it should not happen
 
-
   uint32_t uAsicIdx = (dpbidx * fNrCrobPerDpb + crobidx) * fNrAsicsPerCrob + asicidx;
   return uAsicIdx;
 }
@@ -82,7 +81,6 @@ void CbmStsUnpackAlgo::initDpbIdIndexMap(CbmMcbm2018StsPar* parset)
   }
 }
 
-
 // ---- initParSet(FairParGenericSet* parset) ----
 Bool_t CbmStsUnpackAlgo::initParSet(FairParGenericSet* parset)
 {
@@ -509,8 +507,8 @@ void CbmStsUnpackAlgo::processHitInfo(const stsxyter::Message& mess)
       auto tsreltime =
         static_cast<uint64_t>((ulHitTime - (fTsStartTime / stsxyter::kdClockCycleNs)) * stsxyter::kdClockCycleNs);
 */
-      double_t tsreltime = ulHitTime * stsxyter::kdClockCycleNs;
-      double dTimeInNs   = tsreltime - fSystemTimeOffset;
+      const double_t tsreltime = ulHitTime * stsxyter::kdClockCycleNs;
+      double dTimeInNs         = tsreltime - fSystemTimeOffset;
       if (uAsicIdx < fvdTimeOffsetNsAsics.size()) dTimeInNs -= fvdTimeOffsetNsAsics[uAsicIdx];
 
       const uint64_t ulTimeInNs = static_cast<uint64_t>(dTimeInNs);
@@ -520,10 +518,7 @@ void CbmStsUnpackAlgo::processHitInfo(const stsxyter::Message& mess)
         LOG(error) << Form("Digi on disabled FEB %02u has address 0x%08x and side %d", uFebIdx, fviFebAddress[uFebIdx],
                            fviFebSide[uFebIdx]);
       }
-
       fOutputVec.emplace_back(CbmStsDigi(fviFebAddress[uFebIdx], uChanInMod, ulTimeInNs, dCalAdc));
-      // REMARK This seems to be double looping, I do not see any reason here, to first store the stsxyter hits in a vector over which we loop afterwards again. May be I miss something @sts-experts?
-      //   fvmHitsInMs.push_back(stsxyter::FinalHit(ulHitTime, usRawAdc, uAsicIdx, usChan, fuCurrDpbIdx, uCrobIdx));
     }
   }
 
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackMonitor.cxx b/reco/detectors/sts/unpack/CbmStsUnpackMonitor.cxx
index 975ea19115..5c8185eb62 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackMonitor.cxx
+++ b/reco/detectors/sts/unpack/CbmStsUnpackMonitor.cxx
@@ -30,7 +30,17 @@ CbmStsUnpackMonitor::CbmStsUnpackMonitor(/* args */) : fvpAllHistoPointers()
   }
 }
 
-CbmStsUnpackMonitor::~CbmStsUnpackMonitor() {}
+CbmStsUnpackMonitor::~CbmStsUnpackMonitor()
+{
+  for (auto iter = fvpAllHistoPointers.begin(); iter != fvpAllHistoPointers.end();) {
+    if (iter->first != nullptr) { delete iter->first; }
+    iter = fvpAllHistoPointers.erase(iter);
+  }
+  for (auto iter = fvpAllCanvasPointers.begin(); iter != fvpAllCanvasPointers.end();) {
+    if (iter->first != nullptr) { delete iter->first; }
+    iter = fvpAllCanvasPointers.erase(iter);
+  }
+}
 
 Bool_t CbmStsUnpackMonitor::CreateHistograms(CbmMcbm2018StsPar* pUnpackPar)
 {
@@ -42,11 +52,12 @@ Bool_t CbmStsUnpackMonitor::CreateHistograms(CbmMcbm2018StsPar* pUnpackPar)
   const UInt_t uNbChanPerFeb  = pUnpackPar->GetNbChanPerFeb();
 
   /// Create general unpacking histograms
-  fhDigisTimeInRun =
-    new TH1I("hStsDigisTimeInRun", "Digis Nb vs Time in Run; Time in run [s]; Digis Nb []", 36000, 0, 3600);
+  fhDigisTimeInRun = new TH1I("hStsDigisTimeInRun", "Digis Nb vs Time in Run; Time in run [s]; Digis Nb []", 10, 0, 1);
+  fhDigisTimeInRun->SetCanExtend(TH1::kAllAxes);
   AddHistoToVector(fhDigisTimeInRun, "");
 
-  fhVectorSize = new TH1I("fhVectorSize", "Size of the vector VS TS index; TS index; Size [bytes]", 10000, 0., 10000.);
+  fhVectorSize = new TH1I("fhVectorSize", "Size of the vector VS TS index; TS index; Size [bytes]", 10, 0, 10);
+  fhVectorSize->SetCanExtend(TH1::kAllAxes);
   AddHistoToVector(fhVectorSize, "");
 
   fhVectorCapacity =
@@ -62,13 +73,15 @@ Bool_t CbmStsUnpackMonitor::CreateHistograms(CbmMcbm2018StsPar* pUnpackPar)
   /// Hit rates evo per FEB in system
   sHistName              = "hStsAllFebsHitRateEvo";
   title                  = "Hits per second & FEB; Time [s]; FEB []; Hits []";
-  fhStsAllFebsHitRateEvo = new TH2I(sHistName, title, 1800, 0, 1800, uNbFebs, -0.5, uNbFebs - 0.5);
+  fhStsAllFebsHitRateEvo = new TH2I(sHistName, title, 5, 0, 5, uNbFebs, -0.5, uNbFebs - 0.5);
+  fhStsAllFebsHitRateEvo->SetCanExtend(TH1::kAllAxes);
   AddHistoToVector(fhStsAllFebsHitRateEvo, "");
 
   /// Hit rates evo per ASIC in system
   sHistName               = "hStsAllAsicsHitRateEvo";
   title                   = "Hits per second & ASIC; Time [s]; ASIC []; Hits []";
-  fhStsAllAsicsHitRateEvo = new TH2I(sHistName, title, 1800, 0, 1800, uNbAsics, -0.5, uNbAsics - 0.5);
+  fhStsAllAsicsHitRateEvo = new TH2I(sHistName, title, 5, 0, 5, uNbAsics, -0.5, uNbAsics - 0.5);
+  fhStsAllAsicsHitRateEvo->SetCanExtend(TH1::kAllAxes);
   AddHistoToVector(fhStsAllAsicsHitRateEvo, "");
 
   /// Hit counts map in system
@@ -141,40 +154,42 @@ Bool_t CbmStsUnpackMonitor::CreateHistograms(CbmMcbm2018StsPar* pUnpackPar)
     title     = Form("Missed Evt flags per second & channel in FEB #%03u; Time "
                  "[s]; Channel []; Missed Evt flags []",
                  uFebIdx);
-    fvhStsFebChanMissEvtEvo.push_back(
-      new TH2I(sHistName, title, 1800, 0, 1800, uNbChanPerFeb, -0.5, uNbChanPerFeb - 0.5));
+    fvhStsFebChanMissEvtEvo.push_back(new TH2I(sHistName, title, 5, 0, 5, uNbChanPerFeb, -0.5, uNbChanPerFeb - 0.5));
+    fvhStsFebChanMissEvtEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Missed event flag counts evolution
     sHistName = Form("hStsFebAsicMissEvtEvo_%03u", uFebIdx);
     title     = Form("Missed Evt flags per second & StsXyter in FEB #%03u; Time "
                  "[s]; Asic []; Missed Evt flags []",
                  uFebIdx);
-    fvhStsFebAsicMissEvtEvo.push_back(
-      new TH2I(sHistName, title, 1800, 0, 1800, uNbAsicsPerFeb, -0.5, uNbAsicsPerFeb - 0.5));
+    fvhStsFebAsicMissEvtEvo.push_back(new TH2I(sHistName, title, 5, 0, 5, uNbAsicsPerFeb, -0.5, uNbAsicsPerFeb - 0.5));
+    fvhStsFebAsicMissEvtEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Missed event flag counts evolution
     sHistName = Form("hStsFebMissEvtEvo_%03u", uFebIdx);
     title     = Form("Missed Evt flags per second & channel in FEB #%03u; Time "
                  "[s]; Missed Evt flags []",
                  uFebIdx);
-    fvhStsFebMissEvtEvo.push_back(new TH1I(sHistName, title, 1800, 0, 1800));
+    fvhStsFebMissEvtEvo.push_back(new TH1I(sHistName, title, 5, 0, 5));
+    fvhStsFebMissEvtEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Hit rates evo per channel
     sHistName = Form("hStsFebChanRateEvo_%03u", uFebIdx);
     title     = Form("Hits per second & channel in FEB #%03u; Time [s]; Channel []; Hits []", uFebIdx);
-    fvhStsFebChanHitRateEvo.push_back(
-      new TH2I(sHistName, title, 1800, 0, 1800, uNbChanPerFeb, -0.5, uNbChanPerFeb - 0.5));
+    fvhStsFebChanHitRateEvo.push_back(new TH2I(sHistName, title, 5, 0, 5, uNbChanPerFeb, -0.5, uNbChanPerFeb - 0.5));
+    fvhStsFebChanHitRateEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Hit rates evo per StsXyter
     sHistName = Form("hStsFebAsicRateEvo_%03u", uFebIdx);
     title     = Form("Hits per second & StsXyter in FEB #%03u; Time [s]; Asic []; Hits []", uFebIdx);
-    fvhStsFebAsicHitRateEvo.push_back(
-      new TH2I(sHistName, title, 1800, 0, 1800, uNbAsicsPerFeb, -0.5, uNbAsicsPerFeb - 0.5));
+    fvhStsFebAsicHitRateEvo.push_back(new TH2I(sHistName, title, 5, 0, 5, uNbAsicsPerFeb, -0.5, uNbAsicsPerFeb - 0.5));
+    fvhStsFebAsicHitRateEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Hit rates evo per FEB
     sHistName = Form("hStsFebRateEvo_%03u", uFebIdx);
     title     = Form("Hits per second in FEB #%03u; Time [s]; Hits []", uFebIdx);
-    fvhStsFebHitRateEvo.push_back(new TH1I(sHistName, title, 1800, 0, 1800));
+    fvhStsFebHitRateEvo.push_back(new TH1I(sHistName, title, 5, 0, 5));
+    fvhStsFebHitRateEvo.back()->SetCanExtend(TH1::kAllAxes);
 
     /// Hit rates evo per channel, 1 minute bins, 24h
     sHistName = Form("hStsFebChanRateEvoLong_%03u", uFebIdx);
diff --git a/reco/detectors/sts/unpack/CbmStsUnpackMonitor.h b/reco/detectors/sts/unpack/CbmStsUnpackMonitor.h
index 29c76af75d..8246c93201 100644
--- a/reco/detectors/sts/unpack/CbmStsUnpackMonitor.h
+++ b/reco/detectors/sts/unpack/CbmStsUnpackMonitor.h
@@ -19,8 +19,6 @@
 
 #include "StsXyterMessage.h"
 
-/** @remark On pointers to histograms: Why not use shared pointers here, than you do not need to take care of deleting them. Right now I think you have a massive memory leak. PR */
-
 class CbmQaCanvas;
 
 class CbmStsUnpackMonitor {
-- 
GitLab