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];
268 if(fhNClustersForITSPID[i])
269 delete fhNClustersForITSPID[i];
270 if(fhNMissingITSPoints[i])
271 delete fhNMissingITSPoints[i];
283 if (fhRel1PtUncertainty[i])
284 delete fhRel1PtUncertainty[i];
295 if (fhDXYNormalized[i])
296 delete fhDXYNormalized[i];
297 if (fhDZNormalized[i])
298 delete fhDZNormalized[i];
299 if (fhDXYvsDZNormalized[i])
300 delete fhDXYvsDZNormalized[i];
301 if (fhNSigmaToVertex[i])
302 delete fhNSigmaToVertex[i];
309 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
310 f1CutMaxDCAToVertexXYPtDep = 0;
311 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
312 f1CutMaxDCAToVertexZPtDep = 0;
313 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
314 f1CutMinDCAToVertexXYPtDep = 0;
315 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
316 f1CutMinDCAToVertexZPtDep = 0;
320 delete ffDTheoretical;
323 delete fhCutStatistics;
324 if (fhCutCorrelation)
325 delete fhCutCorrelation;
328 void AliESDtrackCuts::Init()
331 // sets everything to zero
334 fCutMinNClusterTPC = 0;
335 fCutMinNClusterITS = 0;
337 fCutMaxChi2PerClusterTPC = 0;
338 fCutMaxChi2PerClusterITS = 0;
339 fCutMaxMissingITSPoints = 0;
341 for (Int_t i = 0; i < 3; i++)
342 fCutClusterRequirementITS[i] = kOff;
350 fCutMaxRel1PtUncertainty = 0;
352 fCutAcceptKinkDaughters = 0;
353 fCutAcceptSharedTPCClusters = 0;
354 fCutMaxFractionSharedTPCClusters = 0;
355 fCutRequireTPCRefit = 0;
356 fCutRequireTPCStandAlone = 0;
357 fCutRequireITSRefit = 0;
358 fCutRequireITSPid = 0;
359 fCutRequireITSStandAlone = 0;
360 fCutRequireITSpureSA = 0;
362 fCutNsigmaToVertex = 0;
363 fCutSigmaToVertexRequired = 0;
364 fCutMaxDCAToVertexXY = 0;
365 fCutMaxDCAToVertexZ = 0;
366 fCutDCAToVertex2D = 0;
367 fCutMinDCAToVertexXY = 0;
368 fCutMinDCAToVertexZ = 0;
369 fCutMaxDCAToVertexXYPtDep = "";
370 fCutMaxDCAToVertexZPtDep = "";
371 fCutMinDCAToVertexXYPtDep = "";
372 fCutMinDCAToVertexZPtDep = "";
374 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
375 f1CutMaxDCAToVertexXYPtDep = 0;
376 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
377 f1CutMaxDCAToVertexXYPtDep = 0;
378 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
379 f1CutMaxDCAToVertexZPtDep = 0;
380 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
381 f1CutMinDCAToVertexXYPtDep = 0;
382 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
383 f1CutMinDCAToVertexZPtDep = 0;
401 fHistogramsOn = kFALSE;
403 for (Int_t i=0; i<2; ++i)
405 fhNClustersITS[i] = 0;
406 fhNClustersTPC[i] = 0;
407 fhNSharedClustersTPC[i] = 0;
408 fhNCrossedRowsTPC[i] = 0;
409 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
411 fhChi2PerClusterITS[i] = 0;
412 fhChi2PerClusterTPC[i] = 0;
413 fhNClustersForITSPID[i] = 0;
414 fhNMissingITSPoints[i] = 0;
422 fhRel1PtUncertainty[i] = 0;
429 fhDXYNormalized[i] = 0;
430 fhDZNormalized[i] = 0;
431 fhDXYvsDZNormalized[i] = 0;
432 fhNSigmaToVertex[i] = 0;
440 fhCutCorrelation = 0;
443 //_____________________________________________________________________________
444 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
447 // Assignment operator
450 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
454 //_____________________________________________________________________________
455 void AliESDtrackCuts::Copy(TObject &c) const
461 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
465 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
466 target.fCutMinNClusterITS = fCutMinNClusterITS;
467 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
468 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
471 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
472 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
473 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
475 for (Int_t i = 0; i < 3; i++)
476 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
478 target.fCutMaxC11 = fCutMaxC11;
479 target.fCutMaxC22 = fCutMaxC22;
480 target.fCutMaxC33 = fCutMaxC33;
481 target.fCutMaxC44 = fCutMaxC44;
482 target.fCutMaxC55 = fCutMaxC55;
484 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
486 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
487 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
488 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
489 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
490 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
491 target.fCutRequireITSRefit = fCutRequireITSRefit;
492 target.fCutRequireITSPid = fCutRequireITSPid;
493 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
494 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
496 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
497 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
498 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
499 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
500 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
501 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
502 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
504 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
505 target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
507 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
508 target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
510 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
511 target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
513 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
514 target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
516 target.fPMin = fPMin;
517 target.fPMax = fPMax;
518 target.fPtMin = fPtMin;
519 target.fPtMax = fPtMax;
520 target.fPxMin = fPxMin;
521 target.fPxMax = fPxMax;
522 target.fPyMin = fPyMin;
523 target.fPyMax = fPyMax;
524 target.fPzMin = fPzMin;
525 target.fPzMax = fPzMax;
526 target.fEtaMin = fEtaMin;
527 target.fEtaMax = fEtaMax;
528 target.fRapMin = fRapMin;
529 target.fRapMax = fRapMax;
531 target.fHistogramsOn = fHistogramsOn;
533 for (Int_t i=0; i<2; ++i)
535 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
536 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
537 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
538 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
539 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
541 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
542 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
543 if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
544 if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
546 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
547 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
548 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
549 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
550 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
552 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
554 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
555 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
556 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
557 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
559 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
560 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
561 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
562 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
564 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
565 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
567 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
569 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
570 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
575 //_____________________________________________________________________________
576 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
577 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
578 // Returns the number of merged objects (including this)
585 TIterator* iter = list->MakeIterator();
588 // collection of measured and generated histograms
590 while ((obj = iter->Next())) {
592 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
596 if (!entry->fHistogramsOn)
599 for (Int_t i=0; i<2; i++) {
601 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
602 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
603 if (fhNSharedClustersTPC[i])
604 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
605 if (fhNCrossedRowsTPC[i])
606 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
607 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
608 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
610 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
611 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
612 fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
613 fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
615 fhC11[i] ->Add(entry->fhC11[i] );
616 fhC22[i] ->Add(entry->fhC22[i] );
617 fhC33[i] ->Add(entry->fhC33[i] );
618 fhC44[i] ->Add(entry->fhC44[i] );
619 fhC55[i] ->Add(entry->fhC55[i] );
621 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
623 fhDXY[i] ->Add(entry->fhDXY[i] );
624 fhDZ[i] ->Add(entry->fhDZ[i] );
625 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
626 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
628 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
629 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
630 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
631 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
633 fhPt[i] ->Add(entry->fhPt[i]);
634 fhEta[i] ->Add(entry->fhEta[i]);
637 fhCutStatistics ->Add(entry->fhCutStatistics);
638 fhCutCorrelation ->Add(entry->fhCutCorrelation);
645 //____________________________________________________________________
646 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
648 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
650 Printf("AliESDtrackCuts::GetStandardTPCOnlyTrackCuts: Creating track cuts for TPC-only.");
652 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
654 esdTrackCuts->SetMinNClustersTPC(50);
655 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
656 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
658 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
659 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
660 esdTrackCuts->SetDCAToVertex2D(kTRUE);
665 //____________________________________________________________________
666 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
668 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
670 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
672 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
675 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
676 esdTrackCuts->SetMinNClustersTPC(70);
677 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
678 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
679 esdTrackCuts->SetRequireTPCRefit(kTRUE);
681 esdTrackCuts->SetRequireITSRefit(kTRUE);
682 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
683 AliESDtrackCuts::kAny);
685 // 7*(0.0050+0.0060/pt^0.9)
686 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
688 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
689 esdTrackCuts->SetDCAToVertex2D(kFALSE);
690 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
691 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
696 //____________________________________________________________________
697 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
699 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
700 // if clusterCut = 1, the cut on the number of clusters is replaced by
701 // a cut on the number of crossed rows and on the ration crossed
702 // rows/findable clusters
704 Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
706 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
709 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
710 else if (clusterCut == 1) {
711 esdTrackCuts->SetMinNCrossedRowsTPC(70);
712 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
715 Printf("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut);
716 esdTrackCuts->SetMinNClustersTPC(70);
718 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
719 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
720 esdTrackCuts->SetRequireTPCRefit(kTRUE);
722 esdTrackCuts->SetRequireITSRefit(kTRUE);
723 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
724 AliESDtrackCuts::kAny);
726 // 7*(0.0026+0.0050/pt^1.01)
727 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
729 esdTrackCuts->SetMaxDCAToVertexZ(2);
730 esdTrackCuts->SetDCAToVertex2D(kFALSE);
731 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
736 //____________________________________________________________________
740 //____________________________________________________________________
741 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
743 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
745 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
746 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
747 esdTrackCuts->SetRequireITSRefit(kTRUE);
748 esdTrackCuts->SetMinNClustersITS(4);
749 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
750 AliESDtrackCuts::kAny);
751 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
754 // 7*(0.0085+0.0026/pt^1.55)
755 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
758 esdTrackCuts->SetRequireITSPid(kTRUE);
763 //____________________________________________________________________
764 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
766 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
768 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
769 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
770 esdTrackCuts->SetRequireITSRefit(kTRUE);
771 esdTrackCuts->SetMinNClustersITS(4);
772 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
773 AliESDtrackCuts::kAny);
774 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
777 // 7*(0.0033+0.0045/pt^1.3)
778 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
781 esdTrackCuts->SetRequireITSPid(kTRUE);
786 //____________________________________________________________________
787 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
789 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
791 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
792 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
793 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
794 esdTrackCuts->SetRequireITSRefit(kTRUE);
795 esdTrackCuts->SetMinNClustersITS(4);
796 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
797 AliESDtrackCuts::kAny);
798 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
801 // 7*(0.0085+0.0026/pt^1.55)
802 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
805 esdTrackCuts->SetRequireITSPid(kTRUE);
810 //____________________________________________________________________
811 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
813 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
815 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
816 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
817 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
818 esdTrackCuts->SetRequireITSRefit(kTRUE);
819 esdTrackCuts->SetMinNClustersITS(4);
820 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
821 AliESDtrackCuts::kAny);
822 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
825 // 7*(0.0033+0.0045/pt^1.3)
826 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
829 esdTrackCuts->SetRequireITSPid(kTRUE);
834 //____________________________________________________________________
835 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
837 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
839 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
840 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
845 //____________________________________________________________________
846 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
848 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
849 // tpcOnly = kTRUE -> consider TPC-only tracks
850 // = kFALSE -> consider global tracks
854 Printf("AliESDtrackCuts::GetReferenceMultiplicity: Not implemented for global tracks!");
858 static AliESDtrackCuts* esdTrackCuts = 0;
861 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
862 esdTrackCuts->SetEtaRange(-0.8, 0.8);
863 esdTrackCuts->SetPtRange(0.15);
866 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
871 //____________________________________________________________________
872 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* const esdTrack)
874 // Calculates the number of sigma to the vertex.
879 esdTrack->GetImpactParameters(b,bCov);
881 if (bCov[0]<=0 || bCov[2]<=0) {
882 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
883 bCov[0]=0; bCov[2]=0;
885 bRes[0] = TMath::Sqrt(bCov[0]);
886 bRes[1] = TMath::Sqrt(bCov[2]);
888 // -----------------------------------
889 // How to get to a n-sigma cut?
891 // The accumulated statistics from 0 to d is
893 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
894 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
896 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
897 // Can this be expressed in a different way?
899 if (bRes[0] == 0 || bRes[1] ==0)
902 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
904 // work around precision problem
905 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
906 // 1e-15 corresponds to nsigma ~ 7.7
907 if (TMath::Exp(-d * d / 2) < 1e-15)
910 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
914 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
916 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
918 tree->SetBranchStatus("fTracks.fFlags", 1);
919 tree->SetBranchStatus("fTracks.fITSncls", 1);
920 tree->SetBranchStatus("fTracks.fTPCncls", 1);
921 tree->SetBranchStatus("fTracks.fITSchi2", 1);
922 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
923 tree->SetBranchStatus("fTracks.fC*", 1);
924 tree->SetBranchStatus("fTracks.fD", 1);
925 tree->SetBranchStatus("fTracks.fZ", 1);
926 tree->SetBranchStatus("fTracks.fCdd", 1);
927 tree->SetBranchStatus("fTracks.fCdz", 1);
928 tree->SetBranchStatus("fTracks.fCzz", 1);
929 tree->SetBranchStatus("fTracks.fP*", 1);
930 tree->SetBranchStatus("fTracks.fR*", 1);
931 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
934 //____________________________________________________________________
935 Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
938 // figure out if the tracks survives all the track cuts defined
940 // the different quality parameter and kinematic values are first
941 // retrieved from the track. then it is found out what cuts the
942 // track did not survive and finally the cuts are imposed.
944 // this function needs the following branches:
950 // fTracks.fC //GetExternalCovariance
951 // fTracks.fD //GetImpactParameters
952 // fTracks.fZ //GetImpactParameters
953 // fTracks.fCdd //GetImpactParameters
954 // fTracks.fCdz //GetImpactParameters
955 // fTracks.fCzz //GetImpactParameters
956 // fTracks.fP //GetPxPyPz
957 // fTracks.fR //GetMass
958 // fTracks.fP //GetMass
959 // fTracks.fKinkIndexes
961 UInt_t status = esdTrack->GetStatus();
963 // getting quality parameters from the ESD track
964 Int_t nClustersITS = esdTrack->GetITSclusters(0);
965 Int_t nClustersTPC = -1;
966 if(fCutRequireTPCStandAlone) {
967 nClustersTPC = esdTrack->GetTPCNclsIter1();
970 nClustersTPC = esdTrack->GetTPCclusters(0);
972 Float_t nCrossedRowsTPC = esdTrack->GetTPCClusterInfo(2,1);
973 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
974 if (esdTrack->GetTPCNclsF()>0) {
975 ratioCrossedRowsOverFindableClustersTPC = esdTrack->GetTPCClusterInfo(2,1)/esdTrack->GetTPCNclsF();
978 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
979 Float_t fracClustersTPCShared = -1.;
981 Float_t chi2PerClusterITS = -1;
982 Float_t chi2PerClusterTPC = -1;
984 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
985 if (nClustersTPC!=0) {
986 if(fCutRequireTPCStandAlone) {
987 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
989 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
991 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
995 esdTrack->GetExternalCovariance(extCov);
997 // getting the track to vertex parameters
998 Float_t nSigmaToVertex = GetSigmaToVertex(esdTrack);
1002 esdTrack->GetImpactParameters(b,bCov);
1003 if (bCov[0]<=0 || bCov[2]<=0) {
1004 AliDebug(1, "Estimated b resolution lower or equal zero!");
1005 bCov[0]=0; bCov[2]=0;
1009 // set pt-dependent DCA cuts, if requested
1010 SetPtDepDCACuts(esdTrack->Pt());
1013 Float_t dcaToVertexXY = b[0];
1014 Float_t dcaToVertexZ = b[1];
1016 Float_t dcaToVertex = -1;
1018 if (fCutDCAToVertex2D)
1020 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1023 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1025 // getting the kinematic variables of the track
1026 // (assuming the mass is known)
1028 esdTrack->GetPxPyPz(p);
1030 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1031 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1032 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1034 //y-eta related calculations
1035 Float_t eta = -100.;
1037 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1038 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1039 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1040 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1044 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]);
1047 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1049 //########################################################################
1052 Bool_t cuts[kNCuts];
1053 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1055 // track quality cuts
1056 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1058 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1060 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1062 if (nClustersTPC<fCutMinNClusterTPC)
1064 if (nClustersITS<fCutMinNClusterITS)
1066 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1068 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1070 if (extCov[0] > fCutMaxC11)
1072 if (extCov[2] > fCutMaxC22)
1074 if (extCov[5] > fCutMaxC33)
1076 if (extCov[9] > fCutMaxC44)
1078 if (extCov[14] > fCutMaxC55)
1080 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1082 // if n sigma could not be calculated
1083 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1085 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1087 // track kinematics cut
1088 if((momentum < fPMin) || (momentum > fPMax))
1090 if((pt < fPtMin) || (pt > fPtMax))
1092 if((p[0] < fPxMin) || (p[0] > fPxMax))
1094 if((p[1] < fPyMin) || (p[1] > fPyMax))
1096 if((p[2] < fPzMin) || (p[2] > fPzMax))
1098 if((eta < fEtaMin) || (eta > fEtaMax))
1100 if((y < fRapMin) || (y > fRapMax))
1102 if (fCutDCAToVertex2D && dcaToVertex > 1)
1104 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1106 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1108 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1110 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1112 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1115 for (Int_t i = 0; i < 3; i++)
1116 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1118 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1119 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1123 // ITS standalone tracks
1124 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1125 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1126 }else if(fCutRequireITSpureSA){
1127 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1132 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1135 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1138 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1141 Int_t nITSPointsForPid=0;
1142 UChar_t clumap=esdTrack->GetITSClusterMap();
1143 for(Int_t i=2; i<6; i++){
1144 if(clumap&(1<<i)) ++nITSPointsForPid;
1146 if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1149 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1151 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1154 Int_t nMissITSpts=0;
1155 Int_t idet,statusLay;
1157 for(Int_t iLay=0; iLay<6; iLay++){
1158 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1159 if(retc && statusLay==5) ++nMissITSpts;
1161 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1164 for (Int_t i=0; i<kNCuts; i++)
1165 if (cuts[i]) {cut = kTRUE;}
1168 //########################################################################
1169 // filling histograms
1170 if (fHistogramsOn) {
1171 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1173 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1175 for (Int_t i=0; i<kNCuts; i++) {
1176 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1177 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1180 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1182 for (Int_t j=i; j<kNCuts; j++) {
1183 if (cuts[i] && cuts[j]) {
1184 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1185 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1186 fhCutCorrelation->Fill(xC, yC);
1192 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1193 // the code is not in a function due to too many local variables that would need to be passed
1195 for (Int_t id = 0; id < 2; id++)
1197 // id = 0 --> before cut
1198 // id = 1 --> after cut
1202 fhNClustersITS[id]->Fill(nClustersITS);
1203 fhNClustersTPC[id]->Fill(nClustersTPC);
1204 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1205 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1206 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1207 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1208 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1209 fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1210 fhNMissingITSPoints[id]->Fill(nMissITSpts);
1212 fhC11[id]->Fill(extCov[0]);
1213 fhC22[id]->Fill(extCov[2]);
1214 fhC33[id]->Fill(extCov[5]);
1215 fhC44[id]->Fill(extCov[9]);
1216 fhC55[id]->Fill(extCov[14]);
1218 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1221 fhEta[id]->Fill(eta);
1224 bRes[0] = TMath::Sqrt(bCov[0]);
1225 bRes[1] = TMath::Sqrt(bCov[2]);
1227 fhDZ[id]->Fill(b[1]);
1228 fhDXY[id]->Fill(b[0]);
1229 fhDXYDZ[id]->Fill(dcaToVertex);
1230 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1232 if (bRes[0]!=0 && bRes[1]!=0) {
1233 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1234 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1235 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1236 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1248 //____________________________________________________________________
1249 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1251 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1255 case kOff: return kTRUE;
1256 case kNone: return !clusterL1 && !clusterL2;
1257 case kAny: return clusterL1 || clusterL2;
1258 case kFirst: return clusterL1;
1259 case kOnlyFirst: return clusterL1 && !clusterL2;
1260 case kSecond: return clusterL2;
1261 case kOnlySecond: return clusterL2 && !clusterL1;
1262 case kBoth: return clusterL1 && clusterL2;
1268 //____________________________________________________________________
1269 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
1272 // Utility function to
1273 // create a TPC only track from the given esd track
1275 // IMPORTANT: The track has to be deleted by the user
1277 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1278 // there are only missing propagations here that are needed for old data
1279 // this function will therefore become obsolete
1281 // adapted from code provided by CKB
1283 if (!esd->GetPrimaryVertexTPC())
1284 return 0; // No TPC vertex no TPC tracks
1286 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1287 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1289 AliESDtrack* track = esd->GetTrack(iTrack);
1293 AliESDtrack *tpcTrack = new AliESDtrack();
1295 // only true if we have a tpc track
1296 if (!track->FillTPCOnlyTrack(*tpcTrack))
1302 // propagate to Vertex
1303 // not needed for normal reconstructed ESDs...
1304 // Double_t pTPC[2],covTPC[3];
1305 // tpcTrack->PropagateToDCA(esd->GetPrimaryVertexTPC(), esd->GetMagneticField(), 10000, pTPC, covTPC);
1310 //____________________________________________________________________
1311 TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
1314 // returns an array of all tracks that pass the cuts
1315 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1316 // tracks that pass the cut
1318 // NOTE: List has to be deleted by the user
1320 TObjArray* acceptedTracks = new TObjArray();
1322 // loop over esd tracks
1323 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1325 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1326 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1328 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1332 if (AcceptTrack(tpcTrack)) {
1333 acceptedTracks->Add(tpcTrack);
1340 AliESDtrack* track = esd->GetTrack(iTrack);
1341 if(AcceptTrack(track))
1342 acceptedTracks->Add(track);
1345 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1346 return acceptedTracks;
1349 //____________________________________________________________________
1350 Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
1353 // returns an the number of tracks that pass the cuts
1358 // loop over esd tracks
1359 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1360 AliESDtrack* track = esd->GetTrack(iTrack);
1361 if (AcceptTrack(track))
1368 //____________________________________________________________________
1369 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1371 // diagnostics histograms are defined
1374 fHistogramsOn=kTRUE;
1376 Bool_t oldStatus = TH1::AddDirectoryStatus();
1377 TH1::AddDirectory(kFALSE);
1379 //###################################################################################
1380 // defining histograms
1382 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1384 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1385 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1387 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1389 for (Int_t i=0; i<kNCuts; i++) {
1390 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1391 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1392 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1395 fhCutStatistics ->SetLineColor(color);
1396 fhCutCorrelation ->SetLineColor(color);
1397 fhCutStatistics ->SetLineWidth(2);
1398 fhCutCorrelation ->SetLineWidth(2);
1400 for (Int_t i=0; i<2; i++) {
1401 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1402 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1403 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1404 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1405 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1406 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1407 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1408 fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
1409 fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
1411 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1412 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1413 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1414 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1415 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1417 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1419 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1420 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1421 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1422 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1424 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1425 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1426 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1428 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1430 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1431 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1433 fhNClustersITS[i]->SetTitle("n ITS clusters");
1434 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1435 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1436 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1437 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1438 fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
1439 fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
1441 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1442 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1443 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1444 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1445 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1447 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1449 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1450 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1451 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1452 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1453 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1455 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1456 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1457 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1458 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1459 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1461 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1462 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1463 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1464 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1465 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1466 fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
1467 fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
1469 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1470 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1471 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1472 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1473 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1475 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1477 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1478 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1479 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1481 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1482 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1483 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1486 // The number of sigmas to the vertex is per definition gaussian
1487 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1488 ffDTheoretical->SetParameter(0,1);
1490 TH1::AddDirectory(oldStatus);
1493 //____________________________________________________________________
1494 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1497 // loads the histograms from a file
1498 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1504 if (!gDirectory->cd(dir))
1507 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1509 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1510 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1512 for (Int_t i=0; i<2; i++) {
1515 gDirectory->cd("before_cuts");
1518 gDirectory->cd("after_cuts");
1520 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1521 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1522 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1523 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1524 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1525 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1526 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1527 fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
1528 fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
1530 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1531 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1532 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1533 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1534 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1536 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1538 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1539 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1540 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1541 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1543 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1544 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1545 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1546 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1548 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1549 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1551 gDirectory->cd("../");
1554 gDirectory->cd("..");
1559 //____________________________________________________________________
1560 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1562 // saves the histograms in a directory (dir)
1565 if (!fHistogramsOn) {
1566 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1573 gDirectory->mkdir(dir);
1574 gDirectory->cd(dir);
1576 gDirectory->mkdir("before_cuts");
1577 gDirectory->mkdir("after_cuts");
1579 // a factor of 2 is needed since n sigma is positive
1580 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1581 ffDTheoretical->Write("nSigmaToVertexTheory");
1583 fhCutStatistics->Write();
1584 fhCutCorrelation->Write();
1586 for (Int_t i=0; i<2; i++) {
1588 gDirectory->cd("before_cuts");
1590 gDirectory->cd("after_cuts");
1592 fhNClustersITS[i] ->Write();
1593 fhNClustersTPC[i] ->Write();
1594 fhNSharedClustersTPC[i] ->Write();
1595 fhNCrossedRowsTPC[i] ->Write();
1596 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1597 fhChi2PerClusterITS[i] ->Write();
1598 fhChi2PerClusterTPC[i] ->Write();
1599 fhNClustersForITSPID[i] ->Write();
1600 fhNMissingITSPoints[i] ->Write();
1608 fhRel1PtUncertainty[i] ->Write();
1612 fhDXYDZ[i] ->Write();
1613 fhDXYvsDZ[i] ->Write();
1615 fhDXYNormalized[i] ->Write();
1616 fhDZNormalized[i] ->Write();
1617 fhDXYvsDZNormalized[i] ->Write();
1618 fhNSigmaToVertex[i] ->Write();
1623 gDirectory->cd("../");
1626 gDirectory->cd("../");
1629 //____________________________________________________________________
1630 void AliESDtrackCuts::DrawHistograms()
1632 // draws some histograms
1634 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1635 canvas1->Divide(2, 2);
1638 fhNClustersTPC[0]->SetStats(kFALSE);
1639 fhNClustersTPC[0]->Draw();
1642 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1643 fhChi2PerClusterTPC[0]->Draw();
1646 fhNSigmaToVertex[0]->SetStats(kFALSE);
1647 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1648 fhNSigmaToVertex[0]->Draw();
1650 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1652 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1653 canvas2->Divide(3, 2);
1656 fhC11[0]->SetStats(kFALSE);
1661 fhC22[0]->SetStats(kFALSE);
1666 fhC33[0]->SetStats(kFALSE);
1671 fhC44[0]->SetStats(kFALSE);
1676 fhC55[0]->SetStats(kFALSE);
1681 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1683 fhRel1PtUncertainty[0]->Draw();
1685 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1687 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1688 canvas3->Divide(3, 2);
1691 fhDXY[0]->SetStats(kFALSE);
1696 fhDZ[0]->SetStats(kFALSE);
1701 fhDXYvsDZ[0]->SetStats(kFALSE);
1703 gPad->SetRightMargin(0.15);
1704 fhDXYvsDZ[0]->Draw("COLZ");
1707 fhDXYNormalized[0]->SetStats(kFALSE);
1709 fhDXYNormalized[0]->Draw();
1712 fhDZNormalized[0]->SetStats(kFALSE);
1714 fhDZNormalized[0]->Draw();
1717 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1719 gPad->SetRightMargin(0.15);
1720 fhDXYvsDZNormalized[0]->Draw("COLZ");
1722 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1724 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1725 canvas4->Divide(2, 1);
1728 fhCutStatistics->SetStats(kFALSE);
1729 fhCutStatistics->LabelsOption("v");
1730 gPad->SetBottomMargin(0.3);
1731 fhCutStatistics->Draw();
1734 fhCutCorrelation->SetStats(kFALSE);
1735 fhCutCorrelation->LabelsOption("v");
1736 gPad->SetBottomMargin(0.3);
1737 gPad->SetLeftMargin(0.3);
1738 fhCutCorrelation->Draw("COLZ");
1740 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1743 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1744 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1747 fhNClustersTPC[0]->SetStats(kFALSE);
1748 fhNClustersTPC[0]->DrawCopy();
1751 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1752 fhChi2PerClusterITS[0]->DrawCopy();
1753 fhChi2PerClusterITS[1]->SetLineColor(2);
1754 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1757 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1758 fhChi2PerClusterTPC[0]->DrawCopy();
1759 fhChi2PerClusterTPC[1]->SetLineColor(2);
1760 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1762 //--------------------------------------------------------------------------
1763 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1765 // set the pt-dependent DCA cuts
1768 if(f1CutMaxDCAToVertexXYPtDep) {
1769 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
1772 if(f1CutMaxDCAToVertexZPtDep) {
1773 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
1776 if(f1CutMinDCAToVertexXYPtDep) {
1777 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
1780 if(f1CutMinDCAToVertexZPtDep) {
1781 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
1790 //--------------------------------------------------------------------------
1791 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
1793 // Check the correctness of the string syntax
1795 Bool_t retval=kTRUE;
1797 if(!dist.Contains("pt")) {
1798 if(print) printf("AliESDtrackCuts::CheckPtDepDCA(): string must contain \"pt\"\n");
1804 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
1806 if(f1CutMaxDCAToVertexXYPtDep){
1807 delete f1CutMaxDCAToVertexXYPtDep;
1809 f1CutMaxDCAToVertexXYPtDep = 0;
1810 fCutMaxDCAToVertexXYPtDep = "";
1812 if(!CheckPtDepDCA(dist,kTRUE)){
1815 fCutMaxDCAToVertexXYPtDep = dist;
1817 tmp.ReplaceAll("pt","x");
1818 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
1822 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
1825 if(f1CutMaxDCAToVertexZPtDep){
1826 delete f1CutMaxDCAToVertexZPtDep;
1828 f1CutMaxDCAToVertexZPtDep = 0;
1829 fCutMaxDCAToVertexZPtDep = "";
1831 if(!CheckPtDepDCA(dist,kTRUE))return;
1833 fCutMaxDCAToVertexZPtDep = dist;
1835 tmp.ReplaceAll("pt","x");
1836 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
1842 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
1845 if(f1CutMinDCAToVertexXYPtDep){
1846 delete f1CutMinDCAToVertexXYPtDep;
1848 f1CutMinDCAToVertexXYPtDep = 0;
1849 fCutMinDCAToVertexXYPtDep = "";
1851 if(!CheckPtDepDCA(dist,kTRUE))return;
1853 fCutMinDCAToVertexXYPtDep = dist;
1855 tmp.ReplaceAll("pt","x");
1856 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
1861 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
1865 if(f1CutMinDCAToVertexZPtDep){
1866 delete f1CutMinDCAToVertexZPtDep;
1868 f1CutMinDCAToVertexZPtDep = 0;
1869 fCutMinDCAToVertexZPtDep = "";
1871 if(!CheckPtDepDCA(dist,kTRUE))return;
1872 fCutMinDCAToVertexZPtDep = dist;
1874 tmp.ReplaceAll("pt","x");
1875 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());