]> git.uio.no Git - u/mrichter/AliRoot.git/blob - STEER/STEERBase/AliPIDResponse.h
- use mass/z for Light Nuclei in all TPC response functions
[u/mrichter/AliRoot.git] / STEER / STEERBase / AliPIDResponse.h
1 #ifndef ALIPIDRESPONSE_H
2 #define ALIPIDRESPONSE_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 //---------------------------------------------------------------//
7 //        Base class for handling the pid response               //
8 //        functions of all detectors                             //
9 //        and give access to the nsigmas                         //
10 //                                                               //
11 //   Origin: Jens Wiechula, Uni Tuebingen, jens.wiechula@cern.ch //
12 //---------------------------------------------------------------//
13
14 #include "AliITSPIDResponse.h"
15 #include "AliTPCPIDResponse.h"
16 #include "AliTRDPIDResponse.h"
17 #include "AliTOFPIDResponse.h"
18 #include "AliEMCALPIDResponse.h"
19
20
21 #include "AliVParticle.h"
22 #include "AliVTrack.h"
23
24 #include "TNamed.h"
25
26 class TF1;
27 class TObjArray;
28 class TLinearFitter;
29
30 class AliVEvent;
31 class AliTRDPIDResponseObject;
32 class AliTOFPIDParams;
33 class AliOADBContainer;
34
35 class AliPIDResponse : public TNamed {
36 public:
37   AliPIDResponse(Bool_t isMC=kFALSE);
38   virtual ~AliPIDResponse();
39
40   enum EDetector {
41     kITS=0,
42     kTPC=1,
43     kTRD=2,
44     kTOF=3,
45     kHMPID=4,
46     kEMCAL=5,
47     kPHOS=6,
48     kNdetectors=7
49   };
50   
51   enum EDetCode {
52     kDetITS = 0x1,
53     kDetTPC = 0x2,
54     kDetTRD = 0x4,
55     kDetTOF = 0x8,
56     kDetHMPID = 0x10,
57     kDetEMCAL = 0x20,
58     kDetPHOS = 0x40
59   };
60
61   enum EStartTimeType_t {kFILL_T0,kTOF_T0, kT0_T0, kBest_T0};
62
63   enum ITSPIDmethod { kITSTruncMean, kITSLikelihood };
64
65   enum EDetPidStatus {
66     kDetNoSignal=0,
67     kDetPidOk=1,
68     kDetMismatch=2,
69     kDetNoParams=3
70   };
71
72   AliITSPIDResponse &GetITSResponse() {return fITSResponse;}
73   AliTPCPIDResponse &GetTPCResponse() {return fTPCResponse;}
74   AliTOFPIDResponse &GetTOFResponse() {return fTOFResponse;}
75   AliTRDPIDResponse &GetTRDResponse() {return fTRDResponse;}
76   AliEMCALPIDResponse &GetEMCALResponse() {return fEMCALResponse;}
77
78   // -----------------------------------------
79   // buffered getters
80   //
81   
82   // Number of sigmas
83   EDetPidStatus NumberOfSigmas(EDetector detCode, const AliVParticle *track, AliPID::EParticleType type, Double_t &val) const;
84   
85   Float_t NumberOfSigmas(EDetector detCode, const AliVParticle *track, AliPID::EParticleType type) const;
86   
87   virtual Float_t NumberOfSigmasITS  (const AliVParticle *track, AliPID::EParticleType type) const;
88   virtual Float_t NumberOfSigmasTPC  (const AliVParticle *track, AliPID::EParticleType type) const;
89   virtual Float_t NumberOfSigmasTPC  (const AliVParticle *track, AliPID::EParticleType type, AliTPCPIDResponse::ETPCdEdxSource dedxSource) const;
90   virtual Float_t NumberOfSigmasEMCAL(const AliVParticle *track, AliPID::EParticleType type, Double_t &eop, Double_t showershape[4]) const;
91   virtual Float_t NumberOfSigmasTOF  (const AliVParticle *track, AliPID::EParticleType type) const;
92   virtual Float_t NumberOfSigmasTOF  (const AliVParticle *track, AliPID::EParticleType type, const Float_t /*timeZeroTOF*/) const { return NumberOfSigmasTOF(track,type); }
93   virtual Float_t NumberOfSigmasEMCAL(const AliVParticle *track, AliPID::EParticleType type) const;
94
95   Bool_t IdentifiedAsElectronTRD(const AliVTrack *track, Double_t efficiencyLevel,Double_t centrality=-1,AliTRDPIDResponse::ETRDPIDMethod PIDmethod=AliTRDPIDResponse::kLQ1D) const;
96
97   // Probabilities
98   EDetPidStatus ComputePIDProbability  (EDetCode  detCode, const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
99   EDetPidStatus ComputePIDProbability  (EDetector detCode, const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
100   
101   virtual EDetPidStatus ComputeITSProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
102   virtual EDetPidStatus ComputeTPCProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
103   virtual EDetPidStatus ComputeTOFProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
104   virtual EDetPidStatus ComputeTRDProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
105   virtual EDetPidStatus ComputeEMCALProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
106   virtual EDetPidStatus ComputePHOSProbability (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
107   virtual EDetPidStatus ComputeHMPIDProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
108
109   virtual EDetPidStatus ComputeTRDProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[],AliTRDPIDResponse::ETRDPIDMethod PIDmethod) const;
110   
111   // pid status
112   EDetPidStatus CheckPIDStatus(EDetector detCode, const AliVTrack *track)  const;
113
114   Float_t GetTOFMismatchProbability(const AliVTrack *track) const;
115   
116   void SetITSPIDmethod(ITSPIDmethod pmeth) { fITSPIDmethod = pmeth; }
117   
118   void SetOADBPath(const char* path) {fOADBPath=path;}
119   const char *GetOADBPath() const {return fOADBPath.Data();}
120
121   void SetCustomTPCpidResponse(const char* tpcpid) { fCustomTPCpidResponse = tpcpid; }
122   const char* GetCustomTPCpidResponse() const { return fCustomTPCpidResponse.Data(); }
123   
124   void InitialiseEvent(AliVEvent *event, Int_t pass, Int_t run=-1);
125   void SetCurrentFile(const char* file) { fCurrentFile=file; }
126
127   // cache PID in the track
128   void SetCachePID(Bool_t cache)    { fCachePID=cache;  }
129   Bool_t GetCachePID() const { return fCachePID; }
130   void FillTrackDetectorPID(const AliVTrack *track, EDetector detector) const;
131   void FillTrackDetectorPID();
132
133   AliVEvent * GetCurrentEvent() const {return fCurrentEvent;}
134
135   // User settings for the MC period and reco pass
136   void SetMCperiod(const char *mcPeriod) {fMCperiodUser=mcPeriod;}
137   void SetRecoPass(Int_t recoPass)       {fRecoPassUser=recoPass;}
138
139   // event info
140   Float_t GetCurrentCentrality() const {return fCurrCentrality;};
141
142   // TPC setting
143   void SetUseTPCEtaCorrection(Bool_t useEtaCorrection = kTRUE) { fUseTPCEtaCorrection = useEtaCorrection; };
144   Bool_t UseTPCEtaCorrection() const { return fUseTPCEtaCorrection; };
145   
146   // TOF setting
147   void SetTOFtail(Float_t tail=1.1){if(tail > 0) fTOFtail=tail; else printf("TOF tail should be greater than 0 (nothing done)\n");};
148   void SetTOFResponse(AliVEvent *vevent,EStartTimeType_t option);
149
150   virtual Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const {return t->GetTPCsignal();};
151   Bool_t IsTunedOnData() const {return fTuneMConData;};
152   void SetTunedOnData(Bool_t flag=kTRUE,Int_t recoPass=0){fTuneMConData = flag; if(recoPass>0) fRecoPassUser = recoPass;};
153
154   AliPIDResponse(const AliPIDResponse &other);
155   AliPIDResponse& operator=(const AliPIDResponse &other);
156
157   
158 protected:
159   AliITSPIDResponse fITSResponse;    //PID response function of the ITS
160   AliTPCPIDResponse fTPCResponse;    //PID response function of the TPC
161   AliTRDPIDResponse fTRDResponse;    //PID response function of the TRD
162   AliTOFPIDResponse fTOFResponse;    //PID response function of the TOF
163   AliEMCALPIDResponse fEMCALResponse;  //PID response function of the EMCAL
164
165   Float_t           fRange;          // nSigma max in likelihood
166   ITSPIDmethod      fITSPIDmethod;   // 0 = trunc mean; 1 = likelihood
167
168   //unbuffered PID calculation
169   virtual Float_t GetNumberOfSigmasTOFold  (const AliVParticle */*track*/, AliPID::EParticleType /*type*/) const {return 0;}
170   EDetPidStatus GetComputeTRDProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[],AliTRDPIDResponse::ETRDPIDMethod PIDmethod=AliTRDPIDResponse::kLQ1D) const;
171   EDetPidStatus GetTOFPIDStatus(const AliVTrack *track) const;
172
173 private:
174   Bool_t fIsMC;                        //  If we run on MC data
175   Bool_t fCachePID;
176
177   TString fOADBPath;                   // OADB path to use
178   TString fCustomTPCpidResponse;       // Custom TPC Pid Response file for debugging purposes
179   
180   TString fBeamType;                   //! beam type (PP) or (PBPB)
181   TString fLHCperiod;                  //! LHC period
182   TString fMCperiodTPC;                //! corresponding MC period to use for the TPC splines
183   TString fMCperiodUser;               //  MC prodution requested by the user
184   TString fCurrentFile;                //! name of currently processed file
185   Int_t   fRecoPass;                   //! reconstruction pass
186   Int_t   fRecoPassUser;               //  reconstruction pass explicitly set by the user
187   Int_t   fRun;                        //! current run number
188   Int_t   fOldRun;                     //! current run number
189   Float_t fResT0A;                     //! T0A resolution in current run
190   Float_t fResT0C;                     //! T0C resolution in current run
191   Float_t fResT0AC;                    //! T0A.and.T0C resolution in current run
192   
193   TObjArray *fArrPidResponseMaster;    //!  TPC pid splines
194   TF1       *fResolutionCorrection;    //! TPC resolution correction
195   AliOADBContainer* fOADBvoltageMaps;  //! container with the voltage maps
196   Bool_t fUseTPCEtaCorrection;         // Use TPC eta correction
197
198   AliTRDPIDResponseObject *fTRDPIDResponseObject; //! TRD PID Response Object
199
200   Float_t fTOFtail;                    //! TOF tail effect used in TOF probability
201   AliTOFPIDParams *fTOFPIDParams;      //! TOF PID Params - period depending (OADB loaded)
202
203   TObjArray *fEMCALPIDParams;             //! EMCAL PID Params
204
205   AliVEvent *fCurrentEvent;            //! event currently being processed
206
207   Float_t fCurrCentrality;             //! current centrality
208   
209   Bool_t fTuneMConData;                // switch to force the MC to be similar to data (dE/dx)
210   
211   void ExecNewRun();
212   
213   //
214   //setup parametrisations
215   //
216
217   //ITS
218   void SetITSParametrisation();
219   
220   //TPC
221   void SetTPCEtaMaps(Double_t refineFactorMapX = 6.0, Double_t refineFactorMapY = 6.0, Double_t refineFactorSigmaMapX = 6.0,
222                      Double_t refineFactorSigmaMapY = 6.0);
223   void SetTPCPidResponseMaster();
224   void SetTPCParametrisation();
225   Double_t GetTPCMultiplicityBin(const AliVEvent * const event);
226   
227   // TPC helpers for the eta maps
228   void AddPointToHyperplane(TH2D* h, TLinearFitter* linExtrapolation, Int_t binX, Int_t binY);
229   TH2D* RefineHistoViaLinearInterpolation(TH2D* h, Double_t refineFactorX = 6.0, Double_t refineFactorY = 6.0);
230
231   //TRD
232   void SetTRDPidResponseMaster();
233   void InitializeTRDResponse();
234   void SetTRDSlices(UInt_t TRDslicesForPID[2],AliTRDPIDResponse::ETRDPIDMethod method) const;
235
236   //TOF
237   void SetTOFPidResponseMaster();
238   void InitializeTOFResponse();
239
240   //EMCAL
241   void SetEMCALPidResponseMaster();
242   void InitializeEMCALResponse();
243
244   //
245   void SetRecoInfo();
246
247   //-------------------------------------------------
248   //unbuffered PID calculation
249   //
250   
251   // Number of sigmas
252   Float_t GetNumberOfSigmas(EDetector detCode, const AliVParticle *track, AliPID::EParticleType type) const;
253   Float_t GetNumberOfSigmasITS  (const AliVParticle *track, AliPID::EParticleType type) const;
254   Float_t GetNumberOfSigmasTPC  (const AliVParticle *track, AliPID::EParticleType type) const;
255   Float_t GetNumberOfSigmasTOF  (const AliVParticle *track, AliPID::EParticleType type) const;
256   Float_t GetNumberOfSigmasEMCAL(const AliVParticle *track, AliPID::EParticleType type, Double_t &eop, Double_t showershape[4]) const;
257   Float_t GetNumberOfSigmasEMCAL(const AliVParticle *track, AliPID::EParticleType type) const;
258
259   Float_t GetBufferedNumberOfSigmas(EDetector detCode, const AliVParticle *track, AliPID::EParticleType type) const;
260   
261   // Probabilities
262   EDetPidStatus GetComputePIDProbability  (EDetector detCode,  const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
263   EDetPidStatus GetComputeITSProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
264   EDetPidStatus GetComputeTPCProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
265   EDetPidStatus GetComputeTOFProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
266   EDetPidStatus GetComputeEMCALProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
267   EDetPidStatus GetComputePHOSProbability (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
268   EDetPidStatus GetComputeHMPIDProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
269
270   // pid status
271   EDetPidStatus GetPIDStatus(EDetector det, const AliVTrack *track) const;
272   EDetPidStatus GetITSPIDStatus(const AliVTrack *track) const;
273   EDetPidStatus GetTPCPIDStatus(const AliVTrack *track) const;
274   EDetPidStatus GetTRDPIDStatus(const AliVTrack *track) const;
275   EDetPidStatus GetHMPIDPIDStatus(const AliVTrack *track) const;
276   EDetPidStatus GetPHOSPIDStatus(const AliVTrack *track) const;
277   EDetPidStatus GetEMCALPIDStatus(const AliVTrack *track) const;
278
279   ClassDef(AliPIDResponse, 11);  //PID response handling
280 };
281
282 #endif