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>
33 //____________________________________________________________________
34 ClassImp(AliESDtrackCuts)
37 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
39 "require TPC standalone",
43 "#Chi^{2}/cluster TPC",
44 "#Chi^{2}/cluster ITS",
60 "trk-to-vtx max dca 2D absolute",
61 "trk-to-vtx max dca xy absolute",
62 "trk-to-vtx max dca z absolute",
63 "trk-to-vtx min dca 2D absolute",
64 "trk-to-vtx min dca xy absolute",
65 "trk-to-vtx min dca z absolute",
66 "SPD cluster requirement",
67 "SDD cluster requirement",
68 "SSD cluster requirement",
69 "require ITS stand-alone",
70 "rel 1/pt uncertainty",
71 "TPC n shared clusters",
72 "TPC rel shared clusters",
75 "n crossed rows / n findable clusters",
77 "#Chi^{2} TPC constrained vs. global",
80 "min length in active volume TPC"
83 AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
84 Char_t AliESDtrackCuts::fgBeamTypeFlag = -1;
86 //____________________________________________________________________
87 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
88 fCutMinNClusterTPC(0),
89 fCutMinNClusterITS(0),
90 fCutMinNCrossedRowsTPC(0),
91 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
92 f1CutMinNClustersTPCPtDep(0x0),
93 fCutMaxPtDepNClustersTPC(0),
94 fCutMinLengthActiveVolumeTPC(0),
95 fCutMaxChi2PerClusterTPC(0),
96 fCutMaxChi2PerClusterITS(0),
97 fCutMaxChi2TPCConstrainedVsGlobal(0),
98 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
99 fCutMaxMissingITSPoints(0),
105 fCutMaxRel1PtUncertainty(0),
106 fCutAcceptKinkDaughters(0),
107 fCutAcceptSharedTPCClusters(0),
108 fCutMaxFractionSharedTPCClusters(0),
109 fCutRequireTPCRefit(0),
110 fCutRequireTPCStandAlone(0),
111 fCutRequireITSRefit(0),
112 fCutRequireITSPid(0),
113 fCutRequireITSStandAlone(0),
114 fCutRequireITSpureSA(0),
115 fCutNsigmaToVertex(0),
116 fCutSigmaToVertexRequired(0),
117 fCutMaxDCAToVertexXY(0),
118 fCutMaxDCAToVertexZ(0),
119 fCutMinDCAToVertexXY(0),
120 fCutMinDCAToVertexZ(0),
121 fCutMaxDCAToVertexXYPtDep(""),
122 fCutMaxDCAToVertexZPtDep(""),
123 fCutMinDCAToVertexXYPtDep(""),
124 fCutMinDCAToVertexZPtDep(""),
125 f1CutMaxDCAToVertexXYPtDep(0x0),
126 f1CutMaxDCAToVertexZPtDep(0x0),
127 f1CutMinDCAToVertexXYPtDep(0x0),
128 f1CutMinDCAToVertexZPtDep(0x0),
129 fCutDCAToVertex2D(0),
144 fCutRequireTOFout(kFALSE),
145 fFlagCutTOFdistance(kFALSE),
158 //##############################################################################
159 // setting default cuts
160 SetMinNClustersTPC();
161 SetMinNClustersITS();
162 SetMinNCrossedRowsTPC();
163 SetMinRatioCrossedRowsOverFindableClustersTPC();
164 SetMaxChi2PerClusterTPC();
165 SetMaxChi2PerClusterITS();
166 SetMaxChi2TPCConstrainedGlobal();
167 SetMaxChi2TPCConstrainedGlobalVertexType();
168 SetMaxNOfMissingITSPoints();
169 SetMaxCovDiagonalElements();
170 SetMaxRel1PtUncertainty();
171 SetRequireTPCRefit();
172 SetRequireTPCStandAlone();
173 SetRequireITSRefit();
174 SetRequireITSPid(kFALSE);
175 SetRequireITSStandAlone(kFALSE);
176 SetRequireITSPureStandAlone(kFALSE);
177 SetAcceptKinkDaughters();
178 SetAcceptSharedTPCClusters();
179 SetMaxFractionSharedTPCClusters();
180 SetMaxNsigmaToVertex();
181 SetMaxDCAToVertexXY();
182 SetMaxDCAToVertexZ();
184 SetMinDCAToVertexXY();
185 SetMinDCAToVertexZ();
193 SetClusterRequirementITS(kSPD);
194 SetClusterRequirementITS(kSDD);
195 SetClusterRequirementITS(kSSD);
200 //_____________________________________________________________________________
201 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
202 fCutMinNClusterTPC(0),
203 fCutMinNClusterITS(0),
204 fCutMinNCrossedRowsTPC(0),
205 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
206 f1CutMinNClustersTPCPtDep(0x0),
207 fCutMaxPtDepNClustersTPC(0),
208 fCutMinLengthActiveVolumeTPC(0),
209 fCutMaxChi2PerClusterTPC(0),
210 fCutMaxChi2PerClusterITS(0),
211 fCutMaxChi2TPCConstrainedVsGlobal(0),
212 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
213 fCutMaxMissingITSPoints(0),
219 fCutMaxRel1PtUncertainty(0),
220 fCutAcceptKinkDaughters(0),
221 fCutAcceptSharedTPCClusters(0),
222 fCutMaxFractionSharedTPCClusters(0),
223 fCutRequireTPCRefit(0),
224 fCutRequireTPCStandAlone(0),
225 fCutRequireITSRefit(0),
226 fCutRequireITSPid(0),
227 fCutRequireITSStandAlone(0),
228 fCutRequireITSpureSA(0),
229 fCutNsigmaToVertex(0),
230 fCutSigmaToVertexRequired(0),
231 fCutMaxDCAToVertexXY(0),
232 fCutMaxDCAToVertexZ(0),
233 fCutMinDCAToVertexXY(0),
234 fCutMinDCAToVertexZ(0),
235 fCutMaxDCAToVertexXYPtDep(""),
236 fCutMaxDCAToVertexZPtDep(""),
237 fCutMinDCAToVertexXYPtDep(""),
238 fCutMinDCAToVertexZPtDep(""),
239 f1CutMaxDCAToVertexXYPtDep(0x0),
240 f1CutMaxDCAToVertexZPtDep(0x0),
241 f1CutMinDCAToVertexXYPtDep(0x0),
242 f1CutMinDCAToVertexZPtDep(0x0),
243 fCutDCAToVertex2D(0),
258 fCutRequireTOFout(kFALSE),
259 fFlagCutTOFdistance(kFALSE),
270 ((AliESDtrackCuts &) c).Copy(*this);
273 AliESDtrackCuts::~AliESDtrackCuts()
279 for (Int_t i=0; i<2; i++) {
281 if (fhNClustersITS[i])
282 delete fhNClustersITS[i];
283 if (fhNClustersTPC[i])
284 delete fhNClustersTPC[i];
285 if (fhNSharedClustersTPC[i])
286 delete fhNSharedClustersTPC[i];
287 if (fhNCrossedRowsTPC[i])
288 delete fhNCrossedRowsTPC[i];
289 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
290 delete fhRatioCrossedRowsOverFindableClustersTPC[i];
291 if (fhChi2PerClusterITS[i])
292 delete fhChi2PerClusterITS[i];
293 if (fhChi2PerClusterTPC[i])
294 delete fhChi2PerClusterTPC[i];
295 if (fhChi2TPCConstrainedVsGlobal[i])
296 delete fhChi2TPCConstrainedVsGlobal[i];
297 if(fhNClustersForITSPID[i])
298 delete fhNClustersForITSPID[i];
299 if(fhNMissingITSPoints[i])
300 delete fhNMissingITSPoints[i];
312 if (fhRel1PtUncertainty[i])
313 delete fhRel1PtUncertainty[i];
324 if (fhDXYNormalized[i])
325 delete fhDXYNormalized[i];
326 if (fhDZNormalized[i])
327 delete fhDZNormalized[i];
328 if (fhDXYvsDZNormalized[i])
329 delete fhDXYvsDZNormalized[i];
330 if (fhNSigmaToVertex[i])
331 delete fhNSigmaToVertex[i];
336 if (fhTOFdistance[i])
337 delete fhTOFdistance[i];
340 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
341 f1CutMaxDCAToVertexXYPtDep = 0;
342 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
343 f1CutMaxDCAToVertexZPtDep = 0;
344 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
345 f1CutMinDCAToVertexXYPtDep = 0;
346 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
347 f1CutMinDCAToVertexZPtDep = 0;
351 delete ffDTheoretical;
354 delete fhCutStatistics;
355 if (fhCutCorrelation)
356 delete fhCutCorrelation;
358 if(f1CutMinNClustersTPCPtDep)
359 delete f1CutMinNClustersTPCPtDep;
363 void AliESDtrackCuts::Init()
366 // sets everything to zero
369 fCutMinNClusterTPC = 0;
370 fCutMinNClusterITS = 0;
372 fCutMaxChi2PerClusterTPC = 0;
373 fCutMaxChi2PerClusterITS = 0;
374 fCutMaxChi2TPCConstrainedVsGlobal = 0;
375 fCutMaxChi2TPCConstrainedVsGlobalVertexType = kVertexTracks | kVertexSPD;
376 fCutMaxMissingITSPoints = 0;
378 for (Int_t i = 0; i < 3; i++)
379 fCutClusterRequirementITS[i] = kOff;
387 fCutMaxRel1PtUncertainty = 0;
389 fCutAcceptKinkDaughters = 0;
390 fCutAcceptSharedTPCClusters = 0;
391 fCutMaxFractionSharedTPCClusters = 0;
392 fCutRequireTPCRefit = 0;
393 fCutRequireTPCStandAlone = 0;
394 fCutRequireITSRefit = 0;
395 fCutRequireITSPid = 0;
396 fCutRequireITSStandAlone = 0;
397 fCutRequireITSpureSA = 0;
399 fCutNsigmaToVertex = 0;
400 fCutSigmaToVertexRequired = 0;
401 fCutMaxDCAToVertexXY = 0;
402 fCutMaxDCAToVertexZ = 0;
403 fCutDCAToVertex2D = 0;
404 fCutMinDCAToVertexXY = 0;
405 fCutMinDCAToVertexZ = 0;
406 fCutMaxDCAToVertexXYPtDep = "";
407 fCutMaxDCAToVertexZPtDep = "";
408 fCutMinDCAToVertexXYPtDep = "";
409 fCutMinDCAToVertexZPtDep = "";
411 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
412 f1CutMaxDCAToVertexXYPtDep = 0;
413 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
414 f1CutMaxDCAToVertexXYPtDep = 0;
415 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
416 f1CutMaxDCAToVertexZPtDep = 0;
417 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
418 f1CutMinDCAToVertexXYPtDep = 0;
419 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
420 f1CutMinDCAToVertexZPtDep = 0;
438 fHistogramsOn = kFALSE;
440 for (Int_t i=0; i<2; ++i)
442 fhNClustersITS[i] = 0;
443 fhNClustersTPC[i] = 0;
444 fhNSharedClustersTPC[i] = 0;
445 fhNCrossedRowsTPC[i] = 0;
446 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
448 fhChi2PerClusterITS[i] = 0;
449 fhChi2PerClusterTPC[i] = 0;
450 fhChi2TPCConstrainedVsGlobal[i] = 0;
451 fhNClustersForITSPID[i] = 0;
452 fhNMissingITSPoints[i] = 0;
460 fhRel1PtUncertainty[i] = 0;
467 fhDXYNormalized[i] = 0;
468 fhDZNormalized[i] = 0;
469 fhDXYvsDZNormalized[i] = 0;
470 fhNSigmaToVertex[i] = 0;
474 fhTOFdistance[i] = 0;
479 fhCutCorrelation = 0;
482 //_____________________________________________________________________________
483 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
486 // Assignment operator
489 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
493 //_____________________________________________________________________________
494 void AliESDtrackCuts::Copy(TObject &c) const
500 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
504 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
505 target.fCutMinNClusterITS = fCutMinNClusterITS;
506 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
507 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
508 if(f1CutMinNClustersTPCPtDep){
509 target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
511 target.fCutMaxPtDepNClustersTPC = fCutMaxPtDepNClustersTPC;
512 target.fCutMinLengthActiveVolumeTPC = fCutMinLengthActiveVolumeTPC;
514 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
515 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
516 target.fCutMaxChi2TPCConstrainedVsGlobal = fCutMaxChi2TPCConstrainedVsGlobal;
517 target.fCutMaxChi2TPCConstrainedVsGlobalVertexType = fCutMaxChi2TPCConstrainedVsGlobalVertexType;
518 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
520 for (Int_t i = 0; i < 3; i++)
521 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
523 target.fCutMaxC11 = fCutMaxC11;
524 target.fCutMaxC22 = fCutMaxC22;
525 target.fCutMaxC33 = fCutMaxC33;
526 target.fCutMaxC44 = fCutMaxC44;
527 target.fCutMaxC55 = fCutMaxC55;
529 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
531 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
532 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
533 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
534 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
535 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
536 target.fCutRequireITSRefit = fCutRequireITSRefit;
537 target.fCutRequireITSPid = fCutRequireITSPid;
538 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
539 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
541 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
542 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
543 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
544 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
545 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
546 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
547 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
549 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
550 if(fCutMaxDCAToVertexXYPtDep.Length()>0)target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
552 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
553 if(fCutMaxDCAToVertexZPtDep.Length()>0)target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
555 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
556 if(fCutMinDCAToVertexXYPtDep.Length()>0)target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
558 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
559 if(fCutMinDCAToVertexZPtDep.Length()>0)target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
561 target.fPMin = fPMin;
562 target.fPMax = fPMax;
563 target.fPtMin = fPtMin;
564 target.fPtMax = fPtMax;
565 target.fPxMin = fPxMin;
566 target.fPxMax = fPxMax;
567 target.fPyMin = fPyMin;
568 target.fPyMax = fPyMax;
569 target.fPzMin = fPzMin;
570 target.fPzMax = fPzMax;
571 target.fEtaMin = fEtaMin;
572 target.fEtaMax = fEtaMax;
573 target.fRapMin = fRapMin;
574 target.fRapMax = fRapMax;
576 target.fFlagCutTOFdistance = fFlagCutTOFdistance;
577 target.fCutTOFdistance = fCutTOFdistance;
578 target.fCutRequireTOFout = fCutRequireTOFout;
580 target.fHistogramsOn = fHistogramsOn;
582 for (Int_t i=0; i<2; ++i)
584 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
585 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
586 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
587 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
588 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
590 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
591 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
592 if (fhChi2TPCConstrainedVsGlobal[i]) target.fhChi2TPCConstrainedVsGlobal[i] = (TH1F*) fhChi2TPCConstrainedVsGlobal[i]->Clone();
593 if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
594 if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
596 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
597 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
598 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
599 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
600 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
602 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
604 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
605 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
606 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
607 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
609 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
610 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
611 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
612 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
614 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
615 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
616 if (fhTOFdistance[i]) target.fhTOFdistance[i] = (TH2F*) fhTOFdistance[i]->Clone();
618 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
620 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
621 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
626 //_____________________________________________________________________________
627 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
628 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
629 // Returns the number of merged objects (including this)
636 TIterator* iter = list->MakeIterator();
639 // collection of measured and generated histograms
641 while ((obj = iter->Next())) {
643 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
647 if (!entry->fHistogramsOn)
650 for (Int_t i=0; i<2; i++) {
652 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
653 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
654 if (fhNSharedClustersTPC[i])
655 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
656 if (fhNCrossedRowsTPC[i])
657 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
658 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
659 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
661 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
662 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
663 if (fhChi2TPCConstrainedVsGlobal[i])
664 fhChi2TPCConstrainedVsGlobal[i]->Add(entry->fhChi2TPCConstrainedVsGlobal[i]);
665 if (fhNClustersForITSPID[i])
666 fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
667 if (fhNMissingITSPoints[i])
668 fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
670 fhC11[i] ->Add(entry->fhC11[i] );
671 fhC22[i] ->Add(entry->fhC22[i] );
672 fhC33[i] ->Add(entry->fhC33[i] );
673 fhC44[i] ->Add(entry->fhC44[i] );
674 fhC55[i] ->Add(entry->fhC55[i] );
676 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
678 fhDXY[i] ->Add(entry->fhDXY[i] );
679 fhDZ[i] ->Add(entry->fhDZ[i] );
680 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
681 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
683 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
684 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
685 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
686 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
688 fhPt[i] ->Add(entry->fhPt[i]);
689 fhEta[i] ->Add(entry->fhEta[i]);
690 fhTOFdistance[i] ->Add(entry->fhTOFdistance[i]);
693 fhCutStatistics ->Add(entry->fhCutStatistics);
694 fhCutCorrelation ->Add(entry->fhCutCorrelation);
701 void AliESDtrackCuts::SetMinNClustersTPCPtDep(TFormula *f1, Float_t ptmax)
704 // Sets the pT dependent NClustersTPC cut
708 delete f1CutMinNClustersTPCPtDep;
709 f1CutMinNClustersTPCPtDep = (TFormula*)f1->Clone("f1CutMinNClustersTPCPtDep");
711 fCutMaxPtDepNClustersTPC=ptmax;
714 //____________________________________________________________________
715 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
717 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
719 AliInfoClass("Creating track cuts for TPC-only.");
721 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
723 esdTrackCuts->SetMinNClustersTPC(50);
724 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
725 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
727 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
728 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
729 esdTrackCuts->SetDCAToVertex2D(kTRUE);
734 //____________________________________________________________________
735 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
737 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
739 AliInfoClass("Creating track cuts for ITS+TPC (2009 definition).");
741 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
744 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
745 esdTrackCuts->SetMinNClustersTPC(70);
746 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
747 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
748 esdTrackCuts->SetRequireTPCRefit(kTRUE);
750 esdTrackCuts->SetRequireITSRefit(kTRUE);
751 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
752 AliESDtrackCuts::kAny);
754 // 7*(0.0050+0.0060/pt^0.9)
755 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
756 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
758 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
759 esdTrackCuts->SetDCAToVertex2D(kFALSE);
760 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
761 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
763 esdTrackCuts->SetMaxChi2PerClusterITS(36);
768 //____________________________________________________________________
769 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries, Int_t clusterCut)
771 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2011 data
772 // if clusterCut = 1, the cut on the number of clusters is replaced by
773 // a cut on the number of crossed rows and on the ration crossed
774 // rows/findable clusters
776 AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
778 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
781 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
782 else if (clusterCut == 1) {
783 esdTrackCuts->SetMinNCrossedRowsTPC(70);
784 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
787 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
788 esdTrackCuts->SetMinNClustersTPC(50);
790 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
791 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
792 esdTrackCuts->SetRequireTPCRefit(kTRUE);
794 esdTrackCuts->SetRequireITSRefit(kTRUE);
795 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
796 AliESDtrackCuts::kAny);
798 // 7*(0.0015+0.0050/pt^1.1)
799 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
800 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
802 esdTrackCuts->SetMaxDCAToVertexZ(2);
803 esdTrackCuts->SetDCAToVertex2D(kFALSE);
804 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
806 esdTrackCuts->SetMaxChi2PerClusterITS(36);
811 //____________________________________________________________________
812 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
814 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
815 // if clusterCut = 1, the cut on the number of clusters is replaced by
816 // a cut on the number of crossed rows and on the ration crossed
817 // rows/findable clusters
819 AliInfoClass("Creating track cuts for ITS+TPC (2010 definition).");
821 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
824 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
825 else if (clusterCut == 1) {
826 esdTrackCuts->SetMinNCrossedRowsTPC(70);
827 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
830 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
831 esdTrackCuts->SetMinNClustersTPC(70);
833 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
834 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
835 esdTrackCuts->SetRequireTPCRefit(kTRUE);
837 esdTrackCuts->SetRequireITSRefit(kTRUE);
838 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
839 AliESDtrackCuts::kAny);
841 // 7*(0.0026+0.0050/pt^1.01)
842 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
843 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
845 esdTrackCuts->SetMaxDCAToVertexZ(2);
846 esdTrackCuts->SetDCAToVertex2D(kFALSE);
847 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
849 esdTrackCuts->SetMaxChi2PerClusterITS(36);
854 //____________________________________________________________________
855 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
857 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
859 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
860 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
861 esdTrackCuts->SetRequireITSRefit(kTRUE);
862 esdTrackCuts->SetMinNClustersITS(4);
863 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
864 AliESDtrackCuts::kAny);
865 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
868 // 7*(0.0085+0.0026/pt^1.55)
869 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
872 esdTrackCuts->SetRequireITSPid(kTRUE);
877 //____________________________________________________________________
878 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
880 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
882 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
883 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
884 esdTrackCuts->SetRequireITSRefit(kTRUE);
885 esdTrackCuts->SetMinNClustersITS(4);
886 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
887 AliESDtrackCuts::kAny);
888 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
891 // 7*(0.0033+0.0045/pt^1.3)
892 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
895 esdTrackCuts->SetRequireITSPid(kTRUE);
900 //____________________________________________________________________
901 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
903 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
905 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
906 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
907 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
908 esdTrackCuts->SetRequireITSRefit(kTRUE);
909 esdTrackCuts->SetMinNClustersITS(4);
910 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
911 AliESDtrackCuts::kAny);
912 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
915 // 7*(0.0085+0.0026/pt^1.55)
916 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
919 esdTrackCuts->SetRequireITSPid(kTRUE);
924 //____________________________________________________________________
925 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
927 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
929 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
930 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
931 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
932 esdTrackCuts->SetRequireITSRefit(kTRUE);
933 esdTrackCuts->SetMinNClustersITS(4);
934 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
935 AliESDtrackCuts::kAny);
936 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
939 // 7*(0.0033+0.0045/pt^1.3)
940 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
943 esdTrackCuts->SetRequireITSPid(kTRUE);
948 //____________________________________________________________________
949 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
951 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
953 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
954 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
958 //____________________________________________________________________
960 AliESDtrackCuts* AliESDtrackCuts::GetStandardV0DaughterCuts()
962 // creates a AliESDtrackCuts object and fills it with standard cuts for V0 daughters
963 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
964 esdTrackCuts->SetRequireTPCRefit(kTRUE);
965 esdTrackCuts->SetMinNClustersTPC(70);
966 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
970 //____________________________________________________________________
971 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
973 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
974 // tpcOnly = kTRUE -> consider TPC-only tracks
975 // = kFALSE -> consider global tracks
977 // DEPRECATED Use GetReferenceMultiplicity with the enum as second argument instead
981 AliErrorClass("Not implemented for global tracks!");
985 static AliESDtrackCuts* esdTrackCuts = 0;
988 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
989 esdTrackCuts->SetEtaRange(-0.8, 0.8);
990 esdTrackCuts->SetPtRange(0.15);
993 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
998 //____________________________________________________________________
999 Float_t AliESDtrackCuts::GetSigmaToVertex(const AliESDtrack* const esdTrack)
1001 // Calculates the number of sigma to the vertex.
1006 esdTrack->GetImpactParameters(b,bCov);
1008 if (bCov[0]<=0 || bCov[2]<=0) {
1009 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
1010 bCov[0]=0; bCov[2]=0;
1012 bRes[0] = TMath::Sqrt(bCov[0]);
1013 bRes[1] = TMath::Sqrt(bCov[2]);
1015 // -----------------------------------
1016 // How to get to a n-sigma cut?
1018 // The accumulated statistics from 0 to d is
1020 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
1021 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
1023 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
1024 // Can this be expressed in a different way?
1026 if (bRes[0] == 0 || bRes[1] ==0)
1029 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
1031 // work around precision problem
1032 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
1033 // 1e-15 corresponds to nsigma ~ 7.7
1034 if (TMath::Exp(-d * d / 2) < 1e-15)
1037 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
1041 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
1043 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
1045 tree->SetBranchStatus("fTracks.fFlags", 1);
1046 tree->SetBranchStatus("fTracks.fITSncls", 1);
1047 tree->SetBranchStatus("fTracks.fTPCncls", 1);
1048 tree->SetBranchStatus("fTracks.fITSchi2", 1);
1049 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
1050 tree->SetBranchStatus("fTracks.fC*", 1);
1051 tree->SetBranchStatus("fTracks.fD", 1);
1052 tree->SetBranchStatus("fTracks.fZ", 1);
1053 tree->SetBranchStatus("fTracks.fCdd", 1);
1054 tree->SetBranchStatus("fTracks.fCdz", 1);
1055 tree->SetBranchStatus("fTracks.fCzz", 1);
1056 tree->SetBranchStatus("fTracks.fP*", 1);
1057 tree->SetBranchStatus("fTracks.fR*", 1);
1058 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
1061 //____________________________________________________________________
1062 Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack)
1065 // figure out if the tracks survives all the track cuts defined
1067 // the different quality parameter and kinematic values are first
1068 // retrieved from the track. then it is found out what cuts the
1069 // track did not survive and finally the cuts are imposed.
1071 // this function needs the following branches:
1077 // fTracks.fC //GetExternalCovariance
1078 // fTracks.fD //GetImpactParameters
1079 // fTracks.fZ //GetImpactParameters
1080 // fTracks.fCdd //GetImpactParameters
1081 // fTracks.fCdz //GetImpactParameters
1082 // fTracks.fCzz //GetImpactParameters
1083 // fTracks.fP //GetPxPyPz
1084 // fTracks.fR //GetMass
1085 // fTracks.fP //GetMass
1086 // fTracks.fKinkIndexes
1088 // esdEvent is only required for the MaxChi2TPCConstrainedVsGlobal
1090 UInt_t status = esdTrack->GetStatus();
1092 // getting quality parameters from the ESD track
1093 Int_t nClustersITS = esdTrack->GetITSclusters(0);
1094 Int_t nClustersTPC = -1;
1095 if(fCutRequireTPCStandAlone) {
1096 nClustersTPC = esdTrack->GetTPCNclsIter1();
1099 nClustersTPC = esdTrack->GetTPCclusters(0);
1102 //Pt dependent NClusters Cut
1103 if(f1CutMinNClustersTPCPtDep) {
1104 if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
1105 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(esdTrack->Pt());
1107 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(fCutMaxPtDepNClustersTPC);
1110 Float_t nCrossedRowsTPC = esdTrack->GetTPCCrossedRows();
1111 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1112 if (esdTrack->GetTPCNclsF()>0) {
1113 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
1116 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
1117 Float_t fracClustersTPCShared = -1.;
1119 Float_t chi2PerClusterITS = -1;
1120 Float_t chi2PerClusterTPC = -1;
1121 if (nClustersITS!=0)
1122 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
1123 if (nClustersTPC!=0) {
1124 if(fCutRequireTPCStandAlone) {
1125 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1127 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
1129 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1132 Double_t extCov[15];
1133 esdTrack->GetExternalCovariance(extCov);
1137 esdTrack->GetImpactParameters(b,bCov);
1138 if (bCov[0]<=0 || bCov[2]<=0) {
1139 AliDebug(1, "Estimated b resolution lower or equal zero!");
1140 bCov[0]=0; bCov[2]=0;
1144 // set pt-dependent DCA cuts, if requested
1145 SetPtDepDCACuts(esdTrack->Pt());
1148 Float_t dcaToVertexXY = b[0];
1149 Float_t dcaToVertexZ = b[1];
1151 Float_t dcaToVertex = -1;
1153 if (fCutDCAToVertex2D)
1155 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1158 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1160 // getting the kinematic variables of the track
1161 // (assuming the mass is known)
1163 esdTrack->GetPxPyPz(p);
1165 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1166 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1167 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1169 //y-eta related calculations
1170 Float_t eta = -100.;
1172 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1173 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1174 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1175 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1179 AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1182 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1184 //########################################################################
1187 Bool_t cuts[kNCuts];
1188 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1190 // track quality cuts
1191 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1193 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1195 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1197 if (nClustersTPC<fCutMinNClusterTPC)
1199 if (nClustersITS<fCutMinNClusterITS)
1201 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1203 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1205 if (extCov[0] > fCutMaxC11)
1207 if (extCov[2] > fCutMaxC22)
1209 if (extCov[5] > fCutMaxC33)
1211 if (extCov[9] > fCutMaxC44)
1213 if (extCov[14] > fCutMaxC55)
1216 // cut 12 and 13 see below
1218 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1220 // track kinematics cut
1221 if((momentum < fPMin) || (momentum > fPMax))
1223 if((pt < fPtMin) || (pt > fPtMax))
1225 if((p[0] < fPxMin) || (p[0] > fPxMax))
1227 if((p[1] < fPyMin) || (p[1] > fPyMax))
1229 if((p[2] < fPzMin) || (p[2] > fPzMax))
1231 if((eta < fEtaMin) || (eta > fEtaMax))
1233 if((y < fRapMin) || (y > fRapMax))
1235 if (fCutDCAToVertex2D && dcaToVertex > 1)
1237 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1239 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1241 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1243 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1245 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1248 for (Int_t i = 0; i < 3; i++) {
1249 if(!(esdTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
1250 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1251 } else { // upgraded ITS (7 layers)
1252 // at the moment, for L012 the layers 12 are considered together
1254 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(0), (esdTrack->HasPointOnITSLayer(1))&(esdTrack->HasPointOnITSLayer(2)));
1255 } else { // L34 or L56
1256 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2+1), esdTrack->HasPointOnITSLayer(i*2+2));
1261 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1262 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1266 // ITS standalone tracks
1267 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1268 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1269 }else if(fCutRequireITSpureSA){
1270 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1275 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1278 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1281 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1284 Int_t nITSPointsForPid=0;
1285 UChar_t clumap=esdTrack->GetITSClusterMap();
1286 for(Int_t i=2; i<6; i++){
1287 if(clumap&(1<<i)) ++nITSPointsForPid;
1289 if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1292 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1294 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1297 Int_t nMissITSpts=0;
1298 Int_t idet,statusLay;
1300 for(Int_t iLay=0; iLay<6; iLay++){
1301 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1302 if(retc && statusLay==5) ++nMissITSpts;
1304 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1307 if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
1310 // TOF signal Dz cut
1311 Float_t dxTOF = esdTrack->GetTOFsignalDx();
1312 Float_t dzTOF = esdTrack->GetTOFsignalDz();
1313 if (fFlagCutTOFdistance && (esdTrack->GetStatus() & AliESDtrack::kTOFout) == AliESDtrack::kTOFout){ // applying the TOF distance cut only if requested, and only on tracks that reached the TOF and where associated with a TOF hit
1314 if (fgBeamTypeFlag < 0) { // the check on the beam type was not done yet
1315 const AliESDEvent* event = esdTrack->GetESDEvent();
1317 TString beamTypeESD = event->GetBeamType();
1318 AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
1319 if (beamTypeESD.CompareTo("A-A",TString::kIgnoreCase) == 0){ // we are in PbPb collisions --> fgBeamTypeFlag will be set to 1, to apply the cut on TOF signal Dz
1322 else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
1327 AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
1331 if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
1332 Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
1333 AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
1334 if (radiusTOF > fCutTOFdistance){
1335 AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
1342 for (Int_t i=0; i<kNCuts; i++)
1343 if (cuts[i]) {cut = kTRUE;}
1345 // for performance evaluate the CPU intensive cuts only when the others have passed, and when they are requested
1346 Double_t chi2TPCConstrainedVsGlobal = -2;
1347 Float_t nSigmaToVertex = -2;
1350 // getting the track to vertex parameters
1351 if (fCutSigmaToVertexRequired)
1353 nSigmaToVertex = GetSigmaToVertex(esdTrack);
1354 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1359 // if n sigma could not be calculated
1360 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1367 // max chi2 TPC constrained vs global track only if track passed the other cut
1368 if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
1370 const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
1373 AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
1376 const AliESDVertex* vertex = 0;
1377 if (fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTracks)
1378 vertex = esdEvent->GetPrimaryVertexTracks();
1380 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexSPD)
1381 vertex = esdEvent->GetPrimaryVertexSPD();
1383 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTPC)
1384 vertex = esdEvent->GetPrimaryVertexTPC();
1386 if (vertex->GetStatus())
1387 chi2TPCConstrainedVsGlobal = esdTrack->GetChi2TPCConstrainedVsGlobal(vertex);
1389 if (chi2TPCConstrainedVsGlobal < 0 || chi2TPCConstrainedVsGlobal > fCutMaxChi2TPCConstrainedVsGlobal)
1396 // max length in active volume
1397 Float_t lengthInActiveZoneTPC = -1;
1398 if (fCutMinLengthActiveVolumeTPC > 1.) { // do the calculation only if needed to save cpu-time
1399 if (esdTrack->GetESDEvent()) {
1400 lengthInActiveZoneTPC = esdTrack->GetLengthInActiveZone(1, 1.8, 220, esdTrack->GetESDEvent()->GetMagneticField());
1402 if (lengthInActiveZoneTPC < fCutMinLengthActiveVolumeTPC ) {
1412 //########################################################################
1413 // filling histograms
1414 if (fHistogramsOn) {
1415 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1417 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1419 for (Int_t i=0; i<kNCuts; i++) {
1420 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1421 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1424 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1426 for (Int_t j=i; j<kNCuts; j++) {
1427 if (cuts[i] && cuts[j]) {
1428 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1429 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1430 fhCutCorrelation->Fill(xC, yC);
1436 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1437 // the code is not in a function due to too many local variables that would need to be passed
1439 for (Int_t id = 0; id < 2; id++)
1441 // id = 0 --> before cut
1442 // id = 1 --> after cut
1446 fhNClustersITS[id]->Fill(nClustersITS);
1447 fhNClustersTPC[id]->Fill(nClustersTPC);
1448 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1449 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1450 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1451 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1452 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1453 fhChi2TPCConstrainedVsGlobal[id]->Fill(chi2TPCConstrainedVsGlobal);
1454 fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1455 fhNMissingITSPoints[id]->Fill(nMissITSpts);
1457 fhC11[id]->Fill(extCov[0]);
1458 fhC22[id]->Fill(extCov[2]);
1459 fhC33[id]->Fill(extCov[5]);
1460 fhC44[id]->Fill(extCov[9]);
1461 fhC55[id]->Fill(extCov[14]);
1463 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1466 fhEta[id]->Fill(eta);
1467 fhTOFdistance[id]->Fill(dxTOF, dzTOF);
1470 bRes[0] = TMath::Sqrt(bCov[0]);
1471 bRes[1] = TMath::Sqrt(bCov[2]);
1473 fhDZ[id]->Fill(b[1]);
1474 fhDXY[id]->Fill(b[0]);
1475 fhDXYDZ[id]->Fill(dcaToVertex);
1476 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1478 if (bRes[0]!=0 && bRes[1]!=0) {
1479 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1480 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1481 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1482 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1494 //____________________________________________________________________
1495 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1497 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1501 case kOff: return kTRUE;
1502 case kNone: return !clusterL1 && !clusterL2;
1503 case kAny: return clusterL1 || clusterL2;
1504 case kFirst: return clusterL1;
1505 case kOnlyFirst: return clusterL1 && !clusterL2;
1506 case kSecond: return clusterL2;
1507 case kOnlySecond: return clusterL2 && !clusterL1;
1508 case kBoth: return clusterL1 && clusterL2;
1514 //____________________________________________________________________
1515 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(const AliESDEvent* esd, Int_t iTrack)
1517 // Utility function to create a TPC only track from the given esd track
1519 // IMPORTANT: The track has to be deleted by the user
1521 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1522 // there are only missing propagations here that are needed for old data
1523 // this function will therefore become obsolete
1525 // adapted from code provided by CKB
1527 if (!esd->GetPrimaryVertexTPC())
1528 return 0; // No TPC vertex no TPC tracks
1530 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1531 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1533 AliESDtrack* track = esd->GetTrack(iTrack);
1537 AliESDtrack *tpcTrack = new AliESDtrack();
1539 // only true if we have a tpc track
1540 if (!track->FillTPCOnlyTrack(*tpcTrack))
1549 //____________________________________________________________________
1550 TObjArray* AliESDtrackCuts::GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTPC)
1553 // returns an array of all tracks that pass the cuts
1554 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1555 // tracks that pass the cut
1557 // NOTE: List has to be deleted by the user
1559 TObjArray* acceptedTracks = new TObjArray();
1561 // loop over esd tracks
1562 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1564 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1565 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1567 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1571 if (AcceptTrack(tpcTrack)) {
1572 acceptedTracks->Add(tpcTrack);
1579 AliESDtrack* track = esd->GetTrack(iTrack);
1580 if(AcceptTrack(track))
1581 acceptedTracks->Add(track);
1584 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1585 return acceptedTracks;
1588 //____________________________________________________________________
1589 Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
1592 // returns an the number of tracks that pass the cuts
1597 // loop over esd tracks
1598 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1599 AliESDtrack* track = esd->GetTrack(iTrack);
1600 if (AcceptTrack(track))
1607 //____________________________________________________________________
1608 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1610 // diagnostics histograms are defined
1613 fHistogramsOn=kTRUE;
1615 Bool_t oldStatus = TH1::AddDirectoryStatus();
1616 TH1::AddDirectory(kFALSE);
1618 //###################################################################################
1619 // defining histograms
1621 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1623 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1624 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1626 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1628 for (Int_t i=0; i<kNCuts; i++) {
1629 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1630 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1631 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1634 fhCutStatistics ->SetLineColor(color);
1635 fhCutCorrelation ->SetLineColor(color);
1636 fhCutStatistics ->SetLineWidth(2);
1637 fhCutCorrelation ->SetLineWidth(2);
1639 for (Int_t i=0; i<2; i++) {
1640 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1641 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1642 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1643 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1644 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1645 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1646 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1647 fhChi2TPCConstrainedVsGlobal[i] = new TH1F("chi2TPCConstrainedVsGlobal","",600,-2,50);
1648 fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
1649 fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
1651 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1652 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1653 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1654 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1655 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1657 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1659 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1660 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1661 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1662 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1664 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1665 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1666 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1668 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1670 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1671 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1672 fhTOFdistance[i] = new TH2F("TOFdistance" ,"TOF distance;dx (cm};dz (cm)", 150, -15, 15, 150, -15, 15);
1674 fhNClustersITS[i]->SetTitle("n ITS clusters");
1675 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1676 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1677 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1678 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1679 fhChi2TPCConstrainedVsGlobal[i]->SetTitle("#Chi^{2} TPC constrained track vs global track");
1680 fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
1681 fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
1683 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1684 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1685 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1686 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1687 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1689 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1691 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1692 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1693 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1694 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1695 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1697 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1698 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1699 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1700 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1701 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1703 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1704 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1705 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1706 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1707 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1708 fhChi2TPCConstrainedVsGlobal[i]->SetLineColor(color); fhChi2TPCConstrainedVsGlobal[i]->SetLineWidth(2);
1709 fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
1710 fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
1712 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1713 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1714 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1715 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1716 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1718 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1720 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1721 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1722 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1724 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1725 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1726 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1729 // The number of sigmas to the vertex is per definition gaussian
1730 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1731 ffDTheoretical->SetParameter(0,1);
1733 TH1::AddDirectory(oldStatus);
1736 //____________________________________________________________________
1737 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1740 // loads the histograms from a file
1741 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1747 if (!gDirectory->cd(dir))
1750 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1752 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1753 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1755 for (Int_t i=0; i<2; i++) {
1758 gDirectory->cd("before_cuts");
1761 gDirectory->cd("after_cuts");
1763 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1764 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1765 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1766 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1767 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1768 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1769 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1770 fhChi2TPCConstrainedVsGlobal[i] = dynamic_cast<TH1F*> (gDirectory->Get("fhChi2TPCConstrainedVsGlobal"));
1771 fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
1772 fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
1774 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1775 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1776 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1777 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1778 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1780 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1782 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1783 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1784 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1785 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1787 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1788 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1789 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1790 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1792 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1793 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1794 fhTOFdistance[i] = dynamic_cast<TH2F*> (gDirectory->Get("TOFdistance"));
1796 gDirectory->cd("../");
1799 gDirectory->cd("..");
1804 //____________________________________________________________________
1805 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1807 // saves the histograms in a directory (dir)
1810 if (!fHistogramsOn) {
1811 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1818 gDirectory->mkdir(dir);
1819 gDirectory->cd(dir);
1821 gDirectory->mkdir("before_cuts");
1822 gDirectory->mkdir("after_cuts");
1824 // a factor of 2 is needed since n sigma is positive
1825 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1826 ffDTheoretical->Write("nSigmaToVertexTheory");
1828 fhCutStatistics->Write();
1829 fhCutCorrelation->Write();
1831 for (Int_t i=0; i<2; i++) {
1833 gDirectory->cd("before_cuts");
1835 gDirectory->cd("after_cuts");
1837 fhNClustersITS[i] ->Write();
1838 fhNClustersTPC[i] ->Write();
1839 fhNSharedClustersTPC[i] ->Write();
1840 fhNCrossedRowsTPC[i] ->Write();
1841 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1842 fhChi2PerClusterITS[i] ->Write();
1843 fhChi2PerClusterTPC[i] ->Write();
1844 fhChi2TPCConstrainedVsGlobal[i] ->Write();
1845 fhNClustersForITSPID[i] ->Write();
1846 fhNMissingITSPoints[i] ->Write();
1854 fhRel1PtUncertainty[i] ->Write();
1858 fhDXYDZ[i] ->Write();
1859 fhDXYvsDZ[i] ->Write();
1861 fhDXYNormalized[i] ->Write();
1862 fhDZNormalized[i] ->Write();
1863 fhDXYvsDZNormalized[i] ->Write();
1864 fhNSigmaToVertex[i] ->Write();
1868 fhTOFdistance[i] ->Write();
1870 gDirectory->cd("../");
1873 gDirectory->cd("../");
1876 //____________________________________________________________________
1877 void AliESDtrackCuts::DrawHistograms()
1879 // draws some histograms
1881 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1882 canvas1->Divide(2, 2);
1885 fhNClustersTPC[0]->SetStats(kFALSE);
1886 fhNClustersTPC[0]->Draw();
1889 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1890 fhChi2PerClusterTPC[0]->Draw();
1893 fhNSigmaToVertex[0]->SetStats(kFALSE);
1894 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1895 fhNSigmaToVertex[0]->Draw();
1897 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1899 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1900 canvas2->Divide(3, 2);
1903 fhC11[0]->SetStats(kFALSE);
1908 fhC22[0]->SetStats(kFALSE);
1913 fhC33[0]->SetStats(kFALSE);
1918 fhC44[0]->SetStats(kFALSE);
1923 fhC55[0]->SetStats(kFALSE);
1928 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1930 fhRel1PtUncertainty[0]->Draw();
1932 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1934 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1935 canvas3->Divide(3, 2);
1938 fhDXY[0]->SetStats(kFALSE);
1943 fhDZ[0]->SetStats(kFALSE);
1948 fhDXYvsDZ[0]->SetStats(kFALSE);
1950 gPad->SetRightMargin(0.15);
1951 fhDXYvsDZ[0]->Draw("COLZ");
1954 fhDXYNormalized[0]->SetStats(kFALSE);
1956 fhDXYNormalized[0]->Draw();
1959 fhDZNormalized[0]->SetStats(kFALSE);
1961 fhDZNormalized[0]->Draw();
1964 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1966 gPad->SetRightMargin(0.15);
1967 fhDXYvsDZNormalized[0]->Draw("COLZ");
1969 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1971 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1972 canvas4->Divide(2, 1);
1975 fhCutStatistics->SetStats(kFALSE);
1976 fhCutStatistics->LabelsOption("v");
1977 gPad->SetBottomMargin(0.3);
1978 fhCutStatistics->Draw();
1981 fhCutCorrelation->SetStats(kFALSE);
1982 fhCutCorrelation->LabelsOption("v");
1983 gPad->SetBottomMargin(0.3);
1984 gPad->SetLeftMargin(0.3);
1985 fhCutCorrelation->Draw("COLZ");
1987 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1990 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1991 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1994 fhNClustersTPC[0]->SetStats(kFALSE);
1995 fhNClustersTPC[0]->DrawCopy();
1998 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1999 fhChi2PerClusterITS[0]->DrawCopy();
2000 fhChi2PerClusterITS[1]->SetLineColor(2);
2001 fhChi2PerClusterITS[1]->DrawCopy("SAME");
2004 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
2005 fhChi2PerClusterTPC[0]->DrawCopy();
2006 fhChi2PerClusterTPC[1]->SetLineColor(2);
2007 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
2009 //--------------------------------------------------------------------------
2010 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
2012 // set the pt-dependent DCA cuts
2015 if(f1CutMaxDCAToVertexXYPtDep) {
2016 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
2019 if(f1CutMaxDCAToVertexZPtDep) {
2020 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
2023 if(f1CutMinDCAToVertexXYPtDep) {
2024 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
2027 if(f1CutMinDCAToVertexZPtDep) {
2028 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
2037 //--------------------------------------------------------------------------
2038 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
2040 // Check the correctness of the string syntax
2042 Bool_t retval=kTRUE;
2044 if(!dist.Contains("pt")) {
2045 if(print) AliError("string must contain \"pt\"");
2051 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
2053 if(f1CutMaxDCAToVertexXYPtDep){
2054 delete f1CutMaxDCAToVertexXYPtDep;
2056 f1CutMaxDCAToVertexXYPtDep = 0;
2057 fCutMaxDCAToVertexXYPtDep = "";
2059 if(!CheckPtDepDCA(dist,kTRUE)){
2062 fCutMaxDCAToVertexXYPtDep = dist;
2064 tmp.ReplaceAll("pt","x");
2065 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
2069 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
2072 if(f1CutMaxDCAToVertexZPtDep){
2073 delete f1CutMaxDCAToVertexZPtDep;
2075 f1CutMaxDCAToVertexZPtDep = 0;
2076 fCutMaxDCAToVertexZPtDep = "";
2078 if(!CheckPtDepDCA(dist,kTRUE))return;
2080 fCutMaxDCAToVertexZPtDep = dist;
2082 tmp.ReplaceAll("pt","x");
2083 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
2089 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
2092 if(f1CutMinDCAToVertexXYPtDep){
2093 delete f1CutMinDCAToVertexXYPtDep;
2095 f1CutMinDCAToVertexXYPtDep = 0;
2096 fCutMinDCAToVertexXYPtDep = "";
2098 if(!CheckPtDepDCA(dist,kTRUE))return;
2100 fCutMinDCAToVertexXYPtDep = dist;
2102 tmp.ReplaceAll("pt","x");
2103 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
2108 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
2112 if(f1CutMinDCAToVertexZPtDep){
2113 delete f1CutMinDCAToVertexZPtDep;
2115 f1CutMinDCAToVertexZPtDep = 0;
2116 fCutMinDCAToVertexZPtDep = "";
2118 if(!CheckPtDepDCA(dist,kTRUE))return;
2119 fCutMinDCAToVertexZPtDep = dist;
2121 tmp.ReplaceAll("pt","x");
2122 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
2125 AliESDtrackCuts* AliESDtrackCuts::GetMultEstTrackCuts(MultEstTrackCuts cut)
2127 // returns the multiplicity estimator track cuts objects to allow for user configuration
2128 // upon first call the objects are created
2130 // the cut defined here correspond to GetStandardITSTPCTrackCuts2010 (apart from the one for without SPD)
2132 if (!fgMultEstTrackCuts[kMultEstTrackCutGlobal])
2134 // quality cut on ITS+TPC tracks
2135 fgMultEstTrackCuts[kMultEstTrackCutGlobal] = new AliESDtrackCuts();
2136 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMinNClustersTPC(70);
2137 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMaxChi2PerClusterTPC(4);
2138 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetAcceptKinkDaughters(kFALSE);
2139 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireTPCRefit(kTRUE);
2140 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireITSRefit(kTRUE);
2141 //multiplicity underestimate if we use global tracks with |eta| > 0.9
2142 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetEtaRange(-0.9, 0.9);
2144 // quality cut on ITS_SA tracks (complementary to ITS+TPC)
2145 fgMultEstTrackCuts[kMultEstTrackCutITSSA] = new AliESDtrackCuts();
2146 fgMultEstTrackCuts[kMultEstTrackCutITSSA]->SetRequireITSRefit(kTRUE);
2148 // primary selection for tracks with SPD hits
2149 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD] = new AliESDtrackCuts();
2150 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
2151 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
2152 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexZ(2);
2154 // primary selection for tracks w/o SPD hits
2155 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD] = new AliESDtrackCuts();
2156 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
2157 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
2158 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexZ(2);
2161 return fgMultEstTrackCuts[cut];
2164 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType, Float_t etaRange)
2166 // Get multiplicity estimate based on TPC/ITS tracks and tracklets
2167 // Adapted for AliESDtrackCuts from a version developed by: Ruben Shahoyan, Anton Alkin, Arvinder Palaha
2169 // Returns a negative value if no reliable estimate can be provided:
2170 // -1 SPD vertex missing
2171 // -2 SPD VertexerZ dispersion too large
2172 // -3 Track vertex missing (not checked for kTracklets)
2173 // -4 Distance between SPD and track vertices too large (not checked for kTracklets)
2175 // WARNING This functions does not cut on the z vtx. Depending on the eta range requested, you need to restrict your z vertex range!
2177 // Strategy for combined estimators
2178 // 1. Count global tracks and flag them
2179 // 2. Count ITSSA as complementaries for ITSTPC+ or as main tracks
2180 // 3. Count the complementary SPD tracklets
2182 const AliESDVertex* vertices[2];
2183 vertices[0] = esd->GetPrimaryVertexSPD();
2184 vertices[1] = esd->GetPrimaryVertexTracks();
2186 if (!vertices[0]->GetStatus())
2188 AliDebugClass(AliLog::kDebug, "No SPD vertex. Not able to make a reliable multiplicity estimate.");
2192 if (vertices[0]->IsFromVertexerZ() && vertices[0]->GetDispersion() > 0.02)
2194 AliDebugClass(AliLog::kDebug, "Vertexer z dispersion > 0.02. Not able to make a reliable multiplicity estimate.");
2198 Int_t multiplicityEstimate = 0;
2200 // SPD tracklet-only estimate
2201 if (trackType == kTracklets)
2203 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2204 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i)
2206 if (TMath::Abs(spdmult->GetEta(i)) > etaRange)
2207 continue; // eta selection for tracklets
2208 multiplicityEstimate++;
2210 return multiplicityEstimate;
2213 if (!vertices[1]->GetStatus())
2215 AliDebugClass(AliLog::kDebug, "No track vertex. Not able to make a reliable multiplicity estimate.");
2219 // TODO value of displacement to be studied
2220 const Float_t maxDisplacement = 0.5;
2221 //check for displaced vertices
2222 Double_t displacement = TMath::Abs(vertices[0]->GetZ() - vertices[1]->GetZ());
2223 if (displacement > maxDisplacement)
2225 AliDebugClass(AliLog::kDebug, Form("Displaced vertices %f > %f",displacement,maxDisplacement));
2229 // update eta range in track cuts
2230 GetMultEstTrackCuts(kMultEstTrackCutITSSA)->SetEtaRange(-etaRange, etaRange);
2231 GetMultEstTrackCuts(kMultEstTrackCutDCAwSPD)->SetEtaRange(-etaRange, etaRange);
2232 GetMultEstTrackCuts(kMultEstTrackCutDCAwoSPD)->SetEtaRange(-etaRange, etaRange);
2234 //*******************************************************************************************************
2235 //set counters to initial zeros
2236 Int_t tracksITSTPC = 0; //number of global tracks for a given event
2237 Int_t tracksITSSA = 0; //number of ITS standalone tracks for a given event
2238 Int_t tracksITSTPCSA_complementary = 0; //number of ITS standalone tracks complementary to TPC for a given event
2239 Int_t trackletsITSTPC_complementary = 0;//number of SPD tracklets complementary to global/ITSSA tracks for a given events
2240 Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
2242 const Int_t nESDTracks = esd->GetNumberOfTracks();
2244 // flags for secondary and rejected tracks
2245 const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
2246 const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
2248 for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
2249 esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
2251 const Int_t maxid = nESDTracks+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
2253 // bit mask for esd tracks, to check if multiple tracklets are associated to it
2254 TBits globalBits(maxid), pureITSBits(maxid);
2255 // why labels are used with the data? RS
2256 // Bool_t globalBits[maxid], pureITSBits[maxid];
2257 // for(Int_t i=0; i<maxid; i++){ // set all bools to false
2258 // globalBits[i]=kFALSE;
2259 // pureITSBits[i]=kFALSE;
2262 //*******************************************************************************************************
2263 // get multiplicity from global tracks
2264 for(Int_t itracks = 0; itracks < nESDTracks; itracks++) { // flag the tracks
2265 AliESDtrack* track = esd->GetTrack(itracks);
2267 // if track is a secondary from a V0, flag as a secondary
2268 if (track->IsOn(AliESDtrack::kMultInV0)) {
2269 track->SetBit(kSecBit);
2272 /* done via proper DCA cut
2274 if (track->IsOn(AliESDtrack::kMultSec)) {
2275 track->SetBit(kSecBit);
2279 // check tracks with ITS part
2280 //*******************************************************************************************************
2281 if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
2282 //*******************************************************************************************************
2284 if (track->IsOn(AliESDtrack::kTPCin)) { // Global track, has ITS and TPC contributions
2285 if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
2286 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2287 tracksITSTPC++; //global track counted
2288 globalBits.SetBitNumber(itracks);
2290 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2292 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2294 //*******************************************************************************************************
2295 // ITS complementary
2296 else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
2297 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2298 tracksITSTPCSA_complementary++;
2299 globalBits.SetBitNumber(itracks);
2301 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2303 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2305 //*******************************************************************************************************
2306 // check tracks from ITS_SA_PURE
2307 if (track->IsOn(AliESDtrack::kITSin) && track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSSA){
2308 if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
2309 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2311 pureITSBits.SetBitNumber(itracks);
2313 else track->SetBit(kRejBit);
2315 else track->SetBit(kRejBit);
2317 }//ESD tracks counted
2319 //*******************************************************************************************************
2320 // get multiplicity from ITS tracklets to complement TPC+ITS, and ITSpureSA
2321 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2322 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i) {
2323 if (TMath::Abs(spdmult->GetEta(i)) > etaRange) continue; // eta selection for tracklets
2325 // if counting tracks+tracklets, check if clusters were already used in tracks
2326 Int_t id1,id2,id3,id4;
2327 spdmult->GetTrackletTrackIDs(i,0,id1,id2); // references for eventual Global/ITS_SA tracks
2328 AliESDtrack* tr1 = id1>=0 ? esd->GetTrack(id1) : 0;
2329 spdmult->GetTrackletTrackIDs(i,1,id3,id4); // references for eventual ITS_SA_pure tracks
2330 AliESDtrack* tr3 = id3>=0 ? esd->GetTrack(id3) : 0;
2332 // are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
2333 if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
2335 Bool_t bUsedInGlobal = (id1 != -1) ? globalBits.TestBitNumber(id1) : 0;// has associated global track been associated to a previous tracklet?
2336 Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits.TestBitNumber(id3) : 0;// has associated pure ITS track been associated to a previous tracklet?
2337 //*******************************************************************************************************
2338 if (trackType == kTrackletsITSTPC) {
2339 // count tracklets towards global+complementary tracks
2340 if ( (tr1 && !tr1->TestBit(kSecBit)) && // reject as secondary
2341 (tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2343 ++trackletsITSTPC_complementary;
2344 if(id1>0) globalBits.SetBitNumber(id1); // mark global track linked to this tracklet as "associated"
2348 ++trackletsITSTPC_complementary; // if no associated track, count the tracklet
2351 // count tracklets towards ITS_SA_pure tracks
2352 if ( (tr3 && !tr3->TestBit(kSecBit)) && // reject as secondary
2353 (tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2354 if(!bUsedInPureITS) {
2355 ++trackletsITSSA_complementary;
2356 if(id3>0) pureITSBits.SetBitNumber(id3); // mark global track linked to this tracklet as "associated"
2360 ++trackletsITSSA_complementary; // if no associated track, count the tracklet
2365 //*******************************************************************************************************
2366 if (trackType == kTrackletsITSTPC)
2367 multiplicityEstimate = tracksITSTPC + tracksITSTPCSA_complementary + trackletsITSTPC_complementary;
2369 multiplicityEstimate = tracksITSSA + trackletsITSSA_complementary;
2371 return multiplicityEstimate;
2374 //____________________________________________________________________
2375 void AliESDtrackCuts::SetRequireStandardTOFmatchCuts(){
2377 // setting the TOF cuts flags (kTOFout = TOF matching distance) to true, to include the selection on the standard TOF matching
2379 SetRequireTOFout(kTRUE);
2380 SetFlagCutTOFdistance(kTRUE);
2381 SetCutTOFdistance(3.);