/******************************************************************************** * Copyright (C) 2014 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH * * * * This software is distributed under the terms of the * * GNU Lesser General Public Licence (LGPL) version 3, * * copied verbatim in the file "LICENSE" * ********************************************************************************/ #ifndef CBMMCBM2019CHECKPULSER_H #define CBMMCBM2019CHECKPULSER_H #include "CbmDefs.h" #include "FairTask.h" #include "TString.h" class TClonesArray; class TH1; class TH2; class TProfile; class CbmMcbm2019CheckPulser : public FairTask { public: CbmMcbm2019CheckPulser(); CbmMcbm2019CheckPulser(const CbmMcbm2019CheckPulser&) = delete; CbmMcbm2019CheckPulser operator=(const CbmMcbm2019CheckPulser&) = delete; /** Constructor with parameters (Optional) **/ // CbmMcbm2019CheckPulser(Int_t verbose); /** Destructor **/ ~CbmMcbm2019CheckPulser(); /** Initiliazation of task at the beginning of a run **/ virtual InitStatus Init(); /** ReInitiliazation of task when the runID changes **/ virtual InitStatus ReInit(); /** Executed for each event. **/ virtual void Exec(Option_t*); /** Load the parameter container from the runtime database **/ virtual void SetParContainers(); /** Finish task called at the end of the run **/ virtual void Finish(); void SetOffsetSearchRange(Int_t val = 1000) { fOffsetRange = val; } void SetStsOffsetSearchRange(Int_t val = 1000) { fStsOffsetRange = val; } void SetMuchOffsetSearchRange(Int_t val = 1000) { fMuchOffsetRange = val; } void SetTofOffsetSearchRange(Int_t val = 1000) { fTofOffsetRange = val; } void SetRichOffsetSearchRange(Int_t val = 1000) { fRichOffsetRange = val; } void SetPsdOffsetSearchRange(Int_t val = 1000) { fPsdOffsetRange = val; } inline void SetT0PulserTotLimits( UInt_t uMin, UInt_t uMax ) { 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 ) { fuMinAdcPulserMuch = uMin; fuMaxAdcPulserMuch = uMax; } inline void SetTofPulserTotLimits( UInt_t uMin, UInt_t uMax ) { fuMinTotPulserTof = uMin; fuMaxTotPulserTof = uMax; } inline void SetRichPulserTotLimits( UInt_t uMin, UInt_t uMax ) { fuMinTotPulserRich = uMin; fuMaxTotPulserRich = uMax; } inline void SetPsdPulserAdcLimits( UInt_t uMin, UInt_t uMax ) { fuMinAdcPulserPsd = uMin; fuMaxAdcPulserPsd = uMax; } inline void SetOutFilename( TString sNameIn ) { fOutFileName = sNameIn; } private: void CheckTimeOrder(); Int_t CheckIfSorted(TClonesArray*, TH1*, Double_t&, TString); void CheckInterSystemOffset(); Int_t FillSystemOffsetHistos(TClonesArray* array, TH1* histo, TH2* histoEvo, TH2* histoEvoLong, TProfile * profMeanEvo, TH2* histoAFCK, const Double_t T0Time, const Int_t offsetRange, Int_t iStartDigi, ECbmModuleId iDetId = kLastModule ); Int_t CalcNrBins(Int_t); void CreateHistos(); void WriteHistos(); /** Input array from previous already existing data level **/ TClonesArray* fT0Digis = nullptr; TClonesArray* fStsDigis = nullptr; TClonesArray* fMuchDigis = nullptr; TClonesArray* fTofDigis = nullptr; TClonesArray* fRichDigis = nullptr; TClonesArray* fPsdDigis = nullptr; /// Variables to store the previous digi time Double_t fPrevTimeT0 = 0.; Double_t fPrevTimeSts = 0.; Double_t fPrevTimeMuch = 0.; Double_t fPrevTimeTof = 0.; Double_t fPrevTimeRich = 0.; Double_t fPrevTimePsd = 0.; /// Variables to store the first digi fitting the previous T0 hits /// => 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 fPrevT0FirstDigiTof = 0; Int_t fPrevT0FirstDigiRich = 0; Int_t fPrevT0FirstDigiPsd = 0; /// User settings: Data correction parameters 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 fuMinTotPulserTof = 182; UInt_t fuMaxTotPulserTof = 190; UInt_t fuMinTotPulserRich = 90; UInt_t fuMaxTotPulserRich = 105; UInt_t fuMinAdcPulserPsd = 90; UInt_t fuMaxAdcPulserPsd = 100; // Int_t fNrTs = 0; Int_t fOffsetRange = 1000; Int_t fStsOffsetRange = 1000; Int_t fMuchOffsetRange = 1000; Int_t fTofOffsetRange = 1000; Int_t fRichOffsetRange = 1000; Int_t fPsdOffsetRange = 1000; Int_t fBinWidth = 1; TH1* fT0StsDiff = nullptr; TH1* fT0MuchDiff = nullptr; TH1* fT0TofDiff = nullptr; TH1* fT0RichDiff = nullptr; TH1* fT0PsdDiff = nullptr; TH2* fT0PsdDiffCharge = nullptr; TH2* fT0StsDiffEvo = nullptr; TH2* fT0MuchDiffEvo = nullptr; TH2* fT0TofDiffEvo = nullptr; TH2* fT0RichDiffEvo = nullptr; TH2* fT0PsdDiffEvo = nullptr; TH2* fT0StsDiffEvoLong = nullptr; TH2* fT0MuchDiffEvoLong = nullptr; TH2* fT0TofDiffEvoLong = nullptr; TH2* fT0RichDiffEvoLong = nullptr; TH2* fT0PsdDiffEvoLong = nullptr; Double_t fdStartTime = -1; TProfile* fT0StsMeanEvo = nullptr; TProfile* fT0MuchMeanEvo = nullptr; TProfile* fT0TofMeanEvo = nullptr; TProfile* fT0RichMeanEvo = nullptr; TProfile* fT0PsdMeanEvo = nullptr; TH1* fT0T0Diff = nullptr; TH1* fStsStsDiff = nullptr; TH1* fMuchMuchDiff = nullptr; TH1* fTofTofDiff = nullptr; TH1* fRichRichDiff = nullptr; TH1* fPsdPsdDiff = nullptr; TH1* fT0Address = nullptr; TH1* fT0Channel = nullptr; TH2* fT0StsDpbDiff = nullptr; static const UInt_t kuMaxNbStsDpbs = 2; TH2* fT0StsDpbDiffEvo[kuMaxNbStsDpbs]; TH1* fStsDpbCntsEvo[kuMaxNbStsDpbs]; static const UInt_t kuMaxNbMuchDpbs = 6; TH2* fT0MuchRocDiff = nullptr; static const UInt_t kuMaxNbMuchAsics = 36; TH2* fT0MuchAsicDiff = nullptr; TH2* fT0MuchAsicDiffEvo[kuMaxNbMuchAsics]; TString fOutFileName{"data/HistosPulserChecker.root"}; ClassDef(CbmMcbm2019CheckPulser,1); }; #endif // CBMMCBM2019CHECKPULSER_H