]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliESDtrackCuts.cxx
Doxygen documentation fixes
[u/mrichter/AliRoot.git] / ANALYSIS / AliESDtrackCuts.cxx
index 8c142a131de207670fd24fe5856ee09e58d04f70..9cc2650df616d8ec7009f1199863e1c5a48ee136 100644 (file)
@@ -65,15 +65,24 @@ const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "SDD cluster requirement",
  "SSD cluster requirement",
  "require ITS stand-alone",
- "rel 1/pt uncertainty"
+ "rel 1/pt uncertainty",
+ "TPC n shared clusters",
+ "TPC rel shared clusters",
+ "require ITS Pid",
+ "n crossed rows TPC",
+ "n crossed rows / n findable clusters",
+ "missing ITS points"
 };
 
 //____________________________________________________________________
 AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliAnalysisCuts(name,title),
   fCutMinNClusterTPC(0),
   fCutMinNClusterITS(0),
+  fCutMinNCrossedRowsTPC(0),
+  fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
   fCutMaxChi2PerClusterTPC(0),
   fCutMaxChi2PerClusterITS(0),
+  fCutMaxMissingITSPoints(0),
   fCutMaxC11(0),
   fCutMaxC22(0),
   fCutMaxC33(0),
@@ -85,14 +94,24 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fCutMaxFractionSharedTPCClusters(0),
   fCutRequireTPCRefit(0),
   fCutRequireTPCStandAlone(0),
-  fCutRequireITSRefit(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),
@@ -123,15 +142,22 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   // setting default cuts
   SetMinNClustersTPC();
   SetMinNClustersITS();
+  SetMinNCrossedRowsTPC();
+  SetMinRatioCrossedRowsOverFindableClustersTPC();
   SetMaxChi2PerClusterTPC();
   SetMaxChi2PerClusterITS();                               
+  SetMaxNOfMissingITSPoints();
   SetMaxCovDiagonalElements();
   SetMaxRel1PtUncertainty();
   SetRequireTPCRefit();
   SetRequireTPCStandAlone();
   SetRequireITSRefit();
+  SetRequireITSPid(kFALSE);
   SetRequireITSStandAlone(kFALSE);
+  SetRequireITSPureStandAlone(kFALSE);
   SetAcceptKinkDaughters();
+  SetAcceptSharedTPCClusters();
+  SetMaxFractionSharedTPCClusters();
   SetMaxNsigmaToVertex();
   SetMaxDCAToVertexXY();
   SetMaxDCAToVertexZ();
@@ -156,8 +182,11 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
 AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fCutMinNClusterTPC(0),
   fCutMinNClusterITS(0),
+  fCutMinNCrossedRowsTPC(0),
+  fCutMinRatioCrossedRowsOverFindableClustersTPC(0),
   fCutMaxChi2PerClusterTPC(0),
   fCutMaxChi2PerClusterITS(0),
+  fCutMaxMissingITSPoints(0),
   fCutMaxC11(0),
   fCutMaxC22(0),
   fCutMaxC33(0),
@@ -170,13 +199,23 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   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),
@@ -216,10 +255,20 @@ AliESDtrackCuts::~AliESDtrackCuts()
       delete fhNClustersITS[i];            
     if (fhNClustersTPC[i])
       delete fhNClustersTPC[i];                
+    if (fhNSharedClustersTPC[i])
+      delete fhNSharedClustersTPC[i];                
+    if (fhNCrossedRowsTPC[i])
+      delete fhNCrossedRowsTPC[i];                
+    if (fhRatioCrossedRowsOverFindableClustersTPC[i])
+      delete fhRatioCrossedRowsOverFindableClustersTPC[i];                
     if (fhChi2PerClusterITS[i])
       delete fhChi2PerClusterITS[i];       
     if (fhChi2PerClusterTPC[i])
-      delete fhChi2PerClusterTPC[i];       
+      delete fhChi2PerClusterTPC[i];    
+    if(fhNClustersForITSPID[i])
+      delete fhNClustersForITSPID[i];
+    if(fhNMissingITSPoints[i])
+      delete fhNMissingITSPoints[i];
     if (fhC11[i])
       delete fhC11[i];                     
     if (fhC22[i])
@@ -257,6 +306,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;
 
@@ -277,6 +336,7 @@ void AliESDtrackCuts::Init()
 
   fCutMaxChi2PerClusterTPC = 0;
   fCutMaxChi2PerClusterITS = 0;
+  fCutMaxMissingITSPoints  = 0;
   
   for (Int_t i = 0; i < 3; i++)
        fCutClusterRequirementITS[i] = kOff;
@@ -295,7 +355,9 @@ void AliESDtrackCuts::Init()
   fCutRequireTPCRefit = 0;
   fCutRequireTPCStandAlone = 0;
   fCutRequireITSRefit = 0;
+  fCutRequireITSPid = 0;
   fCutRequireITSStandAlone = 0;
+  fCutRequireITSpureSA = 0;
 
   fCutNsigmaToVertex = 0;
   fCutSigmaToVertexRequired = 0;
@@ -304,6 +366,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;
@@ -327,9 +404,14 @@ void AliESDtrackCuts::Init()
   {
     fhNClustersITS[i] = 0;
     fhNClustersTPC[i] = 0;
+    fhNSharedClustersTPC[i] = 0;
+    fhNCrossedRowsTPC[i] = 0;
+    fhRatioCrossedRowsOverFindableClustersTPC[i] = 0;
 
     fhChi2PerClusterITS[i] = 0;
     fhChi2PerClusterTPC[i] = 0;
+    fhNClustersForITSPID[i] = 0;
+    fhNMissingITSPoints[i] = 0;
 
     fhC11[i] = 0;
     fhC22[i] = 0;
@@ -382,9 +464,13 @@ void AliESDtrackCuts::Copy(TObject &c) const
 
   target.fCutMinNClusterTPC = fCutMinNClusterTPC;
   target.fCutMinNClusterITS = fCutMinNClusterITS;
+  target.fCutMinNCrossedRowsTPC = fCutMinNCrossedRowsTPC;
+  target.fCutMinRatioCrossedRowsOverFindableClustersTPC = fCutMinRatioCrossedRowsOverFindableClustersTPC;
+
 
   target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
   target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
+  target.fCutMaxMissingITSPoints = fCutMaxMissingITSPoints;
 
   for (Int_t i = 0; i < 3; i++)
     target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
@@ -403,7 +489,9 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutRequireTPCRefit = fCutRequireTPCRefit;
   target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
   target.fCutRequireITSRefit = fCutRequireITSRefit;
+  target.fCutRequireITSPid = fCutRequireITSPid;
   target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
+  target.fCutRequireITSpureSA = fCutRequireITSpureSA;
 
   target.fCutNsigmaToVertex = fCutNsigmaToVertex;
   target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
@@ -413,6 +501,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;
@@ -434,9 +534,14 @@ void AliESDtrackCuts::Copy(TObject &c) const
   {
     if (fhNClustersITS[i]) target.fhNClustersITS[i] = (TH1F*) fhNClustersITS[i]->Clone();
     if (fhNClustersTPC[i]) target.fhNClustersTPC[i] = (TH1F*) fhNClustersTPC[i]->Clone();
+    if (fhNSharedClustersTPC[i]) target.fhNSharedClustersTPC[i] = (TH1F*) fhNSharedClustersTPC[i]->Clone();
+    if (fhNCrossedRowsTPC[i]) target.fhNCrossedRowsTPC[i] = (TH1F*) fhNCrossedRowsTPC[i]->Clone();
+    if (fhRatioCrossedRowsOverFindableClustersTPC[i]) target.fhRatioCrossedRowsOverFindableClustersTPC[i] = (TH1F*) fhRatioCrossedRowsOverFindableClustersTPC[i]->Clone();
 
     if (fhChi2PerClusterITS[i]) target.fhChi2PerClusterITS[i] = (TH1F*) fhChi2PerClusterITS[i]->Clone();
     if (fhChi2PerClusterTPC[i]) target.fhChi2PerClusterTPC[i] = (TH1F*) fhChi2PerClusterTPC[i]->Clone();
+    if (fhNClustersForITSPID[i]) target.fhNClustersForITSPID[i] = (TH1F*) fhNClustersForITSPID[i]->Clone();
+    if (fhNMissingITSPoints[i]) target.fhNMissingITSPoints[i] = (TH1F*) fhNMissingITSPoints[i]->Clone();
 
     if (fhC11[i]) target.fhC11[i] = (TH1F*) fhC11[i]->Clone();
     if (fhC22[i]) target.fhC22[i] = (TH1F*) fhC22[i]->Clone();
@@ -495,10 +600,20 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
       
       fhNClustersITS[i]      ->Add(entry->fhNClustersITS[i]     );      
       fhNClustersTPC[i]      ->Add(entry->fhNClustersTPC[i]     ); 
+      if (fhNSharedClustersTPC[i])
+        fhNSharedClustersTPC[i]      ->Add(entry->fhNSharedClustersTPC[i]     ); 
+      if (fhNCrossedRowsTPC[i])
+        fhNCrossedRowsTPC[i]   ->Add(entry->fhNCrossedRowsTPC[i]     ); 
+      if (fhRatioCrossedRowsOverFindableClustersTPC[i])
+        fhRatioCrossedRowsOverFindableClustersTPC[i]      ->Add(entry->fhRatioCrossedRowsOverFindableClustersTPC[i]     ); 
                                                                    
       fhChi2PerClusterITS[i] ->Add(entry->fhChi2PerClusterITS[i]); 
       fhChi2PerClusterTPC[i] ->Add(entry->fhChi2PerClusterTPC[i]); 
-                                                                   
+      if (fhNClustersForITSPID[i])
+       fhNClustersForITSPID[i]->Add(entry->fhNClustersForITSPID[i]);
+      if (fhNMissingITSPoints[i])
+       fhNMissingITSPoints[i] ->Add(entry->fhNMissingITSPoints[i]);
+
       fhC11[i]               ->Add(entry->fhC11[i]              ); 
       fhC22[i]               ->Add(entry->fhC22[i]              ); 
       fhC33[i]               ->Add(entry->fhC33[i]              ); 
@@ -532,8 +647,7 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
 //____________________________________________________________________
 AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
 {
-  // creates an AliESDtrackCuts object and fills it with standard values for TPC-only cuts
-  // see ALICE note: ...
+  // 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.");
   
@@ -551,7 +665,187 @@ AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
 }
 
 //____________________________________________________________________
-Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly)
+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,Int_t clusterCut)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS-TPC cuts for pp 2010 data  
+  // if clusterCut = 1, the cut on the number of clusters is replaced by
+  // a cut on the number of crossed rows and on the ration crossed
+  // rows/findable clusters
+
+  Printf("AliESDtrackCuts::GetStandardITSTPCTrackCuts: Creating track cuts for ITS+TPC.");
+  
+  AliESDtrackCuts* esdTrackCuts = new AliESDtrackCuts;
+
+  // TPC  
+  if(clusterCut == 0)  esdTrackCuts->SetMinNClustersTPC(70);
+  else if (clusterCut == 1) {
+    esdTrackCuts->SetMinNCrossedRowsTPC(70);
+    esdTrackCuts->SetMinRatioCrossedRowsOverFindableClustersTPC(0.8);
+  }
+  else {
+    Printf("Wrong value of the clusterCut parameter (%d), using cut on Nclusters",clusterCut);
+    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;
+}
+
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardITSSATrackCutsPbPb2010(Bool_t selPrimaries, Bool_t useForPid)
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for ITS pure SA tracks -- PbPb 2010
+  
+  AliESDtrackCuts* esdTrackCuts = GetStandardITSSATrackCuts2010(selPrimaries, useForPid);
+  esdTrackCuts->SetMaxNOfMissingITSPoints(1);
+
+  return esdTrackCuts;
+}
+
+//____________________________________________________________________
+Int_t AliESDtrackCuts::GetReferenceMultiplicity(const AliESDEvent* esd, Bool_t tpcOnly)
 {
   // Gets reference multiplicity following the standard cuts and a defined fiducial volume
   // tpcOnly = kTRUE -> consider TPC-only tracks
@@ -563,20 +857,21 @@ Int_t AliESDtrackCuts::GetReferenceMultiplicity(AliESDEvent* esd, Bool_t tpcOnly
     return -1;
   }
   
-  AliESDtrackCuts* esdTrackCuts = GetStandardTPCOnlyTrackCuts();
-  esdTrackCuts->SetEtaRange(-0.8, 0.8);
-  esdTrackCuts->SetPtRange(0.15);
+  static AliESDtrackCuts* esdTrackCuts = 0;
+  if (!esdTrackCuts)
+  {
+    esdTrackCuts = GetStandardTPCOnlyTrackCuts();
+    esdTrackCuts->SetEtaRange(-0.8, 0.8);
+    esdTrackCuts->SetPtRange(0.15);
+  }
   
   Int_t nTracks = esdTrackCuts->CountAcceptedTracks(esd);
   
-  delete esdTrackCuts;
-  esdTrackCuts = 0;
-  
   return nTracks;
 }
 
 //____________________________________________________________________
-Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
+Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* const esdTrack)
 {
   // Calculates the number of sigma to the vertex.
 
@@ -676,7 +971,12 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
   else {
     nClustersTPC = esdTrack->GetTPCclusters(0);
   }
-
+  Float_t nCrossedRowsTPC = esdTrack->GetTPCClusterInfo(2,1); 
+  Float_t  ratioCrossedRowsOverFindableClustersTPC = 1.0;
+  if (esdTrack->GetTPCNclsF()>0) {
+    ratioCrossedRowsOverFindableClustersTPC = nCrossedRowsTPC / esdTrack->GetTPCNclsF();
+  }
+  
   Int_t nClustersTPCShared = esdTrack->GetTPCnclsS();
   Float_t fracClustersTPCShared = -1.;
 
@@ -707,6 +1007,11 @@ Bool_t 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];
 
@@ -812,9 +1117,20 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
   for (Int_t i = 0; i < 3; i++)
     cuts[28+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
   
-  if (fCutRequireITSStandAlone && ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)))
-    cuts[31] = kTRUE;
-  
+  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;
 
@@ -824,6 +1140,28 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
   if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
     cuts[34] = kTRUE;  
 
+  Int_t nITSPointsForPid=0;
+  UChar_t clumap=esdTrack->GetITSClusterMap();
+  for(Int_t i=2; i<6; i++){
+    if(clumap&(1<<i)) ++nITSPointsForPid;
+  }
+  if(fCutRequireITSPid && nITSPointsForPid<3) cuts[35] = kTRUE;
+  
+
+  if (nCrossedRowsTPC<fCutMinNCrossedRowsTPC)
+    cuts[36]=kTRUE;
+  if (ratioCrossedRowsOverFindableClustersTPC<fCutMinRatioCrossedRowsOverFindableClustersTPC) 
+    cuts[37]=kTRUE;
+
+  Int_t nMissITSpts=0;
+  Int_t idet,statusLay;
+  Float_t xloc,zloc;
+  for(Int_t iLay=0; iLay<6; iLay++){
+    Bool_t retc=esdTrack->GetITSModuleIndexInfo(iLay,idet,statusLay,xloc,zloc);
+    if(retc && statusLay==5) ++nMissITSpts;
+  }
+  if(nMissITSpts>fCutMaxMissingITSPoints) cuts[38] = kTRUE;
+
   Bool_t cut=kFALSE;
   for (Int_t i=0; i<kNCuts; i++) 
     if (cuts[i]) {cut = kTRUE;}
@@ -837,6 +1175,9 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
       fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin("n cut tracks")));
     
     for (Int_t i=0; i<kNCuts; i++) {
+      if (fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i]) < 1)
+        AliFatal(Form("Inconsistency! Cut %d with name %s not found", i, fgkCutNames[i]));
+    
       if (cuts[i])
         fhCutStatistics->Fill(fhCutStatistics->GetBinCenter(fhCutStatistics->GetXaxis()->FindBin(fgkCutNames[i])));
 
@@ -849,7 +1190,7 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
       }
     }
   }
-
+  
   // now we loop over the filling of the histograms twice: once "before" the cut, once "after"
   // the code is not in a function due to too many local variables that would need to be passed
 
@@ -862,8 +1203,13 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
     {
       fhNClustersITS[id]->Fill(nClustersITS);
       fhNClustersTPC[id]->Fill(nClustersTPC);
+      fhNSharedClustersTPC[id]->Fill(nClustersTPCShared);
+      fhNCrossedRowsTPC[id]->Fill(nCrossedRowsTPC);
+      fhRatioCrossedRowsOverFindableClustersTPC[id]->Fill(ratioCrossedRowsOverFindableClustersTPC);
       fhChi2PerClusterITS[id]->Fill(chi2PerClusterITS);
       fhChi2PerClusterTPC[id]->Fill(chi2PerClusterTPC);
+      fhNClustersForITSPID[id]->Fill(nITSPointsForPid);
+      fhNMissingITSPoints[id]->Fill(nMissITSpts);
 
       fhC11[id]->Fill(extCov[0]);
       fhC22[id]->Fill(extCov[2]);
@@ -970,6 +1316,8 @@ TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
   // returns an array of all tracks that pass the cuts
   // or an array of TPC only tracks (propagated to the TPC vertex during reco)
   // tracks that pass the cut
+  //
+  // NOTE: List has to be deleted by the user
 
   TObjArray* acceptedTracks = new TObjArray();
 
@@ -1001,7 +1349,7 @@ TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
 }
 
 //____________________________________________________________________
-Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
+Int_t AliESDtrackCuts::CountAcceptedTracks(const AliESDEvent* const esd)
 {
   //
   // returns an the number of tracks that pass the cuts
@@ -1054,8 +1402,13 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
   for (Int_t i=0; i<2; i++) {
     fhNClustersITS[i]        = new TH1F("nClustersITS"    ,"",8,-0.5,7.5);
     fhNClustersTPC[i]        = new TH1F("nClustersTPC"     ,"",165,-0.5,164.5);
+    fhNSharedClustersTPC[i]  = new TH1F("nSharedClustersTPC"     ,"",165,-0.5,164.5);
+    fhNCrossedRowsTPC[i]     = new TH1F("nCrossedRowsTPC"  ,"",165,-0.5,164.5);
+    fhRatioCrossedRowsOverFindableClustersTPC[i]     = new TH1F("ratioCrossedRowsOverFindableClustersTPC"  ,"",60,0,1.5);
     fhChi2PerClusterITS[i]   = new TH1F("chi2PerClusterITS","",500,0,10);
     fhChi2PerClusterTPC[i]   = new TH1F("chi2PerClusterTPC","",500,0,10);
+    fhNClustersForITSPID[i]  = new TH1F("nPointsForITSpid","",5,-0.5,4.5);
+    fhNMissingITSPoints[i]   = new TH1F("nMissingITSClusters","",7,-0.5,6.5);
 
     fhC11[i]                 = new TH1F("covMatrixDiagonal11","",2000,0,20);
     fhC22[i]                 = new TH1F("covMatrixDiagonal22","",2000,0,20);
@@ -1081,8 +1434,11 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
     
     fhNClustersITS[i]->SetTitle("n ITS clusters");
     fhNClustersTPC[i]->SetTitle("n TPC clusters");
+    fhNSharedClustersTPC[i]->SetTitle("n TPC shared clusters");
     fhChi2PerClusterITS[i]->SetTitle("#Chi^{2} per ITS cluster");
     fhChi2PerClusterTPC[i]->SetTitle("#Chi^{2} per TPC cluster");
+    fhNClustersForITSPID[i]->SetTitle("n ITS points for PID");
+    fhNMissingITSPoints[i]->SetTitle("n ITS layers with missing cluster");
 
     fhC11[i]->SetTitle("cov 11 : #sigma_{y}^{2} [cm^{2}]");
     fhC22[i]->SetTitle("cov 22 : #sigma_{z}^{2} [cm^{2}]");
@@ -1106,8 +1462,11 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
 
     fhNClustersITS[i]->SetLineColor(color);   fhNClustersITS[i]->SetLineWidth(2);
     fhNClustersTPC[i]->SetLineColor(color);   fhNClustersTPC[i]->SetLineWidth(2);
+    fhNSharedClustersTPC[i]->SetLineColor(color);  fhNSharedClustersTPC[i]->SetLineWidth(2);
     fhChi2PerClusterITS[i]->SetLineColor(color);   fhChi2PerClusterITS[i]->SetLineWidth(2);
     fhChi2PerClusterTPC[i]->SetLineColor(color);   fhChi2PerClusterTPC[i]->SetLineWidth(2);
+    fhNClustersForITSPID[i]->SetLineColor(color);  fhNClustersForITSPID[i]->SetLineWidth(2);
+    fhNMissingITSPoints[i]->SetLineColor(color);   fhNMissingITSPoints[i]->SetLineWidth(2);
 
     fhC11[i]->SetLineColor(color);   fhC11[i]->SetLineWidth(2);
     fhC22[i]->SetLineColor(color);   fhC22[i]->SetLineWidth(2);
@@ -1162,8 +1521,13 @@ Bool_t AliESDtrackCuts::LoadHistograms(const Char_t* dir)
 
     fhNClustersITS[i]      = dynamic_cast<TH1F*> (gDirectory->Get("nClustersITS"     ));
     fhNClustersTPC[i]      = dynamic_cast<TH1F*> (gDirectory->Get("nClustersTPC"     ));
+    fhNSharedClustersTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("nSharedClustersTPC"     ));
+    fhNCrossedRowsTPC[i]   = dynamic_cast<TH1F*> (gDirectory->Get("nCrossedRowsTPC"  ));
+    fhRatioCrossedRowsOverFindableClustersTPC[i]   = dynamic_cast<TH1F*> (gDirectory->Get("ratioCrossedRowsOverFindableClustersTPC"  ));
     fhChi2PerClusterITS[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterITS"));
     fhChi2PerClusterTPC[i] = dynamic_cast<TH1F*> (gDirectory->Get("chi2PerClusterTPC"));
+    fhNClustersForITSPID[i] = dynamic_cast<TH1F*> (gDirectory->Get("nPointsForITSpid"));
+    fhNMissingITSPoints[i] = dynamic_cast<TH1F*> (gDirectory->Get("nMissingITSClusters"));
 
     fhC11[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal11"));
     fhC22[i] = dynamic_cast<TH1F*> (gDirectory->Get("covMatrixDiagonal22"));
@@ -1229,8 +1593,13 @@ void AliESDtrackCuts::SaveHistograms(const Char_t* dir) {
 
     fhNClustersITS[i]        ->Write();
     fhNClustersTPC[i]        ->Write();
+    fhNSharedClustersTPC[i]  ->Write();
+    fhNCrossedRowsTPC[i]     ->Write();
+    fhRatioCrossedRowsOverFindableClustersTPC[i]     ->Write();
     fhChi2PerClusterITS[i]   ->Write();
     fhChi2PerClusterTPC[i]   ->Write();
+    fhNClustersForITSPID[i]  ->Write();
+    fhNMissingITSPoints[i]   ->Write();
 
     fhC11[i]                 ->Write();
     fhC22[i]                 ->Write();
@@ -1392,4 +1761,118 @@ void AliESDtrackCuts::DrawHistograms()
   fhChi2PerClusterTPC[1]->SetLineColor(2);
   fhChi2PerClusterTPC[1]->DrawCopy("SAME");*/
 }
+//--------------------------------------------------------------------------
+void AliESDtrackCuts::SetPtDepDCACuts(Double_t pt) {
+  //
+  // set the pt-dependent DCA cuts
+  //
+
+  if(f1CutMaxDCAToVertexXYPtDep) {
+     fCutMaxDCAToVertexXY=f1CutMaxDCAToVertexXYPtDep->Eval(pt);
+  }
+
+  if(f1CutMaxDCAToVertexZPtDep) {
+    fCutMaxDCAToVertexZ=f1CutMaxDCAToVertexZPtDep->Eval(pt);
+  }
+
+  if(f1CutMinDCAToVertexXYPtDep) {
+    fCutMinDCAToVertexXY=f1CutMinDCAToVertexXYPtDep->Eval(pt);
+  }
+
+  if(f1CutMinDCAToVertexZPtDep) {
+    fCutMinDCAToVertexZ=f1CutMinDCAToVertexZPtDep->Eval(pt);
+  }
+
+
+  return;
+}
+
+
+
+//--------------------------------------------------------------------------
+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::SetMaxDCAToVertexXYPtDep(const char *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::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::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::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());
+}