]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - PWGLF/RESONANCES/AliRsnCutTrackQuality.cxx
Fixed warnings and coverity + added option to control filling of THnSparse
[u/mrichter/AliRoot.git] / PWGLF / RESONANCES / AliRsnCutTrackQuality.cxx
... / ...
CommitLineData
1//
2// Class AliRsnCutTrackQuality
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#include <TFormula.h>
21#include <TBits.h>
22
23#include "AliLog.h"
24#include "AliESDtrackCuts.h"
25
26#include "AliRsnEvent.h"
27#include "AliRsnDaughter.h"
28#include "AliRsnCutTrackQuality.h"
29
30ClassImp(AliRsnCutTrackQuality)
31
32//_________________________________________________________________________________________________
33AliRsnCutTrackQuality::AliRsnCutTrackQuality(const char *name) :
34 AliRsnCut(name, AliRsnTarget::kDaughter, 0.0, 0.0),
35 fFlagsOn(0x0),
36 fFlagsOff(0x0),
37 fRejectKinkDaughters(kTRUE),
38 fDCARfixed(kTRUE),
39 fDCARptFormula(""),
40 fDCARmax(1E20),
41 fDCAZfixed(kTRUE),
42 fDCAZptFormula(""),
43 fDCAZmax(1E20),
44 fSPDminNClusters(0),
45 fITSminNClusters(0),
46 fITSmaxChi2(1E20),
47 fTPCminNClusters(0),
48 fTPCmaxChi2(1E20),
49 fCutMaxChi2TPCConstrainedVsGlobal(1E20),
50 fAODTestFilterBit(-1),
51 fESDtrackCuts(0x0)
52{
53//
54// Default constructor.
55// Initializes all cuts in such a way that all of them are disabled.
56//
57
58 SetPtRange(0.0, 1E20);
59 SetEtaRange(-1E20, 1E20);
60}
61
62//_________________________________________________________________________________________________
63AliRsnCutTrackQuality::AliRsnCutTrackQuality(const AliRsnCutTrackQuality &copy) :
64 AliRsnCut(copy),
65 fFlagsOn(copy.fFlagsOn),
66 fFlagsOff(copy.fFlagsOff),
67 fRejectKinkDaughters(copy.fRejectKinkDaughters),
68 fDCARfixed(copy.fDCARfixed),
69 fDCARptFormula(copy.fDCARptFormula),
70 fDCARmax(copy.fDCARmax),
71 fDCAZfixed(copy.fDCAZfixed),
72 fDCAZptFormula(copy.fDCAZptFormula),
73 fDCAZmax(copy.fDCAZmax),
74 fSPDminNClusters(copy.fSPDminNClusters),
75 fITSminNClusters(copy.fITSminNClusters),
76 fITSmaxChi2(copy.fITSmaxChi2),
77 fTPCminNClusters(copy.fTPCminNClusters),
78 fTPCmaxChi2(copy.fTPCmaxChi2),
79 fCutMaxChi2TPCConstrainedVsGlobal(copy.fCutMaxChi2TPCConstrainedVsGlobal),
80 fAODTestFilterBit(copy.fAODTestFilterBit),
81 fESDtrackCuts(copy.fESDtrackCuts)
82{
83//
84// Copy constructor.
85// Just copy all data member values.
86//
87
88 SetPtRange(copy.fPt[0], copy.fPt[1]);
89 SetEtaRange(copy.fEta[0], copy.fEta[1]);
90}
91
92//_________________________________________________________________________________________________
93AliRsnCutTrackQuality &AliRsnCutTrackQuality::operator=(const AliRsnCutTrackQuality &copy)
94{
95//
96// Assignment operator.
97// Just copy all data member values.
98//
99
100 if (this == &copy)
101 return *this;
102
103 fFlagsOn = copy.fFlagsOn;
104 fFlagsOff = copy.fFlagsOff;
105 fRejectKinkDaughters = copy.fRejectKinkDaughters;
106 fDCARfixed = copy.fDCARfixed;
107 fDCARptFormula = copy.fDCARptFormula;
108 fDCARmax = copy.fDCARmax;
109 fDCAZfixed = copy.fDCAZfixed;
110 fDCAZptFormula = copy.fDCAZptFormula;
111 fDCAZmax = copy.fDCAZmax;
112 fSPDminNClusters = copy.fSPDminNClusters;
113 fITSminNClusters = copy.fITSminNClusters;
114 fITSmaxChi2 = copy.fITSmaxChi2;
115 fTPCminNClusters = copy.fTPCminNClusters;
116 fTPCmaxChi2 = copy.fTPCmaxChi2;
117 fAODTestFilterBit = copy.fAODTestFilterBit;
118 fESDtrackCuts = copy.fESDtrackCuts;
119 SetPtRange(copy.fPt[0], copy.fPt[1]);
120 SetEtaRange(copy.fEta[0], copy.fEta[1]);
121
122 return (*this);
123}
124
125//_________________________________________________________________________________________________
126void AliRsnCutTrackQuality::DisableAll()
127{
128//
129// Disable all cuts
130//
131
132 fFlagsOn = 0x0;
133 fFlagsOff = 0x0;
134 fRejectKinkDaughters = kFALSE;
135 fDCARfixed = kTRUE;
136 fDCARptFormula = "";
137 fDCARmax = 1E20;
138 fDCAZfixed = kTRUE;
139 fDCAZptFormula = "";
140 fDCAZmax = 1E20;
141 fSPDminNClusters = 0;
142 fITSminNClusters = 0;
143 fITSmaxChi2 = 1E20;
144 fTPCminNClusters = 0;
145 fTPCmaxChi2 = 1E20;
146 fAODTestFilterBit = -1;
147 if (fESDtrackCuts) {
148 const char *cutsName = fESDtrackCuts->GetName();
149 const char *cutsTitle = fESDtrackCuts->GetTitle();
150 delete fESDtrackCuts;
151 fESDtrackCuts = new AliESDtrackCuts(cutsName,cutsTitle);
152 }
153 SetPtRange(0.0, 1E20);
154 SetEtaRange(-1E20, 1E20);
155}
156
157//_________________________________________________________________________________________________
158Bool_t AliRsnCutTrackQuality::IsSelected(TObject *object)
159{
160//
161// Cut checker.
162// Checks the type of object being evaluated
163// and then calls the appropriate sub-function (for ESD or AOD)
164//
165
166 // coherence check
167 if (!TargetOK(object)) return kFALSE;
168
169 // status is checked in the same way for all tracks, using AliVTrack
170 // as a convention, if a the collection of 'on' flags is '0x0', it
171 // is assumed that no flags are required, and this check is skipped;
172 // for the collection of 'off' flags this is not needed
173 AliVTrack *vtrack = fDaughter->Ref2Vtrack();
174 if (!vtrack) {
175 AliDebug(AliLog::kDebug + 2, "This object is not either an ESD nor AOD track");
176 return kFALSE;
177 }
178 ULong_t status = (ULong_t)vtrack->GetStatus();
179 ULong_t checkOn = status & fFlagsOn;
180 ULong_t checkOff = status & fFlagsOff;
181 if (fFlagsOn != 0x0 && checkOn != fFlagsOn) {
182 AliDebug(AliLog::kDebug + 2, Form("Failed flag check: required %s", Binary(fFlagsOn)));
183 AliDebug(AliLog::kDebug + 2, Form(" track has %s", Binary(status )));
184 return kFALSE;
185 }
186 if (checkOff != 0) {
187 AliDebug(AliLog::kDebug + 2, Form("Failed flag check: forbidden %s", Binary(fFlagsOff)));
188 AliDebug(AliLog::kDebug + 2, Form(" track has %s", Binary(status )));
189 return kFALSE;
190 }
191 AliDebug(AliLog::kDebug + 3, Form("Flag check OK: required %s", Binary(fFlagsOn)));
192 AliDebug(AliLog::kDebug + 3, Form(" forbidden %s", Binary(fFlagsOff)));
193 AliDebug(AliLog::kDebug + 3, Form(" track has %s", Binary(status )));
194
195 // retrieve real object type
196 AliESDtrack *esdTrack = fDaughter->Ref2ESDtrack();
197 AliAODTrack *aodTrack = fDaughter->Ref2AODtrack();
198 if (esdTrack) {
199 AliDebug(AliLog::kDebug + 2, "Checking an ESD track");
200 if (fESDtrackCuts)
201 return fESDtrackCuts->IsSelected(esdTrack);
202 else
203 return CheckESD(esdTrack);
204 } else if (aodTrack) {
205 AliDebug(AliLog::kDebug + 2, "Checking an AOD track");
206 return CheckAOD(aodTrack);
207 } else {
208 AliDebug(AliLog::kDebug + 2, Form("This object is not either an ESD nor AOD track, it is an %s", fDaughter->GetRef()->ClassName()));
209 return kFALSE;
210 }
211}
212
213//_________________________________________________________________________________________________
214Bool_t AliRsnCutTrackQuality::CheckESD(AliESDtrack *track)
215{
216//
217// Check an ESD track.
218// This is done using the default track checker for ESD.
219// It is declared static, not to recreate it every time.
220//
221
222 static AliESDtrackCuts cuts;
223
224 // general acceptance/pt cuts
225 cuts.SetPtRange(fPt[0], fPt[1]);
226 cuts.SetEtaRange(fEta[0], fEta[1]);
227
228 // transverse DCA cuts
229 if (fDCARfixed)
230 cuts.SetMaxDCAToVertexXY(fDCARmax);
231 else
232 cuts.SetMaxDCAToVertexXYPtDep(fDCARptFormula.Data());
233
234 // longitudinal DCA cuts
235 if (fDCAZfixed)
236 cuts.SetMaxDCAToVertexZ(fDCAZmax);
237 else
238 cuts.SetMaxDCAToVertexZPtDep(fDCAZptFormula.Data());
239
240 // these options are always disabled in current version
241 cuts.SetDCAToVertex2D(kFALSE);
242 cuts.SetRequireSigmaToVertex(kFALSE);
243
244 // TPC related cuts for TPC+ITS tracks
245 cuts.SetMinNClustersTPC(fTPCminNClusters);
246 cuts.SetMaxChi2PerClusterTPC(fTPCmaxChi2);
247 cuts.SetAcceptKinkDaughters(!fRejectKinkDaughters);
248 cuts.SetMaxChi2TPCConstrainedGlobal(fCutMaxChi2TPCConstrainedVsGlobal);
249
250 // ITS related cuts for TPC+ITS tracks
251 if (fSPDminNClusters > 0)
252 cuts.SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
253 cuts.SetMaxChi2PerClusterITS(fITSmaxChi2);
254
255 // now that all is initialized, do the check
256 return cuts.IsSelected(track);
257}
258
259//_________________________________________________________________________________________________
260Bool_t AliRsnCutTrackQuality::CheckAOD(AliAODTrack *track)
261{
262//
263// Check an AOD track.
264// This is done doing directly all checks, since there is not
265// an equivalend checker for AOD tracks
266//
267
268 // if a test bit is used, check it and skip the following
269 if (fAODTestFilterBit >= 0) {
270 UInt_t bit = 1 << fAODTestFilterBit;
271 AliDebugClass(2, Form("Required a test filter bit for AOD check: %u (result: %s)", bit, (track->TestFilterBit(bit) ? "accept" : "reject")));
272 if (!track->TestFilterBit(bit))
273 return kFALSE;
274 else {
275 if (track->Pt() < fPt[0] || track->Pt() > fPt[1]) return kFALSE;
276 if (track->Eta() < fEta[0] || track->Eta() > fEta[1]) return kFALSE;
277 return kTRUE;
278 }
279 }
280
281 // try to retrieve the reference AOD event
282 AliAODEvent *aodEvent = 0x0;
283 if (fEvent) aodEvent = fEvent->GetRefAOD();
284 if (!aodEvent) {
285 AliError("AOD reference event is not initialized!");
286 return kFALSE;
287 }
288
289 // step #0: check SPD and ITS clusters
290 Int_t nSPD = 0;
291 nSPD = TESTBIT(track->GetITSClusterMap(), 0);
292 nSPD += TESTBIT(track->GetITSClusterMap(), 1);
293 if (nSPD < fSPDminNClusters) {
294 AliDebug(AliLog::kDebug + 2, "Not enough SPD clusters in this track. Rejected");
295 return kFALSE;
296 }
297
298
299 // step #1: check number of clusters in TPC
300 if (track->GetTPCNcls() < fTPCminNClusters) {
301 AliDebug(AliLog::kDebug + 2, "Too few TPC clusters. Rejected");
302 return kFALSE;
303 }
304 if (track->GetITSNcls() < fITSminNClusters) {
305 AliDebug(AliLog::kDebug + 2, "Too few ITS clusters. Rejected");
306 return kFALSE;
307 }
308
309 // step #2: check chi square
310 if (track->Chi2perNDF() > fTPCmaxChi2) {
311 AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
312 return kFALSE;
313 }
314 if (track->Chi2perNDF() > fITSmaxChi2) {
315 AliDebug(AliLog::kDebug + 2, "Bad chi2. Rejected");
316 return kFALSE;
317 }
318
319 // step #3: reject kink daughters
320 AliAODVertex *vertex = track->GetProdVertex();
321 if (vertex && fRejectKinkDaughters) {
322 if (vertex->GetType() == AliAODVertex::kKink) {
323 AliDebug(AliLog::kDebug + 2, "Kink daughter. Rejected");
324 return kFALSE;
325 }
326 }
327
328 // step #4: DCA cut (transverse)
329 // --> reject all tracks not ITS refitted
330 Double_t b[2], cov[3];
331 vertex = aodEvent->GetPrimaryVertex();
332 if (!vertex) {
333 AliDebug(AliLog::kDebug + 2, "NULL vertex");
334 return kFALSE;
335 }
336 if ((track->GetStatus() & AliESDtrack::kITSrefit) == 0) {
337 AliDebug(AliLog::kDebug + 2, "Not ITS refitted");
338 return kFALSE;
339 }
340 if (!track->PropagateToDCA(vertex, aodEvent->GetMagneticField(), kVeryBig, b, cov)) {
341 AliDebug(AliLog::kDebug + 2, "Failed propagation to vertex");
342 return kFALSE;
343 }
344 // if the DCA cut is not fixed, compute current value
345 if (!fDCARfixed) {
346 static TString str(fDCARptFormula);
347 str.ReplaceAll("pt", "x");
348 static const TFormula dcaXY(Form("%s_dcaXY", GetName()), str.Data());
349 fDCARmax = dcaXY.Eval(track->Pt());
350 }
351 // check the cut
352 if (TMath::Abs(b[0]) > fDCARmax) {
353 AliDebug(AliLog::kDebug + 2, "Too large transverse DCA");
354 return kFALSE;
355 }
356
357 // step #5: DCA cut (longitudinal)
358 // the DCA has already been computed above
359 // if the DCA cut is not fixed, compute current value
360 if (!fDCAZfixed) {
361 static TString str(fDCAZptFormula);
362 str.ReplaceAll("pt", "x");
363 static const TFormula dcaZ(Form("%s_dcaXY", GetName()), str.Data());
364 fDCAZmax = dcaZ.Eval(track->Pt());
365 }
366 // check the cut
367 if (TMath::Abs(b[1]) > fDCAZmax) {
368 AliDebug(AliLog::kDebug + 2, "Too large longitudinal DCA");
369 return kFALSE;
370 }
371
372 // step #6: check eta/pt range
373 if (track->Eta() < fEta[0] || track->Eta() > fEta[1]) {
374 AliDebug(AliLog::kDebug + 2, "Outside ETA acceptance");
375 return kFALSE;
376 }
377 if (track->Pt() < fPt[0] || track->Pt() > fPt[1]) {
378 AliDebug(AliLog::kDebug + 2, "Outside PT acceptance");
379 return kFALSE;
380 }
381
382 // if we are here, all cuts were passed and no exit point was got
383 AliDebug(AliLog::kDebug + 2, "============================= ACCEPTED TRACK =====================================================");
384 return kTRUE;
385}
386
387//_________________________________________________________________________________________________
388void AliRsnCutTrackQuality::Print(const Option_t *) const
389{
390//
391// Print information on this cut
392//
393
394 AliInfo(Form("Cut name : %s", GetName()));
395 AliInfo(Form("Required flags (off, on): %lx %lx", fFlagsOn, fFlagsOff));
396 AliInfo(Form("Ranges in eta, pt : %.2f - %.2f, %.2f - %.2f", fEta[0], fEta[1], fPt[0], fPt[1]));
397 AliInfo(Form("Kink daughters are : %s", (fRejectKinkDaughters ? "rejected" : "accepted")));
398 AliInfo(Form("TPC requirements : min. cluster = %d, max chi2 = %f", fTPCminNClusters, fTPCmaxChi2));
399 AliInfo(Form("ITS requirements : min. cluster = %d (all), %d (SPD), max chi2 = %f", fITSminNClusters, fSPDminNClusters, fITSmaxChi2));
400
401 if (fDCARfixed) {
402 AliInfo(Form("DCA r cut : fixed to %f cm", fDCARmax));
403 } else {
404 AliInfo(Form("DCA r cut formula : %s", fDCARptFormula.Data()));
405 }
406
407 if (fDCAZfixed) {
408 AliInfo(Form("DCA z cut : fixed to %f cm", fDCAZmax));
409 } else {
410 AliInfo(Form("DCA z cut formula : %s", fDCAZptFormula.Data()));
411 }
412}
413//__________________________________________________________________________________________________
414void AliRsnCutTrackQuality::SetDefaults2010()
415{
416//
417// Default settings for cuts used in 2010
418//
419 AddStatusFlag(AliESDtrack::kTPCin , kTRUE);
420 AddStatusFlag(AliESDtrack::kTPCrefit, kTRUE);
421 AddStatusFlag(AliESDtrack::kITSrefit, kTRUE);
422 SetPtRange(0.15, 1E+20);
423 SetEtaRange(-0.8, 0.8);
424 SetDCARPtFormula("0.0182+0.0350/pt^1.01");
425 SetDCAZmax(2.0);
426 SetSPDminNClusters(1);
427 SetITSminNClusters(0);
428 SetITSmaxChi2(36);
429 SetMaxChi2TPCConstrainedGlobal(36);
430 SetTPCminNClusters(70);
431 SetTPCmaxChi2(4.0);
432 SetRejectKinkDaughters();
433 SetAODTestFilterBit(5);
434}
435
436//__________________________________________________________________________________________________
437const char *AliRsnCutTrackQuality::Binary(UInt_t number)
438{
439//
440// Convert an integer in binary
441//
442
443 static char b[50];
444 b[0] = '\0';
445
446 UInt_t z;
447 for (z = 512; z > 0; z >>= 1)
448 strncat(b, ((number & z) == z) ? "1" : "0", 1);
449
450 return b;
451}