Improved functionality of AliRsnDaughterDef::MatchesDaughter()
[u/mrichter/AliRoot.git] / PWG2 / RESONANCES / AliRsnCutESD2010.cxx
1 //
2 // Class AliRsnCutESD2010
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 "AliITSPIDResponse.h"
23
24 #include "AliRsnEvent.h"
25 #include "AliRsnDaughter.h"
26 #include "AliRsnCutESD2010.h"
27
28 ClassImp(AliRsnCutESD2010)
29
30 //_________________________________________________________________________________________________
31 AliRsnCutESD2010::AliRsnCutESD2010
32 (const char *name, Bool_t isMC) :
33    AliRsnCut(name, AliRsnCut::kDaughter, 0.0, 0.0),
34    fIsMC(isMC),
35    fCheckITS(kTRUE),
36    fCheckTPC(kTRUE),
37    fCheckTOF(kTRUE),
38    fUseITSTPC(kTRUE),
39    fUseITSSA(kTRUE),
40    fPID(AliPID::kKaon),
41    fMaxITSPIDmom(0.0),
42    fMaxITSband(3.0),
43    fTPCpLimit(0.35),
44    fMinTPCband(3.0),
45    fMaxTPCband(5.0),
46    fESDpid(),
47    fESDtrackCutsTPC(),
48    fESDtrackCutsITS(),
49    fMinTOF(-3.0),
50    fMaxTOF(3.0)
51 {
52 //
53 // Main constructor.
54 //
55
56    SetMC(isMC);
57 }
58
59 //_________________________________________________________________________________________________
60 AliRsnCutESD2010::AliRsnCutESD2010
61 (const AliRsnCutESD2010& copy) :
62    AliRsnCut(copy),
63    fIsMC(copy.fIsMC),
64    fCheckITS(copy.fCheckITS),
65    fCheckTPC(copy.fCheckTPC),
66    fCheckTOF(copy.fCheckTOF),
67    fUseITSTPC(copy.fUseITSTPC),
68    fUseITSSA(copy.fUseITSSA),
69    fPID(copy.fPID),
70    fMaxITSPIDmom(copy.fMaxITSPIDmom),
71    fMaxITSband(copy.fMaxITSband),
72    fTPCpLimit(copy.fTPCpLimit),
73    fMinTPCband(copy.fMinTPCband),
74    fMaxTPCband(copy.fMaxTPCband),
75    fESDpid(copy.fESDpid),
76    fESDtrackCutsTPC(copy.fESDtrackCutsTPC),
77    fESDtrackCutsITS(copy.fESDtrackCutsITS),
78    fMinTOF(copy.fMinTOF),
79    fMaxTOF(copy.fMaxTOF)
80 {
81 //
82 // Copy constructor.
83 //
84
85    SetMC(copy.fIsMC);
86
87    Int_t i = 0;
88    for (i = 0; i < 5; i++) fTPCpar[i] = copy.fTPCpar[i];
89 }
90
91 //_________________________________________________________________________________________________
92 AliRsnCutESD2010& AliRsnCutESD2010::operator=(const AliRsnCutESD2010& copy)
93 {
94 //
95 // Assignment operator
96 //
97
98    AliRsnCut::operator=(copy);
99
100    SetMC(copy.fIsMC);
101
102    fCheckITS = copy.fCheckITS;
103    fCheckTPC = copy.fCheckTPC;
104    fCheckTOF = copy.fCheckTOF;
105    fUseITSTPC = copy.fUseITSTPC;
106    fUseITSSA = copy.fUseITSSA;
107    fPID = copy.fPID;
108    fMaxITSPIDmom = copy.fMaxITSPIDmom;
109    fMaxITSband = copy.fMaxITSband;
110    fTPCpLimit = copy.fTPCpLimit;
111    fMinTPCband = copy.fMinTPCband;
112    fMaxTPCband = copy.fMaxTPCband;
113    fMinTOF = copy.fMinTOF;
114    fMaxTOF = copy.fMaxTOF;
115    fESDpid = copy.fESDpid;
116
117    Int_t i = 0;
118    for (i = 0; i < 5; i++) fTPCpar[i] = copy.fTPCpar[i];
119
120
121    fESDtrackCutsTPC = copy.fESDtrackCutsTPC;
122    fESDtrackCutsITS = copy.fESDtrackCutsITS;
123
124    return (*this);
125 }
126
127 //_________________________________________________________________________________________________
128 void AliRsnCutESD2010::SetMC(Bool_t isMC)
129 {
130 //
131 // Sets some aspects of cuts depending on the fact that runs on MC or not
132 //
133
134    fIsMC = isMC;
135
136    AliITSPIDResponse itsresponse(fIsMC);
137    fESDpid.GetITSResponse() = itsresponse;
138 }
139
140 //_________________________________________________________________________________________________
141 Bool_t AliRsnCutESD2010::IsSelected(TObject *object)
142 {
143 //
144 // Cut checker.
145 //
146
147    // coherence check: require an ESD track
148    AliRsnDaughter *daughter = dynamic_cast<AliRsnDaughter*>(object);
149    if (!daughter) return kFALSE;
150    AliESDtrack *track = daughter->GetRefESDtrack();
151    if (!track) return kFALSE;
152
153    // if no reference event, skip
154    AliRsnEvent *rsn = AliRsnTarget::GetCurrentEvent();
155    if (!rsn) return kFALSE;
156    fESDpid.SetTOFResponse(rsn->GetRefESD(), AliESDpid::kTOF_T0);
157
158    // check quality and track type and reject tracks not passing this step
159    if (!OkQuality(track)) {
160       AliDebug(AliLog::kDebug + 2, "Failed quality cut");
161       return kFALSE;
162    }
163
164    // ITS PID can be checked always
165    // if PID is not required, the flag is sed as
166    // if the cut was alsways passed
167    Bool_t okITSpid = OkITSPID(track);
168    if (!fCheckITS) okITSpid = kTRUE;
169
170    // TPC PID can be checked only for TPC+ITS tracks
171    // if PID is not required, the flag is sed as
172    // if the cut was alsways passed
173    Bool_t okTPCpid = kFALSE;
174    if (IsITSTPC(track)) okTPCpid = OkTPCPID(track);
175    if (!fCheckTPC) okTPCpid = kTRUE;
176
177    // TOF PID can be checked only if TOF is matched
178    // if PID is not required, the flag is sed as
179    // if the cut was alsways passed
180    Bool_t okTOFpid = kFALSE;
181    if (IsITSTPC(track) && MatchTOF(track)) okTOFpid = OkTOFPID(track);
182    if (!fCheckTOF) okTOFpid = kTRUE;
183
184    // now combine all outcomes according to the different possibilities:
185    // -- ITS standalone:
186    //    --> only ITS PID, always
187    // -- ITS + TPC:
188    //    --> ITS PID, only for momenta lower than 'fMaxITSPIDmom' and when the ITSpid flag is active
189    //    --> TPC PID, always --> MASTER (first to be checked, if fails, track is rejected)
190    //    --> TOF PID, only if matched
191    if (IsITSSA(track)) {
192       if (!okITSpid) {
193          AliDebug(AliLog::kDebug + 2, "ITS standalone track --> ITS PID failed");
194          return kFALSE;
195       }
196    } else { // checking IsITSTPC() is redundant due to OkQuality() cut check
197       if (!okTPCpid) {
198          AliDebug(AliLog::kDebug + 2, "ITS+TPC track --> TPC PID failed");
199          return kFALSE;
200       } else if (MatchTOF(track) && !okTOFpid) {
201          AliDebug(AliLog::kDebug + 2, "ITS+TPC track --> TOF matched but TOF PID failed");
202          return kFALSE;
203       } else if (track->IsOn(AliESDtrack::kITSpid) && track->P() <= fMaxITSPIDmom && !okITSpid) {
204          AliDebug(AliLog::kDebug + 2, Form("ITS+TPC track --> Momentum lower than limit (%.2f) and ITS PID failed", fMaxITSPIDmom));
205          return kFALSE;
206       }
207    }
208
209    // arriving here, the track has survived all checks
210    return kTRUE;
211 }
212
213 //______________________________________________________________________________
214 Bool_t AliRsnCutESD2010::OkQuality(AliESDtrack *track)
215 {
216 //
217 // Check track quality parameters.
218 // Rejects all tracks which are not either TPC+ITS nor ITS standalone.
219 // If tracks of any type are not flagged to be used, they are rejected anyway.
220 //
221
222    if (IsITSTPC(track)) return (fUseITSTPC && fESDtrackCutsTPC.IsSelected(track));
223    if (IsITSSA(track)) return (fUseITSSA  && fESDtrackCutsITS.IsSelected(track));
224
225    return kFALSE;
226 }
227
228 //______________________________________________________________________________
229 Bool_t AliRsnCutESD2010::OkITSPID(AliESDtrack *track)
230 {
231 //
232 // Check ITS particle identification with 3sigma cut
233 //
234
235    // count PID layers and reject if they are too few
236    Int_t   k, nITSpidLayers = 0;
237    UChar_t itsCluMap = track->GetITSClusterMap();
238    for (k = 2; k < 6; k++) if (itsCluMap & (1 << k)) ++nITSpidLayers;
239    if (nITSpidLayers < 3) {
240       AliDebug(AliLog::kDebug + 2, "Rejecting track with too few ITS pid layers");
241       return kFALSE;
242    }
243
244    // check the track type (ITS+TPC or ITS standalone)
245    // and reject it if it is of none of the allowed types
246    Bool_t isSA = kFALSE;
247    if (IsITSTPC(track)) isSA = kFALSE;
248    else if (IsITSSA(track)) isSA = kTRUE;
249    else {
250       AliWarning("Track is neither ITS+TPC nor ITS standalone");
251       return kFALSE;
252    }
253
254    // create the PID response object and compute nsigma
255    AliITSPIDResponse &itsrsp = fESDpid.GetITSResponse();
256    Double_t mom    = track->P();
257    Double_t nSigma = itsrsp.GetNumberOfSigmas(mom, track->GetITSsignal(), fPID, nITSpidLayers, isSA);
258
259    // evaluate the cut
260    Bool_t ok = (TMath::Abs(nSigma) <= fMaxITSband);
261
262    // debug message
263    AliDebug(AliLog::kDebug + 2, Form("ITS nsigma = %f -- max = %f -- cut %s", nSigma, fMaxITSband, (ok ? "passed" : "failed")));
264
265    // outcome
266    return ok;
267 }
268
269 //______________________________________________________________________________
270 Bool_t AliRsnCutESD2010::OkTPCPID(AliESDtrack *track)
271 {
272 //
273 // Check TPC particle identification with {3|5}sigmacut,
274 // depending on the track total momentum.
275 //
276
277    // setup TPC PID response
278    AliTPCPIDResponse &tpcrsp = fESDpid.GetTPCResponse();
279    //tpcrsp.SetBetheBlochParameters(fTPCpar[0],fTPCpar[1],fTPCpar[2],fTPCpar[3],fTPCpar[4]);
280
281    // get momentum and number of sigmas and choose the reference band
282    Double_t mom       = track->GetInnerParam()->P();
283    Double_t nSigma    = tpcrsp.GetNumberOfSigmas(mom, track->GetTPCsignal(), track->GetTPCsignalN(), fPID);
284    Double_t maxNSigma = fMaxTPCband;
285    if (mom < fTPCpLimit) maxNSigma = fMinTPCband;
286
287    // evaluate the cut
288    Bool_t ok = (TMath::Abs(nSigma) <= maxNSigma);
289
290    // debug message
291    AliDebug(AliLog::kDebug + 2, Form("TPC nsigma = %f -- max = %f -- cut %s", nSigma, maxNSigma, (ok ? "passed" : "failed")));
292
293    // outcome
294    return ok;
295 }
296
297 //______________________________________________________________________________
298 Bool_t AliRsnCutESD2010::OkTOFPID(AliESDtrack *track)
299 {
300 //
301 // Check TOF particle identification if matched there.
302 //
303
304    // reject not TOF-matched tracks
305    if (!MatchTOF(track)) return kFALSE;
306
307    // setup TOF PID response
308    AliTOFPIDResponse &tofrsp = fESDpid.GetTOFResponse();
309
310    // get info for computation
311    Double_t momentum = track->P();
312    Double_t time     = track->GetTOFsignal();
313    Double_t timeint[AliPID::kSPECIES];
314    tofrsp.GetStartTime(momentum);
315    track->GetIntegratedTimes(timeint);
316
317    // check the cut
318    Double_t timeDiff = time - timeint[(Int_t)fPID];
319    Double_t sigmaRef = tofrsp.GetExpectedSigma(momentum, timeint[(Int_t)fPID], AliPID::ParticleMass(fPID));
320    Double_t nSigma   = timeDiff / sigmaRef;
321
322    // evaluate the cut
323    Bool_t ok = (nSigma >= fMinTOF && nSigma <= fMaxTOF);
324
325    // debug message
326    AliDebug(AliLog::kDebug + 2, Form("TOF nsigma = %f -- range = %f - %f -- cut %s", nSigma, fMinTOF, fMaxTOF, (ok ? "passed" : "failed")));
327
328    // outcome
329    return ok;
330 }
331
332 //_________________________________________________________________________________________________
333 void AliRsnCutESD2010::Print(const Option_t *) const
334 {
335 //
336 // Print information on this cut
337 //
338
339    AliInfo(Form("Cut name               : %s", GetName()));
340    AliInfo(Form("Using MC settings      : %s", (fIsMC ? "YES" : "NO")));
341    AliInfo(Form("Using TPC+ITS tracks   : %s", (fUseITSTPC ? "YES" : "NO")));
342    AliInfo(Form("Using ITS SA  tracks   : %s", (fUseITSSA ? "YES" : "NO")));
343    AliInfo(Form("Check ITS PID          : %s", (fCheckITS ? "YES" : "NO")));
344    AliInfo(Form("Check TPC PID          : %s", (fCheckTPC ? "YES" : "NO")));
345    AliInfo(Form("Check TOF PID          : %s", (fCheckTOF ? "YES" : "NO")));
346    AliInfo(Form("Reference particle     : %s", AliPID::ParticleName(fPID)));
347    AliInfo(Form("ITS PID range  (sigmas): %f", fMaxITSband));
348    AliInfo(Form("ITS PID range  (pt)    : %f", fMaxITSPIDmom));
349    AliInfo(Form("TPC PID ranges (sigmas): %f %f", fMinTPCband, fMaxTPCband));
350    AliInfo(Form("TPC PID limit  (p)     : %f", fTPCpLimit));
351    AliInfo(Form("TOF range (sigmas)     : %f - %f", fMinTOF, fMaxTOF));
352 }