// Combined PID class
// for the AOD class
// Origin: Rosa Romita, GSI, r.romita@gsi.de
+// Modified: Jens Wiechula, Uni Tuebingen, jens.wiechula@cern.ch
//-------------------------------------------------------
#include <Rtypes.h>
#include <TMatrixD.h>
#include "AliAODTrack.h" // Needed for inline functions
#include "AliAODPid.h" // Needed for inline functions
-#include "AliTPCPIDResponse.h"
-#include "AliITSPIDResponse.h"
-#include "AliTOFPIDResponse.h"
-#include "AliTRDPIDResponse.h"
//#include "HMPID/AliHMPID.h"
+#include "AliPIDResponse.h"
+
class AliAODEvent;
+class AliVParticle;
-class AliAODpidUtil {
+class AliAODpidUtil : public AliPIDResponse {
public:
- AliAODpidUtil(): fRange(5.), fTPCResponse(), fITSResponse(), fTOFResponse(), fTRDResponse() {;}
+ //TODO: isMC???
+ AliAODpidUtil(Bool_t isMC = kFALSE): AliPIDResponse(isMC), fRange(5.) {;}
virtual ~AliAODpidUtil() {;}
-
- Int_t MakePID(AliAODTrack *track,Double_t *p) const;
- void MakeTPCPID(AliAODTrack *track,Double_t *p) const;
- void MakeITSPID(AliAODTrack *track,Double_t *p) const;
- void MakeTOFPID(AliAODTrack *track,Double_t *p) const;
+ Int_t MakePID(const AliAODTrack *track,Double_t *p) const;
+ void MakeTPCPID(const AliAODTrack *track,Double_t *p) const;
+ void MakeITSPID(const AliAODTrack *track,Double_t *p) const;
+ void MakeTOFPID(const AliAODTrack *track,Double_t *p) const;
// void MakeHMPIDPID(AliESDtrack *track);
- void MakeTRDPID(AliAODTrack *track,Double_t *p) const;
-
- Float_t NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const;
- Float_t NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const;
- Float_t NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const;
-
- AliITSPIDResponse &GetITSResponse() {return fITSResponse;}
- AliTPCPIDResponse &GetTPCResponse() {return fTPCResponse;}
- AliTOFPIDResponse &GetTOFResponse() {return fTOFResponse;}
+ void MakeTRDPID(const AliAODTrack *track,Double_t *p) const;
+ virtual Float_t NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const;
+
private:
Float_t fRange; // nSigma max in likelihood
- AliTPCPIDResponse fTPCResponse;
- AliITSPIDResponse fITSResponse;
- AliTOFPIDResponse fTOFResponse;
- AliTRDPIDResponse fTRDResponse;
-
- ClassDef(AliAODpidUtil,1) // PID calculation class
-};
-
-inline Float_t AliAODpidUtil::NumberOfSigmasTPC(const AliAODTrack *track, AliPID::EParticleType type) const {
- Double_t mom = track->P();
- AliAODPid *pidObj = track->GetDetPid();
- if (pidObj)
- mom = pidObj->GetTPCmomentum();
- return fTPCResponse.GetNumberOfSigmas(mom,pidObj->GetTPCsignal(),0,type);
-}
+ ClassDef(AliAODpidUtil,2) // PID calculation class
+};
-inline Float_t AliAODpidUtil::NumberOfSigmasTOF(const AliAODTrack *track, AliPID::EParticleType type) const {
+inline Float_t AliAODpidUtil::NumberOfSigmasTOF(const AliVParticle *vtrack, AliPID::EParticleType type) const {
+ AliAODTrack *track=(AliAODTrack*)vtrack;
Double_t times[AliPID::kSPECIES];
+ Double_t sigmaTOFPid[AliPID::kSPECIES];
AliAODPid *pidObj = track->GetDetPid();
+ if (!pidObj) return -999.;
pidObj->GetIntegratedTimes(times);
- return (pidObj->GetTOFsignal() - times[type])/fTOFResponse.GetExpectedSigma(track->P(),times[type],AliPID::ParticleMass(type));
+ pidObj->GetTOFpidResolution(sigmaTOFPid);
+ if (sigmaTOFPid[type]>0) return (pidObj->GetTOFsignal() - times[type])/sigmaTOFPid[type];
+ else return (pidObj->GetTOFsignal() - times[type])/fTOFResponse.GetExpectedSigma(track->P(),times[type],AliPID::ParticleMass(type));
}
-inline Float_t AliAODpidUtil::NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const {
- AliAODPid *pidObj = track->GetDetPid();
- Float_t dEdx=pidObj->GetITSsignal();
- UChar_t clumap=track->GetITSClusterMap();
- Int_t nPointsForPid=0;
- for(Int_t i=2; i<6; i++){
- if(clumap&(1<<i)) ++nPointsForPid;
- }
- Float_t mom=track->P();
- Bool_t isSA=kTRUE;
- if(track->GetTPCNcls()>0) isSA=kFALSE;
- return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,isSA);
-}
#endif