]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCtrack.cxx
Adding the marker size as additional parameters
[u/mrichter/AliRoot.git] / TPC / AliTPCtrack.cxx
index f73f238dc9213155c7b73d2af5c2faafbee3c0a8..1291a84b3d45951e461aef3b02d54afcb5059bd2 100644 (file)
@@ -17,7 +17,7 @@
 
 //-----------------------------------------------------------------
 //           Implementation of the TPC track class
-//        This class is used by the AliTPCtracker class
+//        This class is used by the AliTPCtrackerMI class
 //      Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
 //-----------------------------------------------------------------
 
 #include "AliCluster.h"
 #include "AliTracker.h"
 #include "AliESDtrack.h"
-
+#include "AliESDVertex.h"
+#include "TTreeStream.h"
+#include  "AliTPCRecoParam.h"
+#include  "AliTPCReconstructor.h"
 ClassImp(AliTPCtrack)
 
 //_________________________________________________________________________
@@ -119,7 +122,7 @@ AliTPCtrack::AliTPCtrack(Double_t x, Double_t alpha, const Double_t p[5],
 }
 
 //_____________________________________________________________________________
-AliTPCtrack::AliTPCtrack(const AliESDtrack& t) :
+AliTPCtrack::AliTPCtrack(const AliESDtrack& t, TTreeSRedirector *pcstream) :
   AliKalmanTrack(),
   fdEdx(t.GetTPCsignal()),
   fSdEdx(1e10),
@@ -136,6 +139,7 @@ AliTPCtrack::AliTPCtrack(const AliESDtrack& t) :
   //-----------------------------------------------------------------
   // Conversion AliESDtrack -> AliTPCtrack.
   //-----------------------------------------------------------------
+  const Double_t kmaxC[4]={10,10,0.1,0.1};  // cuts on the rms /fP0,fP1,fP2,fP3
   SetNumberOfClusters(t.GetTPCclusters(fIndex));
   SetLabel(t.GetLabel());
   SetMass(t.GetMass());
@@ -143,13 +147,69 @@ AliTPCtrack::AliTPCtrack(const AliESDtrack& t) :
   for (Int_t i=0; i<12;i++) fKinkPoint[i]=0.;
   for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0;
   for (Int_t i=0; i<3;i++) fV0Indexes[i]=0;
+  //
+  // choose parameters to start
+  //
+  const AliTPCRecoParam * recoParam = AliTPCReconstructor::GetRecoParam();
+  Int_t reject=0;
+  AliExternalTrackParam param(t);
+
+  const AliExternalTrackParam  *tpcout=(t.GetFriendTrack())? ((AliESDfriendTrack*)(t.GetFriendTrack()))->GetTPCOut():0;
+  const AliExternalTrackParam  *tpcin = t.GetInnerParam();
+  const AliExternalTrackParam  *tpc=(tpcout)?tpcout:tpcin;
+  if (!tpc) tpc=&param;
+  Bool_t isOK=recoParam->GetUseOuterDetectors();
+  if (param.GetCovariance()[0]>kmaxC[0]*kmaxC[0]) isOK=kFALSE;
+  if (param.GetCovariance()[2]>kmaxC[1]*kmaxC[1]) isOK=kFALSE;
+  if (param.GetCovariance()[5]>kmaxC[2]*kmaxC[2]) isOK=kFALSE;
+  if (param.GetCovariance()[9]>kmaxC[3]*kmaxC[3]) isOK=kFALSE;
+  param.Rotate(tpc->GetAlpha());
+  Double_t oldX=param.GetX(),  oldY=param.GetY(),  oldZ=param.GetZ();
+  if (!isOK ){
+    param=*tpc;
+    isOK=kTRUE;
+    reject=1;
+  }
+  isOK=AliTracker::PropagateTrackToBxByBz(&param,tpc->GetX(),t.GetMass(),2.,kFALSE);
+  if (param.GetCovariance()[0]>kmaxC[0]*kmaxC[0]) isOK=kFALSE;
+  if (param.GetCovariance()[2]>kmaxC[1]*kmaxC[1]) isOK=kFALSE;
+  if (param.GetCovariance()[5]>kmaxC[2]*kmaxC[2]) isOK=kFALSE;
+  if (param.GetCovariance()[9]>kmaxC[3]*kmaxC[3]) isOK=kFALSE;
+  if (!isOK){
+    param=*tpc;
+    isOK=kTRUE;
+    reject=2;
+  }
+  if (reject>0){
+    param.ResetCovariance(4.);  // reset covariance if start from backup param
+  }
+  //
+  //
+  if (pcstream){
+    AliExternalTrackParam dummy;
+    AliExternalTrackParam *ptpc=(AliExternalTrackParam *)tpc;
+    //    if (!ptpc) ptpc=&dummy;
+    AliESDtrack *esd= (AliESDtrack *)&t;
+    (*pcstream)<<"trackP"<<
+      "reject="<<reject<<   // flag - rejection of current esd track parameters
+      "esd.="<<esd<<        // original esd track
+      "tr.="<<&param<<      // starting track parameters
+      "out.="<<ptpc<<       // backup tpc parameters
+      "\n";
+  }
 
-  Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance());
+  Set(param.GetX(),param.GetAlpha(),param.GetParameter(),param.GetCovariance());
 
   if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
   StartTimeIntegral();
   Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
   SetIntegratedLength(t.GetIntegratedLength());
+
+  if (GetX()>oldX) {
+     Double_t dX=GetX()-oldX, dY=GetY()-oldY, dZ=GetZ()-oldZ;
+     Double_t d=TMath::Sqrt(dX*dX + dY*dY + dZ*dZ);
+     AddTimeStep(d);
+  }
 }
 
 //_____________________________________________________________________________
@@ -180,14 +240,41 @@ AliTPCtrack::AliTPCtrack(const AliTPCtrack& t) :
   for (Int_t i=0; i<3;i++) fV0Indexes[i]=t.fV0Indexes[i];
 }
 
+AliTPCtrack& AliTPCtrack::operator=(const AliTPCtrack& o){
+  if(this!=&o){
+    AliKalmanTrack::operator=(o);
+    fdEdx = o.fdEdx;
+    for(Int_t i = 0;i<kMaxRow;++i)fIndex[i] = o.fIndex[i];
+    for(Int_t i = 0;i<4;++i)fPoints[i] = o.fPoints[i];
+    fSdEdx = o.fSdEdx;
+    fNFoundable = o.fNFoundable;
+    fBConstrain = o.fBConstrain;
+    fLastPoint  = o.fLastPoint;
+    fFirstPoint = o.fFirstPoint;
+    fTrackType  = o.fTrackType;
+    fLab2       = o.fLab2;
+    fNShared    = o.fNShared;
+    fReference  = o.fReference;
+    for(Int_t i = 0;i<12;++i) fKinkPoint[i] = o.fKinkPoint[i];
+
+    for(Int_t i = 0;i<3;++i){
+      fKinkIndexes[i] = o.fKinkIndexes[i];
+      fV0Indexes[i] = o.fV0Indexes[i];
+    }
+  }
+  return *this;
+
+}
+
+
 //_____________________________________________________________________________
 Int_t AliTPCtrack::Compare(const TObject *o) const {
   //-----------------------------------------------------------------
   // This function compares tracks according to the their curvature
   //-----------------------------------------------------------------
   AliTPCtrack *t=(AliTPCtrack*)o;
-  //Double_t co=TMath::Abs(t->Get1Pt());
-  //Double_t c =TMath::Abs(Get1Pt());
+  //Double_t co=t->OneOverPt();
+  //Double_t c = OneOverPt();
   Double_t co=t->GetSigmaY2()*t->GetSigmaZ2();
   Double_t c =GetSigmaY2()*GetSigmaZ2();
   if (c>co) return 1;
@@ -211,10 +298,21 @@ Bool_t AliTPCtrack::PropagateTo(Double_t xk,Double_t rho,Double_t x0) {
   //  rho - density of the crossed matrial (g/cm^3)
   //  x0  - radiation length of the crossed material (g/cm^2) 
   //-----------------------------------------------------------------
-  Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
-
+  //
   Double_t bz=GetBz();
-  if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
+  Double_t zat=0;
+  if (!GetZAt(xk, bz,zat)) return kFALSE;
+  if (TMath::Abs(zat)>250.){
+    // Don't propagate track outside of the fiducial volume - material budget not proper one
+    //
+    //AliWarning("Propagate outside of fiducial volume");
+    return kFALSE;
+  }
+
+  Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
+  //if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
+  Double_t b[3]; GetBxByBz(b);
+  if (!AliExternalTrackParam::PropagateToBxByBz(xk,b)) return kFALSE;
 
   Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) + 
                            (GetY()-oldY)*(GetY()-oldY) + 
@@ -222,23 +320,37 @@ Bool_t AliTPCtrack::PropagateTo(Double_t xk,Double_t rho,Double_t x0) {
   if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d);
 
   if (oldX < xk) d = -d;
-  if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass())) 
-     return kFALSE;
+  if (!AliExternalTrackParam::CorrectForMeanMaterial(d*rho/x0,d*rho,GetMass(),
+      kFALSE,AliExternalTrackParam::BetheBlochGas)) return kFALSE;
 
   return kTRUE;
 }
 
 //_____________________________________________________________________________
 Bool_t 
-AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t d,Double_t x0) 
+AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t rho,Double_t x0) 
 {
   //-----------------------------------------------------------------
-  // This function propagates tracks to the vertex.
+  // This function propagates tracks to the vertex
+  // rho - density of the crossed matrial (g/cm3)
+  // x0  - radiation length of the crossed material (g/cm2) 
   //-----------------------------------------------------------------
-  Double_t bz=GetBz();
-  if (PropagateToDCA(v,bz,kVeryBig))
-   if (AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass())) return kTRUE;
-  return kFALSE;
+  Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
+
+  //Double_t bz=GetBz();
+  //if (!PropagateToDCA(v,bz,kVeryBig)) return kFALSE;
+  Double_t b[3]; GetBxByBz(b);
+  if (!PropagateToDCABxByBz(v,b,kVeryBig)) return kFALSE;
+
+  Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) + 
+                           (GetY()-oldY)*(GetY()-oldY) + 
+                           (GetZ()-oldZ)*(GetZ()-oldZ));
+
+  if (oldX < GetX()) d = -d;
+  if (!AliExternalTrackParam::CorrectForMeanMaterial(d*rho/x0,d*rho,GetMass(),
+      kFALSE,AliExternalTrackParam::BetheBlochGas)) return kFALSE;
+
+  return kTRUE;
 }
 
 //_____________________________________________________________________________
@@ -251,6 +363,8 @@ Bool_t AliTPCtrack::Update(const AliCluster *c, Double_t chisq, Int_t index) {
 
   if (!AliExternalTrackParam::Update(p,cov)) return kFALSE;
 
+  AliTracker::FillResiduals(this,p,cov,c->GetVolumeId());
+
   Int_t n=GetNumberOfClusters();
   fIndex[n]=index;
   SetNumberOfClusters(n+1);
@@ -360,12 +474,3 @@ void  AliTPCtrack::UpdatePoints()
   //
 }
 
-Double_t AliTPCtrack::GetBz() const {
-  //
-  // returns Bz component of the magnetic field (kG)
-  //
-  if (AliTracker::UniformField()) return AliTracker::GetBz();
-  Double_t r[3]; GetXYZ(r);
-  return AliTracker::GetBz(r);
-}
-