for(Int_t i=2; i<6; i++){
if(clumap&(1<<i)) ++nPointsForPid;
}
- if(nPointsForPid<3) return;// track not to be used for PID purposes
-
+ 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 = 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 {
inline Float_t AliAODpidUtil::NumberOfSigmasITS(const AliAODTrack *track, AliPID::EParticleType type) const {
AliAODPid *pidObj = track->GetDetPid();
- return fITSResponse.GetNumberOfSigmas(track->P(),pidObj->GetITSsignal(),type);
+ 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;
+ }
+ if(track->GetTPCNcls()>0){
+ Float_t mom=pidObj->GetTPCmomentum();
+ return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,kFALSE);
+ }else{
+ Float_t mom=track->P();
+ return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,kTRUE);
+ }
}
#endif
Double_t mom=track->GetP();
if (fITSPIDmethod == kITSTruncMean) {
Double_t dedx=track->GetITSsignal();
+ Bool_t isSA=kTRUE;
+ Double_t momITS=mom;
+ ULong_t trStatus=track->GetStatus();
+ if(trStatus&AliESDtrack::kTPCin){
+ isSA=kFALSE;
+ const AliExternalTrackParam *in = track->GetInnerParam();
+ momITS=in->P();
+ }
+ 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
+ track->ResetStatus(AliESDtrack::kITSpid);
+ return;
+ }
+
Double_t p[10];
+
Bool_t mismatch=kTRUE, heavy=kTRUE;
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 bethe=fITSResponse.Bethe(momITS,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 {
}
inline Float_t AliESDpid::NumberOfSigmasITS(const AliESDtrack *track, AliPID::EParticleType type) const {
- return fITSResponse.GetNumberOfSigmas(track->GetP(),track->GetITSsignal(),type);
+ ULong_t trStatus=track->GetStatus();
+ Float_t dEdx=track->GetITSsignal();
+ UChar_t clumap=track->GetITSClusterMap();
+ Int_t nPointsForPid=0;
+ for(Int_t i=2; i<6; i++){
+ if(clumap&(1<<i)) ++nPointsForPid;
+ }
+ if(trStatus&AliESDtrack::kTPCin){
+ const AliExternalTrackParam *in = track->GetInnerParam();
+ Float_t mom=in->P();
+ return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,kFALSE);
+ }else{
+ Float_t mom=track->P();
+ return fITSResponse.GetNumberOfSigmas(mom,dEdx,type,nPointsForPid,kTRUE);
+ }
}
#endif
ClassImp(AliITSPIDResponse)
-AliITSPIDResponse::AliITSPIDResponse():
+AliITSPIDResponse::AliITSPIDResponse(Bool_t isMC):
fRes(0.13),
fKp1(15.77),
fKp2(4.95),
fKp4(2.14),
fKp5(0.82)
{
+ if(!isMC){
+ fBBtpcits[0]=0.73;
+ fBBtpcits[1]=14.68;
+ fBBtpcits[2]=0.905;
+ fBBtpcits[3]=1.2;
+ fBBtpcits[4]=6.6;
+ fBBsa[0]=5.33458E4;
+ fBBsa[1]=16.5303;
+ fBBsa[2]=2.60065E-3;
+ fBBsa[3]=3.59533E-4;
+ fBBsa[4]=7.51168E-5;
+ for(Int_t i=0; i<5;i++) fResolSA[i]=0.15;
+ for(Int_t i=0; i<5;i++) fResolTPCITS[i]=0.13;
+ }else{
+ fBBtpcits[0]=0.73;
+ fBBtpcits[1]=14.68;
+ fBBtpcits[2]=0.905;
+ fBBtpcits[3]=0.2;
+ fBBtpcits[4]=6.6;
+ fBBsa[0]=139.1;
+ fBBsa[1]=23.36;
+ fBBsa[2]=0.06052;
+ fBBsa[3]=0.2043;
+ fBBsa[4]=-0.0004999;
+ for(Int_t i=0; i<5;i++) fResolSA[i]=0.15;
+ for(Int_t i=0; i<5;i++) fResolTPCITS[i]=0.13;
+ }
}
//_________________________________________________________________________
}
-Double_t AliITSPIDResponse::Bethe(Double_t p,Double_t mass) const {
+Double_t AliITSPIDResponse::BetheAleph(Double_t p, Double_t mass) const {
//
// returns AliExternalTrackParam::BetheBloch normalized to
// fgMIP at the minimum
//
+
Double_t bb=
AliExternalTrackParam::BetheBlochAleph(p/mass,fKp1,fKp2,fKp3,fKp4,fKp5);
return bb;
}
-Double_t AliITSPIDResponse::GetResolution(Double_t bethe) const {
+Double_t AliITSPIDResponse::Bethe(Double_t p, Double_t mass, Bool_t isSA) const {
+ //
+ // returns AliExternalTrackParam::BetheBloch normalized to
+ // fgMIP at the minimum
+ //
+
+ Double_t bg=p/mass;
+ Double_t beta = bg/TMath::Sqrt(1.+ bg*bg);
+ Double_t gamma=bg/beta;
+ Double_t par[5];
+ if(isSA){
+ for(Int_t ip=0; ip<5;ip++) par[ip]=fBBsa[ip];
+ }else{
+ for(Int_t ip=0; ip<5;ip++) par[ip]=fBBtpcits[ip];
+ }
+ Double_t eff=1.0;
+ if(bg<par[2])
+ eff=(bg-par[3])*(bg-par[3])+par[4];
+ else
+ eff=(par[2]-par[3])*(par[2]-par[3])+par[4];
+
+ Double_t bb=0.;
+ if(gamma>=0. && beta>0.){
+ bb=(par[1]+2.0*TMath::Log(gamma)-beta*beta)*(par[0]/(beta*beta))*eff;
+ }
+ return bb;
+}
+
+Double_t AliITSPIDResponse::GetResolution(Double_t bethe,
+ Int_t nPtsForPid,
+ Bool_t isSA) const {
//
// Calculate expected resolution for truncated mean
//
- return fRes*bethe;
+ Float_t r;
+ if(isSA) r=fResolSA[nPtsForPid];
+ else r=fResolTPCITS[nPtsForPid];
+ return r*bethe;
}
+
+
+
void AliITSPIDResponse::GetITSProbabilities(Float_t mom, Double_t qclu[4], Double_t condprobfun[AliPID::kSPECIES]) const {
//
// Method to calculate PID probabilities for a single track
condprobfun[AliPID::kProton] = itsProb[0];
return;
}
+
//-------------------------------------------------------
//#include <Rtypes.h>
#include <TObject.h>
-
#include "AliPID.h"
class AliITSPIDResponse : public TObject {
public:
- AliITSPIDResponse();
+ AliITSPIDResponse(Bool_t isMC=kFALSE);
AliITSPIDResponse(Double_t *param);
~AliITSPIDResponse() {}
- Double_t Bethe(Double_t p,Double_t mass) const;
- Double_t GetResolution(Double_t bethe) const;
- void GetITSProbabilities(Float_t mom, Double_t qclu[4], Double_t condprobfun[AliPID::kSPECIES]) const;
- Float_t GetNumberOfSigmas(Float_t mom, Float_t signal, AliPID::EParticleType type) const {
- Float_t bethe = Bethe(mom,AliPID::ParticleMass(type));
- return (signal - bethe)/GetResolution(bethe);
-}
+ Double_t BetheAleph(Double_t p,Double_t mass) const;
+ Double_t Bethe(Double_t p, Double_t mass, Bool_t iSA=kFALSE) const;
+ Double_t GetResolution(Double_t bethe, Int_t nPtsForPid=4, Bool_t isSA=kFALSE) const;
+ void GetITSProbabilities(Float_t mom, Double_t qclu[4], Double_t condprobfun[AliPID::kSPECIES]) const;
+ Float_t GetNumberOfSigmas(Float_t mom, Float_t signal, AliPID::EParticleType type, Int_t nPtsForPid=4, Bool_t isSA=kFALSE) const {
+ Float_t bethe = Bethe(mom,AliPID::ParticleMass(type),isSA);
+ return (signal - bethe)/GetResolution(bethe,nPtsForPid,isSA);
+ }
private:
+
// Data members for truncated mean method
- Float_t fRes; // relative dEdx resolution
+ Float_t fRes; // relative dEdx resolution
Double_t fKp1; // ALEPH BB param 1
Double_t fKp2; // ALEPH BB param 2
Double_t fKp3; // ALEPH BB param 3
Double_t fKp4; // ALEPH BB param 4
- Double_t fKp5; // ALEPH BB param 5
+ Double_t fKp5; // ALEPH BB param
+ Double_t fBBsa[5]; // parameters of BB for SA tracks
+ Double_t fBBtpcits[5]; // parameters of BB for TPC+ITS tracks
+ Float_t fResolSA[5]; // resolutions vs. n. of SDD/SSD points
+ Float_t fResolTPCITS[5]; // resolutions vs. n. of SDD/SSD points
- ClassDef(AliITSPIDResponse,1) // ITS PID class
+ ClassDef(AliITSPIDResponse,2) // ITS PID class
};
#endif