// Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
//
+#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),
- fInitialized(kFALSE),
- fRejectOutside(rejectOutside),
- fMomMin(0.0),
- fMomMax(1E+20),
- fRefType(type),
- fESDpid(),
- fAODpid()
+ AliRsnCut(name, AliRsnCut::kDaughter, min, max),
+ fRejectOutside(rejectOutside),
+ fMomMin(0.0),
+ fMomMax(1E+20),
+ fRefType(type),
+ fESDpid(0x0),
+ fAODpid(0x0)
{
//
// Main constructor.
//
+
+ fBB[0] = fBB[1] = fBB[2] = fBB[3] = fBB[4] = 0.0;
}
//_________________________________________________________________________________________________
AliRsnCutPIDTPC::AliRsnCutPIDTPC
(const AliRsnCutPIDTPC& copy) :
- AliRsnCut(copy),
- fInitialized(kFALSE),
- fRejectOutside(copy.fRejectOutside),
- fMomMin(copy.fMomMin),
- fMomMax(copy.fMomMax),
- fRefType(copy.fRefType),
- fESDpid(copy.fESDpid),
- fAODpid(copy.fAODpid)
+ AliRsnCut(copy),
+ fRejectOutside(copy.fRejectOutside),
+ fMomMin(copy.fMomMin),
+ fMomMax(copy.fMomMax),
+ fRefType(copy.fRefType),
+ fESDpid(copy.fESDpid),
+ fAODpid(copy.fAODpid)
{
//
// Copy constructor.
//
+
+ Int_t i;
+ for (i = 0; i < 5; i++) fBB[i] = copy.fBB[i];
}
//_________________________________________________________________________________________________
// Assignment operator
//
- AliRsnCut::operator=(copy);
+ AliRsnCut::operator=(copy);
- fInitialized = kFALSE;
- fRejectOutside = copy.fRejectOutside;
- fMomMin = copy.fMomMin;
- fMomMax = copy.fMomMax;
- fRefType = copy.fRefType;
- fESDpid = copy.fESDpid;
- fAODpid = copy.fAODpid;
-
- 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);
}
//_________________________________________________________________________________________________
// Properly set the Bethe-Bloch parameters in all places where it is needed.
//
- fESDpid.GetTPCResponse().SetBetheBlochParameters(p0, p1, p2, p3, p4);
- fAODpid.GetTPCResponse().SetBetheBlochParameters(p0, p1, p2, p3, p4);
+ fBB[0] = p0;
+ fBB[1] = p1;
+ fBB[2] = p2;
+ fBB[3] = p3;
+ fBB[4] = p4;
}
//_________________________________________________________________________________________________
// Cut checker.
//
- // initialize if needed
- if (!fInitialized) Initialize();
-
- // coherence check
- if (!TargetOK(object)) return kFALSE;
-
- // reject not TPC tracks
- AliVTrack *vtrack = dynamic_cast<AliVTrack*>(fDaughter->GetRef());
- if (!vtrack) return kFALSE;
- if (!IsTPC(vtrack))
- {
- AliDebug(AliLog::kDebug + 2, "Track is not found in TPC");
- return kFALSE;
- }
-
- // common evaluation variables
- Double_t mom;
- AliESDtrack *esdTrack = fDaughter->GetRefESDtrack();
- AliAODTrack *aodTrack = fDaughter->GetRefAODtrack();
-
- // get inner momentum and check it w.r. to allowed range:
- // all tracks outside it will pass the cut or not, depending on 'fRejectOutside'
- if (esdTrack)
- mom = esdTrack->GetInnerParam()->P();
- else if (aodTrack)
- mom = aodTrack->GetDetPid()->GetTPCmomentum();
- 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 ((mom < fMomMin || mom > fMomMax))
- {
- AliDebug(AliLog::kDebug + 2, Form("Track momentum = %.5f, outside allowed range", mom));
- return (!fRejectOutside);
- }
-
- // assign PID nsigmas to default cut check value
- // since bad object types are rejected before, here we have an ESD track or AOD track
- if (esdTrack)
- fCutValueD = fESDpid.GetTPCResponse().GetNumberOfSigmas(mom, esdTrack->GetTPCsignal(), esdTrack->GetTPCsignalN(), fRefType);
- else
- fCutValueD = fAODpid.NumberOfSigmasTPC(aodTrack, fRefType);
-
- // use AliRsnCut default method to check cut
- return OkRangeD();
+ // coherence check
+ if (!TargetOK(object)) return kFALSE;
+
+ // common evaluation variables
+ Double_t mom;
+ AliESDtrack *esdTrack = fDaughter->Ref2ESDtrack();
+ AliAODTrack *aodTrack = fDaughter->Ref2AODtrack();
+
+ // get inner momentum, needed for BB computation
+ 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;
+ }
+
+ // assign PID nsigmas to default cut check value
+ // since bad object types are rejected before, here we have an ESD track or AOD track
+ 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);
+ }
+
+ // use AliRsnCut default method to check cut
+ Bool_t cutCheck = OkRangeD();
+
+ // now check the momentum:
+ // -- if it stays inside the accepted range, track just checked
+ // with respect to the nsigma band
+ // -- if it stays outside the accepted range and 'fRejectOutside' is kTRUE,
+ // track is always rejected, while if 'fRejectOutside' is kFALSE,
+ // track is accepted if it stays inside the nsigma band
+ if ((mom >= fMomMin && mom <= fMomMax))
+ return cutCheck;
+ else {
+ AliDebug(AliLog::kDebug + 2, Form("Track momentum = %.5f, outside allowed range", mom));
+ return ((!fRejectOutside) && cutCheck);
+ }
}
//_________________________________________________________________________________________________
// Print information on this cut
//
- 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")));
-}
-
-//_________________________________________________________________________________________________
-void AliRsnCutPIDTPC::Initialize()
-{
-//
-// Initialize ESD pid object from global one
-//
-
- AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
- AliESDInputHandler *handler = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler());
- if (handler)
- {
- AliESDpid *pid = handler->GetESDpid();
- fESDpid = (*pid);
- }
-
- fInitialized = kTRUE;
+ 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")));
}