#include "AliAODTrack.h"
#include "AliAODPid.h"
#include "AliTRDPIDResponse.h"
+#include "AliESDtrack.h"
ClassImp(AliAODpidUtil)
- Int_t AliAODpidUtil::MakePID(AliAODTrack *track,Float_t TimeZeroTOF,Double_t *p) const {
+ Int_t AliAODpidUtil::MakePID(AliAODTrack *track,Double_t *p) const {
//
// Calculate probabilities for all detectors, except if TPConly==kTRUE
// and combine PID
Double_t tofPid[AliPID::kSPECIES];
Double_t trdPid[AliPID::kSPECIES];
MakeITSPID(track,itsPid);
- MakeTOFPID(track, TimeZeroTOF,tofPid);
+ MakeTOFPID(track,tofPid);
//MakeHMPIDPID(track);
MakeTRDPID(track,trdPid);
for (Int_t j=0; j<ns; j++) {
return 0;
}
//_________________________________________________________________________
-void AliAODpidUtil::MakeTPCPID(AliAODTrack *track,Double_t *p) const
+void AliAODpidUtil::MakeTPCPID(const AliAODTrack *track,Double_t *p) const
{
//
// TPC pid using bethe-bloch and gaussian response
//
- Double_t mom = track->P();
+ if ((track->GetStatus()&AliESDtrack::kTPCin )==0) return;
+
AliAODPid *pidObj = track->GetDetPid();
- if (pidObj) mom = pidObj->GetTPCmomentum();
-
- Double_t dedx=pidObj->GetTPCsignal();
+ Double_t mom = track->P();
+ Double_t dedx = 0.;
+ UShort_t nTPCClus = 0;
+ if (pidObj) {
+ nTPCClus = pidObj->GetTPCsignalN();
+ dedx = pidObj->GetTPCsignal();
+ mom = pidObj->GetTPCmomentum();
+ }
+
Bool_t mismatch=kTRUE;
for (Int_t j=0; j<AliPID::kSPECIES; j++) {
AliPID::EParticleType type=AliPID::EParticleType(j);
Double_t bethe=fTPCResponse.GetExpectedSignal(mom,type);
- Double_t sigma=fTPCResponse.GetExpectedSigma(mom,50,type);
+ Double_t sigma=fTPCResponse.GetExpectedSigma(mom,nTPCClus,type);
if (TMath::Abs(dedx-bethe) > fRange*sigma) {
p[j]=TMath::Exp(-0.5*fRange*fRange)/sigma;
} else {
}
if (mismatch)
- for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1/AliPID::kSPECIES;
+ for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1./AliPID::kSPECIES;
return;
}
//_________________________________________________________________________
-void AliAODpidUtil::MakeITSPID(AliAODTrack *track,Double_t *p) const
+void AliAODpidUtil::MakeITSPID(const AliAODTrack *track,Double_t *p) const
{
//
// ITS PID
//
+ if ((track->GetStatus()&AliESDtrack::kITSin)==0) return;
+ UChar_t clumap=track->GetITSClusterMap();
+ Int_t nPointsForPid=0;
+ for(Int_t i=2; i<6; i++){
+ if(clumap&(1<<i)) ++nPointsForPid;
+ }
+ if(nPointsForPid<3) { // track not to be used for combined PID purposes
+ for (Int_t j=0; j<AliPID::kSPECIES; j++)
+ p[j] = 1./AliPID::kSPECIES;
+ return;
+ }
Double_t mom=track->P();
AliAODPid *pidObj = track->GetDetPid();
- Double_t dedx=pidObj->GetITSsignal();
- Bool_t mismatch=kTRUE;
+ Double_t dedx = 0.;
+ if (pidObj) {
+ dedx = pidObj->GetITSsignal();
+ }
+
+ Bool_t mismatch = kTRUE;
+ Bool_t isSA = kTRUE;
+ if(track->GetStatus() & AliESDtrack::kTPCin){
+ isSA = kFALSE;
+ if (pidObj)
+ mom = pidObj->GetTPCmomentum();
+ }
for (Int_t j=0; j<AliPID::kSPECIES; j++) {
- Double_t mass=AliPID::ParticleMass(j);//GeV/c^2
- Double_t bethe=fITSResponse.Bethe(mom,mass);
- Double_t sigma=fITSResponse.GetResolution(bethe);
+ Double_t mass = AliPID::ParticleMass(j);//GeV/c^2
+ Double_t bethe = fITSResponse.Bethe(mom,mass);
+ Double_t sigma = fITSResponse.GetResolution(bethe,nPointsForPid,isSA);
if (TMath::Abs(dedx-bethe) > fRange*sigma) {
p[j]=TMath::Exp(-0.5*fRange*fRange)/sigma;
} else {
}
//_________________________________________________________________________
-void AliAODpidUtil::MakeTOFPID(AliAODTrack *track, Float_t TimeZeroTOF,Double_t *p) const
+void AliAODpidUtil::MakeTOFPID(const AliAODTrack *track, Double_t *p) const
{
//
// TOF PID using gaussian response
//
+ if ((track->GetStatus()&AliESDtrack::kTOFout )==0) return;
+ if ((track->GetStatus()&AliESDtrack::kTIME )==0) return;
+ if ((track->GetStatus()&AliESDtrack::kTOFpid )==0) return;
Double_t time[AliPID::kSPECIESN];
Double_t sigma[AliPID::kSPECIESN];
sigma[AliPID::kProton]
));
- Double_t tof = pidObj->GetTOFsignal() - TimeZeroTOF;
+ Double_t tof = pidObj->GetTOFsignal();
Bool_t mismatch = kTRUE;
for (Int_t j=0; j<AliPID::kSPECIES; j++) {
}
if (mismatch)
- for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1/AliPID::kSPECIES;
+ for (Int_t j=0; j<AliPID::kSPECIES; j++) p[j]=1./AliPID::kSPECIES;
return;
}
//_________________________________________________________________________
-void AliAODpidUtil::MakeTRDPID(AliAODTrack *track,Double_t *p) const
+void AliAODpidUtil::MakeTRDPID(const AliAODTrack *track,Double_t *p) const
{
// Method to recalculate the TRD PID probabilities
+ if ((track->GetStatus()&AliESDtrack::kTRDout )==0) return;
+
AliAODPid *pidObj = track->GetDetPid();
Float_t *mom=pidObj->GetTRDmomentum();
- Double_t *dedx=pidObj->GetTRDsignal();
+ Int_t ntracklets=0;
+ for(Int_t iPl=0;iPl<6;iPl++){
+ if(mom[iPl]>0.) ntracklets++;
+ }
+ if(ntracklets<4) return;
+
+ Double_t* dedx=pidObj->GetTRDsignal();
Bool_t norm=kTRUE;
fTRDResponse.GetResponse(pidObj->GetTRDnSlices(),dedx,mom,p,norm);
return;