7f3718a508021ed779eda7acef82b67981185216
[u/mrichter/AliRoot.git] / STEER / AOD / AliAODpidUtil.h
1 #ifndef ALIAODPIDUTIL_H
2 #define ALIAODPIDUTIL_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4  * See cxx source for full Copyright notice                               */
5
6 /* $Id: AliAODpidUtil.h 38493 2010-01-26 16:33:03Z hristov $ */
7
8 //-------------------------------------------------------
9 //                    Combined PID class
10 //                    for the AOD class
11 //   Origin: Rosa Romita, GSI, r.romita@gsi.de 
12 //   Modified: Jens Wiechula, Uni Tuebingen, jens.wiechula@cern.ch
13 //   Modified: Pietro Antonioli, INFN BO, pietro.antonioli@bo.infn.it
14 //-------------------------------------------------------
15 #include <Rtypes.h>
16 #include <TMatrixD.h>
17 #include <AliLog.h>
18 #include "AliAODEvent.h" // Needed for inline functions
19 #include "AliAODTrack.h" // Needed for inline functions
20 #include "AliAODPid.h" // Needed for inline functions
21 #include "AliTOFHeader.h" //Needed for inline functions
22 //#include "HMPID/AliHMPID.h"
23
24 #include "AliPIDResponse.h"
25
26 class AliAODEvent;
27 class AliVParticle;
28
29 class AliAODpidUtil : public AliPIDResponse  {
30 public:
31   //TODO: isMC???
32   AliAODpidUtil(Bool_t isMC = kFALSE): AliPIDResponse(isMC) {;}
33   virtual ~AliAODpidUtil() {;}
34
35   Int_t MakePID(const AliAODTrack *track,Double_t *p) const;
36   void MakeTPCPID(const AliAODTrack *track,Double_t *p) const;
37   void MakeITSPID(const AliAODTrack *track,Double_t *p) const;
38   void MakeTOFPID(const AliAODTrack *track,Double_t *p) const;
39   //  void MakeHMPIDPID(AliESDtrack *track);
40   void MakeTRDPID(const AliAODTrack *track,Double_t *p) const;
41
42   virtual Float_t NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const;
43   
44   Float_t GetTPCsignalTunedOnData(const AliVTrack *t) const;
45
46 private:
47   
48   ClassDef(AliAODpidUtil,3)  // PID calculation class
49 };
50
51 inline Float_t AliAODpidUtil::NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const {
52   AliAODTrack *track=(AliAODTrack*)vtrack;
53   Bool_t oldAod=kTRUE;
54   Double_t sigTOF;
55   AliAODPid *pidObj = track->GetDetPid();
56   if (!pidObj) return -999.;
57   Double_t tofTime=pidObj->GetTOFsignal();
58   Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
59   Double_t sigmaTOFPid[AliPID::kSPECIES];
60   pidObj->GetTOFpidResolution(sigmaTOFPid);
61   AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
62   if (event) {  // protection if the user didn't call GetTrack, which sets the internal pointer
63     AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
64     if (tofH && (TMath::Abs(sigmaTOFPid[0]) <= 1.E-16) ) { // new AOD
65         sigTOF=fTOFResponse.GetExpectedSigma(track->P(),expTime,AliPID::ParticleMassZ(type)); //fTOFResponse is set in InitialiseEvent
66         tofTime -= fTOFResponse.GetStartTime(vtrack->P());
67         oldAod=kFALSE;
68     } 
69   } else {
70     AliError("pointer to AliAODEvent not found, please call GetTrack to set it");
71     return -996.;
72   }
73   if (oldAod) { // old AOD
74     if (type <= AliPID::kProton) {
75       sigTOF=sigmaTOFPid[type];
76     } else return -998.;  // light nuclei cannot be supported on old AOD because we don't have timeZero resolution
77   }
78   if (sigTOF>0) return (tofTime - expTime)/sigTOF;
79   else return -997.;
80 }
81
82 #endif
83
84