AliRoot Core  3dc7879 (3dc7879)
AliESDtrackCuts.cxx
Go to the documentation of this file.
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  * *
4  * Author: The ALICE Off-line Project. *
5  * Contributors are mentioned in the code where appropriate. *
6  * *
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  **************************************************************************/
15 
16 /* $Id: AliESDtrackCuts.cxx 24534 2008-03-16 22:22:11Z fca $ */
17 
18 #include "AliESDtrackCuts.h"
19 
20 #include <AliESDtrack.h>
21 #include <AliAODTrack.h>
22 #include <AliESDVertex.h>
23 #include <AliAODVertex.h>
24 #include <AliESDEvent.h>
25 #include <AliMultiplicity.h>
26 #include <AliLog.h>
27 
28 #include <TTree.h>
29 #include <TCanvas.h>
30 #include <TDirectory.h>
31 #include <TH2F.h>
32 #include <TF1.h>
33 #include <TBits.h>
34 
36 
37 ClassImp(AliESDtrackCuts)
38 
39 // Cut names
40 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
41  "require TPC refit",
42  "require TPC standalone",
43  "require ITS refit",
44  "n clusters TPC",
45  "n clusters ITS",
46  "#Chi^{2}/cluster TPC",
47  "#Chi^{2}/cluster ITS",
48  "cov 11",
49  "cov 22",
50  "cov 33",
51  "cov 44",
52  "cov 55",
53  "trk-to-vtx",
54  "trk-to-vtx failed",
55  "kink daughters",
56  "p",
57  "p_{T}",
58  "p_{x}",
59  "p_{y}",
60  "p_{z}",
61  "eta",
62  "y",
63  "trk-to-vtx max dca 2D absolute",
64  "trk-to-vtx max dca xy absolute",
65  "trk-to-vtx max dca z absolute",
66  "trk-to-vtx min dca 2D absolute",
67  "trk-to-vtx min dca xy absolute",
68  "trk-to-vtx min dca z absolute",
69  "SPD cluster requirement",
70  "SDD cluster requirement",
71  "SSD cluster requirement",
72  "require ITS stand-alone",
73  "rel 1/pt uncertainty",
74  "TPC n shared clusters",
75  "TPC rel shared clusters",
76  "require ITS Pid",
77  "n crossed rows TPC",
78  "n crossed rows / n findable clusters",
79  "missing ITS points",
80  "#Chi^{2} TPC constrained vs. global",
81  "require TOF out",
82  "TOF Distance cut",
83  "min length in active volume TPC",
84  "n-geometrical+n-crossed-row and n-clusters cut",
85  "track is in distorted TPC region"
86 };
87 
90 
91 //____________________________________________________________________
92 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) :
93  AliAnalysisCuts(name,title),
94  fCutMinNClusterTPC(0),
95  fCutMinNClusterITS(0),
96  fCutMinNCrossedRowsTPC(0),
97  fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
98  f1CutMinNClustersTPCPtDep(0x0),
99  fCutMaxPtDepNClustersTPC(0),
100  fCutMinLengthActiveVolumeTPC(0),
101  fDeadZoneWidth(0), // width of the TPC dead zone (missing pads + PRF +ExB)
102  fCutGeoNcrNclLength(0), // cut on the geometical length condition Ngeom(cm)>cutGeoNcrNclLength default=130
103  fCutGeoNcrNclGeom1Pt(0), // 1/pt dependence slope cutGeoNcrNclLength:=fCutGeoNcrNclLength-abs(1/pt)^fCutGeoNcrNclGeom1Pt
104  fCutGeoNcrNclFractionNcr(0), // relative fraction cut Ncr condition Ncr>cutGeoNcrNclFractionNcr*fCutGeoNcrNclLength
105  fCutGeoNcrNclFractionNcl(0), // relative fraction cut Ncr condition Ncl>cutGeoNcrNclFractionNcl
106  fCutOutDistortedRegionTPC(kFALSE), // flag if distorted TPC regions should be cut out
107  fCutMaxChi2PerClusterTPC(0),
108  fCutMaxChi2PerClusterITS(0),
109  fCutMaxChi2TPCConstrainedVsGlobal(0),
110  fCutMaxChi2TPCConstrainedVsGlobalVertexType(kVertexTracks | kVertexSPD),
111  fCutMaxMissingITSPoints(0),
112  fCutMaxC11(0),
113  fCutMaxC22(0),
114  fCutMaxC33(0),
115  fCutMaxC44(0),
116  fCutMaxC55(0),
117  fCutMaxRel1PtUncertainty(0),
118  fCutAcceptKinkDaughters(0),
119  fCutAcceptSharedTPCClusters(0),
120  fCutMaxFractionSharedTPCClusters(0),
121  fCutRequireTPCRefit(0),
122  fCutRequireTPCStandAlone(0),
123  fCutRequireITSRefit(0),
124  fCutRequireITSPid(0),
125  fCutRequireITSStandAlone(0),
126  fCutRequireITSpureSA(0),
127  fCutNsigmaToVertex(0),
128  fCutSigmaToVertexRequired(0),
129  fCutMaxDCAToVertexXY(0),
130  fCutMaxDCAToVertexZ(0),
131  fCutMinDCAToVertexXY(0),
132  fCutMinDCAToVertexZ(0),
133  fCutMaxDCAToVertexXYPtDep(""),
134  fCutMaxDCAToVertexZPtDep(""),
135  fCutMinDCAToVertexXYPtDep(""),
136  fCutMinDCAToVertexZPtDep(""),
137  f1CutMaxDCAToVertexXYPtDep(0x0),
138  f1CutMaxDCAToVertexZPtDep(0x0),
139  f1CutMinDCAToVertexXYPtDep(0x0),
140  f1CutMinDCAToVertexZPtDep(0x0),
141  fCutDCAToVertex2D(0),
142  fPMin(0),
143  fPMax(0),
144  fPtMin(0),
145  fPtMax(0),
146  fPxMin(0),
147  fPxMax(0),
148  fPyMin(0),
149  fPyMax(0),
150  fPzMin(0),
151  fPzMax(0),
152  fEtaMin(0),
153  fEtaMax(0),
154  fRapMin(0),
155  fRapMax(0),
156  fCutRequireTOFout(kFALSE),
157  fFlagCutTOFdistance(kFALSE),
158  fCutTOFdistance(3.),
159  fHistogramsOn(0),
160  ffDTheoretical(0),
161  fhCutStatistics(0),
162  fhCutCorrelation(0)
163 {
165 
166  Init();
167 
168  //##############################################################################
169  // setting default cuts
184  SetRequireITSPid(kFALSE);
185  SetRequireITSStandAlone(kFALSE);
196  SetPRange();
197  SetPtRange();
198  SetPxRange();
199  SetPyRange();
200  SetPzRange();
201  SetEtaRange();
202  SetRapRange();
206 
207  SetHistogramsOn();
208 }
209 
210 //_____________________________________________________________________________
212  AliAnalysisCuts(c),
220  fDeadZoneWidth(0), // width of the TPC dead zone (missing pads + PRF +ExB)
221  fCutGeoNcrNclLength(0), // cut on the geometical length condition Ngeom(cm)>cutGeoNcrNclLength default=130
222  fCutGeoNcrNclGeom1Pt(0), // 1/pt dependence slope cutGeoNcrNclLength:=fCutGeoNcrNclLength-abs(1/pt)^fCutGeoNcrNclGeom1Pt
223  fCutGeoNcrNclFractionNcr(0), // relative fraction cut Ncr condition Ncr>cutGeoNcrNclFractionNcr*fCutGeoNcrNclLength
224  fCutGeoNcrNclFractionNcl(0), // relative fraction cut Ncr condition Ncl>cutGeoNcrNclFractionNcl
226  //
232  fCutMaxC11(0),
233  fCutMaxC22(0),
234  fCutMaxC33(0),
235  fCutMaxC44(0),
236  fCutMaxC55(0),
262  fPMin(0),
263  fPMax(0),
264  fPtMin(0),
265  fPtMax(0),
266  fPxMin(0),
267  fPxMax(0),
268  fPyMin(0),
269  fPyMax(0),
270  fPzMin(0),
271  fPzMax(0),
272  fEtaMin(0),
273  fEtaMax(0),
274  fRapMin(0),
275  fRapMax(0),
276  fCutRequireTOFout(kFALSE),
277  fFlagCutTOFdistance(kFALSE),
278  fCutTOFdistance(3.),
279  fHistogramsOn(0),
280  ffDTheoretical(0),
281  fhCutStatistics(0),
283 {
285 
286  ((AliESDtrackCuts &) c).Copy(*this);
287 }
288 
290 {
292 
293  for (Int_t i=0; i<2; i++) {
294 
295  if (fhNClustersITS[i])
296  delete fhNClustersITS[i];
297  if (fhNClustersTPC[i])
298  delete fhNClustersTPC[i];
299  if (fhNSharedClustersTPC[i])
300  delete fhNSharedClustersTPC[i];
301  if (fhNCrossedRowsTPC[i])
302  delete fhNCrossedRowsTPC[i];
305  if (fhChi2PerClusterITS[i])
306  delete fhChi2PerClusterITS[i];
307  if (fhChi2PerClusterTPC[i])
308  delete fhChi2PerClusterTPC[i];
311  if(fhNClustersForITSPID[i])
312  delete fhNClustersForITSPID[i];
313  if(fhNMissingITSPoints[i])
314  delete fhNMissingITSPoints[i];
315  if (fhC11[i])
316  delete fhC11[i];
317  if (fhC22[i])
318  delete fhC22[i];
319  if (fhC33[i])
320  delete fhC33[i];
321  if (fhC44[i])
322  delete fhC44[i];
323  if (fhC55[i])
324  delete fhC55[i];
325 
326  if (fhRel1PtUncertainty[i])
327  delete fhRel1PtUncertainty[i];
328 
329  if (fhDXY[i])
330  delete fhDXY[i];
331  if (fhDZ[i])
332  delete fhDZ[i];
333  if (fhDXYDZ[i])
334  delete fhDXYDZ[i];
335  if (fhDXYvsDZ[i])
336  delete fhDXYvsDZ[i];
337 
338  if (fhDXYNormalized[i])
339  delete fhDXYNormalized[i];
340  if (fhDZNormalized[i])
341  delete fhDZNormalized[i];
342  if (fhDXYvsDZNormalized[i])
343  delete fhDXYvsDZNormalized[i];
344  if (fhNSigmaToVertex[i])
345  delete fhNSigmaToVertex[i];
346  if (fhPt[i])
347  delete fhPt[i];
348  if (fhEta[i])
349  delete fhEta[i];
350  if (fhTOFdistance[i])
351  delete fhTOFdistance[i];
352  }
353 
362 
363 
364  if (ffDTheoretical)
365  delete ffDTheoretical;
366 
367  if (fhCutStatistics)
368  delete fhCutStatistics;
369  if (fhCutCorrelation)
370  delete fhCutCorrelation;
371 
374 
375 }
376 
378 {
380 
381  fCutMinNClusterTPC = 0;
382  fCutMinNClusterITS = 0;
383 
389 
390  for (Int_t i = 0; i < 3; i++)
392 
393  fCutMaxC11 = 0;
394  fCutMaxC22 = 0;
395  fCutMaxC33 = 0;
396  fCutMaxC44 = 0;
397  fCutMaxC55 = 0;
398 
400 
407  fCutRequireITSPid = 0;
410 
411  fCutNsigmaToVertex = 0;
415  fCutDCAToVertex2D = 0;
422 
433 
434 
435  fPMin = 0;
436  fPMax = 0;
437  fPtMin = 0;
438  fPtMax = 0;
439  fPxMin = 0;
440  fPxMax = 0;
441  fPyMin = 0;
442  fPyMax = 0;
443  fPzMin = 0;
444  fPzMax = 0;
445  fEtaMin = 0;
446  fEtaMax = 0;
447  fRapMin = 0;
448  fRapMax = 0;
449 
450  fHistogramsOn = kFALSE;
451 
452  for (Int_t i=0; i<2; ++i)
453  {
454  fhNClustersITS[i] = 0;
455  fhNClustersTPC[i] = 0;
456  fhNSharedClustersTPC[i] = 0;
457  fhNCrossedRowsTPC[i] = 0;
459 
460  fhChi2PerClusterITS[i] = 0;
461  fhChi2PerClusterTPC[i] = 0;
463  fhNClustersForITSPID[i] = 0;
464  fhNMissingITSPoints[i] = 0;
465 
466  fhC11[i] = 0;
467  fhC22[i] = 0;
468  fhC33[i] = 0;
469  fhC44[i] = 0;
470  fhC55[i] = 0;
471 
472  fhRel1PtUncertainty[i] = 0;
473 
474  fhDXY[i] = 0;
475  fhDZ[i] = 0;
476  fhDXYDZ[i] = 0;
477  fhDXYvsDZ[i] = 0;
478 
479  fhDXYNormalized[i] = 0;
480  fhDZNormalized[i] = 0;
481  fhDXYvsDZNormalized[i] = 0;
482  fhNSigmaToVertex[i] = 0;
483 
484  fhPt[i] = 0;
485  fhEta[i] = 0;
486  fhTOFdistance[i] = 0;
487  }
488  ffDTheoretical = 0;
489 
490  fhCutStatistics = 0;
491  fhCutCorrelation = 0;
492 }
493 
494 //_____________________________________________________________________________
496 {
498 
499  if (this != &c) ((AliESDtrackCuts &) c).Copy(*this);
500  return *this;
501 }
502 
503 //_____________________________________________________________________________
504 void AliESDtrackCuts::Copy(TObject &c) const
505 {
507 
508  AliESDtrackCuts& target = (AliESDtrackCuts &) c;
509 
510  target.Init();
511 
517  target.f1CutMinNClustersTPCPtDep = (TFormula*) f1CutMinNClustersTPCPtDep->Clone("f1CutMinNClustersTPCPtDep");
518  }
521  target.fDeadZoneWidth=fDeadZoneWidth; // width of the TPC dead zone (missing pads + PRF +ExB)
522  target.fCutGeoNcrNclLength=fCutGeoNcrNclLength; // cut on the geometical length condition Ngeom(cm)>cutGeoNcrNclLength default=130
523  target.fCutGeoNcrNclGeom1Pt=fCutGeoNcrNclGeom1Pt; // 1/pt dependence slope cutGeoNcrNclLength:=fCutGeoNcrNclLength-abs(1/pt)^fCutGeoNcrNclGeom1Pt
524  target.fCutGeoNcrNclFractionNcr=fCutGeoNcrNclFractionNcr; // relative fraction cut Ncr condition Ncr>cutGeoNcrNclFractionNcr*fCutGeoNcrNclLength
525  target.fCutGeoNcrNclFractionNcl=fCutGeoNcrNclFractionNcl; // relative fraction cut Ncr condition Ncl>cutGeoNcrNclFractionNcl
527 
528 
534 
535  for (Int_t i = 0; i < 3; i++)
537 
538  target.fCutMaxC11 = fCutMaxC11;
539  target.fCutMaxC22 = fCutMaxC22;
540  target.fCutMaxC33 = fCutMaxC33;
541  target.fCutMaxC44 = fCutMaxC44;
542  target.fCutMaxC55 = fCutMaxC55;
543 
545 
555 
563 
566 
569 
572 
575 
576  target.fPMin = fPMin;
577  target.fPMax = fPMax;
578  target.fPtMin = fPtMin;
579  target.fPtMax = fPtMax;
580  target.fPxMin = fPxMin;
581  target.fPxMax = fPxMax;
582  target.fPyMin = fPyMin;
583  target.fPyMax = fPyMax;
584  target.fPzMin = fPzMin;
585  target.fPzMax = fPzMax;
586  target.fEtaMin = fEtaMin;
587  target.fEtaMax = fEtaMax;
588  target.fRapMin = fRapMin;
589  target.fRapMax = fRapMax;
590 
594 
595  target.fHistogramsOn = fHistogramsOn;
596 
597  for (Int_t i=0; i<2; ++i)
598  {
599  if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
600  if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
601  if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
602  if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
604 
605  if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
606  if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
608  if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
609  if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
610 
611  if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
612  if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
613  if (fhC33[i]) target.fhC33[i] = (TH1F*) fhC33[i]->Clone();
614  if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
615  if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
616 
617  if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
618 
619  if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
620  if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
621  if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
622  if (fhDXYvsDZ[i]) target.fhDXYvsDZ[i] = (TH2F*) fhDXYvsDZ[i]->Clone();
623 
624  if (fhDXYNormalized[i]) target.fhDXYNormalized[i] = (TH1F*) fhDXYNormalized[i]->Clone();
625  if (fhDZNormalized[i]) target.fhDZNormalized[i] = (TH1F*) fhDZNormalized[i]->Clone();
626  if (fhDXYvsDZNormalized[i]) target.fhDXYvsDZNormalized[i] = (TH2F*) fhDXYvsDZNormalized[i]->Clone();
627  if (fhNSigmaToVertex[i]) target.fhNSigmaToVertex[i] = (TH1F*) fhNSigmaToVertex[i]->Clone();
628 
629  if (fhPt[i]) target.fhPt[i] = (TH1F*) fhPt[i]->Clone();
630  if (fhEta[i]) target.fhEta[i] = (TH1F*) fhEta[i]->Clone();
631  if (fhTOFdistance[i]) target.fhTOFdistance[i] = (TH2F*) fhTOFdistance[i]->Clone();
632  }
633  if (ffDTheoretical) target.ffDTheoretical = (TF1*) ffDTheoretical->Clone();
634 
635  if (fhCutStatistics) target.fhCutStatistics = (TH1F*) fhCutStatistics->Clone();
636  if (fhCutCorrelation) target.fhCutCorrelation = (TH2F*) fhCutCorrelation->Clone();
637 
638  TNamed::Copy(c);
639 }
640 
641 //_____________________________________________________________________________
642 Long64_t AliESDtrackCuts::Merge(TCollection* list) {
645 
646  if (!list)
647  return 0;
648  if (list->IsEmpty())
649  return 1;
650  if (!fHistogramsOn)
651  return 0;
652  TIterator* iter = list->MakeIterator();
653  TObject* obj;
654 
655  // collection of measured and generated histograms
656  Int_t count = 0;
657  while ((obj = iter->Next())) {
658 
659  AliESDtrackCuts* entry = dynamic_cast<AliESDtrackCuts*>(obj);
660  if (entry == 0)
661  continue;
662 
663  if (!entry->fHistogramsOn)
664  continue;
665 
666  for (Int_t i=0; i<2; i++) {
667 
668  fhNClustersITS[i] ->Add(entry->fhNClustersITS[i] );
669  fhNClustersTPC[i] ->Add(entry->fhNClustersTPC[i] );
670  if (fhNSharedClustersTPC[i])
671  fhNSharedClustersTPC[i] ->Add(entry->fhNSharedClustersTPC[i] );
672  if (fhNCrossedRowsTPC[i])
673  fhNCrossedRowsTPC[i] ->Add(entry->fhNCrossedRowsTPC[i] );
676 
677  fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]);
678  fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]);
681  if (fhNClustersForITSPID[i])
682  fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
683  if (fhNMissingITSPoints[i])
684  fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
685 
686  fhC11[i] ->Add(entry->fhC11[i] );
687  fhC22[i] ->Add(entry->fhC22[i] );
688  fhC33[i] ->Add(entry->fhC33[i] );
689  fhC44[i] ->Add(entry->fhC44[i] );
690  fhC55[i] ->Add(entry->fhC55[i] );
691 
692  fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
693 
694  fhDXY[i] ->Add(entry->fhDXY[i] );
695  fhDZ[i] ->Add(entry->fhDZ[i] );
696  fhDXYDZ[i] ->Add(entry->fhDXYDZ[i] );
697  fhDXYvsDZ[i] ->Add(entry->fhDXYvsDZ[i] );
698 
699  fhDXYNormalized[i] ->Add(entry->fhDXYNormalized[i] );
700  fhDZNormalized[i] ->Add(entry->fhDZNormalized[i] );
701  fhDXYvsDZNormalized[i] ->Add(entry->fhDXYvsDZNormalized[i]);
702  fhNSigmaToVertex[i] ->Add(entry->fhNSigmaToVertex[i]);
703 
704  fhPt[i] ->Add(entry->fhPt[i]);
705  fhEta[i] ->Add(entry->fhEta[i]);
706  fhTOFdistance[i] ->Add(entry->fhTOFdistance[i]);
707  }
708 
709  fhCutStatistics ->Add(entry->fhCutStatistics);
710  fhCutCorrelation ->Add(entry->fhCutCorrelation);
711 
712  count++;
713  }
714  return count+1;
715 }
716 
717 Bool_t AliESDtrackCuts::IsSelected(TObject *o) {
718  if(o->IsA() == AliESDtrack::Class()) return AcceptTrack(static_cast<AliESDtrack *>(o));
719  else if(o->InheritsFrom(AliVTrack::Class())) return AcceptVTrack(static_cast<AliVTrack *>(o));
720  return false; // Type unsupported - do not select the object;
721 }
722 
723 void AliESDtrackCuts::SetMinNClustersTPCPtDep(TFormula *f1, Float_t ptmax)
724 {
726 
727  if(f1){
729  f1CutMinNClustersTPCPtDep = (TFormula*)f1->Clone("f1CutMinNClustersTPCPtDep");
730  }
732 }
733 
734 void AliESDtrackCuts::SetCutGeoNcrNcl(Float_t deadZoneWidth,Float_t cutGeoNcrNclLength, Float_t cutGeoNcrNclGeom1Pt, Float_t cutGeoNcrNclFractionNcr, Float_t cutGeoNcrNclFractionNcl){
742 
743  fDeadZoneWidth=deadZoneWidth;
744  fCutGeoNcrNclLength=cutGeoNcrNclLength;
745  fCutGeoNcrNclGeom1Pt=cutGeoNcrNclGeom1Pt;
746  fCutGeoNcrNclFractionNcr=cutGeoNcrNclFractionNcr;
747  fCutGeoNcrNclFractionNcl=cutGeoNcrNclFractionNcl;
748 }
749 
750 
751 
752 
753 //____________________________________________________________________
755 {
757 
758  AliInfoClass("Creating track cuts for TPC-only.");
759 
760  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
761 
762  esdTrackCuts->SetMinNClustersTPC(50);
763  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
764  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
765 
766  esdTrackCuts->SetMaxDCAToVertexZ(3.2);
767  esdTrackCuts->SetMaxDCAToVertexXY(2.4);
768  esdTrackCuts->SetDCAToVertex2D(kTRUE);
769 
770  return esdTrackCuts;
771 }
772 
773 //____________________________________________________________________
775 {
777 
778  AliInfoClass("Creating track cuts for ITS+TPC (2009 definition).");
779 
780  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
781 
782  // TPC
783  esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
784  esdTrackCuts->SetMinNClustersTPC(70);
785  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
786  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
787  esdTrackCuts->SetRequireTPCRefit(kTRUE);
788  // ITS
789  esdTrackCuts->SetRequireITSRefit(kTRUE);
792  if(selPrimaries) {
793  // 7*(0.0050+0.0060/pt^0.9)
794  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
795  esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
796  }
797  esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
798  esdTrackCuts->SetDCAToVertex2D(kFALSE);
799  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
800  //esdTrackCuts->SetEtaRange(-0.8,+0.8);
801 
802  esdTrackCuts->SetMaxChi2PerClusterITS(36);
803 
804  return esdTrackCuts;
805 }
806 
807 //____________________________________________________________________
809 {
814 
815  AliInfoClass("Creating track cuts for ITS+TPC (2011 definition).");
816 
817  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
818 
819  // TPC
820  if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
821  else if (clusterCut == 1) {
822  esdTrackCuts->SetMinNCrossedRowsTPC(70);
824  }
825  else {
826  AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
827  esdTrackCuts->SetMinNClustersTPC(50);
828  }
829  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
830  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
831  esdTrackCuts->SetRequireTPCRefit(kTRUE);
832  // ITS
833  esdTrackCuts->SetRequireITSRefit(kTRUE);
836  if(selPrimaries) {
837  // 7*(0.0015+0.0050/pt^1.1)
838  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
839  esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
840  }
841  esdTrackCuts->SetMaxDCAToVertexZ(2);
842  esdTrackCuts->SetDCAToVertex2D(kFALSE);
843  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
844 
845  esdTrackCuts->SetMaxChi2PerClusterITS(36);
846 
847  return esdTrackCuts;
848 }
849 
850 //____________________________________________________________________
851 AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2015PbPb(Bool_t selPrimaries/*=kTRUE*/, Int_t clusterCut/*=1*/, Bool_t cutAcceptanceEdges/*=kTRUE*/, Bool_t removeDistortedRegions/*=kFALSE*/) {
856 
857  AliInfoClass("Creating track cuts for ITS+TPC (2015 Pb-Pb run definition).");
858  AliWarningClass("THIS TRACK-CUT SET HAS NOT YET BEEN VALIDATED AND IS NOT YET FROZEN. TO BE USED FOR TESTING PURPOSES ONLY.");
859  //
860  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
861 
862  // TPC
863  if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(50);
864  else if (clusterCut == 1) {
865  esdTrackCuts->SetMinNCrossedRowsTPC(70);
867  }
868  else {
869  AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
870  esdTrackCuts->SetMinNClustersTPC(50);
871  }
872  //
873  if (cutAcceptanceEdges) esdTrackCuts->SetCutGeoNcrNcl(2., 130., 1.5, 0.0, 0.0); // only dead zone and not clusters per length
874  if (removeDistortedRegions) esdTrackCuts->SetCutOutDistortedRegionsTPC(kTRUE);
875  //
876  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
877  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
878  esdTrackCuts->SetRequireTPCRefit(kTRUE);
879  // ITS
880  esdTrackCuts->SetRequireITSRefit(kTRUE);
883  if(selPrimaries) {
884  // 7*(0.0015+0.0050/pt^1.1)
885  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0105+0.0350/pt^1.1");
886  esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
887  }
888  esdTrackCuts->SetMaxDCAToVertexZ(2);
889  esdTrackCuts->SetDCAToVertex2D(kFALSE);
890  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
891 
892  esdTrackCuts->SetMaxChi2PerClusterITS(36);
893 
894  return esdTrackCuts;
895 
896 
897 }
898 
899 
900 //____________________________________________________________________
902 {
907 
908  AliInfoClass("Creating track cuts for ITS+TPC (2010 definition).");
909 
910  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
911 
912  // TPC
913  if(clusterCut == 0) esdTrackCuts->SetMinNClustersTPC(70);
914  else if (clusterCut == 1) {
915  esdTrackCuts->SetMinNCrossedRowsTPC(70);
917  }
918  else {
919  AliWarningClass(Form("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut));
920  esdTrackCuts->SetMinNClustersTPC(70);
921  }
922  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
923  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
924  esdTrackCuts->SetRequireTPCRefit(kTRUE);
925  // ITS
926  esdTrackCuts->SetRequireITSRefit(kTRUE);
929  if(selPrimaries) {
930  // 7*(0.0026+0.0050/pt^1.01)
931  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
932  esdTrackCuts->SetMaxChi2TPCConstrainedGlobal(36);
933  }
934  esdTrackCuts->SetMaxDCAToVertexZ(2);
935  esdTrackCuts->SetDCAToVertex2D(kFALSE);
936  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
937 
938  esdTrackCuts->SetMaxChi2PerClusterITS(36);
939 
940  return esdTrackCuts;
941 }
942 
943 //____________________________________________________________________
945 {
947 
948  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
949  esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
950  esdTrackCuts->SetRequireITSRefit(kTRUE);
951  esdTrackCuts->SetMinNClustersITS(4);
954  esdTrackCuts->SetMaxChi2PerClusterITS(1.);
955 
956  if(selPrimaries) {
957  // 7*(0.0085+0.0026/pt^1.55)
958  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
959  }
960  if(useForPid){
961  esdTrackCuts->SetRequireITSPid(kTRUE);
962  }
963  return esdTrackCuts;
964 }
965 
966 //____________________________________________________________________
968 {
970 
971  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
972  esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
973  esdTrackCuts->SetRequireITSRefit(kTRUE);
974  esdTrackCuts->SetMinNClustersITS(4);
977  esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
978 
979  if(selPrimaries) {
980  // 7*(0.0033+0.0045/pt^1.3)
981  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
982  }
983  if(useForPid){
984  esdTrackCuts->SetRequireITSPid(kTRUE);
985  }
986  return esdTrackCuts;
987 }
988 
989 //____________________________________________________________________
991 {
993 
994  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
995  esdTrackCuts->SetRequireITSStandAlone(kTRUE);
996  esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
997  esdTrackCuts->SetRequireITSRefit(kTRUE);
998  esdTrackCuts->SetMinNClustersITS(4);
1001  esdTrackCuts->SetMaxChi2PerClusterITS(1.);
1002 
1003  if(selPrimaries) {
1004  // 7*(0.0085+0.0026/pt^1.55)
1005  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
1006  }
1007  if(useForPid){
1008  esdTrackCuts->SetRequireITSPid(kTRUE);
1009  }
1010  return esdTrackCuts;
1011 }
1012 
1013 //____________________________________________________________________
1015 {
1017 
1018  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
1019  esdTrackCuts->SetRequireITSStandAlone(kTRUE);
1020  esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
1021  esdTrackCuts->SetRequireITSRefit(kTRUE);
1022  esdTrackCuts->SetMinNClustersITS(4);
1025  esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
1026 
1027  if(selPrimaries) {
1028  // 7*(0.0033+0.0045/pt^1.3)
1029  esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
1030  }
1031  if(useForPid){
1032  esdTrackCuts->SetRequireITSPid(kTRUE);
1033  }
1034  return esdTrackCuts;
1035 }
1036 
1037 //____________________________________________________________________
1039 {
1041 
1042  AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
1043  esdTrackCuts->SetMaxNOfMissingITSPoints(1);
1044 
1045  return esdTrackCuts;
1046 }
1047 //____________________________________________________________________
1048 
1050 {
1052 
1053  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
1054  esdTrackCuts->SetRequireTPCRefit(kTRUE);
1055  esdTrackCuts->SetMinNClustersTPC(70);
1056  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
1057  return esdTrackCuts;
1058 }
1059 
1060 //____________________________________________________________________
1069 
1070  if (!esdTrack->GetInnerParam()) return kFALSE; // non-tpc tracks are not affected
1071  //
1072  Double_t eta = esdTrack->Eta();
1073  Double_t phiIn = esdTrack->GetInnerParam()->Phi();
1074  //
1075  if (eta > 0) { // A-side
1076  if (1.32 < phiIn && phiIn < 1.48) return kTRUE;
1077  if (2.00 < phiIn && phiIn < 2.15) return kTRUE;
1078  if (3.07 < phiIn && phiIn < 3.21) return kTRUE;
1079  } else { // C-side
1080  if (0.40 < phiIn && phiIn < 0.86) return kTRUE;
1081  if (2.10 < phiIn && phiIn < 2.34) return kTRUE;
1082  if (3.90 < phiIn && phiIn < 4.32) return kTRUE;
1083  }
1084  //
1085  return kFALSE;
1086 }
1087 
1088 
1089 //____________________________________________________________________
1091 {
1097 
1098  if (!tpcOnly)
1099  {
1100  AliErrorClass("Not implemented for global tracks!");
1101  return -1;
1102  }
1103 
1104  static AliESDtrackCuts* esdTrackCuts = 0;
1105  if (!esdTrackCuts)
1106  {
1107  esdTrackCuts = GetStandardTPCOnlyTrackCuts();
1108  esdTrackCuts->SetEtaRange(-0.8, 0.8);
1109  esdTrackCuts->SetPtRange(0.15);
1110  }
1111 
1112  Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
1113 
1114  return nTracks;
1115 }
1116 
1117 //____________________________________________________________________
1118 Float_t AliESDtrackCuts::GetSigmaToVertex(const AliESDtrack* const esdTrack)
1119 {
1121 
1122  Float_t b[2];
1123  Float_t bRes[2];
1124  Float_t bCov[3];
1125  esdTrack->GetImpactParameters(b,bCov);
1126 
1127  if (bCov[0]<=0 || bCov[2]<=0) {
1128  AliDebugClass(1, "Estimated b resolution lower or equal zero!");
1129  bCov[0]=0; bCov[2]=0;
1130  }
1131  bRes[0] = TMath::Sqrt(bCov[0]);
1132  bRes[1] = TMath::Sqrt(bCov[2]);
1133 
1134  // -----------------------------------
1135  // How to get to a n-sigma cut?
1136  //
1137  // The accumulated statistics from 0 to d is
1138  //
1139  // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
1140  // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
1141  //
1142  // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
1143  // Can this be expressed in a different way?
1144 
1145  if (bRes[0] == 0 || bRes[1] ==0)
1146  return -1;
1147 
1148  Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
1149 
1150  // work around precision problem
1151  // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
1152  // 1e-15 corresponds to nsigma ~ 7.7
1153  if (TMath::Exp(-d * d / 2) < 1e-15)
1154  return 1000;
1155 
1156  Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
1157  return nSigma;
1158 }
1159 
1160 
1161 //____________________________________________________________________
1163 {
1167 
1168  Float_t b[2] = {0.,0.};
1169  Float_t bRes[2] = {0.,0.};
1170  Float_t bCov[3] = {0.,0.,0.};
1171  vTrack->GetImpactParameters(b,bCov);
1172 
1173  if (bCov[0]<=0 || bCov[2]<=0) {
1174  AliDebugClass(1, "Estimated b resolution lower or equal zero!");
1175  bCov[0]=0; bCov[2]=0;
1176  }
1177  bRes[0] = TMath::Sqrt(bCov[0]);
1178  bRes[1] = TMath::Sqrt(bCov[2]);
1179 
1180  // -----------------------------------
1181  // How to get to a n-sigma cut?
1182  //
1183  // The accumulated statistics from 0 to d is
1184  //
1185  // -> Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
1186  // -> 1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
1187  //
1188  // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
1189  // Can this be expressed in a different way?
1190 
1191  if (bRes[0] == 0 || bRes[1] ==0)
1192  return -1;
1193 
1194  Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
1195 
1196  // work around precision problem
1197  // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
1198  // 1e-15 corresponds to nsigma ~ 7.7
1199  if (TMath::Exp(-d * d / 2) < 1e-15)
1200  return 1000;
1201 
1202  Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
1203  return nSigma;
1204 }
1205 
1206 
1208 {
1210 
1211  tree->SetBranchStatus("fTracks.fFlags", 1);
1212  tree->SetBranchStatus("fTracks.fITSncls", 1);
1213  tree->SetBranchStatus("fTracks.fTPCncls", 1);
1214  tree->SetBranchStatus("fTracks.fITSchi2", 1);
1215  tree->SetBranchStatus("fTracks.fTPCchi2", 1);
1216  tree->SetBranchStatus("fTracks.fC*", 1);
1217  tree->SetBranchStatus("fTracks.fD", 1);
1218  tree->SetBranchStatus("fTracks.fZ", 1);
1219  tree->SetBranchStatus("fTracks.fCdd", 1);
1220  tree->SetBranchStatus("fTracks.fCdz", 1);
1221  tree->SetBranchStatus("fTracks.fCzz", 1);
1222  tree->SetBranchStatus("fTracks.fP*", 1);
1223  tree->SetBranchStatus("fTracks.fR*", 1);
1224  tree->SetBranchStatus("fTracks.fKinkIndexes*", 1);
1225 }
1226 
1227 //____________________________________________________________________
1229 {
1235 
1236  // this function needs the following branches:
1237  // fTracks.fFlags
1238  // fTracks.fITSncls
1239  // fTracks.fTPCncls
1240  // fTracks.fITSchi2
1241  // fTracks.fTPCchi2
1242  // fTracks.fC //GetExternalCovariance
1243  // fTracks.fD //GetImpactParameters
1244  // fTracks.fZ //GetImpactParameters
1245  // fTracks.fCdd //GetImpactParameters
1246  // fTracks.fCdz //GetImpactParameters
1247  // fTracks.fCzz //GetImpactParameters
1248  // fTracks.fP //GetPxPyPz
1249  // fTracks.fR //GetMass
1250  // fTracks.fP //GetMass
1251  // fTracks.fKinkIndexes
1252  //
1253  // esdEvent is only required for the MaxChi2TPCConstrainedVsGlobal
1254 
1255  ULong64_t status = esdTrack->GetStatus();
1256 
1257  // getting quality parameters from the ESD track
1258  Int_t nClustersITS = esdTrack->GetITSclusters(0);
1259  Int_t nClustersTPC = -1;
1261  nClustersTPC = esdTrack->GetTPCNclsIter1();
1262  }
1263  else {
1264  nClustersTPC = esdTrack->GetTPCclusters(0);
1265  }
1266 
1267  //Pt dependent NClusters Cut
1269  if(esdTrack->Pt()<fCutMaxPtDepNClustersTPC)
1270  fCutMinNClusterTPC = (Int_t)(f1CutMinNClustersTPCPtDep->Eval(esdTrack->Pt()));
1271  else
1273  }
1274 
1275  Float_t nCrossedRowsTPC = esdTrack->GetTPCCrossedRows();
1276  Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1277  if (esdTrack->GetTPCNclsF()>0) {
1278  ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
1279  }
1280 
1281  Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
1282  Float_t fracClustersTPCShared = -1.;
1283 
1284  Float_t chi2PerClusterITS = -1;
1285  Float_t chi2PerClusterTPC = -1;
1286  if (nClustersITS!=0)
1287  chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
1288  if (nClustersTPC!=0) {
1290  chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1291  } else {
1292  chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
1293  }
1294  fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1295  }
1296 
1297  Double_t extCov[15];
1298  esdTrack->GetExternalCovariance(extCov);
1299 
1300  Float_t b[2];
1301  Float_t bCov[3];
1302  esdTrack->GetImpactParameters(b,bCov);
1303  if (bCov[0]<=0 || bCov[2]<=0) {
1304  AliDebug(1, "Estimated b resolution lower or equal zero!");
1305  bCov[0]=0; bCov[2]=0;
1306  }
1307 
1308 
1309  // set pt-dependent DCA cuts, if requested
1310  SetPtDepDCACuts(esdTrack->Pt());
1311 
1312 
1313  Float_t dcaToVertexXY = b[0];
1314  Float_t dcaToVertexZ = b[1];
1315 
1316  Float_t dcaToVertex = -1;
1317 
1318  if (fCutDCAToVertex2D)
1319  {
1320  dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1321  }
1322  else
1323  dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1324 
1325  // getting the kinematic variables of the track
1326  // (assuming the mass is known)
1327  Double_t p[3];
1328  esdTrack->GetPxPyPz(p);
1329 
1330  // Changed from float to double to prevent rounding errors leading to negative
1331  // log arguments (M.G.)
1332  Double_t momentum = TMath::Sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
1333  Double_t pt = TMath::Sqrt(p[0]*p[0] + p[1]*p[1]);
1334  Double_t mass = esdTrack->GetMass();
1335  Double_t energy = TMath::Sqrt(mass*mass + momentum*momentum);
1336 
1337  //y-eta related calculations
1338  Float_t eta = -100.;
1339  Float_t y = -100.;
1340  if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1341  eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1342  if((energy != TMath::Abs(p[2]))&&(energy != 0))
1343  y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1344 
1345  if (extCov[14] < 0)
1346  {
1347  AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1348  return kFALSE;
1349  }
1350  Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1351 
1352  //########################################################################
1353  // cut the track?
1354 
1355  Bool_t cuts[kNCuts];
1356  for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1357 
1358  // track quality cuts
1359  if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1360  cuts[0]=kTRUE;
1361  if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1362  cuts[1]=kTRUE;
1363  if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1364  cuts[2]=kTRUE;
1365  if (nClustersTPC<fCutMinNClusterTPC)
1366  cuts[3]=kTRUE;
1367  if (nClustersITS<fCutMinNClusterITS)
1368  cuts[4]=kTRUE;
1369  if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1370  cuts[5]=kTRUE;
1371  if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1372  cuts[6]=kTRUE;
1373  if (extCov[0] > fCutMaxC11)
1374  cuts[7]=kTRUE;
1375  if (extCov[2] > fCutMaxC22)
1376  cuts[8]=kTRUE;
1377  if (extCov[5] > fCutMaxC33)
1378  cuts[9]=kTRUE;
1379  if (extCov[9] > fCutMaxC44)
1380  cuts[10]=kTRUE;
1381  if (extCov[14] > fCutMaxC55)
1382  cuts[11]=kTRUE;
1383 
1384  // cut 12 and 13 see below
1385 
1386  if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
1387  cuts[14]=kTRUE;
1388  // track kinematics cut
1389  if((momentum < fPMin) || (momentum > fPMax))
1390  cuts[15]=kTRUE;
1391  if((pt < fPtMin) || (pt > fPtMax))
1392  cuts[16] = kTRUE;
1393  if((p[0] < fPxMin) || (p[0] > fPxMax))
1394  cuts[17] = kTRUE;
1395  if((p[1] < fPyMin) || (p[1] > fPyMax))
1396  cuts[18] = kTRUE;
1397  if((p[2] < fPzMin) || (p[2] > fPzMax))
1398  cuts[19] = kTRUE;
1399  if((eta < fEtaMin) || (eta > fEtaMax))
1400  cuts[20] = kTRUE;
1401  if((y < fRapMin) || (y > fRapMax))
1402  cuts[21] = kTRUE;
1403  if (fCutDCAToVertex2D && dcaToVertex > 1)
1404  cuts[22] = kTRUE;
1405  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1406  cuts[23] = kTRUE;
1407  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1408  cuts[24] = kTRUE;
1409  if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1410  cuts[25] = kTRUE;
1411  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1412  cuts[26] = kTRUE;
1413  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1414  cuts[27] = kTRUE;
1415 
1416  for (Int_t i = 0; i < 3; i++) {
1417  if(!(esdTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
1418  cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
1419  } else { // upgraded ITS (7 layers)
1420  // at the moment, for L012 the layers 12 are considered together
1421  if(i==0) { // L012
1422  cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(0), (esdTrack->HasPointOnITSLayer(1))&(esdTrack->HasPointOnITSLayer(2)));
1423  } else { // L34 or L56
1424  cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2+1), esdTrack->HasPointOnITSLayer(i*2+2));
1425  }
1426  }
1427  }
1428 
1430  if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1431  // TPC tracks
1432  cuts[31] = kTRUE;
1433  }else{
1434  // ITS standalone tracks
1436  if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1437  }else if(fCutRequireITSpureSA){
1438  if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1439  }
1440  }
1441  }
1442 
1443  if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1444  cuts[32] = kTRUE;
1445 
1446  if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1447  cuts[33] = kTRUE;
1448 
1449  if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1450  cuts[34] = kTRUE;
1451 
1452  Int_t nITSPointsForPid=0;
1453  UChar_t clumap=esdTrack->GetITSClusterMap();
1454  for(Int_t i=2; i<6; i++){
1455  if(clumap&(1<<i)) ++nITSPointsForPid;
1456  }
1457  if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1458 
1459 
1460  if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1461  cuts[36]=kTRUE;
1462  if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1463  cuts[37]=kTRUE;
1464 
1465  Int_t nMissITSpts=0;
1466  Int_t idet,statusLay;
1467  Float_t xloc,zloc;
1468  for(Int_t iLay=0; iLay<6; iLay++){
1469  Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1470  if(retc && statusLay==5) ++nMissITSpts;
1471  }
1472  if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1473 
1474  //kTOFout
1475  if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
1476  cuts[40]=kTRUE;
1477 
1478  // TOF signal Dz cut
1479  Float_t dxTOF = 999.; //esdTrack->GetTOFsignalDx();
1480  Float_t dzTOF = 999.; //esdTrack->GetTOFsignalDz();
1481  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
1482  dxTOF = esdTrack->GetTOFsignalDx();
1483  dzTOF = esdTrack->GetTOFsignalDz();
1484  if (fgBeamTypeFlag < 0) { // the check on the beam type was not done yet
1485  const AliESDEvent* event = esdTrack->GetESDEvent();
1486  if (event){
1487  TString beamTypeESD = event->GetBeamType();
1488  AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
1489  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
1490  fgBeamTypeFlag = 1;
1491  }
1492  else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
1493  fgBeamTypeFlag = 0;
1494  }
1495  }
1496  else{
1497  AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
1498  }
1499  }
1500 
1501  if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
1502  Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
1503  AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
1504  if (radiusTOF > fCutTOFdistance){
1505  AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
1506  cuts[41] = kTRUE;
1507  }
1508  }
1509  }
1510 
1511  Bool_t cut=kFALSE;
1512  for (Int_t i=0; i<kNCuts; i++)
1513  if (cuts[i]) {cut = kTRUE;}
1514 
1515  // for performance evaluate the CPU intensive cuts only when the others have passed, and when they are requested
1516  Double_t chi2TPCConstrainedVsGlobal = -2;
1517  Float_t nSigmaToVertex = -2;
1518  if (!cut)
1519  {
1520  // getting the track to vertex parameters
1522  {
1523  nSigmaToVertex = GetSigmaToVertex(esdTrack);
1524  if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
1525  {
1526  cuts[12] = kTRUE;
1527  cut = kTRUE;
1528  }
1529  // if n sigma could not be calculated
1530  if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
1531  {
1532  cuts[13] = kTRUE;
1533  cut = kTRUE;
1534  }
1535  }
1536 
1537  // max chi2 TPC constrained vs global track only if track passed the other cut
1539  {
1540  const AliESDEvent* esdEvent = esdTrack->GetESDEvent();
1541 
1542  if (!esdEvent)
1543  AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
1544 
1545  // get vertex
1546  const AliESDVertex* vertex = 0;
1548  vertex = esdEvent->GetPrimaryVertexTracks();
1549 
1550  if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexSPD)
1551  vertex = esdEvent->GetPrimaryVertexSPD();
1552 
1553  if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTPC)
1554  vertex = esdEvent->GetPrimaryVertexTPC();
1555 
1556  if (vertex->GetStatus())
1557  chi2TPCConstrainedVsGlobal = esdTrack->GetChi2TPCConstrainedVsGlobal(vertex);
1558 
1559  if (chi2TPCConstrainedVsGlobal < 0 || chi2TPCConstrainedVsGlobal > fCutMaxChi2TPCConstrainedVsGlobal)
1560  {
1561  cuts[39] = kTRUE;
1562  cut = kTRUE;
1563  }
1564  }
1565 
1566  // max length in active volume
1567  Float_t lengthInActiveZoneTPC = -1;
1568  if (fCutMinLengthActiveVolumeTPC > 1. || fCutGeoNcrNclLength>0) { // do the calculation only if needed to save cpu-time
1569  if (esdTrack->GetESDEvent()) {
1570  //
1571  const Double_t kMaxZ=220;
1572  if (esdTrack->GetInnerParam()) lengthInActiveZoneTPC = esdTrack->GetLengthInActiveZone(1, fDeadZoneWidth, kMaxZ, esdTrack->GetESDEvent()->GetMagneticField());
1573  //
1574  if (lengthInActiveZoneTPC < fCutMinLengthActiveVolumeTPC ) {
1575  cuts[42] = kTRUE;
1576  cut = kTRUE;
1577  }
1578  if (fCutGeoNcrNclLength>0){
1579  Double_t cutGeoNcrNclLength=fCutGeoNcrNclLength-TMath::Power(TMath::Abs(esdTrack->GetSigned1Pt()),fCutGeoNcrNclGeom1Pt);
1580  Bool_t isOK=kTRUE;
1581  if (lengthInActiveZoneTPC<cutGeoNcrNclLength) isOK=kFALSE;
1582  if (nCrossedRowsTPC<fCutGeoNcrNclFractionNcr*cutGeoNcrNclLength) isOK=kFALSE;
1583  if (esdTrack->GetTPCncls()<fCutGeoNcrNclFractionNcl*cutGeoNcrNclLength) isOK=kFALSE;
1584 
1585  if(!isOK) {
1586  cuts[43] = kTRUE;
1587  cut = kTRUE;
1588  }
1589  }
1590  }
1591  }
1592 
1593  // track in distorted TPC region
1595  if (IsTrackInDistortedTpcRegion(esdTrack)) {
1596  cuts[44] = kTRUE;
1597  cut = kTRUE;
1598  }
1599  }
1600  }
1601 
1602 
1603  //########################################################################
1604  // filling histograms
1605  if (fHistogramsOn) {
1606  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
1607  if (cut)
1608  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
1609 
1610  for (Int_t i=0; i<kNCuts; i++) {
1611  if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
1612  AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
1613 
1614  if (cuts[i])
1615  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
1616 
1617  for (Int_t j=i; j<kNCuts; j++) {
1618  if (cuts[i] && cuts[j]) {
1619  Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
1620  Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
1621  fhCutCorrelation->Fill(xC, yC);
1622  }
1623  }
1624  }
1625  }
1626 
1627  // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
1628  // the code is not in a function due to too many local variables that would need to be passed
1629 
1630  for (Int_t id = 0; id < 2; id++)
1631  {
1632  // id = 0 --> before cut
1633  // id = 1 --> after cut
1634 
1635  if (fHistogramsOn)
1636  {
1637  fhNClustersITS[id]->Fill(nClustersITS);
1638  fhNClustersTPC[id]->Fill(nClustersTPC);
1639  fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
1640  fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
1641  fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
1642  fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
1643  fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
1644  fhChi2TPCConstrainedVsGlobal[id]->Fill(chi2TPCConstrainedVsGlobal);
1645  fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
1646  fhNMissingITSPoints[id]->Fill(nMissITSpts);
1647 
1648  fhC11[id]->Fill(extCov[0]);
1649  fhC22[id]->Fill(extCov[2]);
1650  fhC33[id]->Fill(extCov[5]);
1651  fhC44[id]->Fill(extCov[9]);
1652  fhC55[id]->Fill(extCov[14]);
1653 
1654  fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
1655 
1656  fhPt[id]->Fill(pt);
1657  fhEta[id]->Fill(eta);
1658  fhTOFdistance[id]->Fill(dxTOF, dzTOF);
1659 
1660  Float_t bRes[2];
1661  bRes[0] = TMath::Sqrt(bCov[0]);
1662  bRes[1] = TMath::Sqrt(bCov[2]);
1663 
1664  fhDZ[id]->Fill(b[1]);
1665  fhDXY[id]->Fill(b[0]);
1666  fhDXYDZ[id]->Fill(dcaToVertex);
1667  fhDXYvsDZ[id]->Fill(b[1],b[0]);
1668 
1669  if (bRes[0]!=0 && bRes[1]!=0) {
1670  fhDZNormalized[id]->Fill(b[1]/bRes[1]);
1671  fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
1672  fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
1673  fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
1674  }
1675  }
1676 
1677  // cut the track
1678  if (cut)
1679  return kFALSE;
1680  }
1681 
1682  return kTRUE;
1683 }
1684 
1685 //____________________________________________________________________
1687 {
1700 
1701  // this function needs the following branches:
1702  // fTracks.fFlags
1703  // fTracks.fITSncls
1704  // fTracks.fTPCncls
1705  // fTracks.fITSchi2
1706  // fTracks.fTPCchi2
1707  // fTracks.fC //GetExternalCovariance
1708  // fTracks.fD //GetImpactParameters
1709  // fTracks.fZ //GetImpactParameters
1710  // fTracks.fCdd //GetImpactParameters
1711  // fTracks.fCdz //GetImpactParameters
1712  // fTracks.fCzz //GetImpactParameters
1713  // fTracks.fP //GetPxPyPz
1714  // fTracks.fR //GetMass
1715  // fTracks.fP //GetMass
1716  // fTracks.fKinkIndexes
1717  //
1718  // esdEvent is only required for the MaxChi2TPCConstrainedVsGlobal
1719 
1720  //Check if the track is an AliESDtrack. If so, pass it to
1721  //AcceptTrack() to use the full set of cuts
1722  if(const AliESDtrack *esdTrack = dynamic_cast<const AliESDtrack*>(vTrack)){
1723  return AcceptTrack(esdTrack);
1724  }
1725 
1726  //Check if the track is an AliAODtrack.
1727  // If so, convert it to ESD track and pass it to AcceptTrack()
1728  // to use the full set of cuts
1729  if(vTrack->IsA() == AliAODTrack::Class()){
1730  const AliAODTrack *aodTrack = dynamic_cast<const AliAODTrack*>(vTrack);
1731  // apply cut on kink daughters
1732  // (kink information not preserved in the conversion from AOD to ESD)
1734  AliAODVertex* av=aodTrack->GetProdVertex();
1735  if(av && av->GetType()==AliAODVertex::kKink) return kFALSE;
1736  }
1737  // golden chi2 cut applied on the value stored in the AOD track
1739  Double_t goldenchi2=aodTrack->GetChi2TPCConstrainedVsGlobal();
1740  if(goldenchi2>fCutMaxChi2TPCConstrainedVsGlobal) return kFALSE;
1741  }
1742 
1743  AliESDtrack esdTrack(aodTrack);
1744  // settings needed for the geometrical cut
1745  esdTrack.SetESDEvent((AliESDEvent*)aodTrack->GetEvent());
1747  etp.CopyFromVTrack(aodTrack);
1748  esdTrack.ResetTrackParamIp(&etp);
1749  // disable gloden chi2 cut
1750  Float_t cachedCut=fCutMaxChi2TPCConstrainedVsGlobal;
1752 
1753  Bool_t accept=AcceptTrack(&esdTrack);
1754 
1755  // re-enable gloden chi2 cut
1757  return accept;
1758  }
1759 
1760 
1761 
1762  //The track is not an AliESDtrack. Perform a more limited
1763  //set of cuts
1764 
1765  ULong64_t status = vTrack->GetStatus();
1766 
1767  // getting quality parameters from the ESD track
1768  // Int_t nClustersITS = vTrack->GetITSclusters(0);
1769  Int_t nClustersITS = vTrack->GetNumberOfITSClusters();
1770  // Int_t nClustersTPC = -1;
1771  // if(fCutRequireTPCStandAlone) {
1772  // nClustersTPC = vTrack->GetTPCNclsIter1();
1773  // }
1774  // else {
1775  // nClustersTPC = vTrack->GetTPCclusters(0);
1776  // }
1777  Int_t nClustersTPC = vTrack->GetTPCNcls();
1778 
1779  //Pt dependent NClusters Cut
1781  if(vTrack->Pt()<fCutMaxPtDepNClustersTPC)
1782  fCutMinNClusterTPC = (Int_t)(f1CutMinNClustersTPCPtDep->Eval(vTrack->Pt()));
1783  else
1785  }
1786 
1787  Float_t nCrossedRowsTPC = vTrack->GetTPCCrossedRows();
1788  Float_t ratioCrossedRowsOverFindableClustersTPC = 1.0;
1789  // if (vTrack->GetTPCNclsF()>0) {
1790  // ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / vTrack->GetTPCNclsF();
1791  // }
1792 
1793  // Int_t nClustersTPCShared = vTrack->GetTPCnclsS();
1794  Int_t nClustersTPCShared = -1;
1795 
1796  // Float_t fracClustersTPCShared = -1.;
1797 
1798  Float_t chi2PerClusterITS = -1;
1799  Float_t chi2PerClusterTPC = -1;
1800  // if (nClustersITS!=0)
1801  // chi2PerClusterITS = vTrack->GetITSchi2()/Float_t(nClustersITS);
1802  // if (nClustersTPC!=0) {
1803  // if(fCutRequireTPCStandAlone) {
1804  // chi2PerClusterTPC = vTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
1805  // } else {
1806  // chi2PerClusterTPC = vTrack->GetTPCchi2()/Float_t(nClustersTPC);
1807  // }
1808  // // fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
1809  // }
1810 
1811  Double_t extCov[15];
1812  for(int i=0; i<15; i++) extCov[i]=0.;
1813  // vTrack->GetExternalCovariance(extCov);
1814 
1815  Float_t b[2];
1816  Float_t bCov[3];
1817  vTrack->GetImpactParameters(b,bCov);
1818  if (bCov[0]<=0 || bCov[2]<=0) {
1819  AliDebug(1, "Estimated b resolution lower or equal zero!");
1820  bCov[0]=0; bCov[2]=0;
1821  }
1822 
1823 
1824  // set pt-dependent DCA cuts, if requested
1825  SetPtDepDCACuts(vTrack->Pt());
1826 
1827 
1828  Float_t dcaToVertexXY = b[0];
1829  Float_t dcaToVertexZ = b[1];
1830 
1831  Float_t dcaToVertex = -1;
1832 
1833  if (fCutDCAToVertex2D)
1834  {
1835  dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
1836  }
1837  else
1838  dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
1839 
1840  // getting the kinematic variables of the track
1841  // (assuming the mass is known)
1842  Double_t p[3];
1843  // vTrack->GetPxPyPz(p);
1844  vTrack->PxPyPz(p);
1845 
1846  // Changed from float to double to prevent rounding errors leading to negative
1847  // log arguments (M.G.)
1848  Double_t momentum = TMath::Sqrt(p[0]*p[0] + p[1]*p[1] + p[2]*p[2]);
1849  Double_t pt = TMath::Sqrt(p[0]*p[0] + p[1]*p[1]);
1850  // Double_t mass = vTrack->GetMass();
1851  // Double_t energy = TMath::Sqrt(mass*mass + momentum*momentum);
1852 
1853  //y-eta related calculations
1854  // Float_t eta = -100.;
1855  // Float_t y = -100.;
1856  // if((momentum != TMath::Abs(p[2]))&&(momentum != 0))
1857  // eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
1858  // if((energy != TMath::Abs(p[2]))&&(energy != 0))
1859  // y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
1860  Float_t eta = vTrack->Eta();
1861  Float_t y = vTrack->Y();
1862 
1863  // if (extCov[14] < 0)
1864  // {
1865  // AliWarning(Form("GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]));
1866  // return kFALSE;
1867  // }
1868  Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
1869 
1870  //########################################################################
1871  // cut the track?
1872 
1873  Bool_t cuts[kNCuts];
1874  for (Int_t i=0; i<kNCuts; i++) cuts[i]=kFALSE;
1875 
1876  // track quality cuts
1877  if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
1878  cuts[0]=kTRUE;
1879  // if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
1880  // cuts[1]=kTRUE;
1881  if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
1882  cuts[2]=kTRUE;
1883  if (nClustersTPC<fCutMinNClusterTPC)
1884  cuts[3]=kTRUE;
1885  if (nClustersITS<fCutMinNClusterITS)
1886  cuts[4]=kTRUE;
1887  // if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC)
1888  // cuts[5]=kTRUE;
1889  // if (chi2PerClusterITS>fCutMaxChi2PerClusterITS)
1890  // cuts[6]=kTRUE;
1891  // if (extCov[0] > fCutMaxC11)
1892  // cuts[7]=kTRUE;
1893  // if (extCov[2] > fCutMaxC22)
1894  // cuts[8]=kTRUE;
1895  // if (extCov[5] > fCutMaxC33)
1896  // cuts[9]=kTRUE;
1897  // if (extCov[9] > fCutMaxC44)
1898  // cuts[10]=kTRUE;
1899  // if (extCov[14] > fCutMaxC55)
1900  // cuts[11]=kTRUE;
1901 
1902  // cut 12 and 13 see below
1903 
1904  // if (!fCutAcceptKinkDaughters && vTrack->GetKinkIndex(0)>0)
1905  // cuts[14]=kTRUE;
1906  // track kinematics cut
1907  if((momentum < fPMin) || (momentum > fPMax))
1908  cuts[15]=kTRUE;
1909  if((pt < fPtMin) || (pt > fPtMax))
1910  cuts[16] = kTRUE;
1911  if((p[0] < fPxMin) || (p[0] > fPxMax))
1912  cuts[17] = kTRUE;
1913  if((p[1] < fPyMin) || (p[1] > fPyMax))
1914  cuts[18] = kTRUE;
1915  if((p[2] < fPzMin) || (p[2] > fPzMax))
1916  cuts[19] = kTRUE;
1917  if((eta < fEtaMin) || (eta > fEtaMax))
1918  cuts[20] = kTRUE;
1919  if((y < fRapMin) || (y > fRapMax))
1920  cuts[21] = kTRUE;
1921  if (fCutDCAToVertex2D && dcaToVertex > 1)
1922  cuts[22] = kTRUE;
1923  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
1924  cuts[23] = kTRUE;
1925  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
1926  cuts[24] = kTRUE;
1927  if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
1928  cuts[25] = kTRUE;
1929  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
1930  cuts[26] = kTRUE;
1931  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
1932  cuts[27] = kTRUE;
1933 
1934  // for (Int_t i = 0; i < 3; i++) {
1935  // if(!(vTrack->GetStatus()&AliESDtrack::kITSupg)) { // current ITS
1936  // cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], vTrack->HasPointOnITSLayer(i*2), vTrack->HasPointOnITSLayer(i*2+1));
1937  // } else { // upgraded ITS (7 layers)
1938  // // at the moment, for L012 the layers 12 are considered together
1939  // if(i==0) { // L012
1940  // cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], vTrack->HasPointOnITSLayer(0), (vTrack->HasPointOnITSLayer(1))&(vTrack->HasPointOnITSLayer(2)));
1941  // } else { // L34 or L56
1942  // cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], vTrack->HasPointOnITSLayer(i*2+1), vTrack->HasPointOnITSLayer(i*2+2));
1943  // }
1944  // }
1945  // }
1946 
1948  if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
1949  // TPC tracks
1950  cuts[31] = kTRUE;
1951  }else{
1952  // ITS standalone tracks
1954  if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
1955  }else if(fCutRequireITSpureSA){
1956  if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
1957  }
1958  }
1959  }
1960 
1961  // if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
1962  // cuts[32] = kTRUE;
1963 
1964  // if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
1965  // cuts[33] = kTRUE;
1966 
1967  // if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
1968  // cuts[34] = kTRUE;
1969 
1970  Int_t nITSPointsForPid=0;
1971  UChar_t clumap=vTrack->GetITSClusterMap();
1972  for(Int_t i=2; i<6; i++){
1973  if(clumap&(1<<i)) ++nITSPointsForPid;
1974  }
1975  if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
1976 
1977 
1978  if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
1979  cuts[36]=kTRUE;
1980  // if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC)
1981  // cuts[37]=kTRUE;
1982 
1983  Int_t nMissITSpts=0;
1984  // Int_t idet,statusLay;
1985  // Float_t xloc,zloc;
1986  // for(Int_t iLay=0; iLay<6; iLay++){
1987  // Bool_t retc=vTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
1988  // if(retc && statusLay==5) ++nMissITSpts;
1989  // }
1990  // if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
1991 
1992  //kTOFout
1993  // if (fCutRequireTOFout && (status&AliESDtrack::kTOFout)==0)
1994  // cuts[40]=kTRUE;
1995 
1996  // TOF signal Dz cut
1997  // Float_t dxTOF = vTrack->GetTOFsignalDx();
1998  // Float_t dzTOF = vTrack->GetTOFsignalDz();
1999  Float_t dxTOF = 0.;
2000  Float_t dzTOF = 0.;
2001  // if (fFlagCutTOFdistance && (vTrack->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
2002  // if (fgBeamTypeFlag < 0) { // the check on the beam type was not done yet
2003  // const AliESDEvent* event = vTrack->GetESDEvent();
2004  // if (event){
2005  // TString beamTypeESD = event->GetBeamType();
2006  // AliDebug(2,Form("Beam type from ESD event = %s",beamTypeESD.Data()));
2007  // 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
2008  // fgBeamTypeFlag = 1;
2009  // }
2010  // else { // we are NOT in PbPb collisions --> fgBeamTypeFlag will be set to 0, to NOT apply the cu6 on TOF signal Dz
2011  // fgBeamTypeFlag = 0;
2012  // }
2013  // }
2014  // else{
2015  // AliFatal("Beam type not available, but it is needed to apply the TOF cut!");
2016  // }
2017  // }
2018 
2019  // if (fgBeamTypeFlag == 1){ // we are in PbPb collisions --> apply the cut on TOF signal Dz
2020  // Float_t radiusTOF = TMath::Sqrt(dxTOF*dxTOF + dzTOF*dzTOF);
2021  // AliDebug(3,Form("TOF check (with fCutTOFdistance = %f) --> dx = %f, dz = %f, radius = %f", fCutTOFdistance, dxTOF, dzTOF, radiusTOF));
2022  // if (radiusTOF > fCutTOFdistance){
2023  // AliDebug(2, Form("************* the radius is outside the range! %f > %f, the track will be skipped", radiusTOF, fCutTOFdistance));
2024  // cuts[41] = kTRUE;
2025  // }
2026  // }
2027  // }
2028 
2029  Bool_t cut=kFALSE;
2030  for (Int_t i=0; i<kNCuts; i++)
2031  if (cuts[i]) {cut = kTRUE;}
2032 
2033  // for performance evaluate the CPU intensive cuts only when the others have passed, and when they are requested
2034  Double_t chi2TPCConstrainedVsGlobal = -2;
2035  Float_t nSigmaToVertex = -2;
2036  if (!cut)
2037  {
2038  // getting the track to vertex parameters
2040  {
2041  nSigmaToVertex = GetSigmaToVertexVTrack(vTrack);
2042  if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
2043  {
2044  cuts[12] = kTRUE;
2045  cut = kTRUE;
2046  }
2047  // if n sigma could not be calculated
2048  if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
2049  {
2050  cuts[13] = kTRUE;
2051  cut = kTRUE;
2052  }
2053  }
2054 
2055  // // max chi2 TPC constrained vs global track only if track passed the other cut
2056  // if (fCutMaxChi2TPCConstrainedVsGlobal < 1e9)
2057  // {
2058  // const AliESDEvent* esdEvent = vTrack->GetESDEvent();
2059 
2060  // if (!esdEvent)
2061  // AliFatal("fCutMaxChi2TPCConstrainedVsGlobal set but ESD event not set in AliESDTrack. Use AliESDTrack::SetESDEvent before calling AliESDtrackCuts.");
2062 
2063  // // get vertex
2064  // const AliESDVertex* vertex = 0;
2065  // if (fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTracks)
2066  // vertex = esdEvent->GetPrimaryVertexTracks();
2067 
2068  // if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexSPD)
2069  // vertex = esdEvent->GetPrimaryVertexSPD();
2070 
2071  // if ((!vertex || !vertex->GetStatus()) && fCutMaxChi2TPCConstrainedVsGlobalVertexType & kVertexTPC)
2072  // vertex = esdEvent->GetPrimaryVertexTPC();
2073 
2074  // if (vertex->GetStatus())
2075  // chi2TPCConstrainedVsGlobal = vTrack->GetChi2TPCConstrainedVsGlobal(vertex);
2076 
2077  // if (chi2TPCConstrainedVsGlobal < 0 || chi2TPCConstrainedVsGlobal > fCutMaxChi2TPCConstrainedVsGlobal)
2078  // {
2079  // cuts[39] = kTRUE;
2080  // cut = kTRUE;
2081  // }
2082  // }
2083 
2084  // // max length in active volume
2085  // Float_t lengthInActiveZoneTPC = -1;
2086  // if (fCutMinLengthActiveVolumeTPC > 1.) { // do the calculation only if needed to save cpu-time
2087  // if (vTrack->GetESDEvent()) {
2088  // if (vTrack->GetInnerParam()) lengthInActiveZoneTPC = vTrack->GetLengthInActiveZone(1, 1.8, 220, vTrack->GetESDEvent()->GetMagneticField());
2089  // //
2090  // if (lengthInActiveZoneTPC < fCutMinLengthActiveVolumeTPC ) {
2091  // cuts[42] = kTRUE;
2092  // cut = kTRUE;
2093  // }
2094  // }
2095  // }
2096 
2097 
2098  }
2099 
2100  //########################################################################
2101  // filling histograms
2102  if (fHistogramsOn) {
2103  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n tracks")));
2104  if (cut)
2105  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
2106 
2107  for (Int_t i=0; i<kNCuts; i++) {
2108  if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
2109  AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
2110 
2111  if (cuts[i])
2112  fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
2113 
2114  for (Int_t j=i; j<kNCuts; j++) {
2115  if (cuts[i] && cuts[j]) {
2116  Float_t xC = fhCutCorrelation->GetXaxis()->GetBinCenter(fhCutCorrelation->GetXaxis()->FindBin(fgkCutNames[i]));
2117  Float_t yC = fhCutCorrelation->GetYaxis()->GetBinCenter(fhCutCorrelation->GetYaxis()->FindBin(fgkCutNames[j]));
2118  fhCutCorrelation->Fill(xC, yC);
2119  }
2120  }
2121  }
2122  }
2123 
2124  // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
2125  // the code is not in a function due to too many local variables that would need to be passed
2126 
2127  for (Int_t id = 0; id < 2; id++)
2128  {
2129  // id = 0 --> before cut
2130  // id = 1 --> after cut
2131 
2132  if (fHistogramsOn)
2133  {
2134  fhNClustersITS[id]->Fill(nClustersITS);
2135  fhNClustersTPC[id]->Fill(nClustersTPC);
2136  fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
2137  fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
2138  fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
2139  fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
2140  fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
2141  fhChi2TPCConstrainedVsGlobal[id]->Fill(chi2TPCConstrainedVsGlobal);
2142  fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
2143  fhNMissingITSPoints[id]->Fill(nMissITSpts);
2144 
2145  fhC11[id]->Fill(extCov[0]);
2146  fhC22[id]->Fill(extCov[2]);
2147  fhC33[id]->Fill(extCov[5]);
2148  fhC44[id]->Fill(extCov[9]);
2149  fhC55[id]->Fill(extCov[14]);
2150 
2151  fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
2152 
2153  fhPt[id]->Fill(pt);
2154  fhEta[id]->Fill(eta);
2155  fhTOFdistance[id]->Fill(dxTOF, dzTOF);
2156 
2157  Float_t bRes[2];
2158  bRes[0] = TMath::Sqrt(bCov[0]);
2159  bRes[1] = TMath::Sqrt(bCov[2]);
2160 
2161  fhDZ[id]->Fill(b[1]);
2162  fhDXY[id]->Fill(b[0]);
2163  fhDXYDZ[id]->Fill(dcaToVertex);
2164  fhDXYvsDZ[id]->Fill(b[1],b[0]);
2165 
2166  if (bRes[0]!=0 && bRes[1]!=0) {
2167  fhDZNormalized[id]->Fill(b[1]/bRes[1]);
2168  fhDXYNormalized[id]->Fill(b[0]/bRes[0]);
2169  fhDXYvsDZNormalized[id]->Fill(b[1]/bRes[1], b[0]/bRes[0]);
2170  fhNSigmaToVertex[id]->Fill(nSigmaToVertex);
2171  }
2172  }
2173 
2174  // cut the track
2175  if (cut)
2176  return kFALSE;
2177  }
2178 
2179  return kTRUE;
2180 }
2181 
2182 
2183 
2184 
2185 
2186 
2187 
2188 //____________________________________________________________________
2189 Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
2190 {
2192 
2193  switch (req)
2194  {
2195  case kOff: return kTRUE;
2196  case kNone: return !clusterL1 && !clusterL2;
2197  case kAny: return clusterL1 || clusterL2;
2198  case kFirst: return clusterL1;
2199  case kOnlyFirst: return clusterL1 && !clusterL2;
2200  case kSecond: return clusterL2;
2201  case kOnlySecond: return clusterL2 && !clusterL1;
2202  case kBoth: return clusterL1 && clusterL2;
2203  }
2204 
2205  return kFALSE;
2206 }
2207 
2208 //____________________________________________________________________
2210 {
2220 
2221  if (!esd->GetPrimaryVertexTPC())
2222  return 0; // No TPC vertex no TPC tracks
2223 
2224  if(!esd->GetPrimaryVertexTPC()->GetStatus())
2225  return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
2226 
2227  AliESDtrack* track = esd->GetTrack(iTrack);
2228  if (!track)
2229  return 0;
2230 
2231  AliESDtrack *tpcTrack = new AliESDtrack();
2232 
2233  // only true if we have a tpc track
2234  if (!track->FillTPCOnlyTrack(*tpcTrack))
2235  {
2236  delete tpcTrack;
2237  return 0;
2238  }
2239 
2240  return tpcTrack;
2241 }
2242 
2243 //____________________________________________________________________
2245 {
2255 
2256  if (!vEvent->GetPrimaryVertexTPC())
2257  return 0; // No TPC vertex no TPC tracks
2258 
2259  if(!vEvent->GetPrimaryVertexTPC()->GetStatus())
2260  return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
2261 
2262  AliVParticle* vParticle = vEvent->GetTrack(iTrack);
2263  if (!vParticle) return 0;
2264 
2265  AliESDtrack *esdTrack = dynamic_cast<AliESDtrack*>(vParticle);
2266  if(!esdTrack) return 0;
2267 
2268  AliESDtrack *tpcTrack = new AliESDtrack();
2269 
2270  // only true if we have a tpc track
2271  if (!esdTrack->FillTPCOnlyTrack(*tpcTrack))
2272  {
2273  delete tpcTrack;
2274  return 0;
2275  }
2276 
2277  return tpcTrack;
2278 }
2279 
2280 //____________________________________________________________________
2282 {
2288 
2289  TObjArray* acceptedTracks = new TObjArray();
2290 
2291  // loop over esd tracks
2292  for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
2293  if(bTPC){
2294  if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
2295  if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
2296 
2297  AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
2298  if (!tpcTrack)
2299  continue;
2300 
2301  if (AcceptTrack(tpcTrack)) {
2302  acceptedTracks->Add(tpcTrack);
2303  }
2304  else
2305  delete tpcTrack;
2306  }
2307  else
2308  {
2309  AliESDtrack* track = esd->GetTrack(iTrack);
2310  if(AcceptTrack(track))
2311  acceptedTracks->Add(track);
2312  }
2313  }
2314  if(bTPC)acceptedTracks->SetOwner(kTRUE);
2315  return acceptedTracks;
2316 }
2317 
2318 //____________________________________________________________________
2320 {
2322 
2323  Int_t count = 0;
2324 
2325  // loop over esd tracks
2326  for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
2327  AliESDtrack* track = esd->GetTrack(iTrack);
2328  if (AcceptTrack(track))
2329  count++;
2330  }
2331 
2332  return count;
2333 }
2334 
2335 //____________________________________________________________________
2338 
2339  fHistogramsOn=kTRUE;
2340 
2341  Bool_t oldStatus = TH1::AddDirectoryStatus();
2342  TH1::AddDirectory(kFALSE);
2343 
2344  //###################################################################################
2345  // defining histograms
2346 
2347  fhCutStatistics = new TH1F("cut_statistics","cut statistics",kNCuts+4,-0.5,kNCuts+3.5);
2348 
2349  fhCutStatistics->GetXaxis()->SetBinLabel(1,"n tracks");
2350  fhCutStatistics->GetXaxis()->SetBinLabel(2,"n cut tracks");
2351 
2352  fhCutCorrelation = new TH2F("cut_correlation","cut correlation",kNCuts,-0.5,kNCuts-0.5,kNCuts,-0.5,kNCuts-0.5);;
2353 
2354  for (Int_t i=0; i<kNCuts; i++) {
2355  fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
2356  fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
2357  fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
2358  }
2359 
2360  fhCutStatistics ->SetLineColor(color);
2361  fhCutCorrelation ->SetLineColor(color);
2362  fhCutStatistics ->SetLineWidth(2);
2363  fhCutCorrelation ->SetLineWidth(2);
2364 
2365  for (Int_t i=0; i<2; i++) {
2366  fhNClustersITS[i] = new TH1F("nClustersITS" ,"",8,-0.5,7.5);
2367  fhNClustersTPC[i] = new TH1F("nClustersTPC" ,"",165,-0.5,164.5);
2368  fhNSharedClustersTPC[i] = new TH1F("nSharedClustersTPC" ,"",165,-0.5,164.5);
2369  fhNCrossedRowsTPC[i] = new TH1F("nCrossedRowsTPC" ,"",165,-0.5,164.5);
2370  fhRatioCrossedRowsOverFindableClustersTPC[i] = new TH1F("ratioCrossedRowsOverFindableClustersTPC" ,"",60,0,1.5);
2371  fhChi2PerClusterITS[i] = new TH1F("chi2PerClusterITS","",500,0,10);
2372  fhChi2PerClusterTPC[i] = new TH1F("chi2PerClusterTPC","",500,0,10);
2373  fhChi2TPCConstrainedVsGlobal[i] = new TH1F("chi2TPCConstrainedVsGlobal","",600,-2,50);
2374  fhNClustersForITSPID[i] = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
2375  fhNMissingITSPoints[i] = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
2376 
2377  fhC11[i] = new TH1F("covMatrixDiagonal11","",2000,0,20);
2378  fhC22[i] = new TH1F("covMatrixDiagonal22","",2000,0,20);
2379  fhC33[i] = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
2380  fhC44[i] = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
2381  fhC55[i] = new TH1F("covMatrixDiagonal55","",1000,0,5);
2382 
2383  fhRel1PtUncertainty[i] = new TH1F("rel1PtUncertainty","",1000,0,5);
2384 
2385  fhDXY[i] = new TH1F("dXY" ,"",500,-10,10);
2386  fhDZ[i] = new TH1F("dZ" ,"",500,-10,10);
2387  fhDXYDZ[i] = new TH1F("dXYDZ" ,"",500,0,10);
2388  fhDXYvsDZ[i] = new TH2F("dXYvsDZ","",200,-10,10,200,-10,10);
2389 
2390  fhDXYNormalized[i] = new TH1F("dXYNormalized" ,"",500,-10,10);
2391  fhDZNormalized[i] = new TH1F("dZNormalized" ,"",500,-10,10);
2392  fhDXYvsDZNormalized[i] = new TH2F("dXYvsDZNormalized","",200,-10,10,200,-10,10);
2393 
2394  fhNSigmaToVertex[i] = new TH1F("nSigmaToVertex","",500,0,10);
2395 
2396  fhPt[i] = new TH1F("pt" ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
2397  fhEta[i] = new TH1F("eta" ,"#eta distribution;#eta",40,-2.0,2.0);
2398  fhTOFdistance[i] = new TH2F("TOFdistance" ,"TOF distance;dx (cm};dz (cm)", 150, -15, 15, 150, -15, 15);
2399 
2400  fhNClustersITS[i]->SetTitle("n ITS clusters");
2401  fhNClustersTPC[i]->SetTitle("n TPC clusters");
2402  fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
2403  fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
2404  fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
2405  fhChi2TPCConstrainedVsGlobal[i]->SetTitle("#Chi^{2} TPC constrained track vs global track");
2406  fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
2407  fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
2408 
2409  fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
2410  fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
2411  fhC33[i]->SetTitle("cov 33 : #sigma_{sin(#phi)}^{2}");
2412  fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
2413  fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
2414 
2415  fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
2416 
2417  fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
2418  fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
2419  fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) (cm)");
2420  fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
2421  fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
2422 
2423  fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
2424  fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
2425  fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
2426  fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
2427  fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
2428 
2429  fhNClustersITS[i]->SetLineColor(color); fhNClustersITS[i]->SetLineWidth(2);
2430  fhNClustersTPC[i]->SetLineColor(color); fhNClustersTPC[i]->SetLineWidth(2);
2431  fhNSharedClustersTPC[i]->SetLineColor(color); fhNSharedClustersTPC[i]->SetLineWidth(2);
2432  fhChi2PerClusterITS[i]->SetLineColor(color); fhChi2PerClusterITS[i]->SetLineWidth(2);
2433  fhChi2PerClusterTPC[i]->SetLineColor(color); fhChi2PerClusterTPC[i]->SetLineWidth(2);
2434  fhChi2TPCConstrainedVsGlobal[i]->SetLineColor(color); fhChi2TPCConstrainedVsGlobal[i]->SetLineWidth(2);
2435  fhNClustersForITSPID[i]->SetLineColor(color); fhNClustersForITSPID[i]->SetLineWidth(2);
2436  fhNMissingITSPoints[i]->SetLineColor(color); fhNMissingITSPoints[i]->SetLineWidth(2);
2437 
2438  fhC11[i]->SetLineColor(color); fhC11[i]->SetLineWidth(2);
2439  fhC22[i]->SetLineColor(color); fhC22[i]->SetLineWidth(2);
2440  fhC33[i]->SetLineColor(color); fhC33[i]->SetLineWidth(2);
2441  fhC44[i]->SetLineColor(color); fhC44[i]->SetLineWidth(2);
2442  fhC55[i]->SetLineColor(color); fhC55[i]->SetLineWidth(2);
2443 
2444  fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
2445 
2446  fhDXY[i]->SetLineColor(color); fhDXY[i]->SetLineWidth(2);
2447  fhDZ[i]->SetLineColor(color); fhDZ[i]->SetLineWidth(2);
2448  fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
2449 
2450  fhDXYNormalized[i]->SetLineColor(color); fhDXYNormalized[i]->SetLineWidth(2);
2451  fhDZNormalized[i]->SetLineColor(color); fhDZNormalized[i]->SetLineWidth(2);
2452  fhNSigmaToVertex[i]->SetLineColor(color); fhNSigmaToVertex[i]->SetLineWidth(2);
2453  }
2454 
2455  // The number of sigmas to the vertex is per definition gaussian
2456  ffDTheoretical = new TF1("nSigmaToVertexTheoretical","([0]/2.506628274)*exp(-(x**2)/2)",0,50);
2457  ffDTheoretical->SetParameter(0,1);
2458 
2459  TH1::AddDirectory(oldStatus);
2460 }
2461 
2462 //____________________________________________________________________
2463 Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
2464 {
2467 
2468  if (!dir)
2469  dir = GetName();
2470 
2471  if (!gDirectory->cd(dir))
2472  return kFALSE;
2473 
2474  ffDTheoretical = dynamic_cast<TF1*> (gDirectory->Get("nSigmaToVertexTheory"));
2475 
2476  fhCutStatistics = dynamic_cast<TH1F*> (gDirectory->Get("cut_statistics"));
2477  fhCutCorrelation = dynamic_cast<TH2F*> (gDirectory->Get("cut_correlation"));
2478 
2479  for (Int_t i=0; i<2; i++) {
2480  if (i==0)
2481  {
2482  gDirectory->cd("before_cuts");
2483  }
2484  else
2485  gDirectory->cd("after_cuts");
2486 
2487  fhNClustersITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS" ));
2488  fhNClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC" ));
2489  fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC" ));
2490  fhNCrossedRowsTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC" ));
2491  fhRatioCrossedRowsOverFindableClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC" ));
2492  fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
2493  fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
2494  fhChi2TPCConstrainedVsGlobal[i] = dynamic_cast<TH1F*> (gDirectory->Get("fhChi2TPCConstrainedVsGlobal"));
2495  fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
2496  fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
2497 
2498  fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
2499  fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
2500  fhC33[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal33"));
2501  fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
2502  fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
2503 
2504  fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
2505 
2506  fhDXY[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXY" ));
2507  fhDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZ" ));
2508  fhDXYDZ[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
2509  fhDXYvsDZ[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZ"));
2510 
2511  fhDXYNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dXYNormalized" ));
2512  fhDZNormalized[i] = dynamic_cast<TH1F*> (gDirectory->Get("dZNormalized" ));
2513  fhDXYvsDZNormalized[i] = dynamic_cast<TH2F*> (gDirectory->Get("dXYvsDZNormalized"));
2514  fhNSigmaToVertex[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSigmaToVertex"));
2515 
2516  fhPt[i] = dynamic_cast<TH1F*> (gDirectory->Get("pt"));
2517  fhEta[i] = dynamic_cast<TH1F*> (gDirectory->Get("eta"));
2518  fhTOFdistance[i] = dynamic_cast<TH2F*> (gDirectory->Get("TOFdistance"));
2519 
2520  gDirectory->cd("../");
2521  }
2522 
2523  gDirectory->cd("..");
2524 
2525  return kTRUE;
2526 }
2527 
2528 //____________________________________________________________________
2529 void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
2531 
2532  if (!fHistogramsOn) {
2533  AliDebug(0, "Histograms not on - cannot save histograms!!!");
2534  return;
2535  }
2536 
2537  if (!dir)
2538  dir = GetName();
2539 
2540  gDirectory->mkdir(dir);
2541  gDirectory->cd(dir);
2542 
2543  gDirectory->mkdir("before_cuts");
2544  gDirectory->mkdir("after_cuts");
2545 
2546  // a factor of 2 is needed since n sigma is positive
2547  ffDTheoretical->SetParameter(0,2*fhNSigmaToVertex[0]->Integral("width"));
2548  ffDTheoretical->Write("nSigmaToVertexTheory");
2549 
2550  fhCutStatistics->Write();
2551  fhCutCorrelation->Write();
2552 
2553  for (Int_t i=0; i<2; i++) {
2554  if (i==0)
2555  gDirectory->cd("before_cuts");
2556  else
2557  gDirectory->cd("after_cuts");
2558 
2559  fhNClustersITS[i] ->Write();
2560  fhNClustersTPC[i] ->Write();
2561  fhNSharedClustersTPC[i] ->Write();
2562  fhNCrossedRowsTPC[i] ->Write();
2564  fhChi2PerClusterITS[i] ->Write();
2565  fhChi2PerClusterTPC[i] ->Write();
2566  fhChi2TPCConstrainedVsGlobal[i] ->Write();
2567  fhNClustersForITSPID[i] ->Write();
2568  fhNMissingITSPoints[i] ->Write();
2569 
2570  fhC11[i] ->Write();
2571  fhC22[i] ->Write();
2572  fhC33[i] ->Write();
2573  fhC44[i] ->Write();
2574  fhC55[i] ->Write();
2575 
2576  fhRel1PtUncertainty[i] ->Write();
2577 
2578  fhDXY[i] ->Write();
2579  fhDZ[i] ->Write();
2580  fhDXYDZ[i] ->Write();
2581  fhDXYvsDZ[i] ->Write();
2582 
2583  fhDXYNormalized[i] ->Write();
2584  fhDZNormalized[i] ->Write();
2585  fhDXYvsDZNormalized[i] ->Write();
2586  fhNSigmaToVertex[i] ->Write();
2587 
2588  fhPt[i] ->Write();
2589  fhEta[i] ->Write();
2590  fhTOFdistance[i] ->Write();
2591 
2592  gDirectory->cd("../");
2593  }
2594 
2595  gDirectory->cd("../");
2596 }
2597 
2598 //____________________________________________________________________
2600 {
2602 
2603  TCanvas* canvas1 = new TCanvas(Form("%s_1", GetName()), "Track Quality Results1", 800, 800);
2604  canvas1->Divide(2, 2);
2605 
2606  canvas1->cd(1);
2607  fhNClustersTPC[0]->SetStats(kFALSE);
2608  fhNClustersTPC[0]->Draw();
2609 
2610  canvas1->cd(2);
2611  fhChi2PerClusterTPC[0]->SetStats(kFALSE);
2612  fhChi2PerClusterTPC[0]->Draw();
2613 
2614  canvas1->cd(3);
2615  fhNSigmaToVertex[0]->SetStats(kFALSE);
2616  fhNSigmaToVertex[0]->GetXaxis()->SetRangeUser(0, 10);
2617  fhNSigmaToVertex[0]->Draw();
2618 
2619  canvas1->SaveAs(Form("%s_%s.gif", GetName(), canvas1->GetName()));
2620 
2621  TCanvas* canvas2 = new TCanvas(Form("%s_2", GetName()), "Track Quality Results2", 1200, 800);
2622  canvas2->Divide(3, 2);
2623 
2624  canvas2->cd(1);
2625  fhC11[0]->SetStats(kFALSE);
2626  gPad->SetLogy();
2627  fhC11[0]->Draw();
2628 
2629  canvas2->cd(2);
2630  fhC22[0]->SetStats(kFALSE);
2631  gPad->SetLogy();
2632  fhC22[0]->Draw();
2633 
2634  canvas2->cd(3);
2635  fhC33[0]->SetStats(kFALSE);
2636  gPad->SetLogy();
2637  fhC33[0]->Draw();
2638 
2639  canvas2->cd(4);
2640  fhC44[0]->SetStats(kFALSE);
2641  gPad->SetLogy();
2642  fhC44[0]->Draw();
2643 
2644  canvas2->cd(5);
2645  fhC55[0]->SetStats(kFALSE);
2646  gPad->SetLogy();
2647  fhC55[0]->Draw();
2648 
2649  canvas2->cd(6);
2650  fhRel1PtUncertainty[0]->SetStats(kFALSE);
2651  gPad->SetLogy();
2652  fhRel1PtUncertainty[0]->Draw();
2653 
2654  canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
2655 
2656  TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
2657  canvas3->Divide(3, 2);
2658 
2659  canvas3->cd(1);
2660  fhDXY[0]->SetStats(kFALSE);
2661  gPad->SetLogy();
2662  fhDXY[0]->Draw();
2663 
2664  canvas3->cd(2);
2665  fhDZ[0]->SetStats(kFALSE);
2666  gPad->SetLogy();
2667  fhDZ[0]->Draw();
2668 
2669  canvas3->cd(3);
2670  fhDXYvsDZ[0]->SetStats(kFALSE);
2671  gPad->SetLogz();
2672  gPad->SetRightMargin(0.15);
2673  fhDXYvsDZ[0]->Draw("COLZ");
2674 
2675  canvas3->cd(4);
2676  fhDXYNormalized[0]->SetStats(kFALSE);
2677  gPad->SetLogy();
2678  fhDXYNormalized[0]->Draw();
2679 
2680  canvas3->cd(5);
2681  fhDZNormalized[0]->SetStats(kFALSE);
2682  gPad->SetLogy();
2683  fhDZNormalized[0]->Draw();
2684 
2685  canvas3->cd(6);
2686  fhDXYvsDZNormalized[0]->SetStats(kFALSE);
2687  gPad->SetLogz();
2688  gPad->SetRightMargin(0.15);
2689  fhDXYvsDZNormalized[0]->Draw("COLZ");
2690 
2691  canvas3->SaveAs(Form("%s_%s.gif", GetName(), canvas3->GetName()));
2692 
2693  TCanvas* canvas4 = new TCanvas(Form("%s_4", GetName()), "Track Quality Results4", 800, 500);
2694  canvas4->Divide(2, 1);
2695 
2696  canvas4->cd(1);
2697  fhCutStatistics->SetStats(kFALSE);
2698  fhCutStatistics->LabelsOption("v");
2699  gPad->SetBottomMargin(0.3);
2700  fhCutStatistics->Draw();
2701 
2702  canvas4->cd(2);
2703  fhCutCorrelation->SetStats(kFALSE);
2704  fhCutCorrelation->LabelsOption("v");
2705  gPad->SetBottomMargin(0.3);
2706  gPad->SetLeftMargin(0.3);
2707  fhCutCorrelation->Draw("COLZ");
2708 
2709  canvas4->SaveAs(Form("%s_%s.gif", GetName(), canvas4->GetName()));
2710 
2711  /*canvas->cd(1);
2712  fhDXYvsDZNormalized[0]->SetStats(kFALSE);
2713  fhDXYvsDZNormalized[0]->DrawCopy("COLZ");
2714 
2715  canvas->cd(2);
2716  fhNClustersTPC[0]->SetStats(kFALSE);
2717  fhNClustersTPC[0]->DrawCopy();
2718 
2719  canvas->cd(3);
2720  fhChi2PerClusterITS[0]->SetStats(kFALSE);
2721  fhChi2PerClusterITS[0]->DrawCopy();
2722  fhChi2PerClusterITS[1]->SetLineColor(2);
2723  fhChi2PerClusterITS[1]->DrawCopy("SAME");
2724 
2725  canvas->cd(4);
2726  fhChi2PerClusterTPC[0]->SetStats(kFALSE);
2727  fhChi2PerClusterTPC[0]->DrawCopy();
2728  fhChi2PerClusterTPC[1]->SetLineColor(2);
2729  fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
2730 }
2731 //--------------------------------------------------------------------------
2734 
2737  }
2738 
2741  }
2742 
2745  }
2746 
2749  }
2750 
2751 
2752  return;
2753 }
2754 
2755 
2756 
2757 //--------------------------------------------------------------------------
2758 Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
2760 
2761  Bool_t retval=kTRUE;
2762 
2763  if(!dist.Contains("pt")) {
2764  if(print) AliError("string must contain \"pt\"");
2765  retval= kFALSE;
2766  }
2767  return retval;
2768 }
2769 
2771 
2774  // resetiing both
2777  }
2778  if(!CheckPtDepDCA(dist,kTRUE)){
2779  return;
2780  }
2782  TString tmp(dist);
2783  tmp.ReplaceAll("pt","x");
2784  f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
2785 
2786 }
2787 
2789 
2790 
2793  // resetiing both
2796  }
2797  if(!CheckPtDepDCA(dist,kTRUE))return;
2798 
2799  fCutMaxDCAToVertexZPtDep = dist;
2800  TString tmp(dist);
2801  tmp.ReplaceAll("pt","x");
2802  f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
2803 
2804 
2805 }
2806 
2807 
2809 
2810 
2813  // resetiing both
2816  }
2817  if(!CheckPtDepDCA(dist,kTRUE))return;
2818 
2820  TString tmp(dist);
2821  tmp.ReplaceAll("pt","x");
2822  f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
2823 
2824 }
2825 
2826 
2828 
2829 
2830 
2833  // resetiing both
2836  }
2837  if(!CheckPtDepDCA(dist,kTRUE))return;
2838  fCutMinDCAToVertexZPtDep = dist;
2839  TString tmp(dist);
2840  tmp.ReplaceAll("pt","x");
2841  f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
2842 }
2843 
2845 {
2850 
2852  {
2853  // quality cut on ITS+TPC tracks
2860  //multiplicity underestimate if we use global tracks with |eta| > 0.9
2862 
2863  // quality cut on ITS_SA tracks (complementary to ITS+TPC)
2866 
2867  // primary selection for tracks with SPD hits
2872 
2873  // primary selection for tracks w/o SPD hits
2876  fgMultEstTrackCuts[kMultEstTrackCutDCAwoSPD]->SetMaxDCAToVertexXYPtDep("1.5*(0.0182+0.0350/pt^1.01)");
2878  }
2879 
2880  return fgMultEstTrackCuts[cut];
2881 }
2882 
2883 Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, MultEstTrackType trackType, Float_t etaRange, Float_t etaCent)
2884 {
2902 
2903  const AliESDVertex* vertices[2];
2904  vertices[0] = esd->GetPrimaryVertexSPD();
2905  vertices[1] = esd->GetPrimaryVertexTracks();
2906 
2907  if (!vertices[0]->GetStatus())
2908  {
2909  AliDebugClass(AliLog::kDebug, "No SPD vertex. Not able to make a reliable multiplicity estimate.");
2910  return -1;
2911  }
2912 
2913  if (vertices[0]->IsFromVertexerZ() && vertices[0]->GetDispersion() > 0.02)
2914  {
2915  AliDebugClass(AliLog::kDebug, "Vertexer z dispersion > 0.02. Not able to make a reliable multiplicity estimate.");
2916  return -2;
2917  }
2918 
2919  Int_t multiplicityEstimate = 0;
2920 
2921  // SPD tracklet-only estimate
2922  if (trackType == kTracklets)
2923  {
2924  const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
2925  if (!spdmult) return 0;
2926  for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i)
2927  {
2928  if (TMath::Abs(spdmult->GetEta(i)-etaCent) > etaRange)
2929  continue; // eta selection for tracklets
2930  multiplicityEstimate++;
2931  }
2932  return multiplicityEstimate;
2933  }
2934 
2935  if (!vertices[1]->GetStatus())
2936  {
2937  AliDebugClass(AliLog::kDebug, "No track vertex. Not able to make a reliable multiplicity estimate.");
2938  return -3;
2939  }
2940 
2941  // TODO value of displacement to be studied
2942  const Float_t maxDisplacement = 0.5;
2943  //check for displaced vertices
2944  Double_t displacement = TMath::Abs(vertices[0]->GetZ() - vertices[1]->GetZ());
2945  if (displacement > maxDisplacement)
2946  {
2947  AliDebugClass(AliLog::kDebug, Form("Displaced vertices %f > %f",displacement,maxDisplacement));
2948  return -4;
2949  }
2950 
2951  // update eta range in track cuts
2952  float etaMin = etaCent - etaRange, etaMax = etaCent + etaRange;
2956 
2957  //*******************************************************************************************************
2958  //set counters to initial zeros
2959  Int_t tracksITSTPC = 0; //number of global tracks for a given event
2960  Int_t tracksITSSA = 0; //number of ITS standalone tracks for a given event
2961  Int_t tracksITSTPCSA_complementary = 0; //number of ITS standalone tracks complementary to TPC for a given event
2962  Int_t trackletsITSTPC_complementary = 0;//number of SPD tracklets complementary to global/ITSSA tracks for a given events
2963  Int_t trackletsITSSA_complementary = 0; //number of SPD tracklets complementary to ITSSA tracks for a given event
2964 
2965  const Int_t nESDTracks = esd->GetNumberOfTracks();
2966 
2967  // flags for secondary and rejected tracks
2968  const Int_t kRejBit = BIT(15); // set this bit in global tracks if it is rejected by a cut
2969  const Int_t kSecBit = BIT(16); // set this bit in global tracks if it is secondary according to a cut
2970 
2971  for(Int_t itracks=0; itracks < nESDTracks; itracks++) {
2972  if (!esd->GetTrack(itracks)) continue;
2973  esd->GetTrack(itracks)->ResetBit(kSecBit|kRejBit); //reset bits used for flagging secondaries and rejected tracks in case they were changed before this analysis
2974  }
2975  const Int_t maxid = nESDTracks; // used to define bool array for check multiple associations of tracklets to one track. array starts at 0.
2976 
2977  // bit mask for esd tracks, to check if multiple tracklets are associated to it
2978  TBits globalBits(maxid), pureITSBits(maxid);
2979  // why labels are used with the data? RS
2980  // Bool_t globalBits[maxid], pureITSBits[maxid];
2981  // for(Int_t i=0; i<maxid; i++){ // set all bools to false
2982  // globalBits[i]=kFALSE;
2983  // pureITSBits[i]=kFALSE;
2984  // }
2985 
2986  //*******************************************************************************************************
2987  // get multiplicity from global tracks
2988  for(Int_t itracks = 0; itracks < nESDTracks; itracks++) { // flag the tracks
2989  AliESDtrack* track = esd->GetTrack(itracks);
2990  if (!track) continue;
2991 
2992  // if track is a secondary from a V0, flag as a secondary
2993  if (track->IsOn(AliESDtrack::kMultInV0)) {
2994  track->SetBit(kSecBit);
2995  continue;
2996  }
2997  /* done via proper DCA cut
2998  //secondary?
2999  if (track->IsOn(AliESDtrack::kMultSec)) {
3000  track->SetBit(kSecBit);
3001  continue;
3002  }
3003  */
3004  // check tracks with ITS part
3005  //*******************************************************************************************************
3006  if (track->IsOn(AliESDtrack::kITSin) && !track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSTPC) { // track has ITS part but is not an ITS_SA
3007  //*******************************************************************************************************
3008  // TPC+ITS
3009  if (track->IsOn(AliESDtrack::kTPCin)) { // Global track, has ITS and TPC contributions
3010  if (fgMultEstTrackCuts[kMultEstTrackCutGlobal]->AcceptTrack(track)) { // good ITSTPC track
3012  tracksITSTPC++; //global track counted
3013  globalBits.SetBitNumber(itracks);
3014  }
3015  else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
3016  }
3017  else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
3018  }
3019  //*******************************************************************************************************
3020  // ITS complementary
3021  else if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITS complementary track
3023  tracksITSTPCSA_complementary++;
3024  globalBits.SetBitNumber(itracks);
3025  }
3026  else track->SetBit(kSecBit); // large DCA -> secondary, don't count either track not associated tracklet
3027  }
3028  else track->SetBit(kRejBit); // bad quality, don't count the track, but may count tracklet if associated
3029  }
3030  //*******************************************************************************************************
3031  // check tracks from ITS_SA_PURE
3032  if (track->IsOn(AliESDtrack::kITSin) && track->IsOn(AliESDtrack::kITSpureSA) && trackType == kTrackletsITSSA){
3033  if (fgMultEstTrackCuts[kMultEstTrackCutITSSA]->AcceptTrack(track)) { // good ITSSA track
3035  tracksITSSA++;
3036  pureITSBits.SetBitNumber(itracks);
3037  }
3038  else track->SetBit(kSecBit);
3039  }
3040  else track->SetBit(kRejBit);
3041  }
3042  }//ESD tracks counted
3043 
3044  //*******************************************************************************************************
3045  // get multiplicity from ITS tracklets to complement TPC+ITS, and ITSpureSA
3046  const AliMultiplicity* spdmult = esd->GetMultiplicity(); // spd multiplicity object
3047  if (spdmult) {
3048  for (Int_t i=0; i<spdmult->GetNumberOfTracklets(); ++i) {
3049  if (TMath::Abs(spdmult->GetEta(i)-etaCent) > etaRange) continue; // eta selection for tracklets
3050 
3051  // if counting tracks+tracklets, check if clusters were already used in tracks
3052  Int_t id1, id2, id3, id4;
3053  spdmult->GetTrackletTrackIDs ( i, 0, id1, id2 ); // references for eventual Global/ITS_SA tracks
3054  spdmult->GetTrackletTrackIDs ( i, 1, id3, id4 ); // references for eventual ITS_SA_pure tracks
3055 
3056  // are both clusters from the same tracks? If not, skip the tracklet (shouldn't change things much)
3057  if ( ( id1 != id2 && id1 >= 0 && id2 >= 0 ) || ( id3 != id4 && id3 >= 0 && id4 >= 0 ) ) continue;
3058 
3059  //referenced track
3060  //at this point we either have id1 = id2 (id3 = id4) or only one of the ids pair is -1
3061  // id1>=0, id2>=0, id1=id2 : tracklet has associated track
3062  // id1>=0, id2 = -1 : 1st layer cluster has associated track
3063  // id1=-1, id2>=0 : 2nd layer cluster has associated track
3064  // id1=-1, id2=-1 : tracklet has no associated track
3065  //
3066  Int_t bUsedInGlobal(-1);
3067  if ( id1 != -1 ) bUsedInGlobal = globalBits.TestBitNumber(id1) ? id1 : -1;
3068  else if ( id2 != -1) bUsedInGlobal = globalBits.TestBitNumber(id2) ? id2 : -1;
3069  Int_t bUsedInPureITS(-1);
3070  if ( id3 != -1 ) bUsedInPureITS = pureITSBits.TestBitNumber(id3) ? id3 : -1;
3071  else if ( id4 != -1) bUsedInPureITS = pureITSBits.TestBitNumber(id4) ? id4 : -1;
3072  //
3073  AliESDtrack* tr_global = bUsedInGlobal >= 0 ? esd->GetTrack ( bUsedInGlobal ) : 0;
3074  AliESDtrack* tr_itssa = bUsedInPureITS >= 0 ? esd->GetTrack ( bUsedInPureITS ) : 0;
3075  //
3076  // has associated pure ITS track been associated to a previous tracklet?
3077  //*******************************************************************************************************
3078  if (trackType == kTrackletsITSTPC) {
3079  //*******************************************************************************************************
3080  // count tracklets towards global+complimentary tracks
3081  if ( ( tr_global && !tr_global->TestBit ( kSecBit ) ) && ( tr_global && tr_global->TestBit ( kRejBit ) ) ) { // count tracklet as bad quality track
3082  globalBits.SetBitNumber( bUsedInGlobal ); // mark global track linked to this tracklet as used
3083  ++trackletsITSTPC_complementary;
3084  }
3085 
3086  if ( bUsedInGlobal < 0 ) ++trackletsITSTPC_complementary; //no associated track, just count the tracklet
3087  } else {
3088  //*******************************************************************************************************
3089  // count tracklets towards ITS_SA_pure tracks
3090  if ( ( tr_itssa && !tr_itssa->TestBit ( kSecBit ) ) && ( tr_itssa && tr_itssa->TestBit ( kRejBit ) ) ) { // count tracklet as bad quality track
3091  pureITSBits.SetBitNumber( bUsedInPureITS ); // mark ITS pure SA track linked to this tracklet as used
3092  ++trackletsITSSA_complementary;
3093  }
3094 
3095  if ( bUsedInPureITS < 0 ) ++trackletsITSSA_complementary; //no associated track, just count the tracklet
3096  }
3097  }
3098  }
3099 
3100  //*******************************************************************************************************
3101  if (trackType == kTrackletsITSTPC)
3102  multiplicityEstimate = tracksITSTPC + tracksITSTPCSA_complementary + trackletsITSTPC_complementary;
3103  else
3104  multiplicityEstimate = tracksITSSA + trackletsITSSA_complementary;
3105 
3106  return multiplicityEstimate;
3107 }
3108 
3109 //____________________________________________________________________
3111 
3113 
3114  SetRequireTOFout(kTRUE);
3115  SetFlagCutTOFdistance(kTRUE);
3116  SetCutTOFdistance(3.);
3117 
3118 }
3119 
TFormula * f1CutMaxDCAToVertexXYPtDep
pt-dep track-to-vertex cut in max absolute distance in xy-plane
Int_t fCutMinNClusterITS
min number of its clusters
TBrowser b
Definition: RunAnaESD.C:12
Bool_t GetITSModuleIndexInfo(Int_t ilayer, Int_t &idet, Int_t &status, Float_t &xloc, Float_t &zloc) const
virtual const AliVVertex * GetPrimaryVertexTPC() const
Definition: AliVEvent.h:249
virtual Double_t Y() const =0
Int_t CountAcceptedTracks(const AliESDEvent *const esd)
void SetMaxFractionSharedTPCClusters(Float_t max=1e10)
static AliESDtrackCuts * GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE)
virtual Int_t GetNumberOfITSClusters() const
Definition: AliVTrack.h:232
void ResetTrackParamIp(const AliExternalTrackParam *p)
Definition: AliESDtrack.h:525
Double_t GetMagneticField() const
Definition: AliESDEvent.h:148
UShort_t GetTPCnclsS(Int_t i0=0, Int_t i1=159) const
static AliESDtrackCuts * GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE)
void SetPxRange(Float_t r1=-1e10, Float_t r2=1e10)
void SetMinNClustersTPC(Int_t min=-1)
static AliESDtrackCuts * GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries=kTRUE, Int_t clusterCut=0)
void SetRequireSigmaToVertex(Bool_t b=kTRUE)
Int_t fCutMaxChi2TPCConstrainedVsGlobalVertexType
vertex type for max chi2 TPC track constrained with vtx vs. global track (can be configured to accept...
void SetPyRange(Float_t r1=-1e10, Float_t r2=1e10)
UShort_t GetTPCclusters(Int_t *idx) const
Float_t fCutMaxRel1PtUncertainty
max relative uncertainty of 1/pt
const AliExternalTrackParam * GetInnerParam() const
Definition: AliESDtrack.h:132
void SetMinDCAToVertexXY(Float_t dist=0.)
virtual void GetImpactParameters(Float_t[], Float_t[]) const
Definition: AliVTrack.h:136
Double_t GetEta(Int_t i) const
virtual Bool_t LoadHistograms(const Char_t *dir=0)
TFormula * f1CutMinDCAToVertexZPtDep
pt-dep track-to-vertex cut on min absolute distance in z-plane
#define TObjArray
TH1F * fhChi2PerClusterTPC[2]
Float_t fCutMaxC33
max cov. matrix diag. elements (res. sin(phi)^2)
TH1F * fhDZNormalized[2]
Float_t fCutMinRatioCrossedRowsOverFindableClustersTPC
min ratio crossed rows / findable clusters
Bool_t fCutRequireTOFout
require TOF out
virtual void Copy(TObject &c) const
Int_t fCutMaxMissingITSPoints
max n. of missing ITS points
Float_t fCutMinNCrossedRowsTPC
min number of tpc crossed rows
virtual Bool_t PxPyPz(Double_t p[3]) const =0
TFormula * f1CutMinDCAToVertexXYPtDep
pt-dep track-to-vertex cut on min absolute distance in xy-plane
void SetMinDCAToVertexZ(Float_t dist=0.)
Float_t fRapMax
definition of the range of the y
Bool_t fCutRequireITSpureSA
require ITS pure standalone tracks (found using all ITS clusters)
TH1F * fhDXYDZ[2]
absolute distance sqrt(dxy**2 + dz**2) to vertex; if 2D cut is set, normalized to given values ...
Float_t fPtMax
definition of the range of the Pt
void SetMaxDCAToVertexZPtDep(const char *dist="")
void SetMaxRel1PtUncertainty(Float_t max=1e10)
TH1F * fhNSharedClustersTPC[2]
void SetRequireTPCStandAlone(Bool_t b=kFALSE)
void SetMaxDCAToVertexXYPtDep(const char *dist="")
void SetFlagCutTOFdistance(Bool_t flagTOFcut)
void SetMaxChi2TPCConstrainedGlobal(Float_t max=1e10)
Bool_t FillTPCOnlyTrack(AliESDtrack &track)
Float_t fCutMaxChi2PerClusterTPC
max tpc fit chi2 per tpc cluster
Float_t p[]
Definition: kNNTest.C:133
void SetRequireITSPid(Bool_t b=kFALSE)
TFormula * f1CutMaxDCAToVertexZPtDep
pt-dep track-to-vertex cut in max absolute distance in z-plane
TH2F * fhCutCorrelation
2d statistics plot
TH1F * fhChi2TPCConstrainedVsGlobal[2]
TH1F * fhDXYNormalized[2]
void SetRequireTPCRefit(Bool_t b=kFALSE)
void SetMaxChi2PerClusterITS(Float_t max=1e10)
void SetRequireITSStandAlone(Bool_t b=kFALSE)
AliTPCfastTrack * track
Bool_t HasPointOnITSLayer(Int_t i) const
Definition: AliESDtrack.h:218
TH1F * fhNClustersITS[2]
Float_t fEtaMax
definition of the range of the eta
Float_t fCutMaxC55
max cov. matrix diag. elements (res. 1/pt^2)
Float_t fCutMaxChi2PerClusterITS
max its fit chi2 per its cluster
Bool_t fCutRequireITSRefit
require ITS refit
Double_t GetTOFsignalDz() const
Float_t fDeadZoneWidth
width of the TPC dead zone (missing pads + PRF +ExB)
void DefineHistograms(Int_t color=1)
Float_t fCutGeoNcrNclLength
cut on the geometical length condition Ngeom(cm)>cutGeoNcrNclLength default=130
TH1F * fhNCrossedRowsTPC[2]
#define AliInfoClass(message)
Definition: AliLog.h:489
virtual Bool_t GetStatus() const
Definition: AliVVertex.h:45
#define AliWarning(message)
Definition: AliLog.h:541
Char_t GetITSclusters(Int_t *idx) const
virtual UShort_t GetTPCNcls() const
Definition: AliVTrack.h:96
Int_t GetKinkIndex(Int_t i) const
Definition: AliESDtrack.h:271
Bool_t CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
const AliESDVertex * GetPrimaryVertexTracks() const
Definition: AliESDEvent.h:314
Float_t fCutMaxC22
max cov. matrix diag. elements (res. z^2)
TString fCutMaxDCAToVertexZPtDep
pt-dep track-to-vertex cut in max absolute distance in z-plane
Bool_t fCutRequireITSPid
require ITS pid
Float_t fPyMax
definition of the range of the Py
void SetCutGeoNcrNcl(Float_t deadZoneWidth=2, Float_t cutGeoNcrNclLength=130, Float_t cutGeoNcrNclGeom1Pt=1.5, Float_t cutGeoNcrNclFractionNcr=0.9, Float_t cutGeoNcrNclFractionNcl=0.70)
void SetMaxChi2PerClusterTPC(Float_t max=1e10)
void CopyFromVTrack(const AliVTrack *vTrack)
void SetMaxChi2TPCConstrainedGlobalVertexType(Int_t vertexType=kVertexTracks|kVertexSPD)
Float_t fCutMaxFractionSharedTPCClusters
Maximum fraction of shared clusters in TPC.
static Float_t GetSigmaToVertex(const AliESDtrack *const esdTrack)
static AliESDtrackCuts * GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries=kTRUE)
#define AliErrorClass(message)
Definition: AliLog.h:596
void SetMinNClustersTPCPtDep(TFormula *f1=0x0, Float_t ptmax=0.)
Class for handling of ESD track cuts.
void SetPzRange(Float_t r1=-1e10, Float_t r2=1e10)
UShort_t GetTPCNclsIter1() const
Definition: AliESDtrack.h:232
void SetMaxDCAToVertexXY(Float_t dist=1e10)
#define AliDebugClass(logLevel, message)
Definition: AliLog.h:313
const AliESDVertex * GetPrimaryVertexTPC() const
Definition: AliESDEvent.h:304
TTree * tree
static void EnableNeededBranches(TTree *tree)
static AliESDtrackCuts * GetStandardITSSATrackCuts2009(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE)
Bool_t IsOn(ULong64_t mask) const
Definition: AliESDtrack.h:81
virtual AliVParticle * GetTrack(Int_t i) const =0
void SetPRange(Float_t r1=0, Float_t r2=1e10)
TString fCutMinDCAToVertexZPtDep
pt-dep track-to-vertex cut on min absolute distance in z-plane
Double_t GetSigned1Pt() const
Bool_t fCutRequireTPCRefit
require TPC refit
Bool_t GetTrackletTrackIDs(Int_t i, Int_t mode, Int_t &spd1, Int_t &spd2) const
static Bool_t IsTrackInDistortedTpcRegion(const AliESDtrack *esdTrack)
Double_t GetTPCchi2Iter1() const
Definition: AliESDtrack.h:266
static AliESDtrackCuts * GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE)
Bool_t fFlagCutTOFdistance
cut on TOFdistance? –> yes by default!
Bool_t fCutAcceptSharedTPCClusters
accepting shared clusters in TPC?
Bool_t fCutAcceptKinkDaughters
accepting kink daughters?
TH1F * fhCutStatistics
statistics of what cuts the tracks did not survive
void SetRequireStandardTOFmatchCuts()
Float_t fCutMaxPtDepNClustersTPC
maximum pt for pt dependend TPC cluster cut. For pt=>ptmax NClusterMin = f1CutMinNClustersTPCPtDep->E...
Double_t GetITSchi2() const
Definition: AliESDtrack.h:193
Float_t GetTPCCrossedRows() const
Double_t GetChi2TPCConstrainedVsGlobal(const AliESDVertex *vtx) const
Bool_t fCutDCAToVertex2D
if true a 2D DCA cut is made. Tracks are accepted if sqrt((DCAXY / fCutMaxDCAToVertexXY)^2 + (DCAZ / ...
Bool_t fCutRequireTPCStandAlone
require TPC standalone tracks
Float_t fCutTOFdistance
value of the cut on TOFdistance
TH1F * fhChi2PerClusterITS[2]
Float_t fCutMaxC44
max cov. matrix diag. elements (res. tan(theta_dip)^2)
void SetMinRatioCrossedRowsOverFindableClustersTPC(Float_t min=-1)
static Int_t GetReferenceMultiplicity(const AliESDEvent *esd, Bool_t tpcOnly)
Bool_t CheckPtDepDCA(TString dist, Bool_t print=kFALSE) const
TH1F * fhRatioCrossedRowsOverFindableClustersTPC[2]
static AliESDtrackCuts * GetStandardITSTPCTrackCuts2011(Bool_t selPrimaries=kTRUE, Int_t clusterCut=1)
void SetRequireITSRefit(Bool_t b=kFALSE)
Float_t fPzMax
definition of the range of the Pz
void SetMaxNOfMissingITSPoints(Int_t max=6)
static AliESDtrackCuts * GetStandardITSTPCTrackCuts2015PbPb(Bool_t selPrimaries=kTRUE, Int_t clusterCut=1, Bool_t cutAcceptanceEdges=kTRUE, Bool_t removeDistortedRegions=kFALSE)
#define AliWarningClass(message)
Definition: AliLog.h:546
Bool_t fHistogramsOn
histograms on/off
TH2F * fhDXYvsDZNormalized[2]
TH2F * fhTOFdistance[2]
TOF signal distance dx vs dz.
AliMultiplicity * GetMultiplicity() const
Definition: AliESDEvent.h:361
void SetCutOutDistortedRegionsTPC(Bool_t cutOutDistortedRegionTPC=kTRUE)
Base class for analysis cuts.
Double_t GetTPCchi2() const
Definition: AliESDtrack.h:265
Float_t fCutMinLengthActiveVolumeTPC
mininum length (in cm) over which the track is sampled in the active volume of the TPC (outside bound...
ULong64_t GetStatus() const
Definition: AliESDtrack.h:82
void SetAcceptKinkDaughters(Bool_t b=kTRUE)
static const Char_t * fgkCutNames[kNCuts]
! names of cuts (for internal use)
Bool_t GetPxPyPz(Double_t *p) const
static Char_t fgBeamTypeFlag
-1 –> no check done on the beam type yet
void SetPtDepDCACuts(Double_t pt)
TH1F * fhPt[2]
pt of esd tracks
Double_t GetMass(Bool_t tpcOnly=kFALSE) const
Definition: AliESDtrack.h:98
void SetHistogramsOn(Bool_t b=kFALSE)
TH1F * fhNSigmaToVertex[2]
void SetMaxDCAToVertexZ(Float_t dist=1e10)
ITSClusterRequirement fCutClusterRequirementITS[3]
detailed ITS cluster requirements for (SPD, SDD, SSD)
Bool_t fCutOutDistortedRegionTPC
flag if distorted regions in the TPC should be cut out
void SetEtaRange(Float_t r1=-1e10, Float_t r2=1e10)
static AliESDtrackCuts * GetStandardTPCOnlyTrackCuts()
Float_t fCutMaxC11
max cov. matrix diag. elements (res. y^2)
static Double_t GetLengthInActiveZone(const AliExternalTrackParam *paramT, Double_t deltaY, Double_t deltaZ, Double_t bz, Double_t exbPhi=0, TTreeSRedirector *pcstream=0)
void SetMinDCAToVertexXYPtDep(const char *dist="")
static AliESDtrackCuts * fgMultEstTrackCuts[kNMultEstTrackCuts]
! track cuts used for the multiplicity estimate
#define AliFatal(message)
Definition: AliLog.h:640
virtual Double_t Pt() const =0
Float_t fCutMaxChi2TPCConstrainedVsGlobal
max chi2 TPC track constrained with vtx vs. global track
virtual Long64_t Merge(TCollection *list)
virtual Bool_t IsSelected(TObject *obj)
Double_t GetTOFsignalDx() const
Double_t GetChi2TPCConstrainedVsGlobal() const
Golden chi2.
Definition: AliAODTrack.h:306
void SetAcceptSharedTPCClusters(Bool_t b=kTRUE)
TString fCutMinDCAToVertexXYPtDep
pt-dep track-to-vertex cut on min absolute distance in xy-plane
Bool_t fCutRequireITSStandAlone
require ITS standalone tracks (remove pure SA)
#define AliDebug(logLevel, message)
Definition: AliLog.h:300
void SetESDEvent(const AliESDEvent *evt)
Definition: AliESDtrack.h:471
Float_t fCutMaxDCAToVertexZ
track-to-vertex cut in max absolute distance in z-plane
TH1F * fhEta[2]
eta of esd tracks
const char * GetBeamType() const
Definition: AliESDEvent.h:182
TF1 * ffDTheoretical
theoretical distance to vertex normalized (2d gauss)
Float_t fCutGeoNcrNclFractionNcr
relative fraction cut Ncr condition Ncr>cutGeoNcrNclFractionNcr*fCutGeoNcrNclLength ...
Float_t fCutMaxDCAToVertexXY
track-to-vertex cut in max absolute distance in xy-plane
void SetMinDCAToVertexZPtDep(const char *dist="")
UShort_t GetTPCNclsF() const
Definition: AliESDtrack.h:231
Bool_t AcceptVTrack(const AliVTrack *vTrack)
TH1F * fhNMissingITSPoints[2]
number of missing ITS points
TString fCutMaxDCAToVertexXYPtDep
pt-dep track-to-vertex cut in max absolute distance in xy-plane
const AliESDVertex * GetPrimaryVertexSPD() const
Definition: AliESDEvent.h:307
TObjArray * GetAcceptedTracks(const AliESDEvent *esd, Bool_t bTPC=kFALSE)
AliESDtrackCuts(const Char_t *name="AliESDtrackCuts", const Char_t *title="")
virtual void GetImpactParameters(Float_t &xy, Float_t &z) const
Definition: AliESDtrack.h:448
AliAODVertex * GetProdVertex() const
Definition: AliAODTrack.h:371
static AliESDtrackCuts * GetStandardITSSATrackCuts2010(Bool_t selPrimaries=kTRUE, Bool_t useForPid=kTRUE)
TFormula * f1CutMinNClustersTPCPtDep
pt dependent tpc clusters cut
Int_t GetNumberOfTracks() const
Definition: AliESDEvent.h:536
AliESDtrack * GetTrack(Int_t i) const
Definition: AliESDEvent.h:405
void SetDCAToVertex2D(Bool_t b=kFALSE)
void SetPtRange(Float_t r1=0, Float_t r2=1e10)
virtual ~AliESDtrackCuts()
Float_t fPMax
definition of the range of the P
static AliESDtrack * GetTPCOnlyTrackFromVEvent(const AliVEvent *vEvent, Int_t iTrack)
void SetMinNCrossedRowsTPC(Float_t min=-1)
virtual Bool_t GetStatus() const
Definition: AliVertex.h:44
void SetRequireITSPureStandAlone(Bool_t b=kFALSE)
#define AliError(message)
Definition: AliLog.h:591
Float_t fCutGeoNcrNclFractionNcl
ralative fraction cut Ncr condition Ncl>cutGeoNcrNclFractionNcl
static Float_t GetSigmaToVertexVTrack(const AliVTrack *const vTrack)
void SetCutTOFdistance(Float_t cut)
TCut cut
Definition: MakeGlobalFit.C:75
virtual Double_t Eta() const =0
void SaveHistograms(const Char_t *dir=0)
TH1F * fhRel1PtUncertainty[2]
rel. uncertainty of 1/pt
Bool_t AcceptTrack(const AliESDtrack *esdTrack)
AliESDtrackCuts & operator=(const AliESDtrackCuts &c)
TH1F * fhNClustersForITSPID[2]
number of points in SDD+SSD (ITS PID selection)
UChar_t GetITSClusterMap() const
Definition: AliESDtrack.h:197
Float_t fCutMinDCAToVertexXY
track-to-vertex cut on min absolute distance in xy-plane
virtual const AliVEvent * GetEvent() const
Definition: AliAODTrack.h:366
void SetRapRange(Float_t r1=-1e10, Float_t r2=1e10)
void SetMaxCovDiagonalElements(Float_t c1=1e10, Float_t c2=1e10, Float_t c3=1e10, Float_t c4=1e10, Float_t c5=1e10)
Bool_t fCutSigmaToVertexRequired
cut track if sigma from track-to-vertex could not be calculated
Float_t fCutGeoNcrNclGeom1Pt
1/pt dependence slope cutGeoNcrNclLength:=fCutGeoNcrNclLength-abs(1/pt)^fCutGeoNcrNclGeom1Pt ...
AOD vertex base class.
Definition: AliAODVertex.h:23
static AliESDtrackCuts * GetMultEstTrackCuts(MultEstTrackCuts cut)
const AliESDEvent * GetESDEvent() const
Definition: AliESDtrack.h:468
virtual Float_t GetTPCCrossedRows() const
Definition: AliVTrack.h:108
AOD track implementation of AliVTrack.
Definition: AliAODTrack.h:29
Char_t GetType() const
Definition: AliAODVertex.h:99
void SetMaxNsigmaToVertex(Float_t sigma=1e10)
void SetRequireTOFout(Bool_t b=kFALSE)
Float_t fCutMinDCAToVertexZ
track-to-vertex cut on min absolute distance in z-plane
virtual ULong64_t GetStatus() const =0
UShort_t GetTPCncls(Int_t row0=0, Int_t row1=159) const
Int_t fCutMinNClusterTPC
min number of tpc clusters
void SetMinNClustersITS(Int_t min=-1)
static AliESDtrack * GetTPCOnlyTrack(const AliESDEvent *esd, Int_t iTrack)
static AliESDtrackCuts * GetStandardV0DaughterCuts()
void SetClusterRequirementITS(Detector det, ITSClusterRequirement req=kOff)
void GetExternalCovariance(Double_t cov[15]) const
virtual UChar_t GetITSClusterMap() const =0
virtual Int_t GetNumberOfTracklets() const
TH1F * fhNClustersTPC[2]
Float_t fPxMax
definition of the range of the Px
Float_t fCutNsigmaToVertex
max number of estimated sigma from track-to-vertex