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",
73 "n crossed rows / n findable clusters",
77 //____________________________________________________________________
78 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
79 fCutMinNClusterTPC(0),
80 fCutMinNClusterITS(0),
81 fCutMinNCrossedRowsTPC(0),
82 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
83 fCutMaxChi2PerClusterTPC(0),
84 fCutMaxChi2PerClusterITS(0),
85 fCutMaxMissingITSPoints(0),
91 fCutMaxRel1PtUncertainty(0),
92 fCutAcceptKinkDaughters(0),
93 fCutAcceptSharedTPCClusters(0),
94 fCutMaxFractionSharedTPCClusters(0),
95 fCutRequireTPCRefit(0),
96 fCutRequireTPCStandAlone(0),
97 fCutRequireITSRefit(0),
99 fCutRequireITSStandAlone(0),
100 fCutRequireITSpureSA(0),
101 fCutNsigmaToVertex(0),
102 fCutSigmaToVertexRequired(0),
103 fCutMaxDCAToVertexXY(0),
104 fCutMaxDCAToVertexZ(0),
105 fCutMinDCAToVertexXY(0),
106 fCutMinDCAToVertexZ(0),
107 fCutMaxDCAToVertexXYPtDep(""),
108 fCutMaxDCAToVertexZPtDep(""),
109 fCutMinDCAToVertexXYPtDep(""),
110 fCutMinDCAToVertexZPtDep(""),
111 f1CutMaxDCAToVertexXYPtDep(0x0),
112 f1CutMaxDCAToVertexZPtDep(0x0),
113 f1CutMinDCAToVertexXYPtDep(0x0),
114 f1CutMinDCAToVertexZPtDep(0x0),
115 fCutDCAToVertex2D(0),
141 //##############################################################################
142 // setting default cuts
143 SetMinNClustersTPC();
144 SetMinNClustersITS();
145 SetMinNCrossedRowsTPC();
146 SetMinRatioCrossedRowsOverFindableClustersTPC();
147 SetMaxChi2PerClusterTPC();
148 SetMaxChi2PerClusterITS();
149 SetMaxNOfMissingITSPoints();
150 SetMaxCovDiagonalElements();
151 SetMaxRel1PtUncertainty();
152 SetRequireTPCRefit();
153 SetRequireTPCStandAlone();
154 SetRequireITSRefit();
155 SetRequireITSPid(kFALSE);
156 SetRequireITSStandAlone(kFALSE);
157 SetRequireITSPureStandAlone(kFALSE);
158 SetAcceptKinkDaughters();
159 SetAcceptSharedTPCClusters();
160 SetMaxFractionSharedTPCClusters();
161 SetMaxNsigmaToVertex();
162 SetMaxDCAToVertexXY();
163 SetMaxDCAToVertexZ();
165 SetMinDCAToVertexXY();
166 SetMinDCAToVertexZ();
174 SetClusterRequirementITS(kSPD);
175 SetClusterRequirementITS(kSDD);
176 SetClusterRequirementITS(kSSD);
181 //_____________________________________________________________________________
182 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
183 fCutMinNClusterTPC(0),
184 fCutMinNClusterITS(0),
185 fCutMinNCrossedRowsTPC(0),
186 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
187 fCutMaxChi2PerClusterTPC(0),
188 fCutMaxChi2PerClusterITS(0),
189 fCutMaxMissingITSPoints(0),
195 fCutMaxRel1PtUncertainty(0),
196 fCutAcceptKinkDaughters(0),
197 fCutAcceptSharedTPCClusters(0),
198 fCutMaxFractionSharedTPCClusters(0),
199 fCutRequireTPCRefit(0),
200 fCutRequireTPCStandAlone(0),
201 fCutRequireITSRefit(0),
202 fCutRequireITSPid(0),
203 fCutRequireITSStandAlone(0),
204 fCutRequireITSpureSA(0),
205 fCutNsigmaToVertex(0),
206 fCutSigmaToVertexRequired(0),
207 fCutMaxDCAToVertexXY(0),
208 fCutMaxDCAToVertexZ(0),
209 fCutMinDCAToVertexXY(0),
210 fCutMinDCAToVertexZ(0),
211 fCutMaxDCAToVertexXYPtDep(""),
212 fCutMaxDCAToVertexZPtDep(""),
213 fCutMinDCAToVertexXYPtDep(""),
214 fCutMinDCAToVertexZPtDep(""),
215 f1CutMaxDCAToVertexXYPtDep(0x0),
216 f1CutMaxDCAToVertexZPtDep(0x0),
217 f1CutMinDCAToVertexXYPtDep(0x0),
218 f1CutMinDCAToVertexZPtDep(0x0),
219 fCutDCAToVertex2D(0),
243 ((AliESDtrackCuts &) c).Copy(*this);
246 AliESDtrackCuts::~AliESDtrackCuts()
252 for (Int_t i=0; i<2; i++) {
254 if (fhNClustersITS[i])
255 delete fhNClustersITS[i];
256 if (fhNClustersTPC[i])
257 delete fhNClustersTPC[i];
258 if (fhNSharedClustersTPC[i])
259 delete fhNSharedClustersTPC[i];
260 if (fhNCrossedRowsTPC[i])
261 delete fhNCrossedRowsTPC[i];
262 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
263 delete fhRatioCrossedRowsOverFindableClustersTPC[i];
264 if (fhChi2PerClusterITS[i])
265 delete fhChi2PerClusterITS[i];
266 if (fhChi2PerClusterTPC[i])
267 delete fhChi2PerClusterTPC[i];
279 if (fhRel1PtUncertainty[i])
280 delete fhRel1PtUncertainty[i];
291 if (fhDXYNormalized[i])
292 delete fhDXYNormalized[i];
293 if (fhDZNormalized[i])
294 delete fhDZNormalized[i];
295 if (fhDXYvsDZNormalized[i])
296 delete fhDXYvsDZNormalized[i];
297 if (fhNSigmaToVertex[i])
298 delete fhNSigmaToVertex[i];
305 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
306 f1CutMaxDCAToVertexXYPtDep = 0;
307 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
308 f1CutMaxDCAToVertexZPtDep = 0;
309 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
310 f1CutMinDCAToVertexXYPtDep = 0;
311 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
312 f1CutMinDCAToVertexZPtDep = 0;
316 delete ffDTheoretical;
319 delete fhCutStatistics;
320 if (fhCutCorrelation)
321 delete fhCutCorrelation;
324 void AliESDtrackCuts::Init()
327 // sets everything to zero
330 fCutMinNClusterTPC = 0;
331 fCutMinNClusterITS = 0;
333 fCutMaxChi2PerClusterTPC = 0;
334 fCutMaxChi2PerClusterITS = 0;
335 fCutMaxMissingITSPoints = 0;
337 for (Int_t i = 0; i < 3; i++)
338 fCutClusterRequirementITS[i] = kOff;
346 fCutMaxRel1PtUncertainty = 0;
348 fCutAcceptKinkDaughters = 0;
349 fCutAcceptSharedTPCClusters = 0;
350 fCutMaxFractionSharedTPCClusters = 0;
351 fCutRequireTPCRefit = 0;
352 fCutRequireTPCStandAlone = 0;
353 fCutRequireITSRefit = 0;
354 fCutRequireITSPid = 0;
355 fCutRequireITSStandAlone = 0;
356 fCutRequireITSpureSA = 0;
358 fCutNsigmaToVertex = 0;
359 fCutSigmaToVertexRequired = 0;
360 fCutMaxDCAToVertexXY = 0;
361 fCutMaxDCAToVertexZ = 0;
362 fCutDCAToVertex2D = 0;
363 fCutMinDCAToVertexXY = 0;
364 fCutMinDCAToVertexZ = 0;
365 fCutMaxDCAToVertexXYPtDep = "";
366 fCutMaxDCAToVertexZPtDep = "";
367 fCutMinDCAToVertexXYPtDep = "";
368 fCutMinDCAToVertexZPtDep = "";
370 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
371 f1CutMaxDCAToVertexXYPtDep = 0;
372 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
373 f1CutMaxDCAToVertexXYPtDep = 0;
374 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
375 f1CutMaxDCAToVertexZPtDep = 0;
376 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
377 f1CutMinDCAToVertexXYPtDep = 0;
378 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
379 f1CutMinDCAToVertexZPtDep = 0;
397 fHistogramsOn = kFALSE;
399 for (Int_t i=0; i<2; ++i)
401 fhNClustersITS[i] = 0;
402 fhNClustersTPC[i] = 0;
403 fhNSharedClustersTPC[i] = 0;
404 fhNCrossedRowsTPC[i] = 0;
405 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
407 fhChi2PerClusterITS[i] = 0;
408 fhChi2PerClusterTPC[i] = 0;
416 fhRel1PtUncertainty[i] = 0;
423 fhDXYNormalized[i] = 0;
424 fhDZNormalized[i] = 0;
425 fhDXYvsDZNormalized[i] = 0;
426 fhNSigmaToVertex[i] = 0;
434 fhCutCorrelation = 0;
437 //_____________________________________________________________________________
438 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
441 // Assignment operator
444 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
448 //_____________________________________________________________________________
449 void AliESDtrackCuts::Copy(TObject &c) const
455 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
459 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
460 target.fCutMinNClusterITS = fCutMinNClusterITS;
461 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
462 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
465 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
466 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
467 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
469 for (Int_t i = 0; i < 3; i++)
470 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
472 target.fCutMaxC11 = fCutMaxC11;
473 target.fCutMaxC22 = fCutMaxC22;
474 target.fCutMaxC33 = fCutMaxC33;
475 target.fCutMaxC44 = fCutMaxC44;
476 target.fCutMaxC55 = fCutMaxC55;
478 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
480 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
481 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
482 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
483 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
484 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
485 target.fCutRequireITSRefit = fCutRequireITSRefit;
486 target.fCutRequireITSPid = fCutRequireITSPid;
487 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
488 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
490 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
491 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
492 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
493 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
494 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
495 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
496 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
498 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
499 target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
501 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
502 target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
504 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
505 target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
507 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
508 target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
510 target.fPMin = fPMin;
511 target.fPMax = fPMax;
512 target.fPtMin = fPtMin;
513 target.fPtMax = fPtMax;
514 target.fPxMin = fPxMin;
515 target.fPxMax = fPxMax;
516 target.fPyMin = fPyMin;
517 target.fPyMax = fPyMax;
518 target.fPzMin = fPzMin;
519 target.fPzMax = fPzMax;
520 target.fEtaMin = fEtaMin;
521 target.fEtaMax = fEtaMax;
522 target.fRapMin = fRapMin;
523 target.fRapMax = fRapMax;
525 target.fHistogramsOn = fHistogramsOn;
527 for (Int_t i=0; i<2; ++i)
529 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
530 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
531 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
532 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
533 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
535 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
536 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
538 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
539 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
540 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
541 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
542 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
544 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
546 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
547 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
548 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
549 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
551 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
552 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
553 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
554 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
556 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
557 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
559 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
561 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
562 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
567 //_____________________________________________________________________________
568 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
569 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
570 // Returns the number of merged objects (including this)
577 TIterator* iter = list->MakeIterator();
580 // collection of measured and generated histograms
582 while ((obj = iter->Next())) {
584 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
588 if (!entry->fHistogramsOn)
591 for (Int_t i=0; i<2; i++) {
593 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
594 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
595 if (fhNSharedClustersTPC[i])
596 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
597 if (fhNCrossedRowsTPC[i])
598 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
599 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
600 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
602 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
603 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
605 fhC11[i] ->Add(entry->fhC11[i] );
606 fhC22[i] ->Add(entry->fhC22[i] );
607 fhC33[i] ->Add(entry->fhC33[i] );
608 fhC44[i] ->Add(entry->fhC44[i] );
609 fhC55[i] ->Add(entry->fhC55[i] );
611 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
613 fhDXY[i] ->Add(entry->fhDXY[i] );
614 fhDZ[i] ->Add(entry->fhDZ[i] );
615 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
616 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
618 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
619 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
620 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
621 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
623 fhPt[i] ->Add(entry->fhPt[i]);
624 fhEta[i] ->Add(entry->fhEta[i]);
627 fhCutStatistics ->Add(entry->fhCutStatistics);
628 fhCutCorrelation ->Add(entry->fhCutCorrelation);
635 //____________________________________________________________________
636 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
638 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
640 Printf("AliESDtrackCuts::GetStandardTPCOnlyTrackCuts: Creating track cuts for TPC-only.");
642 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
644 esdTrackCuts->SetMinNClustersTPC(50);
645 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
646 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
648 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
649 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
650 esdTrackCuts->SetDCAToVertex2D(kTRUE);
655 //____________________________________________________________________
656 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
658 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
660 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
662 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
665 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
666 esdTrackCuts->SetMinNClustersTPC(70);
667 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
668 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
669 esdTrackCuts->SetRequireTPCRefit(kTRUE);
671 esdTrackCuts->SetRequireITSRefit(kTRUE);
672 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
673 AliESDtrackCuts::kAny);
675 // 7*(0.0050+0.0060/pt^0.9)
676 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
678 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
679 esdTrackCuts->SetDCAToVertex2D(kFALSE);
680 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
681 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
686 //____________________________________________________________________
687 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
689 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
690 // if clusterCut = 1, the cut on the number of clusters is replaced by
691 // a cut on the number of crossed rows and on the ration crossed
692 // rows/findable clusters
694 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
696 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
699 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
700 else if (clusterCut == 1) {
701 esdTrackCuts->SetMinNCrossedRowsTPC(70);
702 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
705 Printf("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut);
706 esdTrackCuts->SetMinNClustersTPC(70);
708 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
709 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
710 esdTrackCuts->SetRequireTPCRefit(kTRUE);
712 esdTrackCuts->SetRequireITSRefit(kTRUE);
713 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
714 AliESDtrackCuts::kAny);
716 // 7*(0.0026+0.0050/pt^1.01)
717 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
719 esdTrackCuts->SetMaxDCAToVertexZ(2);
720 esdTrackCuts->SetDCAToVertex2D(kFALSE);
721 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
726 //____________________________________________________________________
730 //____________________________________________________________________
731 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
733 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
735 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
736 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
737 esdTrackCuts->SetRequireITSRefit(kTRUE);
738 esdTrackCuts->SetMinNClustersITS(4);
739 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
740 AliESDtrackCuts::kAny);
741 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
744 // 7*(0.0085+0.0026/pt^1.55)
745 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
748 esdTrackCuts->SetRequireITSPid(kTRUE);
753 //____________________________________________________________________
754 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
756 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
758 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
759 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
760 esdTrackCuts->SetRequireITSRefit(kTRUE);
761 esdTrackCuts->SetMinNClustersITS(4);
762 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
763 AliESDtrackCuts::kAny);
764 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
767 // 7*(0.0033+0.0045/pt^1.3)
768 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
771 esdTrackCuts->SetRequireITSPid(kTRUE);
776 //____________________________________________________________________
777 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
779 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
781 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
782 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
783 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
784 esdTrackCuts->SetRequireITSRefit(kTRUE);
785 esdTrackCuts->SetMinNClustersITS(4);
786 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
787 AliESDtrackCuts::kAny);
788 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
791 // 7*(0.0085+0.0026/pt^1.55)
792 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
795 esdTrackCuts->SetRequireITSPid(kTRUE);
800 //____________________________________________________________________
801 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
803 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
805 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
806 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
807 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
808 esdTrackCuts->SetRequireITSRefit(kTRUE);
809 esdTrackCuts->SetMinNClustersITS(4);
810 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
811 AliESDtrackCuts::kAny);
812 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
815 // 7*(0.0033+0.0045/pt^1.3)
816 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
819 esdTrackCuts->SetRequireITSPid(kTRUE);
824 //____________________________________________________________________
825 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
827 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
829 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
830 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
835 //____________________________________________________________________
836 Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly)
838 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
839 // tpcOnly = kTRUE -> consider TPC-only tracks
840 // = kFALSE -> consider global tracks
844 Printf("AliESDtrackCuts::GetReferenceMultiplicity: Not implemented for global tracks!");
848 static AliESDtrackCuts* esdTrackCuts = 0;
851 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
852 esdTrackCuts->SetEtaRange(-0.8, 0.8);
853 esdTrackCuts->SetPtRange(0.15);
856 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
861 //____________________________________________________________________
862 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* const esdTrack)
864 // Calculates the number of sigma to the vertex.
869 esdTrack->GetImpactParameters(b,bCov);
871 if (bCov[0]<=0 || bCov[2]<=0) {
872 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
873 bCov[0]=0; bCov[2]=0;
875 bRes[0] = TMath::Sqrt(bCov[0]);
876 bRes[1] = TMath::Sqrt(bCov[2]);
878 // -----------------------------------
879 // How to get to a n-sigma cut?
881 // The accumulated statistics from 0 to d is
883 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
884 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
886 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
887 // Can this be expressed in a different way?
889 if (bRes[0] == 0 || bRes[1] ==0)
892 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
894 // work around precision problem
895 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
896 // 1e-15 corresponds to nsigma ~ 7.7
897 if (TMath::Exp(-d * d / 2) < 1e-15)
900 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
904 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
906 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
908 tree->SetBranchStatus("fTracks.fFlags", 1);
909 tree->SetBranchStatus("fTracks.fITSncls", 1);
910 tree->SetBranchStatus("fTracks.fTPCncls", 1);
911 tree->SetBranchStatus("fTracks.fITSchi2", 1);
912 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
913 tree->SetBranchStatus("fTracks.fC*", 1);
914 tree->SetBranchStatus("fTracks.fD", 1);
915 tree->SetBranchStatus("fTracks.fZ", 1);
916 tree->SetBranchStatus("fTracks.fCdd", 1);
917 tree->SetBranchStatus("fTracks.fCdz", 1);
918 tree->SetBranchStatus("fTracks.fCzz", 1);
919 tree->SetBranchStatus("fTracks.fP*", 1);
920 tree->SetBranchStatus("fTracks.fR*", 1);
921 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
924 //____________________________________________________________________
925 Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
928 // figure out if the tracks survives all the track cuts defined
930 // the different quality parameter and kinematic values are first
931 // retrieved from the track. then it is found out what cuts the
932 // track did not survive and finally the cuts are imposed.
934 // this function needs the following branches:
940 // fTracks.fC //GetExternalCovariance
941 // fTracks.fD //GetImpactParameters
942 // fTracks.fZ //GetImpactParameters
943 // fTracks.fCdd //GetImpactParameters
944 // fTracks.fCdz //GetImpactParameters
945 // fTracks.fCzz //GetImpactParameters
946 // fTracks.fP //GetPxPyPz
947 // fTracks.fR //GetMass
948 // fTracks.fP //GetMass
949 // fTracks.fKinkIndexes
951 UInt_t status = esdTrack->GetStatus();
953 // getting quality parameters from the ESD track
954 Int_t nClustersITS = esdTrack->GetITSclusters(0);
955 Int_t nClustersTPC = -1;
956 if(fCutRequireTPCStandAlone) {
957 nClustersTPC = esdTrack->GetTPCNclsIter1();
960 nClustersTPC = esdTrack->GetTPCclusters(0);
962 Float_t nCrossedRowsTPC = esdTrack->GetTPCClusterInfo(2,1);
963 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
964 if (esdTrack->GetTPCNclsF()>0) {
965 ratioCrossedRowsOverFindableClustersTPC = esdTrack->GetTPCClusterInfo(2,1)/esdTrack->GetTPCNclsF();
968 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
969 Float_t fracClustersTPCShared = -1.;
971 Float_t chi2PerClusterITS = -1;
972 Float_t chi2PerClusterTPC = -1;
974 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
975 if (nClustersTPC!=0) {
976 if(fCutRequireTPCStandAlone) {
977 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
979 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
981 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
985 esdTrack->GetExternalCovariance(extCov);
987 // getting the track to vertex parameters
988 Float_t nSigmaToVertex = GetSigmaToVertex(esdTrack);
992 esdTrack->GetImpactParameters(b,bCov);
993 if (bCov[0]<=0 || bCov[2]<=0) {
994 AliDebug(1, "Estimated b resolution lower or equal zero!");
995 bCov[0]=0; bCov[2]=0;
999 // set pt-dependent DCA cuts, if requested
1000 SetPtDepDCACuts(esdTrack->Pt());
1003 Float_t dcaToVertexXY = b[0];
1004 Float_t dcaToVertexZ = b[1];
1006 Float_t dcaToVertex = -1;
1008 if (fCutDCAToVertex2D)
1010 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1013 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1015 // getting the kinematic variables of the track
1016 // (assuming the mass is known)
1018 esdTrack->GetPxPyPz(p);
1020 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1021 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1022 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1024 //y-eta related calculations
1025 Float_t eta = -100.;
1027 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1028 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1029 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1030 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1034 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]);
1037 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1039 //########################################################################
1042 Bool_t cuts[kNCuts];
1043 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1045 // track quality cuts
1046 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1048 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1050 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1052 if (nClustersTPC<fCutMinNClusterTPC)
1054 if (nClustersITS<fCutMinNClusterITS)
1056 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1058 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1060 if (extCov[0] > fCutMaxC11)
1062 if (extCov[2] > fCutMaxC22)
1064 if (extCov[5] > fCutMaxC33)
1066 if (extCov[9] > fCutMaxC44)
1068 if (extCov[14] > fCutMaxC55)
1070 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1072 // if n sigma could not be calculated
1073 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1075 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1077 // track kinematics cut
1078 if((momentum < fPMin) || (momentum > fPMax))
1080 if((pt < fPtMin) || (pt > fPtMax))
1082 if((p[0] < fPxMin) || (p[0] > fPxMax))
1084 if((p[1] < fPyMin) || (p[1] > fPyMax))
1086 if((p[2] < fPzMin) || (p[2] > fPzMax))
1088 if((eta < fEtaMin) || (eta > fEtaMax))
1090 if((y < fRapMin) || (y > fRapMax))
1092 if (fCutDCAToVertex2D && dcaToVertex > 1)
1094 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1096 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1098 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1100 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1102 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1105 for (Int_t i = 0; i < 3; i++)
1106 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1108 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1109 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1113 // ITS standalone tracks
1114 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1115 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1116 }else if(fCutRequireITSpureSA){
1117 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1122 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1125 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1128 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1131 if(fCutRequireITSPid){
1132 UChar_t clumap=esdTrack->GetITSClusterMap();
1133 Int_t nPointsForPid=0;
1134 for(Int_t i=2; i<6; i++){
1135 if(clumap&(1<<i)) ++nPointsForPid;
1137 if(nPointsForPid<3) cuts[35] = kTRUE;
1140 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1142 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1145 Int_t nMissITSpts=0;
1146 Int_t idet,statusLay;
1148 for(Int_t iLay=0; iLay<6; iLay++){
1149 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1150 if(retc && statusLay==5) ++nMissITSpts;
1152 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1155 for (Int_t i=0; i<kNCuts; i++)
1156 if (cuts[i]) {cut = kTRUE;}
1159 //########################################################################
1160 // filling histograms
1161 if (fHistogramsOn) {
1162 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1164 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1166 for (Int_t i=0; i<kNCuts; i++) {
1167 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1168 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1171 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1173 for (Int_t j=i; j<kNCuts; j++) {
1174 if (cuts[i] && cuts[j]) {
1175 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1176 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1177 fhCutCorrelation->Fill(xC, yC);
1183 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1184 // the code is not in a function due to too many local variables that would need to be passed
1186 for (Int_t id = 0; id < 2; id++)
1188 // id = 0 --> before cut
1189 // id = 1 --> after cut
1193 fhNClustersITS[id]->Fill(nClustersITS);
1194 fhNClustersTPC[id]->Fill(nClustersTPC);
1195 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1196 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1197 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1198 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1199 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1201 fhC11[id]->Fill(extCov[0]);
1202 fhC22[id]->Fill(extCov[2]);
1203 fhC33[id]->Fill(extCov[5]);
1204 fhC44[id]->Fill(extCov[9]);
1205 fhC55[id]->Fill(extCov[14]);
1207 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1210 fhEta[id]->Fill(eta);
1213 bRes[0] = TMath::Sqrt(bCov[0]);
1214 bRes[1] = TMath::Sqrt(bCov[2]);
1216 fhDZ[id]->Fill(b[1]);
1217 fhDXY[id]->Fill(b[0]);
1218 fhDXYDZ[id]->Fill(dcaToVertex);
1219 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1221 if (bRes[0]!=0 && bRes[1]!=0) {
1222 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1223 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1224 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1225 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1237 //____________________________________________________________________
1238 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1240 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1244 case kOff: return kTRUE;
1245 case kNone: return !clusterL1 && !clusterL2;
1246 case kAny: return clusterL1 || clusterL2;
1247 case kFirst: return clusterL1;
1248 case kOnlyFirst: return clusterL1 && !clusterL2;
1249 case kSecond: return clusterL2;
1250 case kOnlySecond: return clusterL2 && !clusterL1;
1251 case kBoth: return clusterL1 && clusterL2;
1257 //____________________________________________________________________
1258 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
1261 // Utility function to
1262 // create a TPC only track from the given esd track
1264 // IMPORTANT: The track has to be deleted by the user
1266 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1267 // there are only missing propagations here that are needed for old data
1268 // this function will therefore become obsolete
1270 // adapted from code provided by CKB
1272 if (!esd->GetPrimaryVertexTPC())
1273 return 0; // No TPC vertex no TPC tracks
1275 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1276 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1278 AliESDtrack* track = esd->GetTrack(iTrack);
1282 AliESDtrack *tpcTrack = new AliESDtrack();
1284 // only true if we have a tpc track
1285 if (!track->FillTPCOnlyTrack(*tpcTrack))
1291 // propagate to Vertex
1292 // not needed for normal reconstructed ESDs...
1293 // Double_t pTPC[2],covTPC[3];
1294 // tpcTrack->PropagateToDCA(esd->GetPrimaryVertexTPC(), esd->GetMagneticField(), 10000, pTPC, covTPC);
1299 //____________________________________________________________________
1300 TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
1303 // returns an array of all tracks that pass the cuts
1304 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1305 // tracks that pass the cut
1307 // NOTE: List has to be deleted by the user
1309 TObjArray* acceptedTracks = new TObjArray();
1311 // loop over esd tracks
1312 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1314 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1315 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1317 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1321 if (AcceptTrack(tpcTrack)) {
1322 acceptedTracks->Add(tpcTrack);
1329 AliESDtrack* track = esd->GetTrack(iTrack);
1330 if(AcceptTrack(track))
1331 acceptedTracks->Add(track);
1334 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1335 return acceptedTracks;
1338 //____________________________________________________________________
1339 Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* const esd)
1342 // returns an the number of tracks that pass the cuts
1347 // loop over esd tracks
1348 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1349 AliESDtrack* track = esd->GetTrack(iTrack);
1350 if (AcceptTrack(track))
1357 //____________________________________________________________________
1358 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1360 // diagnostics histograms are defined
1363 fHistogramsOn=kTRUE;
1365 Bool_t oldStatus = TH1::AddDirectoryStatus();
1366 TH1::AddDirectory(kFALSE);
1368 //###################################################################################
1369 // defining histograms
1371 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1373 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1374 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1376 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1378 for (Int_t i=0; i<kNCuts; i++) {
1379 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1380 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1381 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1384 fhCutStatistics ->SetLineColor(color);
1385 fhCutCorrelation ->SetLineColor(color);
1386 fhCutStatistics ->SetLineWidth(2);
1387 fhCutCorrelation ->SetLineWidth(2);
1389 for (Int_t i=0; i<2; i++) {
1390 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1391 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1392 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1393 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1394 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1395 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1396 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1398 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1399 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1400 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1401 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1402 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1404 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1406 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1407 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1408 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1409 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1411 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1412 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1413 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1415 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1417 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1418 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1420 fhNClustersITS[i]->SetTitle("n ITS clusters");
1421 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1422 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1423 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1424 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1426 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1427 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1428 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1429 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1430 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1432 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1434 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1435 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1436 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1437 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1438 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1440 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1441 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1442 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1443 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1444 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1446 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1447 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1448 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1449 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1450 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1452 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1453 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1454 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1455 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1456 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1458 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1460 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1461 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1462 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1464 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1465 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1466 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1469 // The number of sigmas to the vertex is per definition gaussian
1470 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1471 ffDTheoretical->SetParameter(0,1);
1473 TH1::AddDirectory(oldStatus);
1476 //____________________________________________________________________
1477 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1480 // loads the histograms from a file
1481 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1487 if (!gDirectory->cd(dir))
1490 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1492 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1493 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1495 for (Int_t i=0; i<2; i++) {
1498 gDirectory->cd("before_cuts");
1501 gDirectory->cd("after_cuts");
1503 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1504 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1505 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1506 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1507 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1508 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1509 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1511 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1512 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1513 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1514 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1515 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1517 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1519 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1520 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1521 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1522 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1524 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1525 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1526 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1527 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1529 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1530 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1532 gDirectory->cd("../");
1535 gDirectory->cd("..");
1540 //____________________________________________________________________
1541 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1543 // saves the histograms in a directory (dir)
1546 if (!fHistogramsOn) {
1547 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1554 gDirectory->mkdir(dir);
1555 gDirectory->cd(dir);
1557 gDirectory->mkdir("before_cuts");
1558 gDirectory->mkdir("after_cuts");
1560 // a factor of 2 is needed since n sigma is positive
1561 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1562 ffDTheoretical->Write("nSigmaToVertexTheory");
1564 fhCutStatistics->Write();
1565 fhCutCorrelation->Write();
1567 for (Int_t i=0; i<2; i++) {
1569 gDirectory->cd("before_cuts");
1571 gDirectory->cd("after_cuts");
1573 fhNClustersITS[i] ->Write();
1574 fhNClustersTPC[i] ->Write();
1575 fhNSharedClustersTPC[i] ->Write();
1576 fhNCrossedRowsTPC[i] ->Write();
1577 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1578 fhChi2PerClusterITS[i] ->Write();
1579 fhChi2PerClusterTPC[i] ->Write();
1587 fhRel1PtUncertainty[i] ->Write();
1591 fhDXYDZ[i] ->Write();
1592 fhDXYvsDZ[i] ->Write();
1594 fhDXYNormalized[i] ->Write();
1595 fhDZNormalized[i] ->Write();
1596 fhDXYvsDZNormalized[i] ->Write();
1597 fhNSigmaToVertex[i] ->Write();
1602 gDirectory->cd("../");
1605 gDirectory->cd("../");
1608 //____________________________________________________________________
1609 void AliESDtrackCuts::DrawHistograms()
1611 // draws some histograms
1613 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1614 canvas1->Divide(2, 2);
1617 fhNClustersTPC[0]->SetStats(kFALSE);
1618 fhNClustersTPC[0]->Draw();
1621 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1622 fhChi2PerClusterTPC[0]->Draw();
1625 fhNSigmaToVertex[0]->SetStats(kFALSE);
1626 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1627 fhNSigmaToVertex[0]->Draw();
1629 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1631 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1632 canvas2->Divide(3, 2);
1635 fhC11[0]->SetStats(kFALSE);
1640 fhC22[0]->SetStats(kFALSE);
1645 fhC33[0]->SetStats(kFALSE);
1650 fhC44[0]->SetStats(kFALSE);
1655 fhC55[0]->SetStats(kFALSE);
1660 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1662 fhRel1PtUncertainty[0]->Draw();
1664 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1666 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1667 canvas3->Divide(3, 2);
1670 fhDXY[0]->SetStats(kFALSE);
1675 fhDZ[0]->SetStats(kFALSE);
1680 fhDXYvsDZ[0]->SetStats(kFALSE);
1682 gPad->SetRightMargin(0.15);
1683 fhDXYvsDZ[0]->Draw("COLZ");
1686 fhDXYNormalized[0]->SetStats(kFALSE);
1688 fhDXYNormalized[0]->Draw();
1691 fhDZNormalized[0]->SetStats(kFALSE);
1693 fhDZNormalized[0]->Draw();
1696 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1698 gPad->SetRightMargin(0.15);
1699 fhDXYvsDZNormalized[0]->Draw("COLZ");
1701 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1703 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1704 canvas4->Divide(2, 1);
1707 fhCutStatistics->SetStats(kFALSE);
1708 fhCutStatistics->LabelsOption("v");
1709 gPad->SetBottomMargin(0.3);
1710 fhCutStatistics->Draw();
1713 fhCutCorrelation->SetStats(kFALSE);
1714 fhCutCorrelation->LabelsOption("v");
1715 gPad->SetBottomMargin(0.3);
1716 gPad->SetLeftMargin(0.3);
1717 fhCutCorrelation->Draw("COLZ");
1719 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1722 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1723 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1726 fhNClustersTPC[0]->SetStats(kFALSE);
1727 fhNClustersTPC[0]->DrawCopy();
1730 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1731 fhChi2PerClusterITS[0]->DrawCopy();
1732 fhChi2PerClusterITS[1]->SetLineColor(2);
1733 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1736 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1737 fhChi2PerClusterTPC[0]->DrawCopy();
1738 fhChi2PerClusterTPC[1]->SetLineColor(2);
1739 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1741 //--------------------------------------------------------------------------
1742 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1744 // set the pt-dependent DCA cuts
1747 if(f1CutMaxDCAToVertexXYPtDep) {
1748 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
1751 if(f1CutMaxDCAToVertexZPtDep) {
1752 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
1755 if(f1CutMinDCAToVertexXYPtDep) {
1756 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
1759 if(f1CutMinDCAToVertexZPtDep) {
1760 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
1769 //--------------------------------------------------------------------------
1770 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
1772 // Check the correctness of the string syntax
1774 Bool_t retval=kTRUE;
1776 if(!dist.Contains("pt")) {
1777 if(print) printf("AliESDtrackCuts::CheckPtDepDCA(): string must contain \"pt\"\n");
1783 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
1785 if(f1CutMaxDCAToVertexXYPtDep){
1786 delete f1CutMaxDCAToVertexXYPtDep;
1788 f1CutMaxDCAToVertexXYPtDep = 0;
1789 fCutMaxDCAToVertexXYPtDep = "";
1791 if(!CheckPtDepDCA(dist,kTRUE)){
1794 fCutMaxDCAToVertexXYPtDep = dist;
1796 tmp.ReplaceAll("pt","x");
1797 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
1801 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
1804 if(f1CutMaxDCAToVertexZPtDep){
1805 delete f1CutMaxDCAToVertexZPtDep;
1807 f1CutMaxDCAToVertexZPtDep = 0;
1808 fCutMaxDCAToVertexZPtDep = "";
1810 if(!CheckPtDepDCA(dist,kTRUE))return;
1812 fCutMaxDCAToVertexZPtDep = dist;
1814 tmp.ReplaceAll("pt","x");
1815 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
1821 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
1824 if(f1CutMinDCAToVertexXYPtDep){
1825 delete f1CutMinDCAToVertexXYPtDep;
1827 f1CutMinDCAToVertexXYPtDep = 0;
1828 fCutMinDCAToVertexXYPtDep = "";
1830 if(!CheckPtDepDCA(dist,kTRUE))return;
1832 fCutMinDCAToVertexXYPtDep = dist;
1834 tmp.ReplaceAll("pt","x");
1835 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
1840 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
1844 if(f1CutMinDCAToVertexZPtDep){
1845 delete f1CutMinDCAToVertexZPtDep;
1847 f1CutMinDCAToVertexZPtDep = 0;
1848 fCutMinDCAToVertexZPtDep = "";
1850 if(!CheckPtDepDCA(dist,kTRUE))return;
1851 fCutMinDCAToVertexZPtDep = dist;
1853 tmp.ReplaceAll("pt","x");
1854 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());