60085ba9711846340c177f0b888ad5f307f69574
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutPIDITS.cxx
1 //
2 // Class AliRsnCutPIDITS
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 <Riostream.h>
20
21 #include "AliESDpid.h"
22 #include "AliTOFT0maker.h"
23 #include "AliTOFcalib.h"
24 #include "AliCDBManager.h"
25 #include "AliITSPIDResponse.h"
26
27 #include "AliRsnEvent.h"
28 #include "AliRsnDaughter.h"
29 #include "AliRsnCutPIDITS.h"
30
31 ClassImp(AliRsnCutPIDITS)
32
33 //_________________________________________________________________________________________________
34 AliRsnCutPIDITS::AliRsnCutPIDITS
35 (const char *name, AliPID::EParticleType ref, Double_t min, Double_t max, Bool_t rejectOutside) :
36   AliRsnCut(name, AliRsnCut::kDaughter, min, max),
37   fRejectOutside(rejectOutside),
38   fMomMin(0.0),
39   fMomMax(1E+20),
40   fRefType(ref),
41   fESDpid(),
42   fAODpid()
43 {
44 //
45 // Main constructor.
46 //
47 }
48
49 //_________________________________________________________________________________________________
50 AliRsnCutPIDITS::AliRsnCutPIDITS
51 (const AliRsnCutPIDITS& copy) :
52   AliRsnCut(copy),
53   fRejectOutside(copy.fRejectOutside),
54   fMomMin(copy.fMomMin),
55   fMomMax(copy.fMomMax),
56   fRefType(copy.fRefType),
57   fESDpid(copy.fESDpid),
58   fAODpid(copy.fAODpid)
59 {
60 //
61 // Copy constructor.
62 //
63 }
64
65 //_________________________________________________________________________________________________
66 AliRsnCutPIDITS& AliRsnCutPIDITS::operator=(const AliRsnCutPIDITS& copy)
67 {
68 //
69 // Assignment operator
70 //
71
72   AliRsnCut::operator=(copy);
73
74   fRejectOutside = copy.fRejectOutside;
75   fMomMin        = copy.fMomMin;
76   fMomMax        = copy.fMomMax;
77   fRefType       = copy.fRefType;
78   fESDpid        = copy.fESDpid;
79   fAODpid        = copy.fAODpid;
80   
81   return (*this);
82 }
83
84 //_________________________________________________________________________________________________
85 void AliRsnCutPIDITS::SetMC(Bool_t yn)
86 {
87 //
88 // Properly set the PID response
89 //
90
91   AliITSPIDResponse itsresponse(yn);
92   
93   fESDpid.GetITSResponse() = itsresponse;
94   fAODpid.GetITSResponse() = itsresponse;
95 }
96
97 //_________________________________________________________________________________________________
98 Bool_t AliRsnCutPIDITS::IsSelected(TObject *object)
99 {
100 //
101 // Cut checker.
102 //
103
104   // coherence check
105   if (!TargetOK(object)) return kFALSE;
106   
107   // reject not ITS tracks
108   // status is checked in the same way for all tracks
109   AliVTrack *vtrack = dynamic_cast<AliVTrack*>(fDaughter->GetRef());
110   if (!vtrack)
111   {
112     AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
113     return kFALSE;
114   }
115   
116   // check status, to know it track is an ITS+TPC or ITS standalone
117   // and reject it if it is of none of them
118   Bool_t isSA = kFALSE;
119   if (IsTPC(vtrack)) isSA = kFALSE;
120   else if (IsSA(vtrack)) isSA = kTRUE;
121   else
122   {
123     AliDebug(AliLog::kDebug + 2, "Status flags unmatched");
124     return kFALSE;
125   }
126
127   // common evaluation variables
128   Int_t        k, nITSpidLayers = 0;
129   Double_t     mom      = vtrack->P();
130   AliESDtrack *esdTrack = fDaughter->GetRefESDtrack();
131   AliAODTrack *aodTrack = fDaughter->GetRefAODtrack();
132
133   // check momentum
134   if (mom < fMomMin || mom > fMomMax)
135   {
136     AliDebug(AliLog::kDebug + 2, Form("Track momentum = %.5f, outside allowed range", mom));
137     return (!fRejectOutside);
138   }
139
140   // count number of PID layers...
141   if (esdTrack) 
142   {
143     UChar_t itsCluMap = esdTrack->GetITSClusterMap();
144     for(k = 2; k < 6; k++) if(itsCluMap & (1 << k)) ++nITSpidLayers;
145   }
146   else if (aodTrack)
147   {
148     for(k = 2; k < 6; k++) if (TESTBIT(aodTrack->GetITSClusterMap(), k)) ++nITSpidLayers;
149   }
150   else
151   {
152     AliDebug(AliLog::kDebug + 2, Form("Impossible to process an object of type '%s'. Cut applicable only to ESD/AOD tracks", fDaughter->GetRef()->ClassName()));
153     return kFALSE;
154   }
155   // ...and reject tracks where it is smaller than 3
156   if (nITSpidLayers < 3)
157   {
158     AliDebug(AliLog::kDebug+2, "Rejecting track with too few ITS pid layers");
159     return kFALSE;
160   }
161     
162   // assign PID nsigmas to default cut check value
163   // since bad object types are rejected before, here we have an ESD track or AOD track
164   if (esdTrack) 
165     fCutValueD = fESDpid.GetITSResponse().GetNumberOfSigmas(mom, esdTrack->GetITSsignal(), fRefType, nITSpidLayers, isSA);
166   else
167     fCutValueD = fAODpid.NumberOfSigmasITS(aodTrack, fRefType);
168   
169   // use default cut checking method
170   return OkRangeD();
171 }
172
173 //_________________________________________________________________________________________________
174 void AliRsnCutPIDITS::Print(const Option_t *) const
175 {
176 //
177 // Print information on this cut
178 //
179
180   AliInfo(Form("Cut name                    : %s", GetName()));
181   AliInfo(Form("--> cut range (nsigma)      : %.3f %.3f", fMinD, fMaxD));
182   AliInfo(Form("--> momentum range          : %.3f %.3f", fMomMin, fMomMax));
183   AliInfo(Form("--> tracks outside range are: %s", (fRejectOutside ? "rejected" : "accepted")));
184 }