]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCtrack.cxx
Constant extrapolation for gain calibration
[u/mrichter/AliRoot.git] / TPC / AliTPCtrack.cxx
index 9a3501642a59f57d6dd9b2e30741253cd41f4924..aa413fbb3b01195ad960b7c4ffb221b8c5756d25 100644 (file)
@@ -28,7 +28,9 @@
 #include "AliTracker.h"
 #include "AliESDtrack.h"
 #include "AliESDVertex.h"
-
+#include "TTreeStream.h"
+#include  "AliTPCRecoParam.h"
+#include  "AliTPCReconstructor.h"
 ClassImp(AliTPCtrack)
 
 //_________________________________________________________________________
@@ -120,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),
@@ -137,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());
@@ -144,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);
+  }
 }
 
 //_____________________________________________________________________________
@@ -239,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) + 
@@ -267,8 +337,10 @@ AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t rho,Double_t x0)
   //-----------------------------------------------------------------
   Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
 
-  Double_t bz=GetBz();
-  if (!PropagateToDCA(v,bz,kVeryBig)) return kFALSE;
+  //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) + 
@@ -402,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);
-}
-