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",
69 "TPC n shared clusters",
70 "TPC rel shared clusters",
74 //____________________________________________________________________
75 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
76 fCutMinNClusterTPC(0),
77 fCutMinNClusterITS(0),
78 fCutMaxChi2PerClusterTPC(0),
79 fCutMaxChi2PerClusterITS(0),
85 fCutMaxRel1PtUncertainty(0),
86 fCutAcceptKinkDaughters(0),
87 fCutAcceptSharedTPCClusters(0),
88 fCutMaxFractionSharedTPCClusters(0),
89 fCutRequireTPCRefit(0),
90 fCutRequireTPCStandAlone(0),
91 fCutRequireITSRefit(0),
93 fCutRequireITSStandAlone(0),
94 fCutRequireITSpureSA(0),
95 fCutNsigmaToVertex(0),
96 fCutSigmaToVertexRequired(0),
97 fCutMaxDCAToVertexXY(0),
98 fCutMaxDCAToVertexZ(0),
99 fCutMinDCAToVertexXY(0),
100 fCutMinDCAToVertexZ(0),
101 fCutMaxDCAToVertexXYPtDep(""),
102 fCutMaxDCAToVertexZPtDep(""),
103 fCutMinDCAToVertexXYPtDep(""),
104 fCutMinDCAToVertexZPtDep(""),
105 f1CutMaxDCAToVertexXYPtDep(0x0),
106 f1CutMaxDCAToVertexZPtDep(0x0),
107 f1CutMinDCAToVertexXYPtDep(0x0),
108 f1CutMinDCAToVertexZPtDep(0x0),
109 fCutDCAToVertex2D(0),
135 //##############################################################################
136 // setting default cuts
137 SetMinNClustersTPC();
138 SetMinNClustersITS();
139 SetMaxChi2PerClusterTPC();
140 SetMaxChi2PerClusterITS();
141 SetMaxCovDiagonalElements();
142 SetMaxRel1PtUncertainty();
143 SetRequireTPCRefit();
144 SetRequireTPCStandAlone();
145 SetRequireITSRefit();
146 SetRequireITSPid(kFALSE);
147 SetRequireITSStandAlone(kFALSE);
148 SetRequireITSPureStandAlone(kFALSE);
149 SetAcceptKinkDaughters();
150 SetAcceptSharedTPCClusters();
151 SetMaxFractionSharedTPCClusters();
152 SetMaxNsigmaToVertex();
153 SetMaxDCAToVertexXY();
154 SetMaxDCAToVertexZ();
156 SetMinDCAToVertexXY();
157 SetMinDCAToVertexZ();
165 SetClusterRequirementITS(kSPD);
166 SetClusterRequirementITS(kSDD);
167 SetClusterRequirementITS(kSSD);
172 //_____________________________________________________________________________
173 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
174 fCutMinNClusterTPC(0),
175 fCutMinNClusterITS(0),
176 fCutMaxChi2PerClusterTPC(0),
177 fCutMaxChi2PerClusterITS(0),
183 fCutMaxRel1PtUncertainty(0),
184 fCutAcceptKinkDaughters(0),
185 fCutAcceptSharedTPCClusters(0),
186 fCutMaxFractionSharedTPCClusters(0),
187 fCutRequireTPCRefit(0),
188 fCutRequireTPCStandAlone(0),
189 fCutRequireITSRefit(0),
190 fCutRequireITSPid(0),
191 fCutRequireITSStandAlone(0),
192 fCutRequireITSpureSA(0),
193 fCutNsigmaToVertex(0),
194 fCutSigmaToVertexRequired(0),
195 fCutMaxDCAToVertexXY(0),
196 fCutMaxDCAToVertexZ(0),
197 fCutMinDCAToVertexXY(0),
198 fCutMinDCAToVertexZ(0),
199 fCutMaxDCAToVertexXYPtDep(""),
200 fCutMaxDCAToVertexZPtDep(""),
201 fCutMinDCAToVertexXYPtDep(""),
202 fCutMinDCAToVertexZPtDep(""),
203 f1CutMaxDCAToVertexXYPtDep(0x0),
204 f1CutMaxDCAToVertexZPtDep(0x0),
205 f1CutMinDCAToVertexXYPtDep(0x0),
206 f1CutMinDCAToVertexZPtDep(0x0),
207 fCutDCAToVertex2D(0),
231 ((AliESDtrackCuts &) c).Copy(*this);
234 AliESDtrackCuts::~AliESDtrackCuts()
240 for (Int_t i=0; i<2; i++) {
242 if (fhNClustersITS[i])
243 delete fhNClustersITS[i];
244 if (fhNClustersTPC[i])
245 delete fhNClustersTPC[i];
246 if (fhChi2PerClusterITS[i])
247 delete fhChi2PerClusterITS[i];
248 if (fhChi2PerClusterTPC[i])
249 delete fhChi2PerClusterTPC[i];
261 if (fhRel1PtUncertainty[i])
262 delete fhRel1PtUncertainty[i];
273 if (fhDXYNormalized[i])
274 delete fhDXYNormalized[i];
275 if (fhDZNormalized[i])
276 delete fhDZNormalized[i];
277 if (fhDXYvsDZNormalized[i])
278 delete fhDXYvsDZNormalized[i];
279 if (fhNSigmaToVertex[i])
280 delete fhNSigmaToVertex[i];
287 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
288 f1CutMaxDCAToVertexXYPtDep = 0;
289 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
290 f1CutMaxDCAToVertexZPtDep = 0;
291 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
292 f1CutMinDCAToVertexXYPtDep = 0;
293 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
294 f1CutMinDCAToVertexZPtDep = 0;
298 delete ffDTheoretical;
301 delete fhCutStatistics;
302 if (fhCutCorrelation)
303 delete fhCutCorrelation;
306 void AliESDtrackCuts::Init()
309 // sets everything to zero
312 fCutMinNClusterTPC = 0;
313 fCutMinNClusterITS = 0;
315 fCutMaxChi2PerClusterTPC = 0;
316 fCutMaxChi2PerClusterITS = 0;
318 for (Int_t i = 0; i < 3; i++)
319 fCutClusterRequirementITS[i] = kOff;
327 fCutMaxRel1PtUncertainty = 0;
329 fCutAcceptKinkDaughters = 0;
330 fCutAcceptSharedTPCClusters = 0;
331 fCutMaxFractionSharedTPCClusters = 0;
332 fCutRequireTPCRefit = 0;
333 fCutRequireTPCStandAlone = 0;
334 fCutRequireITSRefit = 0;
335 fCutRequireITSPid = 0;
336 fCutRequireITSStandAlone = 0;
337 fCutRequireITSpureSA = 0;
339 fCutNsigmaToVertex = 0;
340 fCutSigmaToVertexRequired = 0;
341 fCutMaxDCAToVertexXY = 0;
342 fCutMaxDCAToVertexZ = 0;
343 fCutDCAToVertex2D = 0;
344 fCutMinDCAToVertexXY = 0;
345 fCutMinDCAToVertexZ = 0;
346 fCutMaxDCAToVertexXYPtDep = "";
347 fCutMaxDCAToVertexZPtDep = "";
348 fCutMinDCAToVertexXYPtDep = "";
349 fCutMinDCAToVertexZPtDep = "";
351 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
352 f1CutMaxDCAToVertexXYPtDep = 0;
353 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
354 f1CutMaxDCAToVertexXYPtDep = 0;
355 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
356 f1CutMaxDCAToVertexZPtDep = 0;
357 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
358 f1CutMinDCAToVertexXYPtDep = 0;
359 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
360 f1CutMinDCAToVertexZPtDep = 0;
378 fHistogramsOn = kFALSE;
380 for (Int_t i=0; i<2; ++i)
382 fhNClustersITS[i] = 0;
383 fhNClustersTPC[i] = 0;
385 fhChi2PerClusterITS[i] = 0;
386 fhChi2PerClusterTPC[i] = 0;
394 fhRel1PtUncertainty[i] = 0;
401 fhDXYNormalized[i] = 0;
402 fhDZNormalized[i] = 0;
403 fhDXYvsDZNormalized[i] = 0;
404 fhNSigmaToVertex[i] = 0;
412 fhCutCorrelation = 0;
415 //_____________________________________________________________________________
416 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
419 // Assignment operator
422 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
426 //_____________________________________________________________________________
427 void AliESDtrackCuts::Copy(TObject &c) const
433 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
437 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
438 target.fCutMinNClusterITS = fCutMinNClusterITS;
440 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
441 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
443 for (Int_t i = 0; i < 3; i++)
444 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
446 target.fCutMaxC11 = fCutMaxC11;
447 target.fCutMaxC22 = fCutMaxC22;
448 target.fCutMaxC33 = fCutMaxC33;
449 target.fCutMaxC44 = fCutMaxC44;
450 target.fCutMaxC55 = fCutMaxC55;
452 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
454 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
455 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
456 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
457 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
458 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
459 target.fCutRequireITSRefit = fCutRequireITSRefit;
460 target.fCutRequireITSPid = fCutRequireITSPid;
461 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
462 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
464 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
465 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
466 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
467 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
468 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
469 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
470 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
472 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
473 target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
475 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
476 target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
478 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
479 target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
481 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
482 target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
484 target.fPMin = fPMin;
485 target.fPMax = fPMax;
486 target.fPtMin = fPtMin;
487 target.fPtMax = fPtMax;
488 target.fPxMin = fPxMin;
489 target.fPxMax = fPxMax;
490 target.fPyMin = fPyMin;
491 target.fPyMax = fPyMax;
492 target.fPzMin = fPzMin;
493 target.fPzMax = fPzMax;
494 target.fEtaMin = fEtaMin;
495 target.fEtaMax = fEtaMax;
496 target.fRapMin = fRapMin;
497 target.fRapMax = fRapMax;
499 target.fHistogramsOn = fHistogramsOn;
501 for (Int_t i=0; i<2; ++i)
503 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
504 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
506 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
507 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
509 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
510 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
511 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
512 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
513 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
515 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
517 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
518 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
519 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
520 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
522 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
523 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
524 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
525 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
527 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
528 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
530 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
532 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
533 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
538 //_____________________________________________________________________________
539 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
540 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
541 // Returns the number of merged objects (including this)
548 TIterator* iter = list->MakeIterator();
551 // collection of measured and generated histograms
553 while ((obj = iter->Next())) {
555 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
559 if (!entry->fHistogramsOn)
562 for (Int_t i=0; i<2; i++) {
564 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
565 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
567 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
568 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
570 fhC11[i] ->Add(entry->fhC11[i] );
571 fhC22[i] ->Add(entry->fhC22[i] );
572 fhC33[i] ->Add(entry->fhC33[i] );
573 fhC44[i] ->Add(entry->fhC44[i] );
574 fhC55[i] ->Add(entry->fhC55[i] );
576 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
578 fhDXY[i] ->Add(entry->fhDXY[i] );
579 fhDZ[i] ->Add(entry->fhDZ[i] );
580 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
581 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
583 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
584 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
585 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
586 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
588 fhPt[i] ->Add(entry->fhPt[i]);
589 fhEta[i] ->Add(entry->fhEta[i]);
592 fhCutStatistics ->Add(entry->fhCutStatistics);
593 fhCutCorrelation ->Add(entry->fhCutCorrelation);
600 //____________________________________________________________________
601 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
603 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
605 Printf("AliESDtrackCuts::GetStandardTPCOnlyTrackCuts: Creating track cuts for TPC-only.");
607 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
609 esdTrackCuts->SetMinNClustersTPC(50);
610 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
611 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
613 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
614 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
615 esdTrackCuts->SetDCAToVertex2D(kTRUE);
620 //____________________________________________________________________
621 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
623 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
625 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
627 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
630 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
631 esdTrackCuts->SetMinNClustersTPC(70);
632 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
633 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
634 esdTrackCuts->SetRequireTPCRefit(kTRUE);
636 esdTrackCuts->SetRequireITSRefit(kTRUE);
637 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
638 AliESDtrackCuts::kAny);
640 // 7*(0.0050+0.0060/pt^0.9)
641 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
643 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
644 esdTrackCuts->SetDCAToVertex2D(kFALSE);
645 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
646 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
651 //____________________________________________________________________
652 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries)
654 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
656 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
658 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
661 esdTrackCuts->SetMinNClustersTPC(70);
662 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
663 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
664 esdTrackCuts->SetRequireTPCRefit(kTRUE);
666 esdTrackCuts->SetRequireITSRefit(kTRUE);
667 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
668 AliESDtrackCuts::kAny);
670 // 7*(0.0026+0.0050/pt^1.01)
671 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
673 esdTrackCuts->SetMaxDCAToVertexZ(2);
674 esdTrackCuts->SetDCAToVertex2D(kFALSE);
675 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
680 //____________________________________________________________________
681 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
683 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
685 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
686 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
687 esdTrackCuts->SetRequireITSRefit(kTRUE);
688 esdTrackCuts->SetMinNClustersITS(4);
689 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
690 AliESDtrackCuts::kAny);
691 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
694 // 7*(0.0085+0.0026/pt^1.55)
695 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
698 esdTrackCuts->SetRequireITSPid(kTRUE);
703 //____________________________________________________________________
704 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
706 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
708 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
709 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
710 esdTrackCuts->SetRequireITSRefit(kTRUE);
711 esdTrackCuts->SetMinNClustersITS(4);
712 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
713 AliESDtrackCuts::kAny);
714 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
717 // 7*(0.0033+0.0045/pt^1.3)
718 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
721 esdTrackCuts->SetRequireITSPid(kTRUE);
726 //____________________________________________________________________
727 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
729 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
731 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
732 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
733 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
734 esdTrackCuts->SetRequireITSRefit(kTRUE);
735 esdTrackCuts->SetMinNClustersITS(4);
736 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
737 AliESDtrackCuts::kAny);
738 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
741 // 7*(0.0085+0.0026/pt^1.55)
742 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
745 esdTrackCuts->SetRequireITSPid(kTRUE);
750 //____________________________________________________________________
751 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
753 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
755 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
756 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
757 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
758 esdTrackCuts->SetRequireITSRefit(kTRUE);
759 esdTrackCuts->SetMinNClustersITS(4);
760 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
761 AliESDtrackCuts::kAny);
762 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
765 // 7*(0.0033+0.0045/pt^1.3)
766 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
769 esdTrackCuts->SetRequireITSPid(kTRUE);
774 //____________________________________________________________________
775 Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly)
777 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
778 // tpcOnly = kTRUE -> consider TPC-only tracks
779 // = kFALSE -> consider global tracks
783 Printf("AliESDtrackCuts::GetReferenceMultiplicity: Not implemented for global tracks!");
787 static AliESDtrackCuts* esdTrackCuts = 0;
790 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
791 esdTrackCuts->SetEtaRange(-0.8, 0.8);
792 esdTrackCuts->SetPtRange(0.15);
795 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
800 //____________________________________________________________________
801 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* const esdTrack)
803 // Calculates the number of sigma to the vertex.
808 esdTrack->GetImpactParameters(b,bCov);
810 if (bCov[0]<=0 || bCov[2]<=0) {
811 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
812 bCov[0]=0; bCov[2]=0;
814 bRes[0] = TMath::Sqrt(bCov[0]);
815 bRes[1] = TMath::Sqrt(bCov[2]);
817 // -----------------------------------
818 // How to get to a n-sigma cut?
820 // The accumulated statistics from 0 to d is
822 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
823 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
825 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
826 // Can this be expressed in a different way?
828 if (bRes[0] == 0 || bRes[1] ==0)
831 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
833 // work around precision problem
834 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
835 // 1e-15 corresponds to nsigma ~ 7.7
836 if (TMath::Exp(-d * d / 2) < 1e-15)
839 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
843 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
845 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
847 tree->SetBranchStatus("fTracks.fFlags", 1);
848 tree->SetBranchStatus("fTracks.fITSncls", 1);
849 tree->SetBranchStatus("fTracks.fTPCncls", 1);
850 tree->SetBranchStatus("fTracks.fITSchi2", 1);
851 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
852 tree->SetBranchStatus("fTracks.fC*", 1);
853 tree->SetBranchStatus("fTracks.fD", 1);
854 tree->SetBranchStatus("fTracks.fZ", 1);
855 tree->SetBranchStatus("fTracks.fCdd", 1);
856 tree->SetBranchStatus("fTracks.fCdz", 1);
857 tree->SetBranchStatus("fTracks.fCzz", 1);
858 tree->SetBranchStatus("fTracks.fP*", 1);
859 tree->SetBranchStatus("fTracks.fR*", 1);
860 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
863 //____________________________________________________________________
864 Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
867 // figure out if the tracks survives all the track cuts defined
869 // the different quality parameter and kinematic values are first
870 // retrieved from the track. then it is found out what cuts the
871 // track did not survive and finally the cuts are imposed.
873 // this function needs the following branches:
879 // fTracks.fC //GetExternalCovariance
880 // fTracks.fD //GetImpactParameters
881 // fTracks.fZ //GetImpactParameters
882 // fTracks.fCdd //GetImpactParameters
883 // fTracks.fCdz //GetImpactParameters
884 // fTracks.fCzz //GetImpactParameters
885 // fTracks.fP //GetPxPyPz
886 // fTracks.fR //GetMass
887 // fTracks.fP //GetMass
888 // fTracks.fKinkIndexes
890 UInt_t status = esdTrack->GetStatus();
892 // getting quality parameters from the ESD track
893 Int_t nClustersITS = esdTrack->GetITSclusters(0);
894 Int_t nClustersTPC = -1;
895 if(fCutRequireTPCStandAlone) {
896 nClustersTPC = esdTrack->GetTPCNclsIter1();
899 nClustersTPC = esdTrack->GetTPCclusters(0);
902 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
903 Float_t fracClustersTPCShared = -1.;
905 Float_t chi2PerClusterITS = -1;
906 Float_t chi2PerClusterTPC = -1;
908 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
909 if (nClustersTPC!=0) {
910 if(fCutRequireTPCStandAlone) {
911 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
913 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
915 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
919 esdTrack->GetExternalCovariance(extCov);
921 // getting the track to vertex parameters
922 Float_t nSigmaToVertex = GetSigmaToVertex(esdTrack);
926 esdTrack->GetImpactParameters(b,bCov);
927 if (bCov[0]<=0 || bCov[2]<=0) {
928 AliDebug(1, "Estimated b resolution lower or equal zero!");
929 bCov[0]=0; bCov[2]=0;
933 // set pt-dependent DCA cuts, if requested
934 SetPtDepDCACuts(esdTrack->Pt());
937 Float_t dcaToVertexXY = b[0];
938 Float_t dcaToVertexZ = b[1];
940 Float_t dcaToVertex = -1;
942 if (fCutDCAToVertex2D)
944 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
947 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
949 // getting the kinematic variables of the track
950 // (assuming the mass is known)
952 esdTrack->GetPxPyPz(p);
954 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
955 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
956 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
958 //y-eta related calculations
961 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
962 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
963 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
964 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
968 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]);
971 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
973 //########################################################################
977 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
979 // track quality cuts
980 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
982 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
984 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
986 if (nClustersTPC<fCutMinNClusterTPC)
988 if (nClustersITS<fCutMinNClusterITS)
990 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
992 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
994 if (extCov[0] > fCutMaxC11)
996 if (extCov[2] > fCutMaxC22)
998 if (extCov[5] > fCutMaxC33)
1000 if (extCov[9] > fCutMaxC44)
1002 if (extCov[14] > fCutMaxC55)
1004 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1006 // if n sigma could not be calculated
1007 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1009 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1011 // track kinematics cut
1012 if((momentum < fPMin) || (momentum > fPMax))
1014 if((pt < fPtMin) || (pt > fPtMax))
1016 if((p[0] < fPxMin) || (p[0] > fPxMax))
1018 if((p[1] < fPyMin) || (p[1] > fPyMax))
1020 if((p[2] < fPzMin) || (p[2] > fPzMax))
1022 if((eta < fEtaMin) || (eta > fEtaMax))
1024 if((y < fRapMin) || (y > fRapMax))
1026 if (fCutDCAToVertex2D && dcaToVertex > 1)
1028 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1030 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1032 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1034 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1036 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1039 for (Int_t i = 0; i < 3; i++)
1040 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1042 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1043 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1047 // ITS standalone tracks
1048 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1049 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1050 }else if(fCutRequireITSpureSA){
1051 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1056 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1059 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1062 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1065 if(fCutRequireITSPid){
1066 UChar_t clumap=esdTrack->GetITSClusterMap();
1067 Int_t nPointsForPid=0;
1068 for(Int_t i=2; i<6; i++){
1069 if(clumap&(1<<i)) ++nPointsForPid;
1071 if(nPointsForPid<3) cuts[35] = kTRUE;
1075 for (Int_t i=0; i<kNCuts; i++)
1076 if (cuts[i]) {cut = kTRUE;}
1079 //########################################################################
1080 // filling histograms
1081 if (fHistogramsOn) {
1082 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1084 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1086 for (Int_t i=0; i<kNCuts; i++) {
1087 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1088 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1091 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1093 for (Int_t j=i; j<kNCuts; j++) {
1094 if (cuts[i] && cuts[j]) {
1095 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1096 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1097 fhCutCorrelation->Fill(xC, yC);
1103 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1104 // the code is not in a function due to too many local variables that would need to be passed
1106 for (Int_t id = 0; id < 2; id++)
1108 // id = 0 --> before cut
1109 // id = 1 --> after cut
1113 fhNClustersITS[id]->Fill(nClustersITS);
1114 fhNClustersTPC[id]->Fill(nClustersTPC);
1115 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1116 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1118 fhC11[id]->Fill(extCov[0]);
1119 fhC22[id]->Fill(extCov[2]);
1120 fhC33[id]->Fill(extCov[5]);
1121 fhC44[id]->Fill(extCov[9]);
1122 fhC55[id]->Fill(extCov[14]);
1124 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1127 fhEta[id]->Fill(eta);
1130 bRes[0] = TMath::Sqrt(bCov[0]);
1131 bRes[1] = TMath::Sqrt(bCov[2]);
1133 fhDZ[id]->Fill(b[1]);
1134 fhDXY[id]->Fill(b[0]);
1135 fhDXYDZ[id]->Fill(dcaToVertex);
1136 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1138 if (bRes[0]!=0 && bRes[1]!=0) {
1139 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1140 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1141 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1142 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1154 //____________________________________________________________________
1155 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1157 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1161 case kOff: return kTRUE;
1162 case kNone: return !clusterL1 && !clusterL2;
1163 case kAny: return clusterL1 || clusterL2;
1164 case kFirst: return clusterL1;
1165 case kOnlyFirst: return clusterL1 && !clusterL2;
1166 case kSecond: return clusterL2;
1167 case kOnlySecond: return clusterL2 && !clusterL1;
1168 case kBoth: return clusterL1 && clusterL2;
1174 //____________________________________________________________________
1175 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
1178 // Utility function to
1179 // create a TPC only track from the given esd track
1181 // IMPORTANT: The track has to be deleted by the user
1183 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1184 // there are only missing propagations here that are needed for old data
1185 // this function will therefore become obsolete
1187 // adapted from code provided by CKB
1189 if (!esd->GetPrimaryVertexTPC())
1190 return 0; // No TPC vertex no TPC tracks
1192 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1193 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1195 AliESDtrack* track = esd->GetTrack(iTrack);
1199 AliESDtrack *tpcTrack = new AliESDtrack();
1201 // only true if we have a tpc track
1202 if (!track->FillTPCOnlyTrack(*tpcTrack))
1208 // propagate to Vertex
1209 // not needed for normal reconstructed ESDs...
1210 // Double_t pTPC[2],covTPC[3];
1211 // tpcTrack->PropagateToDCA(esd->GetPrimaryVertexTPC(), esd->GetMagneticField(), 10000, pTPC, covTPC);
1216 //____________________________________________________________________
1217 TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
1220 // returns an array of all tracks that pass the cuts
1221 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1222 // tracks that pass the cut
1224 // NOTE: List has to be deleted by the user
1226 TObjArray* acceptedTracks = new TObjArray();
1228 // loop over esd tracks
1229 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1231 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1232 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1234 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1238 if (AcceptTrack(tpcTrack)) {
1239 acceptedTracks->Add(tpcTrack);
1246 AliESDtrack* track = esd->GetTrack(iTrack);
1247 if(AcceptTrack(track))
1248 acceptedTracks->Add(track);
1251 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1252 return acceptedTracks;
1255 //____________________________________________________________________
1256 Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* const esd)
1259 // returns an the number of tracks that pass the cuts
1264 // loop over esd tracks
1265 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1266 AliESDtrack* track = esd->GetTrack(iTrack);
1267 if (AcceptTrack(track))
1274 //____________________________________________________________________
1275 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1277 // diagnostics histograms are defined
1280 fHistogramsOn=kTRUE;
1282 Bool_t oldStatus = TH1::AddDirectoryStatus();
1283 TH1::AddDirectory(kFALSE);
1285 //###################################################################################
1286 // defining histograms
1288 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1290 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1291 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1293 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1295 for (Int_t i=0; i<kNCuts; i++) {
1296 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1297 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1298 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1301 fhCutStatistics ->SetLineColor(color);
1302 fhCutCorrelation ->SetLineColor(color);
1303 fhCutStatistics ->SetLineWidth(2);
1304 fhCutCorrelation ->SetLineWidth(2);
1306 for (Int_t i=0; i<2; i++) {
1307 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1308 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1309 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1310 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1312 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1313 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1314 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1315 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1316 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1318 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1320 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1321 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1322 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1323 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1325 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1326 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1327 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1329 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1331 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1332 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1334 fhNClustersITS[i]->SetTitle("n ITS clusters");
1335 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1336 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1337 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1339 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1340 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1341 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1342 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1343 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1345 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1347 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1348 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1349 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1350 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1351 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1353 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1354 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1355 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1356 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1357 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1359 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1360 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1361 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1362 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1364 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1365 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1366 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1367 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1368 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1370 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1372 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1373 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1374 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1376 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1377 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1378 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1381 // The number of sigmas to the vertex is per definition gaussian
1382 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1383 ffDTheoretical->SetParameter(0,1);
1385 TH1::AddDirectory(oldStatus);
1388 //____________________________________________________________________
1389 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1392 // loads the histograms from a file
1393 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1399 if (!gDirectory->cd(dir))
1402 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1404 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1405 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1407 for (Int_t i=0; i<2; i++) {
1410 gDirectory->cd("before_cuts");
1413 gDirectory->cd("after_cuts");
1415 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1416 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1417 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1418 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1420 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1421 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1422 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1423 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1424 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1426 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1428 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1429 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1430 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1431 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1433 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1434 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1435 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1436 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1438 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1439 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1441 gDirectory->cd("../");
1444 gDirectory->cd("..");
1449 //____________________________________________________________________
1450 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1452 // saves the histograms in a directory (dir)
1455 if (!fHistogramsOn) {
1456 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1463 gDirectory->mkdir(dir);
1464 gDirectory->cd(dir);
1466 gDirectory->mkdir("before_cuts");
1467 gDirectory->mkdir("after_cuts");
1469 // a factor of 2 is needed since n sigma is positive
1470 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1471 ffDTheoretical->Write("nSigmaToVertexTheory");
1473 fhCutStatistics->Write();
1474 fhCutCorrelation->Write();
1476 for (Int_t i=0; i<2; i++) {
1478 gDirectory->cd("before_cuts");
1480 gDirectory->cd("after_cuts");
1482 fhNClustersITS[i] ->Write();
1483 fhNClustersTPC[i] ->Write();
1484 fhChi2PerClusterITS[i] ->Write();
1485 fhChi2PerClusterTPC[i] ->Write();
1493 fhRel1PtUncertainty[i] ->Write();
1497 fhDXYDZ[i] ->Write();
1498 fhDXYvsDZ[i] ->Write();
1500 fhDXYNormalized[i] ->Write();
1501 fhDZNormalized[i] ->Write();
1502 fhDXYvsDZNormalized[i] ->Write();
1503 fhNSigmaToVertex[i] ->Write();
1508 gDirectory->cd("../");
1511 gDirectory->cd("../");
1514 //____________________________________________________________________
1515 void AliESDtrackCuts::DrawHistograms()
1517 // draws some histograms
1519 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1520 canvas1->Divide(2, 2);
1523 fhNClustersTPC[0]->SetStats(kFALSE);
1524 fhNClustersTPC[0]->Draw();
1527 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1528 fhChi2PerClusterTPC[0]->Draw();
1531 fhNSigmaToVertex[0]->SetStats(kFALSE);
1532 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1533 fhNSigmaToVertex[0]->Draw();
1535 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1537 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1538 canvas2->Divide(3, 2);
1541 fhC11[0]->SetStats(kFALSE);
1546 fhC22[0]->SetStats(kFALSE);
1551 fhC33[0]->SetStats(kFALSE);
1556 fhC44[0]->SetStats(kFALSE);
1561 fhC55[0]->SetStats(kFALSE);
1566 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1568 fhRel1PtUncertainty[0]->Draw();
1570 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1572 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1573 canvas3->Divide(3, 2);
1576 fhDXY[0]->SetStats(kFALSE);
1581 fhDZ[0]->SetStats(kFALSE);
1586 fhDXYvsDZ[0]->SetStats(kFALSE);
1588 gPad->SetRightMargin(0.15);
1589 fhDXYvsDZ[0]->Draw("COLZ");
1592 fhDXYNormalized[0]->SetStats(kFALSE);
1594 fhDXYNormalized[0]->Draw();
1597 fhDZNormalized[0]->SetStats(kFALSE);
1599 fhDZNormalized[0]->Draw();
1602 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1604 gPad->SetRightMargin(0.15);
1605 fhDXYvsDZNormalized[0]->Draw("COLZ");
1607 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1609 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1610 canvas4->Divide(2, 1);
1613 fhCutStatistics->SetStats(kFALSE);
1614 fhCutStatistics->LabelsOption("v");
1615 gPad->SetBottomMargin(0.3);
1616 fhCutStatistics->Draw();
1619 fhCutCorrelation->SetStats(kFALSE);
1620 fhCutCorrelation->LabelsOption("v");
1621 gPad->SetBottomMargin(0.3);
1622 gPad->SetLeftMargin(0.3);
1623 fhCutCorrelation->Draw("COLZ");
1625 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1628 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1629 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1632 fhNClustersTPC[0]->SetStats(kFALSE);
1633 fhNClustersTPC[0]->DrawCopy();
1636 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1637 fhChi2PerClusterITS[0]->DrawCopy();
1638 fhChi2PerClusterITS[1]->SetLineColor(2);
1639 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1642 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1643 fhChi2PerClusterTPC[0]->DrawCopy();
1644 fhChi2PerClusterTPC[1]->SetLineColor(2);
1645 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1647 //--------------------------------------------------------------------------
1648 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1650 // set the pt-dependent DCA cuts
1653 if(f1CutMaxDCAToVertexXYPtDep) {
1654 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
1657 if(f1CutMaxDCAToVertexZPtDep) {
1658 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
1661 if(f1CutMinDCAToVertexXYPtDep) {
1662 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
1665 if(f1CutMinDCAToVertexZPtDep) {
1666 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
1675 //--------------------------------------------------------------------------
1676 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
1678 // Check the correctness of the string syntax
1680 Bool_t retval=kTRUE;
1682 if(!dist.Contains("pt")) {
1683 if(print) printf("AliESDtrackCuts::CheckPtDepDCA(): string must contain \"pt\"\n");
1689 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
1691 if(f1CutMaxDCAToVertexXYPtDep){
1692 delete f1CutMaxDCAToVertexXYPtDep;
1694 f1CutMaxDCAToVertexXYPtDep = 0;
1695 fCutMaxDCAToVertexXYPtDep = "";
1697 if(!CheckPtDepDCA(dist,kTRUE)){
1700 fCutMaxDCAToVertexXYPtDep = dist;
1702 tmp.ReplaceAll("pt","x");
1703 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
1707 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
1710 if(f1CutMaxDCAToVertexZPtDep){
1711 delete f1CutMaxDCAToVertexZPtDep;
1713 f1CutMaxDCAToVertexZPtDep = 0;
1714 fCutMaxDCAToVertexZPtDep = "";
1716 if(!CheckPtDepDCA(dist,kTRUE))return;
1718 fCutMaxDCAToVertexZPtDep = dist;
1720 tmp.ReplaceAll("pt","x");
1721 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
1727 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
1730 if(f1CutMinDCAToVertexXYPtDep){
1731 delete f1CutMinDCAToVertexXYPtDep;
1733 f1CutMinDCAToVertexXYPtDep = 0;
1734 fCutMinDCAToVertexXYPtDep = "";
1736 if(!CheckPtDepDCA(dist,kTRUE))return;
1738 fCutMinDCAToVertexXYPtDep = dist;
1740 tmp.ReplaceAll("pt","x");
1741 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
1746 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
1750 if(f1CutMinDCAToVertexZPtDep){
1751 delete f1CutMinDCAToVertexZPtDep;
1753 f1CutMinDCAToVertexZPtDep = 0;
1754 fCutMinDCAToVertexZPtDep = "";
1756 if(!CheckPtDepDCA(dist,kTRUE))return;
1757 fCutMinDCAToVertexZPtDep = dist;
1759 tmp.ReplaceAll("pt","x");
1760 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());