Recovery ESDpid from InputHandler
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPIDTPC.cxx
1 //
2 // Class AliRsnCutPIDTPC
3 //
4 // General implementation of a single cut strategy, which can be:
5 // - a value contained in a given interval  [--> IsBetween()   ]
6 // - a value equal to a given reference     [--> MatchesValue()]
7 //
8 // In all cases, the reference value(s) is (are) given as data members
9 // and each kind of cut requires a given value type (Int, UInt, Double),
10 // but the cut check procedure is then automatized and chosen thanks to
11 // an enumeration of the implemented cut types.
12 // At the end, the user (or any other point which uses this object) has
13 // to use the method IsSelected() to check if this cut has been passed.
14 //
15 // authors: Martin Vala (martin.vala@cern.ch)
16 //          Alberto Pulvirenti (alberto.pulvirenti@ct.infn.it)
17 //
18
19 #include "AliAnalysisManager.h"
20 #include "AliESDInputHandler.h"
21 #include "AliRsnCutPIDTPC.h"
22
23 ClassImp(AliRsnCutPIDTPC)
24
25 //_________________________________________________________________________________________________
26 AliRsnCutPIDTPC::AliRsnCutPIDTPC
27 (const char *name, AliPID::EParticleType type, Double_t min, Double_t max, Bool_t rejectOutside) :
28   AliRsnCut(name, AliRsnCut::kDaughter, min, max),
29   fInitialized(kFALSE),
30   fRejectOutside(rejectOutside),
31   fMomMin(0.0),
32   fMomMax(1E+20),
33   fRefType(type),
34   fESDpid(),
35   fAODpid()
36 {
37 //
38 // Main constructor.
39 //
40 }
41
42 //_________________________________________________________________________________________________
43 AliRsnCutPIDTPC::AliRsnCutPIDTPC
44 (const AliRsnCutPIDTPC& copy) :
45   AliRsnCut(copy),
46   fInitialized(kFALSE),
47   fRejectOutside(copy.fRejectOutside),
48   fMomMin(copy.fMomMin),
49   fMomMax(copy.fMomMax),
50   fRefType(copy.fRefType),
51   fESDpid(copy.fESDpid),
52   fAODpid(copy.fAODpid)
53 {
54 //
55 // Copy constructor.
56 //
57 }
58
59 //_________________________________________________________________________________________________
60 AliRsnCutPIDTPC& AliRsnCutPIDTPC::operator=(const AliRsnCutPIDTPC& copy)
61 {
62 //
63 // Assignment operator
64 //
65
66   AliRsnCut::operator=(copy);
67
68   fInitialized   = kFALSE;
69   fRejectOutside = copy.fRejectOutside;
70   fMomMin        = copy.fMomMin;
71   fMomMax        = copy.fMomMax;
72   fRefType       = copy.fRefType;
73   fESDpid        = copy.fESDpid;
74   fAODpid        = copy.fAODpid;
75   
76   return (*this);
77 }
78
79 //_________________________________________________________________________________________________
80 void AliRsnCutPIDTPC::SetBBParam(Double_t p0, Double_t p1, Double_t p2, Double_t p3, Double_t p4)
81 {
82 //
83 // Properly set the Bethe-Bloch parameters in all places where it is needed.
84 //
85
86   fESDpid.GetTPCResponse().SetBetheBlochParameters(p0, p1, p2, p3, p4);
87   fAODpid.GetTPCResponse().SetBetheBlochParameters(p0, p1, p2, p3, p4);
88 }
89
90 //_________________________________________________________________________________________________
91 Bool_t AliRsnCutPIDTPC::IsSelected(TObject *object)
92 {
93 //
94 // Cut checker.
95 //
96
97   // initialize if needed
98   if (!fInitialized) Initialize();
99
100   // coherence check
101   if (!TargetOK(object)) return kFALSE;
102   
103   // reject not TPC tracks
104   AliVTrack *vtrack = dynamic_cast<AliVTrack*>(fDaughter->GetRef());
105   if (!vtrack) return kFALSE;
106   if (!IsTPC(vtrack))
107   {
108     AliDebug(AliLog::kDebug + 2, "Track is not found in TPC");
109     return kFALSE;
110   }
111   
112   // common evaluation variables
113   Double_t     mom;
114   AliESDtrack *esdTrack = fDaughter->GetRefESDtrack();
115   AliAODTrack *aodTrack = fDaughter->GetRefAODtrack();
116
117   // get inner momentum and check it w.r. to allowed range:
118   // all tracks outside it will pass the cut or not, depending on 'fRejectOutside'
119   if (esdTrack)
120     mom = esdTrack->GetInnerParam()->P();
121   else if (aodTrack)
122     mom = aodTrack->GetDetPid()->GetTPCmomentum();
123   else
124   {
125     AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
126     return kFALSE;
127   }
128   if ((mom < fMomMin || mom > fMomMax))
129   {
130     AliDebug(AliLog::kDebug + 2, Form("Track momentum = %.5f, outside allowed range", mom));
131     return (!fRejectOutside);
132   }
133
134   // assign PID nsigmas to default cut check value
135   // since bad object types are rejected before, here we have an ESD track or AOD track
136   if (esdTrack) 
137     fCutValueD = fESDpid.GetTPCResponse().GetNumberOfSigmas(mom, esdTrack->GetTPCsignal(), esdTrack->GetTPCsignalN(), fRefType);
138   else
139     fCutValueD = fAODpid.NumberOfSigmasTPC(aodTrack, fRefType);
140
141   // use AliRsnCut default method to check cut
142   return OkRangeD();
143 }
144
145 //_________________________________________________________________________________________________
146 void AliRsnCutPIDTPC::Print(const Option_t *) const
147 {
148 //
149 // Print information on this cut
150 //
151
152   AliInfo(Form("Cut name                    : %s", GetName()));
153   AliInfo(Form("--> cut range (nsigma)      : %.3f %.3f", fMinD, fMaxD));
154   AliInfo(Form("--> momentum range          : %.3f %.3f", fMomMin, fMomMax));
155   AliInfo(Form("--> tracks outside range are: %s", (fRejectOutside ? "rejected" : "accepted")));
156 }
157
158 //_________________________________________________________________________________________________
159 void AliRsnCutPIDTPC::Initialize()
160 {
161 //
162 // Initialize ESD pid object from global one
163 //
164
165   AliAnalysisManager *mgr = AliAnalysisManager::GetAnalysisManager();
166   AliESDInputHandler *handler = dynamic_cast<AliESDInputHandler*>(mgr->GetInputEventHandler());
167   if (handler)
168   {
169     AliESDpid *pid = handler->GetESDpid();
170     fESDpid = (*pid);
171   }
172
173   fInitialized = kTRUE;
174 }