]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ANALYSIS/AliESDtrackCuts.cxx
removing obsolete code, for propagation of TPC only track
[u/mrichter/AliRoot.git] / ANALYSIS / AliESDtrackCuts.cxx
index 94230236a572c37a37727c83dcefdeb9b2cdd4c6..8c142a131de207670fd24fe5856ee09e58d04f70 100644 (file)
@@ -34,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",
@@ -80,7 +81,10 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   fCutMaxC55(0),
   fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
+  fCutAcceptSharedTPCClusters(0),
+  fCutMaxFractionSharedTPCClusters(0),
   fCutRequireTPCRefit(0),
+  fCutRequireTPCStandAlone(0),
   fCutRequireITSRefit(0),
   fCutRequireITSStandAlone(0),
   fCutNsigmaToVertex(0),
@@ -124,6 +128,7 @@ AliESDtrackCuts::AliESDtrackCuts(const Char_t* name, const Char_t* title) : AliA
   SetMaxCovDiagonalElements();
   SetMaxRel1PtUncertainty();
   SetRequireTPCRefit();
+  SetRequireTPCStandAlone();
   SetRequireITSRefit();
   SetRequireITSStandAlone(kFALSE);
   SetAcceptKinkDaughters();
@@ -160,7 +165,10 @@ AliESDtrackCuts::AliESDtrackCuts(const AliESDtrackCuts &c) : AliAnalysisCuts(c),
   fCutMaxC55(0),
   fCutMaxRel1PtUncertainty(0),
   fCutAcceptKinkDaughters(0),
+  fCutAcceptSharedTPCClusters(0),
+  fCutMaxFractionSharedTPCClusters(0),
   fCutRequireTPCRefit(0),
+  fCutRequireTPCStandAlone(0),
   fCutRequireITSRefit(0),
   fCutRequireITSStandAlone(0),
   fCutNsigmaToVertex(0),
@@ -282,7 +290,10 @@ void AliESDtrackCuts::Init()
   fCutMaxRel1PtUncertainty = 0;
 
   fCutAcceptKinkDaughters = 0;
+  fCutAcceptSharedTPCClusters = 0;
+  fCutMaxFractionSharedTPCClusters = 0;
   fCutRequireTPCRefit = 0;
+  fCutRequireTPCStandAlone = 0;
   fCutRequireITSRefit = 0;
   fCutRequireITSStandAlone = 0;
 
@@ -387,7 +398,10 @@ void AliESDtrackCuts::Copy(TObject &c) const
   target.fCutMaxRel1PtUncertainty = fCutMaxRel1PtUncertainty;
 
   target.fCutAcceptKinkDaughters = fCutAcceptKinkDaughters;
+  target.fCutAcceptSharedTPCClusters = fCutAcceptSharedTPCClusters;
+  target.fCutMaxFractionSharedTPCClusters = fCutMaxFractionSharedTPCClusters;
   target.fCutRequireTPCRefit = fCutRequireTPCRefit;
+  target.fCutRequireTPCStandAlone = fCutRequireTPCStandAlone;
   target.fCutRequireITSRefit = fCutRequireITSRefit;
   target.fCutRequireITSStandAlone = fCutRequireITSStandAlone;
 
@@ -655,14 +669,30 @@ Bool_t 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);
 
@@ -698,7 +728,6 @@ Bool_t 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.;
@@ -707,6 +736,11 @@ Bool_t AliESDtrackCuts::AcceptTrack(AliESDtrack* esdTrack)
   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;
   
   //########################################################################
@@ -718,76 +752,83 @@ Bool_t 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 && ((status & AliESDtrack::kITSin) == 0 || (status & AliESDtrack::kTPCin)))
-    cuts[30]=kTRUE;
+    cuts[31] = kTRUE;
   
   if (relUncertainty1Pt > fCutMaxRel1PtUncertainty)
-     cuts[31]=kTRUE;
-  
+     cuts[32] = kTRUE;
+
+  if (!fCutAcceptSharedTPCClusters && nClustersTPCShared!=0)
+    cuts[33] = kTRUE;
+
+  if (fracClustersTPCShared > fCutMaxFractionSharedTPCClusters)
+    cuts[34] = kTRUE;  
+
   Bool_t cut=kFALSE;
   for (Int_t i=0; i<kNCuts; i++) 
     if (cuts[i]) {cut = kTRUE;}
 
 
-
   //########################################################################
   // filling histograms
   if (fHistogramsOn) {
@@ -883,8 +924,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
@@ -904,15 +948,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))
   {