From 72fb0c6c0caa7199ff49ce09af74e048908a9af8 Mon Sep 17 00:00:00 2001
From: "P.-A. Loizeau" <p.-a.loizeau@gsi.de>
Date: Mon, 13 May 2024 08:36:29 +0200
Subject: [PATCH] Add Multiplicity plots in online DigiEvents Checker

---
 analysis/mcbm/CbmMcbm2024CheckEventsDt.cxx | 309 ++++++++++++---------
 analysis/mcbm/CbmMcbm2024CheckEventsDt.h   |  29 +-
 2 files changed, 186 insertions(+), 152 deletions(-)

diff --git a/analysis/mcbm/CbmMcbm2024CheckEventsDt.cxx b/analysis/mcbm/CbmMcbm2024CheckEventsDt.cxx
index 3a877667ab..c5278ded56 100644
--- a/analysis/mcbm/CbmMcbm2024CheckEventsDt.cxx
+++ b/analysis/mcbm/CbmMcbm2024CheckEventsDt.cxx
@@ -46,187 +46,226 @@ void CbmMcbm2024CheckEventsDt::Exec(Option_t*)
     TDirectory* oldDir = gDirectory;
     TFile* oldFile     = gFile;
     gROOT->cd();
-    fHistDtBmon  = new TH1I("histDtBmon", "Time difference to event seed, BMON; dt [ns]", 1000, -500., 500.);
-    fHistDtSts   = new TH1I("histDtSts", "Time difference to event seed, STS; dt [ns]", 1000, -500., 500.);
-    fHistDtMuch  = new TH1I("histDtMuch", "Time difference to event seed, MUCH; dt [ns]", 1000, -500., 500.);
-    fHistDtTrd1d = new TH1I("histDtTrd1d", "Time difference to event seed, TRD1D; dt [ns]", 1000, -500., 500.);
-    fHistDtTrd2d = new TH1I("histDtTrd2d", "Time difference to event seed, TRD2D; dt [ns]", 1000, -500., 500.);
-    fHistDtTof   = new TH1I("histDtTof", "Time difference to event seed, TOF; dt [ns]", 1000, -500., 500.);
-    fHistDtRich  = new TH1I("histDtRich", "Time difference to event seed, RICH; dt [ns]", 1000, -500., 500.);
-    fHistDtFsd   = new TH1I("histDtFsd", "Time difference to event seed, FSD; dt [ns]", 1000, -500., 500.);
-
-    fHistDtEvoBmon  = new TH2I("histDtEvoBmon", "Time difference to event seed vs TS, BMON; TS []; dt [ns]",  //
-                              100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoSts   = new TH2I("histDtEvoSts", "Time difference to event seed vs TS, STS; TS []; dt [ns]",  //
-                             100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoMuch  = new TH2I("histDtEvoMuch", "Time difference to event seed vs TS, MUCH; TS []; dt [ns",  //
-                              100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoTrd1d = new TH2I("histDtEvoTrd1d", "Time difference to event seed vs TS, TRD1D; TS []; dt [ns]",  //
-                               100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoTrd2d = new TH2I("histDtEvoTrd2d", "Time difference to event seed vs TS, TRD2D; TS []; dt [ns]",  //
-                               100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoTof   = new TH2I("histDtEvoTof", "Time difference to event seed vs TS, TOF; TS []; dt [ns]",  //
-                             100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoRich  = new TH2I("histDtEvoRich", "Time difference to event seed vs TS, RICH; TS []; dt [ns]",  //
-                              100, 0., 1000., 1000, -500., 500.);
-    fHistDtEvoFsd   = new TH2I("histDtEvoFsd", "Time difference to event seedvs TS, FSD; TS []; dt [ns]",  //
-                             100, 0., 1000., 1000, -500., 500.);
+
+    for (std::string sDet : fvDets) {
+      fHistDt[sDet]    = new TH1I(Form("histDt%s", sDet.data()),
+                               Form("Time difference to event seed, %s; dt [ns]", sDet.data()), 1000, -500., 500.);
+      fHistDtEvo[sDet] = new TH2I(Form("histDtEvo%s", sDet.data()),
+                                  Form("Time difference to event seed vs TS, %s; TS []; dt [ns]", sDet.data()),  //
+                                  100, 0., 1000., 1000, -500., 500.);
+
+      fHistDtToBmon[sDet] =
+        new TH1I(Form("histDtToBmon%s", sDet.data()),
+                 Form("Time difference to first/single BMon, %s; dt [ns]", sDet.data()), 1000, -500., 500.);
+      fHistDtToBmonEvo[sDet] =
+        new TH2I(Form("histDtToBmonEvo%s", sDet.data()),
+                 Form("Time difference to first/single BMon vs TS, %s; TS []; dt [ns]", sDet.data()),  //
+                 100, 0., 1000., 1000, -500., 500.);
+
+      fHistMul[sDet] =
+        new TH1I(Form("histMul%s", sDet.data()), Form("Nb %s digis per event; N []", sDet.data()), 100, -0.5, 99.5);
+      fHistDtMul[sDet] =
+        new TH2I(Form("histDtMul%s", sDet.data()), Form("Dt Bmon vs Nb %s digis per event; dt [ns]; N []", sDet.data()),
+                 1000, -500., 500., 100, -0.5, 99.5);
+    }
+
 
     fCanvDt = new TCanvas("canvDt", "Time differences to event seed");
     fCanvDt->Divide(3, 3);
 
-    fCanvDt->cd(1);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtBmon->Draw("hist");
-
-    fCanvDt->cd(2);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtSts->Draw("hist");
-
-    fCanvDt->cd(3);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtMuch->Draw("hist");
-
-    fCanvDt->cd(4);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtTrd1d->Draw("hist");
-
-    fCanvDt->cd(5);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtTrd2d->Draw("hist");
-
-    fCanvDt->cd(6);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtTof->Draw("hist");
-
-    fCanvDt->cd(7);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtRich->Draw("hist");
-
-    fCanvDt->cd(8);
-    gPad->SetLogy();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtFsd->Draw("hist");
+    uint32_t uPadIdx = 1;
+    for (std::string sDet : fvDets) {
+      fCanvDt->cd(uPadIdx);
+      gPad->SetLogy();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistDt[sDet]->Draw("hist");
+      uPadIdx++;
+    }
 
     fCanvDtEvo = new TCanvas("canvDtEvo", "Time differences to event seed vs TS");
     fCanvDtEvo->Divide(3, 3);
 
-    fCanvDtEvo->cd(1);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoBmon->Draw("colz");
-
-    fCanvDtEvo->cd(2);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoSts->Draw("colz");
-
-    fCanvDtEvo->cd(3);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoMuch->Draw("colz");
-
-    fCanvDtEvo->cd(4);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoTrd1d->Draw("colz");
-
-    fCanvDtEvo->cd(5);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoTrd2d->Draw("colz");
-
-    fCanvDtEvo->cd(6);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoTof->Draw("colz");
-
-    fCanvDtEvo->cd(7);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoRich->Draw("colz");
-
-    fCanvDtEvo->cd(8);
-    gPad->SetLogz();
-    gPad->SetGridx();
-    gPad->SetGridy();
-    fHistDtEvoFsd->Draw("colz");
+    uPadIdx = 1;
+    for (std::string sDet : fvDets) {
+      fCanvDtEvo->cd(uPadIdx);
+      gPad->SetLogz();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistDtEvo[sDet]->Draw("colz");
+      uPadIdx++;
+    }
+
+
+    fCanvDtToBmon = new TCanvas("canvDtToBmon", "Time differences to event seed");
+    fCanvDtToBmon->Divide(3, 3);
+
+    uPadIdx = 1;
+    for (std::string sDet : fvDets) {
+      fCanvDtToBmon->cd(uPadIdx);
+      gPad->SetLogy();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistDtToBmon[sDet]->Draw("hist");
+      uPadIdx++;
+    }
+
+    fCanvDtToBmonEvo = new TCanvas("canvDtToBmonEvo", "Time differences to event seed vs TS");
+    fCanvDtToBmonEvo->Divide(3, 3);
+
+    uPadIdx = 1;
+    for (std::string sDet : fvDets) {
+      fCanvDtToBmonEvo->cd(uPadIdx);
+      gPad->SetLogz();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistDtToBmonEvo[sDet]->Draw("colz");
+      uPadIdx++;
+    }
+
+    for (std::string sDet : fvDets) {
+      fCanvMul[sDet] = new TCanvas(Form("canvMul%s", sDet.data()), Form("Multiplicity %s", sDet.data()));
+      fCanvMul[sDet]->Divide(2);
+
+      fCanvMul[sDet]->cd(1);
+      gPad->SetLogy();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistMul[sDet]->Draw("hist");
+
+      fCanvMul[sDet]->cd(2);
+      gPad->SetLogz();
+      gPad->SetGridx();
+      gPad->SetGridy();
+      fHistDtMul[sDet]->Draw("colz");
+    }
 
     gFile      = oldFile;
     gDirectory = oldDir;
   }
 
   size_t numEventsInTs = 0;
+  std::string sDet     = "Bmon";
   for (auto& event : *fEvents) {
+    bool bSingleBmon         = false;
+    double_t dSingleBmonTime = 0.;
+    if (0 < event.fData.fBmon.Size()) {
+      if (1 == event.fData.fBmon.Size()) {
+        bSingleBmon = true;
+      }
+      dSingleBmonTime = event.fData.fBmon.fDigis[0].GetTime();
+    }
 
+    sDet = "Bmon";
+    fHistMul[sDet]->Fill(event.fData.fBmon.Size());
     for (auto& digi : event.fData.fBmon.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtBmon->Fill(dDt);
-      fHistDtEvoBmon->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fBmon.Size());
+
+      // Special case: make internal Dt to first BMon instead of Dt to single Bmon
+      dDt = digi.GetTime() - dSingleBmonTime;
+      fHistDtToBmon[sDet]->Fill(dDt);
+      fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
     }
 
+    sDet = "Sts";
+    fHistMul[sDet]->Fill(event.fData.fSts.Size());
     for (auto& digi : event.fData.fSts.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtSts->Fill(dDt);
-      fHistDtEvoSts->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fSts.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Much";
+    fHistMul[sDet]->Fill(event.fData.fMuch.Size());
     for (auto& digi : event.fData.fMuch.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtMuch->Fill(dDt);
-      fHistDtEvoMuch->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fMuch.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Trd1d";
+    fHistMul[sDet]->Fill(event.fData.fTrd.Size());
     for (auto& digi : event.fData.fTrd.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtTrd1d->Fill(dDt);
-      fHistDtEvoTrd1d->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fTrd.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Trd2d";
+    fHistMul[sDet]->Fill(event.fData.fTrd2d.Size());
     for (auto& digi : event.fData.fTrd2d.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtTrd2d->Fill(dDt);
-      fHistDtEvoTrd2d->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fTrd2d.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Tof";
+    fHistMul[sDet]->Fill(event.fData.fTof.Size());
     for (auto& digi : event.fData.fTof.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtTof->Fill(dDt);
-      fHistDtEvoTof->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fTof.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Rich";
+    fHistMul[sDet]->Fill(event.fData.fRich.Size());
     for (auto& digi : event.fData.fRich.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtRich->Fill(dDt);
-      fHistDtEvoRich->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fRich.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
 
+    sDet = "Fsd";
+    fHistMul[sDet]->Fill(event.fData.fFsd.Size());
     for (auto& digi : event.fData.fFsd.fDigis) {
       double_t dDt = digi.GetTime() - event.fTime;
-      fHistDtFsd->Fill(dDt);
-      fHistDtEvoFsd->Fill(fNumTs, dDt);
+      fHistDt[sDet]->Fill(dDt);
+      fHistDtEvo[sDet]->Fill(fNumTs, dDt);
+      fHistDtMul[sDet]->Fill(dDt, event.fData.fFsd.Size());
+      if (bSingleBmon) {
+        dDt = digi.GetTime() - dSingleBmonTime;
+        fHistDtToBmon[sDet]->Fill(dDt);
+        fHistDtToBmonEvo[sDet]->Fill(fNumTs, dDt);
+      }
     }
     numEventsInTs++;
   }
diff --git a/analysis/mcbm/CbmMcbm2024CheckEventsDt.h b/analysis/mcbm/CbmMcbm2024CheckEventsDt.h
index ac4fdbea5f..7b3cfb4236 100644
--- a/analysis/mcbm/CbmMcbm2024CheckEventsDt.h
+++ b/analysis/mcbm/CbmMcbm2024CheckEventsDt.h
@@ -64,27 +64,22 @@ class CbmMcbm2024CheckEventsDt : public FairTask {
   size_t fNumTs                            = 0;        ///< Number of processed timeslices
   size_t fNumEvents                        = 0;        ///< Number of events
 
-  TH1* fHistDtBmon  = nullptr;
-  TH1* fHistDtSts   = nullptr;
-  TH1* fHistDtMuch  = nullptr;
-  TH1* fHistDtTrd1d = nullptr;
-  TH1* fHistDtTrd2d = nullptr;
-  TH1* fHistDtTof   = nullptr;
-  TH1* fHistDtRich  = nullptr;
-  TH1* fHistDtFsd   = nullptr;
-
-  TH2* fHistDtEvoBmon  = nullptr;
-  TH2* fHistDtEvoSts   = nullptr;
-  TH2* fHistDtEvoMuch  = nullptr;
-  TH2* fHistDtEvoTrd1d = nullptr;
-  TH2* fHistDtEvoTrd2d = nullptr;
-  TH2* fHistDtEvoTof   = nullptr;
-  TH2* fHistDtEvoRich  = nullptr;
-  TH2* fHistDtEvoFsd   = nullptr;
+  std::vector<std::string> fvDets              = {"Bmon", "Sts", "Much", "Trd1d", "Trd2d", "Tof", "Rich", "Fsd"};
+  std::map<std::string, TH1*> fHistDt          = {};
+  std::map<std::string, TH2*> fHistDtEvo       = {};
+  std::map<std::string, TH1*> fHistDtToBmon    = {};
+  std::map<std::string, TH2*> fHistDtToBmonEvo = {};
+  std::map<std::string, TH1*> fHistMul         = {};
+  std::map<std::string, TH2*> fHistDtMul       = {};
 
   TCanvas* fCanvDt    = nullptr;
   TCanvas* fCanvDtEvo = nullptr;
 
+  TCanvas* fCanvDtToBmon    = nullptr;
+  TCanvas* fCanvDtToBmonEvo = nullptr;
+
+  std::map<std::string, TCanvas*> fCanvMul = {};
+
   ClassDef(CbmMcbm2024CheckEventsDt, 1);
 };
 
-- 
GitLab