]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliESDtrackCuts.cxx
Coverity Fix 16220
[u/mrichter/AliRoot.git] / ANALYSIS / AliESDtrackCuts.cxx
index 9f94dbabb03e7de1bc55978e6140885690785c5f..eef99d036e90503e8d0bff0d76dd67b9d4ac9d28 100644 (file)
@@ -25,6 +25,8 @@
 #include <TTree.h>
 #include <TCanvas.h>
 #include <TDirectory.h>
+#include <TH2F.h>
+#include <TF1.h>
 
 //____________________________________________________________________
 ClassImp(AliESDtrackCuts)
@@ -32,6 +34,7 @@ ClassImp(AliESDtrackCuts)
 // Cut names
 const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "require TPC refit",
+ "require TPC standalone",
  "require ITS refit",
  "n clusters TPC",
  "n clusters ITS",
@@ -60,7 +63,10 @@ const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "trk-to-vtx min dca z absolute",
  "SPD cluster requirement",
  "SDD cluster requirement",
- "SSD cluster requirement"
+ "SSD cluster requirement",
+ "require ITS stand-alone",
+ "rel 1/pt uncertainty",
+ "require ITS Pid"
 };
 
 //____________________________________________________________________
@@ -74,15 +80,30 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fCutMaxC33(0),
   fCutMaxC44(0),
   fCutMaxC55(0),
+  fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
+  fCutAcceptSharedTPCClusters(0),
+  fCutMaxFractionSharedTPCClusters(0),
   fCutRequireTPCRefit(0),
-  fCutRequireITSRefit(0),
+  fCutRequireTPCStandAlone(0),
+  fCutRequireITSRefit(0), 
+  fCutRequireITSPid(0),
+  fCutRequireITSStandAlone(0),
+  fCutRequireITSpureSA(0),
   fCutNsigmaToVertex(0),
   fCutSigmaToVertexRequired(0),
   fCutMaxDCAToVertexXY(0),
   fCutMaxDCAToVertexZ(0),
   fCutMinDCAToVertexXY(0),
   fCutMinDCAToVertexZ(0),
+  fCutMaxDCAToVertexXYPtDep(""),
+  fCutMaxDCAToVertexZPtDep(""),
+  fCutMinDCAToVertexXYPtDep(""),
+  fCutMinDCAToVertexZPtDep(""),
+  f1CutMaxDCAToVertexXYPtDep(0x0),
+  f1CutMaxDCAToVertexZPtDep(0x0),
+  f1CutMinDCAToVertexXYPtDep(0x0),
+  f1CutMinDCAToVertexZPtDep(0x0),
   fCutDCAToVertex2D(0),
   fPMin(0),
   fPMax(0),
@@ -115,10 +136,15 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   SetMinNClustersITS();
   SetMaxChi2PerClusterTPC();
   SetMaxChi2PerClusterITS();                               
-  SetMaxCovDiagonalElements();                                     
+  SetMaxCovDiagonalElements();
+  SetMaxRel1PtUncertainty();
   SetRequireTPCRefit();
+  SetRequireTPCStandAlone();
   SetRequireITSRefit();
-  SetAcceptKingDaughters();
+  SetRequireITSPid(kFALSE);
+  SetRequireITSStandAlone(kFALSE);
+  SetRequireITSPureStandAlone(kFALSE);
+  SetAcceptKinkDaughters();
   SetMaxNsigmaToVertex();
   SetMaxDCAToVertexXY();
   SetMaxDCAToVertexZ();
@@ -150,15 +176,30 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fCutMaxC33(0),
   fCutMaxC44(0),
   fCutMaxC55(0),
+  fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
+  fCutAcceptSharedTPCClusters(0),
+  fCutMaxFractionSharedTPCClusters(0),
   fCutRequireTPCRefit(0),
+  fCutRequireTPCStandAlone(0),
   fCutRequireITSRefit(0),
+  fCutRequireITSPid(0),
+  fCutRequireITSStandAlone(0),
+  fCutRequireITSpureSA(0),
   fCutNsigmaToVertex(0),
   fCutSigmaToVertexRequired(0),
   fCutMaxDCAToVertexXY(0),
   fCutMaxDCAToVertexZ(0),
   fCutMinDCAToVertexXY(0),
   fCutMinDCAToVertexZ(0),
+  fCutMaxDCAToVertexXYPtDep(""),
+  fCutMaxDCAToVertexZPtDep(""),
+  fCutMinDCAToVertexXYPtDep(""),
+  fCutMinDCAToVertexZPtDep(""),
+  f1CutMaxDCAToVertexXYPtDep(0x0),
+  f1CutMaxDCAToVertexZPtDep(0x0),
+  f1CutMinDCAToVertexXYPtDep(0x0),
+  f1CutMinDCAToVertexZPtDep(0x0),
   fCutDCAToVertex2D(0),
   fPMin(0),
   fPMax(0),
@@ -211,7 +252,10 @@ AliESDtrackCuts::~AliESDtrackCuts()
     if (fhC44[i])
       delete fhC44[i];                     
     if (fhC55[i])
-    delete fhC55[i];                     
+      delete fhC55[i];
+
+    if (fhRel1PtUncertainty[i])
+      delete fhRel1PtUncertainty[i];
     
     if (fhDXY[i])
       delete fhDXY[i];                     
@@ -236,6 +280,16 @@ AliESDtrackCuts::~AliESDtrackCuts()
       delete fhEta[i];
   }
 
+  if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
+  f1CutMaxDCAToVertexXYPtDep = 0;
+  if( f1CutMaxDCAToVertexZPtDep) delete  f1CutMaxDCAToVertexZPtDep;
+  f1CutMaxDCAToVertexZPtDep = 0;
+  if( f1CutMinDCAToVertexXYPtDep)delete  f1CutMinDCAToVertexXYPtDep;
+  f1CutMinDCAToVertexXYPtDep = 0;
+  if(f1CutMinDCAToVertexZPtDep)delete  f1CutMinDCAToVertexZPtDep; 
+  f1CutMinDCAToVertexZPtDep = 0;
+
+
   if (ffDTheoretical)
     delete ffDTheoretical;
 
@@ -265,10 +319,18 @@ void AliESDtrackCuts::Init()
   fCutMaxC33 = 0;
   fCutMaxC44 = 0;
   fCutMaxC55 = 0;
+  
+  fCutMaxRel1PtUncertainty = 0;
 
   fCutAcceptKinkDaughters = 0;
+  fCutAcceptSharedTPCClusters = 0;
+  fCutMaxFractionSharedTPCClusters = 0;
   fCutRequireTPCRefit = 0;
+  fCutRequireTPCStandAlone = 0;
   fCutRequireITSRefit = 0;
+  fCutRequireITSPid = 0;
+  fCutRequireITSStandAlone = 0;
+  fCutRequireITSpureSA = 0;
 
   fCutNsigmaToVertex = 0;
   fCutSigmaToVertexRequired = 0;
@@ -277,6 +339,21 @@ void AliESDtrackCuts::Init()
   fCutDCAToVertex2D = 0;
   fCutMinDCAToVertexXY = 0;
   fCutMinDCAToVertexZ = 0;
+  fCutMaxDCAToVertexXYPtDep = "";
+  fCutMaxDCAToVertexZPtDep = "";
+  fCutMinDCAToVertexXYPtDep = "";
+  fCutMinDCAToVertexZPtDep = "";
+
+  if(f1CutMaxDCAToVertexXYPtDep)delete f1CutMaxDCAToVertexXYPtDep;
+  f1CutMaxDCAToVertexXYPtDep = 0;
+  if( f1CutMaxDCAToVertexXYPtDep) delete  f1CutMaxDCAToVertexXYPtDep;
+  f1CutMaxDCAToVertexXYPtDep = 0;
+  if( f1CutMaxDCAToVertexZPtDep) delete  f1CutMaxDCAToVertexZPtDep;
+  f1CutMaxDCAToVertexZPtDep = 0;
+  if( f1CutMinDCAToVertexXYPtDep)delete  f1CutMinDCAToVertexXYPtDep;
+  f1CutMinDCAToVertexXYPtDep = 0;
+  if(f1CutMinDCAToVertexZPtDep)delete f1CutMinDCAToVertexZPtDep;
+  f1CutMinDCAToVertexZPtDep = 0;
 
   
   fPMin = 0;
@@ -310,6 +387,8 @@ void AliESDtrackCuts::Init()
     fhC44[i] = 0;
     fhC55[i] = 0;
 
+    fhRel1PtUncertainty[i] = 0;
+
     fhDXY[i] = 0;
     fhDZ[i] = 0;
     fhDXYDZ[i] = 0;
@@ -366,9 +445,17 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutMaxC44 = fCutMaxC44;
   target.fCutMaxC55 = fCutMaxC55;
 
+  target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
+
   target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
+  target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
+  target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
   target.fCutRequireTPCRefit = fCutRequireTPCRefit;
+  target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
   target.fCutRequireITSRefit = fCutRequireITSRefit;
+  target.fCutRequireITSPid = fCutRequireITSPid;
+  target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
+  target.fCutRequireITSpureSA = fCutRequireITSpureSA;
 
   target.fCutNsigmaToVertex = fCutNsigmaToVertex;
   target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
@@ -378,6 +465,18 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
   target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
 
+  target.fCutMaxDCAToVertexXYPtDep = fCutMaxDCAToVertexXYPtDep;
+  target.SetMaxDCAToVertexXYPtDep(fCutMaxDCAToVertexXYPtDep.Data());
+
+  target.fCutMaxDCAToVertexZPtDep = fCutMaxDCAToVertexZPtDep;
+  target.SetMaxDCAToVertexZPtDep(fCutMaxDCAToVertexZPtDep.Data());
+
+  target.fCutMinDCAToVertexXYPtDep = fCutMinDCAToVertexXYPtDep;
+  target.SetMinDCAToVertexXYPtDep(fCutMinDCAToVertexXYPtDep.Data());
+
+  target.fCutMinDCAToVertexZPtDep = fCutMinDCAToVertexZPtDep;
+  target.SetMinDCAToVertexZPtDep(fCutMinDCAToVertexZPtDep.Data());
+
   target.fPMin = fPMin;
   target.fPMax = fPMax;
   target.fPtMin = fPtMin;
@@ -409,6 +508,8 @@ void AliESDtrackCuts::Copy(TObject &c) const
     if (fhC44[i]) target.fhC44[i] = (TH1F*) fhC44[i]->Clone();
     if (fhC55[i]) target.fhC55[i] = (TH1F*) fhC55[i]->Clone();
 
+    if (fhRel1PtUncertainty[i]) target.fhRel1PtUncertainty[i] = (TH1F*) fhRel1PtUncertainty[i]->Clone();
+
     if (fhDXY[i]) target.fhDXY[i] = (TH1F*) fhDXY[i]->Clone();
     if (fhDZ[i]) target.fhDZ[i] = (TH1F*) fhDZ[i]->Clone();
     if (fhDXYDZ[i]) target.fhDXYDZ[i] = (TH1F*) fhDXYDZ[i]->Clone();
@@ -466,7 +567,9 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
       fhC22[i]               ->Add(entry->fhC22[i]              ); 
       fhC33[i]               ->Add(entry->fhC33[i]              ); 
       fhC44[i]               ->Add(entry->fhC44[i]              ); 
-      fhC55[i]               ->Add(entry->fhC55[i]              ); 
+      fhC55[i]               ->Add(entry->fhC55[i]              );
+
+      fhRel1PtUncertainty[i] ->Add(entry->fhRel1PtUncertainty[i]);
                                                                    
       fhDXY[i]               ->Add(entry->fhDXY[i]              ); 
       fhDZ[i]                ->Add(entry->fhDZ[i]               ); 
@@ -490,6 +593,205 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
   return count+1;
 }
 
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
+{
+  // creates an AliESDtrackCuts object and fills it with standard (pre data-taking) values for TPC-only cuts
+  
+  Printf("AliESDtrackCuts::GetStandardTPCOnlyTrackCuts: Creating track cuts for TPC-only.");
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+  
+  esdTrackCuts->SetMinNClustersTPC(50);
+  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+  
+  esdTrackCuts->SetMaxDCAToVertexZ(3.2);
+  esdTrackCuts->SetMaxDCAToVertexXY(2.4);
+  esdTrackCuts->SetDCAToVertex2D(kTRUE);
+  
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2009(Bool_t selPrimaries)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2009 data
+  
+  Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+
+  // TPC  
+  esdTrackCuts->SetRequireTPCStandAlone(kTRUE); // to get chi2 and ncls of kTPCin
+  esdTrackCuts->SetMinNClustersTPC(70);
+  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+  esdTrackCuts->SetRequireTPCRefit(kTRUE);
+  // ITS
+  esdTrackCuts->SetRequireITSRefit(kTRUE);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  if(selPrimaries) {
+    // 7*(0.0050+0.0060/pt^0.9)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0350+0.0420/pt^0.9");
+  }
+  esdTrackCuts->SetMaxDCAToVertexZ(1.e6);
+  esdTrackCuts->SetDCAToVertex2D(kFALSE);
+  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
+  //esdTrackCuts->SetEtaRange(-0.8,+0.8);
+  
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSTPCTrackCuts2010(Bool_t selPrimaries)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data
+  
+  Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+
+  // TPC  
+  esdTrackCuts->SetMinNClustersTPC(70);
+  esdTrackCuts->SetMaxChi2PerClusterTPC(4);
+  esdTrackCuts->SetAcceptKinkDaughters(kFALSE);
+  esdTrackCuts->SetRequireTPCRefit(kTRUE);
+  // ITS
+  esdTrackCuts->SetRequireITSRefit(kTRUE);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  if(selPrimaries) {
+    // 7*(0.0026+0.0050/pt^1.01)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0182+0.0350/pt^1.01");
+  }
+  esdTrackCuts->SetMaxDCAToVertexZ(2);
+  esdTrackCuts->SetDCAToVertex2D(kFALSE);
+  esdTrackCuts->SetRequireSigmaToVertex(kFALSE);
+  
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+  esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
+  esdTrackCuts->SetRequireITSRefit(kTRUE); 
+  esdTrackCuts->SetMinNClustersITS(4);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  esdTrackCuts->SetMaxChi2PerClusterITS(1.);
+
+  if(selPrimaries) {
+    // 7*(0.0085+0.0026/pt^1.55)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
+  }
+  if(useForPid){
+    esdTrackCuts->SetRequireITSPid(kTRUE);
+  }
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSPureSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks - pp 2010
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+  esdTrackCuts->SetRequireITSPureStandAlone(kTRUE);
+  esdTrackCuts->SetRequireITSRefit(kTRUE); 
+  esdTrackCuts->SetMinNClustersITS(4);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
+
+  if(selPrimaries) {
+    // 7*(0.0033+0.0045/pt^1.3)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
+  }
+  if(useForPid){
+    esdTrackCuts->SetRequireITSPid(kTRUE);
+  }
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2009(Bool_t selPrimaries, Bool_t useForPid)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+  esdTrackCuts->SetRequireITSStandAlone(kTRUE);
+  esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
+  esdTrackCuts->SetRequireITSRefit(kTRUE); 
+  esdTrackCuts->SetMinNClustersITS(4);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  esdTrackCuts->SetMaxChi2PerClusterITS(1.);
+
+  if(selPrimaries) {
+    // 7*(0.0085+0.0026/pt^1.55)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0595+0.0182/pt^1.55");
+  }
+  if(useForPid){
+    esdTrackCuts->SetRequireITSPid(kTRUE);
+  }
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCuts2010(Bool_t selPrimaries, Bool_t useForPid)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks --pp 2010
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+  esdTrackCuts->SetRequireITSStandAlone(kTRUE);
+  esdTrackCuts->SetRequireITSPureStandAlone(kFALSE);
+  esdTrackCuts->SetRequireITSRefit(kTRUE); 
+  esdTrackCuts->SetMinNClustersITS(4);
+  esdTrackCuts->SetClusterRequirementITS(AliESDtrackCuts::kSPD,
+                                        AliESDtrackCuts::kAny);
+  esdTrackCuts->SetMaxChi2PerClusterITS(2.5);
+
+  if(selPrimaries) {
+    // 7*(0.0033+0.0045/pt^1.3)
+    esdTrackCuts->SetMaxDCAToVertexXYPtDep("0.0231+0.0315/pt^1.3");
+  }
+  if(useForPid){
+    esdTrackCuts->SetRequireITSPid(kTRUE);
+  }
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly)
+{
+  // Gets reference multiplicity following the standard cuts and a defined fiducial volume
+  // tpcOnly = kTRUE -> consider TPC-only tracks
+  //         = kFALSE -> consider global tracks
+  
+  if (!tpcOnly)
+  {
+    Printf("AliESDtrackCuts::GetReferenceMultiplicity: Not implemented for global tracks!");
+    return -1;
+  }
+  
+  static AliESDtrackCuts* esdTrackCuts = 0;
+  if (!esdTrackCuts)
+  {
+    esdTrackCuts = GetStandardTPCOnlyTrackCuts();
+    esdTrackCuts->SetEtaRange(-0.8, 0.8);
+    esdTrackCuts->SetPtRange(0.15);
+  }
+  
+  Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
+  
+  return nTracks;
+}
 
 //____________________________________________________________________
 Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
@@ -516,7 +818,7 @@ Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
   // ->  Erf(d/Sqrt(2)) for a 1-dim gauss (d = n_sigma)
   // ->  1 - Exp(-d**2) for a 2-dim gauss (d*d = dx*dx + dy*dy != n_sigma)
   //
-  // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-x**2)/2)
+  // It means that for a 2-dim gauss: n_sigma(d) = Sqrt(2)*ErfInv(1 - Exp((-d**2)/2)
   // Can this be expressed in a different way?
 
   if (bRes[0] == 0 || bRes[1] ==0)
@@ -555,8 +857,8 @@ void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
 }
 
 //____________________________________________________________________
-Bool_t
-AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
+Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) 
+{
   // 
   // figure out if the tracks survives all the track cuts defined
   //
@@ -585,14 +887,30 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
 
   // getting quality parameters from the ESD track
   Int_t nClustersITS = esdTrack->GetITSclusters(0);
-  Int_t nClustersTPC = esdTrack->GetTPCclusters(0);
+  Int_t nClustersTPC = -1;
+  if(fCutRequireTPCStandAlone) {
+    nClustersTPC = esdTrack->GetTPCNclsIter1();
+  }
+  else {
+    nClustersTPC = esdTrack->GetTPCclusters(0);
+  }
+
+  Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
+  Float_t fracClustersTPCShared = -1.;
 
   Float_t chi2PerClusterITS = -1;
   Float_t chi2PerClusterTPC = -1;
   if (nClustersITS!=0)
     chi2PerClusterITS = esdTrack->GetITSchi2()/Float_t(nClustersITS);
-  if (nClustersTPC!=0)
-    chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
+  if (nClustersTPC!=0) {
+    if(fCutRequireTPCStandAlone) {
+      chi2PerClusterTPC = esdTrack->GetTPCchi2Iter1()/Float_t(nClustersTPC);
+    } else {
+      chi2PerClusterTPC = esdTrack->GetTPCchi2()/Float_t(nClustersTPC);
+    }
+    fracClustersTPCShared = Float_t(nClustersTPCShared)/Float_t(nClustersTPC);
+  }
+
   Double_t extCov[15];
   esdTrack->GetExternalCovariance(extCov);
 
@@ -607,6 +925,11 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
     bCov[0]=0; bCov[2]=0;
   }
 
+
+  // set pt-dependent DCA cuts, if requested
+  SetPtDepDCACuts(esdTrack->Pt());
+
+
   Float_t dcaToVertexXY = b[0];
   Float_t dcaToVertexZ = b[1];
 
@@ -628,7 +951,6 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
   Float_t pt       = TMath::Sqrt(TMath::Power(p[0],2) + TMath::Power(p[1],2));
   Float_t energy   = TMath::Sqrt(TMath::Power(esdTrack->GetMass(),2) + TMath::Power(momentum,2));
 
-
   //y-eta related calculations
   Float_t eta = -100.;
   Float_t y   = -100.;
@@ -636,7 +958,13 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
     eta = 0.5*TMath::Log((momentum + p[2])/(momentum - p[2]));
   if((energy != TMath::Abs(p[2]))&&(momentum != 0))
     y = 0.5*TMath::Log((energy + p[2])/(energy - p[2]));
-
+    
+  if (extCov[14] < 0) 
+  {
+    Printf("AliESDtrackCuts::AcceptTrack: WARNING: GetSigma1Pt2() returns negative value for external covariance matrix element fC[14]: %f. Corrupted track information, track will not be accepted!", extCov[14]);
+    return kFALSE;
+  }
+  Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
   
   //########################################################################
   // cut the track?
@@ -647,70 +975,103 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
   // track quality cuts
   if (fCutRequireTPCRefit && (status&AliESDtrack::kTPCrefit)==0)
     cuts[0]=kTRUE;
-  if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
+  if (fCutRequireTPCStandAlone && (status&AliESDtrack::kTPCin)==0)
     cuts[1]=kTRUE;
-  if (nClustersTPC<fCutMinNClusterTPC)
+  if (fCutRequireITSRefit && (status&AliESDtrack::kITSrefit)==0)
     cuts[2]=kTRUE;
-  if (nClustersITS<fCutMinNClusterITS) 
+  if (nClustersTPC<fCutMinNClusterTPC)
     cuts[3]=kTRUE;
+  if (nClustersITS<fCutMinNClusterITS) 
+    cuts[4]=kTRUE;
   if (chi2PerClusterTPC>fCutMaxChi2PerClusterTPC) 
-    cuts[4]=kTRUE; 
+    cuts[5]=kTRUE; 
   if (chi2PerClusterITS>fCutMaxChi2PerClusterITS) 
-    cuts[5]=kTRUE;
+    cuts[6]=kTRUE;
   if (extCov[0]  > fCutMaxC11) 
-    cuts[6]=kTRUE;  
-  if (extCov[2]  > fCutMaxC22) 
     cuts[7]=kTRUE;  
-  if (extCov[5]  > fCutMaxC33
+  if (extCov[2]  > fCutMaxC22
     cuts[8]=kTRUE;  
-  if (extCov[9]  > fCutMaxC44
+  if (extCov[5]  > fCutMaxC33
     cuts[9]=kTRUE;  
-  if (extCov[14]  > fCutMaxC55
+  if (extCov[9]  > fCutMaxC44
     cuts[10]=kTRUE;  
+  if (extCov[14]  > fCutMaxC55) 
+    cuts[11]=kTRUE;  
   if (nSigmaToVertex > fCutNsigmaToVertex && fCutSigmaToVertexRequired)
-    cuts[11] = kTRUE;
+    cuts[12] = kTRUE;
   // if n sigma could not be calculated
   if (nSigmaToVertex<0 && fCutSigmaToVertexRequired)
-    cuts[12]=kTRUE;
-  if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
     cuts[13]=kTRUE;
+  if (!fCutAcceptKinkDaughters && esdTrack->GetKinkIndex(0)>0)
+    cuts[14]=kTRUE;
   // track kinematics cut
   if((momentum < fPMin) || (momentum > fPMax)) 
-    cuts[14]=kTRUE;
+    cuts[15]=kTRUE;
   if((pt < fPtMin) || (pt > fPtMax)) 
-    cuts[15] = kTRUE;
-  if((p[0] < fPxMin) || (p[0] > fPxMax)) 
     cuts[16] = kTRUE;
-  if((p[1] < fPyMin) || (p[1] > fPyMax)) 
+  if((p[0] < fPxMin) || (p[0] > fPxMax)) 
     cuts[17] = kTRUE;
-  if((p[2] < fPzMin) || (p[2] > fPzMax))
+  if((p[1] < fPyMin) || (p[1] > fPyMax)) 
     cuts[18] = kTRUE;
-  if((eta < fEtaMin) || (eta > fEtaMax))
+  if((p[2] < fPzMin) || (p[2] > fPzMax))
     cuts[19] = kTRUE;
-  if((y < fRapMin) || (y > fRapMax)) 
+  if((eta < fEtaMin) || (eta > fEtaMax))
     cuts[20] = kTRUE;
-  if (fCutDCAToVertex2D && dcaToVertex > 1)
+  if((y < fRapMin) || (y > fRapMax)) 
     cuts[21] = kTRUE;
-  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
+  if (fCutDCAToVertex2D && dcaToVertex > 1)
     cuts[22] = kTRUE;
-  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
     cuts[23] = kTRUE;
-  if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
     cuts[24] = kTRUE;
-  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
+  if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
     cuts[25] = kTRUE;
-  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
     cuts[26] = kTRUE;
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
+    cuts[27] = kTRUE;
   
   for (Int_t i = 0; i < 3; i++)
-    cuts[27+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+    cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+  
+  if(fCutRequireITSStandAlone || fCutRequireITSpureSA){
+    if ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)){
+      // TPC tracks
+      cuts[31] = kTRUE; 
+    }else{
+      // ITS standalone tracks
+      if(fCutRequireITSStandAlone && !fCutRequireITSpureSA){
+       if(status & AliESDtrack::kITSpureSA) cuts[31] = kTRUE;
+      }else if(fCutRequireITSpureSA){
+       if(!(status & AliESDtrack::kITSpureSA)) cuts[31] = kTRUE;
+      }
+    }
+  }
+
+  if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
+     cuts[32] = kTRUE;
+
+  if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
+    cuts[33] = kTRUE;
+
+  if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
+    cuts[34] = kTRUE;  
+
+  if(fCutRequireITSPid){
+    UChar_t clumap=esdTrack->GetITSClusterMap();
+    Int_t nPointsForPid=0;
+    for(Int_t i=2; i<6; i++){
+      if(clumap&(1<<i)) ++nPointsForPid;
+    }
+    if(nPointsForPid<3) cuts[35] = kTRUE;
+  }
 
   Bool_t cut=kFALSE;
   for (Int_t i=0; i<kNCuts; i++) 
     if (cuts[i]) {cut = kTRUE;}
 
 
-
   //########################################################################
   // filling histograms
   if (fHistogramsOn) {
@@ -753,6 +1114,8 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
       fhC44[id]->Fill(extCov[9]);
       fhC55[id]->Fill(extCov[14]);
 
+      fhRel1PtUncertainty[id]->Fill(relUncertainty1Pt);
+
       fhPt[id]->Fill(pt);
       fhEta[id]->Fill(eta);
 
@@ -804,8 +1167,11 @@ Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bo
 //____________________________________________________________________
 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
 {
-  // creates a TPC only track from the given esd track
-  // the track has to be deleted by the user
+  
+  // Utility function to 
+  // create a TPC only track from the given esd track
+  // 
+  // IMPORTANT: The track has to be deleted by the user
   //
   // NB. most of the functionality to get a TPC only track from an ESD track is in AliESDtrack, where it should be
   // there are only missing propagations here that are needed for old data
@@ -825,15 +1191,6 @@ AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
 
   AliESDtrack *tpcTrack = new AliESDtrack();
 
-  // This should have been done during the reconstruction
-  // fixed by Juri in r26675
-  // but recalculate for older data CKB
-  Float_t p[2],cov[3];
-  track->GetImpactParametersTPC(p,cov);
-  if(p[0]==0&&p[1]==0)
-    track->RelateToVertexTPC(esd->GetPrimaryVertexTPC(),esd->GetMagneticField(),kVeryBig);
-  // BKC
-
   // only true if we have a tpc track
   if (!track->FillTPCOnlyTrack(*tpcTrack))
   {
@@ -949,6 +1306,8 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
     fhC44[i]                 = new TH1F("covMatrixDiagonal44","",1000,0,0.1);
     fhC55[i]                 = new TH1F("covMatrixDiagonal55","",1000,0,5);
 
+    fhRel1PtUncertainty[i]   = new TH1F("rel1PtUncertainty","",1000,0,5);
+
     fhDXY[i]                 = new TH1F("dXY"    ,"",500,-10,10);
     fhDZ[i]                  = new TH1F("dZ"     ,"",500,-10,10);
     fhDXYDZ[i]               = new TH1F("dXYDZ"  ,"",500,0,10);
@@ -974,6 +1333,8 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
     fhC44[i]->SetTitle("cov 44 : #sigma_{tan(#theta_{dip})}^{2}");
     fhC55[i]->SetTitle("cov 55 : #sigma_{1/p_{T}}^{2} [(c/GeV)^2]");
 
+    fhRel1PtUncertainty[i]->SetTitle("rel. uncertainty of 1/p_{T}");
+
     fhDXY[i]->SetXTitle("transverse impact parameter (cm)");
     fhDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
     fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2)  (cm)");
@@ -997,6 +1358,8 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
     fhC44[i]->SetLineColor(color);   fhC44[i]->SetLineWidth(2);
     fhC55[i]->SetLineColor(color);   fhC55[i]->SetLineWidth(2);
 
+    fhRel1PtUncertainty[i]->SetLineColor(color); fhRel1PtUncertainty[i]->SetLineWidth(2);
+
     fhDXY[i]->SetLineColor(color);   fhDXY[i]->SetLineWidth(2);
     fhDZ[i]->SetLineColor(color);    fhDZ[i]->SetLineWidth(2);
     fhDXYDZ[i]->SetLineColor(color); fhDXYDZ[i]->SetLineWidth(2);
@@ -1051,6 +1414,8 @@ Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
     fhC44[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal44"));
     fhC55[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal55"));
 
+    fhRel1PtUncertainty[i] = dynamic_cast<TH1F*> (gDirectory->Get("rel1PtUncertainty"));
+
     fhDXY[i] =     dynamic_cast<TH1F*> (gDirectory->Get("dXY"    ));
     fhDZ[i] =      dynamic_cast<TH1F*> (gDirectory->Get("dZ"     ));
     fhDXYDZ[i] =   dynamic_cast<TH1F*> (gDirectory->Get("dXYDZ"));
@@ -1116,6 +1481,8 @@ void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
     fhC44[i]                 ->Write();
     fhC55[i]                 ->Write();
 
+    fhRel1PtUncertainty[i]   ->Write();
+
     fhDXY[i]                 ->Write();
     fhDZ[i]                  ->Write();
     fhDXYDZ[i]               ->Write();
@@ -1186,6 +1553,11 @@ void AliESDtrackCuts::DrawHistograms()
   gPad->SetLogy();
   fhC55[0]->Draw();
 
+  canvas2->cd(6);
+  fhRel1PtUncertainty[0]->SetStats(kFALSE);
+  gPad->SetLogy();
+  fhRel1PtUncertainty[0]->Draw();
+
   canvas2->SaveAs(Form("%s_%s.gif", GetName(), canvas2->GetName()));
 
   TCanvas* canvas3 = new TCanvas(Form("%s_3", GetName()), "Track Quality Results3", 1200, 800);
@@ -1263,57 +1635,118 @@ void AliESDtrackCuts::DrawHistograms()
   fhChi2PerClusterTPC[1]->SetLineColor(2);
   fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
 }
+//--------------------------------------------------------------------------
+void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
+  //
+  // set the pt-dependent DCA cuts
+  //
 
-Float_t AliESDtrackCuts::GetMinNsigmaToVertex() const
-{
-  // deprecated, please use GetMaxNsigmaToVertex
+  if(f1CutMaxDCAToVertexXYPtDep) {
+     fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
+  }
+
+  if(f1CutMaxDCAToVertexZPtDep) {
+    fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
+  }
 
-  Printf("WARNING: AliESDtrackCuts::GetMinNsigmaToVertex is DEPRECATED and will be removed in the next release. Please use GetMaxNsigmaToVertex instead. Renaming was done to improve code readability.");
+  if(f1CutMinDCAToVertexXYPtDep) {
+    fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
+  }
 
-  return GetMaxNsigmaToVertex();
+  if(f1CutMinDCAToVertexZPtDep) {
+    fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
+  }
+
+
+  return;
 }
 
-void AliESDtrackCuts::SetMinNsigmaToVertex(Float_t sigma)
-{
-  // deprecated, will be removed in next release
 
-  Printf("WARNING: AliESDtrackCuts::SetMinNsigmaToVertex is DEPRECATED and will be removed in the next release. Please use SetMaxNsigmaToVertex instead. Renaming was done to improve code readability.");
-  
-  SetMaxNsigmaToVertex(sigma);
+
+//--------------------------------------------------------------------------
+Bool_t AliESDtrackCuts::CheckPtDepDCA(TString dist,Bool_t print) const {
+  //
+  // Check the correctness of the string syntax
+  //
+  Bool_t retval=kTRUE;
+
+  if(!dist.Contains("pt")) {
+    if(print) printf("AliESDtrackCuts::CheckPtDepDCA(): string must contain \"pt\"\n");
+    retval= kFALSE;
+  } 
+  return retval;
 }
 
-void AliESDtrackCuts::SetDCAToVertex(Float_t dist)
-{
-  // deprecated, will be removed in next release
+ void AliESDtrackCuts::SetMaxDCAToVertexXYPtDep(const char *dist){
 
-  SetMaxDCAToVertex(dist);
+   if(f1CutMaxDCAToVertexXYPtDep){
+     delete f1CutMaxDCAToVertexXYPtDep;
+     // resetiing both
+     f1CutMaxDCAToVertexXYPtDep = 0;
+     fCutMaxDCAToVertexXYPtDep = "";
+   }
+   if(!CheckPtDepDCA(dist,kTRUE)){
+     return;
+   }  
+   fCutMaxDCAToVertexXYPtDep = dist;
+   TString tmp(dist);
+   tmp.ReplaceAll("pt","x");
+   f1CutMaxDCAToVertexXYPtDep = new TFormula("f1CutMaxDCAToVertexXYPtDep",tmp.Data());
 }
-  
-void AliESDtrackCuts::SetMaxDCAToVertex(Float_t dist)
-{
-  // deprecated, will be removed in next release
-  
-  Printf("WARNING: AliESDtrackCuts::SetMaxDCAToVertex is DEPRECATED and will be removed in the next release. Please use SetDCAToVertexXY(dist) and SetDCAToVertexZ(dist) and SetDCAToVertex2D(kTRUE)");
-  
-  SetDCAToVertexXY(dist);
-  SetDCAToVertexZ(dist);
-  SetDCAToVertex2D(kTRUE);
+
+ void AliESDtrackCuts::SetMaxDCAToVertexZPtDep(const char *dist){
+
+
+   if(f1CutMaxDCAToVertexZPtDep){
+     delete f1CutMaxDCAToVertexZPtDep;
+     // resetiing both
+     f1CutMaxDCAToVertexZPtDep = 0;
+     fCutMaxDCAToVertexZPtDep = "";
+   }
+   if(!CheckPtDepDCA(dist,kTRUE))return;
+     
+   fCutMaxDCAToVertexZPtDep = dist;
+   TString tmp(dist);
+   tmp.ReplaceAll("pt","x");
+   f1CutMaxDCAToVertexZPtDep = new TFormula("f1CutMaxDCAToVertexZPtDep",tmp.Data());
+
+   
 }
 
-void AliESDtrackCuts::SetDCAToVertexXY(Float_t dist)
-{
-  // deprecated, will be removed in next release
 
-  Printf("WARNING: AliESDtrackCuts::SetDCAToVertexXY is DEPRECATED and will be removed in the next release. Please use SetMaxDCAToVertexXY instead. Renaming was done to improve code readability.");
-  
-  SetMaxDCAToVertexXY(dist);
+ void AliESDtrackCuts::SetMinDCAToVertexXYPtDep(const char *dist){
+
+
+   if(f1CutMinDCAToVertexXYPtDep){
+     delete f1CutMinDCAToVertexXYPtDep;
+     // resetiing both
+     f1CutMinDCAToVertexXYPtDep = 0;
+     fCutMinDCAToVertexXYPtDep = "";
+   }
+   if(!CheckPtDepDCA(dist,kTRUE))return;
+
+   fCutMinDCAToVertexXYPtDep = dist;
+   TString tmp(dist);
+   tmp.ReplaceAll("pt","x");
+   f1CutMinDCAToVertexXYPtDep = new TFormula("f1CutMinDCAToVertexXYPtDep",tmp.Data());
+
 }
-  
-void AliESDtrackCuts::SetDCAToVertexZ(Float_t dist)
-{
-  // deprecated, will be removed in next release
 
-  Printf("WARNING: AliESDtrackCuts::SetDCAToVertexZ is DEPRECATED and will be removed in the next release. Please use SetMaxDCAToVertexZ instead. Renaming was done to improve code readability.");
-  
-  SetMaxDCAToVertexZ(dist);
+
+ void AliESDtrackCuts::SetMinDCAToVertexZPtDep(const char *dist){
+
+   
+
+   if(f1CutMinDCAToVertexZPtDep){
+     delete f1CutMinDCAToVertexZPtDep;
+     // resetiing both
+     f1CutMinDCAToVertexZPtDep = 0;
+     fCutMinDCAToVertexZPtDep = "";
+   }
+   if(!CheckPtDepDCA(dist,kTRUE))return;
+   fCutMinDCAToVertexZPtDep = dist;
+   TString tmp(dist);
+   tmp.ReplaceAll("pt","x");
+   f1CutMinDCAToVertexZPtDep = new TFormula("f1CutMinDCAToVertexZPtDep",tmp.Data());
 }