diff --git a/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx b/reco/detectors/trd/unpack/CbmTrdUnpackAlgoBaseR.cxx index a5f566b0bd5f7f8ffe494600d841d75c7a55c055..49fef23eba274eb51b397c02a9d3664f6c2ac86e 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 d804a5c7adba7c079e6812f98223219be7378837..b50245f9a11662b356d1cf82810c101275222e51 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 10445c200756f6c4d022a1982b4c088abed4f4b6..318fde23a4a5496b436128a2e904a76c268c6fa8 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;