1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 /* $Id: AliESDtrackCuts.cxx 24534 2008-03-16 22:22:11Z fca $ */
18 #include "AliESDtrackCuts.h"
20 #include <AliESDtrack.h>
21 #include <AliESDVertex.h>
22 #include <AliESDEvent.h>
23 #include <AliMultiplicity.h>
28 #include <TDirectory.h>
32 //____________________________________________________________________
33 ClassImp(AliESDtrackCuts)
36 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
38 "require TPC standalone",
42 "#Chi^{2}/cluster TPC",
43 "#Chi^{2}/cluster ITS",
59 "trk-to-vtx max dca 2D absolute",
60 "trk-to-vtx max dca xy absolute",
61 "trk-to-vtx max dca z absolute",
62 "trk-to-vtx min dca 2D absolute",
63 "trk-to-vtx min dca xy absolute",
64 "trk-to-vtx min dca z absolute",
65 "SPD cluster requirement",
66 "SDD cluster requirement",
67 "SSD cluster requirement",
68 "require ITS stand-alone",
69 "rel 1/pt uncertainty",
70 "TPC n shared clusters",
71 "TPC rel shared clusters",
74 "n crossed rows / n findable clusters",
78 AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
80 //____________________________________________________________________
81 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
82 fCutMinNClusterTPC(0),
83 fCutMinNClusterITS(0),
84 fCutMinNCrossedRowsTPC(0),
85 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
86 fCutMaxChi2PerClusterTPC(0),
87 fCutMaxChi2PerClusterITS(0),
88 fCutMaxMissingITSPoints(0),
94 fCutMaxRel1PtUncertainty(0),
95 fCutAcceptKinkDaughters(0),
96 fCutAcceptSharedTPCClusters(0),
97 fCutMaxFractionSharedTPCClusters(0),
98 fCutRequireTPCRefit(0),
99 fCutRequireTPCStandAlone(0),
100 fCutRequireITSRefit(0),
101 fCutRequireITSPid(0),
102 fCutRequireITSStandAlone(0),
103 fCutRequireITSpureSA(0),
104 fCutNsigmaToVertex(0),
105 fCutSigmaToVertexRequired(0),
106 fCutMaxDCAToVertexXY(0),
107 fCutMaxDCAToVertexZ(0),
108 fCutMinDCAToVertexXY(0),
109 fCutMinDCAToVertexZ(0),
110 fCutMaxDCAToVertexXYPtDep(""),
111 fCutMaxDCAToVertexZPtDep(""),
112 fCutMinDCAToVertexXYPtDep(""),
113 fCutMinDCAToVertexZPtDep(""),
114 f1CutMaxDCAToVertexXYPtDep(0x0),
115 f1CutMaxDCAToVertexZPtDep(0x0),
116 f1CutMinDCAToVertexXYPtDep(0x0),
117 f1CutMinDCAToVertexZPtDep(0x0),
118 fCutDCAToVertex2D(0),
144 //##############################################################################
145 // setting default cuts
146 SetMinNClustersTPC();
147 SetMinNClustersITS();
148 SetMinNCrossedRowsTPC();
149 SetMinRatioCrossedRowsOverFindableClustersTPC();
150 SetMaxChi2PerClusterTPC();
151 SetMaxChi2PerClusterITS();
152 SetMaxNOfMissingITSPoints();
153 SetMaxCovDiagonalElements();
154 SetMaxRel1PtUncertainty();
155 SetRequireTPCRefit();
156 SetRequireTPCStandAlone();
157 SetRequireITSRefit();
158 SetRequireITSPid(kFALSE);
159 SetRequireITSStandAlone(kFALSE);
160 SetRequireITSPureStandAlone(kFALSE);
161 SetAcceptKinkDaughters();
162 SetAcceptSharedTPCClusters();
163 SetMaxFractionSharedTPCClusters();
164 SetMaxNsigmaToVertex();
165 SetMaxDCAToVertexXY();
166 SetMaxDCAToVertexZ();
168 SetMinDCAToVertexXY();
169 SetMinDCAToVertexZ();
177 SetClusterRequirementITS(kSPD);
178 SetClusterRequirementITS(kSDD);
179 SetClusterRequirementITS(kSSD);
184 //_____________________________________________________________________________
185 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
186 fCutMinNClusterTPC(0),
187 fCutMinNClusterITS(0),
188 fCutMinNCrossedRowsTPC(0),
189 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
190 fCutMaxChi2PerClusterTPC(0),
191 fCutMaxChi2PerClusterITS(0),
192 fCutMaxMissingITSPoints(0),
198 fCutMaxRel1PtUncertainty(0),
199 fCutAcceptKinkDaughters(0),
200 fCutAcceptSharedTPCClusters(0),
201 fCutMaxFractionSharedTPCClusters(0),
202 fCutRequireTPCRefit(0),
203 fCutRequireTPCStandAlone(0),
204 fCutRequireITSRefit(0),
205 fCutRequireITSPid(0),
206 fCutRequireITSStandAlone(0),
207 fCutRequireITSpureSA(0),
208 fCutNsigmaToVertex(0),
209 fCutSigmaToVertexRequired(0),
210 fCutMaxDCAToVertexXY(0),
211 fCutMaxDCAToVertexZ(0),
212 fCutMinDCAToVertexXY(0),
213 fCutMinDCAToVertexZ(0),
214 fCutMaxDCAToVertexXYPtDep(""),
215 fCutMaxDCAToVertexZPtDep(""),
216 fCutMinDCAToVertexXYPtDep(""),
217 fCutMinDCAToVertexZPtDep(""),
218 f1CutMaxDCAToVertexXYPtDep(0x0),
219 f1CutMaxDCAToVertexZPtDep(0x0),
220 f1CutMinDCAToVertexXYPtDep(0x0),
221 f1CutMinDCAToVertexZPtDep(0x0),
222 fCutDCAToVertex2D(0),
246 ((AliESDtrackCuts &) c).Copy(*this);
249 AliESDtrackCuts::~AliESDtrackCuts()
255 for (Int_t i=0; i<2; i++) {
257 if (fhNClustersITS[i])
258 delete fhNClustersITS[i];
259 if (fhNClustersTPC[i])
260 delete fhNClustersTPC[i];
261 if (fhNSharedClustersTPC[i])
262 delete fhNSharedClustersTPC[i];
263 if (fhNCrossedRowsTPC[i])
264 delete fhNCrossedRowsTPC[i];
265 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
266 delete fhRatioCrossedRowsOverFindableClustersTPC[i];
267 if (fhChi2PerClusterITS[i])
268 delete fhChi2PerClusterITS[i];
269 if (fhChi2PerClusterTPC[i])
270 delete fhChi2PerClusterTPC[i];
271 if(fhNClustersForITSPID[i])
272 delete fhNClustersForITSPID[i];
273 if(fhNMissingITSPoints[i])
274 delete fhNMissingITSPoints[i];
286 if (fhRel1PtUncertainty[i])
287 delete fhRel1PtUncertainty[i];
298 if (fhDXYNormalized[i])
299 delete fhDXYNormalized[i];
300 if (fhDZNormalized[i])
301 delete fhDZNormalized[i];
302 if (fhDXYvsDZNormalized[i])
303 delete fhDXYvsDZNormalized[i];
304 if (fhNSigmaToVertex[i])
305 delete fhNSigmaToVertex[i];
312 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
313 f1CutMaxDCAToVertexXYPtDep = 0;
314 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
315 f1CutMaxDCAToVertexZPtDep = 0;
316 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
317 f1CutMinDCAToVertexXYPtDep = 0;
318 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
319 f1CutMinDCAToVertexZPtDep = 0;
323 delete ffDTheoretical;
326 delete fhCutStatistics;
327 if (fhCutCorrelation)
328 delete fhCutCorrelation;
331 void AliESDtrackCuts::Init()
334 // sets everything to zero
337 fCutMinNClusterTPC = 0;
338 fCutMinNClusterITS = 0;
340 fCutMaxChi2PerClusterTPC = 0;
341 fCutMaxChi2PerClusterITS = 0;
342 fCutMaxMissingITSPoints = 0;
344 for (Int_t i = 0; i < 3; i++)
345 fCutClusterRequirementITS[i] = kOff;
353 fCutMaxRel1PtUncertainty = 0;
355 fCutAcceptKinkDaughters = 0;
356 fCutAcceptSharedTPCClusters = 0;
357 fCutMaxFractionSharedTPCClusters = 0;
358 fCutRequireTPCRefit = 0;
359 fCutRequireTPCStandAlone = 0;
360 fCutRequireITSRefit = 0;
361 fCutRequireITSPid = 0;
362 fCutRequireITSStandAlone = 0;
363 fCutRequireITSpureSA = 0;
365 fCutNsigmaToVertex = 0;
366 fCutSigmaToVertexRequired = 0;
367 fCutMaxDCAToVertexXY = 0;
368 fCutMaxDCAToVertexZ = 0;
369 fCutDCAToVertex2D = 0;
370 fCutMinDCAToVertexXY = 0;
371 fCutMinDCAToVertexZ = 0;
372 fCutMaxDCAToVertexXYPtDep = "";
373 fCutMaxDCAToVertexZPtDep = "";
374 fCutMinDCAToVertexXYPtDep = "";
375 fCutMinDCAToVertexZPtDep = "";
377 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
378 f1CutMaxDCAToVertexXYPtDep = 0;
379 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
380 f1CutMaxDCAToVertexXYPtDep = 0;
381 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
382 f1CutMaxDCAToVertexZPtDep = 0;
383 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
384 f1CutMinDCAToVertexXYPtDep = 0;
385 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
386 f1CutMinDCAToVertexZPtDep = 0;
404 fHistogramsOn = kFALSE;
406 for (Int_t i=0; i<2; ++i)
408 fhNClustersITS[i] = 0;
409 fhNClustersTPC[i] = 0;
410 fhNSharedClustersTPC[i] = 0;
411 fhNCrossedRowsTPC[i] = 0;
412 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
414 fhChi2PerClusterITS[i] = 0;
415 fhChi2PerClusterTPC[i] = 0;
416 fhNClustersForITSPID[i] = 0;
417 fhNMissingITSPoints[i] = 0;
425 fhRel1PtUncertainty[i] = 0;
432 fhDXYNormalized[i] = 0;
433 fhDZNormalized[i] = 0;
434 fhDXYvsDZNormalized[i] = 0;
435 fhNSigmaToVertex[i] = 0;
443 fhCutCorrelation = 0;
446 //_____________________________________________________________________________
447 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
450 // Assignment operator
453 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
457 //_____________________________________________________________________________
458 void AliESDtrackCuts::Copy(TObject &c) const
464 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
468 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
469 target.fCutMinNClusterITS = fCutMinNClusterITS;
470 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
471 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
474 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
475 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
476 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
478 for (Int_t i = 0; i < 3; i++)
479 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
481 target.fCutMaxC11 = fCutMaxC11;
482 target.fCutMaxC22 = fCutMaxC22;
483 target.fCutMaxC33 = fCutMaxC33;
484 target.fCutMaxC44 = fCutMaxC44;
485 target.fCutMaxC55 = fCutMaxC55;
487 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
489 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
490 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
491 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
492 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
493 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
494 target.fCutRequireITSRefit = fCutRequireITSRefit;
495 target.fCutRequireITSPid = fCutRequireITSPid;
496 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
497 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
499 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
500 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
501 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
502 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
503 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
504 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
505 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
507 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
508 target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
510 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
511 target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
513 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
514 target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
516 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
517 target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
519 target.fPMin = fPMin;
520 target.fPMax = fPMax;
521 target.fPtMin = fPtMin;
522 target.fPtMax = fPtMax;
523 target.fPxMin = fPxMin;
524 target.fPxMax = fPxMax;
525 target.fPyMin = fPyMin;
526 target.fPyMax = fPyMax;
527 target.fPzMin = fPzMin;
528 target.fPzMax = fPzMax;
529 target.fEtaMin = fEtaMin;
530 target.fEtaMax = fEtaMax;
531 target.fRapMin = fRapMin;
532 target.fRapMax = fRapMax;
534 target.fHistogramsOn = fHistogramsOn;
536 for (Int_t i=0; i<2; ++i)
538 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
539 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
540 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
541 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
542 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
544 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
545 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
546 if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
547 if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
549 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
550 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
551 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
552 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
553 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
555 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
557 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
558 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
559 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
560 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
562 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
563 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
564 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
565 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
567 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
568 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
570 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
572 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
573 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
578 //_____________________________________________________________________________
579 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
580 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
581 // Returns the number of merged objects (including this)
588 TIterator* iter = list->MakeIterator();
591 // collection of measured and generated histograms
593 while ((obj = iter->Next())) {
595 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
599 if (!entry->fHistogramsOn)
602 for (Int_t i=0; i<2; i++) {
604 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
605 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
606 if (fhNSharedClustersTPC[i])
607 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
608 if (fhNCrossedRowsTPC[i])
609 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
610 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
611 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
613 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
614 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
615 if (fhNClustersForITSPID[i])
616 fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
617 if (fhNMissingITSPoints[i])
618 fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
620 fhC11[i] ->Add(entry->fhC11[i] );
621 fhC22[i] ->Add(entry->fhC22[i] );
622 fhC33[i] ->Add(entry->fhC33[i] );
623 fhC44[i] ->Add(entry->fhC44[i] );
624 fhC55[i] ->Add(entry->fhC55[i] );
626 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
628 fhDXY[i] ->Add(entry->fhDXY[i] );
629 fhDZ[i] ->Add(entry->fhDZ[i] );
630 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
631 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
633 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
634 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
635 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
636 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
638 fhPt[i] ->Add(entry->fhPt[i]);
639 fhEta[i] ->Add(entry->fhEta[i]);
642 fhCutStatistics ->Add(entry->fhCutStatistics);
643 fhCutCorrelation ->Add(entry->fhCutCorrelation);
650 //____________________________________________________________________
651 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
653 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
655 AliInfoClass("Creating track cuts for TPC-only.");
657 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
659 esdTrackCuts->SetMinNClustersTPC(50);
660 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
661 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
663 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
664 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
665 esdTrackCuts->SetDCAToVertex2D(kTRUE);
670 //____________________________________________________________________
671 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
673 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
675 AliInfoClass("Creating track cuts for ITS+TPC (2009 definition).");
677 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
680 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
681 esdTrackCuts->SetMinNClustersTPC(70);
682 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
683 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
684 esdTrackCuts->SetRequireTPCRefit(kTRUE);
686 esdTrackCuts->SetRequireITSRefit(kTRUE);
687 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
688 AliESDtrackCuts::kAny);
690 // 7*(0.0050+0.0060/pt^0.9)
691 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
693 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
694 esdTrackCuts->SetDCAToVertex2D(kFALSE);
695 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
696 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
701 //____________________________________________________________________
702 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
704 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
705 // if clusterCut = 1, the cut on the number of clusters is replaced by
706 // a cut on the number of crossed rows and on the ration crossed
707 // rows/findable clusters
709 AliInfoClass("Creating track cuts for ITS+TPC (2010 definition).");
711 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
714 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
715 else if (clusterCut == 1) {
716 esdTrackCuts->SetMinNCrossedRowsTPC(70);
717 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
720 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
721 esdTrackCuts->SetMinNClustersTPC(70);
723 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
724 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
725 esdTrackCuts->SetRequireTPCRefit(kTRUE);
727 esdTrackCuts->SetRequireITSRefit(kTRUE);
728 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
729 AliESDtrackCuts::kAny);
731 // 7*(0.0026+0.0050/pt^1.01)
732 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
734 esdTrackCuts->SetMaxDCAToVertexZ(2);
735 esdTrackCuts->SetDCAToVertex2D(kFALSE);
736 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
741 //____________________________________________________________________
745 //____________________________________________________________________
746 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
748 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
750 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
751 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
752 esdTrackCuts->SetRequireITSRefit(kTRUE);
753 esdTrackCuts->SetMinNClustersITS(4);
754 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
755 AliESDtrackCuts::kAny);
756 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
759 // 7*(0.0085+0.0026/pt^1.55)
760 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
763 esdTrackCuts->SetRequireITSPid(kTRUE);
768 //____________________________________________________________________
769 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
771 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
773 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
774 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
775 esdTrackCuts->SetRequireITSRefit(kTRUE);
776 esdTrackCuts->SetMinNClustersITS(4);
777 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
778 AliESDtrackCuts::kAny);
779 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
782 // 7*(0.0033+0.0045/pt^1.3)
783 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
786 esdTrackCuts->SetRequireITSPid(kTRUE);
791 //____________________________________________________________________
792 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
794 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
796 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
797 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
798 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
799 esdTrackCuts->SetRequireITSRefit(kTRUE);
800 esdTrackCuts->SetMinNClustersITS(4);
801 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
802 AliESDtrackCuts::kAny);
803 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
806 // 7*(0.0085+0.0026/pt^1.55)
807 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
810 esdTrackCuts->SetRequireITSPid(kTRUE);
815 //____________________________________________________________________
816 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
818 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
820 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
821 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
822 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
823 esdTrackCuts->SetRequireITSRefit(kTRUE);
824 esdTrackCuts->SetMinNClustersITS(4);
825 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
826 AliESDtrackCuts::kAny);
827 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
830 // 7*(0.0033+0.0045/pt^1.3)
831 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
834 esdTrackCuts->SetRequireITSPid(kTRUE);
839 //____________________________________________________________________
840 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
842 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
844 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
845 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
849 //____________________________________________________________________
851 AliESDtrackCuts* AliESDtrackCuts::GetStandardV0DaughterCuts()
853 // creates a AliESDtrackCuts object and fills it with standard cuts for V0 daughters
854 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
855 esdTrackCuts->SetRequireTPCRefit(kTRUE);
856 esdTrackCuts->SetMinNClustersTPC(70);
857 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
861 //____________________________________________________________________
862 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
864 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
865 // tpcOnly = kTRUE -> consider TPC-only tracks
866 // = kFALSE -> consider global tracks
868 // DEPRECATED Use GetReferenceMultiplicity with the enum as second argument instead
872 AliErrorClass("Not implemented for global tracks!");
876 static AliESDtrackCuts* esdTrackCuts = 0;
879 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
880 esdTrackCuts->SetEtaRange(-0.8, 0.8);
881 esdTrackCuts->SetPtRange(0.15);
884 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
889 //____________________________________________________________________
890 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* const esdTrack)
892 // Calculates the number of sigma to the vertex.
897 esdTrack->GetImpactParameters(b,bCov);
899 if (bCov[0]<=0 || bCov[2]<=0) {
900 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
901 bCov[0]=0; bCov[2]=0;
903 bRes[0] = TMath::Sqrt(bCov[0]);
904 bRes[1] = TMath::Sqrt(bCov[2]);
906 // -----------------------------------
907 // How to get to a n-sigma cut?
909 // The accumulated statistics from 0 to d is
911 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
912 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
914 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
915 // Can this be expressed in a different way?
917 if (bRes[0] == 0 || bRes[1] ==0)
920 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
922 // work around precision problem
923 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
924 // 1e-15 corresponds to nsigma ~ 7.7
925 if (TMath::Exp(-d * d / 2) < 1e-15)
928 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
932 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
934 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
936 tree->SetBranchStatus("fTracks.fFlags", 1);
937 tree->SetBranchStatus("fTracks.fITSncls", 1);
938 tree->SetBranchStatus("fTracks.fTPCncls", 1);
939 tree->SetBranchStatus("fTracks.fITSchi2", 1);
940 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
941 tree->SetBranchStatus("fTracks.fC*", 1);
942 tree->SetBranchStatus("fTracks.fD", 1);
943 tree->SetBranchStatus("fTracks.fZ", 1);
944 tree->SetBranchStatus("fTracks.fCdd", 1);
945 tree->SetBranchStatus("fTracks.fCdz", 1);
946 tree->SetBranchStatus("fTracks.fCzz", 1);
947 tree->SetBranchStatus("fTracks.fP*", 1);
948 tree->SetBranchStatus("fTracks.fR*", 1);
949 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
952 //____________________________________________________________________
953 Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
956 // figure out if the tracks survives all the track cuts defined
958 // the different quality parameter and kinematic values are first
959 // retrieved from the track. then it is found out what cuts the
960 // track did not survive and finally the cuts are imposed.
962 // this function needs the following branches:
968 // fTracks.fC //GetExternalCovariance
969 // fTracks.fD //GetImpactParameters
970 // fTracks.fZ //GetImpactParameters
971 // fTracks.fCdd //GetImpactParameters
972 // fTracks.fCdz //GetImpactParameters
973 // fTracks.fCzz //GetImpactParameters
974 // fTracks.fP //GetPxPyPz
975 // fTracks.fR //GetMass
976 // fTracks.fP //GetMass
977 // fTracks.fKinkIndexes
979 UInt_t status = esdTrack->GetStatus();
981 // getting quality parameters from the ESD track
982 Int_t nClustersITS = esdTrack->GetITSclusters(0);
983 Int_t nClustersTPC = -1;
984 if(fCutRequireTPCStandAlone) {
985 nClustersTPC = esdTrack->GetTPCNclsIter1();
988 nClustersTPC = esdTrack->GetTPCclusters(0);
990 Float_t nCrossedRowsTPC = esdTrack->GetTPCClusterInfo(2,1);
991 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
992 if (esdTrack->GetTPCNclsF()>0) {
993 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
996 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
997 Float_t fracClustersTPCShared = -1.;
999 Float_t chi2PerClusterITS = -1;
1000 Float_t chi2PerClusterTPC = -1;
1001 if (nClustersITS!=0)
1002 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
1003 if (nClustersTPC!=0) {
1004 if(fCutRequireTPCStandAlone) {
1005 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1007 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
1009 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1012 Double_t extCov[15];
1013 esdTrack->GetExternalCovariance(extCov);
1015 // getting the track to vertex parameters
1016 Float_t nSigmaToVertex = GetSigmaToVertex(esdTrack);
1020 esdTrack->GetImpactParameters(b,bCov);
1021 if (bCov[0]<=0 || bCov[2]<=0) {
1022 AliDebug(1, "Estimated b resolution lower or equal zero!");
1023 bCov[0]=0; bCov[2]=0;
1027 // set pt-dependent DCA cuts, if requested
1028 SetPtDepDCACuts(esdTrack->Pt());
1031 Float_t dcaToVertexXY = b[0];
1032 Float_t dcaToVertexZ = b[1];
1034 Float_t dcaToVertex = -1;
1036 if (fCutDCAToVertex2D)
1038 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1041 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1043 // getting the kinematic variables of the track
1044 // (assuming the mass is known)
1046 esdTrack->GetPxPyPz(p);
1048 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1049 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1050 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1052 //y-eta related calculations
1053 Float_t eta = -100.;
1055 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1056 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1057 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1058 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1062 AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1065 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1067 //########################################################################
1070 Bool_t cuts[kNCuts];
1071 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1073 // track quality cuts
1074 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1076 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1078 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1080 if (nClustersTPC<fCutMinNClusterTPC)
1082 if (nClustersITS<fCutMinNClusterITS)
1084 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1086 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1088 if (extCov[0] > fCutMaxC11)
1090 if (extCov[2] > fCutMaxC22)
1092 if (extCov[5] > fCutMaxC33)
1094 if (extCov[9] > fCutMaxC44)
1096 if (extCov[14] > fCutMaxC55)
1098 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1100 // if n sigma could not be calculated
1101 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1103 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1105 // track kinematics cut
1106 if((momentum < fPMin) || (momentum > fPMax))
1108 if((pt < fPtMin) || (pt > fPtMax))
1110 if((p[0] < fPxMin) || (p[0] > fPxMax))
1112 if((p[1] < fPyMin) || (p[1] > fPyMax))
1114 if((p[2] < fPzMin) || (p[2] > fPzMax))
1116 if((eta < fEtaMin) || (eta > fEtaMax))
1118 if((y < fRapMin) || (y > fRapMax))
1120 if (fCutDCAToVertex2D && dcaToVertex > 1)
1122 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1124 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1126 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1128 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1130 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1133 for (Int_t i = 0; i < 3; i++)
1134 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1136 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1137 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1141 // ITS standalone tracks
1142 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1143 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1144 }else if(fCutRequireITSpureSA){
1145 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1150 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1153 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1156 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1159 Int_t nITSPointsForPid=0;
1160 UChar_t clumap=esdTrack->GetITSClusterMap();
1161 for(Int_t i=2; i<6; i++){
1162 if(clumap&(1<<i)) ++nITSPointsForPid;
1164 if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1167 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1169 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1172 Int_t nMissITSpts=0;
1173 Int_t idet,statusLay;
1175 for(Int_t iLay=0; iLay<6; iLay++){
1176 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1177 if(retc && statusLay==5) ++nMissITSpts;
1179 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1182 for (Int_t i=0; i<kNCuts; i++)
1183 if (cuts[i]) {cut = kTRUE;}
1186 //########################################################################
1187 // filling histograms
1188 if (fHistogramsOn) {
1189 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1191 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1193 for (Int_t i=0; i<kNCuts; i++) {
1194 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1195 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1198 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1200 for (Int_t j=i; j<kNCuts; j++) {
1201 if (cuts[i] && cuts[j]) {
1202 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1203 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1204 fhCutCorrelation->Fill(xC, yC);
1210 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1211 // the code is not in a function due to too many local variables that would need to be passed
1213 for (Int_t id = 0; id < 2; id++)
1215 // id = 0 --> before cut
1216 // id = 1 --> after cut
1220 fhNClustersITS[id]->Fill(nClustersITS);
1221 fhNClustersTPC[id]->Fill(nClustersTPC);
1222 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1223 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1224 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1225 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1226 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1227 fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1228 fhNMissingITSPoints[id]->Fill(nMissITSpts);
1230 fhC11[id]->Fill(extCov[0]);
1231 fhC22[id]->Fill(extCov[2]);
1232 fhC33[id]->Fill(extCov[5]);
1233 fhC44[id]->Fill(extCov[9]);
1234 fhC55[id]->Fill(extCov[14]);
1236 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1239 fhEta[id]->Fill(eta);
1242 bRes[0] = TMath::Sqrt(bCov[0]);
1243 bRes[1] = TMath::Sqrt(bCov[2]);
1245 fhDZ[id]->Fill(b[1]);
1246 fhDXY[id]->Fill(b[0]);
1247 fhDXYDZ[id]->Fill(dcaToVertex);
1248 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1250 if (bRes[0]!=0 && bRes[1]!=0) {
1251 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1252 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1253 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1254 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1266 //____________________________________________________________________
1267 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1269 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1273 case kOff: return kTRUE;
1274 case kNone: return !clusterL1 && !clusterL2;
1275 case kAny: return clusterL1 || clusterL2;
1276 case kFirst: return clusterL1;
1277 case kOnlyFirst: return clusterL1 && !clusterL2;
1278 case kSecond: return clusterL2;
1279 case kOnlySecond: return clusterL2 && !clusterL1;
1280 case kBoth: return clusterL1 && clusterL2;
1286 //____________________________________________________________________
1287 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(const AliESDEvent* esd, Int_t iTrack)
1290 // Utility function to
1291 // create a TPC only track from the given esd track
1293 // IMPORTANT: The track has to be deleted by the user
1295 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1296 // there are only missing propagations here that are needed for old data
1297 // this function will therefore become obsolete
1299 // adapted from code provided by CKB
1301 if (!esd->GetPrimaryVertexTPC())
1302 return 0; // No TPC vertex no TPC tracks
1304 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1305 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1307 AliESDtrack* track = esd->GetTrack(iTrack);
1311 AliESDtrack *tpcTrack = new AliESDtrack();
1313 // only true if we have a tpc track
1314 if (!track->FillTPCOnlyTrack(*tpcTrack))
1320 // propagate to Vertex
1321 // not needed for normal reconstructed ESDs...
1322 // Double_t pTPC[2],covTPC[3];
1323 // tpcTrack->PropagateToDCA(esd->GetPrimaryVertexTPC(), esd->GetMagneticField(), 10000, pTPC, covTPC);
1328 //____________________________________________________________________
1329 TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
1332 // returns an array of all tracks that pass the cuts
1333 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1334 // tracks that pass the cut
1336 // NOTE: List has to be deleted by the user
1338 TObjArray* acceptedTracks = new TObjArray();
1340 // loop over esd tracks
1341 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1343 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1344 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1346 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1350 if (AcceptTrack(tpcTrack)) {
1351 acceptedTracks->Add(tpcTrack);
1358 AliESDtrack* track = esd->GetTrack(iTrack);
1359 if(AcceptTrack(track))
1360 acceptedTracks->Add(track);
1363 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1364 return acceptedTracks;
1367 //____________________________________________________________________
1368 Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
1371 // returns an the number of tracks that pass the cuts
1376 // loop over esd tracks
1377 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1378 AliESDtrack* track = esd->GetTrack(iTrack);
1379 if (AcceptTrack(track))
1386 //____________________________________________________________________
1387 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1389 // diagnostics histograms are defined
1392 fHistogramsOn=kTRUE;
1394 Bool_t oldStatus = TH1::AddDirectoryStatus();
1395 TH1::AddDirectory(kFALSE);
1397 //###################################################################################
1398 // defining histograms
1400 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1402 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1403 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1405 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1407 for (Int_t i=0; i<kNCuts; i++) {
1408 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1409 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1410 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1413 fhCutStatistics ->SetLineColor(color);
1414 fhCutCorrelation ->SetLineColor(color);
1415 fhCutStatistics ->SetLineWidth(2);
1416 fhCutCorrelation ->SetLineWidth(2);
1418 for (Int_t i=0; i<2; i++) {
1419 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1420 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1421 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1422 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1423 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1424 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1425 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1426 fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
1427 fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
1429 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1430 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1431 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1432 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1433 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1435 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1437 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1438 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1439 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1440 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1442 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1443 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1444 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1446 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1448 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1449 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1451 fhNClustersITS[i]->SetTitle("n ITS clusters");
1452 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1453 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1454 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1455 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1456 fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
1457 fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
1459 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1460 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1461 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1462 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1463 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1465 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1467 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1468 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1469 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1470 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1471 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1473 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1474 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1475 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1476 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1477 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1479 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1480 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1481 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1482 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1483 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1484 fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
1485 fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
1487 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1488 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1489 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1490 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1491 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1493 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1495 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1496 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1497 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1499 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1500 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1501 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1504 // The number of sigmas to the vertex is per definition gaussian
1505 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1506 ffDTheoretical->SetParameter(0,1);
1508 TH1::AddDirectory(oldStatus);
1511 //____________________________________________________________________
1512 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1515 // loads the histograms from a file
1516 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1522 if (!gDirectory->cd(dir))
1525 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1527 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1528 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1530 for (Int_t i=0; i<2; i++) {
1533 gDirectory->cd("before_cuts");
1536 gDirectory->cd("after_cuts");
1538 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1539 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1540 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1541 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1542 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1543 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1544 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1545 fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
1546 fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
1548 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1549 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1550 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1551 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1552 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1554 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1556 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1557 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1558 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1559 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1561 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1562 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1563 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1564 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1566 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1567 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1569 gDirectory->cd("../");
1572 gDirectory->cd("..");
1577 //____________________________________________________________________
1578 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1580 // saves the histograms in a directory (dir)
1583 if (!fHistogramsOn) {
1584 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1591 gDirectory->mkdir(dir);
1592 gDirectory->cd(dir);
1594 gDirectory->mkdir("before_cuts");
1595 gDirectory->mkdir("after_cuts");
1597 // a factor of 2 is needed since n sigma is positive
1598 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1599 ffDTheoretical->Write("nSigmaToVertexTheory");
1601 fhCutStatistics->Write();
1602 fhCutCorrelation->Write();
1604 for (Int_t i=0; i<2; i++) {
1606 gDirectory->cd("before_cuts");
1608 gDirectory->cd("after_cuts");
1610 fhNClustersITS[i] ->Write();
1611 fhNClustersTPC[i] ->Write();
1612 fhNSharedClustersTPC[i] ->Write();
1613 fhNCrossedRowsTPC[i] ->Write();
1614 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1615 fhChi2PerClusterITS[i] ->Write();
1616 fhChi2PerClusterTPC[i] ->Write();
1617 fhNClustersForITSPID[i] ->Write();
1618 fhNMissingITSPoints[i] ->Write();
1626 fhRel1PtUncertainty[i] ->Write();
1630 fhDXYDZ[i] ->Write();
1631 fhDXYvsDZ[i] ->Write();
1633 fhDXYNormalized[i] ->Write();
1634 fhDZNormalized[i] ->Write();
1635 fhDXYvsDZNormalized[i] ->Write();
1636 fhNSigmaToVertex[i] ->Write();
1641 gDirectory->cd("../");
1644 gDirectory->cd("../");
1647 //____________________________________________________________________
1648 void AliESDtrackCuts::DrawHistograms()
1650 // draws some histograms
1652 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1653 canvas1->Divide(2, 2);
1656 fhNClustersTPC[0]->SetStats(kFALSE);
1657 fhNClustersTPC[0]->Draw();
1660 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1661 fhChi2PerClusterTPC[0]->Draw();
1664 fhNSigmaToVertex[0]->SetStats(kFALSE);
1665 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1666 fhNSigmaToVertex[0]->Draw();
1668 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1670 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1671 canvas2->Divide(3, 2);
1674 fhC11[0]->SetStats(kFALSE);
1679 fhC22[0]->SetStats(kFALSE);
1684 fhC33[0]->SetStats(kFALSE);
1689 fhC44[0]->SetStats(kFALSE);
1694 fhC55[0]->SetStats(kFALSE);
1699 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1701 fhRel1PtUncertainty[0]->Draw();
1703 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1705 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1706 canvas3->Divide(3, 2);
1709 fhDXY[0]->SetStats(kFALSE);
1714 fhDZ[0]->SetStats(kFALSE);
1719 fhDXYvsDZ[0]->SetStats(kFALSE);
1721 gPad->SetRightMargin(0.15);
1722 fhDXYvsDZ[0]->Draw("COLZ");
1725 fhDXYNormalized[0]->SetStats(kFALSE);
1727 fhDXYNormalized[0]->Draw();
1730 fhDZNormalized[0]->SetStats(kFALSE);
1732 fhDZNormalized[0]->Draw();
1735 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1737 gPad->SetRightMargin(0.15);
1738 fhDXYvsDZNormalized[0]->Draw("COLZ");
1740 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1742 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1743 canvas4->Divide(2, 1);
1746 fhCutStatistics->SetStats(kFALSE);
1747 fhCutStatistics->LabelsOption("v");
1748 gPad->SetBottomMargin(0.3);
1749 fhCutStatistics->Draw();
1752 fhCutCorrelation->SetStats(kFALSE);
1753 fhCutCorrelation->LabelsOption("v");
1754 gPad->SetBottomMargin(0.3);
1755 gPad->SetLeftMargin(0.3);
1756 fhCutCorrelation->Draw("COLZ");
1758 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1761 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1762 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1765 fhNClustersTPC[0]->SetStats(kFALSE);
1766 fhNClustersTPC[0]->DrawCopy();
1769 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1770 fhChi2PerClusterITS[0]->DrawCopy();
1771 fhChi2PerClusterITS[1]->SetLineColor(2);
1772 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1775 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1776 fhChi2PerClusterTPC[0]->DrawCopy();
1777 fhChi2PerClusterTPC[1]->SetLineColor(2);
1778 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1780 //--------------------------------------------------------------------------
1781 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1783 // set the pt-dependent DCA cuts
1786 if(f1CutMaxDCAToVertexXYPtDep) {
1787 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
1790 if(f1CutMaxDCAToVertexZPtDep) {
1791 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
1794 if(f1CutMinDCAToVertexXYPtDep) {
1795 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
1798 if(f1CutMinDCAToVertexZPtDep) {
1799 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
1808 //--------------------------------------------------------------------------
1809 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
1811 // Check the correctness of the string syntax
1813 Bool_t retval=kTRUE;
1815 if(!dist.Contains("pt")) {
1816 if(print) AliError("string must contain \"pt\"");
1822 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
1824 if(f1CutMaxDCAToVertexXYPtDep){
1825 delete f1CutMaxDCAToVertexXYPtDep;
1827 f1CutMaxDCAToVertexXYPtDep = 0;
1828 fCutMaxDCAToVertexXYPtDep = "";
1830 if(!CheckPtDepDCA(dist,kTRUE)){
1833 fCutMaxDCAToVertexXYPtDep = dist;
1835 tmp.ReplaceAll("pt","x");
1836 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
1840 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
1843 if(f1CutMaxDCAToVertexZPtDep){
1844 delete f1CutMaxDCAToVertexZPtDep;
1846 f1CutMaxDCAToVertexZPtDep = 0;
1847 fCutMaxDCAToVertexZPtDep = "";
1849 if(!CheckPtDepDCA(dist,kTRUE))return;
1851 fCutMaxDCAToVertexZPtDep = dist;
1853 tmp.ReplaceAll("pt","x");
1854 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
1860 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
1863 if(f1CutMinDCAToVertexXYPtDep){
1864 delete f1CutMinDCAToVertexXYPtDep;
1866 f1CutMinDCAToVertexXYPtDep = 0;
1867 fCutMinDCAToVertexXYPtDep = "";
1869 if(!CheckPtDepDCA(dist,kTRUE))return;
1871 fCutMinDCAToVertexXYPtDep = dist;
1873 tmp.ReplaceAll("pt","x");
1874 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
1879 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
1883 if(f1CutMinDCAToVertexZPtDep){
1884 delete f1CutMinDCAToVertexZPtDep;
1886 f1CutMinDCAToVertexZPtDep = 0;
1887 fCutMinDCAToVertexZPtDep = "";
1889 if(!CheckPtDepDCA(dist,kTRUE))return;
1890 fCutMinDCAToVertexZPtDep = dist;
1892 tmp.ReplaceAll("pt","x");
1893 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
1896 AliESDtrackCuts* AliESDtrackCuts::GetMultEstTrackCuts(MultEstTrackCuts cut)
1898 // returns the multiplicity estimator track cuts objects to allow for user configuration
1899 // upon first call the objects are created
1901 // the cut defined here correspond to GetStandardITSTPCTrackCuts2010 (apart from the one for without SPD)
1903 if (!fgMultEstTrackCuts[kMultEstTrackCutGlobal])
1905 // quality cut on ITS+TPC tracks
1906 fgMultEstTrackCuts[kMultEstTrackCutGlobal] = new AliESDtrackCuts();
1907 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMinNClustersTPC(70);
1908 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMaxChi2PerClusterTPC(4);
1909 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetAcceptKinkDaughters(kFALSE);
1910 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireTPCRefit(kTRUE);
1911 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireITSRefit(kTRUE);
1912 //multiplicity underestimate if we use global tracks with |eta| > 0.9
1913 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetEtaRange(-0.9, 0.9);
1915 // quality cut on ITS_SA tracks (complementary to ITS+TPC)
1916 fgMultEstTrackCuts[kMultEstTrackCutITSSA] = new AliESDtrackCuts();
1917 fgMultEstTrackCuts[kMultEstTrackCutITSSA]->SetRequireITSRefit(kTRUE);
1919 // primary selection for tracks with SPD hits
1920 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD] = new AliESDtrackCuts();
1921 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
1922 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
1923 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexZ(2);
1925 // primary selection for tracks w/o SPD hits
1926 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD] = new AliESDtrackCuts();
1927 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
1928 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
1929 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexZ(2);
1932 return fgMultEstTrackCuts[cut];
1935 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType, Float_t etaRange)
1937 // Get multiplicity estimate based on TPC/ITS tracks and tracklets
1938 // Adapted for AliESDtrackCuts from a version developed by: Ruben Shahoyan, Anton Alkin, Arvinder Palaha
1940 // Returns a negative value if no reliable estimate can be provided:
1941 // -1 SPD vertex missing
1942 // -2 SPD VertexerZ dispersion too large
1943 // -3 Track vertex missing (not checked for kTracklets)
1944 // -4 Distance between SPD and track vertices too large (not checked for kTracklets)
1946 // WARNING This functions does not cut on the z vtx. Depending on the eta range requested, you need to restrict your z vertex range!
1948 // Strategy for combined estimators
1949 // 1. Count global tracks and flag them
1950 // 2. Count ITSSA as complementaries for ITSTPC+ or as main tracks
1951 // 3. Count the complementary SPD tracklets
1953 const AliESDVertex* vertices[2];
1954 vertices[0] = esd->GetPrimaryVertexSPD();
1955 vertices[1] = esd->GetPrimaryVertexTracks();
1957 if (!vertices[0]->GetStatus())
1959 AliDebugClass(AliLog::kDebug, "No SPD vertex. Not able to make a reliable multiplicity estimate.");
1963 if (vertices[0]->IsFromVertexerZ() && vertices[0]->GetDispersion() > 0.02)
1965 AliDebugClass(AliLog::kDebug, "Vertexer z dispersion > 0.02. Not able to make a reliable multiplicity estimate.");
1969 Int_t multiplicityEstimate = 0;
1971 // SPD tracklet-only estimate
1972 if (trackType == kTracklets)
1974 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
1975 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i)
1977 if (TMath::Abs(spdmult->GetEta(i)) > etaRange)
1978 continue; // eta selection for tracklets
1979 multiplicityEstimate++;
1981 return multiplicityEstimate;
1984 if (!vertices[1]->GetStatus())
1986 AliDebugClass(AliLog::kDebug, "No track vertex. Not able to make a reliable multiplicity estimate.");
1990 // TODO value of displacement to be studied
1991 const Float_t maxDisplacement = 0.5;
1992 //check for displaced vertices
1993 Double_t displacement = TMath::Abs(vertices[0]->GetZ() - vertices[1]->GetZ());
1994 if (displacement > maxDisplacement)
1996 AliDebugClass(AliLog::kDebug, Form("Displaced vertices %f > %f",displacement,maxDisplacement));
2000 // update eta range in track cuts
2001 GetMultEstTrackCuts(kMultEstTrackCutITSSA)->SetEtaRange(-etaRange, etaRange);
2002 GetMultEstTrackCuts(kMultEstTrackCutDCAwSPD)->SetEtaRange(-etaRange, etaRange);
2003 GetMultEstTrackCuts(kMultEstTrackCutDCAwoSPD)->SetEtaRange(-etaRange, etaRange);
2005 //*******************************************************************************************************
2006 //set counters to initial zeros
2007 Int_t tracksITSTPC = 0; //number of global tracks for a given event
2008 Int_t tracksITSSA = 0; //number of ITS standalone tracks for a given event
2009 Int_t tracksITSTPCSA_complementary = 0; //number of ITS standalone tracks complementary to TPC for a given event
2010 Int_t trackletsITSTPC_complementary = 0;//number of SPD tracklets complementary to global/ITSSA tracks for a given events
2011 Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
2013 const Int_t nESDTracks = esd->GetNumberOfTracks();
2014 Int_t highestID = 0;
2016 // flags for secondary and rejected tracks
2017 const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
2018 const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
2020 for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
2021 if(esd->GetTrack(itracks)->GetLabel() > highestID) highestID = esd->GetTrack(itracks)->GetLabel();
2022 esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
2024 const Int_t maxid = highestID+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
2026 // bit mask for esd tracks, to check if multiple tracklets are associated to it
2027 Bool_t globalBits[maxid], pureITSBits[maxid];
2028 for(Int_t i=0; i<maxid; i++){ // set all bools to false
2029 globalBits[i]=kFALSE;
2030 pureITSBits[i]=kFALSE;
2033 //*******************************************************************************************************
2034 // get multiplicity from global tracks
2035 for(Int_t itracks = 0; itracks < nESDTracks; itracks++) { // flag the tracks
2036 AliESDtrack* track = esd->GetTrack(itracks);
2038 // if track is a secondary from a V0, flag as a secondary
2039 if (track->IsOn(AliESDtrack::kMultInV0)) {
2040 track->SetBit(kSecBit);
2045 if (track->IsOn(AliESDtrack::kMultSec)) {
2046 track->SetBit(kSecBit);
2050 // check tracks with ITS part
2051 //*******************************************************************************************************
2052 if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
2053 //*******************************************************************************************************
2055 if (track->IsOn(AliESDtrack::kTPCin)) { // Global track, has ITS and TPC contributions
2056 if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
2057 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2058 tracksITSTPC++; //global track counted
2059 globalBits[itracks] = kTRUE;
2061 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2063 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2065 //*******************************************************************************************************
2066 // ITS complementary
2067 else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
2068 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2069 tracksITSTPCSA_complementary++;
2070 globalBits[itracks] = kTRUE;
2072 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2074 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2076 //*******************************************************************************************************
2077 // check tracks from ITS_SA_PURE
2078 if (track->IsOn(AliESDtrack::kITSin) && track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSSA){
2079 if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
2080 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2082 pureITSBits[itracks] = kTRUE;
2084 else track->SetBit(kRejBit);
2086 else track->SetBit(kRejBit);
2088 }//ESD tracks counted
2090 //*******************************************************************************************************
2091 // get multiplicity from ITS tracklets to complement TPC+ITS, and ITSpureSA
2092 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2093 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i) {
2094 if (TMath::Abs(spdmult->GetEta(i)) > etaRange) continue; // eta selection for tracklets
2096 // if counting tracks+tracklets, check if clusters were already used in tracks
2097 Int_t id1,id2,id3,id4;
2098 spdmult->GetTrackletTrackIDs(i,0,id1,id2); // references for eventual Global/ITS_SA tracks
2099 AliESDtrack* tr1 = id1>=0 ? esd->GetTrack(id1) : 0;
2100 spdmult->GetTrackletTrackIDs(i,1,id3,id4); // references for eventual ITS_SA_pure tracks
2101 AliESDtrack* tr3 = id3>=0 ? esd->GetTrack(id3) : 0;
2103 // are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
2104 if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
2106 Bool_t bUsedInGlobal = (id1 != -1) ? globalBits[id1] : 0;// has associated global track been associated to a previous tracklet?
2107 Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits[id3] : 0;// has associated pure ITS track been associated to a previous tracklet?
2108 //*******************************************************************************************************
2109 if (trackType == kTrackletsITSTPC) {
2110 // count tracklets towards global+complementary tracks
2111 if ( (tr1 && !tr1->TestBit(kSecBit)) && // reject as secondary
2112 (tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2114 ++trackletsITSTPC_complementary;
2115 if(id1>0) globalBits[id1] = kTRUE; // mark global track linked to this tracklet as "associated"
2119 ++trackletsITSTPC_complementary; // if no associated track, count the tracklet
2122 // count tracklets towards ITS_SA_pure tracks
2123 if ( (tr3 && !tr3->TestBit(kSecBit)) && // reject as secondary
2124 (tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2125 if(!bUsedInPureITS) {
2126 ++trackletsITSSA_complementary;
2127 if(id3>0) pureITSBits[id3] = kTRUE; // mark global track linked to this tracklet as "associated"
2131 ++trackletsITSSA_complementary; // if no associated track, count the tracklet
2136 //*******************************************************************************************************
2137 if (trackType == kTrackletsITSTPC)
2138 multiplicityEstimate = tracksITSTPC + tracksITSTPCSA_complementary + trackletsITSTPC_complementary;
2140 multiplicityEstimate = tracksITSSA + trackletsITSSA_complementary;
2142 return multiplicityEstimate;