#include "AliESDtrackCuts.h"
#include "AliAODpidUtil.h"
#include "AliAnalysisManager.h"
#include "AliESDInputHandler.h"
#include "AliRsnDaughter.h"
#include "AliRsnCutPIDITS.h"
ClassImp(AliRsnCutPIDITS)
AliRsnCutPIDITS::AliRsnCutPIDITS
(const char *name, AliPID::EParticleType ref, Double_t min, Double_t max, Bool_t rejectOutside) :
AliRsnCut(name, AliRsnCut::kDaughter, min, max),
fIsMC(kFALSE),
fRejectOutside(rejectOutside),
fMomMin(0.0),
fMomMax(1E+20),
fRefType(ref),
fESDpid(),
fAODpid()
{
}
AliRsnCutPIDITS::AliRsnCutPIDITS
(const AliRsnCutPIDITS ©) :
AliRsnCut(copy),
fIsMC(copy.fIsMC),
fRejectOutside(copy.fRejectOutside),
fMomMin(copy.fMomMin),
fMomMax(copy.fMomMax),
fRefType(copy.fRefType),
fESDpid(copy.fESDpid),
fAODpid(copy.fAODpid)
{
}
AliRsnCutPIDITS &AliRsnCutPIDITS::operator=(const AliRsnCutPIDITS ©)
{
AliRsnCut::operator=(copy);
if (this == ©)
return *this;
fIsMC = copy.fIsMC;
fRejectOutside = copy.fRejectOutside;
fMomMin = copy.fMomMin;
fMomMax = copy.fMomMax;
fRefType = copy.fRefType;
fESDpid = copy.fESDpid;
fAODpid = copy.fAODpid;
return (*this);
}
Bool_t AliRsnCutPIDITS::IsSelected(TObject *object)
{
if (!TargetOK(object)) return kFALSE;
AliVTrack *vtrack = fDaughter->Ref2Vtrack();
if (!vtrack) {
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;
}
Bool_t isSA = kFALSE;
if (IsTPC(vtrack)) isSA = kFALSE;
else if (IsSA(vtrack)) isSA = kTRUE;
else {
AliDebug(AliLog::kDebug + 2, "Status flags unmatched");
return kFALSE;
}
Int_t k, nITSpidLayers = 0;
Double_t mom = vtrack->P();
AliESDtrack *esdTrack = fDaughter->Ref2ESDtrack();
AliAODTrack *aodTrack = fDaughter->Ref2AODtrack();
if (esdTrack) {
UChar_t itsCluMap = esdTrack->GetITSClusterMap();
for (k = 2; k < 6; k++) if (itsCluMap & (1 << k)) ++nITSpidLayers;
} else if (aodTrack) {
for (k = 2; k < 6; k++) if (TESTBIT(aodTrack->GetITSClusterMap(), k)) ++nITSpidLayers;
} 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 (nITSpidLayers < 3) {
AliDebug(AliLog::kDebug + 2, "Rejecting track with too few ITS pid layers");
return kFALSE;
}
if (esdTrack) {
if (!fESDpid) fESDpid = new AliESDpid(fIsMC);
fCutValueD = fESDpid->GetITSResponse().GetNumberOfSigmas(mom, esdTrack->GetITSsignal(), fRefType, nITSpidLayers, isSA);
} else {
if (!fAODpid) fAODpid = new AliAODpidUtil(fIsMC);
fCutValueD = fAODpid->NumberOfSigmasITS(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 AliRsnCutPIDITS::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")));
}