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 TPC
25 // - number of clusters in the ITS
26 // - chi2 / cluster in the TPC
27 // - chi2 / cluster in the ITS
28 // - successful TPC refit
29 // - successful ITS refit
30 // - covariance matrix diagonal elements
32 // The cut values for these cuts are set with the corresponding set functions.
33 // All cut classes provided by the correction framework are supposed to be
34 // added in the Analysis Framwork's class AliAnalysisFilter and applied by
35 // the filter via a loop.
37 // author: I. Kraus (Ingrid.Kraus@cern.ch)
39 // AliESDtrackCuts writte by Jan Fiete Grosse-Oetringhaus and
40 // AliRsnDaughterCut class written by A. Pulvirenti.
44 #include <TDirectory.h>
48 #include <AliESDtrack.h>
50 #include "AliCFTrackQualityCuts.h"
52 ClassImp(AliCFTrackQualityCuts)
54 //__________________________________________________________________________________
55 AliCFTrackQualityCuts::AliCFTrackQualityCuts() :
59 fMaxChi2PerClusterTPC(0),
60 fMaxChi2PerClusterITS(0),
77 fhNBinsCovariance11(0),
78 fhNBinsCovariance22(0),
79 fhNBinsCovariance33(0),
80 fhNBinsCovariance44(0),
81 fhNBinsCovariance55(0),
82 fhBinLimClusterTPC(0x0),
83 fhBinLimClusterITS(0x0),
86 fhBinLimRefitTPC(0x0),
87 fhBinLimRefitITS(0x0),
88 fhBinLimCovariance11(0x0),
89 fhBinLimCovariance22(0x0),
90 fhBinLimCovariance33(0x0),
91 fhBinLimCovariance44(0x0),
92 fhBinLimCovariance55(0x0)
95 // Default constructor
99 //__________________________________________________________________________________
100 AliCFTrackQualityCuts::AliCFTrackQualityCuts(Char_t* name, Char_t* title) :
101 AliCFCutBase(name,title),
104 fMaxChi2PerClusterTPC(0),
105 fMaxChi2PerClusterITS(0),
116 fhNBinsClusterTPC(0),
117 fhNBinsClusterITS(0),
122 fhNBinsCovariance11(0),
123 fhNBinsCovariance22(0),
124 fhNBinsCovariance33(0),
125 fhNBinsCovariance44(0),
126 fhNBinsCovariance55(0),
127 fhBinLimClusterTPC(0x0),
128 fhBinLimClusterITS(0x0),
129 fhBinLimChi2TPC(0x0),
130 fhBinLimChi2ITS(0x0),
131 fhBinLimRefitTPC(0x0),
132 fhBinLimRefitITS(0x0),
133 fhBinLimCovariance11(0x0),
134 fhBinLimCovariance22(0x0),
135 fhBinLimCovariance33(0x0),
136 fhBinLimCovariance44(0x0),
137 fhBinLimCovariance55(0x0)
144 //__________________________________________________________________________________
145 AliCFTrackQualityCuts::AliCFTrackQualityCuts(const AliCFTrackQualityCuts& c) :
147 fMinNClusterTPC(c.fMinNClusterTPC),
148 fMinNClusterITS(c.fMinNClusterITS),
149 fMaxChi2PerClusterTPC(c.fMaxChi2PerClusterTPC),
150 fMaxChi2PerClusterITS(c.fMaxChi2PerClusterITS),
151 fRequireTPCRefit(c.fRequireTPCRefit),
152 fRequireITSRefit(c.fRequireITSRefit),
153 fCovariance11Max(c.fCovariance11Max),
154 fCovariance22Max(c.fCovariance22Max),
155 fCovariance33Max(c.fCovariance33Max),
156 fCovariance44Max(c.fCovariance44Max),
157 fCovariance55Max(c.fCovariance55Max),
158 fhCutStatistics(c.fhCutStatistics),
159 fhCutCorrelation(c.fhCutCorrelation),
161 fhNBinsClusterTPC(c.fhNBinsClusterTPC),
162 fhNBinsClusterITS(c.fhNBinsClusterITS),
163 fhNBinsChi2TPC(c.fhNBinsChi2TPC),
164 fhNBinsChi2ITS(c.fhNBinsChi2ITS),
165 fhNBinsRefitTPC(c.fhNBinsRefitTPC),
166 fhNBinsRefitITS(c.fhNBinsRefitITS),
167 fhNBinsCovariance11(c.fhNBinsCovariance11),
168 fhNBinsCovariance22(c.fhNBinsCovariance22),
169 fhNBinsCovariance33(c.fhNBinsCovariance33),
170 fhNBinsCovariance44(c.fhNBinsCovariance44),
171 fhNBinsCovariance55(c.fhNBinsCovariance55),
172 fhBinLimClusterTPC(c.fhBinLimClusterTPC),
173 fhBinLimClusterITS(c.fhBinLimClusterITS),
174 fhBinLimChi2TPC(c.fhBinLimChi2TPC),
175 fhBinLimChi2ITS(c.fhBinLimChi2ITS),
176 fhBinLimRefitTPC(c.fhBinLimRefitTPC),
177 fhBinLimRefitITS(c.fhBinLimRefitITS),
178 fhBinLimCovariance11(c.fhBinLimCovariance11),
179 fhBinLimCovariance22(c.fhBinLimCovariance22),
180 fhBinLimCovariance33(c.fhBinLimCovariance33),
181 fhBinLimCovariance44(c.fhBinLimCovariance44),
182 fhBinLimCovariance55(c.fhBinLimCovariance55)
187 ((AliCFTrackQualityCuts &) c).Copy(*this);
189 //__________________________________________________________________________________
190 AliCFTrackQualityCuts& AliCFTrackQualityCuts::operator=(const AliCFTrackQualityCuts& c)
193 // Assignment operator
196 AliCFCutBase::operator=(c) ;
197 fMinNClusterTPC = c.fMinNClusterTPC ;
198 fMinNClusterITS = c.fMinNClusterITS ;
199 fMaxChi2PerClusterTPC = c.fMaxChi2PerClusterTPC ;
200 fMaxChi2PerClusterITS = c.fMaxChi2PerClusterITS ;
201 fRequireTPCRefit = c.fRequireTPCRefit ;
202 fRequireITSRefit = c.fRequireITSRefit ;
203 fCovariance11Max = c.fCovariance11Max ;
204 fCovariance22Max = c.fCovariance22Max ;
205 fCovariance33Max = c.fCovariance33Max ;
206 fCovariance44Max = c.fCovariance44Max ;
207 fCovariance55Max = c.fCovariance55Max ;
208 fhCutStatistics = c.fhCutStatistics ;
209 fhCutCorrelation = c.fhCutCorrelation ;
210 fBitmap = c.fBitmap ;
211 fhNBinsClusterTPC = c.fhNBinsClusterTPC ;
212 fhNBinsClusterITS = c.fhNBinsClusterITS ;
213 fhNBinsChi2TPC = c.fhNBinsChi2TPC ;
214 fhNBinsChi2ITS = c.fhNBinsChi2ITS ;
215 fhNBinsRefitTPC = c.fhNBinsRefitTPC ;
216 fhNBinsRefitITS = c.fhNBinsRefitITS ;
217 fhNBinsCovariance11 = c.fhNBinsCovariance11 ;
218 fhNBinsCovariance22 = c.fhNBinsCovariance22 ;
219 fhNBinsCovariance33 = c.fhNBinsCovariance33 ;
220 fhNBinsCovariance44 = c.fhNBinsCovariance44 ;
221 fhNBinsCovariance55 = c.fhNBinsCovariance55 ;
222 fhBinLimClusterTPC = c.fhBinLimClusterTPC ;
223 fhBinLimClusterITS = c.fhBinLimClusterITS ;
224 fhBinLimChi2TPC = c.fhBinLimChi2TPC ;
225 fhBinLimChi2ITS = c.fhBinLimChi2ITS ;
226 fhBinLimRefitTPC = c.fhBinLimRefitTPC ;
227 fhBinLimRefitITS = c.fhBinLimRefitITS ;
228 fhBinLimCovariance11 = c.fhBinLimCovariance11 ;
229 fhBinLimCovariance22 = c.fhBinLimCovariance22 ;
230 fhBinLimCovariance33 = c.fhBinLimCovariance33 ;
231 fhBinLimCovariance44 = c.fhBinLimCovariance44 ;
232 fhBinLimCovariance55 = c.fhBinLimCovariance55 ;
234 for (Int_t i=0; i<c.kNHist; i++){
235 for (Int_t j=0; j<c.kNStepQA; j++){
236 if(c.fhQA[i][j]) fhQA[i][j] = (TH1F*)c.fhQA[i][j]->Clone();
239 ((AliCFTrackQualityCuts &) c).Copy(*this);
243 //__________________________________________________________________________________
244 AliCFTrackQualityCuts::~AliCFTrackQualityCuts()
249 if (fhCutStatistics) delete fhCutStatistics;
250 if (fhCutCorrelation) delete fhCutCorrelation;
252 for (Int_t i=0; i<kNHist; i++){
253 for (Int_t j=0; j<kNStepQA; j++){
254 if(fhQA[i][j]) delete fhQA[i][j];
257 if(fBitmap) delete fBitmap;
258 if(fhBinLimClusterTPC) delete fhBinLimClusterTPC;
259 if(fhBinLimClusterITS) delete fhBinLimClusterITS;
260 if(fhBinLimChi2TPC) delete fhBinLimChi2TPC;
261 if(fhBinLimChi2ITS) delete fhBinLimChi2ITS;
262 if(fhBinLimRefitTPC) delete fhBinLimRefitTPC;
263 if(fhBinLimRefitITS) delete fhBinLimRefitITS;
264 if(fhBinLimCovariance11) delete fhBinLimCovariance11;
265 if(fhBinLimCovariance22) delete fhBinLimCovariance22;
266 if(fhBinLimCovariance33) delete fhBinLimCovariance33;
267 if(fhBinLimCovariance44) delete fhBinLimCovariance44;
268 if(fhBinLimCovariance55) delete fhBinLimCovariance55;
270 //__________________________________________________________________________________
271 void AliCFTrackQualityCuts::Initialise()
274 // sets everything to zero
278 fMaxChi2PerClusterTPC = 0;
279 fMaxChi2PerClusterITS = 0;
280 fRequireTPCRefit = 0;
281 fRequireITSRefit = 0;
282 fCovariance11Max = 0;
283 fCovariance22Max = 0;
284 fCovariance33Max = 0;
285 fCovariance44Max = 0;
286 fCovariance55Max = 0;
290 SetMaxChi2PerClusterTPC();
291 SetMaxChi2PerClusterITS();
292 SetRequireTPCRefit();
293 SetRequireITSRefit();
294 SetMaxCovDiagonalElements();
296 for (Int_t i=0; i<kNHist; i++){
297 for (Int_t j=0; j<kNStepQA; j++)
301 fhCutCorrelation = 0;
302 fBitmap=new TBits(0);
304 //set default bining for QA histograms
305 SetHistogramBins(kCutClusterTPC,165,-0.5,164.5);
306 SetHistogramBins(kCutClusterITS,8,-0.5,7.5);
307 SetHistogramBins(kCutChi2TPC,500,0.,10.);
308 SetHistogramBins(kCutChi2ITS,500,0.,10.);
309 SetHistogramBins(kCutRefitTPC,5,-0.75,1.75);
310 SetHistogramBins(kCutRefitITS,5,-0.75,1.75);
311 SetHistogramBins(kCutCovElement11,200,0.,20.);
312 SetHistogramBins(kCutCovElement22,200,0.,20.);
313 SetHistogramBins(kCutCovElement33,100,0.,1.);
314 SetHistogramBins(kCutCovElement44,100,0.,5.);
315 SetHistogramBins(kCutCovElement55,100,0.,5.);
317 //__________________________________________________________________________________
318 void AliCFTrackQualityCuts::Copy(TObject &c) const
323 AliCFTrackQualityCuts& target = (AliCFTrackQualityCuts &) c;
327 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
328 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
330 for (Int_t i=0; i<kNHist; i++){
331 for (Int_t j=0; j<kNStepQA; j++){
332 if(fhQA[i][j]) target.fhQA[i][j] = (TH1F*)fhQA[i][j]->Clone();
337 //__________________________________________________________________________________
338 void AliCFTrackQualityCuts::SelectionBitMap(TObject* obj)
341 // test if the track passes the single cuts
342 // and store the information in a bitmap
345 // bitmap stores the decision of each single cut
346 for(Int_t i=0; i<kNCuts; i++)fBitmap->SetBitNumber(i,kFALSE);
348 // check TObject and cast into ESDtrack
350 if (!obj->InheritsFrom("AliESDtrack")) AliError("object must derived from AliESDtrack !");
351 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack *>(obj);
352 if ( !esdTrack ) return ;
354 // get cut quantities
356 Int_t nClustersTPC = esdTrack->GetTPCclusters(fIdxInt);
357 Int_t nClustersITS = esdTrack->GetITSclusters(fIdxInt);
359 Float_t chi2PerClusterTPC = -1;
360 Float_t chi2PerClusterITS = -1;
362 if (nClustersTPC != 0)
363 chi2PerClusterTPC = esdTrack->GetTPCchi2() / Float_t(nClustersTPC);
365 chi2PerClusterITS = esdTrack->GetITSchi2() / Float_t(nClustersITS);
368 esdTrack->GetExternalCovariance(extCov);
373 if (nClustersTPC >= fMinNClusterTPC)
374 fBitmap->SetBitNumber(iCutBit,kTRUE);
376 if (nClustersITS >= fMinNClusterITS)
377 fBitmap->SetBitNumber(iCutBit,kTRUE);
379 if (chi2PerClusterTPC <= fMaxChi2PerClusterTPC)
380 fBitmap->SetBitNumber(iCutBit,kTRUE);
382 if (chi2PerClusterITS <= fMaxChi2PerClusterITS)
383 fBitmap->SetBitNumber(iCutBit,kTRUE);
385 if (!fRequireTPCRefit || (fRequireTPCRefit && (esdTrack->GetStatus()&AliESDtrack::kTPCrefit)!=0))
386 fBitmap->SetBitNumber(iCutBit,kTRUE);
388 if (!fRequireITSRefit || (fRequireITSRefit && (esdTrack->GetStatus()&AliESDtrack::kITSrefit)!=0))
389 fBitmap->SetBitNumber(iCutBit,kTRUE);
391 if (extCov[0] <= fCovariance11Max)
392 fBitmap->SetBitNumber(iCutBit,kTRUE);
394 if (extCov[2] <= fCovariance22Max)
395 fBitmap->SetBitNumber(iCutBit,kTRUE);
397 if (extCov[5] <= fCovariance33Max)
398 fBitmap->SetBitNumber(iCutBit,kTRUE);
400 if (extCov[9] <= fCovariance44Max)
401 fBitmap->SetBitNumber(iCutBit,kTRUE);
403 if (extCov[14] <= fCovariance55Max)
404 fBitmap->SetBitNumber(iCutBit,kTRUE);
408 //__________________________________________________________________________________
409 Bool_t AliCFTrackQualityCuts::IsSelected(TObject* obj) {
411 // loops over decisions of single cuts and returns if the track is accepted
413 SelectionBitMap(obj);
415 if (fIsQAOn) FillHistograms(obj,0);
416 Bool_t isSelected = kTRUE;
418 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
419 if(!fBitmap->TestBitNumber(icut)) {
424 if (!isSelected) return kFALSE ;
425 if (fIsQAOn) FillHistograms(obj,1);
428 //__________________________________________________________________________________
429 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
438 fhNBinsClusterTPC=nbins+1;
439 fhBinLimClusterTPC=new Double_t[nbins+1];
440 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=bins[i];
444 fhNBinsClusterITS=nbins+1;
445 fhBinLimClusterITS=new Double_t[nbins+1];
446 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=bins[i];
450 fhNBinsChi2TPC=nbins+1;
451 fhBinLimChi2TPC=new Double_t[nbins+1];
452 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=bins[i];
456 fhNBinsChi2ITS=nbins+1;
457 fhBinLimChi2ITS=new Double_t[nbins+1];
458 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=bins[i];
462 fhNBinsRefitTPC=nbins+1;
463 fhBinLimRefitTPC=new Double_t[nbins+1];
464 for(Int_t i=0;i<nbins+1;i++)fhBinLimRefitTPC[i]=bins[i];
468 fhNBinsRefitITS=nbins+1;
469 fhBinLimRefitITS=new Double_t[nbins+1];
470 for(Int_t i=0;i<nbins+1;i++)fhBinLimRefitITS[i]=bins[i];
473 case kCutCovElement11:
474 fhNBinsCovariance11=nbins+1;
475 fhBinLimCovariance11=new Double_t[nbins+1];
476 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=bins[i];
479 case kCutCovElement22:
480 fhNBinsCovariance22=nbins+1;
481 fhBinLimCovariance22=new Double_t[nbins+1];
482 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=bins[i];
485 case kCutCovElement33:
486 fhNBinsCovariance33=nbins+1;
487 fhBinLimCovariance33=new Double_t[nbins+1];
488 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=bins[i];
491 case kCutCovElement44:
492 fhNBinsCovariance44=nbins+1;
493 fhBinLimCovariance44=new Double_t[nbins+1];
494 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=bins[i];
497 case kCutCovElement55:
498 fhNBinsCovariance55=nbins+1;
499 fhBinLimCovariance55=new Double_t[nbins+1];
500 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=bins[i];
504 //__________________________________________________________________________________
505 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
512 fhNBinsClusterTPC=nbins+1;
513 fhBinLimClusterTPC=new Double_t[nbins+1];
514 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
518 fhNBinsClusterITS=nbins+1;
519 fhBinLimClusterITS=new Double_t[nbins+1];
520 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
524 fhNBinsChi2TPC=nbins+1;
525 fhBinLimChi2TPC=new Double_t[nbins+1];
526 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
530 fhNBinsChi2ITS=nbins+1;
531 fhBinLimChi2ITS=new Double_t[nbins+1];
532 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
536 fhNBinsRefitTPC=nbins+1;
537 fhBinLimRefitTPC=new Double_t[nbins+1];
538 for(Int_t i=0;i<nbins+1;i++)fhBinLimRefitTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
542 fhNBinsRefitITS=nbins+1;
543 fhBinLimRefitITS=new Double_t[nbins+1];
544 for(Int_t i=0;i<nbins+1;i++)fhBinLimRefitITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
547 case kCutCovElement11:
548 fhNBinsCovariance11=nbins+1;
549 fhBinLimCovariance11=new Double_t[nbins+1];
550 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
553 case kCutCovElement22:
554 fhNBinsCovariance22=nbins+1;
555 fhBinLimCovariance22=new Double_t[nbins+1];
556 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
559 case kCutCovElement33:
560 fhNBinsCovariance33=nbins+1;
561 fhBinLimCovariance33=new Double_t[nbins+1];
562 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
565 case kCutCovElement44:
566 fhNBinsCovariance44=nbins+1;
567 fhBinLimCovariance44=new Double_t[nbins+1];
568 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
571 case kCutCovElement55:
572 fhNBinsCovariance55=nbins+1;
573 fhBinLimCovariance55=new Double_t[nbins+1];
574 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
578 //__________________________________________________________________________________
579 void AliCFTrackQualityCuts::DefineHistograms() {
581 // histograms for cut variables, cut statistics and cut correlations
585 // book cut statistics and cut correlation histograms
586 fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()), Form("%s cut statistics",GetName()), kNCuts,0.5,kNCuts+0.5);
587 fhCutStatistics->SetLineWidth(2);
588 fhCutStatistics->GetXaxis()->SetBinLabel(1,"nClustersTPC");
589 fhCutStatistics->GetXaxis()->SetBinLabel(2,"nClustersITS");
590 fhCutStatistics->GetXaxis()->SetBinLabel(3,"chi2PerClusterTPC");
591 fhCutStatistics->GetXaxis()->SetBinLabel(4,"chi2PerClusterITS");
592 fhCutStatistics->GetXaxis()->SetBinLabel(5,"refitTPC");
593 fhCutStatistics->GetXaxis()->SetBinLabel(6,"refitITS");
594 fhCutStatistics->GetXaxis()->SetBinLabel(7,"covElement11");
595 fhCutStatistics->GetXaxis()->SetBinLabel(8,"covElement22");
596 fhCutStatistics->GetXaxis()->SetBinLabel(9,"covElement33");
597 fhCutStatistics->GetXaxis()->SetBinLabel(10,"covElement44");
598 fhCutStatistics->GetXaxis()->SetBinLabel(11,"covElement55");
600 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);
601 fhCutCorrelation->SetLineWidth(2);
602 fhCutCorrelation->GetXaxis()->SetBinLabel(1,"nClustersTPC");
603 fhCutCorrelation->GetXaxis()->SetBinLabel(2,"nClustersITS");
604 fhCutCorrelation->GetXaxis()->SetBinLabel(3,"chi2PerClusterTPC");
605 fhCutCorrelation->GetXaxis()->SetBinLabel(4,"chi2PerClusterITS");
606 fhCutCorrelation->GetXaxis()->SetBinLabel(5,"refitTPC");
607 fhCutCorrelation->GetXaxis()->SetBinLabel(6,"refitITS");
608 fhCutCorrelation->GetXaxis()->SetBinLabel(7,"covElement11");
609 fhCutCorrelation->GetXaxis()->SetBinLabel(8,"covElement22");
610 fhCutCorrelation->GetXaxis()->SetBinLabel(9,"covElement33");
611 fhCutCorrelation->GetXaxis()->SetBinLabel(10,"covElement44");
612 fhCutCorrelation->GetXaxis()->SetBinLabel(11,"covElement55");
614 fhCutCorrelation->GetYaxis()->SetBinLabel(1,"nClustersTPC");
615 fhCutCorrelation->GetYaxis()->SetBinLabel(2,"nClustersITS");
616 fhCutCorrelation->GetYaxis()->SetBinLabel(3,"chi2PerClusterTPC");
617 fhCutCorrelation->GetYaxis()->SetBinLabel(4,"chi2PerClusterITS");
618 fhCutCorrelation->GetYaxis()->SetBinLabel(5,"refitTPC");
619 fhCutCorrelation->GetYaxis()->SetBinLabel(6,"refitITS");
620 fhCutCorrelation->GetYaxis()->SetBinLabel(7,"covElement11");
621 fhCutCorrelation->GetYaxis()->SetBinLabel(8,"covElement22");
622 fhCutCorrelation->GetYaxis()->SetBinLabel(9,"covElement33");
623 fhCutCorrelation->GetYaxis()->SetBinLabel(10,"covElement44");
624 fhCutCorrelation->GetYaxis()->SetBinLabel(11,"covElement55");
627 // book QA histograms
629 for (Int_t i=0; i<kNStepQA; i++) {
630 if (i==0) sprintf(str," ");
631 else sprintf(str,"_cut");
633 fhQA[kCutClusterTPC][i] = new TH1F(Form("%s_nClustersTPC%s",GetName(),str) ,"",fhNBinsClusterTPC-1,fhBinLimClusterTPC);
634 fhQA[kCutClusterITS][i] = new TH1F(Form("%s_nClustersITS%s",GetName(),str) ,"",fhNBinsClusterITS-1,fhBinLimClusterITS);
635 fhQA[kCutChi2TPC][i] = new TH1F(Form("%s_chi2PerClusterTPC%s",GetName(),str),"",fhNBinsChi2TPC-1,fhBinLimChi2TPC);
636 fhQA[kCutChi2ITS][i] = new TH1F(Form("%s_chi2PerClusterITS%s",GetName(),str),"",fhNBinsChi2ITS-1,fhBinLimChi2ITS);
637 fhQA[kCutRefitTPC][i] = new TH1F(Form("%s_refitTPC%s",GetName(),str) ,"",fhNBinsRefitTPC-1,fhBinLimRefitTPC);
638 fhQA[kCutRefitITS][i] = new TH1F(Form("%s_refitITS%s",GetName(),str) ,"",fhNBinsRefitITS-1,fhBinLimRefitITS);
639 fhQA[kCutCovElement11][i] = new TH1F(Form("%s_covMatrixDiagonal11%s",GetName(),str),"",fhNBinsCovariance11-1,fhBinLimCovariance11);
640 fhQA[kCutCovElement22][i] = new TH1F(Form("%s_covMatrixDiagonal22%s",GetName(),str),"",fhNBinsCovariance22-1,fhBinLimCovariance22);
641 fhQA[kCutCovElement33][i] = new TH1F(Form("%s_covMatrixDiagonal33%s",GetName(),str),"",fhNBinsCovariance33-1,fhBinLimCovariance33);
642 fhQA[kCutCovElement44][i] = new TH1F(Form("%s_covMatrixDiagonal44%s",GetName(),str),"",fhNBinsCovariance44-1,fhBinLimCovariance44);
643 fhQA[kCutCovElement55][i] = new TH1F(Form("%s_covMatrixDiagonal55%s",GetName(),str),"",fhNBinsCovariance55-1,fhBinLimCovariance55);
645 fhQA[kCutClusterTPC][i] ->SetXTitle("n TPC clusters");
646 fhQA[kCutClusterITS][i] ->SetXTitle("n ITS clusters");
647 fhQA[kCutChi2TPC][i] ->SetXTitle("#chi^{2} per TPC cluster");
648 fhQA[kCutChi2ITS][i] ->SetXTitle("#chi^{2} per ITS cluster");
649 fhQA[kCutRefitTPC][i] ->SetXTitle("refit TPC");
650 fhQA[kCutRefitITS][i] ->SetXTitle("refit ITS");
651 fhQA[kCutCovElement11][i] ->SetXTitle("cov 11 : #sigma_{y}^{2} (cm^{2})");
652 fhQA[kCutCovElement22][i] ->SetXTitle("cov 22 : #sigma_{z}^{2} (cm^{2})");
653 fhQA[kCutCovElement33][i] ->SetXTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
654 fhQA[kCutCovElement44][i] ->SetXTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
655 fhQA[kCutCovElement55][i] ->SetXTitle("cov 55 : #sigma_{1/p_{T}}^{2} ((c/GeV)^{2})");
658 for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
660 //__________________________________________________________________________________
661 void AliCFTrackQualityCuts::FillHistograms(TObject* obj, Bool_t b)
664 // fill the QA histograms
667 // cast TObject into ESDtrack
669 AliESDtrack* esdTrack = dynamic_cast<AliESDtrack *>(obj);
670 if ( !esdTrack ) return;
672 // b = 0: fill histograms before cuts
673 // b = 1: fill histograms after cuts
676 Int_t nClustersTPC = esdTrack->GetTPCclusters(fIdxInt);
677 fhQA[kCutClusterTPC][b]->Fill((float)nClustersTPC);
678 Float_t chi2PerClusterTPC = -1.;
680 chi2PerClusterTPC = esdTrack->GetTPCchi2()/((float)nClustersTPC);
681 fhQA[kCutChi2TPC][b]->Fill(chi2PerClusterTPC);
683 Int_t nClustersITS = esdTrack->GetITSclusters(fIdxInt);
684 fhQA[kCutClusterITS][b]->Fill((float)nClustersITS);
685 Float_t chi2PerClusterITS = -1.;
687 chi2PerClusterITS = esdTrack->GetITSchi2()/((float)nClustersITS);
688 fhQA[kCutChi2ITS][b]->Fill(chi2PerClusterITS);
690 if ((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0)
691 fhQA[kCutRefitTPC][b]->Fill(0.);
692 if (!((esdTrack->GetStatus()&AliESDtrack::kTPCrefit)==0))
693 fhQA[kCutRefitTPC][b]->Fill(1.);
695 if ((esdTrack->GetStatus()&AliESDtrack::kITSrefit)==0)
696 fhQA[kCutRefitITS][b]->Fill(0.);
697 if (!((esdTrack->GetStatus()&AliESDtrack::kITSrefit)==0))
698 fhQA[kCutRefitITS][b]->Fill(1.);
701 esdTrack->GetExternalCovariance(extCov);
703 fhQA[kCutCovElement11][b]->Fill(extCov[0]);
704 fhQA[kCutCovElement22][b]->Fill(extCov[2]);
705 fhQA[kCutCovElement33][b]->Fill(extCov[5]);
706 fhQA[kCutCovElement44][b]->Fill(extCov[9]);
707 fhQA[kCutCovElement55][b]->Fill(extCov[14]);
709 // fill cut statistics and cut correlation histograms with information from the bitmap
712 // Get the bitmap of the single cuts
714 SelectionBitMap(obj);
716 // Number of single cuts in this class
717 UInt_t ncuts = fBitmap->GetNbits();
718 for(UInt_t bit=0; bit<ncuts;bit++) {
719 if (!fBitmap->TestBitNumber(bit)) {
720 fhCutStatistics->Fill(bit+1);
721 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
722 if (!fBitmap->TestBitNumber(bit2))
723 fhCutCorrelation->Fill(bit+1,bit2+1);
728 //__________________________________________________________________________________
729 void AliCFTrackQualityCuts::SaveHistograms(const Char_t* dir) {
731 // saves the histograms in a directory (dir)
738 gDirectory->mkdir(dir);
741 gDirectory->mkdir("before_cuts");
742 gDirectory->mkdir("after_cuts");
744 fhCutStatistics->Write();
745 fhCutCorrelation->Write();
747 for (Int_t j=0; j<kNStepQA; j++) {
749 gDirectory->cd("before_cuts");
751 gDirectory->cd("after_cuts");
753 for(Int_t i=0; i<kNHist; i++) fhQA[i][j]->Write();
755 gDirectory->cd("../");
757 gDirectory->cd("../");
759 //__________________________________________________________________________________
760 void AliCFTrackQualityCuts::DrawHistograms(Bool_t drawLogScale)
763 // draws some histograms
768 Float_t right = 0.03;
769 Float_t left = 0.175;
771 Float_t bottom = 0.175;
773 TCanvas* canvas1 = new TCanvas("Track_QA_Quality_1", "Track QA Quality 1", 800, 500);
774 canvas1->Divide(2, 1);
777 fhCutStatistics->SetStats(kFALSE);
778 fhCutStatistics->LabelsOption("v");
779 gPad->SetLeftMargin(left);
780 gPad->SetBottomMargin(0.25);
781 gPad->SetRightMargin(right);
782 gPad->SetTopMargin(0.1);
783 fhCutStatistics->Draw();
786 fhCutCorrelation->SetStats(kFALSE);
787 fhCutCorrelation->LabelsOption("v");
788 gPad->SetLeftMargin(0.30);
789 gPad->SetRightMargin(bottom);
790 gPad->SetTopMargin(0.1);
791 gPad->SetBottomMargin(0.25);
792 fhCutCorrelation->Draw("COLZ");
794 canvas1->SaveAs(Form("%s.eps", canvas1->GetName()));
795 canvas1->SaveAs(Form("%s.ps", canvas1->GetName()));
799 TCanvas* canvas2 = new TCanvas("Track_QA_Quality_2", "Track QA Quality 2", 1200, 800);
800 canvas2->Divide(3, 2);
803 gPad->SetRightMargin(right);
804 gPad->SetLeftMargin(left);
805 gPad->SetTopMargin(top);
806 gPad->SetBottomMargin(bottom);
807 fhQA[kCutClusterTPC][0]->SetStats(kFALSE);
808 fhQA[kCutClusterTPC][0]->Draw();
809 fhQA[kCutClusterTPC][1]->Draw("same");
812 gPad->SetRightMargin(right);
813 gPad->SetLeftMargin(left);
814 gPad->SetTopMargin(top);
815 gPad->SetBottomMargin(bottom);
816 fhQA[kCutChi2TPC][0]->SetStats(kFALSE);
817 fhQA[kCutChi2TPC][0]->Draw();
818 fhQA[kCutChi2TPC][1]->Draw("same");
821 gPad->SetRightMargin(right);
822 gPad->SetLeftMargin(left);
823 gPad->SetTopMargin(top);
824 gPad->SetBottomMargin(bottom);
825 fhQA[kCutRefitTPC][0]->SetStats(kFALSE);
826 fhQA[kCutRefitTPC][0]->Draw();
827 fhQA[kCutRefitTPC][1]->Draw("same");
830 gPad->SetRightMargin(right);
831 gPad->SetLeftMargin(left);
832 gPad->SetTopMargin(top);
833 gPad->SetBottomMargin(bottom);
834 fhQA[kCutClusterITS][0]->SetStats(kFALSE);
835 fhQA[kCutClusterITS][0]->Draw();
836 fhQA[kCutClusterITS][1]->Draw("same");
839 gPad->SetRightMargin(right);
840 gPad->SetLeftMargin(left);
841 gPad->SetTopMargin(top);
842 gPad->SetBottomMargin(bottom);
843 fhQA[kCutChi2ITS][0]->SetStats(kFALSE);
844 fhQA[kCutChi2ITS][0]->Draw();
845 fhQA[kCutChi2ITS][1]->Draw("same");
848 gPad->SetRightMargin(right);
849 gPad->SetLeftMargin(left);
850 gPad->SetTopMargin(top);
851 gPad->SetBottomMargin(bottom);
852 fhQA[kCutRefitITS][0]->SetStats(kFALSE);
853 fhQA[kCutRefitITS][0]->Draw();
854 fhQA[kCutRefitITS][1]->Draw("same");
856 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
857 canvas2->SaveAs(Form("%s.ps", canvas2->GetName()));
861 TCanvas* canvas3 = new TCanvas("Track_QA_Quality_3", "Track QA Quality 3", 1200, 800);
862 canvas3->Divide(3, 2);
865 if(drawLogScale) gPad->SetLogy();
866 gPad->SetRightMargin(right);
867 gPad->SetLeftMargin(left);
868 gPad->SetTopMargin(top);
869 gPad->SetBottomMargin(bottom);
870 fhQA[kCutCovElement11][0]->SetStats(kFALSE);
871 fhQA[kCutCovElement11][0]->Draw();
872 fhQA[kCutCovElement11][1]->Draw("same");
875 if(drawLogScale) gPad->SetLogy();
876 gPad->SetRightMargin(right);
877 gPad->SetLeftMargin(left);
878 gPad->SetTopMargin(top);
879 gPad->SetBottomMargin(bottom);
880 fhQA[kCutCovElement22][0]->SetStats(kFALSE);
881 fhQA[kCutCovElement22][0]->Draw();
882 fhQA[kCutCovElement22][1]->Draw("same");
885 if(drawLogScale) gPad->SetLogy();
886 gPad->SetRightMargin(right);
887 gPad->SetLeftMargin(left);
888 gPad->SetTopMargin(top);
889 gPad->SetBottomMargin(bottom);
890 fhQA[kCutCovElement33][0]->SetStats(kFALSE);
891 fhQA[kCutCovElement33][0]->Draw();
892 fhQA[kCutCovElement33][1]->Draw("same");
895 if(drawLogScale) gPad->SetLogy();
896 gPad->SetRightMargin(right);
897 gPad->SetLeftMargin(left);
898 gPad->SetTopMargin(top);
899 gPad->SetBottomMargin(bottom);
900 fhQA[kCutCovElement44][0]->SetStats(kFALSE);
901 fhQA[kCutCovElement44][0]->Draw();
902 fhQA[kCutCovElement44][1]->Draw("same");
905 if(drawLogScale) gPad->SetLogy();
906 gPad->SetRightMargin(right);
907 gPad->SetLeftMargin(left);
908 gPad->SetTopMargin(top);
909 gPad->SetBottomMargin(bottom);
910 fhQA[kCutCovElement55][0]->SetStats(kFALSE);
911 fhQA[kCutCovElement55][0]->Draw();
912 fhQA[kCutCovElement55][1]->Draw("same");
914 canvas3->SaveAs(Form("%s.eps", canvas3->GetName()));
915 canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
917 //__________________________________________________________________________________
918 void AliCFTrackQualityCuts::AddQAHistograms(TList *qaList) {
920 // saves the histograms in a TList
924 qaList->Add(fhCutStatistics);
925 qaList->Add(fhCutCorrelation);
927 for (Int_t j=0; j<kNStepQA; j++) {
928 for(Int_t i=0; i<kNHist; i++)
929 qaList->Add(fhQA[i][j]);