1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 // The class AliCFTrackQualityCuts is designed to select reconstructed tracks
17 // of high quality and to provide corresponding QA histograms.
18 // This class inherits from the Analysis' Framework abstract base class
19 // AliAnalysisCuts and is a part of the Correction Framework.
20 // This class acts on single, reconstructed tracks, it is applicable on
22 // It mainly consists of a IsSelected function that returns a boolean.
23 // This function checks whether the considered track passes a set of cuts:
24 // - number of clusters in the ITS
25 // - number of clusters in the TPC
26 // - number of clusters in the TRD
27 // - ratio of found / finable number of clusters in the TPC
28 // - number of tracklets in the TRD
29 // - number TRD tracklets used for pid
30 // - chi2 / cluster in the ITS
31 // - chi2 / cluster in the TPC
32 // - chi2 / tracklet in the TRD
33 // - number of clusters in the TPC used for dEdx calculation
34 // - successful TPC refit
35 // - successful ITS refit
36 // - covariance matrix diagonal elements
38 // The cut values for these cuts are set with the corresponding set functions.
39 // All cut classes provided by the correction framework are supposed to be
40 // added in the Analysis Framwork's class AliAnalysisFilter and applied by
41 // the filter via a loop.
43 // author: I. Kraus (Ingrid.Kraus@cern.ch)
45 // AliESDtrackCuts writte by Jan Fiete Grosse-Oetringhaus and
46 // AliRsnDaughterCut class written by A. Pulvirenti.
50 #include <TDirectory.h>
54 #include <AliESDtrack.h>
55 #include <AliESDtrackCuts.h>
57 #include "AliCFTrackQualityCuts.h"
58 #include "AliAODTrack.h"
60 ClassImp(AliCFTrackQualityCuts)
62 //__________________________________________________________________________________
63 AliCFTrackQualityCuts::AliCFTrackQualityCuts() :
68 fMinFoundClusterTPC(0),
70 fMinNTrackletTRDpid(0),
71 fMaxChi2PerClusterTPC(0),
72 fMaxChi2PerClusterITS(0),
73 fMaxChi2PerTrackletTRD(0),
74 fMinNdEdxClusterTPC(0),
88 fhNBinsFoundClusterTPC(0),
89 fhNBinsTrackletTRD(0),
90 fhNBinsTrackletTRDpid(0),
94 fhNBinsdEdxClusterTPC(0),
95 fhNBinsCovariance11(0),
96 fhNBinsCovariance22(0),
97 fhNBinsCovariance33(0),
98 fhNBinsCovariance44(0),
99 fhNBinsCovariance55(0),
100 fhBinLimClusterTPC(0x0),
101 fhBinLimClusterITS(0x0),
102 fhBinLimClusterTRD(0x0),
103 fhBinLimFoundClusterTPC(0x0),
104 fhBinLimTrackletTRD(0x0),
105 fhBinLimTrackletTRDpid(0x0),
106 fhBinLimChi2TPC(0x0),
107 fhBinLimChi2ITS(0x0),
108 fhBinLimChi2TRD(0x0),
109 fhBinLimdEdxClusterTPC(0x0),
110 fhBinLimCovariance11(0x0),
111 fhBinLimCovariance22(0x0),
112 fhBinLimCovariance33(0x0),
113 fhBinLimCovariance44(0x0),
114 fhBinLimCovariance55(0x0)
117 // Default constructor
121 //__________________________________________________________________________________
122 AliCFTrackQualityCuts::AliCFTrackQualityCuts(Char_t* name, Char_t* title) :
123 AliCFCutBase(name,title),
127 fMinFoundClusterTPC(0),
129 fMinNTrackletTRDpid(0),
130 fMaxChi2PerClusterTPC(0),
131 fMaxChi2PerClusterITS(0),
132 fMaxChi2PerTrackletTRD(0),
133 fMinNdEdxClusterTPC(0),
144 fhNBinsClusterTPC(0),
145 fhNBinsClusterITS(0),
146 fhNBinsClusterTRD(0),
147 fhNBinsFoundClusterTPC(0),
148 fhNBinsTrackletTRD(0),
149 fhNBinsTrackletTRDpid(0),
153 fhNBinsdEdxClusterTPC(0),
154 fhNBinsCovariance11(0),
155 fhNBinsCovariance22(0),
156 fhNBinsCovariance33(0),
157 fhNBinsCovariance44(0),
158 fhNBinsCovariance55(0),
159 fhBinLimClusterTPC(0x0),
160 fhBinLimClusterITS(0x0),
161 fhBinLimClusterTRD(0x0),
162 fhBinLimFoundClusterTPC(0x0),
163 fhBinLimTrackletTRD(0x0),
164 fhBinLimTrackletTRDpid(0x0),
165 fhBinLimChi2TPC(0x0),
166 fhBinLimChi2ITS(0x0),
167 fhBinLimChi2TRD(0x0),
168 fhBinLimdEdxClusterTPC(0x0),
169 fhBinLimCovariance11(0x0),
170 fhBinLimCovariance22(0x0),
171 fhBinLimCovariance33(0x0),
172 fhBinLimCovariance44(0x0),
173 fhBinLimCovariance55(0x0)
180 //__________________________________________________________________________________
181 AliCFTrackQualityCuts::AliCFTrackQualityCuts(const AliCFTrackQualityCuts& c) :
183 fMinNClusterTPC(c.fMinNClusterTPC),
184 fMinNClusterITS(c.fMinNClusterITS),
185 fMinNClusterTRD(c.fMinNClusterTRD),
186 fMinFoundClusterTPC(c.fMinFoundClusterTPC),
187 fMinNTrackletTRD(c.fMinNTrackletTRD),
188 fMinNTrackletTRDpid(c.fMinNTrackletTRDpid),
189 fMaxChi2PerClusterTPC(c.fMaxChi2PerClusterTPC),
190 fMaxChi2PerClusterITS(c.fMaxChi2PerClusterITS),
191 fMaxChi2PerTrackletTRD(c.fMaxChi2PerTrackletTRD),
192 fMinNdEdxClusterTPC(c.fMinNdEdxClusterTPC),
193 fCovariance11Max(c.fCovariance11Max),
194 fCovariance22Max(c.fCovariance22Max),
195 fCovariance33Max(c.fCovariance33Max),
196 fCovariance44Max(c.fCovariance44Max),
197 fCovariance55Max(c.fCovariance55Max),
199 fhCutStatistics(c.fhCutStatistics),
200 fhCutCorrelation(c.fhCutCorrelation),
202 fTrackCuts(c.fTrackCuts),
203 fhNBinsClusterTPC(c.fhNBinsClusterTPC),
204 fhNBinsClusterITS(c.fhNBinsClusterITS),
205 fhNBinsClusterTRD(c.fhNBinsClusterTRD),
206 fhNBinsFoundClusterTPC(c.fhNBinsFoundClusterTPC),
207 fhNBinsTrackletTRD(c.fhNBinsTrackletTRD),
208 fhNBinsTrackletTRDpid(c.fhNBinsTrackletTRDpid),
209 fhNBinsChi2TPC(c.fhNBinsChi2TPC),
210 fhNBinsChi2ITS(c.fhNBinsChi2ITS),
211 fhNBinsChi2TRD(c.fhNBinsChi2TRD),
212 fhNBinsdEdxClusterTPC(c.fhNBinsdEdxClusterTPC),
213 fhNBinsCovariance11(c.fhNBinsCovariance11),
214 fhNBinsCovariance22(c.fhNBinsCovariance22),
215 fhNBinsCovariance33(c.fhNBinsCovariance33),
216 fhNBinsCovariance44(c.fhNBinsCovariance44),
217 fhNBinsCovariance55(c.fhNBinsCovariance55),
218 fhBinLimClusterTPC(c.fhBinLimClusterTPC),
219 fhBinLimClusterITS(c.fhBinLimClusterITS),
220 fhBinLimClusterTRD(c.fhBinLimClusterTRD),
221 fhBinLimFoundClusterTPC(c.fhBinLimFoundClusterTPC),
222 fhBinLimTrackletTRD(c.fhBinLimTrackletTRD),
223 fhBinLimTrackletTRDpid(c.fhBinLimTrackletTRDpid),
224 fhBinLimChi2TPC(c.fhBinLimChi2TPC),
225 fhBinLimChi2ITS(c.fhBinLimChi2ITS),
226 fhBinLimChi2TRD(c.fhBinLimChi2TRD),
227 fhBinLimdEdxClusterTPC(c.fhBinLimdEdxClusterTPC),
228 fhBinLimCovariance11(c.fhBinLimCovariance11),
229 fhBinLimCovariance22(c.fhBinLimCovariance22),
230 fhBinLimCovariance33(c.fhBinLimCovariance33),
231 fhBinLimCovariance44(c.fhBinLimCovariance44),
232 fhBinLimCovariance55(c.fhBinLimCovariance55)
237 ((AliCFTrackQualityCuts &) c).Copy(*this);
239 //__________________________________________________________________________________
240 AliCFTrackQualityCuts& AliCFTrackQualityCuts::operator=(const AliCFTrackQualityCuts& c)
243 // Assignment operator
246 AliCFCutBase::operator=(c) ;
247 fMinNClusterTPC = c.fMinNClusterTPC ;
248 fMinNClusterITS = c.fMinNClusterITS ;
249 fMinNClusterTRD = c.fMinNClusterTRD ;
250 fMinFoundClusterTPC = c.fMinFoundClusterTPC ;
251 fMinNTrackletTRD = c.fMinNTrackletTRD ;
252 fMinNTrackletTRDpid = c.fMinNTrackletTRDpid ;
253 fMaxChi2PerClusterTPC = c.fMaxChi2PerClusterTPC ;
254 fMaxChi2PerClusterITS = c.fMaxChi2PerClusterITS ;
255 fMaxChi2PerTrackletTRD = c.fMaxChi2PerTrackletTRD ;
256 fMinNdEdxClusterTPC = c.fMinNdEdxClusterTPC;
257 fCovariance11Max = c.fCovariance11Max ;
258 fCovariance22Max = c.fCovariance22Max ;
259 fCovariance33Max = c.fCovariance33Max ;
260 fCovariance44Max = c.fCovariance44Max ;
261 fCovariance55Max = c.fCovariance55Max ;
262 fStatus = c.fStatus ;
263 fhCutStatistics = c.fhCutStatistics ;
264 fhCutCorrelation = c.fhCutCorrelation ;
265 fBitmap = c.fBitmap ;
266 fTrackCuts = c.fTrackCuts ;
267 fhNBinsClusterTPC = c.fhNBinsClusterTPC ;
268 fhNBinsClusterITS = c.fhNBinsClusterITS ;
269 fhNBinsClusterTRD = c.fhNBinsClusterTRD ;
270 fhNBinsFoundClusterTPC = c.fhNBinsFoundClusterTPC ;
271 fhNBinsTrackletTRD = c.fhNBinsTrackletTRD ;
272 fhNBinsTrackletTRDpid = c.fhNBinsTrackletTRDpid ;
273 fhNBinsChi2TPC = c.fhNBinsChi2TPC ;
274 fhNBinsChi2ITS = c.fhNBinsChi2ITS ;
275 fhNBinsChi2TRD = c.fhNBinsChi2TRD ;
276 fhNBinsdEdxClusterTPC = c.fhNBinsdEdxClusterTPC ;
277 fhNBinsCovariance11 = c.fhNBinsCovariance11 ;
278 fhNBinsCovariance22 = c.fhNBinsCovariance22 ;
279 fhNBinsCovariance33 = c.fhNBinsCovariance33 ;
280 fhNBinsCovariance44 = c.fhNBinsCovariance44 ;
281 fhNBinsCovariance55 = c.fhNBinsCovariance55 ;
282 fhBinLimClusterTPC = c.fhBinLimClusterTPC ;
283 fhBinLimClusterITS = c.fhBinLimClusterITS ;
284 fhBinLimClusterTRD = c.fhBinLimClusterTRD ;
285 fhBinLimFoundClusterTPC = c.fhBinLimFoundClusterTPC ;
286 fhBinLimTrackletTRD = c.fhBinLimTrackletTRD ;
287 fhBinLimTrackletTRDpid = c.fhBinLimTrackletTRDpid ;
288 fhBinLimChi2TPC = c.fhBinLimChi2TPC ;
289 fhBinLimChi2ITS = c.fhBinLimChi2ITS ;
290 fhBinLimChi2TRD = c.fhBinLimChi2TRD ;
291 fhBinLimdEdxClusterTPC = c.fhBinLimdEdxClusterTPC ;
292 fhBinLimCovariance11 = c.fhBinLimCovariance11 ;
293 fhBinLimCovariance22 = c.fhBinLimCovariance22 ;
294 fhBinLimCovariance33 = c.fhBinLimCovariance33 ;
295 fhBinLimCovariance44 = c.fhBinLimCovariance44 ;
296 fhBinLimCovariance55 = c.fhBinLimCovariance55 ;
298 for (Int_t i=0; i<c.kNHist; i++){
299 for (Int_t j=0; j<c.kNStepQA; j++){
300 if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
303 ((AliCFTrackQualityCuts &) c).Copy(*this);
307 //__________________________________________________________________________________
308 AliCFTrackQualityCuts::~AliCFTrackQualityCuts()
313 if (fhCutStatistics) delete fhCutStatistics;
314 if (fhCutCorrelation) delete fhCutCorrelation;
316 for (Int_t i=0; i<kNHist; i++){
317 for (Int_t j=0; j<kNStepQA; j++){
318 if(fhQA[i][j]) delete fhQA[i][j];
321 if(fBitmap) delete fBitmap;
322 if(fTrackCuts) delete fTrackCuts;
323 if(fhBinLimClusterTPC) delete fhBinLimClusterTPC;
324 if(fhBinLimClusterITS) delete fhBinLimClusterITS;
325 if(fhBinLimClusterTRD) delete fhBinLimClusterTRD;
326 if(fhBinLimFoundClusterTPC) delete fhBinLimFoundClusterTPC;
327 if(fhBinLimTrackletTRD) delete fhBinLimTrackletTRD;
328 if(fhBinLimTrackletTRDpid) delete fhBinLimTrackletTRDpid;
329 if(fhBinLimChi2TPC) delete fhBinLimChi2TPC;
330 if(fhBinLimChi2ITS) delete fhBinLimChi2ITS;
331 if(fhBinLimChi2TRD) delete fhBinLimChi2TRD;
332 if(fhBinLimdEdxClusterTPC) delete fhBinLimdEdxClusterTPC;
333 if(fhBinLimCovariance11) delete fhBinLimCovariance11;
334 if(fhBinLimCovariance22) delete fhBinLimCovariance22;
335 if(fhBinLimCovariance33) delete fhBinLimCovariance33;
336 if(fhBinLimCovariance44) delete fhBinLimCovariance44;
337 if(fhBinLimCovariance55) delete fhBinLimCovariance55;
339 //__________________________________________________________________________________
340 void AliCFTrackQualityCuts::Initialise()
343 // sets everything to zero
348 fMinFoundClusterTPC = 0;
349 fMinNTrackletTRD = 0;
350 fMinNTrackletTRDpid = 0;
351 fMaxChi2PerClusterTPC = 0;
352 fMaxChi2PerClusterITS = 0;
353 fMaxChi2PerTrackletTRD = 0;
354 fMinNdEdxClusterTPC = 0;
355 fCovariance11Max = 0;
356 fCovariance22Max = 0;
357 fCovariance33Max = 0;
358 fCovariance44Max = 0;
359 fCovariance55Max = 0;
365 SetMinFoundClusterTPC();
366 SetMinNTrackletTRD();
367 SetMinNTrackletTRDpid();
368 SetMaxChi2PerClusterTPC();
369 SetMaxChi2PerClusterITS();
370 SetMaxChi2PerTrackletTRD();
371 SetMinNdEdxClusterTPC();
372 SetMaxCovDiagonalElements();
375 for (Int_t i=0; i<kNHist; i++){
376 for (Int_t j=0; j<kNStepQA; j++)
380 fhCutCorrelation = 0;
381 fBitmap=new TBits(0);
382 fTrackCuts=new AliESDtrackCuts("aliESDtrackCuts","aliESDtrackCuts");
384 //set default bining for QA histograms
385 SetHistogramBins(kCutClusterTPC,165,-0.5,164.5);
386 SetHistogramBins(kCutClusterITS,8,-0.5,7.5);
387 SetHistogramBins(kCutClusterTRD,120,-0.5,119.5);
388 SetHistogramBins(kCutMinFoundClusterTPC,110,-0.05,1.05);
389 SetHistogramBins(kCutTrackletTRD,7,-0.5,6.5);
390 SetHistogramBins(kCutTrackletTRDpid,7,-0.5,6.5);
391 SetHistogramBins(kCutChi2TPC,500,0.,10.);
392 SetHistogramBins(kCutChi2ITS,500,0.,10.);
393 SetHistogramBins(kCutChi2TRD,500,0.,10.);
394 SetHistogramBins(kCutdEdxClusterTPC,165,-0.5,164.5);
395 SetHistogramBins(kCutCovElement11,200,0.,20.);
396 SetHistogramBins(kCutCovElement22,200,0.,20.);
397 SetHistogramBins(kCutCovElement33,100,0.,1.);
398 SetHistogramBins(kCutCovElement44,100,0.,5.);
399 SetHistogramBins(kCutCovElement55,100,0.,5.);
401 //__________________________________________________________________________________
402 void AliCFTrackQualityCuts::Copy(TObject &c) const
407 AliCFTrackQualityCuts& target = (AliCFTrackQualityCuts &) c;
411 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
412 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
414 for (Int_t i=0; i<kNHist; i++){
415 for (Int_t j=0; j<kNStepQA; j++){
416 if(fhQA[i][j]) target.fhQA[i][j] = (TH1F*)fhQA[i][j]->Clone();
421 //__________________________________________________________________________________
422 void AliCFTrackQualityCuts::SelectionBitMap(TObject* obj)
425 // test if the track passes the single cuts
426 // and store the information in a bitmap
429 // bitmap stores the decision of each single cut
430 for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kFALSE);
433 if (!obj->InheritsFrom("AliVParticle")) {
434 AliError("object must derived from AliVParticle !");
438 AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(obj);
439 AliAODTrack * aodTrack = dynamic_cast<AliAODTrack*>(obj);
441 if (!(esdTrack || aodTrack)) {
442 AliError("object must be an ESDtrack or an AODtrack !");
446 Bool_t isESDTrack = kFALSE;
447 Bool_t isAODTrack = kFALSE;
449 if (esdTrack) isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
450 if (aodTrack) isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
452 fTrackCuts->SetMinNClustersTPC(fMinNClusterTPC);
453 fTrackCuts->SetMinNClustersITS(fMinNClusterITS);
454 fTrackCuts->SetMaxChi2PerClusterTPC(fMaxChi2PerClusterTPC);
455 fTrackCuts->SetMaxChi2PerClusterITS(fMaxChi2PerClusterITS);
456 fTrackCuts->SetMaxCovDiagonalElements(fCovariance11Max,fCovariance22Max,fCovariance33Max,fCovariance44Max,fCovariance55Max);
458 // // // remove following 5 lines when AliESDtrackCuts is updated
459 Int_t nClustersTPC = 0;
460 Int_t nClustersITS = 0 ;
461 Float_t chi2PerClusterTPC = 0 ;
462 Float_t chi2PerClusterITS = 0 ;
463 Double_t extCov[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
465 // get cut quantities
466 Int_t nClustersTRD = 0;
467 Int_t nTrackletsTRD = 0;
468 Float_t chi2PerTrackletTRD = 0;
469 Float_t fractionFoundClustersTPC = 0;
472 nClustersTRD = esdTrack->GetTRDncls();
473 nTrackletsTRD = esdTrack->GetTRDntracklets();
474 if (nTrackletsTRD != 0) chi2PerTrackletTRD = esdTrack->GetTRDchi2() / Float_t(nTrackletsTRD);
475 // // // include following line when AliESDtrackCuts is updated
476 // if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = fTrackCuts->GetCutVariable(2) / float(esdTrack->GetTPCNclsF());
478 // // // remove following 6 lines when AliESDtrackCuts is updated
479 nClustersTPC = esdTrack->GetTPCclusters(0x0);
480 nClustersITS = esdTrack->GetITSclusters(0x0);
481 if (nClustersTPC != 0) chi2PerClusterTPC = esdTrack->GetTPCchi2() / Float_t(nClustersTPC);
482 if (nClustersITS != 0) chi2PerClusterITS = esdTrack->GetITSchi2() / Float_t(nClustersITS);
483 esdTrack->GetExternalCovariance(extCov);
484 if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = float(nClustersTPC) / float(esdTrack->GetTPCNclsF());
490 // // // include following lines when AliESDtrackCuts is updated
491 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(2)); iCutBit++; // nClustersTPC
492 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(3)); iCutBit++; // nClustersITS
493 // // // remove following 6 lines when AliESDtrackCuts is updated
494 if (nClustersTPC >= fMinNClusterTPC)
495 fBitmap->SetBitNumber(iCutBit,kTRUE);
497 if (nClustersITS >= fMinNClusterITS)
498 fBitmap->SetBitNumber(iCutBit,kTRUE);
501 if (nClustersTRD >= fMinNClusterTRD)
502 fBitmap->SetBitNumber(iCutBit,kTRUE);
504 // // // if ((fMinFoundClusterTPC <= 0) || (fTrackCuts->GetCutVariable(2) > 0 && (fractionFoundClustersTPC >= fMinFoundClusterTPC)))
505 if ((fMinFoundClusterTPC <= 0) || (nClustersTPC > 0 && (fractionFoundClustersTPC >= fMinFoundClusterTPC)))
506 fBitmap->SetBitNumber(iCutBit,kTRUE);
508 if (nTrackletsTRD >= fMinNTrackletTRD)
509 fBitmap->SetBitNumber(iCutBit,kTRUE);
511 if (!isESDTrack || esdTrack->GetTRDntrackletsPID() >= fMinNTrackletTRDpid)
512 fBitmap->SetBitNumber(iCutBit,kTRUE);
515 // // // include following lines when AliESDtrackCuts is updated
516 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(4)); iCutBit++; // chi2PerClusterTPC
517 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(5)); iCutBit++; // chi2PerClusterITS
518 // // // remove following 6 lines when AliESDtrackCuts is updated
519 if (chi2PerClusterTPC <= fMaxChi2PerClusterTPC)
520 fBitmap->SetBitNumber(iCutBit,kTRUE);
522 if (chi2PerClusterITS <= fMaxChi2PerClusterITS)
523 fBitmap->SetBitNumber(iCutBit,kTRUE);
526 if (chi2PerTrackletTRD <= fMaxChi2PerTrackletTRD)
527 fBitmap->SetBitNumber(iCutBit,kTRUE);
529 if (!isESDTrack || esdTrack->GetTPCsignalN() >= fMinNdEdxClusterTPC)
530 fBitmap->SetBitNumber(iCutBit,kTRUE);
533 // // // include following lines when AliESDtrackCuts is updated
534 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(6)); iCutBit++; // extCov[0]
535 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(7)); iCutBit++; // extCov[2]
536 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(8)); iCutBit++; // extCov[5]
537 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(9)); iCutBit++; // extCov[9]
538 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(10)); iCutBit++; // extCov[14]
539 // // // remove following lines when AliESDtrackCuts is updated
540 if (extCov[0] <= fCovariance11Max)
541 fBitmap->SetBitNumber(iCutBit,kTRUE);
543 if (extCov[2] <= fCovariance22Max)
544 fBitmap->SetBitNumber(iCutBit,kTRUE);
546 if (extCov[5] <= fCovariance33Max)
547 fBitmap->SetBitNumber(iCutBit,kTRUE);
549 if (extCov[9] <= fCovariance44Max)
550 fBitmap->SetBitNumber(iCutBit,kTRUE);
552 if (extCov[14] <= fCovariance55Max)
553 fBitmap->SetBitNumber(iCutBit,kTRUE);
558 if ( (esdTrack->GetStatus() & fStatus) == fStatus ) fBitmap->SetBitNumber(iCutBit,kTRUE);
561 if ( (aodTrack->GetStatus() & fStatus) == fStatus ) fBitmap->SetBitNumber(iCutBit,kTRUE);
566 //__________________________________________________________________________________
567 Bool_t AliCFTrackQualityCuts::IsSelected(TObject* obj) {
569 // loops over decisions of single cuts and returns if the track is accepted
571 SelectionBitMap(obj);
573 if (fIsQAOn) FillHistograms(obj,0);
574 Bool_t isSelected = kTRUE;
576 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
577 if(!fBitmap->TestBitNumber(icut)) {
582 if (!isSelected) return kFALSE ;
583 if (fIsQAOn) FillHistograms(obj,1);
586 //__________________________________________________________________________________
587 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
594 if (index<0 || index>=kNHist) {
595 Error("SetHistogramBins","could not determine histogram from index %d",index);
601 fhNBinsClusterTPC=nbins+1;
602 fhBinLimClusterTPC=new Double_t[nbins+1];
603 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=bins[i];
607 fhNBinsClusterITS=nbins+1;
608 fhBinLimClusterITS=new Double_t[nbins+1];
609 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=bins[i];
613 fhNBinsClusterTRD=nbins+1;
614 fhBinLimClusterTRD=new Double_t[nbins+1];
615 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTRD[i]=bins[i];
618 case kCutMinFoundClusterTPC:
619 fhNBinsFoundClusterTPC=nbins+1;
620 fhBinLimFoundClusterTPC=new Double_t[nbins+1];
621 for(Int_t i=0;i<nbins+1;i++)fhBinLimFoundClusterTPC[i]=bins[i];
624 case kCutTrackletTRD:
625 fhNBinsTrackletTRD=nbins+1;
626 fhBinLimTrackletTRD=new Double_t[nbins+1];
627 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRD[i]=bins[i];
630 case kCutTrackletTRDpid:
631 fhNBinsTrackletTRDpid=nbins+1;
632 fhBinLimTrackletTRDpid=new Double_t[nbins+1];
633 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRDpid[i]=bins[i];
637 fhNBinsChi2TPC=nbins+1;
638 fhBinLimChi2TPC=new Double_t[nbins+1];
639 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=bins[i];
643 fhNBinsChi2ITS=nbins+1;
644 fhBinLimChi2ITS=new Double_t[nbins+1];
645 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=bins[i];
649 fhNBinsChi2TRD=nbins+1;
650 fhBinLimChi2TRD=new Double_t[nbins+1];
651 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TRD[i]=bins[i];
654 case kCutdEdxClusterTPC:
655 fhNBinsdEdxClusterTPC=nbins+1;
656 fhBinLimdEdxClusterTPC=new Double_t[nbins+1];
657 for(Int_t i=0;i<nbins+1;i++)fhBinLimdEdxClusterTPC[i]=bins[i];
660 case kCutCovElement11:
661 fhNBinsCovariance11=nbins+1;
662 fhBinLimCovariance11=new Double_t[nbins+1];
663 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=bins[i];
666 case kCutCovElement22:
667 fhNBinsCovariance22=nbins+1;
668 fhBinLimCovariance22=new Double_t[nbins+1];
669 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=bins[i];
672 case kCutCovElement33:
673 fhNBinsCovariance33=nbins+1;
674 fhBinLimCovariance33=new Double_t[nbins+1];
675 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=bins[i];
678 case kCutCovElement44:
679 fhNBinsCovariance44=nbins+1;
680 fhBinLimCovariance44=new Double_t[nbins+1];
681 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=bins[i];
684 case kCutCovElement55:
685 fhNBinsCovariance55=nbins+1;
686 fhBinLimCovariance55=new Double_t[nbins+1];
687 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=bins[i];
691 //__________________________________________________________________________________
692 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
697 if (index<0 || index>=kNHist) {
698 Error("SetHistogramBins","could not determine histogram from index %d",index);
704 fhNBinsClusterTPC=nbins+1;
705 fhBinLimClusterTPC=new Double_t[nbins+1];
706 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
710 fhNBinsClusterITS=nbins+1;
711 fhBinLimClusterITS=new Double_t[nbins+1];
712 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
716 fhNBinsClusterTRD=nbins+1;
717 fhBinLimClusterTRD=new Double_t[nbins+1];
718 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
721 case kCutMinFoundClusterTPC:
722 fhNBinsFoundClusterTPC=nbins+1;
723 fhBinLimFoundClusterTPC=new Double_t[nbins+1];
724 for(Int_t i=0;i<nbins+1;i++)fhBinLimFoundClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
727 case kCutTrackletTRD:
728 fhNBinsTrackletTRD=nbins+1;
729 fhBinLimTrackletTRD=new Double_t[nbins+1];
730 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
733 case kCutTrackletTRDpid:
734 fhNBinsTrackletTRDpid=nbins+1;
735 fhBinLimTrackletTRDpid=new Double_t[nbins+1];
736 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRDpid[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
740 fhNBinsChi2TPC=nbins+1;
741 fhBinLimChi2TPC=new Double_t[nbins+1];
742 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
746 fhNBinsChi2ITS=nbins+1;
747 fhBinLimChi2ITS=new Double_t[nbins+1];
748 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
752 fhNBinsChi2TRD=nbins+1;
753 fhBinLimChi2TRD=new Double_t[nbins+1];
754 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
757 case kCutdEdxClusterTPC:
758 fhNBinsdEdxClusterTPC=nbins+1;
759 fhBinLimdEdxClusterTPC=new Double_t[nbins+1];
760 for(Int_t i=0;i<nbins+1;i++)fhBinLimdEdxClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
763 case kCutCovElement11:
764 fhNBinsCovariance11=nbins+1;
765 fhBinLimCovariance11=new Double_t[nbins+1];
766 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
769 case kCutCovElement22:
770 fhNBinsCovariance22=nbins+1;
771 fhBinLimCovariance22=new Double_t[nbins+1];
772 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
775 case kCutCovElement33:
776 fhNBinsCovariance33=nbins+1;
777 fhBinLimCovariance33=new Double_t[nbins+1];
778 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
781 case kCutCovElement44:
782 fhNBinsCovariance44=nbins+1;
783 fhBinLimCovariance44=new Double_t[nbins+1];
784 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
787 case kCutCovElement55:
788 fhNBinsCovariance55=nbins+1;
789 fhBinLimCovariance55=new Double_t[nbins+1];
790 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
794 //__________________________________________________________________________________
795 void AliCFTrackQualityCuts::DefineHistograms() {
797 // histograms for cut variables, cut statistics and cut correlations
801 // book cut statistics and cut correlation histograms
802 fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()), Form("%s cut statistics",GetName()), kNCuts,0.5,kNCuts+0.5);
803 fhCutStatistics->SetLineWidth(2);
804 fhCutStatistics->GetXaxis()->SetBinLabel(1, "nClustersTPC");
805 fhCutStatistics->GetXaxis()->SetBinLabel(2, "nClustersITS");
806 fhCutStatistics->GetXaxis()->SetBinLabel(3, "nClustersTRD");
807 fhCutStatistics->GetXaxis()->SetBinLabel(4, "fractionClustersTPC");
808 fhCutStatistics->GetXaxis()->SetBinLabel(5, "ntrackletsTRD");
809 fhCutStatistics->GetXaxis()->SetBinLabel(6, "ntrackletsTRDpid");
810 fhCutStatistics->GetXaxis()->SetBinLabel(7, "chi2PerClusterTPC");
811 fhCutStatistics->GetXaxis()->SetBinLabel(8, "chi2PerClusterITS");
812 fhCutStatistics->GetXaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
813 fhCutStatistics->GetXaxis()->SetBinLabel(10, "ndEdxClusterTPC");
814 fhCutStatistics->GetXaxis()->SetBinLabel(11, "covElement11");
815 fhCutStatistics->GetXaxis()->SetBinLabel(12, "covElement22");
816 fhCutStatistics->GetXaxis()->SetBinLabel(13, "covElement33");
817 fhCutStatistics->GetXaxis()->SetBinLabel(14, "covElement44");
818 fhCutStatistics->GetXaxis()->SetBinLabel(15, "covElement55");
819 fhCutStatistics->GetXaxis()->SetBinLabel(16, "status");
821 fhCutCorrelation = new TH2F(Form("%s_cut_correlation",GetName()), Form("%s cut correlation",GetName()), kNCuts,0.5,kNCuts+0.5,kNCuts,0.5,kNCuts+0.5);
822 fhCutCorrelation->SetLineWidth(2);
823 fhCutCorrelation->GetXaxis()->SetBinLabel(1, "nClustersTPC");
824 fhCutCorrelation->GetXaxis()->SetBinLabel(2, "nClustersITS");
825 fhCutCorrelation->GetXaxis()->SetBinLabel(3, "nClustersTRD");
826 fhCutCorrelation->GetXaxis()->SetBinLabel(4, "fractionClustersTPC");
827 fhCutCorrelation->GetXaxis()->SetBinLabel(5, "ntrackletsTRD");
828 fhCutCorrelation->GetXaxis()->SetBinLabel(6, "ntrackletsTRDpid");
829 fhCutCorrelation->GetXaxis()->SetBinLabel(7, "chi2PerClusterTPC");
830 fhCutCorrelation->GetXaxis()->SetBinLabel(8, "chi2PerClusterITS");
831 fhCutCorrelation->GetXaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
832 fhCutCorrelation->GetXaxis()->SetBinLabel(10, "ndEdxClustersTPC");
833 fhCutCorrelation->GetXaxis()->SetBinLabel(11, "covElement11");
834 fhCutCorrelation->GetXaxis()->SetBinLabel(12, "covElement22");
835 fhCutCorrelation->GetXaxis()->SetBinLabel(13, "covElement33");
836 fhCutCorrelation->GetXaxis()->SetBinLabel(14, "covElement44");
837 fhCutCorrelation->GetXaxis()->SetBinLabel(15, "covElement55");
838 fhCutCorrelation->GetXaxis()->SetBinLabel(16, "status");
840 fhCutCorrelation->GetYaxis()->SetBinLabel(1, "nClustersTPC");
841 fhCutCorrelation->GetYaxis()->SetBinLabel(2, "nClustersITS");
842 fhCutCorrelation->GetYaxis()->SetBinLabel(3, "nClustersTRD");
843 fhCutCorrelation->GetYaxis()->SetBinLabel(4, "fractionClustersTPC");
844 fhCutCorrelation->GetYaxis()->SetBinLabel(5, "ntrackletsTRD");
845 fhCutCorrelation->GetYaxis()->SetBinLabel(6, "ntrackletsTRDpid");
846 fhCutCorrelation->GetYaxis()->SetBinLabel(7, "chi2PerClusterTPC");
847 fhCutCorrelation->GetYaxis()->SetBinLabel(8, "chi2PerClusterITS");
848 fhCutCorrelation->GetYaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
849 fhCutCorrelation->GetYaxis()->SetBinLabel(10, "ndEdxClustersTPC");
850 fhCutCorrelation->GetYaxis()->SetBinLabel(11, "covElement11");
851 fhCutCorrelation->GetYaxis()->SetBinLabel(12, "covElement22");
852 fhCutCorrelation->GetYaxis()->SetBinLabel(13, "covElement33");
853 fhCutCorrelation->GetYaxis()->SetBinLabel(14, "covElement44");
854 fhCutCorrelation->GetYaxis()->SetBinLabel(15, "covElement55");
855 fhCutCorrelation->GetYaxis()->SetBinLabel(16, "status");
858 // book QA histograms
860 for (Int_t i=0; i<kNStepQA; i++) {
861 if (i==0) snprintf(str,5," ");
862 else snprintf(str,5,"_cut");
864 fhQA[kCutClusterTPC][i] = new TH1F(Form("%s_nClustersTPC%s",GetName(),str) ,"",fhNBinsClusterTPC-1,fhBinLimClusterTPC);
865 fhQA[kCutClusterITS][i] = new TH1F(Form("%s_nClustersITS%s",GetName(),str) ,"",fhNBinsClusterITS-1,fhBinLimClusterITS);
866 fhQA[kCutClusterTRD][i] = new TH1F(Form("%s_nClustersTRD%s",GetName(),str) ,"",fhNBinsClusterTRD-1,fhBinLimClusterTRD);
867 fhQA[kCutMinFoundClusterTPC][i] = new TH1F(Form("%s_fractionClustersTPC%s",GetName(),str) ,"",fhNBinsFoundClusterTPC-1,fhBinLimFoundClusterTPC);
868 fhQA[kCutTrackletTRD][i] = new TH1F(Form("%s_ntrackletsTRD%s",GetName(),str) ,"",fhNBinsTrackletTRD-1,fhBinLimTrackletTRD);
869 fhQA[kCutTrackletTRDpid][i] = new TH1F(Form("%s_ntrackletsTRDpid%s",GetName(),str) ,"",fhNBinsTrackletTRDpid-1,fhBinLimTrackletTRDpid);
870 fhQA[kCutChi2TPC][i] = new TH1F(Form("%s_chi2PerClusterTPC%s",GetName(),str),"",fhNBinsChi2TPC-1,fhBinLimChi2TPC);
871 fhQA[kCutChi2ITS][i] = new TH1F(Form("%s_chi2PerClusterITS%s",GetName(),str),"",fhNBinsChi2ITS-1,fhBinLimChi2ITS);
872 fhQA[kCutChi2TRD][i] = new TH1F(Form("%s_chi2PerTrackletTRD%s",GetName(),str),"",fhNBinsChi2TRD-1,fhBinLimChi2TRD);
873 fhQA[kCutdEdxClusterTPC][i] = new TH1F(Form("%s_ndEdxClustersTPC%s",GetName(),str) ,"",fhNBinsdEdxClusterTPC-1,fhBinLimdEdxClusterTPC);
874 fhQA[kCutCovElement11][i] = new TH1F(Form("%s_covMatrixDiagonal11%s",GetName(),str),"",fhNBinsCovariance11-1,fhBinLimCovariance11);
875 fhQA[kCutCovElement22][i] = new TH1F(Form("%s_covMatrixDiagonal22%s",GetName(),str),"",fhNBinsCovariance22-1,fhBinLimCovariance22);
876 fhQA[kCutCovElement33][i] = new TH1F(Form("%s_covMatrixDiagonal33%s",GetName(),str),"",fhNBinsCovariance33-1,fhBinLimCovariance33);
877 fhQA[kCutCovElement44][i] = new TH1F(Form("%s_covMatrixDiagonal44%s",GetName(),str),"",fhNBinsCovariance44-1,fhBinLimCovariance44);
878 fhQA[kCutCovElement55][i] = new TH1F(Form("%s_covMatrixDiagonal55%s",GetName(),str),"",fhNBinsCovariance55-1,fhBinLimCovariance55);
880 fhQA[kCutClusterTPC][i] ->SetXTitle("n TPC clusters");
881 fhQA[kCutClusterITS][i] ->SetXTitle("n ITS clusters");
882 fhQA[kCutClusterTRD][i] ->SetXTitle("n TRD clusters");
883 fhQA[kCutMinFoundClusterTPC][i]->SetXTitle("fraction TPC clusters");
884 fhQA[kCutTrackletTRD][i] ->SetXTitle("n tracklets TRD");
885 fhQA[kCutTrackletTRDpid][i]->SetXTitle("n tracklets TRD pid");
886 fhQA[kCutChi2TPC][i] ->SetXTitle("#chi^{2} per TPC cluster");
887 fhQA[kCutChi2ITS][i] ->SetXTitle("#chi^{2} per ITS cluster");
888 fhQA[kCutChi2TRD][i] ->SetXTitle("#chi^{2} per TRD tracklet");
889 fhQA[kCutdEdxClusterTPC][i] ->SetXTitle("n dEdx TPC clusters");
890 fhQA[kCutCovElement11][i] ->SetXTitle("cov 11 : #sigma_{y}^{2} (cm^{2})");
891 fhQA[kCutCovElement22][i] ->SetXTitle("cov 22 : #sigma_{z}^{2} (cm^{2})");
892 fhQA[kCutCovElement33][i] ->SetXTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
893 fhQA[kCutCovElement44][i] ->SetXTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
894 fhQA[kCutCovElement55][i] ->SetXTitle("cov 55 : #sigma_{1/p_{T}}^{2} ((c/GeV)^{2})");
897 for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
899 //__________________________________________________________________________________
900 void AliCFTrackQualityCuts::FillHistograms(TObject* obj, Bool_t b)
903 // fill the QA histograms
907 if (!obj->InheritsFrom("AliVParticle")) {
908 AliError("object must derived from AliVParticle !");
912 AliESDtrack * esdTrack = dynamic_cast<AliESDtrack*>(obj);
913 AliAODTrack * aodTrack = dynamic_cast<AliAODTrack*>(obj);
915 if (!(esdTrack || aodTrack)) {
916 AliError("object must be an ESDtrack or an AODtrack !");
920 Bool_t isESDTrack = kFALSE;
921 Bool_t isAODTrack = kFALSE;
923 if (esdTrack) isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
924 if (aodTrack) isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
927 // b = 0: fill histograms before cuts
928 // b = 1: fill histograms after cuts
930 // // // remove following 5 lines when AliESDtrackCuts is updated
931 Int_t nClustersTPC = 0;
932 Int_t nClustersITS = 0 ;
933 Float_t chi2PerClusterTPC = 0 ;
934 Float_t chi2PerClusterITS = 0 ;
935 Double_t extCov[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
937 Int_t nClustersTRD = 0 ;
938 Int_t nTrackletsTRD = 0 ;
939 Float_t chi2PerTrackletTRD = 0 ;
940 Float_t fractionFoundClustersTPC = 0;
943 nClustersTRD = esdTrack->GetTRDncls();
944 nTrackletsTRD = esdTrack->GetTRDntracklets();
945 if (nTrackletsTRD != 0) chi2PerTrackletTRD = esdTrack->GetTRDchi2() / Float_t(nTrackletsTRD);
947 // // // include following line when AliESDtrackCuts is updated
948 // if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = fTrackCuts->GetCutVariable(2) / float(esdTrack->GetTPCNclsF());
950 // // // remove following 6 lines when AliESDtrackCuts is updated
951 nClustersTPC = esdTrack->GetTPCclusters(0x0);
952 nClustersITS = esdTrack->GetITSclusters(0x0);
953 if (nClustersTPC != 0) chi2PerClusterTPC = esdTrack->GetTPCchi2() / Float_t(nClustersTPC);
954 if (nClustersITS != 0) chi2PerClusterITS = esdTrack->GetITSchi2() / Float_t(nClustersITS);
955 esdTrack->GetExternalCovariance(extCov);
956 if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = float(nClustersTPC) / float(esdTrack->GetTPCNclsF());
959 // // // include following lines when AliESDtrackCuts is updated
960 // fhQA[kCutClusterTPC][b]->Fill(fTrackCuts->GetCutVariable(2));
961 // fhQA[kCutClusterITS][b]->Fill(fTrackCuts->GetCutVariable(3));
962 // fhQA[kCutChi2TPC][b]->Fill(fTrackCuts->GetCutVariable(4));
963 // fhQA[kCutChi2ITS][b]->Fill(fTrackCuts->GetCutVariable(5));
964 // // // remove following 4 lines when AliESDtrackCuts is updated
965 fhQA[kCutClusterTPC][b]->Fill((float)nClustersTPC);
966 fhQA[kCutChi2TPC][b]->Fill(chi2PerClusterTPC);
967 fhQA[kCutClusterITS][b]->Fill((float)nClustersITS);
968 fhQA[kCutChi2ITS][b]->Fill(chi2PerClusterITS);
971 fhQA[kCutClusterTRD][b]->Fill((float)nClustersTRD);
972 fhQA[kCutChi2TRD][b]->Fill(chi2PerTrackletTRD);
973 // if (b==0 || (b==1 && fTrackCuts->GetCutVariable(2)>0)) fhQA[kCutMinFoundClusterTPC][b]->Fill((float)fractionFoundClustersTPC);
974 if (b==0 || (b==1 && nClustersTPC>0)) fhQA[kCutMinFoundClusterTPC][b]->Fill((float)fractionFoundClustersTPC);
975 fhQA[kCutTrackletTRD][b]->Fill((float)nTrackletsTRD);
977 fhQA[kCutTrackletTRDpid][b]->Fill((float)esdTrack->GetTRDntrackletsPID());
978 fhQA[kCutdEdxClusterTPC][b]->Fill((float)esdTrack->GetTPCsignalN());
980 // // // include following lines when AliESDtrackCuts is updated
981 // fhQA[kCutCovElement11][b]->Fill(fTrackCuts->GetCutVariable(6));
982 // fhQA[kCutCovElement22][b]->Fill(fTrackCuts->GetCutVariable(7));
983 // fhQA[kCutCovElement33][b]->Fill(fTrackCuts->GetCutVariable(8));
984 // fhQA[kCutCovElement44][b]->Fill(fTrackCuts->GetCutVariable(9));
985 // fhQA[kCutCovElement55][b]->Fill(fTrackCuts->GetCutVariable(10));
986 // // // remove following 5 lines when AliESDtrackCuts is updated
987 fhQA[kCutCovElement11][b]->Fill(extCov[0]);
988 fhQA[kCutCovElement22][b]->Fill(extCov[2]);
989 fhQA[kCutCovElement33][b]->Fill(extCov[5]);
990 fhQA[kCutCovElement44][b]->Fill(extCov[9]);
991 fhQA[kCutCovElement55][b]->Fill(extCov[14]);
994 // fill cut statistics and cut correlation histograms with information from the bitmap
997 // Get the bitmap of the single cuts
999 SelectionBitMap(obj);
1001 // Number of single cuts in this class
1002 UInt_t ncuts = fBitmap->GetNbits();
1003 for(UInt_t bit=0; bit<ncuts;bit++) {
1004 if (!fBitmap->TestBitNumber(bit)) {
1005 fhCutStatistics->Fill(bit+1);
1006 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
1007 if (!fBitmap->TestBitNumber(bit2))
1008 fhCutCorrelation->Fill(bit+1,bit2+1);
1013 //__________________________________________________________________________________
1014 void AliCFTrackQualityCuts::SaveHistograms(const Char_t* dir) {
1016 // saves the histograms in a directory (dir)
1018 if(!fIsQAOn) return;
1023 gDirectory->mkdir(dir);
1024 gDirectory->cd(dir);
1026 gDirectory->mkdir("before_cuts");
1027 gDirectory->mkdir("after_cuts");
1029 fhCutStatistics->Write();
1030 fhCutCorrelation->Write();
1032 for (Int_t j=0; j<kNStepQA; j++) {
1034 gDirectory->cd("before_cuts");
1036 gDirectory->cd("after_cuts");
1038 for(Int_t i=0; i<kNHist; i++) fhQA[i][j]->Write();
1040 gDirectory->cd("../");
1042 gDirectory->cd("../");
1044 //__________________________________________________________________________________
1045 void AliCFTrackQualityCuts::DrawHistograms(Bool_t drawLogScale)
1048 // draws some histograms
1050 if(!fIsQAOn) return;
1053 Float_t right = 0.03;
1054 Float_t left = 0.175;
1056 Float_t bottom = 0.175;
1058 TCanvas* canvas1 = new TCanvas("Track_QA_Quality_1", "Track QA Quality 1", 800, 500);
1059 canvas1->Divide(2, 1);
1062 fhCutStatistics->SetStats(kFALSE);
1063 fhCutStatistics->LabelsOption("v");
1064 gPad->SetLeftMargin(left);
1065 gPad->SetBottomMargin(0.25);
1066 gPad->SetRightMargin(right);
1067 gPad->SetTopMargin(0.1);
1068 fhCutStatistics->Draw();
1071 fhCutCorrelation->SetStats(kFALSE);
1072 fhCutCorrelation->LabelsOption("v");
1073 gPad->SetLeftMargin(0.30);
1074 gPad->SetRightMargin(bottom);
1075 gPad->SetTopMargin(0.1);
1076 gPad->SetBottomMargin(0.25);
1077 fhCutCorrelation->Draw("COLZ");
1079 canvas1->SaveAs(Form("%s.eps", canvas1->GetName()));
1080 canvas1->SaveAs(Form("%s.ps", canvas1->GetName()));
1084 TCanvas* canvas2 = new TCanvas("Track_QA_Quality_2", "Track QA Quality 2", 1200, 800);
1085 canvas2->Divide(2, 2);
1088 gPad->SetRightMargin(right);
1089 gPad->SetLeftMargin(left);
1090 gPad->SetTopMargin(top);
1091 gPad->SetBottomMargin(bottom);
1092 fhQA[kCutClusterTPC][0]->SetStats(kFALSE);
1093 fhQA[kCutClusterTPC][0]->Draw();
1094 fhQA[kCutClusterTPC][1]->Draw("same");
1097 gPad->SetRightMargin(right);
1098 gPad->SetLeftMargin(left);
1099 gPad->SetTopMargin(top);
1100 gPad->SetBottomMargin(bottom);
1101 fhQA[kCutChi2TPC][0]->SetStats(kFALSE);
1102 fhQA[kCutChi2TPC][0]->Draw();
1103 fhQA[kCutChi2TPC][1]->Draw("same");
1106 gPad->SetRightMargin(right);
1107 gPad->SetLeftMargin(left);
1108 gPad->SetTopMargin(top);
1109 gPad->SetBottomMargin(bottom);
1110 fhQA[kCutClusterITS][0]->SetStats(kFALSE);
1111 fhQA[kCutClusterITS][0]->Draw();
1112 fhQA[kCutClusterITS][1]->Draw("same");
1115 gPad->SetRightMargin(right);
1116 gPad->SetLeftMargin(left);
1117 gPad->SetTopMargin(top);
1118 gPad->SetBottomMargin(bottom);
1119 fhQA[kCutChi2ITS][0]->SetStats(kFALSE);
1120 fhQA[kCutChi2ITS][0]->Draw();
1121 fhQA[kCutChi2ITS][1]->Draw("same");
1123 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
1124 canvas2->SaveAs(Form("%s.ps", canvas2->GetName()));
1128 TCanvas* canvas3 = new TCanvas("Track_QA_Quality_3", "Track QA Quality 3", 1200, 800);
1129 canvas3->Divide(3, 2);
1132 if(drawLogScale) gPad->SetLogy();
1133 gPad->SetRightMargin(right);
1134 gPad->SetLeftMargin(left);
1135 gPad->SetTopMargin(top);
1136 gPad->SetBottomMargin(bottom);
1137 fhQA[kCutCovElement11][0]->SetStats(kFALSE);
1138 fhQA[kCutCovElement11][0]->Draw();
1139 fhQA[kCutCovElement11][1]->Draw("same");
1142 if(drawLogScale) gPad->SetLogy();
1143 gPad->SetRightMargin(right);
1144 gPad->SetLeftMargin(left);
1145 gPad->SetTopMargin(top);
1146 gPad->SetBottomMargin(bottom);
1147 fhQA[kCutCovElement22][0]->SetStats(kFALSE);
1148 fhQA[kCutCovElement22][0]->Draw();
1149 fhQA[kCutCovElement22][1]->Draw("same");
1152 if(drawLogScale) gPad->SetLogy();
1153 gPad->SetRightMargin(right);
1154 gPad->SetLeftMargin(left);
1155 gPad->SetTopMargin(top);
1156 gPad->SetBottomMargin(bottom);
1157 fhQA[kCutCovElement33][0]->SetStats(kFALSE);
1158 fhQA[kCutCovElement33][0]->Draw();
1159 fhQA[kCutCovElement33][1]->Draw("same");
1162 if(drawLogScale) gPad->SetLogy();
1163 gPad->SetRightMargin(right);
1164 gPad->SetLeftMargin(left);
1165 gPad->SetTopMargin(top);
1166 gPad->SetBottomMargin(bottom);
1167 fhQA[kCutCovElement44][0]->SetStats(kFALSE);
1168 fhQA[kCutCovElement44][0]->Draw();
1169 fhQA[kCutCovElement44][1]->Draw("same");
1172 if(drawLogScale) gPad->SetLogy();
1173 gPad->SetRightMargin(right);
1174 gPad->SetLeftMargin(left);
1175 gPad->SetTopMargin(top);
1176 gPad->SetBottomMargin(bottom);
1177 fhQA[kCutCovElement55][0]->SetStats(kFALSE);
1178 fhQA[kCutCovElement55][0]->Draw();
1179 fhQA[kCutCovElement55][1]->Draw("same");
1181 canvas3->SaveAs(Form("%s.eps", canvas3->GetName()));
1182 canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
1184 //__________________________________________________________________________________
1185 void AliCFTrackQualityCuts::AddQAHistograms(TList *qaList) {
1187 // saves the histograms in a TList
1191 qaList->Add(fhCutStatistics);
1192 qaList->Add(fhCutCorrelation);
1194 for (Int_t j=0; j<kNStepQA; j++) {
1195 for(Int_t i=0; i<kNHist; i++)
1196 qaList->Add(fhQA[i][j]);