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