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 /* $Id: AliESDtrackCuts.cxx 24534 2008-03-16 22:22:11Z fca $ */
18 #include "AliESDtrackCuts.h"
20 #include <AliESDtrack.h>
21 #include <AliESDVertex.h>
22 #include <AliESDEvent.h>
27 #include <TDirectory.h>
31 //____________________________________________________________________
32 ClassImp(AliESDtrackCuts)
35 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
37 "require TPC standalone",
41 "#Chi^{2}/cluster TPC",
42 "#Chi^{2}/cluster ITS",
58 "trk-to-vtx max dca 2D absolute",
59 "trk-to-vtx max dca xy absolute",
60 "trk-to-vtx max dca z absolute",
61 "trk-to-vtx min dca 2D absolute",
62 "trk-to-vtx min dca xy absolute",
63 "trk-to-vtx min dca z absolute",
64 "SPD cluster requirement",
65 "SDD cluster requirement",
66 "SSD cluster requirement",
67 "require ITS stand-alone",
68 "rel 1/pt uncertainty"
71 //____________________________________________________________________
72 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
73 fCutMinNClusterTPC(0),
74 fCutMinNClusterITS(0),
75 fCutMaxChi2PerClusterTPC(0),
76 fCutMaxChi2PerClusterITS(0),
82 fCutMaxRel1PtUncertainty(0),
83 fCutAcceptKinkDaughters(0),
84 fCutAcceptSharedTPCClusters(0),
85 fCutMaxFractionSharedTPCClusters(0),
86 fCutRequireTPCRefit(0),
87 fCutRequireTPCStandAlone(0),
88 fCutRequireITSRefit(0),
89 fCutRequireITSStandAlone(0),
90 fCutNsigmaToVertex(0),
91 fCutSigmaToVertexRequired(0),
92 fCutMaxDCAToVertexXY(0),
93 fCutMaxDCAToVertexZ(0),
94 fCutMinDCAToVertexXY(0),
95 fCutMinDCAToVertexZ(0),
122 //##############################################################################
123 // setting default cuts
124 SetMinNClustersTPC();
125 SetMinNClustersITS();
126 SetMaxChi2PerClusterTPC();
127 SetMaxChi2PerClusterITS();
128 SetMaxCovDiagonalElements();
129 SetMaxRel1PtUncertainty();
130 SetRequireTPCRefit();
131 SetRequireTPCStandAlone();
132 SetRequireITSRefit();
133 SetRequireITSStandAlone(kFALSE);
134 SetAcceptKinkDaughters();
135 SetMaxNsigmaToVertex();
136 SetMaxDCAToVertexXY();
137 SetMaxDCAToVertexZ();
139 SetMinDCAToVertexXY();
140 SetMinDCAToVertexZ();
148 SetClusterRequirementITS(kSPD);
149 SetClusterRequirementITS(kSDD);
150 SetClusterRequirementITS(kSSD);
155 //_____________________________________________________________________________
156 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
157 fCutMinNClusterTPC(0),
158 fCutMinNClusterITS(0),
159 fCutMaxChi2PerClusterTPC(0),
160 fCutMaxChi2PerClusterITS(0),
166 fCutMaxRel1PtUncertainty(0),
167 fCutAcceptKinkDaughters(0),
168 fCutAcceptSharedTPCClusters(0),
169 fCutMaxFractionSharedTPCClusters(0),
170 fCutRequireTPCRefit(0),
171 fCutRequireTPCStandAlone(0),
172 fCutRequireITSRefit(0),
173 fCutRequireITSStandAlone(0),
174 fCutNsigmaToVertex(0),
175 fCutSigmaToVertexRequired(0),
176 fCutMaxDCAToVertexXY(0),
177 fCutMaxDCAToVertexZ(0),
178 fCutMinDCAToVertexXY(0),
179 fCutMinDCAToVertexZ(0),
180 fCutDCAToVertex2D(0),
204 ((AliESDtrackCuts &) c).Copy(*this);
207 AliESDtrackCuts::~AliESDtrackCuts()
213 for (Int_t i=0; i<2; i++) {
215 if (fhNClustersITS[i])
216 delete fhNClustersITS[i];
217 if (fhNClustersTPC[i])
218 delete fhNClustersTPC[i];
219 if (fhChi2PerClusterITS[i])
220 delete fhChi2PerClusterITS[i];
221 if (fhChi2PerClusterTPC[i])
222 delete fhChi2PerClusterTPC[i];
234 if (fhRel1PtUncertainty[i])
235 delete fhRel1PtUncertainty[i];
246 if (fhDXYNormalized[i])
247 delete fhDXYNormalized[i];
248 if (fhDZNormalized[i])
249 delete fhDZNormalized[i];
250 if (fhDXYvsDZNormalized[i])
251 delete fhDXYvsDZNormalized[i];
252 if (fhNSigmaToVertex[i])
253 delete fhNSigmaToVertex[i];
261 delete ffDTheoretical;
264 delete fhCutStatistics;
265 if (fhCutCorrelation)
266 delete fhCutCorrelation;
269 void AliESDtrackCuts::Init()
272 // sets everything to zero
275 fCutMinNClusterTPC = 0;
276 fCutMinNClusterITS = 0;
278 fCutMaxChi2PerClusterTPC = 0;
279 fCutMaxChi2PerClusterITS = 0;
281 for (Int_t i = 0; i < 3; i++)
282 fCutClusterRequirementITS[i] = kOff;
290 fCutMaxRel1PtUncertainty = 0;
292 fCutAcceptKinkDaughters = 0;
293 fCutAcceptSharedTPCClusters = 0;
294 fCutMaxFractionSharedTPCClusters = 0;
295 fCutRequireTPCRefit = 0;
296 fCutRequireTPCStandAlone = 0;
297 fCutRequireITSRefit = 0;
298 fCutRequireITSStandAlone = 0;
300 fCutNsigmaToVertex = 0;
301 fCutSigmaToVertexRequired = 0;
302 fCutMaxDCAToVertexXY = 0;
303 fCutMaxDCAToVertexZ = 0;
304 fCutDCAToVertex2D = 0;
305 fCutMinDCAToVertexXY = 0;
306 fCutMinDCAToVertexZ = 0;
324 fHistogramsOn = kFALSE;
326 for (Int_t i=0; i<2; ++i)
328 fhNClustersITS[i] = 0;
329 fhNClustersTPC[i] = 0;
331 fhChi2PerClusterITS[i] = 0;
332 fhChi2PerClusterTPC[i] = 0;
340 fhRel1PtUncertainty[i] = 0;
347 fhDXYNormalized[i] = 0;
348 fhDZNormalized[i] = 0;
349 fhDXYvsDZNormalized[i] = 0;
350 fhNSigmaToVertex[i] = 0;
358 fhCutCorrelation = 0;
361 //_____________________________________________________________________________
362 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
365 // Assignment operator
368 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
372 //_____________________________________________________________________________
373 void AliESDtrackCuts::Copy(TObject &c) const
379 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
383 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
384 target.fCutMinNClusterITS = fCutMinNClusterITS;
386 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
387 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
389 for (Int_t i = 0; i < 3; i++)
390 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
392 target.fCutMaxC11 = fCutMaxC11;
393 target.fCutMaxC22 = fCutMaxC22;
394 target.fCutMaxC33 = fCutMaxC33;
395 target.fCutMaxC44 = fCutMaxC44;
396 target.fCutMaxC55 = fCutMaxC55;
398 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
400 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
401 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
402 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
403 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
404 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
405 target.fCutRequireITSRefit = fCutRequireITSRefit;
406 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
408 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
409 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
410 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
411 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
412 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
413 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
414 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
416 target.fPMin = fPMin;
417 target.fPMax = fPMax;
418 target.fPtMin = fPtMin;
419 target.fPtMax = fPtMax;
420 target.fPxMin = fPxMin;
421 target.fPxMax = fPxMax;
422 target.fPyMin = fPyMin;
423 target.fPyMax = fPyMax;
424 target.fPzMin = fPzMin;
425 target.fPzMax = fPzMax;
426 target.fEtaMin = fEtaMin;
427 target.fEtaMax = fEtaMax;
428 target.fRapMin = fRapMin;
429 target.fRapMax = fRapMax;
431 target.fHistogramsOn = fHistogramsOn;
433 for (Int_t i=0; i<2; ++i)
435 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
436 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
438 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
439 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
441 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
442 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
443 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
444 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
445 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
447 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
449 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
450 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
451 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
452 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
454 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
455 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
456 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
457 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
459 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
460 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
462 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
464 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
465 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
470 //_____________________________________________________________________________
471 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
472 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
473 // Returns the number of merged objects (including this)
480 TIterator* iter = list->MakeIterator();
483 // collection of measured and generated histograms
485 while ((obj = iter->Next())) {
487 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
491 if (!entry->fHistogramsOn)
494 for (Int_t i=0; i<2; i++) {
496 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
497 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
499 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
500 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
502 fhC11[i] ->Add(entry->fhC11[i] );
503 fhC22[i] ->Add(entry->fhC22[i] );
504 fhC33[i] ->Add(entry->fhC33[i] );
505 fhC44[i] ->Add(entry->fhC44[i] );
506 fhC55[i] ->Add(entry->fhC55[i] );
508 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
510 fhDXY[i] ->Add(entry->fhDXY[i] );
511 fhDZ[i] ->Add(entry->fhDZ[i] );
512 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
513 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
515 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
516 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
517 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
518 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
520 fhPt[i] ->Add(entry->fhPt[i]);
521 fhEta[i] ->Add(entry->fhEta[i]);
524 fhCutStatistics ->Add(entry->fhCutStatistics);
525 fhCutCorrelation ->Add(entry->fhCutCorrelation);
532 //____________________________________________________________________
533 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
535 // creates an AliESDtrackCuts object and fills it with standard values for TPC-only cuts
536 // see ALICE note: ...
538 Printf("AliESDtrackCuts::GetStandardTPCOnlyTrackCuts: Creating track cuts for TPC-only.");
540 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
542 esdTrackCuts->SetMinNClustersTPC(50);
543 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
544 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
546 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
547 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
548 esdTrackCuts->SetDCAToVertex2D(kTRUE);
553 //____________________________________________________________________
554 Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly)
556 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
557 // tpcOnly = kTRUE -> consider TPC-only tracks
558 // = kFALSE -> consider global tracks
562 Printf("AliESDtrackCuts::GetReferenceMultiplicity: Not implemented for global tracks!");
566 AliESDtrackCuts* esdTrackCuts = GetStandardTPCOnlyTrackCuts();
567 esdTrackCuts->SetEtaRange(-0.8, 0.8);
568 esdTrackCuts->SetPtRange(0.15);
570 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
578 //____________________________________________________________________
579 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
581 // Calculates the number of sigma to the vertex.
586 esdTrack->GetImpactParameters(b,bCov);
588 if (bCov[0]<=0 || bCov[2]<=0) {
589 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
590 bCov[0]=0; bCov[2]=0;
592 bRes[0] = TMath::Sqrt(bCov[0]);
593 bRes[1] = TMath::Sqrt(bCov[2]);
595 // -----------------------------------
596 // How to get to a n-sigma cut?
598 // The accumulated statistics from 0 to d is
600 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
601 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
603 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
604 // Can this be expressed in a different way?
606 if (bRes[0] == 0 || bRes[1] ==0)
609 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
611 // work around precision problem
612 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
613 // 1e-15 corresponds to nsigma ~ 7.7
614 if (TMath::Exp(-d * d / 2) < 1e-15)
617 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
621 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
623 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
625 tree->SetBranchStatus("fTracks.fFlags", 1);
626 tree->SetBranchStatus("fTracks.fITSncls", 1);
627 tree->SetBranchStatus("fTracks.fTPCncls", 1);
628 tree->SetBranchStatus("fTracks.fITSchi2", 1);
629 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
630 tree->SetBranchStatus("fTracks.fC*", 1);
631 tree->SetBranchStatus("fTracks.fD", 1);
632 tree->SetBranchStatus("fTracks.fZ", 1);
633 tree->SetBranchStatus("fTracks.fCdd", 1);
634 tree->SetBranchStatus("fTracks.fCdz", 1);
635 tree->SetBranchStatus("fTracks.fCzz", 1);
636 tree->SetBranchStatus("fTracks.fP*", 1);
637 tree->SetBranchStatus("fTracks.fR*", 1);
638 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
641 //____________________________________________________________________
642 Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
645 // figure out if the tracks survives all the track cuts defined
647 // the different quality parameter and kinematic values are first
648 // retrieved from the track. then it is found out what cuts the
649 // track did not survive and finally the cuts are imposed.
651 // this function needs the following branches:
657 // fTracks.fC //GetExternalCovariance
658 // fTracks.fD //GetImpactParameters
659 // fTracks.fZ //GetImpactParameters
660 // fTracks.fCdd //GetImpactParameters
661 // fTracks.fCdz //GetImpactParameters
662 // fTracks.fCzz //GetImpactParameters
663 // fTracks.fP //GetPxPyPz
664 // fTracks.fR //GetMass
665 // fTracks.fP //GetMass
666 // fTracks.fKinkIndexes
668 UInt_t status = esdTrack->GetStatus();
670 // getting quality parameters from the ESD track
671 Int_t nClustersITS = esdTrack->GetITSclusters(0);
672 Int_t nClustersTPC = -1;
673 if(fCutRequireTPCStandAlone) {
674 nClustersTPC = esdTrack->GetTPCNclsIter1();
677 nClustersTPC = esdTrack->GetTPCclusters(0);
680 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
681 Float_t fracClustersTPCShared = -1.;
683 Float_t chi2PerClusterITS = -1;
684 Float_t chi2PerClusterTPC = -1;
686 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
687 if (nClustersTPC!=0) {
688 if(fCutRequireTPCStandAlone) {
689 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
691 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
693 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
697 esdTrack->GetExternalCovariance(extCov);
699 // getting the track to vertex parameters
700 Float_t nSigmaToVertex = GetSigmaToVertex(esdTrack);
704 esdTrack->GetImpactParameters(b,bCov);
705 if (bCov[0]<=0 || bCov[2]<=0) {
706 AliDebug(1, "Estimated b resolution lower or equal zero!");
707 bCov[0]=0; bCov[2]=0;
710 Float_t dcaToVertexXY = b[0];
711 Float_t dcaToVertexZ = b[1];
713 Float_t dcaToVertex = -1;
715 if (fCutDCAToVertex2D)
717 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
720 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
722 // getting the kinematic variables of the track
723 // (assuming the mass is known)
725 esdTrack->GetPxPyPz(p);
727 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
728 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
729 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
731 //y-eta related calculations
734 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
735 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
736 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
737 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
741 Printf("AliESDtrackCuts::AcceptTrack: WARNING: GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]);
744 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
746 //########################################################################
750 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
752 // track quality cuts
753 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
755 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
757 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
759 if (nClustersTPC<fCutMinNClusterTPC)
761 if (nClustersITS<fCutMinNClusterITS)
763 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
765 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
767 if (extCov[0] > fCutMaxC11)
769 if (extCov[2] > fCutMaxC22)
771 if (extCov[5] > fCutMaxC33)
773 if (extCov[9] > fCutMaxC44)
775 if (extCov[14] > fCutMaxC55)
777 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
779 // if n sigma could not be calculated
780 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
782 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
784 // track kinematics cut
785 if((momentum < fPMin) || (momentum > fPMax))
787 if((pt < fPtMin) || (pt > fPtMax))
789 if((p[0] < fPxMin) || (p[0] > fPxMax))
791 if((p[1] < fPyMin) || (p[1] > fPyMax))
793 if((p[2] < fPzMin) || (p[2] > fPzMax))
795 if((eta < fEtaMin) || (eta > fEtaMax))
797 if((y < fRapMin) || (y > fRapMax))
799 if (fCutDCAToVertex2D && dcaToVertex > 1)
801 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
803 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
805 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
807 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
809 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
812 for (Int_t i = 0; i < 3; i++)
813 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
815 if (fCutRequireITSStandAlone && ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)))
818 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
821 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
824 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
828 for (Int_t i=0; i<kNCuts; i++)
829 if (cuts[i]) {cut = kTRUE;}
832 //########################################################################
833 // filling histograms
835 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
837 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
839 for (Int_t i=0; i<kNCuts; i++) {
841 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
843 for (Int_t j=i; j<kNCuts; j++) {
844 if (cuts[i] && cuts[j]) {
845 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
846 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
847 fhCutCorrelation->Fill(xC, yC);
853 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
854 // the code is not in a function due to too many local variables that would need to be passed
856 for (Int_t id = 0; id < 2; id++)
858 // id = 0 --> before cut
859 // id = 1 --> after cut
863 fhNClustersITS[id]->Fill(nClustersITS);
864 fhNClustersTPC[id]->Fill(nClustersTPC);
865 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
866 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
868 fhC11[id]->Fill(extCov[0]);
869 fhC22[id]->Fill(extCov[2]);
870 fhC33[id]->Fill(extCov[5]);
871 fhC44[id]->Fill(extCov[9]);
872 fhC55[id]->Fill(extCov[14]);
874 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
877 fhEta[id]->Fill(eta);
880 bRes[0] = TMath::Sqrt(bCov[0]);
881 bRes[1] = TMath::Sqrt(bCov[2]);
883 fhDZ[id]->Fill(b[1]);
884 fhDXY[id]->Fill(b[0]);
885 fhDXYDZ[id]->Fill(dcaToVertex);
886 fhDXYvsDZ[id]->Fill(b[1],b[0]);
888 if (bRes[0]!=0 && bRes[1]!=0) {
889 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
890 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
891 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
892 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
904 //____________________________________________________________________
905 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
907 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
911 case kOff: return kTRUE;
912 case kNone: return !clusterL1 && !clusterL2;
913 case kAny: return clusterL1 || clusterL2;
914 case kFirst: return clusterL1;
915 case kOnlyFirst: return clusterL1 && !clusterL2;
916 case kSecond: return clusterL2;
917 case kOnlySecond: return clusterL2 && !clusterL1;
918 case kBoth: return clusterL1 && clusterL2;
924 //____________________________________________________________________
925 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
928 // Utility function to
929 // create a TPC only track from the given esd track
931 // IMPORTANT: The track has to be deleted by the user
933 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
934 // there are only missing propagations here that are needed for old data
935 // this function will therefore become obsolete
937 // adapted from code provided by CKB
939 if (!esd->GetPrimaryVertexTPC())
940 return 0; // No TPC vertex no TPC tracks
942 if(!esd->GetPrimaryVertexTPC()->GetStatus())
943 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
945 AliESDtrack* track = esd->GetTrack(iTrack);
949 AliESDtrack *tpcTrack = new AliESDtrack();
951 // only true if we have a tpc track
952 if (!track->FillTPCOnlyTrack(*tpcTrack))
958 // propagate to Vertex
959 // not needed for normal reconstructed ESDs...
960 // Double_t pTPC[2],covTPC[3];
961 // tpcTrack->PropagateToDCA(esd->GetPrimaryVertexTPC(), esd->GetMagneticField(), 10000, pTPC, covTPC);
966 //____________________________________________________________________
967 TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
970 // returns an array of all tracks that pass the cuts
971 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
972 // tracks that pass the cut
974 TObjArray* acceptedTracks = new TObjArray();
976 // loop over esd tracks
977 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
979 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
980 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
982 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
986 if (AcceptTrack(tpcTrack)) {
987 acceptedTracks->Add(tpcTrack);
994 AliESDtrack* track = esd->GetTrack(iTrack);
995 if(AcceptTrack(track))
996 acceptedTracks->Add(track);
999 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1000 return acceptedTracks;
1003 //____________________________________________________________________
1004 Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
1007 // returns an the number of tracks that pass the cuts
1012 // loop over esd tracks
1013 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1014 AliESDtrack* track = esd->GetTrack(iTrack);
1015 if (AcceptTrack(track))
1022 //____________________________________________________________________
1023 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1025 // diagnostics histograms are defined
1028 fHistogramsOn=kTRUE;
1030 Bool_t oldStatus = TH1::AddDirectoryStatus();
1031 TH1::AddDirectory(kFALSE);
1033 //###################################################################################
1034 // defining histograms
1036 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1038 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1039 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1041 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1043 for (Int_t i=0; i<kNCuts; i++) {
1044 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1045 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1046 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1049 fhCutStatistics ->SetLineColor(color);
1050 fhCutCorrelation ->SetLineColor(color);
1051 fhCutStatistics ->SetLineWidth(2);
1052 fhCutCorrelation ->SetLineWidth(2);
1054 for (Int_t i=0; i<2; i++) {
1055 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1056 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1057 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1058 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1060 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1061 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1062 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1063 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1064 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1066 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1068 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1069 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1070 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1071 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1073 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1074 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1075 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1077 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1079 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1080 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1082 fhNClustersITS[i]->SetTitle("n ITS clusters");
1083 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1084 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1085 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1087 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1088 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1089 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1090 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1091 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1093 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1095 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1096 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1097 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1098 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1099 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1101 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1102 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1103 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1104 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1105 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1107 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1108 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1109 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1110 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1112 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1113 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1114 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1115 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1116 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1118 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1120 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1121 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1122 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1124 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1125 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1126 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1129 // The number of sigmas to the vertex is per definition gaussian
1130 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1131 ffDTheoretical->SetParameter(0,1);
1133 TH1::AddDirectory(oldStatus);
1136 //____________________________________________________________________
1137 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1140 // loads the histograms from a file
1141 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1147 if (!gDirectory->cd(dir))
1150 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1152 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1153 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1155 for (Int_t i=0; i<2; i++) {
1158 gDirectory->cd("before_cuts");
1161 gDirectory->cd("after_cuts");
1163 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1164 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1165 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1166 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1168 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1169 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1170 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1171 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1172 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1174 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1176 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1177 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1178 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1179 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1181 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1182 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1183 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1184 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1186 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1187 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1189 gDirectory->cd("../");
1192 gDirectory->cd("..");
1197 //____________________________________________________________________
1198 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1200 // saves the histograms in a directory (dir)
1203 if (!fHistogramsOn) {
1204 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1211 gDirectory->mkdir(dir);
1212 gDirectory->cd(dir);
1214 gDirectory->mkdir("before_cuts");
1215 gDirectory->mkdir("after_cuts");
1217 // a factor of 2 is needed since n sigma is positive
1218 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1219 ffDTheoretical->Write("nSigmaToVertexTheory");
1221 fhCutStatistics->Write();
1222 fhCutCorrelation->Write();
1224 for (Int_t i=0; i<2; i++) {
1226 gDirectory->cd("before_cuts");
1228 gDirectory->cd("after_cuts");
1230 fhNClustersITS[i] ->Write();
1231 fhNClustersTPC[i] ->Write();
1232 fhChi2PerClusterITS[i] ->Write();
1233 fhChi2PerClusterTPC[i] ->Write();
1241 fhRel1PtUncertainty[i] ->Write();
1245 fhDXYDZ[i] ->Write();
1246 fhDXYvsDZ[i] ->Write();
1248 fhDXYNormalized[i] ->Write();
1249 fhDZNormalized[i] ->Write();
1250 fhDXYvsDZNormalized[i] ->Write();
1251 fhNSigmaToVertex[i] ->Write();
1256 gDirectory->cd("../");
1259 gDirectory->cd("../");
1262 //____________________________________________________________________
1263 void AliESDtrackCuts::DrawHistograms()
1265 // draws some histograms
1267 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1268 canvas1->Divide(2, 2);
1271 fhNClustersTPC[0]->SetStats(kFALSE);
1272 fhNClustersTPC[0]->Draw();
1275 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1276 fhChi2PerClusterTPC[0]->Draw();
1279 fhNSigmaToVertex[0]->SetStats(kFALSE);
1280 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1281 fhNSigmaToVertex[0]->Draw();
1283 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1285 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1286 canvas2->Divide(3, 2);
1289 fhC11[0]->SetStats(kFALSE);
1294 fhC22[0]->SetStats(kFALSE);
1299 fhC33[0]->SetStats(kFALSE);
1304 fhC44[0]->SetStats(kFALSE);
1309 fhC55[0]->SetStats(kFALSE);
1314 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1316 fhRel1PtUncertainty[0]->Draw();
1318 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1320 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1321 canvas3->Divide(3, 2);
1324 fhDXY[0]->SetStats(kFALSE);
1329 fhDZ[0]->SetStats(kFALSE);
1334 fhDXYvsDZ[0]->SetStats(kFALSE);
1336 gPad->SetRightMargin(0.15);
1337 fhDXYvsDZ[0]->Draw("COLZ");
1340 fhDXYNormalized[0]->SetStats(kFALSE);
1342 fhDXYNormalized[0]->Draw();
1345 fhDZNormalized[0]->SetStats(kFALSE);
1347 fhDZNormalized[0]->Draw();
1350 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1352 gPad->SetRightMargin(0.15);
1353 fhDXYvsDZNormalized[0]->Draw("COLZ");
1355 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1357 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1358 canvas4->Divide(2, 1);
1361 fhCutStatistics->SetStats(kFALSE);
1362 fhCutStatistics->LabelsOption("v");
1363 gPad->SetBottomMargin(0.3);
1364 fhCutStatistics->Draw();
1367 fhCutCorrelation->SetStats(kFALSE);
1368 fhCutCorrelation->LabelsOption("v");
1369 gPad->SetBottomMargin(0.3);
1370 gPad->SetLeftMargin(0.3);
1371 fhCutCorrelation->Draw("COLZ");
1373 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1376 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1377 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1380 fhNClustersTPC[0]->SetStats(kFALSE);
1381 fhNClustersTPC[0]->DrawCopy();
1384 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1385 fhChi2PerClusterITS[0]->DrawCopy();
1386 fhChi2PerClusterITS[1]->SetLineColor(2);
1387 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1390 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1391 fhChi2PerClusterTPC[0]->DrawCopy();
1392 fhChi2PerClusterTPC[1]->SetLineColor(2);
1393 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/