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