Int_t AliAODPidHF::ApplyPidTPCRaw(AliAODTrack *track,Int_t specie) const{
// n-sigma cut, TPC PID
- if(!CheckTPCPIDStatus(track)) return 0;
+ Double_t nsigma;
Int_t pid=-1;
- if(fOldPid){
- AliAODPid *pidObj = track->GetDetPid();
-
- Double_t dedx=pidObj->GetTPCsignal();
- Double_t mom = pidObj->GetTPCmomentum();
- if(mom>fPtThresholdTPC) return 0;
- UShort_t nTPCClus=pidObj->GetTPCsignalN();
- if(nTPCClus==0) {nTPCClus=track->GetTPCNcls();}
if(specie<0){ // from RawSignalPID : should return the particle specie to wich the de/dx is closer to the bethe-block curve -> performance to be checked
- Double_t nsigmaMax=fnSigma[0];
- for(Int_t ipart=0;ipart<5;ipart++){
- AliPID::EParticleType type=AliPID::EParticleType(ipart);
- Double_t nsigma = TMath::Abs(fTPCResponse->GetNumberOfSigmas(mom,dedx,nTPCClus,type));
- if((nsigma<nsigmaMax) && (nsigma<fnSigma[0])) {
- pid=ipart;
- nsigmaMax=nsigma;
+ Double_t nsigmaMin=999.;
+ for(Int_t ipart=0;ipart<5;ipart++){
+ if(GetnSigmaTPC(track,ipart,nsigma)==1){
+ nsigma=TMath::Abs(nsigma);
+ if((nsigma<nsigmaMin) && (nsigma<fnSigma[0])) {
+ pid=ipart;
+ nsigmaMin=nsigma;
+ }
+ }
}
- }
}else{ // asks only for one particle specie
- AliPID::EParticleType type=AliPID::EParticleType(specie);
- Double_t nsigma = TMath::Abs(fTPCResponse->GetNumberOfSigmas(mom,dedx,nTPCClus,type));
- if (nsigma>fnSigma[0]) {
- pid=-1;
- }else{
- pid=specie;
- }
- }
- }else{ //old pid
- if(specie<0){ // from RawSignalPID : should return the particle specie to wich the de/dx is closer to the bethe-block curve -> performance to be checked
- Double_t nsigmaMax=fnSigma[0];
- for(Int_t ipart=0;ipart<5;ipart++){
- AliPID::EParticleType type=AliPID::EParticleType(ipart);
- Double_t nsigma = TMath::Abs(fPidResponse->NumberOfSigmasTPC(track,type));
- if((nsigma<nsigmaMax) && (nsigma<fnSigma[0])) {
- pid=ipart;
- nsigmaMax=nsigma;
+ if(GetnSigmaTPC(track,specie,nsigma)==1){
+ nsigma=TMath::Abs(nsigma);
+ if (nsigma>fnSigma[0]) pid=-1;
+ else pid=specie;
}
- }
- }else{ // asks only for one particle specie
- AliPID::EParticleType type=AliPID::EParticleType(specie);
- Double_t nsigma = TMath::Abs(fPidResponse->NumberOfSigmasTPC(track,type));
- if (nsigma>fnSigma[0]) {
- pid=-1;
- }else{
- pid=specie;
- }
}
- } //new pid
-
- return pid;
-
+ return pid;
}
//----------------------------
Int_t AliAODPidHF::ApplyPidITSRaw(AliAODTrack *track,Int_t specie) const{
Int_t AliAODPidHF::ApplyPidTOFRaw(AliAODTrack *track,Int_t specie) const{
// n-sigma cut, TOF PID
- if(!CheckTOFPIDStatus(track)) return 0;
+ Double_t nsigma;
+ Int_t pid=-1;
+ if(specie<0){
+ Double_t nsigmaMin=999.;
+ for(Int_t ipart=0;ipart<5;ipart++){
+ if(GetnSigmaTOF(track,ipart,nsigma)==1){
+ nsigma=TMath::Abs(nsigma);
+ if((nsigma<nsigmaMin)&& (nsigma<fnSigma[3])){
+ pid=ipart;
+ nsigmaMin=nsigma;
+ }
+ }
+ }
+ }else{ // asks only for one particle specie
+ if(GetnSigmaTOF(track,specie,nsigma)==1){
+ nsigma=TMath::Abs(nsigma);
+ if (nsigma>fnSigma[3]) pid=-1;
+ else pid=specie;
+ }
+ }
+ return pid;
+ /*
Double_t time[AliPID::kSPECIESN];
Double_t sigmaTOFPid[AliPID::kSPECIES];
AliAODPid *pidObj = track->GetDetPid();
pidObj->GetIntegratedTimes(time);
Double_t sigTOF=pidObj->GetTOFsignal();
- pidObj->GetTOFpidResolution(sigmaTOFPid);
+
+ AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
+ if (event) {
+ AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
+ if (tofH && fPidResponse) { // reading new AOD with new aliroot
+ AliTOFPIDResponse TOFres = (AliTOFPIDResponse)fPidResponse->GetTOFResponse();
+ sigTOF -= TOFres.GetStartTime(track->P());
+ if (specie<0) {
+ for (Int_t ipart = 0; ipart<5; ipart++) {
+ sigmaTOFPid[ipart]=TOFres.GetExpectedSigma(track->P(),time[ipart],AliPID::ParticleMass(ipart));
+ }
+ }
+ else sigmaTOFPid[specie]=TOFres.GetExpectedSigma(track->P(),time[specie],AliPID::ParticleMass(specie)); //fTOFResponse is set in InitialiseEvent
+ } else pidObj->GetTOFpidResolution(sigmaTOFPid); // reading old AOD with new aliroot
+ } else pidObj->GetTOFpidResolution(sigmaTOFPid); //reading old AOD with old aliroot
Int_t pid=-1;
}
}
return pid;
-
+ */
}
//------------------------------
void AliAODPidHF::CombinedProbability(AliAODTrack *track,Bool_t *type) const{
Bool_t AliAODPidHF::TPCRawAsym(AliAODTrack* track,Int_t specie) const{
// TPC nsigma cut PID, different sigmas in different p bins
- if(!CheckTPCPIDStatus(track)) return kFALSE;
+ Double_t nsigma;
+ if(GetnSigmaTPC(track,specie,nsigma)!=1) return kFALSE;
+ nsigma=TMath::Abs(nsigma);
+
AliAODPid *pidObj = track->GetDetPid();
Double_t mom = pidObj->GetTPCmomentum();
if(mom>fPtThresholdTPC) return 0;
- Double_t nsigma=999.;
- if(fOldPid){
- Double_t dedx=pidObj->GetTPCsignal();
- UShort_t nTPCClus=pidObj->GetTPCsignalN();
- if(nTPCClus==0) {nTPCClus=track->GetTPCNcls();}
-
- AliPID::EParticleType type=AliPID::EParticleType(specie);
- nsigma = TMath::Abs(fTPCResponse->GetNumberOfSigmas(mom,dedx,nTPCClus,type));
-
- }else{ //old pid
- AliPID::EParticleType type=AliPID::EParticleType(specie);
- nsigma = TMath::Abs(fPidResponse->NumberOfSigmasTPC(track,type));
- } //new pid
if(mom<fPLimit[0] && nsigma<fnSigma[0]) return kTRUE;
if(mom<fPLimit[1] && mom>fPLimit[0] && nsigma<fnSigma[1]) return kTRUE;
Bool_t AliAODPidHF::IsTOFPiKexcluded(AliAODTrack *track,Double_t nsigmaK){
- if(!CheckTOFPIDStatus(track)) return 0;
-
- Double_t time[AliPID::kSPECIESN];
+ Double_t nsigma;
+ if(GetnSigmaTOF(track,3,nsigma)==1){
+ nsigma=TMath::Abs(nsigma);
+ if(nsigma>nsigmaK) return kTRUE;
+ }
+ return kFALSE;
+ /* Double_t time[AliPID::kSPECIESN];
Double_t sigmaTOFPid[AliPID::kSPECIES];
AliAODPid *pidObj = track->GetDetPid();
pidObj->GetIntegratedTimes(time);
Double_t sigTOF=pidObj->GetTOFsignal();
- pidObj->GetTOFpidResolution(sigmaTOFPid);
+
+ AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
+ if (event) {
+ AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
+ if (tofH && fPidResponse) {
+ AliTOFPIDResponse TOFres = (AliTOFPIDResponse)fPidResponse->GetTOFResponse();
+ sigTOF -= TOFres.GetStartTime(track->P());
+ sigmaTOFPid[3]=TOFres.GetExpectedSigma(track->P(),time[3],AliPID::ParticleMass(3));
+ }
+ else pidObj->GetTOFpidResolution(sigmaTOFPid);
+ } else pidObj->GetTOFpidResolution(sigmaTOFPid);
Double_t sigmaTOFtrack;
if (sigmaTOFPid[3]>0) sigmaTOFtrack=sigmaTOFPid[3];
else sigmaTOFtrack=fTOFSigma; // backward compatibility for old AODs
if((sigTOF-time[3])>nsigmaK*sigmaTOFtrack)return kTRUE;// K, Pi excluded (->LIKELY A PROTON)
return kFALSE;
-
+ */
}
//--------------------------------------------------------------------------
void AliAODPidHF::SetPriorDistribution(AliPID::EParticleType type,TH1F *prior){
}
//--------------------------------------------------------------------------
-Int_t AliAODPidHF::GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &sigma) const{
+Int_t AliAODPidHF::GetnSigmaTPC(AliAODTrack *track, Int_t species, Double_t &nsigma) const{
if(!CheckTPCPIDStatus(track)) return -1;
UShort_t nTPCClus=pidObj->GetTPCsignalN();
if(nTPCClus==0) {nTPCClus=track->GetTPCNcls();}
AliPID::EParticleType type=AliPID::EParticleType(species);
- nsigmaTPC = TMath::Abs(fTPCResponse->GetNumberOfSigmas(mom,dedx,nTPCClus,type));
- sigma=nsigmaTPC;
+ nsigmaTPC = fTPCResponse->GetNumberOfSigmas(mom,dedx,nTPCClus,type);
+ nsigma=nsigmaTPC;
} else{
-
+ if(!fPidResponse) return -1;
AliPID::EParticleType type=AliPID::EParticleType(species);
- nsigmaTPC = TMath::Abs(fPidResponse->NumberOfSigmasTPC(track,type));
- sigma=nsigmaTPC;
+ nsigmaTPC = fPidResponse->NumberOfSigmasTPC(track,type);
+ nsigma=nsigmaTPC;
}
return 1;
}
//-----------------------------
-Int_t AliAODPidHF::GetnSigmaTOF(AliAODTrack *track,Int_t species, Double_t &sigma) const{
+Int_t AliAODPidHF::GetnSigmaTOF(AliAODTrack *track,Int_t species, Double_t &nsigma) const{
if(!CheckTOFPIDStatus(track)) return -1;
-
- Double_t time[AliPID::kSPECIESN];
- Double_t sigmaTOFPid[AliPID::kSPECIES];
- AliAODPid *pidObj = track->GetDetPid();
- pidObj->GetIntegratedTimes(time);
- Double_t sigTOF=pidObj->GetTOFsignal();
- pidObj->GetTOFpidResolution(sigmaTOFPid);
-
- if(sigmaTOFPid[species]<1e-99) return -2;
-
- Double_t sigmaTOF=TMath::Abs(sigTOF-time[species])/sigmaTOFPid[species];
- sigma=sigmaTOF;
+
+ if(fPidResponse){
+ nsigma = fPidResponse->NumberOfSigmasTOF(track,(AliPID::EParticleType)species);
+ }else{
+ AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
+ if (event) {
+ AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
+ if (tofH) { // reading a new AOD without setting fPidResponse!!!
+ AliFatal("To use this AOD you must start AliPIDResponseTask");
+ }
+ else {
+ Double_t time[AliPID::kSPECIESN];
+ Double_t sigmaTOFPid[AliPID::kSPECIES];
+ AliAODPid *pidObj = track->GetDetPid();
+ pidObj->GetIntegratedTimes(time);
+ Double_t sigTOF=pidObj->GetTOFsignal();
+ pidObj->GetTOFpidResolution(sigmaTOFPid);
+ if(sigmaTOFPid[species]<1e-99) return -2;
+ Double_t sigmaTOF=(sigTOF-time[species])/sigmaTOFPid[species];
+ nsigma=sigmaTOF;
+ }
+ }
+ }
return 1;
}
delete [] pdgdaughters;
return;
}
- AliPIDResponse* respF=pidHF->GetPidResponse();
+ //AliPIDResponse* respF=pidHF->GetPidResponse();
AliTPCPIDResponse* tpcres=new AliTPCPIDResponse();
- if(pidHF->GetOldPid()){
+ Bool_t oldPID=pidHF->GetOldPid();
+ if(oldPID){
Double_t alephParameters[5];
pidHF->GetTPCBetheBlochParams(alephParameters);
tpcres->SetBetheBlochParameters(alephParameters[0],alephParameters[1],alephParameters[2],alephParameters[3],alephParameters[4]);
}
- Bool_t oldPID=pidHF->GetOldPid();
Int_t ntracks=0;
((TH1F*)fOutputPID->FindObject("hTOFsig"))->Fill(pid->GetTOFsignal());
if (pid->GetTOFsignal()< 0) ((TH1F*)fOutputPID->FindObject("hTOFsig"))->Fill(-1);
-
- // test TOF sigma PID
- if (!oldPID && respF && tofRes[2] != 0.) { // protection against 'old' AODs...
- Double_t nsigma[3]={respF->NumberOfSigmasTOF(track,AliPID::kPion),respF->NumberOfSigmasTOF(track,AliPID::kKaon),respF->NumberOfSigmasTOF(track,AliPID::kProton)};
- ((TH2F*)fOutputPID->FindObject("hTOFsigmaKSigPid"))->Fill(track->P(),nsigma[1]);
- ((TH2F*)fOutputPID->FindObject("hTOFsigmaPionSigPid"))->Fill(track->P(),nsigma[0]);
- ((TH2F*)fOutputPID->FindObject("hTOFsigmaProtonSigPid"))->Fill(track->P(),nsigma[2]);
-
- if(fReadMC){
- Int_t label=track->GetLabel();
- if(label<=0) continue;
- AliMCParticle* mcpart=(AliMCParticle*)mcArray->At(label);
- if(mcpart){
- Int_t abspdgcode=TMath::Abs(mcpart->PdgCode());
- if(abspdgcode==211) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCPionSigPid"))->Fill(track->P(),nsigma[0]);
- if(abspdgcode==321) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCKSigPid"))->Fill(track->P(),nsigma[1]);
- if(abspdgcode==2212) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCProtonSigPid"))->Fill(track->P(),nsigma[2]);
+ Double_t nsigma[3]={-10,-10,-10};
+ pidHF->GetnSigmaTOF(track,(Int_t)AliPID::kPion,nsigma[0]);
+ pidHF->GetnSigmaTOF(track,(Int_t)AliPID::kKaon,nsigma[1]);
+ pidHF->GetnSigmaTOF(track,(Int_t)AliPID::kProton,nsigma[2]);
+
+ ((TH2F*)fOutputPID->FindObject("hTOFsigmaKSigPid"))->Fill(track->P(),nsigma[1]);
+ ((TH2F*)fOutputPID->FindObject("hTOFsigmaPionSigPid"))->Fill(track->P(),nsigma[0]);
+ ((TH2F*)fOutputPID->FindObject("hTOFsigmaProtonSigPid"))->Fill(track->P(),nsigma[2]);
+ if(fReadMC){
+ Int_t label=track->GetLabel();
+ if(label<=0) continue;
+ AliMCParticle* mcpart=(AliMCParticle*)mcArray->At(label);
+ if(mcpart){
+ Int_t abspdgcode=TMath::Abs(mcpart->PdgCode());
+ if(abspdgcode==211) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCPionSigPid"))->Fill(track->P(),nsigma[0]);
+ if(abspdgcode==321) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCKSigPid"))->Fill(track->P(),nsigma[1]);
+ if(abspdgcode==2212) ((TH2F*)fOutputPID->FindObject("hTOFsigmaMCProtonSigPid"))->Fill(track->P(),nsigma[2]);
- }
}
+ }
- for (Int_t iS=2; iS<5; iS++){ //we plot TOF Pid resolution for 3-sigma identified particles
- if ( (TMath::Abs(times[iS]-pid->GetTOFsignal())/tofRes[iS])<3.){
- switch (iS) {
- case AliPID::kPion:
- ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigPion"))->Fill(tofRes[iS]);
- break;
- case AliPID::kKaon:
- ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigKaon"))->Fill(tofRes[iS]);
- break;
- case AliPID::kProton:
- ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigProton"))->Fill(tofRes[iS]);
- break;
- default:
- break;
- }
+ for (Int_t iS=2; iS<5; iS++){ //we plot TOF Pid resolution for 3-sigma identified particles
+ if ( TMath::Abs(nsigma[iS-2])<3.){
+ switch (iS) {
+ case AliPID::kPion:
+ ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigPion"))->Fill(tofRes[iS]);
+ break;
+ case AliPID::kKaon:
+ ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigKaon"))->Fill(tofRes[iS]);
+ break;
+ case AliPID::kProton:
+ ((TH1F*)fOutputPID->FindObject("hTOFsigPid3sigProton"))->Fill(tofRes[iS]);
+ break;
+ default:
+ break;
}
}
}
}//if TOF status
+ //}
if(pidHF && pidHF->CheckStatus(track,"TPC")){
((TH1F*)fOutputPID->FindObject("hTPCsig"))->Fill(TPCsignal);
((TH1F*)fOutputPID->FindObject("hTPCsigvsp"))->Fill(TPCp,TPCsignal);
//if (pidHF->IsKaonRaw(track, "TOF"))
- Double_t nsigma[3]={0,0,0};
- if(!oldPID){
- nsigma[0]=respF->NumberOfSigmasTPC(track,AliPID::kPion);
- nsigma[1]=respF->NumberOfSigmasTPC(track,AliPID::kKaon);
- nsigma[2]=respF->NumberOfSigmasTPC(track,AliPID::kProton);
- }
- if(!oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaK"))->Fill(TPCp,nsigma[1]);
- if (oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaK"))->Fill(TPCp,tpcres->GetNumberOfSigmas(TPCp,TPCsignal,track->GetTPCNcls(),AliPID::kKaon));
- //if (pidHF->IsPionRaw(track, "TOF"))
- if(oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaPion"))->Fill(TPCp,tpcres->GetNumberOfSigmas(TPCp,TPCsignal,track->GetTPCNcls(),AliPID::kPion));
- if(!oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaPion"))->Fill(TPCp,nsigma[0]);
- //if (pidHF->IsProtonRaw(track,"TOF"))
- if(oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaProton"))->Fill(TPCp,tpcres->GetNumberOfSigmas(TPCp,TPCsignal,track->GetTPCNcls(),AliPID::kProton));
- if(!oldPID) ((TH2F*)fOutputPID->FindObject("hTPCsigmaProton"))->Fill(TPCp,nsigma[2]);
+ Double_t nsigma[3]={-10,-10,-10};
+ pidHF->GetnSigmaTPC(track,(Int_t)AliPID::kPion,nsigma[0]);
+ pidHF->GetnSigmaTPC(track,(Int_t)AliPID::kKaon,nsigma[1]);
+ pidHF->GetnSigmaTPC(track,(Int_t)AliPID::kProton,nsigma[2]);
+ ((TH2F*)fOutputPID->FindObject("hTPCsigmaK"))->Fill(TPCp,nsigma[1]);
+
+ ((TH2F*)fOutputPID->FindObject("hTPCsigmaPion"))->Fill(TPCp,nsigma[0]);
+ ((TH2F*)fOutputPID->FindObject("hTPCsigmaProton"))->Fill(TPCp,nsigma[2]);
+
if(fReadMC){
Int_t label=track->GetLabel();
if(label<=0) continue;
} //fill track histos
} //end loop on tracks
- //fill once per event
+ //fill once per event
if(fOnOff[0]){
if (fReadMC) ((TH1F*)fOutputTrack->FindObject("hdistrFakeTr"))->Fill(isFakeTrack);
((TH1F*)fOutputTrack->FindObject("hdistrGoodTr"))->Fill(isGoodTrack);