df581906260d810e5bb425e90c4bf859083e00dc
[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 AliVEvent;
27 class TF1;
28 class AliTRDPIDResponseObject; 
29
30 class AliPIDResponse : public TNamed {
31 public:
32   AliPIDResponse(Bool_t isMC=kFALSE);
33   virtual ~AliPIDResponse();
34
35   enum EDetCode {
36     kDetITS = 0x1,
37     kDetTPC = 0x2,
38     kDetTRD = 0x4,
39     kDetTOF = 0x8,
40     kDetHMPID = 0x10,
41     kDetEMCAL = 0x20,
42     kDetPHOS = 0x40
43   };
44
45   enum EStartTimeType_t {kFILL_T0,kTOF_T0, kT0_T0, kBest_T0};
46
47   enum ITSPIDmethod { kITSTruncMean, kITSLikelihood };
48
49   enum EDetPidStatus {
50     kDetNoSignal=0,
51     kDetPidOk=1,
52     kDetMismatch=2
53   };
54   
55   AliITSPIDResponse &GetITSResponse() {return fITSResponse;}
56   AliTPCPIDResponse &GetTPCResponse() {return fTPCResponse;}
57   AliTOFPIDResponse &GetTOFResponse() {return fTOFResponse;}
58   AliTRDPIDResponse &GetTRDResponse() {return fTRDResponse;}
59   AliEMCALPIDResponse &GetEMCALResponse() {return fEMCALResponse;}
60
61   Float_t NumberOfSigmas(EDetCode detCode, const AliVParticle *track, AliPID::EParticleType type) const;
62   
63   virtual Float_t NumberOfSigmasITS(const AliVParticle *track, AliPID::EParticleType type) const;
64   virtual Float_t NumberOfSigmasTPC(const AliVParticle *track, AliPID::EParticleType type) const;
65   virtual Float_t NumberOfSigmasEMCAL(const AliVTrack *track, AliPID::EParticleType type) const;
66   virtual Float_t NumberOfSigmasEMCAL(const AliVTrack *track, AliPID::EParticleType type, Double_t &eop, Double_t showershape[4]) const;
67   virtual Float_t NumberOfSigmasTOF(const AliVParticle *track, AliPID::EParticleType type) const = 0;
68   virtual Bool_t IdentifiedAsElectronTRD(const AliVTrack *track, Double_t efficiencyLevel) const;
69
70   EDetPidStatus ComputePIDProbability  (EDetCode detCode, const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
71   
72   EDetPidStatus ComputeITSProbability  (const AliVTrack *track, Int_t nSpecies, Double_t  p[]) const;
73   EDetPidStatus ComputeTPCProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
74   EDetPidStatus ComputeTOFProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
75   EDetPidStatus ComputeTRDProbability  (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
76   EDetPidStatus ComputeEMCALProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
77   EDetPidStatus ComputePHOSProbability (const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
78   EDetPidStatus ComputeHMPIDProbability(const AliVTrack *track, Int_t nSpecies, Double_t p[]) const;
79
80   void SetTRDPIDmethod(AliTRDPIDResponse::ETRDPIDMethod method=AliTRDPIDResponse::kLQ1D);
81   
82   void SetITSPIDmethod(ITSPIDmethod pmeth) { fITSPIDmethod = pmeth; }
83   void SetTRDslicesForPID(UInt_t slice1, UInt_t slice2) {fTRDslicesForPID[0]=slice1;fTRDslicesForPID[1]=slice2;}
84   
85   void SetOADBPath(const char* path) {fOADBPath=path;}
86   const char *GetOADBPath() const {return fOADBPath.Data();}
87   void InitialiseEvent(AliVEvent *event, Int_t pass);
88   void SetCurrentFile(const char* file) { fCurrentFile=file; }
89
90   AliVEvent * GetCurrentEvent() const {return fCurrentEvent;}
91
92   // User settings for the MC period and reco pass
93   void SetMCperiod(const char *mcPeriod) {fMCperiodUser=mcPeriod;}
94   void SetRecoPass(Int_t recoPass)       {fRecoPassUser=recoPass;}
95
96   // event info
97   Float_t GetCurrentCentrality() const {return fCurrCentrality;};
98
99   // TOF setting
100   void SetTOFtail(Float_t tail=1.1){if(tail > 0) fTOFtail=tail; else printf("TOF tail should be greater than 0 (nothing done)\n");};
101   void SetTOFResponse(AliVEvent *vevent,EStartTimeType_t option);
102
103   virtual Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const {return t->GetTPCsignal();};
104   Bool_t IsTunedOnData() const {return fTuneMConData;};
105   void SetTunedOnData(Bool_t flag=kTRUE,Int_t recoPass=0){fTuneMConData = flag; if(recoPass>0) fRecoPassUser = recoPass;};
106
107   AliPIDResponse(const AliPIDResponse &other);
108   AliPIDResponse& operator=(const AliPIDResponse &other);
109
110   
111 protected:
112   AliITSPIDResponse fITSResponse;    //PID response function of the ITS
113   AliTPCPIDResponse fTPCResponse;    //PID response function of the TPC
114   AliTRDPIDResponse fTRDResponse;    //PID response function of the TRD
115   AliTOFPIDResponse fTOFResponse;    //PID response function of the TOF
116   AliEMCALPIDResponse fEMCALResponse;  //PID response function of the EMCAL
117
118   Float_t           fRange;          // nSigma max in likelihood
119   ITSPIDmethod      fITSPIDmethod;   // 0 = trunc mean; 1 = likelihood
120
121 private:
122   Bool_t fIsMC;                        //  If we run on MC data
123
124   TString fOADBPath;                   // OADB path to use
125   
126   TString fBeamType;                   //! beam type (PP) or (PBPB)
127   TString fLHCperiod;                  //! LHC period
128   TString fMCperiodTPC;                //! corresponding MC period to use for the TPC splines
129   TString fMCperiodUser;               //  MC prodution requested by the user
130   TString fCurrentFile;                //! name of currently processed file
131   Int_t   fRecoPass;                   //! reconstruction pass
132   Int_t   fRecoPassUser;               //  reconstruction pass explicitly set by the user
133   Int_t   fRun;                        //! current run number
134   Int_t   fOldRun;                     //! current run number
135   
136   TObjArray *fArrPidResponseMaster;    //!  TPC pid splines
137   TF1       *fResolutionCorrection;    //! TPC resolution correction
138
139   AliTRDPIDResponseObject *fTRDPIDResponseObject; //! TRD PID Response Object
140   UInt_t fTRDslicesForPID[2];           //! TRD PID slices
141
142   Float_t fTOFtail;                    //! TOF tail effect used in TOF probability
143   AliTOFPIDParams *fTOFPIDParams;      //! TOF PID Params - period depending (OADB loaded)
144
145   TObjArray *fEMCALPIDParams;             //! EMCAL PID Params
146
147   AliVEvent *fCurrentEvent;            //! event currently being processed
148
149   Float_t fCurrCentrality;             //! current centrality
150   
151   Bool_t fTuneMConData;                // switch to force the MC to be similar to data (dE/dx)
152
153   void ExecNewRun();
154   
155   //
156   //setup parametrisations
157   //
158
159   //ITS
160   void SetITSParametrisation();
161   
162   //TPC
163   void SetTPCPidResponseMaster();
164   void SetTPCParametrisation();
165   Double_t GetTPCMultiplicityBin(const AliVEvent * const event);
166
167   //TRD
168   void SetTRDPidResponseMaster();
169   void InitializeTRDResponse();
170
171   //TOF
172   void SetTOFPidResponseMaster();
173   void InitializeTOFResponse();
174
175   //EMCAL
176   void SetEMCALPidResponseMaster();
177   void InitializeEMCALResponse();
178
179   //
180   void SetRecoInfo();
181   
182   ClassDef(AliPIDResponse, 8);  //PID response handling
183 };
184
185 inline Float_t AliPIDResponse::NumberOfSigmasTPC(const AliVParticle *vtrack, AliPID::EParticleType type) const {
186   AliVTrack *track=(AliVTrack*)vtrack;
187   Double_t mom  = track->GetTPCmomentum();
188   Double_t sig  = track->GetTPCsignal();
189   UInt_t   sigN = track->GetTPCsignalN();
190
191   if(fTuneMConData) sig = GetTPCsignalTunedOnData(track);
192
193   Double_t nSigma = -999.;
194   if (sigN>0) nSigma=fTPCResponse.GetNumberOfSigmas(mom,sig,sigN,type);
195
196   return nSigma;
197 }
198
199 inline Float_t AliPIDResponse::NumberOfSigmasITS(const AliVParticle *vtrack, AliPID::EParticleType type) const {
200   AliVTrack *track=(AliVTrack*)vtrack;
201   Float_t dEdx=track->GetITSsignal();
202   if (dEdx<=0) return -999.;
203   
204   UChar_t clumap=track->GetITSClusterMap();
205   Int_t nPointsForPid=0;
206   for(Int_t i=2; i<6; i++){
207     if(clumap&(1<<i)) ++nPointsForPid;
208   }
209   Float_t mom=track->P();
210   Bool_t isSA=kTRUE;
211   if(track->GetTPCNcls()>0) isSA=kFALSE;
212   return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,isSA);
213 }
214
215 #endif