#include <Riostream.h>
#include "AliPID.h"
#include "AliPIDResponse.h"
#include "AliRsnCutDelta.h"
ClassImp(AliRsnCutDelta)
AliRsnCutDelta::AliRsnCutDelta(const char *name,AliPID::EParticleType pid, Bool_t TPCMethod) :
AliRsnCut(name, AliRsnTarget::kDaughter),
fPID(pid),
fNSigmaTPC(3.0),
fLimitTPC(0.350),
fNSigmaTOF(3.0),
fTPCMethod(TPCMethod),
fNSigmaTPCProton(3.0),
fNSigmaTPCPion(3.0),
fNSigmaTOFProton(3.0),
fNSigmaTOFPion(3.0),
fTPCMomProton(1.1),
fTOFMomProton(2.5),
fEtaRange(0.8),
fTPCNCluster(70),
fPtDepDCASigma(7.0),
fCutQuality(Form("%sQuality", name))
{
Double_t a=0; a=fPtDepDCASigma*0.0026;
Double_t b=0; b=fPtDepDCASigma*0.05;
fCutQuality.SetPtRange(0.15, 1E+20);
fCutQuality.SetEtaRange(-fEtaRange, fEtaRange);
fCutQuality.SetDCARPtFormula(Form("%f+%f/pt^1.01",a,b));
fCutQuality.SetDCAZmax(2.0);
fCutQuality.SetSPDminNClusters(1);
fCutQuality.SetITSminNClusters(0);
fCutQuality.SetITSmaxChi2(1E+20);
fCutQuality.SetTPCminNClusters(fTPCNCluster);
fCutQuality.SetTPCmaxChi2(4.0);
fCutQuality.SetRejectKinkDaughters();
fCutQuality.SetAODTestFilterBit(5);
}
Bool_t AliRsnCutDelta::IsSelected(TObject *obj)
{
if (!TargetOK(obj)) return kFALSE;
AliVTrack *track = fDaughter->Ref2Vtrack();
if (!track) {
if (!fDaughter->GetRef()) AliWarning("NULL ref");
return kFALSE;
}
if ((track->GetStatus() & AliESDtrack::kTPCin ) == 0) return kFALSE;
if ((track->GetStatus() & AliESDtrack::kTPCrefit) == 0) return kFALSE;
if ((track->GetStatus() & AliESDtrack::kITSrefit) == 0) return kFALSE;
if (!fCutQuality.IsSelected(obj)) return kFALSE;
AliPIDResponse *pid = fEvent->GetPIDResponse();
if (!pid) {
AliFatal("NULL PID response");
return kFALSE;
}
Bool_t isTOF = MatchTOF(track);
Double_t pTPC = track->GetTPCmomentum();
Double_t pTOF = track->P();
Double_t nsTPC = TMath::Abs(pid->NumberOfSigmasTPC(track, fPID));
Double_t nsTPCProton = TMath::Abs(pid->NumberOfSigmasTPC(track, AliPID::kProton));
Double_t nsTPCPion = TMath::Abs(pid->NumberOfSigmasTPC(track, AliPID::kPion));
Double_t nsTOFProton = TMath::Abs(pid->NumberOfSigmasTOF(track, AliPID::kProton));
Double_t nsTOF = TMath::Abs(pid->NumberOfSigmasTOF(track, fPID));
Double_t maxTPC = 1E20;
Double_t maxTOF = 1E20;
if (fTPCMethod) {
if(fPID == AliPID::kPion) {
if(nsTPCPion>fNSigmaTPCPion) return kFALSE;
maxTPC = fNSigmaTPCPion;
if(nsTPC > maxTPC) return kFALSE;
return kTRUE;
}
else if (fPID == AliPID::kProton) {
if(nsTPCPion<=fNSigmaTPCPion) return kFALSE;
if(pTPC>=fTPCMomProton) return kFALSE;
if(nsTPCProton>fNSigmaTPCProton) return kFALSE;
maxTPC = fNSigmaTPCProton;
if(nsTPC > maxTPC) return kFALSE;
return kTRUE;
}
} else {
if(fPID == AliPID::kProton) {
if(!isTOF) return kFALSE;
if(nsTPCProton>fNSigmaTPCProton) return kFALSE;
if(pTOF >= fTOFMomProton) return kFALSE;
if(nsTOFProton>fNSigmaTOFProton) return kFALSE;
maxTOF = fNSigmaTOFProton;
if (nsTOF > maxTOF) return kFALSE;
return kTRUE;
}
else if (fPID == AliPID::kPion) {
if(isTOF && nsTPCProton<=fNSigmaTPCProton && pTOF < fTOFMomProton && nsTOFProton<=fNSigmaTOFProton) return kFALSE;
if(nsTPCPion>fNSigmaTPCPion) return kFALSE;
maxTPC = fNSigmaTPCPion;
if (nsTPC > maxTPC) return kFALSE;
return kTRUE;
}
}
return kTRUE;
}
Bool_t AliRsnCutDelta::MatchTOF(const AliVTrack *vtrack)
{
if (!vtrack) {
AliWarning("NULL argument: impossible to check status");
return kFALSE;
}
Bool_t isTOFout = ((vtrack->GetStatus() & AliESDtrack::kTOFout) != 0);
Bool_t isTIME = ((vtrack->GetStatus() & AliESDtrack::kTIME) != 0);
return (isTOFout && isTIME);
}