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>
23 #include <AliMultiplicity.h>
28 #include <TDirectory.h>
32 //____________________________________________________________________
33 ClassImp(AliESDtrackCuts)
36 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
38 "require TPC standalone",
42 "#Chi^{2}/cluster TPC",
43 "#Chi^{2}/cluster ITS",
59 "trk-to-vtx max dca 2D absolute",
60 "trk-to-vtx max dca xy absolute",
61 "trk-to-vtx max dca z absolute",
62 "trk-to-vtx min dca 2D absolute",
63 "trk-to-vtx min dca xy absolute",
64 "trk-to-vtx min dca z absolute",
65 "SPD cluster requirement",
66 "SDD cluster requirement",
67 "SSD cluster requirement",
68 "require ITS stand-alone",
69 "rel 1/pt uncertainty",
70 "TPC n shared clusters",
71 "TPC rel shared clusters",
74 "n crossed rows / n findable clusters",
76 "#Chi^{2} TPC constrained vs. global"
79 AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
81 //____________________________________________________________________
82 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
83 fCutMinNClusterTPC(0),
84 fCutMinNClusterITS(0),
85 fCutMinNCrossedRowsTPC(0),
86 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
87 f1CutMinNClustersTPCPtDep(0x0),
88 fCutMaxPtDepNClustersTPC(0),
89 fCutMaxChi2PerClusterTPC(0),
90 fCutMaxChi2PerClusterITS(0),
91 fCutMaxChi2TPCConstrainedVsGlobal(0),
92 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
93 fCutMaxMissingITSPoints(0),
99 fCutMaxRel1PtUncertainty(0),
100 fCutAcceptKinkDaughters(0),
101 fCutAcceptSharedTPCClusters(0),
102 fCutMaxFractionSharedTPCClusters(0),
103 fCutRequireTPCRefit(0),
104 fCutRequireTPCStandAlone(0),
105 fCutRequireITSRefit(0),
106 fCutRequireITSPid(0),
107 fCutRequireITSStandAlone(0),
108 fCutRequireITSpureSA(0),
109 fCutNsigmaToVertex(0),
110 fCutSigmaToVertexRequired(0),
111 fCutMaxDCAToVertexXY(0),
112 fCutMaxDCAToVertexZ(0),
113 fCutMinDCAToVertexXY(0),
114 fCutMinDCAToVertexZ(0),
115 fCutMaxDCAToVertexXYPtDep(""),
116 fCutMaxDCAToVertexZPtDep(""),
117 fCutMinDCAToVertexXYPtDep(""),
118 fCutMinDCAToVertexZPtDep(""),
119 f1CutMaxDCAToVertexXYPtDep(0x0),
120 f1CutMaxDCAToVertexZPtDep(0x0),
121 f1CutMinDCAToVertexXYPtDep(0x0),
122 f1CutMinDCAToVertexZPtDep(0x0),
123 fCutDCAToVertex2D(0),
149 //##############################################################################
150 // setting default cuts
151 SetMinNClustersTPC();
152 SetMinNClustersITS();
153 SetMinNCrossedRowsTPC();
154 SetMinRatioCrossedRowsOverFindableClustersTPC();
155 SetMaxChi2PerClusterTPC();
156 SetMaxChi2PerClusterITS();
157 SetMaxChi2TPCConstrainedGlobal();
158 SetMaxChi2TPCConstrainedGlobalVertexType();
159 SetMaxNOfMissingITSPoints();
160 SetMaxCovDiagonalElements();
161 SetMaxRel1PtUncertainty();
162 SetRequireTPCRefit();
163 SetRequireTPCStandAlone();
164 SetRequireITSRefit();
165 SetRequireITSPid(kFALSE);
166 SetRequireITSStandAlone(kFALSE);
167 SetRequireITSPureStandAlone(kFALSE);
168 SetAcceptKinkDaughters();
169 SetAcceptSharedTPCClusters();
170 SetMaxFractionSharedTPCClusters();
171 SetMaxNsigmaToVertex();
172 SetMaxDCAToVertexXY();
173 SetMaxDCAToVertexZ();
175 SetMinDCAToVertexXY();
176 SetMinDCAToVertexZ();
184 SetClusterRequirementITS(kSPD);
185 SetClusterRequirementITS(kSDD);
186 SetClusterRequirementITS(kSSD);
191 //_____________________________________________________________________________
192 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
193 fCutMinNClusterTPC(0),
194 fCutMinNClusterITS(0),
195 fCutMinNCrossedRowsTPC(0),
196 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
197 f1CutMinNClustersTPCPtDep(0x0),
198 fCutMaxPtDepNClustersTPC(0),
199 fCutMaxChi2PerClusterTPC(0),
200 fCutMaxChi2PerClusterITS(0),
201 fCutMaxChi2TPCConstrainedVsGlobal(0),
202 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
203 fCutMaxMissingITSPoints(0),
209 fCutMaxRel1PtUncertainty(0),
210 fCutAcceptKinkDaughters(0),
211 fCutAcceptSharedTPCClusters(0),
212 fCutMaxFractionSharedTPCClusters(0),
213 fCutRequireTPCRefit(0),
214 fCutRequireTPCStandAlone(0),
215 fCutRequireITSRefit(0),
216 fCutRequireITSPid(0),
217 fCutRequireITSStandAlone(0),
218 fCutRequireITSpureSA(0),
219 fCutNsigmaToVertex(0),
220 fCutSigmaToVertexRequired(0),
221 fCutMaxDCAToVertexXY(0),
222 fCutMaxDCAToVertexZ(0),
223 fCutMinDCAToVertexXY(0),
224 fCutMinDCAToVertexZ(0),
225 fCutMaxDCAToVertexXYPtDep(""),
226 fCutMaxDCAToVertexZPtDep(""),
227 fCutMinDCAToVertexXYPtDep(""),
228 fCutMinDCAToVertexZPtDep(""),
229 f1CutMaxDCAToVertexXYPtDep(0x0),
230 f1CutMaxDCAToVertexZPtDep(0x0),
231 f1CutMinDCAToVertexXYPtDep(0x0),
232 f1CutMinDCAToVertexZPtDep(0x0),
233 fCutDCAToVertex2D(0),
257 ((AliESDtrackCuts &) c).Copy(*this);
260 AliESDtrackCuts::~AliESDtrackCuts()
266 for (Int_t i=0; i<2; i++) {
268 if (fhNClustersITS[i])
269 delete fhNClustersITS[i];
270 if (fhNClustersTPC[i])
271 delete fhNClustersTPC[i];
272 if (fhNSharedClustersTPC[i])
273 delete fhNSharedClustersTPC[i];
274 if (fhNCrossedRowsTPC[i])
275 delete fhNCrossedRowsTPC[i];
276 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
277 delete fhRatioCrossedRowsOverFindableClustersTPC[i];
278 if (fhChi2PerClusterITS[i])
279 delete fhChi2PerClusterITS[i];
280 if (fhChi2PerClusterTPC[i])
281 delete fhChi2PerClusterTPC[i];
282 if (fhChi2TPCConstrainedVsGlobal[i])
283 delete fhChi2TPCConstrainedVsGlobal[i];
284 if(fhNClustersForITSPID[i])
285 delete fhNClustersForITSPID[i];
286 if(fhNMissingITSPoints[i])
287 delete fhNMissingITSPoints[i];
299 if (fhRel1PtUncertainty[i])
300 delete fhRel1PtUncertainty[i];
311 if (fhDXYNormalized[i])
312 delete fhDXYNormalized[i];
313 if (fhDZNormalized[i])
314 delete fhDZNormalized[i];
315 if (fhDXYvsDZNormalized[i])
316 delete fhDXYvsDZNormalized[i];
317 if (fhNSigmaToVertex[i])
318 delete fhNSigmaToVertex[i];
325 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
326 f1CutMaxDCAToVertexXYPtDep = 0;
327 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
328 f1CutMaxDCAToVertexZPtDep = 0;
329 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
330 f1CutMinDCAToVertexXYPtDep = 0;
331 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
332 f1CutMinDCAToVertexZPtDep = 0;
336 delete ffDTheoretical;
339 delete fhCutStatistics;
340 if (fhCutCorrelation)
341 delete fhCutCorrelation;
343 if(f1CutMinNClustersTPCPtDep)
344 delete f1CutMinNClustersTPCPtDep;
348 void AliESDtrackCuts::Init()
351 // sets everything to zero
354 fCutMinNClusterTPC = 0;
355 fCutMinNClusterITS = 0;
357 fCutMaxChi2PerClusterTPC = 0;
358 fCutMaxChi2PerClusterITS = 0;
359 fCutMaxChi2TPCConstrainedVsGlobal = 0;
360 fCutMaxChi2TPCConstrainedVsGlobalVertexType = kVertexTracks | kVertexSPD;
361 fCutMaxMissingITSPoints = 0;
363 for (Int_t i = 0; i < 3; i++)
364 fCutClusterRequirementITS[i] = kOff;
372 fCutMaxRel1PtUncertainty = 0;
374 fCutAcceptKinkDaughters = 0;
375 fCutAcceptSharedTPCClusters = 0;
376 fCutMaxFractionSharedTPCClusters = 0;
377 fCutRequireTPCRefit = 0;
378 fCutRequireTPCStandAlone = 0;
379 fCutRequireITSRefit = 0;
380 fCutRequireITSPid = 0;
381 fCutRequireITSStandAlone = 0;
382 fCutRequireITSpureSA = 0;
384 fCutNsigmaToVertex = 0;
385 fCutSigmaToVertexRequired = 0;
386 fCutMaxDCAToVertexXY = 0;
387 fCutMaxDCAToVertexZ = 0;
388 fCutDCAToVertex2D = 0;
389 fCutMinDCAToVertexXY = 0;
390 fCutMinDCAToVertexZ = 0;
391 fCutMaxDCAToVertexXYPtDep = "";
392 fCutMaxDCAToVertexZPtDep = "";
393 fCutMinDCAToVertexXYPtDep = "";
394 fCutMinDCAToVertexZPtDep = "";
396 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
397 f1CutMaxDCAToVertexXYPtDep = 0;
398 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
399 f1CutMaxDCAToVertexXYPtDep = 0;
400 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
401 f1CutMaxDCAToVertexZPtDep = 0;
402 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
403 f1CutMinDCAToVertexXYPtDep = 0;
404 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
405 f1CutMinDCAToVertexZPtDep = 0;
423 fHistogramsOn = kFALSE;
425 for (Int_t i=0; i<2; ++i)
427 fhNClustersITS[i] = 0;
428 fhNClustersTPC[i] = 0;
429 fhNSharedClustersTPC[i] = 0;
430 fhNCrossedRowsTPC[i] = 0;
431 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
433 fhChi2PerClusterITS[i] = 0;
434 fhChi2PerClusterTPC[i] = 0;
435 fhChi2TPCConstrainedVsGlobal[i] = 0;
436 fhNClustersForITSPID[i] = 0;
437 fhNMissingITSPoints[i] = 0;
445 fhRel1PtUncertainty[i] = 0;
452 fhDXYNormalized[i] = 0;
453 fhDZNormalized[i] = 0;
454 fhDXYvsDZNormalized[i] = 0;
455 fhNSigmaToVertex[i] = 0;
463 fhCutCorrelation = 0;
466 //_____________________________________________________________________________
467 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
470 // Assignment operator
473 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
477 //_____________________________________________________________________________
478 void AliESDtrackCuts::Copy(TObject &c) const
484 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
488 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
489 target.fCutMinNClusterITS = fCutMinNClusterITS;
490 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
491 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
492 if(f1CutMinNClustersTPCPtDep){
493 target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
495 target.fCutMaxPtDepNClustersTPC = fCutMaxPtDepNClustersTPC;
497 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
498 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
499 target.fCutMaxChi2TPCConstrainedVsGlobal = fCutMaxChi2TPCConstrainedVsGlobal;
500 target.fCutMaxChi2TPCConstrainedVsGlobalVertexType = fCutMaxChi2TPCConstrainedVsGlobalVertexType;
501 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
503 for (Int_t i = 0; i < 3; i++)
504 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
506 target.fCutMaxC11 = fCutMaxC11;
507 target.fCutMaxC22 = fCutMaxC22;
508 target.fCutMaxC33 = fCutMaxC33;
509 target.fCutMaxC44 = fCutMaxC44;
510 target.fCutMaxC55 = fCutMaxC55;
512 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
514 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
515 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
516 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
517 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
518 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
519 target.fCutRequireITSRefit = fCutRequireITSRefit;
520 target.fCutRequireITSPid = fCutRequireITSPid;
521 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
522 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
524 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
525 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
526 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
527 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
528 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
529 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
530 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
532 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
533 target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
535 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
536 target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
538 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
539 target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
541 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
542 target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
544 target.fPMin = fPMin;
545 target.fPMax = fPMax;
546 target.fPtMin = fPtMin;
547 target.fPtMax = fPtMax;
548 target.fPxMin = fPxMin;
549 target.fPxMax = fPxMax;
550 target.fPyMin = fPyMin;
551 target.fPyMax = fPyMax;
552 target.fPzMin = fPzMin;
553 target.fPzMax = fPzMax;
554 target.fEtaMin = fEtaMin;
555 target.fEtaMax = fEtaMax;
556 target.fRapMin = fRapMin;
557 target.fRapMax = fRapMax;
559 target.fHistogramsOn = fHistogramsOn;
561 for (Int_t i=0; i<2; ++i)
563 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
564 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
565 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
566 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
567 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
569 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
570 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
571 if (fhChi2TPCConstrainedVsGlobal[i]) target.fhChi2TPCConstrainedVsGlobal[i] = (TH1F*) fhChi2TPCConstrainedVsGlobal[i]->Clone();
572 if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
573 if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
575 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
576 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
577 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
578 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
579 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
581 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
583 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
584 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
585 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
586 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
588 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
589 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
590 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
591 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
593 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
594 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
596 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
598 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
599 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
604 //_____________________________________________________________________________
605 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
606 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
607 // Returns the number of merged objects (including this)
614 TIterator* iter = list->MakeIterator();
617 // collection of measured and generated histograms
619 while ((obj = iter->Next())) {
621 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
625 if (!entry->fHistogramsOn)
628 for (Int_t i=0; i<2; i++) {
630 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
631 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
632 if (fhNSharedClustersTPC[i])
633 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
634 if (fhNCrossedRowsTPC[i])
635 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
636 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
637 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
639 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
640 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
641 if (fhChi2TPCConstrainedVsGlobal[i])
642 fhChi2TPCConstrainedVsGlobal[i]->Add(entry->fhChi2TPCConstrainedVsGlobal[i]);
643 if (fhNClustersForITSPID[i])
644 fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
645 if (fhNMissingITSPoints[i])
646 fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
648 fhC11[i] ->Add(entry->fhC11[i] );
649 fhC22[i] ->Add(entry->fhC22[i] );
650 fhC33[i] ->Add(entry->fhC33[i] );
651 fhC44[i] ->Add(entry->fhC44[i] );
652 fhC55[i] ->Add(entry->fhC55[i] );
654 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
656 fhDXY[i] ->Add(entry->fhDXY[i] );
657 fhDZ[i] ->Add(entry->fhDZ[i] );
658 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
659 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
661 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
662 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
663 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
664 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
666 fhPt[i] ->Add(entry->fhPt[i]);
667 fhEta[i] ->Add(entry->fhEta[i]);
670 fhCutStatistics ->Add(entry->fhCutStatistics);
671 fhCutCorrelation ->Add(entry->fhCutCorrelation);
678 void AliESDtrackCuts::SetMinNClustersTPCPtDep(TFormula *f1, Float_t ptmax)
681 // Sets the pT dependent NClustersTPC cut
685 delete f1CutMinNClustersTPCPtDep;
686 f1CutMinNClustersTPCPtDep = (TFormula*)f1->Clone("f1CutMinNClustersTPCPtDep");
688 fCutMaxPtDepNClustersTPC=ptmax;
691 //____________________________________________________________________
692 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
694 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
696 AliInfoClass("Creating track cuts for TPC-only.");
698 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
700 esdTrackCuts->SetMinNClustersTPC(50);
701 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
702 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
704 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
705 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
706 esdTrackCuts->SetDCAToVertex2D(kTRUE);
711 //____________________________________________________________________
712 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
714 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
716 AliInfoClass("Creating track cuts for ITS+TPC (2009 definition).");
718 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
721 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
722 esdTrackCuts->SetMinNClustersTPC(70);
723 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
724 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
725 esdTrackCuts->SetRequireTPCRefit(kTRUE);
727 esdTrackCuts->SetRequireITSRefit(kTRUE);
728 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
729 AliESDtrackCuts::kAny);
731 // 7*(0.0050+0.0060/pt^0.9)
732 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
733 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
735 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
736 esdTrackCuts->SetDCAToVertex2D(kFALSE);
737 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
738 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
740 esdTrackCuts->SetMaxChi2PerClusterITS(36);
745 //____________________________________________________________________
746 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries, Int_t clusterCut)
748 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2011 data
749 // if clusterCut = 1, the cut on the number of clusters is replaced by
750 // a cut on the number of crossed rows and on the ration crossed
751 // rows/findable clusters
753 AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
755 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
758 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
759 else if (clusterCut == 1) {
760 esdTrackCuts->SetMinNCrossedRowsTPC(70);
761 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
764 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
765 esdTrackCuts->SetMinNClustersTPC(70);
767 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
768 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
769 esdTrackCuts->SetRequireTPCRefit(kTRUE);
771 esdTrackCuts->SetRequireITSRefit(kTRUE);
772 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
773 AliESDtrackCuts::kAny);
775 // 7*(0.0015+0.0050/pt^1.1)
776 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
777 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
779 esdTrackCuts->SetMaxDCAToVertexZ(2);
780 esdTrackCuts->SetDCAToVertex2D(kFALSE);
781 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
783 esdTrackCuts->SetMaxChi2PerClusterITS(36);
788 //____________________________________________________________________
789 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
791 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
792 // if clusterCut = 1, the cut on the number of clusters is replaced by
793 // a cut on the number of crossed rows and on the ration crossed
794 // rows/findable clusters
796 AliInfoClass("Creating track cuts for ITS+TPC (2010 definition).");
798 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
801 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
802 else if (clusterCut == 1) {
803 esdTrackCuts->SetMinNCrossedRowsTPC(70);
804 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
807 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
808 esdTrackCuts->SetMinNClustersTPC(70);
810 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
811 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
812 esdTrackCuts->SetRequireTPCRefit(kTRUE);
814 esdTrackCuts->SetRequireITSRefit(kTRUE);
815 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
816 AliESDtrackCuts::kAny);
818 // 7*(0.0026+0.0050/pt^1.01)
819 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
820 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
822 esdTrackCuts->SetMaxDCAToVertexZ(2);
823 esdTrackCuts->SetDCAToVertex2D(kFALSE);
824 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
826 esdTrackCuts->SetMaxChi2PerClusterITS(36);
831 //____________________________________________________________________
832 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
834 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
836 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
837 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
838 esdTrackCuts->SetRequireITSRefit(kTRUE);
839 esdTrackCuts->SetMinNClustersITS(4);
840 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
841 AliESDtrackCuts::kAny);
842 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
845 // 7*(0.0085+0.0026/pt^1.55)
846 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
849 esdTrackCuts->SetRequireITSPid(kTRUE);
854 //____________________________________________________________________
855 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
857 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
859 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
860 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
861 esdTrackCuts->SetRequireITSRefit(kTRUE);
862 esdTrackCuts->SetMinNClustersITS(4);
863 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
864 AliESDtrackCuts::kAny);
865 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
868 // 7*(0.0033+0.0045/pt^1.3)
869 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
872 esdTrackCuts->SetRequireITSPid(kTRUE);
877 //____________________________________________________________________
878 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
880 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
882 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
883 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
884 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
885 esdTrackCuts->SetRequireITSRefit(kTRUE);
886 esdTrackCuts->SetMinNClustersITS(4);
887 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
888 AliESDtrackCuts::kAny);
889 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
892 // 7*(0.0085+0.0026/pt^1.55)
893 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
896 esdTrackCuts->SetRequireITSPid(kTRUE);
901 //____________________________________________________________________
902 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
904 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
906 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
907 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
908 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
909 esdTrackCuts->SetRequireITSRefit(kTRUE);
910 esdTrackCuts->SetMinNClustersITS(4);
911 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
912 AliESDtrackCuts::kAny);
913 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
916 // 7*(0.0033+0.0045/pt^1.3)
917 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
920 esdTrackCuts->SetRequireITSPid(kTRUE);
925 //____________________________________________________________________
926 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
928 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
930 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
931 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
935 //____________________________________________________________________
937 AliESDtrackCuts* AliESDtrackCuts::GetStandardV0DaughterCuts()
939 // creates a AliESDtrackCuts object and fills it with standard cuts for V0 daughters
940 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
941 esdTrackCuts->SetRequireTPCRefit(kTRUE);
942 esdTrackCuts->SetMinNClustersTPC(70);
943 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
947 //____________________________________________________________________
948 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
950 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
951 // tpcOnly = kTRUE -> consider TPC-only tracks
952 // = kFALSE -> consider global tracks
954 // DEPRECATED Use GetReferenceMultiplicity with the enum as second argument instead
958 AliErrorClass("Not implemented for global tracks!");
962 static AliESDtrackCuts* esdTrackCuts = 0;
965 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
966 esdTrackCuts->SetEtaRange(-0.8, 0.8);
967 esdTrackCuts->SetPtRange(0.15);
970 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
975 //____________________________________________________________________
976 Float_t AliESDtrackCuts::GetSigmaToVertex(const AliESDtrack* const esdTrack)
978 // Calculates the number of sigma to the vertex.
983 esdTrack->GetImpactParameters(b,bCov);
985 if (bCov[0]<=0 || bCov[2]<=0) {
986 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
987 bCov[0]=0; bCov[2]=0;
989 bRes[0] = TMath::Sqrt(bCov[0]);
990 bRes[1] = TMath::Sqrt(bCov[2]);
992 // -----------------------------------
993 // How to get to a n-sigma cut?
995 // The accumulated statistics from 0 to d is
997 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
998 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
1000 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
1001 // Can this be expressed in a different way?
1003 if (bRes[0] == 0 || bRes[1] ==0)
1006 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
1008 // work around precision problem
1009 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
1010 // 1e-15 corresponds to nsigma ~ 7.7
1011 if (TMath::Exp(-d * d / 2) < 1e-15)
1014 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
1018 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
1020 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
1022 tree->SetBranchStatus("fTracks.fFlags", 1);
1023 tree->SetBranchStatus("fTracks.fITSncls", 1);
1024 tree->SetBranchStatus("fTracks.fTPCncls", 1);
1025 tree->SetBranchStatus("fTracks.fITSchi2", 1);
1026 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
1027 tree->SetBranchStatus("fTracks.fC*", 1);
1028 tree->SetBranchStatus("fTracks.fD", 1);
1029 tree->SetBranchStatus("fTracks.fZ", 1);
1030 tree->SetBranchStatus("fTracks.fCdd", 1);
1031 tree->SetBranchStatus("fTracks.fCdz", 1);
1032 tree->SetBranchStatus("fTracks.fCzz", 1);
1033 tree->SetBranchStatus("fTracks.fP*", 1);
1034 tree->SetBranchStatus("fTracks.fR*", 1);
1035 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
1038 //____________________________________________________________________
1039 Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack)
1042 // figure out if the tracks survives all the track cuts defined
1044 // the different quality parameter and kinematic values are first
1045 // retrieved from the track. then it is found out what cuts the
1046 // track did not survive and finally the cuts are imposed.
1048 // this function needs the following branches:
1054 // fTracks.fC //GetExternalCovariance
1055 // fTracks.fD //GetImpactParameters
1056 // fTracks.fZ //GetImpactParameters
1057 // fTracks.fCdd //GetImpactParameters
1058 // fTracks.fCdz //GetImpactParameters
1059 // fTracks.fCzz //GetImpactParameters
1060 // fTracks.fP //GetPxPyPz
1061 // fTracks.fR //GetMass
1062 // fTracks.fP //GetMass
1063 // fTracks.fKinkIndexes
1065 // esdEvent is only required for the MaxChi2TPCConstrainedVsGlobal
1067 UInt_t status = esdTrack->GetStatus();
1069 // getting quality parameters from the ESD track
1070 Int_t nClustersITS = esdTrack->GetITSclusters(0);
1071 Int_t nClustersTPC = -1;
1072 if(fCutRequireTPCStandAlone) {
1073 nClustersTPC = esdTrack->GetTPCNclsIter1();
1076 nClustersTPC = esdTrack->GetTPCclusters(0);
1079 //Pt dependent NClusters Cut
1080 if(f1CutMinNClustersTPCPtDep) {
1081 if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
1082 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(esdTrack->Pt());
1084 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(fCutMaxPtDepNClustersTPC);
1087 Float_t nCrossedRowsTPC = esdTrack->GetTPCCrossedRows();
1088 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1089 if (esdTrack->GetTPCNclsF()>0) {
1090 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
1093 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
1094 Float_t fracClustersTPCShared = -1.;
1096 Float_t chi2PerClusterITS = -1;
1097 Float_t chi2PerClusterTPC = -1;
1098 if (nClustersITS!=0)
1099 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
1100 if (nClustersTPC!=0) {
1101 if(fCutRequireTPCStandAlone) {
1102 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1104 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
1106 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1109 Double_t extCov[15];
1110 esdTrack->GetExternalCovariance(extCov);
1114 esdTrack->GetImpactParameters(b,bCov);
1115 if (bCov[0]<=0 || bCov[2]<=0) {
1116 AliDebug(1, "Estimated b resolution lower or equal zero!");
1117 bCov[0]=0; bCov[2]=0;
1121 // set pt-dependent DCA cuts, if requested
1122 SetPtDepDCACuts(esdTrack->Pt());
1125 Float_t dcaToVertexXY = b[0];
1126 Float_t dcaToVertexZ = b[1];
1128 Float_t dcaToVertex = -1;
1130 if (fCutDCAToVertex2D)
1132 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1135 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1137 // getting the kinematic variables of the track
1138 // (assuming the mass is known)
1140 esdTrack->GetPxPyPz(p);
1142 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1143 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1144 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1146 //y-eta related calculations
1147 Float_t eta = -100.;
1149 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1150 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1151 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1152 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1156 AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1159 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1161 //########################################################################
1164 Bool_t cuts[kNCuts];
1165 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1167 // track quality cuts
1168 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1170 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1172 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1174 if (nClustersTPC<fCutMinNClusterTPC)
1176 if (nClustersITS<fCutMinNClusterITS)
1178 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1180 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1182 if (extCov[0] > fCutMaxC11)
1184 if (extCov[2] > fCutMaxC22)
1186 if (extCov[5] > fCutMaxC33)
1188 if (extCov[9] > fCutMaxC44)
1190 if (extCov[14] > fCutMaxC55)
1193 // cut 12 and 13 see below
1195 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1197 // track kinematics cut
1198 if((momentum < fPMin) || (momentum > fPMax))
1200 if((pt < fPtMin) || (pt > fPtMax))
1202 if((p[0] < fPxMin) || (p[0] > fPxMax))
1204 if((p[1] < fPyMin) || (p[1] > fPyMax))
1206 if((p[2] < fPzMin) || (p[2] > fPzMax))
1208 if((eta < fEtaMin) || (eta > fEtaMax))
1210 if((y < fRapMin) || (y > fRapMax))
1212 if (fCutDCAToVertex2D && dcaToVertex > 1)
1214 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1216 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1218 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1220 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1222 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1225 for (Int_t i = 0; i < 3; i++)
1226 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1228 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1229 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1233 // ITS standalone tracks
1234 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1235 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1236 }else if(fCutRequireITSpureSA){
1237 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1242 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1245 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1248 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1251 Int_t nITSPointsForPid=0;
1252 UChar_t clumap=esdTrack->GetITSClusterMap();
1253 for(Int_t i=2; i<6; i++){
1254 if(clumap&(1<<i)) ++nITSPointsForPid;
1256 if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1259 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1261 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1264 Int_t nMissITSpts=0;
1265 Int_t idet,statusLay;
1267 for(Int_t iLay=0; iLay<6; iLay++){
1268 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1269 if(retc && statusLay==5) ++nMissITSpts;
1271 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1274 for (Int_t i=0; i<kNCuts; i++)
1275 if (cuts[i]) {cut = kTRUE;}
1277 // for performance evaluate the CPU intensive cuts only when the others have passed, and when they are requested
1278 Double_t chi2TPCConstrainedVsGlobal = -2;
1279 Float_t nSigmaToVertex = -2;
1282 // getting the track to vertex parameters
1283 if (fCutSigmaToVertexRequired)
1285 nSigmaToVertex = GetSigmaToVertex(esdTrack);
1286 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1291 // if n sigma could not be calculated
1292 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1299 // max chi2 TPC constrained vs global track only if track passed the other cut
1300 if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
1302 const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
1305 AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
1308 const AliESDVertex* vertex = 0;
1309 if (fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTracks)
1310 vertex = esdEvent->GetPrimaryVertexTracks();
1312 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexSPD)
1313 vertex = esdEvent->GetPrimaryVertexSPD();
1315 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTPC)
1316 vertex = esdEvent->GetPrimaryVertexTPC();
1318 if (vertex->GetStatus())
1319 chi2TPCConstrainedVsGlobal = esdTrack->GetChi2TPCConstrainedVsGlobal(vertex);
1321 if (chi2TPCConstrainedVsGlobal < 0 || chi2TPCConstrainedVsGlobal > fCutMaxChi2TPCConstrainedVsGlobal)
1329 //########################################################################
1330 // filling histograms
1331 if (fHistogramsOn) {
1332 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1334 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1336 for (Int_t i=0; i<kNCuts; i++) {
1337 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1338 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1341 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1343 for (Int_t j=i; j<kNCuts; j++) {
1344 if (cuts[i] && cuts[j]) {
1345 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1346 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1347 fhCutCorrelation->Fill(xC, yC);
1353 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1354 // the code is not in a function due to too many local variables that would need to be passed
1356 for (Int_t id = 0; id < 2; id++)
1358 // id = 0 --> before cut
1359 // id = 1 --> after cut
1363 fhNClustersITS[id]->Fill(nClustersITS);
1364 fhNClustersTPC[id]->Fill(nClustersTPC);
1365 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1366 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1367 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1368 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1369 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1370 fhChi2TPCConstrainedVsGlobal[id]->Fill(chi2TPCConstrainedVsGlobal);
1371 fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1372 fhNMissingITSPoints[id]->Fill(nMissITSpts);
1374 fhC11[id]->Fill(extCov[0]);
1375 fhC22[id]->Fill(extCov[2]);
1376 fhC33[id]->Fill(extCov[5]);
1377 fhC44[id]->Fill(extCov[9]);
1378 fhC55[id]->Fill(extCov[14]);
1380 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1383 fhEta[id]->Fill(eta);
1386 bRes[0] = TMath::Sqrt(bCov[0]);
1387 bRes[1] = TMath::Sqrt(bCov[2]);
1389 fhDZ[id]->Fill(b[1]);
1390 fhDXY[id]->Fill(b[0]);
1391 fhDXYDZ[id]->Fill(dcaToVertex);
1392 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1394 if (bRes[0]!=0 && bRes[1]!=0) {
1395 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1396 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1397 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1398 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1410 //____________________________________________________________________
1411 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1413 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1417 case kOff: return kTRUE;
1418 case kNone: return !clusterL1 && !clusterL2;
1419 case kAny: return clusterL1 || clusterL2;
1420 case kFirst: return clusterL1;
1421 case kOnlyFirst: return clusterL1 && !clusterL2;
1422 case kSecond: return clusterL2;
1423 case kOnlySecond: return clusterL2 && !clusterL1;
1424 case kBoth: return clusterL1 && clusterL2;
1430 //____________________________________________________________________
1431 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(const AliESDEvent* esd, Int_t iTrack)
1433 // Utility function to create a TPC only track from the given esd track
1435 // IMPORTANT: The track has to be deleted by the user
1437 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1438 // there are only missing propagations here that are needed for old data
1439 // this function will therefore become obsolete
1441 // adapted from code provided by CKB
1443 if (!esd->GetPrimaryVertexTPC())
1444 return 0; // No TPC vertex no TPC tracks
1446 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1447 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1449 AliESDtrack* track = esd->GetTrack(iTrack);
1453 AliESDtrack *tpcTrack = new AliESDtrack();
1455 // only true if we have a tpc track
1456 if (!track->FillTPCOnlyTrack(*tpcTrack))
1465 //____________________________________________________________________
1466 TObjArray* AliESDtrackCuts::GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTPC)
1469 // returns an array of all tracks that pass the cuts
1470 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1471 // tracks that pass the cut
1473 // NOTE: List has to be deleted by the user
1475 TObjArray* acceptedTracks = new TObjArray();
1477 // loop over esd tracks
1478 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1480 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1481 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1483 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1487 if (AcceptTrack(tpcTrack)) {
1488 acceptedTracks->Add(tpcTrack);
1495 AliESDtrack* track = esd->GetTrack(iTrack);
1496 if(AcceptTrack(track))
1497 acceptedTracks->Add(track);
1500 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1501 return acceptedTracks;
1504 //____________________________________________________________________
1505 Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
1508 // returns an the number of tracks that pass the cuts
1513 // loop over esd tracks
1514 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1515 AliESDtrack* track = esd->GetTrack(iTrack);
1516 if (AcceptTrack(track))
1523 //____________________________________________________________________
1524 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1526 // diagnostics histograms are defined
1529 fHistogramsOn=kTRUE;
1531 Bool_t oldStatus = TH1::AddDirectoryStatus();
1532 TH1::AddDirectory(kFALSE);
1534 //###################################################################################
1535 // defining histograms
1537 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1539 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1540 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1542 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1544 for (Int_t i=0; i<kNCuts; i++) {
1545 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1546 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1547 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1550 fhCutStatistics ->SetLineColor(color);
1551 fhCutCorrelation ->SetLineColor(color);
1552 fhCutStatistics ->SetLineWidth(2);
1553 fhCutCorrelation ->SetLineWidth(2);
1555 for (Int_t i=0; i<2; i++) {
1556 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1557 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1558 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1559 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1560 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1561 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1562 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1563 fhChi2TPCConstrainedVsGlobal[i] = new TH1F("chi2TPCConstrainedVsGlobal","",600,-2,50);
1564 fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
1565 fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
1567 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1568 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1569 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1570 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1571 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1573 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1575 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1576 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1577 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1578 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1580 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1581 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1582 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1584 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1586 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1587 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1589 fhNClustersITS[i]->SetTitle("n ITS clusters");
1590 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1591 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1592 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1593 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1594 fhChi2TPCConstrainedVsGlobal[i]->SetTitle("#Chi^{2} TPC constrained track vs global track");
1595 fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
1596 fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
1598 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1599 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1600 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1601 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1602 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1604 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1606 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1607 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1608 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1609 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1610 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1612 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1613 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1614 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1615 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1616 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1618 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1619 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1620 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1621 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1622 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1623 fhChi2TPCConstrainedVsGlobal[i]->SetLineColor(color); fhChi2TPCConstrainedVsGlobal[i]->SetLineWidth(2);
1624 fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
1625 fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
1627 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1628 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1629 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1630 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1631 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1633 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1635 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1636 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1637 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1639 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1640 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1641 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1644 // The number of sigmas to the vertex is per definition gaussian
1645 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1646 ffDTheoretical->SetParameter(0,1);
1648 TH1::AddDirectory(oldStatus);
1651 //____________________________________________________________________
1652 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1655 // loads the histograms from a file
1656 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1662 if (!gDirectory->cd(dir))
1665 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1667 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1668 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1670 for (Int_t i=0; i<2; i++) {
1673 gDirectory->cd("before_cuts");
1676 gDirectory->cd("after_cuts");
1678 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1679 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1680 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1681 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1682 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1683 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1684 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1685 fhChi2TPCConstrainedVsGlobal[i] = dynamic_cast<TH1F*> (gDirectory->Get("fhChi2TPCConstrainedVsGlobal"));
1686 fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
1687 fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
1689 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1690 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1691 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1692 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1693 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1695 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1697 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1698 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1699 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1700 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1702 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1703 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1704 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1705 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1707 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1708 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1710 gDirectory->cd("../");
1713 gDirectory->cd("..");
1718 //____________________________________________________________________
1719 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1721 // saves the histograms in a directory (dir)
1724 if (!fHistogramsOn) {
1725 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1732 gDirectory->mkdir(dir);
1733 gDirectory->cd(dir);
1735 gDirectory->mkdir("before_cuts");
1736 gDirectory->mkdir("after_cuts");
1738 // a factor of 2 is needed since n sigma is positive
1739 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1740 ffDTheoretical->Write("nSigmaToVertexTheory");
1742 fhCutStatistics->Write();
1743 fhCutCorrelation->Write();
1745 for (Int_t i=0; i<2; i++) {
1747 gDirectory->cd("before_cuts");
1749 gDirectory->cd("after_cuts");
1751 fhNClustersITS[i] ->Write();
1752 fhNClustersTPC[i] ->Write();
1753 fhNSharedClustersTPC[i] ->Write();
1754 fhNCrossedRowsTPC[i] ->Write();
1755 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1756 fhChi2PerClusterITS[i] ->Write();
1757 fhChi2PerClusterTPC[i] ->Write();
1758 fhChi2TPCConstrainedVsGlobal[i] ->Write();
1759 fhNClustersForITSPID[i] ->Write();
1760 fhNMissingITSPoints[i] ->Write();
1768 fhRel1PtUncertainty[i] ->Write();
1772 fhDXYDZ[i] ->Write();
1773 fhDXYvsDZ[i] ->Write();
1775 fhDXYNormalized[i] ->Write();
1776 fhDZNormalized[i] ->Write();
1777 fhDXYvsDZNormalized[i] ->Write();
1778 fhNSigmaToVertex[i] ->Write();
1783 gDirectory->cd("../");
1786 gDirectory->cd("../");
1789 //____________________________________________________________________
1790 void AliESDtrackCuts::DrawHistograms()
1792 // draws some histograms
1794 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1795 canvas1->Divide(2, 2);
1798 fhNClustersTPC[0]->SetStats(kFALSE);
1799 fhNClustersTPC[0]->Draw();
1802 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1803 fhChi2PerClusterTPC[0]->Draw();
1806 fhNSigmaToVertex[0]->SetStats(kFALSE);
1807 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1808 fhNSigmaToVertex[0]->Draw();
1810 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1812 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1813 canvas2->Divide(3, 2);
1816 fhC11[0]->SetStats(kFALSE);
1821 fhC22[0]->SetStats(kFALSE);
1826 fhC33[0]->SetStats(kFALSE);
1831 fhC44[0]->SetStats(kFALSE);
1836 fhC55[0]->SetStats(kFALSE);
1841 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1843 fhRel1PtUncertainty[0]->Draw();
1845 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1847 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1848 canvas3->Divide(3, 2);
1851 fhDXY[0]->SetStats(kFALSE);
1856 fhDZ[0]->SetStats(kFALSE);
1861 fhDXYvsDZ[0]->SetStats(kFALSE);
1863 gPad->SetRightMargin(0.15);
1864 fhDXYvsDZ[0]->Draw("COLZ");
1867 fhDXYNormalized[0]->SetStats(kFALSE);
1869 fhDXYNormalized[0]->Draw();
1872 fhDZNormalized[0]->SetStats(kFALSE);
1874 fhDZNormalized[0]->Draw();
1877 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1879 gPad->SetRightMargin(0.15);
1880 fhDXYvsDZNormalized[0]->Draw("COLZ");
1882 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1884 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1885 canvas4->Divide(2, 1);
1888 fhCutStatistics->SetStats(kFALSE);
1889 fhCutStatistics->LabelsOption("v");
1890 gPad->SetBottomMargin(0.3);
1891 fhCutStatistics->Draw();
1894 fhCutCorrelation->SetStats(kFALSE);
1895 fhCutCorrelation->LabelsOption("v");
1896 gPad->SetBottomMargin(0.3);
1897 gPad->SetLeftMargin(0.3);
1898 fhCutCorrelation->Draw("COLZ");
1900 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1903 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1904 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1907 fhNClustersTPC[0]->SetStats(kFALSE);
1908 fhNClustersTPC[0]->DrawCopy();
1911 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1912 fhChi2PerClusterITS[0]->DrawCopy();
1913 fhChi2PerClusterITS[1]->SetLineColor(2);
1914 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1917 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1918 fhChi2PerClusterTPC[0]->DrawCopy();
1919 fhChi2PerClusterTPC[1]->SetLineColor(2);
1920 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1922 //--------------------------------------------------------------------------
1923 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1925 // set the pt-dependent DCA cuts
1928 if(f1CutMaxDCAToVertexXYPtDep) {
1929 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
1932 if(f1CutMaxDCAToVertexZPtDep) {
1933 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
1936 if(f1CutMinDCAToVertexXYPtDep) {
1937 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
1940 if(f1CutMinDCAToVertexZPtDep) {
1941 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
1950 //--------------------------------------------------------------------------
1951 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
1953 // Check the correctness of the string syntax
1955 Bool_t retval=kTRUE;
1957 if(!dist.Contains("pt")) {
1958 if(print) AliError("string must contain \"pt\"");
1964 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
1966 if(f1CutMaxDCAToVertexXYPtDep){
1967 delete f1CutMaxDCAToVertexXYPtDep;
1969 f1CutMaxDCAToVertexXYPtDep = 0;
1970 fCutMaxDCAToVertexXYPtDep = "";
1972 if(!CheckPtDepDCA(dist,kTRUE)){
1975 fCutMaxDCAToVertexXYPtDep = dist;
1977 tmp.ReplaceAll("pt","x");
1978 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
1982 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
1985 if(f1CutMaxDCAToVertexZPtDep){
1986 delete f1CutMaxDCAToVertexZPtDep;
1988 f1CutMaxDCAToVertexZPtDep = 0;
1989 fCutMaxDCAToVertexZPtDep = "";
1991 if(!CheckPtDepDCA(dist,kTRUE))return;
1993 fCutMaxDCAToVertexZPtDep = dist;
1995 tmp.ReplaceAll("pt","x");
1996 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
2002 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
2005 if(f1CutMinDCAToVertexXYPtDep){
2006 delete f1CutMinDCAToVertexXYPtDep;
2008 f1CutMinDCAToVertexXYPtDep = 0;
2009 fCutMinDCAToVertexXYPtDep = "";
2011 if(!CheckPtDepDCA(dist,kTRUE))return;
2013 fCutMinDCAToVertexXYPtDep = dist;
2015 tmp.ReplaceAll("pt","x");
2016 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
2021 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
2025 if(f1CutMinDCAToVertexZPtDep){
2026 delete f1CutMinDCAToVertexZPtDep;
2028 f1CutMinDCAToVertexZPtDep = 0;
2029 fCutMinDCAToVertexZPtDep = "";
2031 if(!CheckPtDepDCA(dist,kTRUE))return;
2032 fCutMinDCAToVertexZPtDep = dist;
2034 tmp.ReplaceAll("pt","x");
2035 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
2038 AliESDtrackCuts* AliESDtrackCuts::GetMultEstTrackCuts(MultEstTrackCuts cut)
2040 // returns the multiplicity estimator track cuts objects to allow for user configuration
2041 // upon first call the objects are created
2043 // the cut defined here correspond to GetStandardITSTPCTrackCuts2010 (apart from the one for without SPD)
2045 if (!fgMultEstTrackCuts[kMultEstTrackCutGlobal])
2047 // quality cut on ITS+TPC tracks
2048 fgMultEstTrackCuts[kMultEstTrackCutGlobal] = new AliESDtrackCuts();
2049 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMinNClustersTPC(70);
2050 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMaxChi2PerClusterTPC(4);
2051 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetAcceptKinkDaughters(kFALSE);
2052 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireTPCRefit(kTRUE);
2053 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireITSRefit(kTRUE);
2054 //multiplicity underestimate if we use global tracks with |eta| > 0.9
2055 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetEtaRange(-0.9, 0.9);
2057 // quality cut on ITS_SA tracks (complementary to ITS+TPC)
2058 fgMultEstTrackCuts[kMultEstTrackCutITSSA] = new AliESDtrackCuts();
2059 fgMultEstTrackCuts[kMultEstTrackCutITSSA]->SetRequireITSRefit(kTRUE);
2061 // primary selection for tracks with SPD hits
2062 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD] = new AliESDtrackCuts();
2063 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
2064 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
2065 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexZ(2);
2067 // primary selection for tracks w/o SPD hits
2068 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD] = new AliESDtrackCuts();
2069 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
2070 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
2071 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexZ(2);
2074 return fgMultEstTrackCuts[cut];
2077 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType, Float_t etaRange)
2079 // Get multiplicity estimate based on TPC/ITS tracks and tracklets
2080 // Adapted for AliESDtrackCuts from a version developed by: Ruben Shahoyan, Anton Alkin, Arvinder Palaha
2082 // Returns a negative value if no reliable estimate can be provided:
2083 // -1 SPD vertex missing
2084 // -2 SPD VertexerZ dispersion too large
2085 // -3 Track vertex missing (not checked for kTracklets)
2086 // -4 Distance between SPD and track vertices too large (not checked for kTracklets)
2088 // WARNING This functions does not cut on the z vtx. Depending on the eta range requested, you need to restrict your z vertex range!
2090 // Strategy for combined estimators
2091 // 1. Count global tracks and flag them
2092 // 2. Count ITSSA as complementaries for ITSTPC+ or as main tracks
2093 // 3. Count the complementary SPD tracklets
2095 const AliESDVertex* vertices[2];
2096 vertices[0] = esd->GetPrimaryVertexSPD();
2097 vertices[1] = esd->GetPrimaryVertexTracks();
2099 if (!vertices[0]->GetStatus())
2101 AliDebugClass(AliLog::kDebug, "No SPD vertex. Not able to make a reliable multiplicity estimate.");
2105 if (vertices[0]->IsFromVertexerZ() && vertices[0]->GetDispersion() > 0.02)
2107 AliDebugClass(AliLog::kDebug, "Vertexer z dispersion > 0.02. Not able to make a reliable multiplicity estimate.");
2111 Int_t multiplicityEstimate = 0;
2113 // SPD tracklet-only estimate
2114 if (trackType == kTracklets)
2116 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2117 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i)
2119 if (TMath::Abs(spdmult->GetEta(i)) > etaRange)
2120 continue; // eta selection for tracklets
2121 multiplicityEstimate++;
2123 return multiplicityEstimate;
2126 if (!vertices[1]->GetStatus())
2128 AliDebugClass(AliLog::kDebug, "No track vertex. Not able to make a reliable multiplicity estimate.");
2132 // TODO value of displacement to be studied
2133 const Float_t maxDisplacement = 0.5;
2134 //check for displaced vertices
2135 Double_t displacement = TMath::Abs(vertices[0]->GetZ() - vertices[1]->GetZ());
2136 if (displacement > maxDisplacement)
2138 AliDebugClass(AliLog::kDebug, Form("Displaced vertices %f > %f",displacement,maxDisplacement));
2142 // update eta range in track cuts
2143 GetMultEstTrackCuts(kMultEstTrackCutITSSA)->SetEtaRange(-etaRange, etaRange);
2144 GetMultEstTrackCuts(kMultEstTrackCutDCAwSPD)->SetEtaRange(-etaRange, etaRange);
2145 GetMultEstTrackCuts(kMultEstTrackCutDCAwoSPD)->SetEtaRange(-etaRange, etaRange);
2147 //*******************************************************************************************************
2148 //set counters to initial zeros
2149 Int_t tracksITSTPC = 0; //number of global tracks for a given event
2150 Int_t tracksITSSA = 0; //number of ITS standalone tracks for a given event
2151 Int_t tracksITSTPCSA_complementary = 0; //number of ITS standalone tracks complementary to TPC for a given event
2152 Int_t trackletsITSTPC_complementary = 0;//number of SPD tracklets complementary to global/ITSSA tracks for a given events
2153 Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
2155 const Int_t nESDTracks = esd->GetNumberOfTracks();
2156 Int_t highestID = 0;
2158 // flags for secondary and rejected tracks
2159 const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
2160 const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
2162 for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
2163 if(esd->GetTrack(itracks)->GetLabel() > highestID) highestID = esd->GetTrack(itracks)->GetLabel();
2164 esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
2166 const Int_t maxid = highestID+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
2168 // bit mask for esd tracks, to check if multiple tracklets are associated to it
2169 Bool_t globalBits[maxid], pureITSBits[maxid];
2170 for(Int_t i=0; i<maxid; i++){ // set all bools to false
2171 globalBits[i]=kFALSE;
2172 pureITSBits[i]=kFALSE;
2175 //*******************************************************************************************************
2176 // get multiplicity from global tracks
2177 for(Int_t itracks = 0; itracks < nESDTracks; itracks++) { // flag the tracks
2178 AliESDtrack* track = esd->GetTrack(itracks);
2180 // if track is a secondary from a V0, flag as a secondary
2181 if (track->IsOn(AliESDtrack::kMultInV0)) {
2182 track->SetBit(kSecBit);
2187 if (track->IsOn(AliESDtrack::kMultSec)) {
2188 track->SetBit(kSecBit);
2192 // check tracks with ITS part
2193 //*******************************************************************************************************
2194 if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
2195 //*******************************************************************************************************
2197 if (track->IsOn(AliESDtrack::kTPCin)) { // Global track, has ITS and TPC contributions
2198 if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
2199 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2200 tracksITSTPC++; //global track counted
2201 globalBits[itracks] = kTRUE;
2203 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2205 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2207 //*******************************************************************************************************
2208 // ITS complementary
2209 else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
2210 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2211 tracksITSTPCSA_complementary++;
2212 globalBits[itracks] = kTRUE;
2214 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2216 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2218 //*******************************************************************************************************
2219 // check tracks from ITS_SA_PURE
2220 if (track->IsOn(AliESDtrack::kITSin) && track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSSA){
2221 if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
2222 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2224 pureITSBits[itracks] = kTRUE;
2226 else track->SetBit(kRejBit);
2228 else track->SetBit(kRejBit);
2230 }//ESD tracks counted
2232 //*******************************************************************************************************
2233 // get multiplicity from ITS tracklets to complement TPC+ITS, and ITSpureSA
2234 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2235 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i) {
2236 if (TMath::Abs(spdmult->GetEta(i)) > etaRange) continue; // eta selection for tracklets
2238 // if counting tracks+tracklets, check if clusters were already used in tracks
2239 Int_t id1,id2,id3,id4;
2240 spdmult->GetTrackletTrackIDs(i,0,id1,id2); // references for eventual Global/ITS_SA tracks
2241 AliESDtrack* tr1 = id1>=0 ? esd->GetTrack(id1) : 0;
2242 spdmult->GetTrackletTrackIDs(i,1,id3,id4); // references for eventual ITS_SA_pure tracks
2243 AliESDtrack* tr3 = id3>=0 ? esd->GetTrack(id3) : 0;
2245 // are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
2246 if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
2248 Bool_t bUsedInGlobal = (id1 != -1) ? globalBits[id1] : 0;// has associated global track been associated to a previous tracklet?
2249 Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits[id3] : 0;// has associated pure ITS track been associated to a previous tracklet?
2250 //*******************************************************************************************************
2251 if (trackType == kTrackletsITSTPC) {
2252 // count tracklets towards global+complementary tracks
2253 if ( (tr1 && !tr1->TestBit(kSecBit)) && // reject as secondary
2254 (tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2256 ++trackletsITSTPC_complementary;
2257 if(id1>0) globalBits[id1] = kTRUE; // mark global track linked to this tracklet as "associated"
2261 ++trackletsITSTPC_complementary; // if no associated track, count the tracklet
2264 // count tracklets towards ITS_SA_pure tracks
2265 if ( (tr3 && !tr3->TestBit(kSecBit)) && // reject as secondary
2266 (tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2267 if(!bUsedInPureITS) {
2268 ++trackletsITSSA_complementary;
2269 if(id3>0) pureITSBits[id3] = kTRUE; // mark global track linked to this tracklet as "associated"
2273 ++trackletsITSSA_complementary; // if no associated track, count the tracklet
2278 //*******************************************************************************************************
2279 if (trackType == kTrackletsITSTPC)
2280 multiplicityEstimate = tracksITSTPC + tracksITSTPCSA_complementary + trackletsITSTPC_complementary;
2282 multiplicityEstimate = tracksITSSA + trackletsITSSA_complementary;
2284 return multiplicityEstimate;