#include "AliPID.h"
#include "AliAnalysisManager.h"
#include "AliESDInputHandler.h"
#include "AliESDpid.h"
#include "AliAODpidUtil.h"
#include "AliRsnCutPIDTPC.h"
ClassImp(AliRsnCutPIDTPC)
AliRsnCutPIDTPC::AliRsnCutPIDTPC
(const char *name, AliPID::EParticleType type, Double_t min, Double_t max, Bool_t rejectOutside) :
AliRsnCut(name, AliRsnCut::kDaughter, min, max),
fRejectOutside(rejectOutside),
fMomMin(0.0),
fMomMax(1E+20),
fRefType(type),
fESDpid(0x0),
fAODpid(0x0)
{
fBB[0] = fBB[1] = fBB[2] = fBB[3] = fBB[4] = 0.0;
}
AliRsnCutPIDTPC::AliRsnCutPIDTPC
(const AliRsnCutPIDTPC ©) :
AliRsnCut(copy),
fRejectOutside(copy.fRejectOutside),
fMomMin(copy.fMomMin),
fMomMax(copy.fMomMax),
fRefType(copy.fRefType),
fESDpid(copy.fESDpid),
fAODpid(copy.fAODpid)
{
Int_t i;
for (i = 0; i < 5; i++) fBB[i] = copy.fBB[i];
}
AliRsnCutPIDTPC &AliRsnCutPIDTPC::operator=(const AliRsnCutPIDTPC ©)
{
AliRsnCut::operator=(copy);
if (this == ©)
return *this;
fRejectOutside = copy.fRejectOutside;
fMomMin = copy.fMomMin;
fMomMax = copy.fMomMax;
fRefType = copy.fRefType;
fESDpid = copy.fESDpid;
fAODpid = copy.fAODpid;
Int_t i;
for (i = 0; i < 5; i++) fBB[i] = copy.fBB[i];
return (*this);
}
void AliRsnCutPIDTPC::SetBBParam(Double_t p0, Double_t p1, Double_t p2, Double_t p3, Double_t p4)
{
fBB[0] = p0;
fBB[1] = p1;
fBB[2] = p2;
fBB[3] = p3;
fBB[4] = p4;
}
Bool_t AliRsnCutPIDTPC::IsSelected(TObject *object)
{
if (!TargetOK(object)) return kFALSE;
Double_t mom;
AliESDtrack *esdTrack = fDaughter->Ref2ESDtrack();
AliAODTrack *aodTrack = fDaughter->Ref2AODtrack();
if (esdTrack) {
if (!esdTrack->GetInnerParam()) {
AliDebug(AliLog::kDebug + 2, "No inner param");
return kFALSE;
}
mom = esdTrack->GetInnerParam()->P();
} else if (aodTrack) {
if (!aodTrack->GetDetPid()) {
AliDebug(AliLog::kDebug + 2, "No def-pid object");
return kFALSE;
}
mom = aodTrack->GetDetPid()->GetTPCmomentum();
if (mom < 1E-6) return kFALSE;
} else {
AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
return kFALSE;
}
if (esdTrack) {
if (!fESDpid) {
fESDpid = new AliESDpid;
fESDpid->GetTPCResponse().SetBetheBlochParameters(fBB[0], fBB[1], fBB[2], fBB[3], fBB[4]);
}
fCutValueD = fESDpid->GetTPCResponse().GetNumberOfSigmas(mom, esdTrack->GetTPCsignal(), esdTrack->GetTPCsignalN(), fRefType);
} else {
if (!fAODpid) {
fAODpid = new AliAODpidUtil;
fAODpid->GetTPCResponse().SetBetheBlochParameters(fBB[0], fBB[1], fBB[2], fBB[3], fBB[4]);
}
if (aodTrack->GetTPCsignalN() == 0) aodTrack->GetDetPid()->SetTPCsignalN(aodTrack->GetTPCNcls());
fCutValueD = fAODpid->NumberOfSigmasTPC(aodTrack, fRefType);
}
Bool_t cutCheck = OkRangeD();
if ((mom >= fMomMin && mom <= fMomMax))
return cutCheck;
else {
AliDebug(AliLog::kDebug + 2, Form("Track momentum = %.5f, outside allowed range", mom));
return ((!fRejectOutside) && cutCheck);
}
}
void AliRsnCutPIDTPC::Print(const Option_t *) const
{
AliInfo(Form("Cut name : %s", GetName()));
AliInfo(Form("--> cut range (nsigma) : %.3f %.3f", fMinD, fMaxD));
AliInfo(Form("--> momentum range : %.3f %.3f", fMomMin, fMomMax));
AliInfo(Form("--> tracks outside range are: %s", (fRejectOutside ? "rejected" : "accepted")));
}