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",
82 AliESDtrackCuts* AliESDtrackCuts::fgMultEstTrackCuts[AliESDtrackCuts::kNMultEstTrackCuts] = { 0, 0, 0, 0 };
83 Char_t AliESDtrackCuts::fgBeamTypeFlag = -1;
85 //____________________________________________________________________
86 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
87 fCutMinNClusterTPC(0),
88 fCutMinNClusterITS(0),
89 fCutMinNCrossedRowsTPC(0),
90 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
91 f1CutMinNClustersTPCPtDep(0x0),
92 fCutMaxPtDepNClustersTPC(0),
93 fCutMaxChi2PerClusterTPC(0),
94 fCutMaxChi2PerClusterITS(0),
95 fCutMaxChi2TPCConstrainedVsGlobal(0),
96 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
97 fCutMaxMissingITSPoints(0),
103 fCutMaxRel1PtUncertainty(0),
104 fCutAcceptKinkDaughters(0),
105 fCutAcceptSharedTPCClusters(0),
106 fCutMaxFractionSharedTPCClusters(0),
107 fCutRequireTPCRefit(0),
108 fCutRequireTPCStandAlone(0),
109 fCutRequireITSRefit(0),
110 fCutRequireITSPid(0),
111 fCutRequireITSStandAlone(0),
112 fCutRequireITSpureSA(0),
113 fCutNsigmaToVertex(0),
114 fCutSigmaToVertexRequired(0),
115 fCutMaxDCAToVertexXY(0),
116 fCutMaxDCAToVertexZ(0),
117 fCutMinDCAToVertexXY(0),
118 fCutMinDCAToVertexZ(0),
119 fCutMaxDCAToVertexXYPtDep(""),
120 fCutMaxDCAToVertexZPtDep(""),
121 fCutMinDCAToVertexXYPtDep(""),
122 fCutMinDCAToVertexZPtDep(""),
123 f1CutMaxDCAToVertexXYPtDep(0x0),
124 f1CutMaxDCAToVertexZPtDep(0x0),
125 f1CutMinDCAToVertexXYPtDep(0x0),
126 f1CutMinDCAToVertexZPtDep(0x0),
127 fCutDCAToVertex2D(0),
142 fCutRequireTOFout(kFALSE),
143 fFlagCutTOFdistance(kFALSE),
156 //##############################################################################
157 // setting default cuts
158 SetMinNClustersTPC();
159 SetMinNClustersITS();
160 SetMinNCrossedRowsTPC();
161 SetMinRatioCrossedRowsOverFindableClustersTPC();
162 SetMaxChi2PerClusterTPC();
163 SetMaxChi2PerClusterITS();
164 SetMaxChi2TPCConstrainedGlobal();
165 SetMaxChi2TPCConstrainedGlobalVertexType();
166 SetMaxNOfMissingITSPoints();
167 SetMaxCovDiagonalElements();
168 SetMaxRel1PtUncertainty();
169 SetRequireTPCRefit();
170 SetRequireTPCStandAlone();
171 SetRequireITSRefit();
172 SetRequireITSPid(kFALSE);
173 SetRequireITSStandAlone(kFALSE);
174 SetRequireITSPureStandAlone(kFALSE);
175 SetAcceptKinkDaughters();
176 SetAcceptSharedTPCClusters();
177 SetMaxFractionSharedTPCClusters();
178 SetMaxNsigmaToVertex();
179 SetMaxDCAToVertexXY();
180 SetMaxDCAToVertexZ();
182 SetMinDCAToVertexXY();
183 SetMinDCAToVertexZ();
191 SetClusterRequirementITS(kSPD);
192 SetClusterRequirementITS(kSDD);
193 SetClusterRequirementITS(kSSD);
198 //_____________________________________________________________________________
199 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
200 fCutMinNClusterTPC(0),
201 fCutMinNClusterITS(0),
202 fCutMinNCrossedRowsTPC(0),
203 fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
204 f1CutMinNClustersTPCPtDep(0x0),
205 fCutMaxPtDepNClustersTPC(0),
206 fCutMaxChi2PerClusterTPC(0),
207 fCutMaxChi2PerClusterITS(0),
208 fCutMaxChi2TPCConstrainedVsGlobal(0),
209 fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
210 fCutMaxMissingITSPoints(0),
216 fCutMaxRel1PtUncertainty(0),
217 fCutAcceptKinkDaughters(0),
218 fCutAcceptSharedTPCClusters(0),
219 fCutMaxFractionSharedTPCClusters(0),
220 fCutRequireTPCRefit(0),
221 fCutRequireTPCStandAlone(0),
222 fCutRequireITSRefit(0),
223 fCutRequireITSPid(0),
224 fCutRequireITSStandAlone(0),
225 fCutRequireITSpureSA(0),
226 fCutNsigmaToVertex(0),
227 fCutSigmaToVertexRequired(0),
228 fCutMaxDCAToVertexXY(0),
229 fCutMaxDCAToVertexZ(0),
230 fCutMinDCAToVertexXY(0),
231 fCutMinDCAToVertexZ(0),
232 fCutMaxDCAToVertexXYPtDep(""),
233 fCutMaxDCAToVertexZPtDep(""),
234 fCutMinDCAToVertexXYPtDep(""),
235 fCutMinDCAToVertexZPtDep(""),
236 f1CutMaxDCAToVertexXYPtDep(0x0),
237 f1CutMaxDCAToVertexZPtDep(0x0),
238 f1CutMinDCAToVertexXYPtDep(0x0),
239 f1CutMinDCAToVertexZPtDep(0x0),
240 fCutDCAToVertex2D(0),
255 fCutRequireTOFout(kFALSE),
256 fFlagCutTOFdistance(kFALSE),
267 ((AliESDtrackCuts &) c).Copy(*this);
270 AliESDtrackCuts::~AliESDtrackCuts()
276 for (Int_t i=0; i<2; i++) {
278 if (fhNClustersITS[i])
279 delete fhNClustersITS[i];
280 if (fhNClustersTPC[i])
281 delete fhNClustersTPC[i];
282 if (fhNSharedClustersTPC[i])
283 delete fhNSharedClustersTPC[i];
284 if (fhNCrossedRowsTPC[i])
285 delete fhNCrossedRowsTPC[i];
286 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
287 delete fhRatioCrossedRowsOverFindableClustersTPC[i];
288 if (fhChi2PerClusterITS[i])
289 delete fhChi2PerClusterITS[i];
290 if (fhChi2PerClusterTPC[i])
291 delete fhChi2PerClusterTPC[i];
292 if (fhChi2TPCConstrainedVsGlobal[i])
293 delete fhChi2TPCConstrainedVsGlobal[i];
294 if(fhNClustersForITSPID[i])
295 delete fhNClustersForITSPID[i];
296 if(fhNMissingITSPoints[i])
297 delete fhNMissingITSPoints[i];
309 if (fhRel1PtUncertainty[i])
310 delete fhRel1PtUncertainty[i];
321 if (fhDXYNormalized[i])
322 delete fhDXYNormalized[i];
323 if (fhDZNormalized[i])
324 delete fhDZNormalized[i];
325 if (fhDXYvsDZNormalized[i])
326 delete fhDXYvsDZNormalized[i];
327 if (fhNSigmaToVertex[i])
328 delete fhNSigmaToVertex[i];
333 if (fhTOFdistance[i])
334 delete fhTOFdistance[i];
337 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
338 f1CutMaxDCAToVertexXYPtDep = 0;
339 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
340 f1CutMaxDCAToVertexZPtDep = 0;
341 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
342 f1CutMinDCAToVertexXYPtDep = 0;
343 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
344 f1CutMinDCAToVertexZPtDep = 0;
348 delete ffDTheoretical;
351 delete fhCutStatistics;
352 if (fhCutCorrelation)
353 delete fhCutCorrelation;
355 if(f1CutMinNClustersTPCPtDep)
356 delete f1CutMinNClustersTPCPtDep;
360 void AliESDtrackCuts::Init()
363 // sets everything to zero
366 fCutMinNClusterTPC = 0;
367 fCutMinNClusterITS = 0;
369 fCutMaxChi2PerClusterTPC = 0;
370 fCutMaxChi2PerClusterITS = 0;
371 fCutMaxChi2TPCConstrainedVsGlobal = 0;
372 fCutMaxChi2TPCConstrainedVsGlobalVertexType = kVertexTracks | kVertexSPD;
373 fCutMaxMissingITSPoints = 0;
375 for (Int_t i = 0; i < 3; i++)
376 fCutClusterRequirementITS[i] = kOff;
384 fCutMaxRel1PtUncertainty = 0;
386 fCutAcceptKinkDaughters = 0;
387 fCutAcceptSharedTPCClusters = 0;
388 fCutMaxFractionSharedTPCClusters = 0;
389 fCutRequireTPCRefit = 0;
390 fCutRequireTPCStandAlone = 0;
391 fCutRequireITSRefit = 0;
392 fCutRequireITSPid = 0;
393 fCutRequireITSStandAlone = 0;
394 fCutRequireITSpureSA = 0;
396 fCutNsigmaToVertex = 0;
397 fCutSigmaToVertexRequired = 0;
398 fCutMaxDCAToVertexXY = 0;
399 fCutMaxDCAToVertexZ = 0;
400 fCutDCAToVertex2D = 0;
401 fCutMinDCAToVertexXY = 0;
402 fCutMinDCAToVertexZ = 0;
403 fCutMaxDCAToVertexXYPtDep = "";
404 fCutMaxDCAToVertexZPtDep = "";
405 fCutMinDCAToVertexXYPtDep = "";
406 fCutMinDCAToVertexZPtDep = "";
408 if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
409 f1CutMaxDCAToVertexXYPtDep = 0;
410 if( f1CutMaxDCAToVertexXYPtDep) delete f1CutMaxDCAToVertexXYPtDep;
411 f1CutMaxDCAToVertexXYPtDep = 0;
412 if( f1CutMaxDCAToVertexZPtDep) delete f1CutMaxDCAToVertexZPtDep;
413 f1CutMaxDCAToVertexZPtDep = 0;
414 if( f1CutMinDCAToVertexXYPtDep)delete f1CutMinDCAToVertexXYPtDep;
415 f1CutMinDCAToVertexXYPtDep = 0;
416 if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
417 f1CutMinDCAToVertexZPtDep = 0;
435 fHistogramsOn = kFALSE;
437 for (Int_t i=0; i<2; ++i)
439 fhNClustersITS[i] = 0;
440 fhNClustersTPC[i] = 0;
441 fhNSharedClustersTPC[i] = 0;
442 fhNCrossedRowsTPC[i] = 0;
443 fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
445 fhChi2PerClusterITS[i] = 0;
446 fhChi2PerClusterTPC[i] = 0;
447 fhChi2TPCConstrainedVsGlobal[i] = 0;
448 fhNClustersForITSPID[i] = 0;
449 fhNMissingITSPoints[i] = 0;
457 fhRel1PtUncertainty[i] = 0;
464 fhDXYNormalized[i] = 0;
465 fhDZNormalized[i] = 0;
466 fhDXYvsDZNormalized[i] = 0;
467 fhNSigmaToVertex[i] = 0;
471 fhTOFdistance[i] = 0;
476 fhCutCorrelation = 0;
479 //_____________________________________________________________________________
480 AliESDtrackCuts &AliESDtrackCuts::operator=(const AliESDtrackCuts &c)
483 // Assignment operator
486 if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
490 //_____________________________________________________________________________
491 void AliESDtrackCuts::Copy(TObject &c) const
497 AliESDtrackCuts& target = (AliESDtrackCuts &) c;
501 target.fCutMinNClusterTPC = fCutMinNClusterTPC;
502 target.fCutMinNClusterITS = fCutMinNClusterITS;
503 target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
504 target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
505 if(f1CutMinNClustersTPCPtDep){
506 target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
508 target.fCutMaxPtDepNClustersTPC = fCutMaxPtDepNClustersTPC;
510 target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
511 target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
512 target.fCutMaxChi2TPCConstrainedVsGlobal = fCutMaxChi2TPCConstrainedVsGlobal;
513 target.fCutMaxChi2TPCConstrainedVsGlobalVertexType = fCutMaxChi2TPCConstrainedVsGlobalVertexType;
514 target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
516 for (Int_t i = 0; i < 3; i++)
517 target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
519 target.fCutMaxC11 = fCutMaxC11;
520 target.fCutMaxC22 = fCutMaxC22;
521 target.fCutMaxC33 = fCutMaxC33;
522 target.fCutMaxC44 = fCutMaxC44;
523 target.fCutMaxC55 = fCutMaxC55;
525 target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
527 target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
528 target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
529 target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
530 target.fCutRequireTPCRefit = fCutRequireTPCRefit;
531 target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
532 target.fCutRequireITSRefit = fCutRequireITSRefit;
533 target.fCutRequireITSPid = fCutRequireITSPid;
534 target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
535 target.fCutRequireITSpureSA = fCutRequireITSpureSA;
537 target.fCutNsigmaToVertex = fCutNsigmaToVertex;
538 target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
539 target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
540 target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
541 target.fCutDCAToVertex2D = fCutDCAToVertex2D;
542 target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
543 target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
545 target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
546 if(fCutMaxDCAToVertexXYPtDep.Length()>0)target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
548 target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
549 if(fCutMaxDCAToVertexZPtDep.Length()>0)target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
551 target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
552 if(fCutMinDCAToVertexXYPtDep.Length()>0)target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
554 target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
555 if(fCutMinDCAToVertexZPtDep.Length()>0)target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
557 target.fPMin = fPMin;
558 target.fPMax = fPMax;
559 target.fPtMin = fPtMin;
560 target.fPtMax = fPtMax;
561 target.fPxMin = fPxMin;
562 target.fPxMax = fPxMax;
563 target.fPyMin = fPyMin;
564 target.fPyMax = fPyMax;
565 target.fPzMin = fPzMin;
566 target.fPzMax = fPzMax;
567 target.fEtaMin = fEtaMin;
568 target.fEtaMax = fEtaMax;
569 target.fRapMin = fRapMin;
570 target.fRapMax = fRapMax;
572 target.fFlagCutTOFdistance = fFlagCutTOFdistance;
573 target.fCutTOFdistance = fCutTOFdistance;
574 target.fCutRequireTOFout = fCutRequireTOFout;
576 target.fHistogramsOn = fHistogramsOn;
578 for (Int_t i=0; i<2; ++i)
580 if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
581 if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
582 if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
583 if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
584 if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
586 if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
587 if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
588 if (fhChi2TPCConstrainedVsGlobal[i]) target.fhChi2TPCConstrainedVsGlobal[i] = (TH1F*) fhChi2TPCConstrainedVsGlobal[i]->Clone();
589 if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
590 if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
592 if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
593 if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
594 if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
595 if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
596 if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
598 if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
600 if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
601 if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
602 if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
603 if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
605 if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
606 if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
607 if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
608 if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
610 if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
611 if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
612 if (fhTOFdistance[i]) target.fhTOFdistance[i] = (TH2F*) fhTOFdistance[i]->Clone();
614 if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
616 if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
617 if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
622 //_____________________________________________________________________________
623 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
624 // Merge a list of AliESDtrackCuts objects with this (needed for PROOF)
625 // Returns the number of merged objects (including this)
632 TIterator* iter = list->MakeIterator();
635 // collection of measured and generated histograms
637 while ((obj = iter->Next())) {
639 AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
643 if (!entry->fHistogramsOn)
646 for (Int_t i=0; i<2; i++) {
648 fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
649 fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
650 if (fhNSharedClustersTPC[i])
651 fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
652 if (fhNCrossedRowsTPC[i])
653 fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
654 if (fhRatioCrossedRowsOverFindableClustersTPC[i])
655 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i] );
657 fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
658 fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
659 if (fhChi2TPCConstrainedVsGlobal[i])
660 fhChi2TPCConstrainedVsGlobal[i]->Add(entry->fhChi2TPCConstrainedVsGlobal[i]);
661 if (fhNClustersForITSPID[i])
662 fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
663 if (fhNMissingITSPoints[i])
664 fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
666 fhC11[i] ->Add(entry->fhC11[i] );
667 fhC22[i] ->Add(entry->fhC22[i] );
668 fhC33[i] ->Add(entry->fhC33[i] );
669 fhC44[i] ->Add(entry->fhC44[i] );
670 fhC55[i] ->Add(entry->fhC55[i] );
672 fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
674 fhDXY[i] ->Add(entry->fhDXY[i] );
675 fhDZ[i] ->Add(entry->fhDZ[i] );
676 fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
677 fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
679 fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
680 fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
681 fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
682 fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
684 fhPt[i] ->Add(entry->fhPt[i]);
685 fhEta[i] ->Add(entry->fhEta[i]);
686 fhTOFdistance[i] ->Add(entry->fhTOFdistance[i]);
689 fhCutStatistics ->Add(entry->fhCutStatistics);
690 fhCutCorrelation ->Add(entry->fhCutCorrelation);
697 void AliESDtrackCuts::SetMinNClustersTPCPtDep(TFormula *f1, Float_t ptmax)
700 // Sets the pT dependent NClustersTPC cut
704 delete f1CutMinNClustersTPCPtDep;
705 f1CutMinNClustersTPCPtDep = (TFormula*)f1->Clone("f1CutMinNClustersTPCPtDep");
707 fCutMaxPtDepNClustersTPC=ptmax;
710 //____________________________________________________________________
711 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
713 // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
715 AliInfoClass("Creating track cuts for TPC-only.");
717 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
719 esdTrackCuts->SetMinNClustersTPC(50);
720 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
721 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
723 esdTrackCuts->SetMaxDCAToVertexZ(3.2);
724 esdTrackCuts->SetMaxDCAToVertexXY(2.4);
725 esdTrackCuts->SetDCAToVertex2D(kTRUE);
730 //____________________________________________________________________
731 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
733 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
735 AliInfoClass("Creating track cuts for ITS+TPC (2009 definition).");
737 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
740 esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
741 esdTrackCuts->SetMinNClustersTPC(70);
742 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
743 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
744 esdTrackCuts->SetRequireTPCRefit(kTRUE);
746 esdTrackCuts->SetRequireITSRefit(kTRUE);
747 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
748 AliESDtrackCuts::kAny);
750 // 7*(0.0050+0.0060/pt^0.9)
751 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
752 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
754 esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
755 esdTrackCuts->SetDCAToVertex2D(kFALSE);
756 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
757 //esdTrackCuts->SetEtaRange(-0.8,+0.8);
759 esdTrackCuts->SetMaxChi2PerClusterITS(36);
764 //____________________________________________________________________
765 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries, Int_t clusterCut)
767 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2011 data
768 // if clusterCut = 1, the cut on the number of clusters is replaced by
769 // a cut on the number of crossed rows and on the ration crossed
770 // rows/findable clusters
772 AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
774 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
777 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
778 else if (clusterCut == 1) {
779 esdTrackCuts->SetMinNCrossedRowsTPC(70);
780 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
783 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
784 esdTrackCuts->SetMinNClustersTPC(50);
786 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
787 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
788 esdTrackCuts->SetRequireTPCRefit(kTRUE);
790 esdTrackCuts->SetRequireITSRefit(kTRUE);
791 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
792 AliESDtrackCuts::kAny);
794 // 7*(0.0015+0.0050/pt^1.1)
795 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
796 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
798 esdTrackCuts->SetMaxDCAToVertexZ(2);
799 esdTrackCuts->SetDCAToVertex2D(kFALSE);
800 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
802 esdTrackCuts->SetMaxChi2PerClusterITS(36);
807 //____________________________________________________________________
808 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries,Int_t clusterCut)
810 // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
811 // if clusterCut = 1, the cut on the number of clusters is replaced by
812 // a cut on the number of crossed rows and on the ration crossed
813 // rows/findable clusters
815 AliInfoClass("Creating track cuts for ITS+TPC (2010 definition).");
817 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
820 if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
821 else if (clusterCut == 1) {
822 esdTrackCuts->SetMinNCrossedRowsTPC(70);
823 esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
826 AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
827 esdTrackCuts->SetMinNClustersTPC(70);
829 esdTrackCuts->SetMaxChi2PerClusterTPC(4);
830 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
831 esdTrackCuts->SetRequireTPCRefit(kTRUE);
833 esdTrackCuts->SetRequireITSRefit(kTRUE);
834 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
835 AliESDtrackCuts::kAny);
837 // 7*(0.0026+0.0050/pt^1.01)
838 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
839 esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
841 esdTrackCuts->SetMaxDCAToVertexZ(2);
842 esdTrackCuts->SetDCAToVertex2D(kFALSE);
843 esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
845 esdTrackCuts->SetMaxChi2PerClusterITS(36);
850 //____________________________________________________________________
851 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
853 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
855 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
856 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
857 esdTrackCuts->SetRequireITSRefit(kTRUE);
858 esdTrackCuts->SetMinNClustersITS(4);
859 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
860 AliESDtrackCuts::kAny);
861 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
864 // 7*(0.0085+0.0026/pt^1.55)
865 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
868 esdTrackCuts->SetRequireITSPid(kTRUE);
873 //____________________________________________________________________
874 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
876 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
878 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
879 esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
880 esdTrackCuts->SetRequireITSRefit(kTRUE);
881 esdTrackCuts->SetMinNClustersITS(4);
882 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
883 AliESDtrackCuts::kAny);
884 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
887 // 7*(0.0033+0.0045/pt^1.3)
888 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
891 esdTrackCuts->SetRequireITSPid(kTRUE);
896 //____________________________________________________________________
897 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
899 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
901 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
902 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
903 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
904 esdTrackCuts->SetRequireITSRefit(kTRUE);
905 esdTrackCuts->SetMinNClustersITS(4);
906 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
907 AliESDtrackCuts::kAny);
908 esdTrackCuts->SetMaxChi2PerClusterITS(1.);
911 // 7*(0.0085+0.0026/pt^1.55)
912 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
915 esdTrackCuts->SetRequireITSPid(kTRUE);
920 //____________________________________________________________________
921 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
923 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
925 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
926 esdTrackCuts->SetRequireITSStandAlone(kTRUE);
927 esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
928 esdTrackCuts->SetRequireITSRefit(kTRUE);
929 esdTrackCuts->SetMinNClustersITS(4);
930 esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
931 AliESDtrackCuts::kAny);
932 esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
935 // 7*(0.0033+0.0045/pt^1.3)
936 esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
939 esdTrackCuts->SetRequireITSPid(kTRUE);
944 //____________________________________________________________________
945 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
947 // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
949 AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
950 esdTrackCuts->SetMaxNOfMissingITSPoints(1);
954 //____________________________________________________________________
956 AliESDtrackCuts* AliESDtrackCuts::GetStandardV0DaughterCuts()
958 // creates a AliESDtrackCuts object and fills it with standard cuts for V0 daughters
959 AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
960 esdTrackCuts->SetRequireTPCRefit(kTRUE);
961 esdTrackCuts->SetMinNClustersTPC(70);
962 esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
966 //____________________________________________________________________
967 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
969 // Gets reference multiplicity following the standard cuts and a defined fiducial volume
970 // tpcOnly = kTRUE -> consider TPC-only tracks
971 // = kFALSE -> consider global tracks
973 // DEPRECATED Use GetReferenceMultiplicity with the enum as second argument instead
977 AliErrorClass("Not implemented for global tracks!");
981 static AliESDtrackCuts* esdTrackCuts = 0;
984 esdTrackCuts = GetStandardTPCOnlyTrackCuts();
985 esdTrackCuts->SetEtaRange(-0.8, 0.8);
986 esdTrackCuts->SetPtRange(0.15);
989 Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
994 //____________________________________________________________________
995 Float_t AliESDtrackCuts::GetSigmaToVertex(const AliESDtrack* const esdTrack)
997 // Calculates the number of sigma to the vertex.
1002 esdTrack->GetImpactParameters(b,bCov);
1004 if (bCov[0]<=0 || bCov[2]<=0) {
1005 AliDebugClass(1, "Estimated b resolution lower or equal zero!");
1006 bCov[0]=0; bCov[2]=0;
1008 bRes[0] = TMath::Sqrt(bCov[0]);
1009 bRes[1] = TMath::Sqrt(bCov[2]);
1011 // -----------------------------------
1012 // How to get to a n-sigma cut?
1014 // The accumulated statistics from 0 to d is
1016 // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
1017 // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
1019 // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
1020 // Can this be expressed in a different way?
1022 if (bRes[0] == 0 || bRes[1] ==0)
1025 Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
1027 // work around precision problem
1028 // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
1029 // 1e-15 corresponds to nsigma ~ 7.7
1030 if (TMath::Exp(-d * d / 2) < 1e-15)
1033 Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
1037 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
1039 // enables the branches needed by AcceptTrack, for a list see comment of AcceptTrack
1041 tree->SetBranchStatus("fTracks.fFlags", 1);
1042 tree->SetBranchStatus("fTracks.fITSncls", 1);
1043 tree->SetBranchStatus("fTracks.fTPCncls", 1);
1044 tree->SetBranchStatus("fTracks.fITSchi2", 1);
1045 tree->SetBranchStatus("fTracks.fTPCchi2", 1);
1046 tree->SetBranchStatus("fTracks.fC*", 1);
1047 tree->SetBranchStatus("fTracks.fD", 1);
1048 tree->SetBranchStatus("fTracks.fZ", 1);
1049 tree->SetBranchStatus("fTracks.fCdd", 1);
1050 tree->SetBranchStatus("fTracks.fCdz", 1);
1051 tree->SetBranchStatus("fTracks.fCzz", 1);
1052 tree->SetBranchStatus("fTracks.fP*", 1);
1053 tree->SetBranchStatus("fTracks.fR*", 1);
1054 tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
1057 //____________________________________________________________________
1058 Bool_t AliESDtrackCuts::AcceptTrack(const AliESDtrack* esdTrack)
1061 // figure out if the tracks survives all the track cuts defined
1063 // the different quality parameter and kinematic values are first
1064 // retrieved from the track. then it is found out what cuts the
1065 // track did not survive and finally the cuts are imposed.
1067 // this function needs the following branches:
1073 // fTracks.fC //GetExternalCovariance
1074 // fTracks.fD //GetImpactParameters
1075 // fTracks.fZ //GetImpactParameters
1076 // fTracks.fCdd //GetImpactParameters
1077 // fTracks.fCdz //GetImpactParameters
1078 // fTracks.fCzz //GetImpactParameters
1079 // fTracks.fP //GetPxPyPz
1080 // fTracks.fR //GetMass
1081 // fTracks.fP //GetMass
1082 // fTracks.fKinkIndexes
1084 // esdEvent is only required for the MaxChi2TPCConstrainedVsGlobal
1086 UInt_t status = esdTrack->GetStatus();
1088 // getting quality parameters from the ESD track
1089 Int_t nClustersITS = esdTrack->GetITSclusters(0);
1090 Int_t nClustersTPC = -1;
1091 if(fCutRequireTPCStandAlone) {
1092 nClustersTPC = esdTrack->GetTPCNclsIter1();
1095 nClustersTPC = esdTrack->GetTPCclusters(0);
1098 //Pt dependent NClusters Cut
1099 if(f1CutMinNClustersTPCPtDep) {
1100 if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
1101 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(esdTrack->Pt());
1103 fCutMinNClusterTPC = f1CutMinNClustersTPCPtDep->Eval(fCutMaxPtDepNClustersTPC);
1106 Float_t nCrossedRowsTPC = esdTrack->GetTPCCrossedRows();
1107 Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1108 if (esdTrack->GetTPCNclsF()>0) {
1109 ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
1112 Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
1113 Float_t fracClustersTPCShared = -1.;
1115 Float_t chi2PerClusterITS = -1;
1116 Float_t chi2PerClusterTPC = -1;
1117 if (nClustersITS!=0)
1118 chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
1119 if (nClustersTPC!=0) {
1120 if(fCutRequireTPCStandAlone) {
1121 chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1123 chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
1125 fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1128 Double_t extCov[15];
1129 esdTrack->GetExternalCovariance(extCov);
1133 esdTrack->GetImpactParameters(b,bCov);
1134 if (bCov[0]<=0 || bCov[2]<=0) {
1135 AliDebug(1, "Estimated b resolution lower or equal zero!");
1136 bCov[0]=0; bCov[2]=0;
1140 // set pt-dependent DCA cuts, if requested
1141 SetPtDepDCACuts(esdTrack->Pt());
1144 Float_t dcaToVertexXY = b[0];
1145 Float_t dcaToVertexZ = b[1];
1147 Float_t dcaToVertex = -1;
1149 if (fCutDCAToVertex2D)
1151 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1154 dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1156 // getting the kinematic variables of the track
1157 // (assuming the mass is known)
1159 esdTrack->GetPxPyPz(p);
1161 Float_t momentum = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2) + TMath::Power(p[2],2));
1162 Float_t pt = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
1163 Float_t energy = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
1165 //y-eta related calculations
1166 Float_t eta = -100.;
1168 if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1169 eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1170 if((energy != TMath::Abs(p[2]))&&(momentum != 0))
1171 y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1175 AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1178 Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1180 //########################################################################
1183 Bool_t cuts[kNCuts];
1184 for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1186 // track quality cuts
1187 if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1189 if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1191 if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1193 if (nClustersTPC<fCutMinNClusterTPC)
1195 if (nClustersITS<fCutMinNClusterITS)
1197 if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1199 if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1201 if (extCov[0] > fCutMaxC11)
1203 if (extCov[2] > fCutMaxC22)
1205 if (extCov[5] > fCutMaxC33)
1207 if (extCov[9] > fCutMaxC44)
1209 if (extCov[14] > fCutMaxC55)
1212 // cut 12 and 13 see below
1214 if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1216 // track kinematics cut
1217 if((momentum < fPMin) || (momentum > fPMax))
1219 if((pt < fPtMin) || (pt > fPtMax))
1221 if((p[0] < fPxMin) || (p[0] > fPxMax))
1223 if((p[1] < fPyMin) || (p[1] > fPyMax))
1225 if((p[2] < fPzMin) || (p[2] > fPzMax))
1227 if((eta < fEtaMin) || (eta > fEtaMax))
1229 if((y < fRapMin) || (y > fRapMax))
1231 if (fCutDCAToVertex2D && dcaToVertex > 1)
1233 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1235 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1237 if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1239 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1241 if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1244 for (Int_t i = 0; i < 3; i++) {
1245 if(!(esdTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
1246 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1247 } else { // upgraded ITS (7 layers)
1248 // at the moment, for L012 the layers 12 are considered together
1250 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(0), (esdTrack->HasPointOnITSLayer(1))&(esdTrack->HasPointOnITSLayer(2)));
1251 } else { // L34 or L56
1252 cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2+1), esdTrack->HasPointOnITSLayer(i*2+2));
1257 if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
1258 if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1262 // ITS standalone tracks
1263 if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
1264 if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1265 }else if(fCutRequireITSpureSA){
1266 if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1271 if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1274 if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1277 if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1280 Int_t nITSPointsForPid=0;
1281 UChar_t clumap=esdTrack->GetITSClusterMap();
1282 for(Int_t i=2; i<6; i++){
1283 if(clumap&(1<<i)) ++nITSPointsForPid;
1285 if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1288 if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1290 if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1293 Int_t nMissITSpts=0;
1294 Int_t idet,statusLay;
1296 for(Int_t iLay=0; iLay<6; iLay++){
1297 Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1298 if(retc && statusLay==5) ++nMissITSpts;
1300 if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1303 if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
1306 // TOF signal Dz cut
1307 Float_t dxTOF = esdTrack->GetTOFsignalDx();
1308 Float_t dzTOF = esdTrack->GetTOFsignalDz();
1309 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
1310 if (fgBeamTypeFlag < 0) { // the check on the beam type was not done yet
1311 const AliESDEvent* event = esdTrack->GetESDEvent();
1313 TString beamTypeESD = event->GetBeamType();
1314 AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
1315 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
1318 else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
1323 AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
1327 if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
1328 Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
1329 AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
1330 if (radiusTOF > fCutTOFdistance){
1331 AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
1338 for (Int_t i=0; i<kNCuts; i++)
1339 if (cuts[i]) {cut = kTRUE;}
1341 // for performance evaluate the CPU intensive cuts only when the others have passed, and when they are requested
1342 Double_t chi2TPCConstrainedVsGlobal = -2;
1343 Float_t nSigmaToVertex = -2;
1346 // getting the track to vertex parameters
1347 if (fCutSigmaToVertexRequired)
1349 nSigmaToVertex = GetSigmaToVertex(esdTrack);
1350 if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1355 // if n sigma could not be calculated
1356 if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1363 // max chi2 TPC constrained vs global track only if track passed the other cut
1364 if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
1366 const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
1369 AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
1372 const AliESDVertex* vertex = 0;
1373 if (fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTracks)
1374 vertex = esdEvent->GetPrimaryVertexTracks();
1376 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexSPD)
1377 vertex = esdEvent->GetPrimaryVertexSPD();
1379 if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTPC)
1380 vertex = esdEvent->GetPrimaryVertexTPC();
1382 if (vertex->GetStatus())
1383 chi2TPCConstrainedVsGlobal = esdTrack->GetChi2TPCConstrainedVsGlobal(vertex);
1385 if (chi2TPCConstrainedVsGlobal < 0 || chi2TPCConstrainedVsGlobal > fCutMaxChi2TPCConstrainedVsGlobal)
1393 //########################################################################
1394 // filling histograms
1395 if (fHistogramsOn) {
1396 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1398 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1400 for (Int_t i=0; i<kNCuts; i++) {
1401 if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1402 AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1405 fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1407 for (Int_t j=i; j<kNCuts; j++) {
1408 if (cuts[i] && cuts[j]) {
1409 Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1410 Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1411 fhCutCorrelation->Fill(xC, yC);
1417 // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1418 // the code is not in a function due to too many local variables that would need to be passed
1420 for (Int_t id = 0; id < 2; id++)
1422 // id = 0 --> before cut
1423 // id = 1 --> after cut
1427 fhNClustersITS[id]->Fill(nClustersITS);
1428 fhNClustersTPC[id]->Fill(nClustersTPC);
1429 fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1430 fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1431 fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1432 fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1433 fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1434 fhChi2TPCConstrainedVsGlobal[id]->Fill(chi2TPCConstrainedVsGlobal);
1435 fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1436 fhNMissingITSPoints[id]->Fill(nMissITSpts);
1438 fhC11[id]->Fill(extCov[0]);
1439 fhC22[id]->Fill(extCov[2]);
1440 fhC33[id]->Fill(extCov[5]);
1441 fhC44[id]->Fill(extCov[9]);
1442 fhC55[id]->Fill(extCov[14]);
1444 fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1447 fhEta[id]->Fill(eta);
1448 fhTOFdistance[id]->Fill(dxTOF, dzTOF);
1451 bRes[0] = TMath::Sqrt(bCov[0]);
1452 bRes[1] = TMath::Sqrt(bCov[2]);
1454 fhDZ[id]->Fill(b[1]);
1455 fhDXY[id]->Fill(b[0]);
1456 fhDXYDZ[id]->Fill(dcaToVertex);
1457 fhDXYvsDZ[id]->Fill(b[1],b[0]);
1459 if (bRes[0]!=0 && bRes[1]!=0) {
1460 fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1461 fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1462 fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1463 fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1475 //____________________________________________________________________
1476 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
1478 // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
1482 case kOff: return kTRUE;
1483 case kNone: return !clusterL1 && !clusterL2;
1484 case kAny: return clusterL1 || clusterL2;
1485 case kFirst: return clusterL1;
1486 case kOnlyFirst: return clusterL1 && !clusterL2;
1487 case kSecond: return clusterL2;
1488 case kOnlySecond: return clusterL2 && !clusterL1;
1489 case kBoth: return clusterL1 && clusterL2;
1495 //____________________________________________________________________
1496 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(const AliESDEvent* esd, Int_t iTrack)
1498 // Utility function to create a TPC only track from the given esd track
1500 // IMPORTANT: The track has to be deleted by the user
1502 // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
1503 // there are only missing propagations here that are needed for old data
1504 // this function will therefore become obsolete
1506 // adapted from code provided by CKB
1508 if (!esd->GetPrimaryVertexTPC())
1509 return 0; // No TPC vertex no TPC tracks
1511 if(!esd->GetPrimaryVertexTPC()->GetStatus())
1512 return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
1514 AliESDtrack* track = esd->GetTrack(iTrack);
1518 AliESDtrack *tpcTrack = new AliESDtrack();
1520 // only true if we have a tpc track
1521 if (!track->FillTPCOnlyTrack(*tpcTrack))
1530 //____________________________________________________________________
1531 TObjArray* AliESDtrackCuts::GetAcceptedTracks(const AliESDEvent* esd, Bool_t bTPC)
1534 // returns an array of all tracks that pass the cuts
1535 // or an array of TPC only tracks (propagated to the TPC vertex during reco)
1536 // tracks that pass the cut
1538 // NOTE: List has to be deleted by the user
1540 TObjArray* acceptedTracks = new TObjArray();
1542 // loop over esd tracks
1543 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1545 if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
1546 if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
1548 AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
1552 if (AcceptTrack(tpcTrack)) {
1553 acceptedTracks->Add(tpcTrack);
1560 AliESDtrack* track = esd->GetTrack(iTrack);
1561 if(AcceptTrack(track))
1562 acceptedTracks->Add(track);
1565 if(bTPC)acceptedTracks->SetOwner(kTRUE);
1566 return acceptedTracks;
1569 //____________________________________________________________________
1570 Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
1573 // returns an the number of tracks that pass the cuts
1578 // loop over esd tracks
1579 for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
1580 AliESDtrack* track = esd->GetTrack(iTrack);
1581 if (AcceptTrack(track))
1588 //____________________________________________________________________
1589 void AliESDtrackCuts::DefineHistograms(Int_t color) {
1591 // diagnostics histograms are defined
1594 fHistogramsOn=kTRUE;
1596 Bool_t oldStatus = TH1::AddDirectoryStatus();
1597 TH1::AddDirectory(kFALSE);
1599 //###################################################################################
1600 // defining histograms
1602 fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
1604 fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
1605 fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
1607 fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
1609 for (Int_t i=0; i<kNCuts; i++) {
1610 fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
1611 fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1612 fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
1615 fhCutStatistics ->SetLineColor(color);
1616 fhCutCorrelation ->SetLineColor(color);
1617 fhCutStatistics ->SetLineWidth(2);
1618 fhCutCorrelation ->SetLineWidth(2);
1620 for (Int_t i=0; i<2; i++) {
1621 fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
1622 fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
1623 fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
1624 fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
1625 fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
1626 fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
1627 fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
1628 fhChi2TPCConstrainedVsGlobal[i] = new TH1F("chi2TPCConstrainedVsGlobal","",600,-2,50);
1629 fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
1630 fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
1632 fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
1633 fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
1634 fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
1635 fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
1636 fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
1638 fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
1640 fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
1641 fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
1642 fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
1643 fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
1645 fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
1646 fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
1647 fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
1649 fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
1651 fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
1652 fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
1653 fhTOFdistance[i] = new TH2F("TOFdistance" ,"TOF distance;dx (cm};dz (cm)", 150, -15, 15, 150, -15, 15);
1655 fhNClustersITS[i]->SetTitle("n ITS clusters");
1656 fhNClustersTPC[i]->SetTitle("n TPC clusters");
1657 fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
1658 fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
1659 fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
1660 fhChi2TPCConstrainedVsGlobal[i]->SetTitle("#Chi^{2} TPC constrained track vs global track");
1661 fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
1662 fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
1664 fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
1665 fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
1666 fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
1667 fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
1668 fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
1670 fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
1672 fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
1673 fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1674 fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
1675 fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
1676 fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
1678 fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
1679 fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1680 fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
1681 fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
1682 fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
1684 fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
1685 fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
1686 fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
1687 fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
1688 fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
1689 fhChi2TPCConstrainedVsGlobal[i]->SetLineColor(color); fhChi2TPCConstrainedVsGlobal[i]->SetLineWidth(2);
1690 fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
1691 fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
1693 fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
1694 fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
1695 fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
1696 fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
1697 fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
1699 fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
1701 fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
1702 fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
1703 fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
1705 fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
1706 fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
1707 fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
1710 // The number of sigmas to the vertex is per definition gaussian
1711 ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
1712 ffDTheoretical->SetParameter(0,1);
1714 TH1::AddDirectory(oldStatus);
1717 //____________________________________________________________________
1718 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
1721 // loads the histograms from a file
1722 // if dir is empty a directory with the name of this object is taken (like in SaveHistogram)
1728 if (!gDirectory->cd(dir))
1731 ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
1733 fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
1734 fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
1736 for (Int_t i=0; i<2; i++) {
1739 gDirectory->cd("before_cuts");
1742 gDirectory->cd("after_cuts");
1744 fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
1745 fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
1746 fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
1747 fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
1748 fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
1749 fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
1750 fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
1751 fhChi2TPCConstrainedVsGlobal[i] = dynamic_cast<TH1F*> (gDirectory->Get("fhChi2TPCConstrainedVsGlobal"));
1752 fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
1753 fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
1755 fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
1756 fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
1757 fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
1758 fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
1759 fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
1761 fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
1763 fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
1764 fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
1765 fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
1766 fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
1768 fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
1769 fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
1770 fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
1771 fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
1773 fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
1774 fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
1775 fhTOFdistance[i] = dynamic_cast<TH2F*> (gDirectory->Get("TOFdistance"));
1777 gDirectory->cd("../");
1780 gDirectory->cd("..");
1785 //____________________________________________________________________
1786 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
1788 // saves the histograms in a directory (dir)
1791 if (!fHistogramsOn) {
1792 AliDebug(0, "Histograms not on - cannot save histograms!!!");
1799 gDirectory->mkdir(dir);
1800 gDirectory->cd(dir);
1802 gDirectory->mkdir("before_cuts");
1803 gDirectory->mkdir("after_cuts");
1805 // a factor of 2 is needed since n sigma is positive
1806 ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
1807 ffDTheoretical->Write("nSigmaToVertexTheory");
1809 fhCutStatistics->Write();
1810 fhCutCorrelation->Write();
1812 for (Int_t i=0; i<2; i++) {
1814 gDirectory->cd("before_cuts");
1816 gDirectory->cd("after_cuts");
1818 fhNClustersITS[i] ->Write();
1819 fhNClustersTPC[i] ->Write();
1820 fhNSharedClustersTPC[i] ->Write();
1821 fhNCrossedRowsTPC[i] ->Write();
1822 fhRatioCrossedRowsOverFindableClustersTPC[i] ->Write();
1823 fhChi2PerClusterITS[i] ->Write();
1824 fhChi2PerClusterTPC[i] ->Write();
1825 fhChi2TPCConstrainedVsGlobal[i] ->Write();
1826 fhNClustersForITSPID[i] ->Write();
1827 fhNMissingITSPoints[i] ->Write();
1835 fhRel1PtUncertainty[i] ->Write();
1839 fhDXYDZ[i] ->Write();
1840 fhDXYvsDZ[i] ->Write();
1842 fhDXYNormalized[i] ->Write();
1843 fhDZNormalized[i] ->Write();
1844 fhDXYvsDZNormalized[i] ->Write();
1845 fhNSigmaToVertex[i] ->Write();
1849 fhTOFdistance[i] ->Write();
1851 gDirectory->cd("../");
1854 gDirectory->cd("../");
1857 //____________________________________________________________________
1858 void AliESDtrackCuts::DrawHistograms()
1860 // draws some histograms
1862 TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
1863 canvas1->Divide(2, 2);
1866 fhNClustersTPC[0]->SetStats(kFALSE);
1867 fhNClustersTPC[0]->Draw();
1870 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1871 fhChi2PerClusterTPC[0]->Draw();
1874 fhNSigmaToVertex[0]->SetStats(kFALSE);
1875 fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
1876 fhNSigmaToVertex[0]->Draw();
1878 canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
1880 TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
1881 canvas2->Divide(3, 2);
1884 fhC11[0]->SetStats(kFALSE);
1889 fhC22[0]->SetStats(kFALSE);
1894 fhC33[0]->SetStats(kFALSE);
1899 fhC44[0]->SetStats(kFALSE);
1904 fhC55[0]->SetStats(kFALSE);
1909 fhRel1PtUncertainty[0]->SetStats(kFALSE);
1911 fhRel1PtUncertainty[0]->Draw();
1913 canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
1915 TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
1916 canvas3->Divide(3, 2);
1919 fhDXY[0]->SetStats(kFALSE);
1924 fhDZ[0]->SetStats(kFALSE);
1929 fhDXYvsDZ[0]->SetStats(kFALSE);
1931 gPad->SetRightMargin(0.15);
1932 fhDXYvsDZ[0]->Draw("COLZ");
1935 fhDXYNormalized[0]->SetStats(kFALSE);
1937 fhDXYNormalized[0]->Draw();
1940 fhDZNormalized[0]->SetStats(kFALSE);
1942 fhDZNormalized[0]->Draw();
1945 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1947 gPad->SetRightMargin(0.15);
1948 fhDXYvsDZNormalized[0]->Draw("COLZ");
1950 canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
1952 TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
1953 canvas4->Divide(2, 1);
1956 fhCutStatistics->SetStats(kFALSE);
1957 fhCutStatistics->LabelsOption("v");
1958 gPad->SetBottomMargin(0.3);
1959 fhCutStatistics->Draw();
1962 fhCutCorrelation->SetStats(kFALSE);
1963 fhCutCorrelation->LabelsOption("v");
1964 gPad->SetBottomMargin(0.3);
1965 gPad->SetLeftMargin(0.3);
1966 fhCutCorrelation->Draw("COLZ");
1968 canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
1971 fhDXYvsDZNormalized[0]->SetStats(kFALSE);
1972 fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
1975 fhNClustersTPC[0]->SetStats(kFALSE);
1976 fhNClustersTPC[0]->DrawCopy();
1979 fhChi2PerClusterITS[0]->SetStats(kFALSE);
1980 fhChi2PerClusterITS[0]->DrawCopy();
1981 fhChi2PerClusterITS[1]->SetLineColor(2);
1982 fhChi2PerClusterITS[1]->DrawCopy("SAME");
1985 fhChi2PerClusterTPC[0]->SetStats(kFALSE);
1986 fhChi2PerClusterTPC[0]->DrawCopy();
1987 fhChi2PerClusterTPC[1]->SetLineColor(2);
1988 fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
1990 //--------------------------------------------------------------------------
1991 void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
1993 // set the pt-dependent DCA cuts
1996 if(f1CutMaxDCAToVertexXYPtDep) {
1997 fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
2000 if(f1CutMaxDCAToVertexZPtDep) {
2001 fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
2004 if(f1CutMinDCAToVertexXYPtDep) {
2005 fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
2008 if(f1CutMinDCAToVertexZPtDep) {
2009 fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
2018 //--------------------------------------------------------------------------
2019 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
2021 // Check the correctness of the string syntax
2023 Bool_t retval=kTRUE;
2025 if(!dist.Contains("pt")) {
2026 if(print) AliError("string must contain \"pt\"");
2032 void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
2034 if(f1CutMaxDCAToVertexXYPtDep){
2035 delete f1CutMaxDCAToVertexXYPtDep;
2037 f1CutMaxDCAToVertexXYPtDep = 0;
2038 fCutMaxDCAToVertexXYPtDep = "";
2040 if(!CheckPtDepDCA(dist,kTRUE)){
2043 fCutMaxDCAToVertexXYPtDep = dist;
2045 tmp.ReplaceAll("pt","x");
2046 f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
2050 void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
2053 if(f1CutMaxDCAToVertexZPtDep){
2054 delete f1CutMaxDCAToVertexZPtDep;
2056 f1CutMaxDCAToVertexZPtDep = 0;
2057 fCutMaxDCAToVertexZPtDep = "";
2059 if(!CheckPtDepDCA(dist,kTRUE))return;
2061 fCutMaxDCAToVertexZPtDep = dist;
2063 tmp.ReplaceAll("pt","x");
2064 f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
2070 void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
2073 if(f1CutMinDCAToVertexXYPtDep){
2074 delete f1CutMinDCAToVertexXYPtDep;
2076 f1CutMinDCAToVertexXYPtDep = 0;
2077 fCutMinDCAToVertexXYPtDep = "";
2079 if(!CheckPtDepDCA(dist,kTRUE))return;
2081 fCutMinDCAToVertexXYPtDep = dist;
2083 tmp.ReplaceAll("pt","x");
2084 f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
2089 void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
2093 if(f1CutMinDCAToVertexZPtDep){
2094 delete f1CutMinDCAToVertexZPtDep;
2096 f1CutMinDCAToVertexZPtDep = 0;
2097 fCutMinDCAToVertexZPtDep = "";
2099 if(!CheckPtDepDCA(dist,kTRUE))return;
2100 fCutMinDCAToVertexZPtDep = dist;
2102 tmp.ReplaceAll("pt","x");
2103 f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
2106 AliESDtrackCuts* AliESDtrackCuts::GetMultEstTrackCuts(MultEstTrackCuts cut)
2108 // returns the multiplicity estimator track cuts objects to allow for user configuration
2109 // upon first call the objects are created
2111 // the cut defined here correspond to GetStandardITSTPCTrackCuts2010 (apart from the one for without SPD)
2113 if (!fgMultEstTrackCuts[kMultEstTrackCutGlobal])
2115 // quality cut on ITS+TPC tracks
2116 fgMultEstTrackCuts[kMultEstTrackCutGlobal] = new AliESDtrackCuts();
2117 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMinNClustersTPC(70);
2118 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetMaxChi2PerClusterTPC(4);
2119 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetAcceptKinkDaughters(kFALSE);
2120 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireTPCRefit(kTRUE);
2121 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetRequireITSRefit(kTRUE);
2122 //multiplicity underestimate if we use global tracks with |eta| > 0.9
2123 fgMultEstTrackCuts[kMultEstTrackCutGlobal]->SetEtaRange(-0.9, 0.9);
2125 // quality cut on ITS_SA tracks (complementary to ITS+TPC)
2126 fgMultEstTrackCuts[kMultEstTrackCutITSSA] = new AliESDtrackCuts();
2127 fgMultEstTrackCuts[kMultEstTrackCutITSSA]->SetRequireITSRefit(kTRUE);
2129 // primary selection for tracks with SPD hits
2130 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD] = new AliESDtrackCuts();
2131 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kAny);
2132 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
2133 fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->SetMaxDCAToVertexZ(2);
2135 // primary selection for tracks w/o SPD hits
2136 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD] = new AliESDtrackCuts();
2137 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetClusterRequirementITS(AliESDtrackCuts::kSPD, AliESDtrackCuts::kNone);
2138 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
2139 fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexZ(2);
2142 return fgMultEstTrackCuts[cut];
2145 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType, Float_t etaRange)
2147 // Get multiplicity estimate based on TPC/ITS tracks and tracklets
2148 // Adapted for AliESDtrackCuts from a version developed by: Ruben Shahoyan, Anton Alkin, Arvinder Palaha
2150 // Returns a negative value if no reliable estimate can be provided:
2151 // -1 SPD vertex missing
2152 // -2 SPD VertexerZ dispersion too large
2153 // -3 Track vertex missing (not checked for kTracklets)
2154 // -4 Distance between SPD and track vertices too large (not checked for kTracklets)
2156 // WARNING This functions does not cut on the z vtx. Depending on the eta range requested, you need to restrict your z vertex range!
2158 // Strategy for combined estimators
2159 // 1. Count global tracks and flag them
2160 // 2. Count ITSSA as complementaries for ITSTPC+ or as main tracks
2161 // 3. Count the complementary SPD tracklets
2163 const AliESDVertex* vertices[2];
2164 vertices[0] = esd->GetPrimaryVertexSPD();
2165 vertices[1] = esd->GetPrimaryVertexTracks();
2167 if (!vertices[0]->GetStatus())
2169 AliDebugClass(AliLog::kDebug, "No SPD vertex. Not able to make a reliable multiplicity estimate.");
2173 if (vertices[0]->IsFromVertexerZ() && vertices[0]->GetDispersion() > 0.02)
2175 AliDebugClass(AliLog::kDebug, "Vertexer z dispersion > 0.02. Not able to make a reliable multiplicity estimate.");
2179 Int_t multiplicityEstimate = 0;
2181 // SPD tracklet-only estimate
2182 if (trackType == kTracklets)
2184 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2185 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i)
2187 if (TMath::Abs(spdmult->GetEta(i)) > etaRange)
2188 continue; // eta selection for tracklets
2189 multiplicityEstimate++;
2191 return multiplicityEstimate;
2194 if (!vertices[1]->GetStatus())
2196 AliDebugClass(AliLog::kDebug, "No track vertex. Not able to make a reliable multiplicity estimate.");
2200 // TODO value of displacement to be studied
2201 const Float_t maxDisplacement = 0.5;
2202 //check for displaced vertices
2203 Double_t displacement = TMath::Abs(vertices[0]->GetZ() - vertices[1]->GetZ());
2204 if (displacement > maxDisplacement)
2206 AliDebugClass(AliLog::kDebug, Form("Displaced vertices %f > %f",displacement,maxDisplacement));
2210 // update eta range in track cuts
2211 GetMultEstTrackCuts(kMultEstTrackCutITSSA)->SetEtaRange(-etaRange, etaRange);
2212 GetMultEstTrackCuts(kMultEstTrackCutDCAwSPD)->SetEtaRange(-etaRange, etaRange);
2213 GetMultEstTrackCuts(kMultEstTrackCutDCAwoSPD)->SetEtaRange(-etaRange, etaRange);
2215 //*******************************************************************************************************
2216 //set counters to initial zeros
2217 Int_t tracksITSTPC = 0; //number of global tracks for a given event
2218 Int_t tracksITSSA = 0; //number of ITS standalone tracks for a given event
2219 Int_t tracksITSTPCSA_complementary = 0; //number of ITS standalone tracks complementary to TPC for a given event
2220 Int_t trackletsITSTPC_complementary = 0;//number of SPD tracklets complementary to global/ITSSA tracks for a given events
2221 Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
2223 const Int_t nESDTracks = esd->GetNumberOfTracks();
2224 Int_t highestID = 0;
2226 // flags for secondary and rejected tracks
2227 const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
2228 const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
2230 for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
2231 esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
2233 const Int_t maxid = nESDTracks+1; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
2235 // bit mask for esd tracks, to check if multiple tracklets are associated to it
2236 TBits globalBits(maxid), pureITSBits(maxid);
2237 // why labels are used with the data? RS
2238 // Bool_t globalBits[maxid], pureITSBits[maxid];
2239 // for(Int_t i=0; i<maxid; i++){ // set all bools to false
2240 // globalBits[i]=kFALSE;
2241 // pureITSBits[i]=kFALSE;
2244 //*******************************************************************************************************
2245 // get multiplicity from global tracks
2246 for(Int_t itracks = 0; itracks < nESDTracks; itracks++) { // flag the tracks
2247 AliESDtrack* track = esd->GetTrack(itracks);
2249 // if track is a secondary from a V0, flag as a secondary
2250 if (track->IsOn(AliESDtrack::kMultInV0)) {
2251 track->SetBit(kSecBit);
2254 /* done via proper DCA cut
2256 if (track->IsOn(AliESDtrack::kMultSec)) {
2257 track->SetBit(kSecBit);
2261 // check tracks with ITS part
2262 //*******************************************************************************************************
2263 if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
2264 //*******************************************************************************************************
2266 if (track->IsOn(AliESDtrack::kTPCin)) { // Global track, has ITS and TPC contributions
2267 if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
2268 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2269 tracksITSTPC++; //global track counted
2270 globalBits.SetBitNumber(itracks);
2272 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2274 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2276 //*******************************************************************************************************
2277 // ITS complementary
2278 else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
2279 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2280 tracksITSTPCSA_complementary++;
2281 globalBits.SetBitNumber(itracks);
2283 else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
2285 else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
2287 //*******************************************************************************************************
2288 // check tracks from ITS_SA_PURE
2289 if (track->IsOn(AliESDtrack::kITSin) && track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSSA){
2290 if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
2291 if (fgMultEstTrackCuts[kMultEstTrackCutDCAwSPD]->AcceptTrack(track) || fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->AcceptTrack(track)) {
2293 pureITSBits.SetBitNumber(itracks);
2295 else track->SetBit(kRejBit);
2297 else track->SetBit(kRejBit);
2299 }//ESD tracks counted
2301 //*******************************************************************************************************
2302 // get multiplicity from ITS tracklets to complement TPC+ITS, and ITSpureSA
2303 const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2304 for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i) {
2305 if (TMath::Abs(spdmult->GetEta(i)) > etaRange) continue; // eta selection for tracklets
2307 // if counting tracks+tracklets, check if clusters were already used in tracks
2308 Int_t id1,id2,id3,id4;
2309 spdmult->GetTrackletTrackIDs(i,0,id1,id2); // references for eventual Global/ITS_SA tracks
2310 AliESDtrack* tr1 = id1>=0 ? esd->GetTrack(id1) : 0;
2311 spdmult->GetTrackletTrackIDs(i,1,id3,id4); // references for eventual ITS_SA_pure tracks
2312 AliESDtrack* tr3 = id3>=0 ? esd->GetTrack(id3) : 0;
2314 // are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
2315 if ((id1!=id2 && id1>=0 && id2>=0) || (id3!=id4 && id3>=0 && id4>=0)) continue;
2317 Bool_t bUsedInGlobal = (id1 != -1) ? globalBits.TestBitNumber(id1) : 0;// has associated global track been associated to a previous tracklet?
2318 Bool_t bUsedInPureITS = (id3 != -1) ? pureITSBits.TestBitNumber(id3) : 0;// has associated pure ITS track been associated to a previous tracklet?
2319 //*******************************************************************************************************
2320 if (trackType == kTrackletsITSTPC) {
2321 // count tracklets towards global+complementary tracks
2322 if ( (tr1 && !tr1->TestBit(kSecBit)) && // reject as secondary
2323 (tr1 && tr1->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2325 ++trackletsITSTPC_complementary;
2326 if(id1>0) globalBits.SetBitNumber(id1); // mark global track linked to this tracklet as "associated"
2330 ++trackletsITSTPC_complementary; // if no associated track, count the tracklet
2333 // count tracklets towards ITS_SA_pure tracks
2334 if ( (tr3 && !tr3->TestBit(kSecBit)) && // reject as secondary
2335 (tr3 && tr3->TestBit(kRejBit)) ) { // count tracklet as bad quality track
2336 if(!bUsedInPureITS) {
2337 ++trackletsITSSA_complementary;
2338 if(id3>0) pureITSBits.SetBitNumber(id3); // mark global track linked to this tracklet as "associated"
2342 ++trackletsITSSA_complementary; // if no associated track, count the tracklet
2347 //*******************************************************************************************************
2348 if (trackType == kTrackletsITSTPC)
2349 multiplicityEstimate = tracksITSTPC + tracksITSTPCSA_complementary + trackletsITSTPC_complementary;
2351 multiplicityEstimate = tracksITSSA + trackletsITSSA_complementary;
2353 return multiplicityEstimate;
2356 //____________________________________________________________________
2357 void AliESDtrackCuts::SetRequireStandardTOFmatchCuts(){
2359 // setting the TOF cuts flags (kTOFout = TOF matching distance) to true, to include the selection on the standard TOF matching
2361 SetRequireTOFout(kTRUE);
2362 SetFlagCutTOFdistance(kTRUE);
2363 SetCutTOFdistance(3.);