]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliESDtrackCuts.cxx
Added two missing includes to allow macro compilation (thanks to Laurent for remarkin...
[u/mrichter/AliRoot.git] / ANALYSIS / AliESDtrackCuts.cxx
index 7534b01b1732e4002232a50d07d929ea528bbba2..94230236a572c37a37727c83dcefdeb9b2cdd4c6 100644 (file)
 #include "AliESDtrackCuts.h"
 
 #include <AliESDtrack.h>
+#include <AliESDVertex.h>
 #include <AliESDEvent.h>
 #include <AliLog.h>
 
 #include <TTree.h>
 #include <TCanvas.h>
 #include <TDirectory.h>
+#include <TH2F.h>
+#include <TF1.h>
 
 //____________________________________________________________________
 ClassImp(AliESDtrackCuts)
@@ -34,8 +37,8 @@ const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "require ITS refit",
  "n clusters TPC",
  "n clusters ITS",
- "#Chi^{2}/clusters TPC",
- "#Chi^{2}/clusters ITS",
+ "#Chi^{2}/cluster TPC",
+ "#Chi^{2}/cluster ITS",
  "cov 11",
  "cov 22",
  "cov 33",
@@ -49,10 +52,19 @@ const Char_t* AliESDtrackCuts::fgkCutNames[kNCuts] = {
  "p_{x}",
  "p_{y}",
  "p_{z}",
- "y",
  "eta",
- "trk-to-vtx dca absolute",
- "trk-to-vtx dca xy absolute"
+ "y",
+ "trk-to-vtx max dca 2D absolute",
+ "trk-to-vtx max dca xy absolute",
+ "trk-to-vtx max dca z absolute",
+ "trk-to-vtx min dca 2D absolute",
+ "trk-to-vtx min dca xy absolute",
+ "trk-to-vtx min dca z absolute",
+ "SPD cluster requirement",
+ "SDD cluster requirement",
+ "SSD cluster requirement",
+ "require ITS stand-alone",
+ "rel 1/pt uncertainty"
 };
 
 //____________________________________________________________________
@@ -66,13 +78,18 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fCutMaxC33(0),
   fCutMaxC44(0),
   fCutMaxC55(0),
+  fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
   fCutRequireTPCRefit(0),
   fCutRequireITSRefit(0),
+  fCutRequireITSStandAlone(0),
   fCutNsigmaToVertex(0),
   fCutSigmaToVertexRequired(0),
-  fCutDCAToVertex(0),
-  fCutDCAToVertexXY(0),
+  fCutMaxDCAToVertexXY(0),
+  fCutMaxDCAToVertexZ(0),
+  fCutMinDCAToVertexXY(0),
+  fCutMinDCAToVertexZ(0),
+  fCutDCAToVertex2D(0),
   fPMin(0),
   fPMax(0),
   fPtMin(0),
@@ -104,14 +121,18 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   SetMinNClustersITS();
   SetMaxChi2PerClusterTPC();
   SetMaxChi2PerClusterITS();                               
-  SetMaxCovDiagonalElements();                                     
+  SetMaxCovDiagonalElements();
+  SetMaxRel1PtUncertainty();
   SetRequireTPCRefit();
   SetRequireITSRefit();
-  SetAcceptKingDaughters();
-  SetMinNsigmaToVertex();
-  SetRequireSigmaToVertex();
-  SetDCAToVertex();
-  SetDCAToVertexXY();
+  SetRequireITSStandAlone(kFALSE);
+  SetAcceptKinkDaughters();
+  SetMaxNsigmaToVertex();
+  SetMaxDCAToVertexXY();
+  SetMaxDCAToVertexZ();
+  SetDCAToVertex2D();
+  SetMinDCAToVertexXY();
+  SetMinDCAToVertexZ();
   SetPRange();
   SetPtRange();
   SetPxRange();
@@ -119,6 +140,9 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   SetPzRange();
   SetEtaRange();
   SetRapRange();
+  SetClusterRequirementITS(kSPD);
+  SetClusterRequirementITS(kSDD);
+  SetClusterRequirementITS(kSSD);
 
   SetHistogramsOn();
 }
@@ -134,13 +158,18 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fCutMaxC33(0),
   fCutMaxC44(0),
   fCutMaxC55(0),
+  fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
   fCutRequireTPCRefit(0),
   fCutRequireITSRefit(0),
+  fCutRequireITSStandAlone(0),
   fCutNsigmaToVertex(0),
   fCutSigmaToVertexRequired(0),
-  fCutDCAToVertex(0),
-  fCutDCAToVertexXY(0),
+  fCutMaxDCAToVertexXY(0),
+  fCutMaxDCAToVertexZ(0),
+  fCutMinDCAToVertexXY(0),
+  fCutMinDCAToVertexZ(0),
+  fCutDCAToVertex2D(0),
   fPMin(0),
   fPMax(0),
   fPtMin(0),
@@ -192,7 +221,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];                     
@@ -237,22 +269,32 @@ void AliESDtrackCuts::Init()
 
   fCutMaxChi2PerClusterTPC = 0;
   fCutMaxChi2PerClusterITS = 0;
+  
+  for (Int_t i = 0; i < 3; i++)
+       fCutClusterRequirementITS[i] = kOff;
 
   fCutMaxC11 = 0;
   fCutMaxC22 = 0;
   fCutMaxC33 = 0;
   fCutMaxC44 = 0;
   fCutMaxC55 = 0;
+  
+  fCutMaxRel1PtUncertainty = 0;
 
   fCutAcceptKinkDaughters = 0;
   fCutRequireTPCRefit = 0;
   fCutRequireITSRefit = 0;
+  fCutRequireITSStandAlone = 0;
 
   fCutNsigmaToVertex = 0;
   fCutSigmaToVertexRequired = 0;
-  fCutDCAToVertex = 0;
-  fCutDCAToVertexXY = 0;
+  fCutMaxDCAToVertexXY = 0;
+  fCutMaxDCAToVertexZ = 0;
+  fCutDCAToVertex2D = 0;
+  fCutMinDCAToVertexXY = 0;
+  fCutMinDCAToVertexZ = 0;
 
+  
   fPMin = 0;
   fPMax = 0;
   fPtMin = 0;
@@ -284,6 +326,8 @@ void AliESDtrackCuts::Init()
     fhC44[i] = 0;
     fhC55[i] = 0;
 
+    fhRel1PtUncertainty[i] = 0;
+
     fhDXY[i] = 0;
     fhDZ[i] = 0;
     fhDXYDZ[i] = 0;
@@ -331,20 +375,29 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutMaxChi2PerClusterTPC = fCutMaxChi2PerClusterTPC;
   target.fCutMaxChi2PerClusterITS = fCutMaxChi2PerClusterITS;
 
+  for (Int_t i = 0; i < 3; i++)
+    target.fCutClusterRequirementITS[i] = fCutClusterRequirementITS[i];
+
   target.fCutMaxC11 = fCutMaxC11;
   target.fCutMaxC22 = fCutMaxC22;
   target.fCutMaxC33 = fCutMaxC33;
   target.fCutMaxC44 = fCutMaxC44;
   target.fCutMaxC55 = fCutMaxC55;
 
+  target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
+
   target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
   target.fCutRequireTPCRefit = fCutRequireTPCRefit;
   target.fCutRequireITSRefit = fCutRequireITSRefit;
+  target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
 
   target.fCutNsigmaToVertex = fCutNsigmaToVertex;
   target.fCutSigmaToVertexRequired = fCutSigmaToVertexRequired;
-  target.fCutDCAToVertex = fCutDCAToVertex;
-  target.fCutDCAToVertexXY = fCutDCAToVertexXY;
+  target.fCutMaxDCAToVertexXY = fCutMaxDCAToVertexXY;
+  target.fCutMaxDCAToVertexZ = fCutMaxDCAToVertexZ;
+  target.fCutDCAToVertex2D = fCutDCAToVertex2D;
+  target.fCutMinDCAToVertexXY = fCutMinDCAToVertexXY;
+  target.fCutMinDCAToVertexZ = fCutMinDCAToVertexZ;
 
   target.fPMin = fPMin;
   target.fPMax = fPMax;
@@ -377,6 +430,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();
@@ -434,7 +489,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]               ); 
@@ -458,6 +515,51 @@ Long64_t AliESDtrackCuts::Merge(TCollection* list) {
   return count+1;
 }
 
+//____________________________________________________________________
+AliESDtrackCuts* AliESDtrackCuts::GetStandardTPCOnlyTrackCuts()
+{
+  // creates an AliESDtrackCuts object and fills it with standard values for TPC-only cuts
+  // see ALICE note: ...
+  
+  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;
+}
+
+//____________________________________________________________________
+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;
+  }
+  
+  AliESDtrackCuts* 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)
@@ -484,7 +586,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)
@@ -492,13 +594,14 @@ Float_t AliESDtrackCuts::GetSigmaToVertex(AliESDtrack* esdTrack)
 
   Float_t d = TMath::Sqrt(TMath::Power(b[0]/bRes[0],2) + TMath::Power(b[1]/bRes[1],2));
 
-  // stupid rounding problem screws up everything:
+  // work around precision problem
   // if d is too big, TMath::Exp(...) gets 0, and TMath::ErfInverse(1) that should be infinite, gets 0 :(
-  if (TMath::Exp(-d * d / 2) < 1e-10)
+  // 1e-15 corresponds to nsigma ~ 7.7
+  if (TMath::Exp(-d * d / 2) < 1e-15)
     return 1000;
 
-  d = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
-  return d;
+  Float_t nSigma = TMath::ErfInverse(1 - TMath::Exp(-d * d / 2)) * TMath::Sqrt(2);
+  return nSigma;
 }
 
 void AliESDtrackCuts::EnableNeededBranches(TTree* tree)
@@ -522,8 +625,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
   //
@@ -548,7 +651,6 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
   // fTracks.fP   //GetMass
   // fTracks.fKinkIndexes
 
-
   UInt_t status = esdTrack->GetStatus();
 
   // getting quality parameters from the ESD track
@@ -574,10 +676,19 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
     AliDebug(1, "Estimated b resolution lower or equal zero!");
     bCov[0]=0; bCov[2]=0;
   }
-  Float_t dcaToVertex   = TMath::Sqrt(b[0]*b[0] + b[1]*b[1]);
+
   Float_t dcaToVertexXY = b[0];
+  Float_t dcaToVertexZ = b[1];
+
+  Float_t dcaToVertex = -1;
   
+  if (fCutDCAToVertex2D)
+  {
+    dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY/fCutMaxDCAToVertexXY/fCutMaxDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMaxDCAToVertexZ/fCutMaxDCAToVertexZ);
+  }
+  else
+    dcaToVertex = TMath::Sqrt(dcaToVertexXY*dcaToVertexXY + dcaToVertexZ*dcaToVertexZ);
+    
   // getting the kinematic variables of the track
   // (assuming the mass is known)
   Double_t p[3];
@@ -595,7 +706,8 @@ 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]));
-
+    
+  Float_t relUncertainty1Pt = TMath::Sqrt(extCov[14])*pt;
   
   //########################################################################
   // cut the track?
@@ -644,18 +756,35 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
     cuts[17] = kTRUE;
   if((p[2] < fPzMin) || (p[2] > fPzMax))
     cuts[18] = kTRUE;
-  if((eta < fEtaMin) || (eta > fEtaMax)) 
+  if((eta < fEtaMin) || (eta > fEtaMax))
     cuts[19] = kTRUE;
   if((y < fRapMin) || (y > fRapMax)) 
     cuts[20] = kTRUE;
-  if (dcaToVertex > fCutDCAToVertex)
+  if (fCutDCAToVertex2D && dcaToVertex > 1)
     cuts[21] = kTRUE;
-  if (dcaToVertexXY > fCutDCAToVertexXY)
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) > fCutMaxDCAToVertexXY)
     cuts[22] = kTRUE;
-
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) > fCutMaxDCAToVertexZ)
+    cuts[23] = kTRUE;
+  if (fCutDCAToVertex2D && fCutMinDCAToVertexXY > 0 && fCutMinDCAToVertexZ > 0 && dcaToVertexXY*dcaToVertexXY/fCutMinDCAToVertexXY/fCutMinDCAToVertexXY + dcaToVertexZ*dcaToVertexZ/fCutMinDCAToVertexZ/fCutMinDCAToVertexZ < 1)
+    cuts[24] = kTRUE;
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexXY) < fCutMinDCAToVertexXY)
+    cuts[25] = kTRUE;
+  if (!fCutDCAToVertex2D && TMath::Abs(dcaToVertexZ) < fCutMinDCAToVertexZ)
+    cuts[26] = kTRUE;
+  
+  for (Int_t i = 0; i < 3; i++)
+    cuts[27+i] = !CheckITSClusterRequirement(fCutClusterRequirementITS[i], esdTrack->HasPointOnITSLayer(i*2), esdTrack->HasPointOnITSLayer(i*2+1));
+  
+  if (fCutRequireITSStandAlone && ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)))
+    cuts[30]=kTRUE;
+  
+  if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
+     cuts[31]=kTRUE;
+  
   Bool_t cut=kFALSE;
   for (Int_t i=0; i<kNCuts; i++) 
-    if (cuts[i]) cut = kTRUE;
+    if (cuts[i]) {cut = kTRUE;}
 
 
 
@@ -701,6 +830,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);
 
@@ -729,6 +860,26 @@ AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack) {
   return kTRUE;
 }
 
+//____________________________________________________________________
+Bool_t AliESDtrackCuts::CheckITSClusterRequirement(ITSClusterRequirement req, Bool_t clusterL1, Bool_t clusterL2)
+{
+  // checks if the cluster requirement is fullfilled (in this case: return kTRUE)
+  
+  switch (req)
+  {
+       case kOff:        return kTRUE;
+       case kNone:       return !clusterL1 && !clusterL2;
+       case kAny:        return clusterL1 || clusterL2;
+       case kFirst:      return clusterL1;
+       case kOnlyFirst:  return clusterL1 && !clusterL2;
+       case kSecond:     return clusterL2;
+       case kOnlySecond: return clusterL2 && !clusterL1;
+       case kBoth:       return clusterL1 && clusterL2;
+  }
+  
+  return kFALSE;
+}
+
 //____________________________________________________________________
 AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
 {
@@ -744,6 +895,9 @@ AliESDtrack* AliESDtrackCuts::GetTPCOnlyTrack(AliESDEvent* esd, Int_t iTrack)
   if (!esd->GetPrimaryVertexTPC())
     return 0; // No TPC vertex no TPC tracks
 
+  if(!esd->GetPrimaryVertexTPC()->GetStatus())
+    return 0; // TPC Vertex is created by default in AliESDEvent, do not use in this case
+
   AliESDtrack* track = esd->GetTrack(iTrack);
   if (!track)
     return 0;
@@ -788,6 +942,7 @@ TObjArray* AliESDtrackCuts::GetAcceptedTracks(AliESDEvent* esd,Bool_t bTPC)
   for (Int_t iTrack = 0; iTrack < esd->GetNumberOfTracks(); iTrack++) {
     if(bTPC){
       if(!esd->GetPrimaryVertexTPC())return acceptedTracks; // No TPC vertex no TPC tracks
+      if(!esd->GetPrimaryVertexTPC()->GetStatus())return acceptedTracks; // No proper TPC vertex, only the default
 
       AliESDtrack *tpcTrack = GetTPCOnlyTrack(esd, iTrack);
       if (!tpcTrack)
@@ -854,7 +1009,7 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
      fhCutStatistics->GetXaxis()->SetBinLabel(i+4,fgkCutNames[i]);
      fhCutCorrelation->GetXaxis()->SetBinLabel(i+1,fgkCutNames[i]);
      fhCutCorrelation->GetYaxis()->SetBinLabel(i+1,fgkCutNames[i]);
-   } 
+   }
 
   fhCutStatistics  ->SetLineColor(color);
   fhCutCorrelation ->SetLineColor(color);
@@ -869,10 +1024,12 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
 
     fhC11[i]                 = new TH1F("covMatrixDiagonal11","",2000,0,20);
     fhC22[i]                 = new TH1F("covMatrixDiagonal22","",2000,0,20);
-    fhC33[i]                 = new TH1F("covMatrixDiagonal33","",1000,0,1);
-    fhC44[i]                 = new TH1F("covMatrixDiagonal44","",1000,0,5);
+    fhC33[i]                 = new TH1F("covMatrixDiagonal33","",1000,0,0.1);
+    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);
@@ -884,7 +1041,7 @@ Int_t AliESDtrackCuts::CountAcceptedTracks(AliESDEvent* esd)
 
     fhNSigmaToVertex[i]      = new TH1F("nSigmaToVertex","",500,0,10);
 
-    fhPt[i]                  = new TH1F("pt"     ,"p_{T} distribution;p_{T} (GeV/c)",500,0.0,100.0);
+    fhPt[i]                  = new TH1F("pt"     ,"p_{T} distribution;p_{T} (GeV/c)", 800, 0.0, 10.0);
     fhEta[i]                 = new TH1F("eta"     ,"#eta distribution;#eta",40,-2.0,2.0);
     
     fhNClustersITS[i]->SetTitle("n ITS clusters");
@@ -898,16 +1055,18 @@ 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]");
 
-    fhDXY[i]->SetTitle("transverse impact parameter");
-    fhDZ[i]->SetTitle("longitudinal impact parameter");
-    fhDXYDZ[i]->SetTitle("absolute impact parameter;sqrt(dXY**2 + dZ**2) in cm");
-    fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter");
-    fhDXYvsDZ[i]->SetYTitle("transverse impact parameter");
+    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)");
+    fhDXYvsDZ[i]->SetXTitle("longitudinal impact parameter (cm)");
+    fhDXYvsDZ[i]->SetYTitle("transverse impact parameter (cm)");
 
-    fhDXYNormalized[i]->SetTitle("normalized trans impact par");
-    fhDZNormalized[i]->SetTitle("normalized long impact par");
-    fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par");
-    fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par");
+    fhDXYNormalized[i]->SetTitle("normalized trans impact par (n#sigma)");
+    fhDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
+    fhDXYvsDZNormalized[i]->SetTitle("normalized long impact par (n#sigma)");
+    fhDXYvsDZNormalized[i]->SetYTitle("normalized trans impact par (n#sigma)");
     fhNSigmaToVertex[i]->SetTitle("n #sigma to vertex");
 
     fhNClustersITS[i]->SetLineColor(color);   fhNClustersITS[i]->SetLineWidth(2);
@@ -921,6 +1080,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);
@@ -975,6 +1136,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"));
@@ -1040,6 +1203,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();
@@ -1110,6 +1275,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);