#ifndef CBMTRDMODULESIMR_H #define CBMTRDMODULESIMR_H #include "CbmTrdModuleSim.h" #include "CbmTrdRawToDigiR.h" #include "CbmTrdCheckUtil.h" class TRandom3; class TFile; class TH2D; class TH1I; class TH1D; class CbmTrdParSetAsic; class CbmTimeSlice; /** * \brief Simulation module implementation for rectangular pad geometry **/ class CbmTrdModuleSimR : public CbmTrdModuleSim { public: CbmTrdModuleSimR(Int_t mod, Int_t ly, Int_t rot); virtual ~CbmTrdModuleSimR() {;} void GetCounters(Int_t &nEl, Int_t &nLattice, Int_t &nOverThr) const {nEl=nofElectrons; nLattice=nofLatticeHits; nOverThr=nofPointsAboveThreshold;} Int_t FlushBuffer(ULong64_t time=0); Bool_t MakeDigi(CbmTrdPoint *p, Double_t time, Bool_t TR); Bool_t MakeRaw(/*CbmTrdPoint *p*/) { return kTRUE;} //seter functions void SetAsicPar(CbmTrdParSetAsic *p=NULL); void SetNCluster(Int_t nCluster) { fnClusterConst = nCluster;} void SetNoiseLevel(Double_t sigma_keV); void SetDistributionPoints(Int_t points); void SetSpadicResponse(Double_t calibration, Double_t tau); void SetPulsePars(Int_t mode); void SetPulseMode(Bool_t pulsed); void SetRadiator(CbmTrdRadiator *radiator) {fRadiator = radiator;} void SetGamma(Double_t gamma) {fGamma = gamma;} void SetTriggerThreshold(Double_t minCharge) { fMinimumChargeTH = minCharge;} void SetPadPlaneScanArea(Int_t row); void ResetCounters() {nofElectrons=0; nofLatticeHits=0; nofPointsAboveThreshold=0;} void SetMessageConverter(CbmTrdRawToDigiR *conv) {fMessageConverter=conv;} void GetModuleType(CbmTrdRawToDigiR *conv) {fMessageConverter=conv;} void SetQA(CbmTrdCheckUtil *qa) {fQA=qa;} private: CbmTrdModuleSimR& operator=(const CbmTrdModuleSimR&); CbmTrdModuleSimR(const CbmTrdModuleSimR&); //pulsed mode void AddDigitoPulseBuffer(Int_t address, Double_t reldrift,Double_t charge, Double_t chargeTR, Double_t time, Int_t trigger,Int_t epoints, Int_t ipoint); std::vector MakePulse(Double_t charge,std::vector pulse, Int_t address); void AddToPulse(Int_t address, Double_t charge,Double_t reldrift,std::vector pulse); Bool_t CheckMulti(Int_t address, std::vector pulse); Int_t CheckTrigger(std::vector pulse); Double_t CalcResponse(Double_t t); void ProcessPulseBuffer(Int_t address, Bool_t FNcall, Bool_t MultiCall, Bool_t down, Bool_t up); Int_t GetMultiBin(std::vector pulse); //vintage EB void AddDigi(Int_t address, Double_t charge, Double_t chargeTR, Double_t time, Int_t trigger); //non pulsed TB mode void AddDigitoBuffer(Int_t address, Double_t charge, Double_t chargeTR, Double_t time, Int_t trigger); void ProcessBuffer(Int_t address); //Buffer managment void CheckBuffer(Bool_t EB); void CleanUp(Bool_t EB); //general tools Bool_t DistributeCharge(Double_t pointin[3],Double_t pointout[3],Double_t delta[3],Double_t pos[3],Int_t ipoints); Double_t AddDrifttime(Double_t x,Double_t z); Double_t AddDrifttime(Int_t x); Double_t AddNoise(Double_t charge); Double_t GetStep(Double_t dist, Int_t roll); std::pair> GetTotalSteps(Double_t In[3],Double_t Out[3],Double_t dist); Int_t AddNoiseADC(); Int_t AddCrosstalk(Double_t address,Int_t i, Int_t sec,Int_t row,Int_t col,Int_t ncols); Double_t CalcPRF(Double_t x, Double_t W, Double_t h); void CheckTime(Int_t address); void NoiseTime(ULong64_t eventTime); void SetDist(Int_t dist) {fDistributionMode=dist;} std::vector AddCorrelatedNoise(std::vector pulse); //general MC data usage - distributing MC charge over the pad plane void ScanPadPlane(const Double_t* local_point, Double_t reldrift,Double_t clusterELoss, Double_t clusterELossTR, Int_t epoints,Int_t ipoint); //spadic response parameters Double_t fCalibration=35./1.1107/0.8*1.5; // calibrating pulse height to MIP Double_t fEReco=0.; // calibrating energy reconstruction to the amount and position of used samples of the pulse Double_t fTau=120.0; // peaking time of the pulse Double_t fTriggerSlope=12.0; // trigger setting of the pulse Int_t fRecoMode=2; // mode for reconstruction samples //general globals Double_t fSigma_noise_keV; Double_t fMinimumChargeTH; Double_t fCurrentTime; Double_t fAddress; Double_t fLastEventTime; Double_t fEventTime; Double_t fLastTime; Double_t fCollectTime; Int_t fnClusterConst; Int_t fnScanRowConst; Bool_t fPulseSwitch; Bool_t fPrintPulse; Bool_t fTimeShift; Bool_t fAddCrosstalk; Bool_t fClipping; Int_t fepoints; Int_t fAdcNoise; Int_t fDistributionMode; Double_t fCrosstalkLevel; Int_t fLastPoint=0; Int_t fLastEvent=0; Int_t frecostart=2; Int_t frecostop=5; Int_t fClipLevel=500; Int_t fPresamples=2; Int_t fShapingOrder=1; Int_t fMaxBin=2+fPresamples; Int_t fMinBin=0+fPresamples; Double_t fGamma=0.; Double_t fMinDrift=12.5; CbmTimeSlice* fTimeSlice=NULL; ///< link to CBM time slice //counters Int_t nofElectrons; Int_t nofLatticeHits; Int_t nofPointsAboveThreshold; Double_t fDriftStart=0; std::map>> fAnalogBuffer; std::map, CbmMatch*>> fPulseBuffer; std::map> fMultiBuffer; std::map fTimeBuffer; std::map fShiftQA; std::map>> fLinkQA; std::map fMCQA; std::map>> fMCBuffer; Float_t fQAPosition[3]={0.,0.,0.}; Float_t fQAPos_out[3]={0.,0.,0.}; CbmTrdRawToDigiR* fMessageConverter = NULL; TH2D* fDriftTime = NULL; CbmTrdCheckUtil* fQA = NULL; Bool_t fDebug=false; ClassDef(CbmTrdModuleSimR, 1) // Simulation module implementation for rectangular pad geometry }; #endif