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 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
439 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
441 AliESDtrack * esdTrack = 0x0 ;
442 AliAODTrack * aodTrack = 0x0 ;
443 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
444 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
446 fTrackCuts->SetMinNClustersTPC(fMinNClusterTPC);
447 fTrackCuts->SetMinNClustersITS(fMinNClusterITS);
448 fTrackCuts->SetMaxChi2PerClusterTPC(fMaxChi2PerClusterTPC);
449 fTrackCuts->SetMaxChi2PerClusterITS(fMaxChi2PerClusterITS);
450 fTrackCuts->SetMaxCovDiagonalElements(fCovariance11Max,fCovariance22Max,fCovariance33Max,fCovariance44Max,fCovariance55Max);
452 // // // remove following 5 lines when AliESDtrackCuts is updated
453 Int_t nClustersTPC = 0;
454 Int_t nClustersITS = 0 ;
455 Float_t chi2PerClusterTPC = 0 ;
456 Float_t chi2PerClusterITS = 0 ;
457 Double_t extCov[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
459 // get cut quantities
460 Int_t nClustersTRD = 0;
461 Int_t nTrackletsTRD = 0;
462 Float_t chi2PerTrackletTRD = 0;
463 Float_t fractionFoundClustersTPC = 0;
466 nClustersTRD = esdTrack->GetTRDncls();
467 nTrackletsTRD = esdTrack->GetTRDntracklets();
468 if (nTrackletsTRD != 0) chi2PerTrackletTRD = esdTrack->GetTRDchi2() / Float_t(nTrackletsTRD);
469 // // // include following line when AliESDtrackCuts is updated
470 // if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = fTrackCuts->GetCutVariable(2) / float(esdTrack->GetTPCNclsF());
472 // // // remove following 6 lines when AliESDtrackCuts is updated
473 nClustersTPC = esdTrack->GetTPCclusters(0x0);
474 nClustersITS = esdTrack->GetITSclusters(0x0);
475 if (nClustersTPC != 0) chi2PerClusterTPC = esdTrack->GetTPCchi2() / Float_t(nClustersTPC);
476 if (nClustersITS != 0) chi2PerClusterITS = esdTrack->GetITSchi2() / Float_t(nClustersITS);
477 esdTrack->GetExternalCovariance(extCov);
478 if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = float(nClustersTPC) / float(esdTrack->GetTPCNclsF());
484 // // // include following lines when AliESDtrackCuts is updated
485 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(2)); iCutBit++; // nClustersTPC
486 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(3)); iCutBit++; // nClustersITS
487 // // // remove following 6 lines when AliESDtrackCuts is updated
488 if (nClustersTPC >= fMinNClusterTPC)
489 fBitmap->SetBitNumber(iCutBit,kTRUE);
491 if (nClustersITS >= fMinNClusterITS)
492 fBitmap->SetBitNumber(iCutBit,kTRUE);
495 if (nClustersTRD >= fMinNClusterTRD)
496 fBitmap->SetBitNumber(iCutBit,kTRUE);
498 // // // if ((fMinFoundClusterTPC <= 0) || (fTrackCuts->GetCutVariable(2) > 0 && (fractionFoundClustersTPC >= fMinFoundClusterTPC)))
499 if ((fMinFoundClusterTPC <= 0) || (nClustersTPC > 0 && (fractionFoundClustersTPC >= fMinFoundClusterTPC)))
500 fBitmap->SetBitNumber(iCutBit,kTRUE);
502 if (nTrackletsTRD >= fMinNTrackletTRD)
503 fBitmap->SetBitNumber(iCutBit,kTRUE);
505 if (esdTrack->GetTRDntrackletsPID() >= fMinNTrackletTRDpid)
506 fBitmap->SetBitNumber(iCutBit,kTRUE);
509 // // // include following lines when AliESDtrackCuts is updated
510 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(4)); iCutBit++; // chi2PerClusterTPC
511 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(5)); iCutBit++; // chi2PerClusterITS
512 // // // remove following 6 lines when AliESDtrackCuts is updated
513 if (chi2PerClusterTPC <= fMaxChi2PerClusterTPC)
514 fBitmap->SetBitNumber(iCutBit,kTRUE);
516 if (chi2PerClusterITS <= fMaxChi2PerClusterITS)
517 fBitmap->SetBitNumber(iCutBit,kTRUE);
520 if (chi2PerTrackletTRD <= fMaxChi2PerTrackletTRD)
521 fBitmap->SetBitNumber(iCutBit,kTRUE);
523 if (esdTrack->GetTPCsignalN() >= fMinNdEdxClusterTPC)
524 fBitmap->SetBitNumber(iCutBit,kTRUE);
527 // // // include following lines when AliESDtrackCuts is updated
528 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(6)); iCutBit++; // extCov[0]
529 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(7)); iCutBit++; // extCov[2]
530 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(8)); iCutBit++; // extCov[5]
531 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(9)); iCutBit++; // extCov[9]
532 // fBitmap->SetBitNumber(iCutBit,fTrackCuts->GetCutDecision(10)); iCutBit++; // extCov[14]
533 // // // remove following lines when AliESDtrackCuts is updated
534 if (extCov[0] <= fCovariance11Max)
535 fBitmap->SetBitNumber(iCutBit,kTRUE);
537 if (extCov[2] <= fCovariance22Max)
538 fBitmap->SetBitNumber(iCutBit,kTRUE);
540 if (extCov[5] <= fCovariance33Max)
541 fBitmap->SetBitNumber(iCutBit,kTRUE);
543 if (extCov[9] <= fCovariance44Max)
544 fBitmap->SetBitNumber(iCutBit,kTRUE);
546 if (extCov[14] <= fCovariance55Max)
547 fBitmap->SetBitNumber(iCutBit,kTRUE);
552 if ( (esdTrack->GetStatus() & fStatus) == fStatus ) fBitmap->SetBitNumber(iCutBit,kTRUE);
555 if ( (aodTrack->GetStatus() & fStatus) == fStatus ) fBitmap->SetBitNumber(iCutBit,kTRUE);
560 //__________________________________________________________________________________
561 Bool_t AliCFTrackQualityCuts::IsSelected(TObject* obj) {
563 // loops over decisions of single cuts and returns if the track is accepted
565 SelectionBitMap(obj);
567 if (fIsQAOn) FillHistograms(obj,0);
568 Bool_t isSelected = kTRUE;
570 for (UInt_t icut=0; icut<fBitmap->GetNbits();icut++) {
571 if(!fBitmap->TestBitNumber(icut)) {
576 if (!isSelected) return kFALSE ;
577 if (fIsQAOn) FillHistograms(obj,1);
580 //__________________________________________________________________________________
581 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t *bins)
588 if (index<0 || index>=kNHist) {
589 Error("SetHistogramBins","could not determine histogram from index %d",index);
595 fhNBinsClusterTPC=nbins+1;
596 fhBinLimClusterTPC=new Double_t[nbins+1];
597 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=bins[i];
601 fhNBinsClusterITS=nbins+1;
602 fhBinLimClusterITS=new Double_t[nbins+1];
603 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=bins[i];
607 fhNBinsClusterTRD=nbins+1;
608 fhBinLimClusterTRD=new Double_t[nbins+1];
609 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTRD[i]=bins[i];
612 case kCutMinFoundClusterTPC:
613 fhNBinsFoundClusterTPC=nbins+1;
614 fhBinLimFoundClusterTPC=new Double_t[nbins+1];
615 for(Int_t i=0;i<nbins+1;i++)fhBinLimFoundClusterTPC[i]=bins[i];
618 case kCutTrackletTRD:
619 fhNBinsTrackletTRD=nbins+1;
620 fhBinLimTrackletTRD=new Double_t[nbins+1];
621 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRD[i]=bins[i];
624 case kCutTrackletTRDpid:
625 fhNBinsTrackletTRDpid=nbins+1;
626 fhBinLimTrackletTRDpid=new Double_t[nbins+1];
627 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRDpid[i]=bins[i];
631 fhNBinsChi2TPC=nbins+1;
632 fhBinLimChi2TPC=new Double_t[nbins+1];
633 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=bins[i];
637 fhNBinsChi2ITS=nbins+1;
638 fhBinLimChi2ITS=new Double_t[nbins+1];
639 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=bins[i];
643 fhNBinsChi2TRD=nbins+1;
644 fhBinLimChi2TRD=new Double_t[nbins+1];
645 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TRD[i]=bins[i];
648 case kCutdEdxClusterTPC:
649 fhNBinsdEdxClusterTPC=nbins+1;
650 fhBinLimdEdxClusterTPC=new Double_t[nbins+1];
651 for(Int_t i=0;i<nbins+1;i++)fhBinLimdEdxClusterTPC[i]=bins[i];
654 case kCutCovElement11:
655 fhNBinsCovariance11=nbins+1;
656 fhBinLimCovariance11=new Double_t[nbins+1];
657 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=bins[i];
660 case kCutCovElement22:
661 fhNBinsCovariance22=nbins+1;
662 fhBinLimCovariance22=new Double_t[nbins+1];
663 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=bins[i];
666 case kCutCovElement33:
667 fhNBinsCovariance33=nbins+1;
668 fhBinLimCovariance33=new Double_t[nbins+1];
669 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=bins[i];
672 case kCutCovElement44:
673 fhNBinsCovariance44=nbins+1;
674 fhBinLimCovariance44=new Double_t[nbins+1];
675 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=bins[i];
678 case kCutCovElement55:
679 fhNBinsCovariance55=nbins+1;
680 fhBinLimCovariance55=new Double_t[nbins+1];
681 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=bins[i];
685 //__________________________________________________________________________________
686 void AliCFTrackQualityCuts::SetHistogramBins(Int_t index, Int_t nbins, Double_t xmin, Double_t xmax)
691 if (index<0 || index>=kNHist) {
692 Error("SetHistogramBins","could not determine histogram from index %d",index);
698 fhNBinsClusterTPC=nbins+1;
699 fhBinLimClusterTPC=new Double_t[nbins+1];
700 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
704 fhNBinsClusterITS=nbins+1;
705 fhBinLimClusterITS=new Double_t[nbins+1];
706 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
710 fhNBinsClusterTRD=nbins+1;
711 fhBinLimClusterTRD=new Double_t[nbins+1];
712 for(Int_t i=0;i<nbins+1;i++)fhBinLimClusterTRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
715 case kCutMinFoundClusterTPC:
716 fhNBinsFoundClusterTPC=nbins+1;
717 fhBinLimFoundClusterTPC=new Double_t[nbins+1];
718 for(Int_t i=0;i<nbins+1;i++)fhBinLimFoundClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
721 case kCutTrackletTRD:
722 fhNBinsTrackletTRD=nbins+1;
723 fhBinLimTrackletTRD=new Double_t[nbins+1];
724 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
727 case kCutTrackletTRDpid:
728 fhNBinsTrackletTRDpid=nbins+1;
729 fhBinLimTrackletTRDpid=new Double_t[nbins+1];
730 for(Int_t i=0;i<nbins+1;i++)fhBinLimTrackletTRDpid[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
734 fhNBinsChi2TPC=nbins+1;
735 fhBinLimChi2TPC=new Double_t[nbins+1];
736 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
740 fhNBinsChi2ITS=nbins+1;
741 fhBinLimChi2ITS=new Double_t[nbins+1];
742 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2ITS[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
746 fhNBinsChi2TRD=nbins+1;
747 fhBinLimChi2TRD=new Double_t[nbins+1];
748 for(Int_t i=0;i<nbins+1;i++)fhBinLimChi2TRD[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
751 case kCutdEdxClusterTPC:
752 fhNBinsdEdxClusterTPC=nbins+1;
753 fhBinLimdEdxClusterTPC=new Double_t[nbins+1];
754 for(Int_t i=0;i<nbins+1;i++)fhBinLimdEdxClusterTPC[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
757 case kCutCovElement11:
758 fhNBinsCovariance11=nbins+1;
759 fhBinLimCovariance11=new Double_t[nbins+1];
760 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance11[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
763 case kCutCovElement22:
764 fhNBinsCovariance22=nbins+1;
765 fhBinLimCovariance22=new Double_t[nbins+1];
766 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance22[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
769 case kCutCovElement33:
770 fhNBinsCovariance33=nbins+1;
771 fhBinLimCovariance33=new Double_t[nbins+1];
772 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance33[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
775 case kCutCovElement44:
776 fhNBinsCovariance44=nbins+1;
777 fhBinLimCovariance44=new Double_t[nbins+1];
778 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance44[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
781 case kCutCovElement55:
782 fhNBinsCovariance55=nbins+1;
783 fhBinLimCovariance55=new Double_t[nbins+1];
784 for(Int_t i=0;i<nbins+1;i++)fhBinLimCovariance55[i]=xmin+i*(xmax-xmin)/Double_t(nbins);
788 //__________________________________________________________________________________
789 void AliCFTrackQualityCuts::DefineHistograms() {
791 // histograms for cut variables, cut statistics and cut correlations
795 // book cut statistics and cut correlation histograms
796 fhCutStatistics = new TH1F(Form("%s_cut_statistics",GetName()), Form("%s cut statistics",GetName()), kNCuts,0.5,kNCuts+0.5);
797 fhCutStatistics->SetLineWidth(2);
798 fhCutStatistics->GetXaxis()->SetBinLabel(1, "nClustersTPC");
799 fhCutStatistics->GetXaxis()->SetBinLabel(2, "nClustersITS");
800 fhCutStatistics->GetXaxis()->SetBinLabel(3, "nClustersTRD");
801 fhCutStatistics->GetXaxis()->SetBinLabel(4, "fractionClustersTPC");
802 fhCutStatistics->GetXaxis()->SetBinLabel(5, "ntrackletsTRD");
803 fhCutStatistics->GetXaxis()->SetBinLabel(6, "ntrackletsTRDpid");
804 fhCutStatistics->GetXaxis()->SetBinLabel(7, "chi2PerClusterTPC");
805 fhCutStatistics->GetXaxis()->SetBinLabel(8, "chi2PerClusterITS");
806 fhCutStatistics->GetXaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
807 fhCutStatistics->GetXaxis()->SetBinLabel(10, "ndEdxClusterTPC");
808 fhCutStatistics->GetXaxis()->SetBinLabel(11, "covElement11");
809 fhCutStatistics->GetXaxis()->SetBinLabel(12, "covElement22");
810 fhCutStatistics->GetXaxis()->SetBinLabel(13, "covElement33");
811 fhCutStatistics->GetXaxis()->SetBinLabel(14, "covElement44");
812 fhCutStatistics->GetXaxis()->SetBinLabel(15, "covElement55");
813 fhCutStatistics->GetXaxis()->SetBinLabel(16, "status");
815 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);
816 fhCutCorrelation->SetLineWidth(2);
817 fhCutCorrelation->GetXaxis()->SetBinLabel(1, "nClustersTPC");
818 fhCutCorrelation->GetXaxis()->SetBinLabel(2, "nClustersITS");
819 fhCutCorrelation->GetXaxis()->SetBinLabel(3, "nClustersTRD");
820 fhCutCorrelation->GetXaxis()->SetBinLabel(4, "fractionClustersTPC");
821 fhCutCorrelation->GetXaxis()->SetBinLabel(5, "ntrackletsTRD");
822 fhCutCorrelation->GetXaxis()->SetBinLabel(6, "ntrackletsTRDpid");
823 fhCutCorrelation->GetXaxis()->SetBinLabel(7, "chi2PerClusterTPC");
824 fhCutCorrelation->GetXaxis()->SetBinLabel(8, "chi2PerClusterITS");
825 fhCutCorrelation->GetXaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
826 fhCutCorrelation->GetXaxis()->SetBinLabel(10, "ndEdxClustersTPC");
827 fhCutCorrelation->GetXaxis()->SetBinLabel(11, "covElement11");
828 fhCutCorrelation->GetXaxis()->SetBinLabel(12, "covElement22");
829 fhCutCorrelation->GetXaxis()->SetBinLabel(13, "covElement33");
830 fhCutCorrelation->GetXaxis()->SetBinLabel(14, "covElement44");
831 fhCutCorrelation->GetXaxis()->SetBinLabel(15, "covElement55");
832 fhCutCorrelation->GetXaxis()->SetBinLabel(16, "status");
834 fhCutCorrelation->GetYaxis()->SetBinLabel(1, "nClustersTPC");
835 fhCutCorrelation->GetYaxis()->SetBinLabel(2, "nClustersITS");
836 fhCutCorrelation->GetYaxis()->SetBinLabel(3, "nClustersTRD");
837 fhCutCorrelation->GetYaxis()->SetBinLabel(4, "fractionClustersTPC");
838 fhCutCorrelation->GetYaxis()->SetBinLabel(5, "ntrackletsTRD");
839 fhCutCorrelation->GetYaxis()->SetBinLabel(6, "ntrackletsTRDpid");
840 fhCutCorrelation->GetYaxis()->SetBinLabel(7, "chi2PerClusterTPC");
841 fhCutCorrelation->GetYaxis()->SetBinLabel(8, "chi2PerClusterITS");
842 fhCutCorrelation->GetYaxis()->SetBinLabel(9, "chi2PerTrackletTRD");
843 fhCutCorrelation->GetYaxis()->SetBinLabel(10, "ndEdxClustersTPC");
844 fhCutCorrelation->GetYaxis()->SetBinLabel(11, "covElement11");
845 fhCutCorrelation->GetYaxis()->SetBinLabel(12, "covElement22");
846 fhCutCorrelation->GetYaxis()->SetBinLabel(13, "covElement33");
847 fhCutCorrelation->GetYaxis()->SetBinLabel(14, "covElement44");
848 fhCutCorrelation->GetYaxis()->SetBinLabel(15, "covElement55");
849 fhCutCorrelation->GetYaxis()->SetBinLabel(16, "status");
852 // book QA histograms
854 for (Int_t i=0; i<kNStepQA; i++) {
855 if (i==0) sprintf(str," ");
856 else sprintf(str,"_cut");
858 fhQA[kCutClusterTPC][i] = new TH1F(Form("%s_nClustersTPC%s",GetName(),str) ,"",fhNBinsClusterTPC-1,fhBinLimClusterTPC);
859 fhQA[kCutClusterITS][i] = new TH1F(Form("%s_nClustersITS%s",GetName(),str) ,"",fhNBinsClusterITS-1,fhBinLimClusterITS);
860 fhQA[kCutClusterTRD][i] = new TH1F(Form("%s_nClustersTRD%s",GetName(),str) ,"",fhNBinsClusterTRD-1,fhBinLimClusterTRD);
861 fhQA[kCutMinFoundClusterTPC][i] = new TH1F(Form("%s_fractionClustersTPC%s",GetName(),str) ,"",fhNBinsFoundClusterTPC-1,fhBinLimFoundClusterTPC);
862 fhQA[kCutTrackletTRD][i] = new TH1F(Form("%s_ntrackletsTRD%s",GetName(),str) ,"",fhNBinsTrackletTRD-1,fhBinLimTrackletTRD);
863 fhQA[kCutTrackletTRDpid][i] = new TH1F(Form("%s_ntrackletsTRDpid%s",GetName(),str) ,"",fhNBinsTrackletTRDpid-1,fhBinLimTrackletTRDpid);
864 fhQA[kCutChi2TPC][i] = new TH1F(Form("%s_chi2PerClusterTPC%s",GetName(),str),"",fhNBinsChi2TPC-1,fhBinLimChi2TPC);
865 fhQA[kCutChi2ITS][i] = new TH1F(Form("%s_chi2PerClusterITS%s",GetName(),str),"",fhNBinsChi2ITS-1,fhBinLimChi2ITS);
866 fhQA[kCutChi2TRD][i] = new TH1F(Form("%s_chi2PerTrackletTRD%s",GetName(),str),"",fhNBinsChi2TRD-1,fhBinLimChi2TRD);
867 fhQA[kCutdEdxClusterTPC][i] = new TH1F(Form("%s_ndEdxClustersTPC%s",GetName(),str) ,"",fhNBinsdEdxClusterTPC-1,fhBinLimdEdxClusterTPC);
868 fhQA[kCutCovElement11][i] = new TH1F(Form("%s_covMatrixDiagonal11%s",GetName(),str),"",fhNBinsCovariance11-1,fhBinLimCovariance11);
869 fhQA[kCutCovElement22][i] = new TH1F(Form("%s_covMatrixDiagonal22%s",GetName(),str),"",fhNBinsCovariance22-1,fhBinLimCovariance22);
870 fhQA[kCutCovElement33][i] = new TH1F(Form("%s_covMatrixDiagonal33%s",GetName(),str),"",fhNBinsCovariance33-1,fhBinLimCovariance33);
871 fhQA[kCutCovElement44][i] = new TH1F(Form("%s_covMatrixDiagonal44%s",GetName(),str),"",fhNBinsCovariance44-1,fhBinLimCovariance44);
872 fhQA[kCutCovElement55][i] = new TH1F(Form("%s_covMatrixDiagonal55%s",GetName(),str),"",fhNBinsCovariance55-1,fhBinLimCovariance55);
874 fhQA[kCutClusterTPC][i] ->SetXTitle("n TPC clusters");
875 fhQA[kCutClusterITS][i] ->SetXTitle("n ITS clusters");
876 fhQA[kCutClusterTRD][i] ->SetXTitle("n TRD clusters");
877 fhQA[kCutMinFoundClusterTPC][i]->SetXTitle("fraction TPC clusters");
878 fhQA[kCutTrackletTRD][i] ->SetXTitle("n tracklets TRD");
879 fhQA[kCutTrackletTRDpid][i]->SetXTitle("n tracklets TRD pid");
880 fhQA[kCutChi2TPC][i] ->SetXTitle("#chi^{2} per TPC cluster");
881 fhQA[kCutChi2ITS][i] ->SetXTitle("#chi^{2} per ITS cluster");
882 fhQA[kCutChi2TRD][i] ->SetXTitle("#chi^{2} per TRD tracklet");
883 fhQA[kCutdEdxClusterTPC][i] ->SetXTitle("n dEdx TPC clusters");
884 fhQA[kCutCovElement11][i] ->SetXTitle("cov 11 : #sigma_{y}^{2} (cm^{2})");
885 fhQA[kCutCovElement22][i] ->SetXTitle("cov 22 : #sigma_{z}^{2} (cm^{2})");
886 fhQA[kCutCovElement33][i] ->SetXTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
887 fhQA[kCutCovElement44][i] ->SetXTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
888 fhQA[kCutCovElement55][i] ->SetXTitle("cov 55 : #sigma_{1/p_{T}}^{2} ((c/GeV)^{2})");
891 for(Int_t i=0; i<kNHist; i++) fhQA[i][1]->SetLineColor(color);
893 //__________________________________________________________________________________
894 void AliCFTrackQualityCuts::FillHistograms(TObject* obj, Bool_t b)
897 // fill the QA histograms
901 if (!obj->InheritsFrom("AliVParticle")) {
902 AliError("object must derived from AliVParticle !");
906 Bool_t isESDTrack = strcmp(obj->ClassName(),"AliESDtrack") == 0 ? kTRUE : kFALSE ;
907 Bool_t isAODTrack = strcmp(obj->ClassName(),"AliAODTrack") == 0 ? kTRUE : kFALSE ;
909 AliESDtrack * esdTrack = 0x0 ;
910 AliAODTrack * aodTrack = 0x0 ;
911 if (isESDTrack) esdTrack = dynamic_cast<AliESDtrack*>(obj);
912 if (isAODTrack) aodTrack = dynamic_cast<AliAODTrack*>(obj);
914 // b = 0: fill histograms before cuts
915 // b = 1: fill histograms after cuts
917 // // // remove following 5 lines when AliESDtrackCuts is updated
918 Int_t nClustersTPC = 0;
919 Int_t nClustersITS = 0 ;
920 Float_t chi2PerClusterTPC = 0 ;
921 Float_t chi2PerClusterITS = 0 ;
922 Double_t extCov[15]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
924 Int_t nClustersTRD = 0 ;
925 Int_t nTrackletsTRD = 0 ;
926 Float_t chi2PerTrackletTRD = 0 ;
927 Float_t fractionFoundClustersTPC = 0;
930 nClustersTRD = esdTrack->GetTRDncls();
931 nTrackletsTRD = esdTrack->GetTRDntracklets();
932 if (nTrackletsTRD != 0) chi2PerTrackletTRD = esdTrack->GetTRDchi2() / Float_t(nTrackletsTRD);
934 // // // include following line when AliESDtrackCuts is updated
935 // if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = fTrackCuts->GetCutVariable(2) / float(esdTrack->GetTPCNclsF());
937 // // // remove following 6 lines when AliESDtrackCuts is updated
938 nClustersTPC = esdTrack->GetTPCclusters(0x0);
939 nClustersITS = esdTrack->GetITSclusters(0x0);
940 if (nClustersTPC != 0) chi2PerClusterTPC = esdTrack->GetTPCchi2() / Float_t(nClustersTPC);
941 if (nClustersITS != 0) chi2PerClusterITS = esdTrack->GetITSchi2() / Float_t(nClustersITS);
942 esdTrack->GetExternalCovariance(extCov);
943 if (esdTrack->GetTPCNclsF() != 0) fractionFoundClustersTPC = float(nClustersTPC) / float(esdTrack->GetTPCNclsF());
946 // // // include following lines when AliESDtrackCuts is updated
947 // fhQA[kCutClusterTPC][b]->Fill(fTrackCuts->GetCutVariable(2));
948 // fhQA[kCutClusterITS][b]->Fill(fTrackCuts->GetCutVariable(3));
949 // fhQA[kCutChi2TPC][b]->Fill(fTrackCuts->GetCutVariable(4));
950 // fhQA[kCutChi2ITS][b]->Fill(fTrackCuts->GetCutVariable(5));
951 // // // remove following 4 lines when AliESDtrackCuts is updated
952 fhQA[kCutClusterTPC][b]->Fill((float)nClustersTPC);
953 fhQA[kCutChi2TPC][b]->Fill(chi2PerClusterTPC);
954 fhQA[kCutClusterITS][b]->Fill((float)nClustersITS);
955 fhQA[kCutChi2ITS][b]->Fill(chi2PerClusterITS);
958 fhQA[kCutClusterTRD][b]->Fill((float)nClustersTRD);
959 fhQA[kCutChi2TRD][b]->Fill(chi2PerTrackletTRD);
960 // if (b==0 || (b==1 && fTrackCuts->GetCutVariable(2)>0)) fhQA[kCutMinFoundClusterTPC][b]->Fill((float)fractionFoundClustersTPC);
961 if (b==0 || (b==1 && nClustersTPC>0)) fhQA[kCutMinFoundClusterTPC][b]->Fill((float)fractionFoundClustersTPC);
962 fhQA[kCutTrackletTRD][b]->Fill((float)nTrackletsTRD);
963 fhQA[kCutTrackletTRDpid][b]->Fill((float)esdTrack->GetTRDntrackletsPID());
964 fhQA[kCutdEdxClusterTPC][b]->Fill((float)esdTrack->GetTPCsignalN());
966 // // // include following lines when AliESDtrackCuts is updated
967 // fhQA[kCutCovElement11][b]->Fill(fTrackCuts->GetCutVariable(6));
968 // fhQA[kCutCovElement22][b]->Fill(fTrackCuts->GetCutVariable(7));
969 // fhQA[kCutCovElement33][b]->Fill(fTrackCuts->GetCutVariable(8));
970 // fhQA[kCutCovElement44][b]->Fill(fTrackCuts->GetCutVariable(9));
971 // fhQA[kCutCovElement55][b]->Fill(fTrackCuts->GetCutVariable(10));
972 // // // remove following 5 lines when AliESDtrackCuts is updated
973 fhQA[kCutCovElement11][b]->Fill(extCov[0]);
974 fhQA[kCutCovElement22][b]->Fill(extCov[2]);
975 fhQA[kCutCovElement33][b]->Fill(extCov[5]);
976 fhQA[kCutCovElement44][b]->Fill(extCov[9]);
977 fhQA[kCutCovElement55][b]->Fill(extCov[14]);
980 // fill cut statistics and cut correlation histograms with information from the bitmap
983 // Get the bitmap of the single cuts
985 SelectionBitMap(obj);
987 // Number of single cuts in this class
988 UInt_t ncuts = fBitmap->GetNbits();
989 for(UInt_t bit=0; bit<ncuts;bit++) {
990 if (!fBitmap->TestBitNumber(bit)) {
991 fhCutStatistics->Fill(bit+1);
992 for (UInt_t bit2=bit; bit2<ncuts;bit2++) {
993 if (!fBitmap->TestBitNumber(bit2))
994 fhCutCorrelation->Fill(bit+1,bit2+1);
999 //__________________________________________________________________________________
1000 void AliCFTrackQualityCuts::SaveHistograms(const Char_t* dir) {
1002 // saves the histograms in a directory (dir)
1004 if(!fIsQAOn) return;
1009 gDirectory->mkdir(dir);
1010 gDirectory->cd(dir);
1012 gDirectory->mkdir("before_cuts");
1013 gDirectory->mkdir("after_cuts");
1015 fhCutStatistics->Write();
1016 fhCutCorrelation->Write();
1018 for (Int_t j=0; j<kNStepQA; j++) {
1020 gDirectory->cd("before_cuts");
1022 gDirectory->cd("after_cuts");
1024 for(Int_t i=0; i<kNHist; i++) fhQA[i][j]->Write();
1026 gDirectory->cd("../");
1028 gDirectory->cd("../");
1030 //__________________________________________________________________________________
1031 void AliCFTrackQualityCuts::DrawHistograms(Bool_t drawLogScale)
1034 // draws some histograms
1036 if(!fIsQAOn) return;
1039 Float_t right = 0.03;
1040 Float_t left = 0.175;
1042 Float_t bottom = 0.175;
1044 TCanvas* canvas1 = new TCanvas("Track_QA_Quality_1", "Track QA Quality 1", 800, 500);
1045 canvas1->Divide(2, 1);
1048 fhCutStatistics->SetStats(kFALSE);
1049 fhCutStatistics->LabelsOption("v");
1050 gPad->SetLeftMargin(left);
1051 gPad->SetBottomMargin(0.25);
1052 gPad->SetRightMargin(right);
1053 gPad->SetTopMargin(0.1);
1054 fhCutStatistics->Draw();
1057 fhCutCorrelation->SetStats(kFALSE);
1058 fhCutCorrelation->LabelsOption("v");
1059 gPad->SetLeftMargin(0.30);
1060 gPad->SetRightMargin(bottom);
1061 gPad->SetTopMargin(0.1);
1062 gPad->SetBottomMargin(0.25);
1063 fhCutCorrelation->Draw("COLZ");
1065 canvas1->SaveAs(Form("%s.eps", canvas1->GetName()));
1066 canvas1->SaveAs(Form("%s.ps", canvas1->GetName()));
1070 TCanvas* canvas2 = new TCanvas("Track_QA_Quality_2", "Track QA Quality 2", 1200, 800);
1071 canvas2->Divide(2, 2);
1074 gPad->SetRightMargin(right);
1075 gPad->SetLeftMargin(left);
1076 gPad->SetTopMargin(top);
1077 gPad->SetBottomMargin(bottom);
1078 fhQA[kCutClusterTPC][0]->SetStats(kFALSE);
1079 fhQA[kCutClusterTPC][0]->Draw();
1080 fhQA[kCutClusterTPC][1]->Draw("same");
1083 gPad->SetRightMargin(right);
1084 gPad->SetLeftMargin(left);
1085 gPad->SetTopMargin(top);
1086 gPad->SetBottomMargin(bottom);
1087 fhQA[kCutChi2TPC][0]->SetStats(kFALSE);
1088 fhQA[kCutChi2TPC][0]->Draw();
1089 fhQA[kCutChi2TPC][1]->Draw("same");
1092 gPad->SetRightMargin(right);
1093 gPad->SetLeftMargin(left);
1094 gPad->SetTopMargin(top);
1095 gPad->SetBottomMargin(bottom);
1096 fhQA[kCutClusterITS][0]->SetStats(kFALSE);
1097 fhQA[kCutClusterITS][0]->Draw();
1098 fhQA[kCutClusterITS][1]->Draw("same");
1101 gPad->SetRightMargin(right);
1102 gPad->SetLeftMargin(left);
1103 gPad->SetTopMargin(top);
1104 gPad->SetBottomMargin(bottom);
1105 fhQA[kCutChi2ITS][0]->SetStats(kFALSE);
1106 fhQA[kCutChi2ITS][0]->Draw();
1107 fhQA[kCutChi2ITS][1]->Draw("same");
1109 canvas2->SaveAs(Form("%s.eps", canvas2->GetName()));
1110 canvas2->SaveAs(Form("%s.ps", canvas2->GetName()));
1114 TCanvas* canvas3 = new TCanvas("Track_QA_Quality_3", "Track QA Quality 3", 1200, 800);
1115 canvas3->Divide(3, 2);
1118 if(drawLogScale) gPad->SetLogy();
1119 gPad->SetRightMargin(right);
1120 gPad->SetLeftMargin(left);
1121 gPad->SetTopMargin(top);
1122 gPad->SetBottomMargin(bottom);
1123 fhQA[kCutCovElement11][0]->SetStats(kFALSE);
1124 fhQA[kCutCovElement11][0]->Draw();
1125 fhQA[kCutCovElement11][1]->Draw("same");
1128 if(drawLogScale) gPad->SetLogy();
1129 gPad->SetRightMargin(right);
1130 gPad->SetLeftMargin(left);
1131 gPad->SetTopMargin(top);
1132 gPad->SetBottomMargin(bottom);
1133 fhQA[kCutCovElement22][0]->SetStats(kFALSE);
1134 fhQA[kCutCovElement22][0]->Draw();
1135 fhQA[kCutCovElement22][1]->Draw("same");
1138 if(drawLogScale) gPad->SetLogy();
1139 gPad->SetRightMargin(right);
1140 gPad->SetLeftMargin(left);
1141 gPad->SetTopMargin(top);
1142 gPad->SetBottomMargin(bottom);
1143 fhQA[kCutCovElement33][0]->SetStats(kFALSE);
1144 fhQA[kCutCovElement33][0]->Draw();
1145 fhQA[kCutCovElement33][1]->Draw("same");
1148 if(drawLogScale) gPad->SetLogy();
1149 gPad->SetRightMargin(right);
1150 gPad->SetLeftMargin(left);
1151 gPad->SetTopMargin(top);
1152 gPad->SetBottomMargin(bottom);
1153 fhQA[kCutCovElement44][0]->SetStats(kFALSE);
1154 fhQA[kCutCovElement44][0]->Draw();
1155 fhQA[kCutCovElement44][1]->Draw("same");
1158 if(drawLogScale) gPad->SetLogy();
1159 gPad->SetRightMargin(right);
1160 gPad->SetLeftMargin(left);
1161 gPad->SetTopMargin(top);
1162 gPad->SetBottomMargin(bottom);
1163 fhQA[kCutCovElement55][0]->SetStats(kFALSE);
1164 fhQA[kCutCovElement55][0]->Draw();
1165 fhQA[kCutCovElement55][1]->Draw("same");
1167 canvas3->SaveAs(Form("%s.eps", canvas3->GetName()));
1168 canvas3->SaveAs(Form("%s.ps", canvas3->GetName()));
1170 //__________________________________________________________________________________
1171 void AliCFTrackQualityCuts::AddQAHistograms(TList *qaList) {
1173 // saves the histograms in a TList
1177 qaList->Add(fhCutStatistics);
1178 qaList->Add(fhCutCorrelation);
1180 for (Int_t j=0; j<kNStepQA; j++) {
1181 for(Int_t i=0; i<kNHist; i++)
1182 qaList->Add(fhQA[i][j]);