From cae7016de0f605f9d03bdc87db58e33eaa6cceb5 Mon Sep 17 00:00:00 2001 From: P-A Loizeau <p.-a.loizeau@gsi.de> Date: Tue, 30 Jun 2020 16:01:05 +0200 Subject: [PATCH] mCBM 2020: bring task classes to mCBM branch stand - CbmCheckEvents.cxx ==> AddMUCH + digi manager support - CbmCheckTiming.h ==> Add TRD support ==> Change sign of time diff to have T0 as reference time ==> Set binning to clock cycle if compatible - CbmMcbm2018EventBuilder.h ==> Add TRD support ==> Add support for CbmMuchDigi (Simu) + CbmMuchBeamTimeDigi (real data) ==> Better monitor histos handling - CbmMcbm2019CheckPulser.h ==> Add support for TRD + selection by address for some of the detectors --- fles/mcbm2018/tasks/CbmCheckEvents.cxx | 3 +- fles/mcbm2018/tasks/CbmCheckTiming.cxx | 154 +++++--- fles/mcbm2018/tasks/CbmCheckTiming.h | 14 + .../tasks/CbmMcbm2018EventBuilder.cxx | 145 +++++++- fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h | 21 +- .../mcbm2018/tasks/CbmMcbm2019CheckPulser.cxx | 330 +++++++++++++++--- fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.h | 64 +++- 7 files changed, 623 insertions(+), 108 deletions(-) diff --git a/fles/mcbm2018/tasks/CbmCheckEvents.cxx b/fles/mcbm2018/tasks/CbmCheckEvents.cxx index 3bfa711d..fc35bcbe 100644 --- a/fles/mcbm2018/tasks/CbmCheckEvents.cxx +++ b/fles/mcbm2018/tasks/CbmCheckEvents.cxx @@ -65,6 +65,7 @@ InitStatus CbmCheckEvents::Init() // DigiManager fDigiMan = CbmDigiManager::Instance(); + fDigiMan->UseMuchBeamTimeDigi(); fDigiMan->Init(); // Get a pointer to the previous already existing data level @@ -186,7 +187,7 @@ void CbmCheckEvents::AnalyseEvent(CbmEvent* event) // difference between the digis GetTimeDiffT0(event, fT0DeltaT, fT0InEvent); GetTimeDiff<CbmStsDigi>(event, fStsDeltaT, fStsInEvent, ECbmDataType::kStsDigi); - GetTimeDiff<CbmMuchDigi>(event, fMuchDeltaT, fMuchInEvent, ECbmDataType::kMuchDigi); + GetTimeDiff<CbmMuchBeamTimeDigi>(event, fMuchDeltaT, fMuchInEvent, ECbmDataType::kMuchDigi); GetTimeDiff<CbmTofDigi>(event, fTofDeltaT, fTofInEvent, ECbmDataType::kTofDigi); } diff --git a/fles/mcbm2018/tasks/CbmCheckTiming.cxx b/fles/mcbm2018/tasks/CbmCheckTiming.cxx index ad8f0d68..90f78c37 100644 --- a/fles/mcbm2018/tasks/CbmCheckTiming.cxx +++ b/fles/mcbm2018/tasks/CbmCheckTiming.cxx @@ -11,6 +11,7 @@ #include "CbmStsDigi.h" #include "CbmMuchBeamTimeDigi.h" #include "CbmRichDigi.h" +#include "CbmTrdDigi.h" #include "CbmTofDigi.h" #include "CbmPsdDigi.h" #include "CbmFlesHistosTools.h" @@ -81,6 +82,10 @@ InitStatus CbmCheckTiming::Init() LOG(info) << "No MUCH digis found."; } + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) ) { + LOG(info) << "No TRD digis found."; + } + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { LOG(info) << "No TOF digis found."; } @@ -110,6 +115,9 @@ Int_t CbmCheckTiming::CalcNrBins(Int_t offsetRange) { fBinWidth = 100; } + if( (static_cast< Double_t >(offsetRange)/ 6.25 ) == ( offsetRange / 6.25 ) ) + return (offsetRange/6.25 *2); + return (offsetRange/fBinWidth *2); } @@ -124,107 +132,124 @@ void CbmCheckTiming::CreateHistos() Int_t nrOfBinsSts = CalcNrBins(fStsOffsetRange); // T0 vs. Sts - fT0StsDiff = new TH1F("fT0StsDiff","T0-Sts;time diff [ns];Counts", + fT0StsDiff = new TH1D("fT0StsDiff","Sts-T0;time diff [ns];Counts", nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); - fT0StsDiffCharge = new TH2F("fT0StsDiffCharge","T0-Sts;time diff [ns]; Charge [a.u]; Counts", + fT0StsDiffCharge = new TH2F("fT0StsDiffCharge","Sts-T0;time diff [ns]; Charge [a.u]; Counts", nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange, 256, 0, 256 ); - fT0StsDiffEvo = new TH2F("fT0StsDiffEvo","T0-Sts;TS; time diff [ns];Counts", + fT0StsDiffEvo = new TH2F("fT0StsDiffEvo","Sts-T0;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); Int_t nrOfBinsMuch = CalcNrBins(fMuchOffsetRange); // T0 vs. Much - fT0MuchDiff = new TH1F("fT0MuchDiff","T0-Much;time diff [ns];Counts", + fT0MuchDiff = new TH1D("fT0MuchDiff","Much-T0;time diff [ns];Counts", nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); - fT0MuchDiffCharge = new TH2F("fT0MuchDiffCharge","T0-Much;time diff [ns]; Charge [a.u]; ;Counts", + fT0MuchDiffCharge = new TH2F("fT0MuchDiffCharge","Much-T0;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange, 256, 0, 256 ); - fT0MuchDiffEvo = new TH2F("fT0MuchDiffEvo","T0-Much;TS; time diff [ns];Counts", + fT0MuchDiffEvo = new TH2F("fT0MuchDiffEvo","Much-T0;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); + Int_t nrOfBinsTrd = CalcNrBins(fTrdOffsetRange); + // To vs. Trd + fT0TrdDiff = new TH1D("fT0TrdDiff","Trd-T0;time diff [ns];Counts", + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); + + fT0TrdDiffCharge = new TH2F("fT0TrdDiffCharge","Trd-T0;time diff [ns]; Charge [a.u]; ;Counts", + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange, + 256, 0, 256 + ); + + fT0TrdDiffEvo = new TH2F("fT0TrdDiffEvo","Trd-T0;TS; time diff [ns];Counts", + 1000, 0, 10000, + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); Int_t nrOfBinsTof = CalcNrBins(fTofOffsetRange); // To vs. Tof - fT0TofDiff = new TH1F("fT0TofDiff","T0-Tof;time diff [ns];Counts", + fT0TofDiff = new TH1D("fT0TofDiff","Tof-T0;time diff [ns];Counts", nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange); - fT0TofDiffCharge = new TH2F("fT0TofDiffCharge","T0-Tof;time diff [ns]; Charge [a.u]; ;Counts", + fT0TofDiffCharge = new TH2F("fT0TofDiffCharge","Tof-T0;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange, 256, 0, 256 ); - fT0TofDiffEvo = new TH2F("fT0TofDiffEvo","T0-Tof;TS; time diff [ns];Counts", + fT0TofDiffEvo = new TH2F("fT0TofDiffEvo","Tof-T0;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange); Int_t nrOfBinsRich = CalcNrBins(fRichOffsetRange); // To vs. Rich - fT0RichDiff = new TH1F("fT0RichDiff","T0-Rich;time diff [ns];Counts", + fT0RichDiff = new TH1D("fT0RichDiff","Rich-T0;time diff [ns];Counts", nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange); - fT0RichDiffCharge = new TH2F("fT0RichDiffCharge","T0-Rich;time diff [ns]; Charge [a.u]; ;Counts", + fT0RichDiffCharge = new TH2F("fT0RichDiffCharge","Rich-T0;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange, 256, 0, 256 ); - fT0RichDiffEvo = new TH2F("fT0RichDiffEvo","T0-Rich;TS; time diff [ns];Counts", + fT0RichDiffEvo = new TH2F("fT0RichDiffEvo","Rich-T0;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange); Int_t nrOfBinsPsd = CalcNrBins(fPsdOffsetRange); // To vs. Psd - fT0PsdDiff = new TH1F("fT0PsdDiff","T0-Psd;time diff [ns];Counts", + fT0PsdDiff = new TH1D("fT0PsdDiff","Psd-T0;time diff [ns];Counts", nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange); - fT0PsdDiffCharge = new TH2F("fT0PsdDiffCharge","T0-Psd;time diff [ns]; Charge [a.u]; ;Counts", + fT0PsdDiffCharge = new TH2F("fT0PsdDiffCharge","Psd-T0;time diff [ns]; Charge [a.u]; ;Counts", nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange, 7000, 0, 70000 ); - fT0PsdDiffEvo = new TH2F("fT0PsdDiffEvo","T0-Psd;TS; time diff [ns];Counts", + fT0PsdDiffEvo = new TH2F("fT0PsdDiffEvo","Psd-T0;TS; time diff [ns];Counts", 1000, 0, 10000, nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange); // T0 vs. Sts - fT0StsDiffEvoLong = new TH2F("fT0StsDiffEvoLong","T0-Sts;TS; time diff [ns];Counts", + fT0StsDiffEvoLong = new TH2F("fT0StsDiffEvoLong","Sts-T0;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); // T0 vs. Much - fT0MuchDiffEvoLong = new TH2F("fT0MuchDiffEvoLong","T0-Much;TS; time diff [ns];Counts", + fT0MuchDiffEvoLong = new TH2F("fT0MuchDiffEvoLong","Much-T0;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); + // To vs. Trd + fT0TrdDiffEvoLong = new TH2F("fT0TrdDiffEvoLong","Trd-T0;TS; time diff [ns];Counts", + 1800, 0, 180000, + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); // To vs. Tof - fT0TofDiffEvoLong = new TH2F("fT0TofDiffEvoLong","T0-Tof;TS; time diff [ns];Counts", + fT0TofDiffEvoLong = new TH2F("fT0TofDiffEvoLong","Tof-T0;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange); // To vs. Rich - fT0RichDiffEvoLong = new TH2F("fT0RichDiffEvoLong","T0-Rich;TS; time diff [ns];Counts", + fT0RichDiffEvoLong = new TH2F("fT0RichDiffEvoLong","Rich-T0;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange); // To vs. Psd - fT0PsdDiffEvoLong = new TH2F("fT0PsdDiffEvoLong","T0-Psd;TS; time diff [ns];Counts", + fT0PsdDiffEvoLong = new TH2F("fT0PsdDiffEvoLong","Psd-T0;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange); // T0 vs. STS for the different DPBs - fT0StsDpbDiff = new TH2F("fT0StsDpbDiff","T0-Much;DPB; time diff [ns];Counts", + fT0StsDpbDiff = new TH2F("fT0StsDpbDiff","Much-T0;DPB; time diff [ns];Counts", 2, -0.5, 1.5, nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); for( UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb ) { fT0StsDpbDiffEvo[uStsDpb] = new TH2F( Form("fT0StsDpbDiffEvo%02u", uStsDpb), - Form( "T0-STS DPB %02u;TS; time diff [ns];Counts", uStsDpb), + Form( "Sts-T0 DPB %02u;TS; time diff [ns];Counts", uStsDpb), 1800, 0, 180000, nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); fStsDpbCntsEvo[uStsDpb] = new TH1F( Form("fStsDpbCntsEvo%02u", uStsDpb), @@ -233,16 +258,16 @@ void CbmCheckTiming::CreateHistos() } // for( UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb ) // T0 vs. Much for the different DPBs/AFCK - fT0MuchRocDiff = new TH2F("fT0MuchRocDiff","T0-Much;AFCK; time diff [ns];Counts", + fT0MuchRocDiff = new TH2F("fT0MuchRocDiff","Much-T0;AFCK; time diff [ns];Counts", kuMaxNbMuchDpbs, -0.5, kuMaxNbMuchDpbs - 0.5, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); // T0 vs. Much for the different ASICs - fT0MuchAsicDiff = new TH2F("fT0MuchAsicDiff","T0-Much;ASIC; time diff [ns];Counts", + fT0MuchAsicDiff = new TH2F("fT0MuchAsicDiff","Much-T0;ASIC; time diff [ns];Counts", kuMaxNbMuchAsics, -0.5, kuMaxNbMuchAsics - 0.5, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); for( UInt_t uMuchAsic = 0; uMuchAsic < kuMaxNbMuchAsics; ++uMuchAsic ) fT0MuchAsicDiffEvo[uMuchAsic] = new TH2F( Form("fT0MuchAsicDiffEvo%02u", uMuchAsic), - Form( "T0-Much ASIC %02u;TS; time diff [ns];Counts", uMuchAsic), + Form( "Much-T0 ASIC %02u;TS; time diff [ns];Counts", uMuchAsic), 1800, 0, 180000, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); @@ -255,6 +280,9 @@ void CbmCheckTiming::CreateHistos() // Much vs. Much fMuchMuchDiff = new TH1F("fMuchMuchDiff","Much-Much_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog); + // Trd vs. Trd + fTrdTrdDiff = new TH1F("fTrdTrdDiff","Trd-Trd_prev;time diff [ns];Counts", + iNbBinsLog, dBinsLog); // Tof vs. Tof fTofTofDiff = new TH1F("fTofTofDiff","Tof-Tof_prev;time diff [ns];Counts", iNbBinsLog, dBinsLog); @@ -271,15 +299,17 @@ void CbmCheckTiming::CreateHistos() fT0Channel = new TH1F("fT0Channel","T0 channel;channel nr;Counts", 100, -0.5, 99.5); - fSelT0StsDiff = new TH1F("fSelT0StsDiff","T0-Sts if T0 in coinc with TOF;time diff [ns];Counts", + fSelT0StsDiff = new TH1F("fSelT0StsDiff","Sts-T0 if T0 in coinc with TOF;time diff [ns];Counts", nrOfBinsSts, -fStsOffsetRange, fStsOffsetRange); - fSelT0MuchDiff = new TH1F("fSelT0MuchDiff","T0-Much if T0 in coinc with TOF;time diff [ns];Counts", + fSelT0MuchDiff = new TH1F("fSelT0MuchDiff","Much-T0 if T0 in coinc with TOF;time diff [ns];Counts", nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); - fSelT0TofDiff = new TH1F("fSelT0TofDiff","T0-Tof if T0 in coinc with TOF;time diff [ns];Counts", + fSelT0TrdDiff = new TH1F("fSelT0TrdDiff","Trd-T0 if T0 in coinc with TOF;time diff [ns];Counts", + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); + fSelT0TofDiff = new TH1F("fSelT0TofDiff","Tof-T0 if T0 in coinc with TOF;time diff [ns];Counts", nrOfBinsTof, -fTofOffsetRange, fTofOffsetRange); - fSelT0RichDiff = new TH1F("fSelT0RichDiff","T0-Rich if T0 in coinc with TOF;time diff [ns];Counts", + fSelT0RichDiff = new TH1F("fSelT0RichDiff","Rich-T0 if T0 in coinc with TOF;time diff [ns];Counts", nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange); - fSelT0PsdDiff = new TH1F("fSelT0PsdDiff","T0-Psd if T0 in coinc with TOF;time diff [ns];Counts", + fSelT0PsdDiff = new TH1F("fSelT0PsdDiff","Psd-T0 if T0 in coinc with TOF;time diff [ns];Counts", nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange); /// Cleanup array of log bins @@ -292,27 +322,32 @@ void CbmCheckTiming::CreateHistos() if( nullptr != server ) { server->Register("/CheckTiming", fT0StsDiff); server->Register("/CheckTiming", fT0MuchDiff); + server->Register("/CheckTiming", fT0TrdDiff); server->Register("/CheckTiming", fT0TofDiff); server->Register("/CheckTiming", fT0RichDiff); server->Register("/CheckTiming", fT0PsdDiff); server->Register("/CheckTiming", fT0StsDiffCharge); server->Register("/CheckTiming", fT0MuchDiffCharge); + server->Register("/CheckTiming", fT0TrdDiffCharge); server->Register("/CheckTiming", fT0TofDiffCharge); server->Register("/CheckTiming", fT0RichDiffCharge); server->Register("/CheckTiming", fT0PsdDiffCharge); server->Register("/CheckTiming", fT0StsDiffEvo); server->Register("/CheckTiming", fT0MuchDiffEvo); + server->Register("/CheckTiming", fT0TrdDiffEvo); server->Register("/CheckTiming", fT0TofDiffEvo); server->Register("/CheckTiming", fT0RichDiffEvo); server->Register("/CheckTiming", fT0PsdDiffEvo); server->Register("/CheckTiming", fT0StsDiffEvoLong); server->Register("/CheckTiming", fT0MuchDiffEvoLong); + server->Register("/CheckTiming", fT0TrdDiffEvoLong); server->Register("/CheckTiming", fT0TofDiffEvoLong); server->Register("/CheckTiming", fT0RichDiffEvoLong); server->Register("/CheckTiming", fT0PsdDiffEvoLong); server->Register("/CheckTiming", fT0T0Diff); server->Register("/CheckTiming", fStsStsDiff); server->Register("/CheckTiming", fMuchMuchDiff); + server->Register("/CheckTiming", fTrdTrdDiff); server->Register("/CheckTiming", fTofTofDiff); server->Register("/CheckTiming", fRichRichDiff); server->Register("/CheckTiming", fPsdPsdDiff); @@ -328,6 +363,7 @@ void CbmCheckTiming::CreateHistos() server->Register("/CheckTiming", fSelT0StsDiff); server->Register("/CheckTiming", fSelT0MuchDiff); + server->Register("/CheckTiming", fSelT0TrdDiff); server->Register("/CheckTiming", fSelT0TofDiff); server->Register("/CheckTiming", fSelT0RichDiff); server->Register("/CheckTiming", fSelT0PsdDiff); @@ -348,6 +384,9 @@ void CbmCheckTiming::Exec(Option_t* /*option*/) if (fCheckTimeOrdering) CheckTimeOrder(); if (fCheckInterSystemOffset) CheckInterSystemOffset(); + if( 0 < fNrTs && 0 == fNrTs % 2000 ) + WriteHistos(); + fNrTs++; } @@ -371,6 +410,12 @@ void CbmCheckTiming::CheckInterSystemOffset() LOG(debug) << "MuchDigis: " << nrMuchDigis; } + Int_t nrTrdDigis{0}; + if (fDigiMan->IsPresent(ECbmModuleId::kTrd)) { + nrTrdDigis=fDigiMan->GetNofDigis(ECbmModuleId::kTrd); + LOG(debug) << "TrdDigis: " << nrTrdDigis; + } + Int_t nrTofDigis{0}; if (fDigiMan->IsPresent(ECbmModuleId::kTof)) { nrTofDigis=fDigiMan->GetNofDigis(ECbmModuleId::kTof); @@ -394,6 +439,7 @@ void CbmCheckTiming::CheckInterSystemOffset() /// Re-initialize array references fPrevT0FirstDigiSts = 0.; fPrevT0FirstDigiMuch = 0.; + fPrevT0FirstDigiTrd = 0.; fPrevT0FirstDigiTof = 0.; fPrevT0FirstDigiRich = 0.; fPrevT0FirstDigiPsd = 0.; @@ -431,6 +477,11 @@ void CbmCheckTiming::CheckInterSystemOffset() fT0MuchDiffEvoLong, fT0MuchRocDiff, T0Time, fMuchOffsetRange, fPrevT0FirstDigiMuch, kFALSE, kTRUE, kFALSE, kFALSE); + if (nrTrdDigis > 0 && nrTrdDigis < 1000000) + fPrevT0FirstDigiTrd = FillSystemOffsetHistos<CbmTrdDigi>(fT0TrdDiff, fT0TrdDiffCharge,fT0TrdDiffEvo, + fT0TrdDiffEvoLong, nullptr, + T0Time, fTrdOffsetRange, fPrevT0FirstDigiTrd, + kFALSE, kFALSE, kFALSE, kFALSE); fuNbTofDigiInSync = 0; if (nrTofDigis > 0 && nrTofDigis < 1000000) fPrevT0FirstDigiTof = FillSystemOffsetHistos<CbmTofDigi>(fT0TofDiff, fT0TofDiffCharge,fT0TofDiffEvo, @@ -455,6 +506,7 @@ void CbmCheckTiming::CheckInterSystemOffset() /// Re-initialize array references fPrevT0FirstDigiSts = 0.; fPrevT0FirstDigiMuch = 0.; + fPrevT0FirstDigiTrd = 0.; fPrevT0FirstDigiTof = 0.; fPrevT0FirstDigiRich = 0.; fPrevT0FirstDigiPsd = 0.; @@ -474,6 +526,12 @@ void CbmCheckTiming::CheckInterSystemOffset() fvdTimeSelectedT0[ uIdxSelT0 ], fMuchOffsetRange, fPrevT0FirstDigiMuch, kFALSE, kTRUE, kFALSE, kFALSE); + if (nrTrdDigis > 0 && nrTrdDigis < 1000000) + fPrevT0FirstDigiTrd = FillHistosSelT0<CbmTrdDigi>( + fSelT0TrdDiff, + fvdTimeSelectedT0[ uIdxSelT0 ], + fTrdOffsetRange, fPrevT0FirstDigiTrd, + kFALSE, kFALSE, kFALSE, kFALSE); if (nrTofDigis > 0 && nrTofDigis < 1000000) fPrevT0FirstDigiTof = FillHistosSelT0<CbmTofDigi>( fSelT0TofDiff, @@ -525,19 +583,21 @@ Int_t CbmCheckTiming::FillSystemOffsetHistos(TH1* histo, TH2* histoCharge, if( ( digi->GetCharge() < 7 || 31 == digi->GetCharge() ) || ( 0 == ( digi->GetChannel() % 2 ) ) ) continue; -*/ + /// Take selected PSD channel if( kTRUE == bPsd ) - if( digi->GetAddress() != ( ( 1 << 10 ) + 8 ) ) + if( digi->GetAddress() != (0<<10)+8 ) continue; +*/ - Double_t diffTime = T0Time - digi->GetTime(); +// Double_t diffTime = T0Time - digi->GetTime(); + Double_t diffTime = digi->GetTime() - T0Time; // Use T0 as reference Time - if (diffTime > offsetRange) { + if (diffTime < -offsetRange) { ++ iFirstDigiInWin; // Update Index of first digi in Win to next digi continue; // not yet in interesting range } // if (diffTime > offsetRange) - if (diffTime < -offsetRange) break; // already past interesting range + if (diffTime >offsetRange) break; // already past interesting range histo->Fill(diffTime); histoCharge->Fill( diffTime, digi->GetCharge() ); histoEvo->Fill(fNrTs, diffTime); @@ -606,20 +666,21 @@ Int_t CbmCheckTiming::FillHistosSelT0( TH1* histo, if( ( digi->GetCharge() < 7 || 31 == digi->GetCharge() ) || ( 0 == ( digi->GetChannel() % 2 ) ) ) continue; -*/ /// Take selected PSD channel if( kTRUE == bPsd ) - if( digi->GetAddress() != ( ( 1 << 10 ) + 8 ) ) + if( digi->GetAddress() != (0<<10)+8 ) continue; +*/ - Double_t diffTime = T0Time - digi->GetTime(); +// Double_t diffTime = T0Time - digi->GetTime(); + Double_t diffTime = digi->GetTime() - T0Time; // Use T0 as reference Time - if (diffTime > offsetRange) { + if (diffTime < -offsetRange) { ++ iFirstDigiInWin; // Update Index of first digi in Win to next digi continue; // not yet in interesting range } // if (diffTime > offsetRange) - if (diffTime < -offsetRange) break; // already past interesting range + if (diffTime > offsetRange) break; // already past interesting range histo->Fill(diffTime); } @@ -652,6 +713,11 @@ void CbmCheckTiming::CheckTimeOrder() fNrOfMuchDigis += nrMuchDigis; fNrOfMuchErrors += CheckIfSorted<CbmMuchBeamTimeDigi>(fMuchMuchDiff, fPrevTimeMuch, "Much"); } + if (fDigiMan->IsPresent(ECbmModuleId::kTrd)) { + Int_t nrTrdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTrd); + fNrOfTrdDigis += nrTrdDigis; + fNrOfTrdErrors += CheckIfSorted<CbmTrdDigi>(fTrdTrdDiff, fPrevTimeTrd, "Trd"); + } if (fDigiMan->IsPresent(ECbmModuleId::kTof)) { Int_t nrTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof); fNrOfTofDigis += nrTofDigis; @@ -750,6 +816,8 @@ void CbmCheckTiming::Finish() LOG(info) << "Total number of Sts digis: " << fNrOfStsDigis; LOG(info) << "Total number of Much out of order digis: " << fNrOfMuchErrors; LOG(info) << "Total number of Much digis: " << fNrOfMuchDigis; + LOG(info) << "Total number of Trd out of order digis: " << fNrOfTrdErrors; + LOG(info) << "Total number of Trd digis: " << fNrOfTrdDigis; LOG(info) << "Total number of Tof out of order digis: " << fNrOfTofErrors; LOG(info) << "Total number of Tof digis: " << fNrOfTofDigis; LOG(info) << "Total number of Rich out of order digis: " << fNrOfRichErrors; @@ -769,24 +837,28 @@ void CbmCheckTiming::WriteHistos() fT0StsDiff->Write(); fT0MuchDiff->Write(); + fT0TrdDiff->Write(); fT0TofDiff->Write(); fT0RichDiff->Write(); fT0PsdDiff->Write(); fT0StsDiffCharge->Write(); fT0MuchDiffCharge->Write(); + fT0TrdDiffCharge->Write(); fT0TofDiffCharge->Write(); fT0RichDiffCharge->Write(); fT0PsdDiffCharge->Write(); fT0StsDiffEvo->Write(); fT0MuchDiffEvo->Write(); + fT0TrdDiffEvo->Write(); fT0TofDiffEvo->Write(); fT0RichDiffEvo->Write(); fT0PsdDiffEvo->Write(); fT0StsDiffEvoLong->Write(); fT0MuchDiffEvoLong->Write(); + fT0TrdDiffEvoLong->Write(); fT0TofDiffEvoLong->Write(); fT0RichDiffEvoLong->Write(); fT0PsdDiffEvoLong->Write(); @@ -794,6 +866,7 @@ void CbmCheckTiming::WriteHistos() fT0T0Diff->Write(); fStsStsDiff->Write(); fMuchMuchDiff->Write(); + fTrdTrdDiff->Write(); fTofTofDiff->Write(); fRichRichDiff->Write(); fPsdPsdDiff->Write(); @@ -815,6 +888,7 @@ void CbmCheckTiming::WriteHistos() fSelT0StsDiff->Write(); fSelT0MuchDiff->Write(); + fSelT0TrdDiff->Write(); fSelT0TofDiff->Write(); fSelT0RichDiff->Write(); fSelT0PsdDiff->Write(); diff --git a/fles/mcbm2018/tasks/CbmCheckTiming.h b/fles/mcbm2018/tasks/CbmCheckTiming.h index 4562a4f0..4936ef60 100644 --- a/fles/mcbm2018/tasks/CbmCheckTiming.h +++ b/fles/mcbm2018/tasks/CbmCheckTiming.h @@ -69,6 +69,9 @@ class CbmCheckTiming : public FairTask void SetMuchOffsetSearchRange(Int_t val = 1000) { fMuchOffsetRange = val; } + void SetTrdOffsetSearchRange(Int_t val = 1000) + { fTrdOffsetRange = val; } + void SetTofOffsetSearchRange(Int_t val = 1000) { fTofOffsetRange = val; } @@ -125,6 +128,7 @@ class CbmCheckTiming : public FairTask Double_t fPrevTimeT0 = 0.; Double_t fPrevTimeSts = 0.; Double_t fPrevTimeMuch = 0.; + Double_t fPrevTimeTrd = 0.; Double_t fPrevTimeTof = 0.; Double_t fPrevTimeRich = 0.; Double_t fPrevTimePsd = 0.; @@ -133,6 +137,7 @@ class CbmCheckTiming : public FairTask /// => Time-order means the time window for following one can only be in a later digi Int_t fPrevT0FirstDigiSts = 0; Int_t fPrevT0FirstDigiMuch = 0; + Int_t fPrevT0FirstDigiTrd = 0; Int_t fPrevT0FirstDigiTof = 0; Int_t fPrevT0FirstDigiRich = 0; Int_t fPrevT0FirstDigiPsd = 0; @@ -152,6 +157,8 @@ class CbmCheckTiming : public FairTask Int_t fNrOfStsDigis = 0; Int_t fNrOfMuchErrors = 0; Int_t fNrOfMuchDigis = 0; + Int_t fNrOfTrdErrors = 0; + Int_t fNrOfTrdDigis = 0; Int_t fNrOfTofErrors = 0; Int_t fNrOfTofDigis = 0; Int_t fNrOfRichErrors = 0; @@ -165,6 +172,7 @@ class CbmCheckTiming : public FairTask Int_t fOffsetRange = 1000; Int_t fStsOffsetRange = 1000; Int_t fMuchOffsetRange = 1000; + Int_t fTrdOffsetRange = 1000; Int_t fTofOffsetRange = 1000; Int_t fRichOffsetRange = 1000; Int_t fPsdOffsetRange = 1000; @@ -173,24 +181,28 @@ class CbmCheckTiming : public FairTask TH1* fT0StsDiff = nullptr; TH1* fT0MuchDiff = nullptr; + TH1* fT0TrdDiff = nullptr; TH1* fT0TofDiff = nullptr; TH1* fT0RichDiff = nullptr; TH1* fT0PsdDiff = nullptr; TH2* fT0StsDiffCharge = nullptr; TH2* fT0MuchDiffCharge = nullptr; + TH2* fT0TrdDiffCharge = nullptr; TH2* fT0TofDiffCharge = nullptr; TH2* fT0RichDiffCharge = nullptr; TH2* fT0PsdDiffCharge = nullptr; TH2* fT0StsDiffEvo = nullptr; TH2* fT0MuchDiffEvo = nullptr; + TH2* fT0TrdDiffEvo = nullptr; TH2* fT0TofDiffEvo = nullptr; TH2* fT0RichDiffEvo = nullptr; TH2* fT0PsdDiffEvo = nullptr; TH2* fT0StsDiffEvoLong = nullptr; TH2* fT0MuchDiffEvoLong = nullptr; + TH2* fT0TrdDiffEvoLong = nullptr; TH2* fT0TofDiffEvoLong = nullptr; TH2* fT0RichDiffEvoLong = nullptr; TH2* fT0PsdDiffEvoLong = nullptr; @@ -198,6 +210,7 @@ class CbmCheckTiming : public FairTask TH1* fT0T0Diff = nullptr; TH1* fStsStsDiff = nullptr; TH1* fMuchMuchDiff = nullptr; + TH1* fTrdTrdDiff = nullptr; TH1* fTofTofDiff = nullptr; TH1* fRichRichDiff = nullptr; TH1* fPsdPsdDiff = nullptr; @@ -221,6 +234,7 @@ class CbmCheckTiming : public FairTask std::vector< Double_t > fvdTimeSelectedT0; TH1* fSelT0StsDiff = nullptr; TH1* fSelT0MuchDiff = nullptr; + TH1* fSelT0TrdDiff = nullptr; TH1* fSelT0TofDiff = nullptr; TH1* fSelT0RichDiff = nullptr; TH1* fSelT0PsdDiff = nullptr; diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx index 3b250e01..01662a38 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.cxx @@ -12,12 +12,15 @@ #include "FairRunOnline.h" #include "TClonesArray.h" +#include "TH2.h" #include "TH1.h" #include "THttpServer.h" #include <TFile.h> #include "CbmStsDigi.h" #include "CbmMuchBeamTimeDigi.h" +#include "CbmMuchDigi.h" +#include "CbmTrdDigi.h" #include "CbmTofDigi.h" #include "CbmRichDigi.h" #include "CbmPsdDigi.h" @@ -64,7 +67,8 @@ InitStatus CbmMcbm2018EventBuilder::Init() // Get a pointer to the previous already existing data level fDigiMan = CbmDigiManager::Instance(); - fDigiMan->UseMuchBeamTimeDigi(); + if( kFALSE == fbUseBaseMuchDigi ) + fDigiMan->UseMuchBeamTimeDigi(); fDigiMan->Init(); // T0 is not included in DigiManager @@ -84,6 +88,10 @@ InitStatus CbmMcbm2018EventBuilder::Init() LOG(info) << "No MUCH digi input."; } + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) ) { + LOG(info) << "No TRD digi input."; + } + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { LOG(info) << "No TOF digi input."; } @@ -104,7 +112,50 @@ InitStatus CbmMcbm2018EventBuilder::Init() if ( ! fEvents ) LOG(fatal) << "Output branch was not created"; - fDiffTime = new TH1F("fDiffTime","Time difference between two consecutive digis;time diff [ns];Counts", 420, -100.5, 1999.5); + if( fFillHistos ) + { + fDiffTime = new TH1F("fDiffTime","Time difference between two consecutive digis;time diff [ns];Counts", 420, -100.5, 1999.5); + fhEventTime = new TH1F( "hEventTime", "seed time of the events; Seed time [s]; Events", + 60000, 0, 600 ); + fhEventDt = new TH1F( "fhEventDt", "interval in seed time of consecutive events; Seed time [s]; Events", + 2100, -100.5, 1999.5); + fhEventSize = new TH1F( "hEventSize", + "nb of all digis in the event; Nb Digis []; Events []", + 10000, 0, 10000 ); + fhNbDigiPerEvtTime= new TH2I( "hNbDigiPerEvtTime", + "nb of all digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 1000, 0, 10000 ); + + fhNbDigiPerEvtTimeT0 = new TH2I( "hNbDigiPerEvtTimeT0", + "nb of T0 digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimeSts = new TH2I( "hNbDigiPerEvtTimeSts", + "nb of STS digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimeMuch = new TH2I( "hNbDigiPerEvtTimeMuch", + "nb of MUCH digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimeTrd = new TH2I( "hNbDigiPerEvtTimeTrd", + "nb of TRD digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimeTof = new TH2I( "hNbDigiPerEvtTimeTof", + "nb of TOF digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimeRich = new TH2I( "hNbDigiPerEvtTimeRich", + "nb of RICH digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + fhNbDigiPerEvtTimePsd = new TH2I( "hNbDigiPerEvtTimePsd", + "nb of PSD digis per event vs seed time of the events; Seed time [s]; Nb Digis []; Events []", + 600, 0, 600, + 4000, 0, 4000 ); + } // if( fFillHistos ) return kSUCCESS; } @@ -127,10 +178,13 @@ void CbmMcbm2018EventBuilder::Exec(Option_t* /*option*/) LOG(debug) << "Found " << fEventVector.size() << " events"; - FillHisto(); - DefineGoodEvents(); + if( fFillHistos ) + { + FillHisto(); + } // if( fFillHistos ) + LOG(debug) << "Found " << fEventVector.size() << " triggered events"; FillOutput(); @@ -150,6 +204,7 @@ void CbmMcbm2018EventBuilder::InitSorter() else if ( fT0DigiArr ) nrT0Digis = fT0DigiArr->GetEntriesFast(); Int_t nrStsDigis = fDigiMan->GetNofDigis( ECbmModuleId::kSts ); Int_t nrMuchDigis = fDigiMan->GetNofDigis( ECbmModuleId::kMuch ); + Int_t nrTrdDigis = fDigiMan->GetNofDigis( ECbmModuleId::kTrd ); Int_t nrTofDigis = fDigiMan->GetNofDigis( ECbmModuleId::kTof ); Int_t nrRichDigis = fDigiMan->GetNofDigis( ECbmModuleId::kRich ); Int_t nrPsdDigis = fDigiMan->GetNofDigis( ECbmModuleId::kPsd ); @@ -157,6 +212,7 @@ void CbmMcbm2018EventBuilder::InitSorter() LOG(debug) << "T0Digis: " << nrT0Digis; LOG(debug) << "StsDigis: " << nrStsDigis; LOG(debug) << "MuchDigis: " << nrMuchDigis; + LOG(debug) << "TrdDigis: " << nrTrdDigis; LOG(debug) << "TofDigis: " << nrTofDigis; LOG(debug) << "RichDigis: " << nrRichDigis; LOG(debug) << "PsdDigis: " << nrPsdDigis; @@ -170,7 +226,17 @@ void CbmMcbm2018EventBuilder::InitSorter() AddDigiToSorter< CbmStsDigi >(ECbmModuleId::kSts, 0); } if (nrMuchDigis>0) { - AddDigiToSorter< CbmMuchBeamTimeDigi >(ECbmModuleId::kMuch, 0); + if( fbUseBaseMuchDigi ) + { + AddDigiToSorter< CbmMuchDigi >(ECbmModuleId::kMuch, 0); + } // if( fbUseBaseMuchDigi ) + else + { + AddDigiToSorter< CbmMuchBeamTimeDigi >(ECbmModuleId::kMuch, 0); + } // else of if( fbUseBaseMuchDigi ) + } + if (nrTrdDigis>0) { + AddDigiToSorter< CbmTrdDigi >(ECbmModuleId::kTrd, 0); } if (nrTofDigis>0) { AddDigiToSorter< CbmTofDigi >(ECbmModuleId::kTof, 0); @@ -221,7 +287,8 @@ void CbmMcbm2018EventBuilder::BuildEvents() } AddDigiToEvent(system, entry); - if (fFillHistos) fVect.emplace_back(make_pair(system, entry)); + if( fFillHistos ) + fVect.emplace_back(make_pair(system, entry)); // Remove the first element from the set and insert the next digi // from the same system @@ -233,27 +300,39 @@ void CbmMcbm2018EventBuilder::BuildEvents() { AddDigiToSorter< CbmStsDigi >(system, ++entry); break; - } // case ECbmModuleId::kHodo + } // case ECbmModuleId::kSts case ECbmModuleId::kMuch: { - AddDigiToSorter< CbmMuchBeamTimeDigi >(system, ++entry); + if( fbUseBaseMuchDigi ) + { + AddDigiToSorter< CbmMuchDigi >(system, ++entry); + } // if( fbUseBaseMuchDigi ) + else + { + AddDigiToSorter< CbmMuchBeamTimeDigi >(system, ++entry); + } // else of if( fbUseBaseMuchDigi ) break; - } // case ECbmModuleId::kHodo + } // case ECbmModuleId::kMuch + case ECbmModuleId::kTrd: + { + AddDigiToSorter< CbmTrdDigi >(system, ++entry); + break; + } // case ECbmModuleId::kTrd case ECbmModuleId::kTof: { AddDigiToSorter< CbmTofDigi >(system, ++entry); break; - } // case ECbmModuleId::kHodo + } // case ECbmModuleId::kTof case ECbmModuleId::kRich: { AddDigiToSorter< CbmRichDigi >(system, ++entry); break; - } // case ECbmModuleId::kHodo + } // case ECbmModuleId::kRich case ECbmModuleId::kPsd: { AddDigiToSorter< CbmPsdDigi >(system, ++entry); break; - } // case ECbmModuleId::kHodo + } // case ECbmModuleId::kPsd case ECbmModuleId::kHodo: { AddDigiToSorter< CbmTofDigi >(system, ++entry); @@ -293,6 +372,9 @@ Bool_t CbmMcbm2018EventBuilder::HasTrigger(CbmEvent* event) if (fDigiMan->IsPresent(ECbmModuleId::kMuch) && fTriggerMinMuchDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kMuchDigi) >= fTriggerMinMuchDigis); } + if (fDigiMan->IsPresent(ECbmModuleId::kTrd) && fTriggerMinTrdDigis > 0) { + hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTrdDigi) >= fTriggerMinTrdDigis); + } if (fDigiMan->IsPresent(ECbmModuleId::kTof) && fTriggerMinTofDigis > 0) { hasTrigger = hasTrigger && (event->GetNofData(ECbmDataType::kTofDigi) >= fTriggerMinTofDigis); } @@ -320,7 +402,7 @@ void CbmMcbm2018EventBuilder::FillHisto() Int_t _entry = _pair.second; CbmDigi* digi = static_cast<CbmDigi*>(fLinkArray[_system]->At(_entry)); Double_t difftime = digi->GetTime() - fPrevTime; - if (fFillHistos) fDiffTime->Fill(difftime); + fDiffTime->Fill(difftime); if (difftime < 0.) { fErrors++; LOG(info) << fixed << setprecision(15) @@ -336,9 +418,30 @@ void CbmMcbm2018EventBuilder::FillHisto() prevSystem = _system; prevEntry = _entry; } + */ fVect.clear(); - */ + Double_t dPreEvtTime = -1.0; + for( CbmEvent * evt: fEventVector ) + { + fhEventTime->Fill( evt->GetStartTime() * 1e-9 ); + if( 0.0 <= dPreEvtTime ) + { + fhEventDt->Fill( evt->GetStartTime() - dPreEvtTime ); + } // if( 0.0 <= dPreEvtTime ) + fhEventSize->Fill( evt->GetNofData() ); + fhNbDigiPerEvtTime->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData() ); + + fhNbDigiPerEvtTimeT0 ->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kT0Digi ) ); + fhNbDigiPerEvtTimeSts ->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kStsDigi ) ); + fhNbDigiPerEvtTimeMuch->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kMuchDigi ) ); + fhNbDigiPerEvtTimeTrd ->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kTrdDigi ) ); + fhNbDigiPerEvtTimeTof ->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kTofDigi ) ); + fhNbDigiPerEvtTimeRich->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kRichDigi ) ); + fhNbDigiPerEvtTimePsd ->Fill( evt->GetStartTime() * 1e-9, evt->GetNofData( ECbmDataType::kPsdDigi ) ); + + dPreEvtTime = evt->GetStartTime(); + } // for( CbmEvent * evt: fEventVector ) } void CbmMcbm2018EventBuilder::DefineGoodEvents() @@ -407,6 +510,7 @@ void CbmMcbm2018EventBuilder::AddDigiToSorter( ECbmModuleId _system, Int_t _entr { case ECbmModuleId::kSts: case ECbmModuleId::kMuch: + case ECbmModuleId::kTrd: case ECbmModuleId::kTof: case ECbmModuleId::kRich: case ECbmModuleId::kPsd: @@ -461,6 +565,19 @@ void CbmMcbm2018EventBuilder::Finish() fDiffTime->Write(); + fhEventTime->Write(); + fhEventDt->Write(); + fhEventSize->Write(); + fhNbDigiPerEvtTime->Write(); + + fhNbDigiPerEvtTimeT0->Write(); + fhNbDigiPerEvtTimeSts->Write(); + fhNbDigiPerEvtTimeMuch->Write(); + fhNbDigiPerEvtTimeTrd->Write(); + fhNbDigiPerEvtTimeTof->Write(); + fhNbDigiPerEvtTimeRich->Write(); + fhNbDigiPerEvtTimePsd->Write(); + outfile->Close(); delete outfile; diff --git a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h index 3a121423..675f1526 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h +++ b/fles/mcbm2018/tasks/CbmMcbm2018EventBuilder.h @@ -22,6 +22,7 @@ class TClonesArray; class TH1; +class TH2; class CbmDigiManager; @@ -79,6 +80,8 @@ class CbmMcbm2018EventBuilder : public FairTask virtual void Finish(); void SetFillHistos(Bool_t var) {fFillHistos = var;} + void SetOutFilename( TString sNameIn ) { fOutFileName = sNameIn; } + void SetEventBuilderAlgo(EventBuilderAlgo algo = EventBuilderAlgo::FixedTimeWindow) {fEventBuilderAlgo = algo;} void SetFixedTimeWindow(Double_t val) {fFixedTimeWindow = val;} @@ -87,10 +90,12 @@ class CbmMcbm2018EventBuilder : public FairTask void SetTriggerMinNumberT0(Int_t val) {fTriggerMinT0Digis = val;} void SetTriggerMinNumberSts(Int_t val) {fTriggerMinStsDigis = val;} void SetTriggerMinNumberMuch(Int_t val) {fTriggerMinMuchDigis = val;} + void SetTriggerMinNumberTrd(Int_t val) {fTriggerMinTrdDigis = val;} void SetTriggerMinNumberTof(Int_t val) {fTriggerMinTofDigis = val;} void SetTriggerMinNumberRich(Int_t val) {fTriggerMinRichDigis = val;} void SetTriggerMinNumberPsd(Int_t val) {fTriggerMinPsdDigis = val;} + void SetUseBaseMuchDigi( Bool_t bFlag = kTRUE ) { fbUseBaseMuchDigi = bFlag; } private: void InitSorter(); @@ -110,6 +115,7 @@ class CbmMcbm2018EventBuilder : public FairTask Int_t fNrTs{0}; //! Timeslice Counter Double_t fPrevTime{0.}; //! Save previous time information + Bool_t fbUseBaseMuchDigi = kFALSE; CbmDigiManager* fDigiMan = nullptr; //! const std::vector<CbmTofDigi>* fT0DigiVec = nullptr; //! TClonesArray* fT0DigiArr = nullptr; //! input container of TO digis @@ -126,6 +132,17 @@ class CbmMcbm2018EventBuilder : public FairTask std::vector<CbmEvent*> fEventVector; //! vector with all created events TH1* fDiffTime{nullptr}; //! histogram with the time difference between two consecutive digis + TH1* fhEventTime{nullptr}; //! histogram with the seed time of the events + TH1* fhEventDt{nullptr}; //! histogram with the interval in seed time of consecutive events + TH1* fhEventSize{nullptr}; //! histogram with the nb of all digis in the event + TH2* fhNbDigiPerEvtTime{nullptr}; //! histogram with the nb of all digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeT0{nullptr}; //! histogram with the nb of T0 digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeSts{nullptr}; //! histogram with the nb of STS digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeMuch{nullptr}; //! histogram with the nb of MUCH digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeTrd{nullptr}; //! histogram with the nb of TRD digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeTof{nullptr}; //! histogram with the nb of TOF digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimeRich{nullptr}; //! histogram with the nb of RICH digis per event vs seed time of the events + TH2* fhNbDigiPerEvtTimePsd{nullptr}; //! histogram with the nb of PSD digis per event vs seed time of the events Bool_t fFillHistos{kTRUE}; //! Switch ON/OFF filling of histograms /** Used event building algorithm **/ @@ -143,6 +160,8 @@ class CbmMcbm2018EventBuilder : public FairTask Int_t fTriggerMinStsDigis{0}; /** Minimum number of Much digis needed to generate a trigger, 0 means don't use Much for trigger generation **/ Int_t fTriggerMinMuchDigis{0}; + /** Minimum number of Trd digis needed to generate a trigger, 0 means don't use Trd for trigger generation **/ + Int_t fTriggerMinTrdDigis{0}; /** Minimum number of Tof digis needed to generate a trigger, 0 means don't use Tof for trigger generation **/ Int_t fTriggerMinTofDigis{0}; /** Minimum number of Rich digis needed to generate a trigger, 0 means don't use Rich for trigger generation **/ @@ -151,7 +170,7 @@ class CbmMcbm2018EventBuilder : public FairTask Int_t fTriggerMinPsdDigis{0}; /** Name of the histogram output file **/ - TString fOutFileName{"test1.root"}; + TString fOutFileName{"HistosEventBuilder.root"}; ClassDef(CbmMcbm2018EventBuilder,2); }; diff --git a/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.cxx b/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.cxx index da1adfeb..0c3160d2 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.cxx +++ b/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.cxx @@ -10,9 +10,11 @@ #include "CbmStsDigi.h" #include "CbmMuchBeamTimeDigi.h" #include "CbmRichDigi.h" +#include "CbmTrdDigi.h" #include "CbmTofDigi.h" #include "CbmPsdDigi.h" #include "CbmDigiManager.h" +#include "CbmFlesHistosTools.h" #include "FairLogger.h" #include "FairRootManager.h" @@ -87,6 +89,12 @@ InitStatus CbmMcbm2019CheckPulser::Init() LOG(info) << "No MUCH digi input found."; } + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) ) { + LOG(info) << "No TRD digi input found."; + } // if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) ) + else { + } // else of if ( ! fDigiMan->IsPresent(ECbmModuleId::kTrd) ) + if ( ! fDigiMan->IsPresent(ECbmModuleId::kTof) ) { LOG(info) << "No TOF digi input found."; } @@ -99,6 +107,11 @@ InitStatus CbmMcbm2019CheckPulser::Init() LOG(info) << "No PSD digi input found."; } + /// Access the TS metadata to know TS start tim + fTimeSliceMetaDataArray = dynamic_cast<TClonesArray*>(ioman->GetObject("TimesliceMetaData")); + if ( ! fTimeSliceMetaDataArray ) + LOG(fatal) << "No TS metadata input found"; + CreateHistos(); return kSUCCESS; @@ -128,39 +141,11 @@ Int_t CbmMcbm2019CheckPulser::CalcNrBins(Int_t offsetRange) { void CbmMcbm2019CheckPulser::CreateHistos() { /// Logarithmic bining for self time comparison - // Number of log bins = - // 9 for the sub-unit decade - // + 9 for each unit of each decade * 10 for the subdecade range - // + 1 for the closing bin top edge - const Int_t iNbDecadesLog = 9; - const Int_t iNbStepsDecade = 9; - const Int_t iNbSubStepsInStep = 1; - const Int_t iNbBinsLog = iNbStepsDecade - + iNbStepsDecade * iNbSubStepsInStep * iNbDecadesLog - + 1; - Double_t dBinsLog[iNbBinsLog]; - // First fill sub-unit decade - for( Int_t iSubU = 0; iSubU < iNbStepsDecade; iSubU ++ ) - dBinsLog[ iSubU ] = 0.1 * ( 1 + iSubU ); - std::cout << std::endl; - // Then fill the main decades - Double_t dSubstepSize = 1.0 / iNbSubStepsInStep; - for( Int_t iDecade = 0; iDecade < iNbDecadesLog; iDecade ++) - { - Double_t dBase = std::pow( 10, iDecade ); - Int_t iDecadeIdx = iNbStepsDecade - + iDecade * iNbStepsDecade * iNbSubStepsInStep; - for( Int_t iStep = 0; iStep < iNbStepsDecade; iStep++ ) - { - Int_t iStepIdx = iDecadeIdx + iStep * iNbSubStepsInStep; - for( Int_t iSubStep = 0; iSubStep < iNbSubStepsInStep; iSubStep++ ) - { - dBinsLog[ iStepIdx + iSubStep ] = dBase * (1 + iStep) - + dBase * dSubstepSize * iSubStep; - } // for( Int_t iSubStep = 0; iSubStep < iNbSubStepsInStep; iSubStep++ ) - } // for( Int_t iStep = 0; iStep < iNbStepsDecade; iStep++ ) - } // for( Int_t iDecade = 0; iDecade < iNbDecadesLog; iDecade ++) - dBinsLog[ iNbBinsLog - 1 ] = std::pow( 10, iNbDecadesLog ); + uint32_t iNbBinsLog = 0; + /// Parameters are NbDecadesLog, NbStepsDecade, NbSubStepsInStep + std::vector<double> dBinsLogVector = GenerateLogBinArray( 9, 9, 1, iNbBinsLog ); + double* dBinsLog = dBinsLogVector.data(); +// double * dBinsLog = GenerateLogBinArray( 9, 9, 1, iNbBinsLog ); Int_t nrOfBinsSts = CalcNrBins(fStsOffsetRange); // T0 vs. Sts @@ -182,6 +167,16 @@ void CbmMcbm2019CheckPulser::CreateHistos() nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); + Int_t nrOfBinsTrd = CalcNrBins(fTrdOffsetRange); + // To vs. Trd + fT0TrdDiff = new TH1F("fT0TrdDiff","T0-Trd;time diff [ns];Counts", + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); + + fT0TrdDiffEvo = new TH2F("fT0TrdDiffEvo","T0-Trd;TS; time diff [ns];Counts", + 1000, 0, 10000, + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); + + Int_t nrOfBinsTof = CalcNrBins(fTofOffsetRange); // To vs. Tof fT0TofDiff = new TH1F("fT0TofDiff","T0-Tof;time diff [ns];Counts", @@ -202,7 +197,7 @@ void CbmMcbm2019CheckPulser::CreateHistos() nrOfBinsRich, -fRichOffsetRange, fRichOffsetRange); Int_t nrOfBinsPsd = CalcNrBins(fPsdOffsetRange); - // To vs. Rich + // To vs. Psd fT0PsdDiff = new TH1F("fT0PsdDiff","T0-Psd;time diff [ns];Counts", nrOfBinsPsd, -fPsdOffsetRange, fPsdOffsetRange); @@ -224,6 +219,10 @@ void CbmMcbm2019CheckPulser::CreateHistos() fT0MuchDiffEvoLong = new TH2F("fT0MuchDiffEvoLong","T0-Much;TS; time diff [ns];Counts", 1800, 0, 180000, nrOfBinsMuch, -fMuchOffsetRange, fMuchOffsetRange); + // To vs. Trd + fT0TrdDiffEvoLong = new TH2F("fT0TrdDiffEvoLong","T0-Trd;TS; time diff [ns];Counts", + 1800, 0, 180000, + nrOfBinsTrd, -fTrdOffsetRange, fTrdOffsetRange); // To vs. Tof fT0TofDiffEvoLong = new TH2F("fT0TofDiffEvoLong","T0-Tof;TS; time diff [ns];Counts", 1800, 0, 180000, @@ -246,6 +245,9 @@ void CbmMcbm2019CheckPulser::CreateHistos() fT0MuchMeanEvo = new TProfile("fT0MuchMeanEvo","T0-Much; time in run [s]; Mean time diff [ns]", 4320, 0, 4320 ); // To vs. Tof + fT0TrdMeanEvo = new TProfile("fT0TrdMeanEvo","T0-Trd; time in run [s]; Mean time diff [ns]", + 4320, 0, 4320 ); + // To vs. Tof fT0TofMeanEvo = new TProfile("fT0TofMeanEvo","T0-Tof; time in run [s]; Mean time diff [ns]", 4320, 0, 4320 ); // To vs. Rich @@ -288,22 +290,39 @@ void CbmMcbm2019CheckPulser::CreateHistos() // T0 vs. T0 fT0T0Diff = new TH1F("fT0T0Diff","T0-T0_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); // sts vs. Sts fStsStsDiff = new TH1F("fStsStsDiff","Sts-Sts_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); // Much vs. Much fMuchMuchDiff = new TH1F("fMuchMuchDiff","Much-Much_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); + // Trd vs. Trd + fTrdTrdDiff = new TH1F("fTrdTrdDiff","Trd-Trd_prev;time diff [ns];Counts", + iNbBinsLog, dBinsLog); // Tof vs. Tof fTofTofDiff = new TH1F("fTofTofDiff","Tof-Tof_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); // Rich vs. Rich fRichRichDiff = new TH1F("fRichRichDiff","Rich-Rich_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); // Psd vs. Psd fPsdPsdDiff = new TH1F("fPsdPsdDiff","Psd-Psd_prev;time diff [ns];Counts", - iNbBinsLog - 1, dBinsLog); + iNbBinsLog, dBinsLog); + + + fT0StsNb = new TH2F("fT0StsNb","T0-STS;Nb T0; Nb STS;TS []", + 100, 0, 100, 100, 0, 100); + fT0MuchNb = new TH2F("fT0MuchNb","T0-MUCH;Nb T0; Nb MUCH;TS []", + 100, 0, 100, 100, 0, 100); + fT0TrdNb = new TH2F("fT0TrdNb","T0-TRD;Nb T0; Nb TRD;TS []", + 100, 0, 100, 100, 0, 100); + fT0TofNb = new TH2F("fT0TofNb","T0-TOF;Nb T0; Nb TOF;TS []", + 100, 0, 100, 100, 0, 100); + fT0RichNb = new TH2F("fT0RichNb","T0-RICH;Nb T0; Nb RICH;TS []", + 100, 0, 100, 100, 0, 100); + fT0PsdNb = new TH2F("fT0PsdNb","T0-PSD;Nb T0; Nb PSD;TS []", + 100, 0, 100, 100, 0, 100); fT0Address = new TH1F("fT0Address","T0 address;address;Counts", 1000000, 0, 1000000.); @@ -311,6 +330,9 @@ void CbmMcbm2019CheckPulser::CreateHistos() fT0Channel = new TH1F("fT0Channel","T0 channel;channel nr;Counts", 100, -0.5, 99.5); + /// Cleanup array of log bins +// delete dBinsLog; + /// Register the histos in the HTTP server FairRunOnline* run = FairRunOnline::Instance(); if (run) { @@ -318,22 +340,26 @@ void CbmMcbm2019CheckPulser::CreateHistos() if( nullptr != server ) { server->Register("/CheckTiming", fT0StsDiff); server->Register("/CheckTiming", fT0MuchDiff); + server->Register("/CheckTiming", fT0TrdDiff); server->Register("/CheckTiming", fT0TofDiff); server->Register("/CheckTiming", fT0RichDiff); server->Register("/CheckTiming", fT0PsdDiff); server->Register("/CheckTiming", fT0StsDiffEvo); server->Register("/CheckTiming", fT0MuchDiffEvo); + server->Register("/CheckTiming", fT0TrdDiffEvo); server->Register("/CheckTiming", fT0TofDiffEvo); server->Register("/CheckTiming", fT0RichDiffEvo); server->Register("/CheckTiming", fT0PsdDiffEvo); server->Register("/CheckTiming", fT0StsDiffEvoLong); server->Register("/CheckTiming", fT0MuchDiffEvoLong); + server->Register("/CheckTiming", fT0TrdDiffEvoLong); server->Register("/CheckTiming", fT0TofDiffEvoLong); server->Register("/CheckTiming", fT0RichDiffEvoLong); server->Register("/CheckTiming", fT0PsdDiffEvoLong); server->Register("/CheckTiming", fT0StsMeanEvo); server->Register("/CheckTiming", fT0MuchMeanEvo); + server->Register("/CheckTiming", fT0TrdMeanEvo); server->Register("/CheckTiming", fT0TofMeanEvo); server->Register("/CheckTiming", fT0RichMeanEvo); server->Register("/CheckTiming", fT0PsdMeanEvo); @@ -341,10 +367,18 @@ void CbmMcbm2019CheckPulser::CreateHistos() server->Register("/CheckTiming", fT0T0Diff); server->Register("/CheckTiming", fStsStsDiff); server->Register("/CheckTiming", fMuchMuchDiff); + server->Register("/CheckTiming", fTrdTrdDiff); server->Register("/CheckTiming", fTofTofDiff); server->Register("/CheckTiming", fRichRichDiff); server->Register("/CheckTiming", fPsdPsdDiff); + server->Register("/CheckTiming", fT0StsNb); + server->Register("/CheckTiming", fT0MuchNb); + server->Register("/CheckTiming", fT0TrdNb); + server->Register("/CheckTiming", fT0TofNb); + server->Register("/CheckTiming", fT0RichNb); + server->Register("/CheckTiming", fT0PsdNb); + server->Register("/CheckTiming", fT0StsDpbDiff); for( UInt_t uStsDpb = 0; uStsDpb < kuMaxNbStsDpbs; ++uStsDpb ) server->Register("/CheckTiming/STS", fT0StsDpbDiffEvo[uStsDpb]); @@ -475,21 +509,40 @@ void CbmMcbm2019CheckPulser::CheckInterSystemOffset() else if ( fT0DigiArray ) nrT0Digis = fT0DigiArray->GetEntriesFast(); LOG(debug) << "T0Digis: " << nrT0Digis; - Int_t nrStsDigis = fDigiMan->GetNofDigis(ECbmModuleId::kSts); + Int_t nrStsDigis = fDigiMan->GetNofDigis(ECbmModuleId::kSts); Int_t nrMuchDigis = fDigiMan->GetNofDigis(ECbmModuleId::kMuch); - Int_t nrTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof); + Int_t nrTrdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTrd); + Int_t nrTofDigis = fDigiMan->GetNofDigis(ECbmModuleId::kTof); Int_t nrRichDigis = fDigiMan->GetNofDigis(ECbmModuleId::kRich); - Int_t nrPsdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kPsd); + Int_t nrPsdDigis = fDigiMan->GetNofDigis(ECbmModuleId::kPsd); +/* + if( 0 < nrT0Digis ) + { + LOG(info) << "TS: " << fNrTs; + LOG(info) << "T0: " << nrT0Digis; + LOG(info) << "STS: " << nrStsDigis; + LOG(info) << "MUCH: " << nrMuchDigis; + LOG(info) << "TRD: " << nrTrdDigis; + LOG(info) << "TOF: " << nrTofDigis; + LOG(info) << "RICH: " << nrRichDigis; + LOG(info) << "PSD: " << nrPsdDigis; + } +*/ // if (nrT0Digis < 100000) { if (nrT0Digis < 1000000) { /// Re-initialize array references fPrevT0FirstDigiSts = 0.; fPrevT0FirstDigiMuch = 0.; + fPrevT0FirstDigiTrd = 0.; fPrevT0FirstDigiTof = 0.; fPrevT0FirstDigiRich = 0.; fPrevT0FirstDigiPsd = 0.; + pTsMetaData = dynamic_cast<TimesliceMetaData*>(fTimeSliceMetaDataArray->At(0)); + if( nullptr == pTsMetaData ) + LOG(fatal) << Form( "No TS metadata found for TS %6u.", fNrTs ); + for (Int_t iT0 = 0; iT0 < nrT0Digis; ++iT0) { if (iT0%1000 == 0) LOG(debug) << "Executing entry " << iT0; @@ -510,12 +563,15 @@ void CbmMcbm2019CheckPulser::CheckInterSystemOffset() if( 0x00005006 != T0Address && 0x04005006 != T0Address ) continue; + fiT0Nb++; + fT0Address->Fill(T0Address); /* std::cout << Form( "T0 pulser in TS %5d: address 0x%08X T0 time %12.0f dt %12.0f", fNrTs, T0Address, T0Time, T0Time - fdLastT0DigiPulser ) << std::endl; */ + fT0T0Diff->Fill( T0Time - fdLastT0DigiPulser ); fdLastT0DigiPulser = T0Time; fT0Channel->Fill(T0Digi->GetChannel()); @@ -530,6 +586,11 @@ void CbmMcbm2019CheckPulser::CheckInterSystemOffset() fT0MuchDiffEvoLong, fT0MuchMeanEvo, fT0MuchRocDiff, T0Time, fMuchOffsetRange, fPrevT0FirstDigiMuch, ECbmModuleId::kMuch); + if (nrTrdDigis > 0 && nrTrdDigis < 1000000 && fuMinChargePulserTrd < fuMaxChargePulserTrd ) + fPrevT0FirstDigiTrd = FillSystemOffsetHistos<CbmTrdDigi>(fT0TrdDiff, fT0TrdDiffEvo, + fT0TrdDiffEvoLong, fT0TrdMeanEvo, nullptr, + T0Time, fTrdOffsetRange, fPrevT0FirstDigiTrd, + ECbmModuleId::kTrd); if (nrTofDigis > 0 && nrTofDigis < 1000000 && fuMinTotPulserTof < fuMaxTotPulserTof ) fPrevT0FirstDigiTof = FillSystemOffsetHistos<CbmTofDigi>(fT0TofDiff, fT0TofDiffEvo, fT0TofDiffEvoLong, fT0TofMeanEvo, nullptr, @@ -546,7 +607,115 @@ void CbmMcbm2019CheckPulser::CheckInterSystemOffset() T0Time, fPsdOffsetRange, fPrevT0FirstDigiPsd, ECbmModuleId::kPsd); } - } + + /// Count pulser candidates for each system + /// STS + for( Int_t iDigi = 0; iDigi < nrStsDigis; ++iDigi ) + { + const CbmStsDigi* digi = fDigiMan->Get<CbmStsDigi>( iDigi ); + + UInt_t uAddr = digi->GetAddress(); + UInt_t uChan = digi->GetChannel(); + + if( ( kuDefaultAddress != fuStsAddress && uAddr != fuStsAddress ) || + ( kuMaxChannelSts != fuStsFirstCha && uChan < fuStsFirstCha ) || + ( kuMaxChannelSts != fuStsLastChan && fuStsLastChan < uChan ) + ) + continue; + + if( fuMaxAdcPulserSts < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserSts ) + continue; + + fiStsNb++; + } // for( Int_t iDigi = 0; iDigi < nrStsDigis; ++iDigi ) + /// MUCH + for( Int_t iDigi = 0; iDigi < nrMuchDigis; ++iDigi ) + { + const CbmMuchBeamTimeDigi* digi = fDigiMan->Get<CbmMuchBeamTimeDigi>( iDigi ); + + UInt_t uAsic = digi->GetNxId(); + UInt_t uChan = digi->GetNxCh(); + + if( ( kuMaxNbMuchAsics != fuMuchAsic && uAsic != fuMuchAsic ) || + ( kuNbChanSMX != fuMuchFirstCha && uChan < fuMuchFirstCha ) || + ( kuNbChanSMX != fuMuchLastChan && fuMuchLastChan < uChan ) + ) + continue; + + if( fuMaxAdcPulserMuch < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserMuch ) + continue; + + fiMuchNb++; + } // for( Int_t iDigi = 0; iDigi < nrMuchDigis; ++iDigi ) + /// TRD + for( Int_t iDigi = 0; iDigi < nrTrdDigis; ++iDigi ) + { + const CbmTrdDigi* digi = fDigiMan->Get<CbmTrdDigi>( iDigi ); + + UInt_t uAddr = digi->GetAddress(); + + if( ( kuDefaultAddress != fuTrdAddress && uAddr != fuTrdAddress ) + ) + continue; + + if( fuMaxChargePulserTrd < digi->GetCharge() || digi->GetCharge() < fuMinChargePulserTrd ) + continue; + + fiTrdNb++; + } // for( Int_t iDigi = 0; iDigi < nrTrdDigis; ++iDigi ) + /// TOF + for( Int_t iDigi = 0; iDigi < nrTofDigis; ++iDigi ) + { + const CbmTofDigi* digi = fDigiMan->Get<CbmTofDigi>( iDigi ); + + if( fuMaxTotPulserTof < digi->GetCharge() || digi->GetCharge() < fuMinTotPulserTof ) + continue; + + fiTofNb++; + } // for( Int_t iDigi = 0; iDigi < nrTofDigis; ++iDigi ) + /// RICH + for( Int_t iDigi = 0; iDigi < nrRichDigis; ++iDigi ) + { + const CbmRichDigi* digi = fDigiMan->Get<CbmRichDigi>( iDigi ); + + if( fuMaxTotPulserRich < digi->GetCharge() || digi->GetCharge() < fuMinTotPulserRich ) + continue; + + fiRichNb++; + } // for( Int_t iDigi = 0; iDigi < nrRichDigis; ++iDigi ) + /// PSD + for( Int_t iDigi = 0; iDigi < nrPsdDigis; ++iDigi ) + { + const CbmPsdDigi* digi = fDigiMan->Get<CbmPsdDigi>( iDigi ); + + UInt_t uAddr = digi->GetAddress(); + + if( ( kuDefaultAddress != fuPsdAddress && uAddr != fuPsdAddress ) + ) + continue; + + if( fuMaxAdcPulserPsd < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserPsd ) + continue; + + fiPsdNb++; + } // for( Int_t iDigi = 0; iDigi < nrPsdDigis; ++iDigi ) + + fT0StsNb->Fill( fiT0Nb, fiStsNb ); + fT0MuchNb->Fill( fiT0Nb, fiMuchNb ); + fT0TrdNb->Fill( fiT0Nb, fiTrdNb ); + fT0TofNb->Fill( fiT0Nb, fiTofNb ); + fT0RichNb->Fill( fiT0Nb, fiRichNb ); + fT0PsdNb->Fill( fiT0Nb, fiPsdNb ); + + fiT0Nb = 0; + fiStsNb = 0; + fiMuchNb = 0; + fiTrdNb = 0; + fiTofNb = 0; + fiRichNb = 0; + fiPsdNb = 0; + } // if (nrT0Digis < 1000000) + /* for (Int_t iMuch = 0; iMuch < nrMuchDigis; ++iMuch) { @@ -610,8 +779,28 @@ Int_t CbmMcbm2019CheckPulser::FillSystemOffsetHistos(TH1* histo, { case ECbmModuleId::kSts: ///< Silicon Tracking System { + const CbmStsDigi* stsDigi; + try { + stsDigi = + boost::any_cast<const CbmStsDigi*>( digi ); + } catch( ... ) { + LOG( fatal ) << "Failed boost any_cast in CbmMcbm2019CheckPulser::FillSystemOffsetHistos for a digi of type " + << Digi::GetClassName(); + } // try/catch + assert(stsDigi); + UInt_t uAddr = stsDigi->GetAddress(); + UInt_t uChan = stsDigi->GetChannel(); + + if( ( kuDefaultAddress != fuStsAddress && uAddr != fuStsAddress ) || + ( kuMaxChannelSts != fuStsFirstCha && uChan < fuStsFirstCha ) || + ( kuMaxChannelSts != fuStsLastChan && fuStsLastChan < uChan ) + ) + continue; + if( fuMaxAdcPulserSts < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserSts ) continue; + + fiStsNb++; break; } // case ECbmModuleId::kSts: case ECbmModuleId::kMuch: ///< Muon detection system @@ -636,26 +825,65 @@ Int_t CbmMcbm2019CheckPulser::FillSystemOffsetHistos(TH1* histo, if( fuMaxAdcPulserMuch < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserMuch ) continue; + + fiMuchNb++; break; + } // case ECbmModuleId::kMuch: + case ECbmModuleId::kTrd: ///< Time-of-flight Detector + { +/* + const CbmTrdDigi* trdDigi; + try { + trdDigi = + boost::any_cast<const CbmTrdDigi*>( digi ); + } catch( ... ) { + LOG( fatal ) << "Failed boost any_cast in CbmMcbm2019CheckPulser::FillSystemOffsetHistos for a digi of type " + << Digi::GetClassName(); + } // try/catch + assert(trdDigi); +*/ + UInt_t uAddr = digi->GetAddress(); + if( ( kuDefaultAddress != fuTrdAddress && uAddr != fuTrdAddress ) + ) + continue; - } // case ECbmModuleId::kMuch: + if( fuMaxChargePulserTrd < digi->GetCharge() || digi->GetCharge() < fuMinChargePulserTrd ) + continue; + + fiTrdNb++; + break; + } // case ECbmModuleId::kTrd: case ECbmModuleId::kTof: ///< Time-of-flight Detector { if( fuMaxTotPulserTof < digi->GetCharge() || digi->GetCharge() < fuMinTotPulserTof ) continue; + + fiTofNb++; break; } // case ECbmModuleId::kTof: case ECbmModuleId::kRich: ///< Ring-Imaging Cherenkov Detector { if( fuMaxTotPulserRich < digi->GetCharge() || digi->GetCharge() < fuMinTotPulserRich ) continue; + + fiRichNb++; break; } // case ECbmModuleId::kRich: case ECbmModuleId::kPsd: ///< Projectile spectator detector { + UInt_t uAddr = digi->GetAddress(); + + if( ( kuDefaultAddress != fuPsdAddress && uAddr != fuPsdAddress ) + ) + continue; + if( fuMaxAdcPulserPsd < digi->GetCharge() || digi->GetCharge() < fuMinAdcPulserPsd ) continue; + if( digi->GetAddress() != (9<<10)+8 ) + continue; + + fiPsdNb++; break; } // case ECbmModuleId::kPsd: default: @@ -731,6 +959,7 @@ void CbmMcbm2019CheckPulser::WriteHistos() fT0StsDiff->Write(); fT0MuchDiff->Write(); + fT0TrdDiff->Write(); fT0TofDiff->Write(); fT0RichDiff->Write(); fT0PsdDiff->Write(); @@ -738,18 +967,21 @@ void CbmMcbm2019CheckPulser::WriteHistos() fT0StsDiffEvo->Write(); fT0MuchDiffEvo->Write(); + fT0TrdDiffEvo->Write(); fT0TofDiffEvo->Write(); fT0RichDiffEvo->Write(); fT0PsdDiffEvo->Write(); fT0StsDiffEvoLong->Write(); fT0MuchDiffEvoLong->Write(); + fT0TrdDiffEvoLong->Write(); fT0TofDiffEvoLong->Write(); fT0RichDiffEvoLong->Write(); fT0PsdDiffEvoLong->Write(); fT0StsMeanEvo->Write(); fT0MuchMeanEvo->Write(); + fT0TrdMeanEvo->Write(); fT0TofMeanEvo->Write(); fT0RichMeanEvo->Write(); fT0PsdMeanEvo->Write(); @@ -757,10 +989,18 @@ void CbmMcbm2019CheckPulser::WriteHistos() fT0T0Diff->Write(); fStsStsDiff->Write(); fMuchMuchDiff->Write(); + fTrdTrdDiff->Write(); fTofTofDiff->Write(); fRichRichDiff->Write(); fPsdPsdDiff->Write(); + fT0StsNb->Write(); + fT0MuchNb->Write(); + fT0TrdNb->Write(); + fT0TofNb->Write(); + fT0RichNb->Write(); + fT0PsdNb->Write(); + fT0Address->Write(); fT0Channel->Write(); diff --git a/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.h b/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.h index eadb3f36..fc4ddac3 100644 --- a/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.h +++ b/fles/mcbm2018/tasks/CbmMcbm2019CheckPulser.h @@ -8,13 +8,19 @@ #ifndef CBMMCBM2019CHECKPULSER_H #define CBMMCBM2019CHECKPULSER_H -#include <vector> +/// CBMROOT headers #include "CbmDefs.h" +#include "TimesliceMetaData.h" +#include "CbmTofDigi.h" +/// FAIRROOT headers #include "FairTask.h" +/// External headers (ROOT, boost, ...) #include "TString.h" -#include "CbmTofDigi.h" + +/// C/C++ headers +#include <vector> class TClonesArray; class TH1; @@ -64,6 +70,9 @@ class CbmMcbm2019CheckPulser : public FairTask void SetMuchOffsetSearchRange(Int_t val = 1000) { fMuchOffsetRange = val; } + void SetTrdOffsetSearchRange(Int_t val = 1000) + { fTrdOffsetRange = val; } + void SetTofOffsetSearchRange(Int_t val = 1000) { fTofOffsetRange = val; } @@ -77,8 +86,10 @@ class CbmMcbm2019CheckPulser : public FairTask { fuMinTotPulserT0 = uMin; fuMaxTotPulserT0 = uMax; } inline void SetStsPulserAdcLimits( UInt_t uMin, UInt_t uMax ) { fuMinAdcPulserSts = uMin; fuMaxAdcPulserSts = uMax; } - inline void SetMuchPulseradcLimits( UInt_t uMin, UInt_t uMax ) + inline void SetMuchPulserAdcLimits( UInt_t uMin, UInt_t uMax ) { fuMinAdcPulserMuch = uMin; fuMaxAdcPulserMuch = uMax; } + inline void SetTrdPulserChargeLimits( UInt_t uMin, UInt_t uMax ) + { fuMinChargePulserTrd = uMin; fuMaxChargePulserTrd = uMax; } inline void SetTofPulserTotLimits( UInt_t uMin, UInt_t uMax ) { fuMinTotPulserTof = uMin; fuMaxTotPulserTof = uMax; } inline void SetRichPulserTotLimits( UInt_t uMin, UInt_t uMax ) @@ -88,9 +99,12 @@ class CbmMcbm2019CheckPulser : public FairTask inline void SetOutFilename( TString sNameIn ) { fOutFileName = sNameIn; } + inline void SetStsAddress( UInt_t uAddress ) { fuStsAddress = uAddress; } inline void SetMuchAsic( UInt_t uAsic ) { fuMuchAsic = uAsic; } inline void SetMuchChanRange( UInt_t uFirstChan, UInt_t uLastChan = kuNbChanSMX ) { fuMuchFirstCha = uFirstChan; fuMuchLastChan = uLastChan; } + inline void SetTrdAddress( UInt_t uAddress ) { fuTrdAddress = uAddress; } + inline void SetPsdAddress( UInt_t uAddress ) { fuPsdAddress = uAddress; } private: @@ -115,17 +129,22 @@ class CbmMcbm2019CheckPulser : public FairTask CbmDigiManager* fDigiMan = nullptr; //! const std::vector<CbmTofDigi>* fT0DigiVector = nullptr; //! TClonesArray* fT0DigiArray = nullptr; //! + TClonesArray* fTimeSliceMetaDataArray = nullptr; //! + const TimesliceMetaData* pTsMetaData = nullptr; /// Constants - static const UInt_t kuNbChanSMX = 128; - static const UInt_t kuMaxNbStsDpbs = 2; - static const UInt_t kuMaxNbMuchDpbs = 6; - static const UInt_t kuMaxNbMuchAsics = 36; + static const UInt_t kuNbChanSMX = 128; + static const UInt_t kuMaxNbStsDpbs = 2; + static const UInt_t kuMaxNbMuchDpbs = 6; + static const UInt_t kuMaxNbMuchAsics = 36; + static const UInt_t kuDefaultAddress = 0xFFFFFFFF; + static const UInt_t kuMaxChannelSts = 3000; /// Variables to store the previous digi time Double_t fPrevTimeT0 = 0.; Double_t fPrevTimeSts = 0.; Double_t fPrevTimeMuch = 0.; + Double_t fPrevTimeTrd = 0.; Double_t fPrevTimeTof = 0.; Double_t fPrevTimeRich = 0.; Double_t fPrevTimePsd = 0.; @@ -134,26 +153,36 @@ class CbmMcbm2019CheckPulser : public FairTask /// => Time-order means the time window for following one can only be in a later digi Int_t fPrevT0FirstDigiSts = 0; Int_t fPrevT0FirstDigiMuch = 0; + Int_t fPrevT0FirstDigiTrd = 0; Int_t fPrevT0FirstDigiTof = 0; Int_t fPrevT0FirstDigiRich = 0; Int_t fPrevT0FirstDigiPsd = 0; /// User settings: Data correction parameters + /// Charge cut UInt_t fuMinTotPulserT0 = 182; UInt_t fuMaxTotPulserT0 = 190; UInt_t fuMinAdcPulserSts = 90; UInt_t fuMaxAdcPulserSts = 100; UInt_t fuMinAdcPulserMuch = 5; UInt_t fuMaxAdcPulserMuch = 15; + UInt_t fuMinChargePulserTrd = 0; + UInt_t fuMaxChargePulserTrd = 70000; UInt_t fuMinTotPulserTof = 182; UInt_t fuMaxTotPulserTof = 190; UInt_t fuMinTotPulserRich = 90; UInt_t fuMaxTotPulserRich = 105; UInt_t fuMinAdcPulserPsd = 90; UInt_t fuMaxAdcPulserPsd = 100; + /// Channel selection + UInt_t fuStsAddress = kuDefaultAddress; + UInt_t fuStsFirstCha = kuMaxChannelSts; + UInt_t fuStsLastChan = kuMaxChannelSts; UInt_t fuMuchAsic = kuMaxNbMuchAsics; UInt_t fuMuchFirstCha = kuNbChanSMX; UInt_t fuMuchLastChan = kuNbChanSMX; + UInt_t fuTrdAddress = kuDefaultAddress; + UInt_t fuPsdAddress = kuDefaultAddress; // Int_t fNrTs = 0; @@ -161,6 +190,7 @@ class CbmMcbm2019CheckPulser : public FairTask Int_t fOffsetRange = 1000; Int_t fStsOffsetRange = 1000; Int_t fMuchOffsetRange = 1000; + Int_t fTrdOffsetRange = 1000; Int_t fTofOffsetRange = 1000; Int_t fRichOffsetRange = 1000; Int_t fPsdOffsetRange = 1000; @@ -169,6 +199,7 @@ class CbmMcbm2019CheckPulser : public FairTask TH1* fT0StsDiff = nullptr; TH1* fT0MuchDiff = nullptr; + TH1* fT0TrdDiff = nullptr; TH1* fT0TofDiff = nullptr; TH1* fT0RichDiff = nullptr; TH1* fT0PsdDiff = nullptr; @@ -176,12 +207,14 @@ class CbmMcbm2019CheckPulser : public FairTask TH2* fT0StsDiffEvo = nullptr; TH2* fT0MuchDiffEvo = nullptr; + TH2* fT0TrdDiffEvo = nullptr; TH2* fT0TofDiffEvo = nullptr; TH2* fT0RichDiffEvo = nullptr; TH2* fT0PsdDiffEvo = nullptr; TH2* fT0StsDiffEvoLong = nullptr; TH2* fT0MuchDiffEvoLong = nullptr; + TH2* fT0TrdDiffEvoLong = nullptr; TH2* fT0TofDiffEvoLong = nullptr; TH2* fT0RichDiffEvoLong = nullptr; TH2* fT0PsdDiffEvoLong = nullptr; @@ -189,6 +222,7 @@ class CbmMcbm2019CheckPulser : public FairTask Double_t fdStartTime = -1; TProfile* fT0StsMeanEvo = nullptr; TProfile* fT0MuchMeanEvo = nullptr; + TProfile* fT0TrdMeanEvo = nullptr; TProfile* fT0TofMeanEvo = nullptr; TProfile* fT0RichMeanEvo = nullptr; TProfile* fT0PsdMeanEvo = nullptr; @@ -196,10 +230,26 @@ class CbmMcbm2019CheckPulser : public FairTask TH1* fT0T0Diff = nullptr; TH1* fStsStsDiff = nullptr; TH1* fMuchMuchDiff = nullptr; + TH1* fTrdTrdDiff = nullptr; TH1* fTofTofDiff = nullptr; TH1* fRichRichDiff = nullptr; TH1* fPsdPsdDiff = nullptr; + TH2* fT0StsNb = nullptr; + TH2* fT0MuchNb = nullptr; + TH2* fT0TrdNb = nullptr; + TH2* fT0TofNb = nullptr; + TH2* fT0RichNb = nullptr; + TH2* fT0PsdNb = nullptr; + + Int_t fiT0Nb = 0; + Int_t fiStsNb = 0; + Int_t fiMuchNb = 0; + Int_t fiTrdNb = 0; + Int_t fiTofNb = 0; + Int_t fiRichNb = 0; + Int_t fiPsdNb = 0; + TH1* fT0Address = nullptr; TH1* fT0Channel = nullptr; -- GitLab