From 6c60d616e2a645bf9ebdc847234488bca02b9e01 Mon Sep 17 00:00:00 2001
From: Axel Puntke <axel.puntke@uni-muenster.de>
Date: Mon, 9 May 2022 15:25:46 +0000
Subject: [PATCH] Add NT Correlation Plot to TRD Online Monitor

---
 .../trd/unpack/CbmTrdUnpackAlgoBaseR.cxx      |  1 +
 .../trd/unpack/CbmTrdUnpackMonitor.cxx        | 35 +++++++++++++++++++
 .../trd/unpack/CbmTrdUnpackMonitor.h          | 12 ++++++-
 3 files changed, 47 insertions(+), 1 deletion(-)

diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx
index a5f566b0bd..49fef23eba 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx
@@ -120,6 +120,7 @@ Bool_t CbmTrdUnpackAlgoBaseR::initParSet(CbmTrdParSetDigi* parset)
       asics = static_cast<CbmTrdParSetAsic*>((pair.second).get());
     }
     initOk &= fMonitor->Init(parset, asics);
+    fMonitor->SetDigiOutputVec(&fOutputVec);
   }
 
   return initOk;
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
index d804a5c7ad..b50245f9a1 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.cxx
@@ -205,6 +205,12 @@ void CbmTrdUnpackMonitor::createHisto(eDigiHistos kHisto)
         newhisto->SetXTitle("ChannelId");
         newhisto->SetYTitle("#DeltaT(Digi(n)-Digi(n-1)) [ns]");
         break;
+      case eDigiHistos::kDigiNtCorr:
+        newhisto = std::make_shared<TH2I>(histoname.data(), histoname.data(), nchannels, -0.5, (nchannels - 0.5),
+                                          nchannels, -0.5, (nchannels - 0.5));
+        newhisto->SetXTitle("NT AddressChannel");
+        newhisto->SetYTitle("ST AddressChannel");
+        break;
         // default: return; break;
     }
     LOG(debug) << Class_Name() << "::CreateHisto() HistoDigi " << static_cast<size_t>(kHisto) << " Module " << moduleid
@@ -391,6 +397,7 @@ void CbmTrdUnpackMonitor::fillHisto(CbmTrdDigi* digi, eDigiHistos kHisto, std::u
       break;
     }
     case eDigiHistos::kDigiDeltaT: histo->Fill(digi->GetAddressChannel(), getDeltaT(digi)); break;
+    case eDigiHistos::kDigiNtCorr: fillNtCorrHisto(histo, digi); break;
 
     default: return; break;
   }
@@ -464,6 +471,33 @@ std::double_t CbmTrdUnpackMonitor::getDeltaT(CbmTrdDigi* digi)
   }
 }
 
+// ---- fillNtCorrHisto ----
+void CbmTrdUnpackMonitor::fillNtCorrHisto(std::shared_ptr<TH1> histo, CbmTrdDigi* digi)
+{
+  Double_t newDigiTime    = digi->GetTime();
+  Int_t newDigiAddrCh     = digi->GetAddressChannel();
+  Int_t newDigiAddrModule = digi->GetAddressModule();
+
+  int nTrdDigis = fDigiOutputVec->size();
+
+  for (int iDigi = nTrdDigis - 1; iDigi > 0; --iDigi) {
+    const CbmTrdDigi digiRef = fDigiOutputVec->at(iDigi);
+
+    Double_t refDigiTime = digiRef.GetTime();
+
+    if (digiRef.GetAddressModule() == newDigiAddrModule) {
+      if (digiRef.GetTriggerType() == static_cast<Int_t>(CbmTrdDigi::eTriggerType::kNeighbor)
+          && digi->GetTriggerType() == static_cast<Int_t>(CbmTrdDigi::eTriggerType::kSelf))
+        histo->Fill(digiRef.GetAddressChannel(), newDigiAddrCh);
+      else if (digiRef.GetTriggerType() == static_cast<Int_t>(CbmTrdDigi::eTriggerType::kSelf)
+               && digi->GetTriggerType() == static_cast<Int_t>(CbmTrdDigi::eTriggerType::kNeighbor))
+        histo->Fill(newDigiAddrCh, digiRef.GetAddressChannel());
+    }
+
+    if (refDigiTime < newDigiTime - 500 /*|| iDigi < nTrdDigis - 20*/) break;
+  }
+}
+
 // ---- getHistoName ----
 std::string CbmTrdUnpackMonitor::getHistoName(eDigiHistos kHisto)
 {
@@ -481,6 +515,7 @@ std::string CbmTrdUnpackMonitor::getHistoName(eDigiHistos kHisto)
     case eDigiHistos::kChannel_Nt: histoname += "Channel_Nt"; break;
     case eDigiHistos::kTriggerType: histoname += "TriggerType"; break;
     case eDigiHistos::kDigiDeltaT: histoname += "DigiDeltaT"; break;
+    case eDigiHistos::kDigiNtCorr: histoname += "DigiNtCorr"; break;
   }
   return histoname;
 }
diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.h b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.h
index 10445c2007..318fde23a4 100644
--- a/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.h
+++ b/reco/detectors/trd/unpack/CbmTrdUnpackMonitor.h
@@ -63,7 +63,8 @@ public:
     kCharge_St,
     kCharge_Nt,
     kTriggerType,
-    kDigiDeltaT
+    kDigiDeltaT,
+    kDigiNtCorr
   };
 
   /** @brief Enum for the predefined raw histograms. */
@@ -143,6 +144,9 @@ public:
     fDoWriteToFile = true;
   }
 
+  /** @brief Set digi outpout vector (to make it usable for correlations) */
+  void SetDigiOutputVec(std::vector<CbmTrdDigi>* digiOutputVec) { fDigiOutputVec = digiOutputVec; }
+
 
 protected:
   template<class histotype>
@@ -319,6 +323,9 @@ protected:
     return nhistos;
   }
 
+  /** @brief Fill the NeighborTrigger Checking Histogram */
+  void fillNtCorrHisto(std::shared_ptr<TH1> histo, CbmTrdDigi* digi);
+
   // Member variables
   /** @brief Digi histogram pointers stored in a map together with the module id */
   std::map<eDigiHistos, std::map<std::uint32_t, std::shared_ptr<TH1>>> fDigiHistoMap = {};
@@ -363,6 +370,9 @@ protected:
   /** @brief Map with the last digi time for each channel of a given module */
   std::map<std::uint32_t, std::vector<size_t>> fLastDigiTimeMap = {};
 
+  /** @brief Variable which holds a reference to the TRD digi output vector (for correlations) */
+  std::vector<CbmTrdDigi>* fDigiOutputVec = {};
+
   // All other parameters and containers
   std::shared_ptr<CbmTrdSpadic> fSpadic = nullptr;
 
-- 
GitLab