#include "TRandom.h"
#include "AliLog.h"
#include "AliPID.h"
#include "AliAODpidUtil.h"
#include "AliAODEvent.h"
#include "AliAODTrack.h"
#include "AliAODPid.h"
#include "AliTRDPIDResponse.h"
#include "AliESDtrack.h"
#include "AliAODMCHeader.h"
#include "AliAODMCParticle.h"
#include "AliTOFPIDParams.h"
#include <AliDetectorPID.h>
ClassImp(AliAODpidUtil)
Float_t AliAODpidUtil::GetTPCsignalTunedOnData(const AliVTrack *t) const {
AliAODTrack *track = (AliAODTrack *) t;
Float_t dedx = track->GetTPCsignalTunedOnData();
if(dedx > 0) return dedx;
dedx = t->GetTPCsignal();
track->SetTPCsignalTunedOnData(dedx);
if(dedx < 20) return dedx;
AliPID::EParticleType type = AliPID::kPion;
AliAODMCHeader *mcHeader = dynamic_cast<AliAODMCHeader*>(track->GetAODEvent()->GetList()->FindObject(AliAODMCHeader::StdBranchName()));
if (mcHeader) {
TClonesArray *mcArray = (TClonesArray*)track->GetAODEvent()->GetList()->FindObject(AliAODMCParticle::StdBranchName());
Bool_t kGood = kTRUE;
if ( mcArray->At(TMath::Abs(t->GetLabel())) != NULL ) {
Int_t iS = TMath::Abs(((AliAODMCParticle*)mcArray->At(TMath::Abs(t->GetLabel())))->GetPdgCode());
if(iS==AliPID::ParticleCode(AliPID::kElectron)){
type = AliPID::kElectron;
}
else if(iS==AliPID::ParticleCode(AliPID::kMuon)){
type = AliPID::kMuon;
}
else if(iS==AliPID::ParticleCode(AliPID::kPion)){
type = AliPID::kPion;
}
else if(iS==AliPID::ParticleCode(AliPID::kKaon)){
type = AliPID::kKaon;
}
else if(iS==AliPID::ParticleCode(AliPID::kProton)){
type = AliPID::kProton;
}
else if(iS==AliPID::ParticleCode(AliPID::kDeuteron)){
type = AliPID::kDeuteron;
}
else if(iS==AliPID::ParticleCode(AliPID::kTriton)){
type = AliPID::kTriton;
}
else if(iS==AliPID::ParticleCode(AliPID::kHe3)){
type = AliPID::kHe3;
}
else if(iS==AliPID::ParticleCode(AliPID::kAlpha)){
type = AliPID::kAlpha;
}
else
kGood = kFALSE;
} else kGood = kFALSE;
if(kGood){
Double_t bethe = fTPCResponse.GetExpectedSignal(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
this->UseTPCMultiplicityCorrection());
Double_t sigma = fTPCResponse.GetExpectedSigma(track, type, AliTPCPIDResponse::kdEdxDefault, this->UseTPCEtaCorrection(),
this->UseTPCMultiplicityCorrection());
dedx = gRandom->Gaus(bethe,sigma);
}
}
track->SetTPCsignalTunedOnData(dedx);
return dedx;
}
Float_t AliAODpidUtil::GetTOFsignalTunedOnData(const AliVTrack *t) const {
AliAODTrack *track = (AliAODTrack *) t;
Double_t tofSignal = track->GetTOFsignalTunedOnData();
if(tofSignal < 99999) return (Float_t)tofSignal;
Float_t addmism = GetTOFPIDParams()->GetTOFadditionalMismForMC();
if(addmism > 1.){
Float_t centr = GetCurrentCentrality();
if(centr > 50) addmism *= 0.1667;
else if(centr > 20) addmism *= 0.33;
}
AliAODPid *pidObj = track->GetDetPid();
tofSignal = pidObj->GetTOFsignal() + fTOFResponse.GetTailRandomValue(t->Pt(),t->Eta(),pidObj->GetTOFsignal(),addmism);
track->SetTOFsignalTunedOnData(tofSignal);
return (Float_t)tofSignal;
}
Float_t AliAODpidUtil::GetSignalDeltaTOFold(const AliVParticle *vtrack, AliPID::EParticleType type, Bool_t ratio) const
{
AliAODTrack *track=(AliAODTrack*)vtrack;
AliAODPid *pidObj = track->GetDetPid();
if (!pidObj) return -9999.;
Double_t tofTime = 99999;
if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
else tofTime=pidObj->GetTOFsignal();
const Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
Double_t sigmaTOFPid[AliPID::kSPECIES];
pidObj->GetTOFpidResolution(sigmaTOFPid);
AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
if (event) {
AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
if (tofH && (TMath::Abs(sigmaTOFPid[0]) <= 1.E-16) ) {
tofTime -= fTOFResponse.GetStartTime(vtrack->P());
}
} else {
AliError("pointer to AliAODEvent not found, please call GetTrack to set it");
return -9999.;
}
Double_t delta=-9999.;
if (!ratio) delta=tofTime-expTime;
else if (expTime>1.e-20) delta=tofTime/expTime;
return delta;
}
Float_t AliAODpidUtil::GetNumberOfSigmasTOFold(const AliVParticle *vtrack, AliPID::EParticleType type) const
{
AliAODTrack *track=(AliAODTrack*)vtrack;
Bool_t oldAod=kTRUE;
Double_t sigTOF=0.;
AliAODPid *pidObj = track->GetDetPid();
if (!pidObj) return -999.;
Double_t tofTime = 99999;
if (fTuneMConData && ((fTuneMConDataMask & kDetTOF) == kDetTOF) ) tofTime = (Double_t)this->GetTOFsignalTunedOnData((AliVTrack*)vtrack);
else tofTime=pidObj->GetTOFsignal();
Double_t expTime=fTOFResponse.GetExpectedSignal((AliVTrack*)vtrack,type);
Double_t sigmaTOFPid[AliPID::kSPECIES];
pidObj->GetTOFpidResolution(sigmaTOFPid);
AliAODEvent *event=(AliAODEvent*)track->GetAODEvent();
if (event) {
AliTOFHeader* tofH=(AliTOFHeader*)event->GetTOFHeader();
if (tofH && (TMath::Abs(sigmaTOFPid[0]) <= 1.E-16) ) {
sigTOF=fTOFResponse.GetExpectedSigma(track->P(),expTime,AliPID::ParticleMassZ(type));
tofTime -= fTOFResponse.GetStartTime(vtrack->P());
oldAod=kFALSE;
}
} else {
AliError("pointer to AliAODEvent not found, please call GetTrack to set it");
return -996.;
}
if (oldAod) {
if (type <= AliPID::kProton) {
sigTOF=sigmaTOFPid[type];
} else return -998.;
}
if (sigTOF>0) return (tofTime - expTime)/sigTOF;
else return -997.;
}