From d687c5f03861f1c4e96e16d585b09047279e0bc4 Mon Sep 17 00:00:00 2001
From: Dominik Smith <smith@th.physik.uni-frankfurt.de>
Date: Tue, 23 Mar 2021 14:40:05 +0100
Subject: [PATCH] CbmAlgoBuildRawEvents: Implemented timing using TStopwatch.

---
 .../mcbm2020/unpack_tsa_mcbm_with_eb.C        |  7 +++---
 .../digis/CbmAlgoBuildRawEvents.cxx           | 25 ++++++++++++++++++-
 .../digis/CbmAlgoBuildRawEvents.h             | 14 ++++++++---
 .../digis/CbmTaskBuildRawEvents.h             |  5 ++++
 4 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C b/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C
index dc23fab9eb..29981ad068 100644
--- a/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C
+++ b/macro/beamtime/mcbm2020/unpack_tsa_mcbm_with_eb.C
@@ -634,6 +634,7 @@ Bool_t unpack_tsa_mcbm_with_eb(TString inFile       = "",
   CbmTaskBuildRawEvents* eventBuilder = new CbmTaskBuildRawEvents();
 
   eventBuilder->SetFillHistos(kTRUE);
+  eventBuilder->SetTimings(kTRUE);  //activate for diagnostic runs
 
   eventBuilder->SetEventOverlapMode(EOverlapModeRaw::NoOverlap);
   //  eventBuilder->SetEventOverlapMode(EOverlapModeRaw::MergeOverlap);
@@ -743,9 +744,9 @@ Bool_t unpack_tsa_mcbm_with_eb(TString inFile       = "",
   Double_t rtime = timer.RealTime();
   Double_t ctime = timer.CpuTime();
   std::cout << std::endl << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Macro finished successfully." << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Output file is " << unpOutFile << std::endl;
-  std::cout << ">>> unpack_tsa_mcbm: Real time " << rtime << " s, CPU time " << ctime << " s" << std::endl;
+  std::cout << ">>> unpack_tsa_mcbm_with_eb: Macro finished successfully." << std::endl;
+  std::cout << ">>> unpack_tsa_mcbm_with_eb: Output file is " << unpOutFile << std::endl;
+  std::cout << ">>> unpack_tsa_mcbm_with_eb: Real time " << rtime << " s, CPU time " << ctime << " s" << std::endl;
   std::cout << std::endl;
 
   /// --- Screen output for automatic tests
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
index 486597bb90..8b1882681c 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.cxx
@@ -31,6 +31,7 @@
 #include <TH1.h>
 #include <TH2.h>
 #include <THttpServer.h>
+#include <TStopwatch.h>
 
 template<>
 void CbmAlgoBuildRawEvents::LoopOnSeeds<Double_t>();
@@ -39,6 +40,11 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo()
 {
   LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Starting sequence";
 
+  if (fbGetTimings) {
+    fTimer = new TStopwatch;
+    fTimer->Start();
+  }
+
   /// Check if reference detector is set and seed data are available,
   /// otherwise look for explicit seed times
   if (fRefDet.detId == ECbmModuleId::kNotExist) {
@@ -73,12 +79,26 @@ Bool_t CbmAlgoBuildRawEvents::InitAlgo()
     }
   }
   if (fbFillHistos) { CreateHistograms(); }
+  if (fTimer != nullptr) { fTimer->Stop(); }
 
   LOG(info) << "CbmAlgoBuildRawEvents::InitAlgo => Done";
   return kTRUE;
 }
 
-void CbmAlgoBuildRawEvents::Finish() {}
+void CbmAlgoBuildRawEvents::Finish()
+{
+  if (fbGetTimings) { PrintTimings(); }
+}
+
+void CbmAlgoBuildRawEvents::PrintTimings()
+{
+  if (fTimer == nullptr) { LOG(fatal) << "Trying to print timings but timer not set"; }
+  else {
+    Double_t rtime = fTimer->RealTime();
+    Double_t ctime = fTimer->CpuTime();
+    LOG(info) << "CbmAlgoBuildRawEvents: Real time " << rtime << " s, CPU time " << ctime << " s";
+  }
+}
 
 void CbmAlgoBuildRawEvents::ClearEventVector()
 {
@@ -95,6 +115,7 @@ void CbmAlgoBuildRawEvents::ClearEventVector()
 void CbmAlgoBuildRawEvents::ProcessTs()
 {
   LOG_IF(info, fuNrTs % 1000 == 0) << "Begin of TS " << fuNrTs;
+  if (fTimer != nullptr) { fTimer->Start(kFALSE); }
   InitTs();
   InitSeedWindow();
   BuildEvents();
@@ -113,6 +134,8 @@ void CbmAlgoBuildRawEvents::ProcessTs()
 
   LOG(debug) << "Found " << fEventVector.size() << " triggered events";
   if (fbFillHistos) { FillHistos(); }
+  if (fTimer != nullptr) { fTimer->Stop(); }
+
   fuNrTs++;
 }
 
diff --git a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
index 9327618610..13730e12ae 100644
--- a/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmAlgoBuildRawEvents.h
@@ -38,6 +38,7 @@ class TClonesArray;
 class TH1;
 class TH2;
 class TNamed;
+class TStopwatch;
 class TCanvas;
 
 enum class EOverlapModeRaw
@@ -130,6 +131,10 @@ public:
   void SetFillHistos(Bool_t var) { fbFillHistos = var; }
   void ResetHistograms(Bool_t bResetTime = kTRUE);
 
+  /** stopwatch timing **/
+  void SetTimings(Bool_t var) { fbGetTimings = var; }
+  void PrintTimings();
+
   void SetReferenceDetector(ECbmModuleId refDet, ECbmDataType dataTypeIn, std::string sNameIn,
                             UInt_t uTriggerMinDigisIn = 0, Int_t iTriggerMaxDigisIn = -1,
                             Double_t fdTimeWinBegIn = -100, Double_t fdTimeWinEndIn = 100);
@@ -239,12 +244,15 @@ private:
 
   /// User parameters
   /// Control flags
-  Bool_t fbIgnoreTsOverlap = kFALSE;     //! Ignore data in Overlap part of the TS
-  Bool_t fbFillHistos {kTRUE};           //! Switch ON/OFF filling of histograms
-  Bool_t fbUseMuchBeamtimeDigi = kTRUE;  //! Switch between MUCH digi classes
+  Bool_t fbIgnoreTsOverlap = kFALSE;      //! Ignore data in Overlap part of the TS
+  Bool_t fbFillHistos {kTRUE};            //! Switch ON/OFF filling of histograms
+  Bool_t fbUseMuchBeamtimeDigi = kTRUE;   //! Switch between MUCH digi classes
+  Bool_t fbGetTimings          = kFALSE;  //! Measure CPU time using stopwatch
     /// Event building mode and detectors selection
   EOverlapModeRaw fOverMode {EOverlapModeRaw::AllowOverlap};
 
+  TStopwatch* fTimer = nullptr;  //! is create when fbGetTimings is set before init
+
   RawEventBuilderDetector fRefDet             = RawEventBuilderDetector(ECbmModuleId::kT0, ECbmDataType::kT0Digi, "T0");
   std::vector<RawEventBuilderDetector> fvDets = {
     RawEventBuilderDetector(ECbmModuleId::kSts, ECbmDataType::kStsDigi, "kSts"),
diff --git a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
index aa683472f5..deaf093bf6 100644
--- a/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
+++ b/reco/eventbuilder/digis/CbmTaskBuildRawEvents.h
@@ -115,6 +115,11 @@ public:
     if (nullptr != fpAlgo) fpAlgo->ChangeMuchBeamtimeDigiFlag(bFlagIn);
     fbUseMuchBeamtimeDigi = bFlagIn;
   }
+  void SetTimings(Bool_t bFlagIn = kTRUE)
+  {
+    if (nullptr != fpAlgo) fpAlgo->SetTimings(bFlagIn);
+  }
+
   void SetSeedTimeFiller(RawEventBuilderDetector seedDet);
   void AddSeedTimeFillerToList(RawEventBuilderDetector seedDet);
   void DumpSeedTimesFromDetList();
-- 
GitLab