]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrack.cxx
Common track parametrization in the barrel detectors (Yu.Belikov)
[u/mrichter/AliRoot.git] / TRD / AliTRDtrack.cxx
index f5efc943eacb2d5c6405b3ec1b6680c13b56be37..be6a363045486f560b2f9e9d33a2b007207757dc 100644 (file)
@@ -19,6 +19,7 @@
 #include <TMath.h>
 #include <TVector2.h>
 
+#include "AliTracker.h"
 #include "AliESDtrack.h"
 #include "AliTRDgeometry.h" 
 #include "AliTRDcluster.h" 
@@ -34,482 +35,258 @@ ClassImp(AliTRDtrack)
 //                                                                           //
 ///////////////////////////////////////////////////////////////////////////////
 
-//_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack()
-  :AliKalmanTrack()
-  ,fSeedLab(-1)
-  ,fdEdx(0)
-  ,fDE(0)
-  ,fAlpha(0)
-  ,fX(0)
-  ,fStopped(kFALSE)
-  ,fY(0)
-  ,fZ(0)
-  ,fE(0)
-  ,fT(0)
-  ,fC(0)
-  ,fCyy(1e10)
-  ,fCzy(0)
-  ,fCzz(1e10)
-  ,fCey(0)
-  ,fCez(0)
-  ,fCee(1e10)
-  ,fCty(0)
-  ,fCtz(0)
-  ,fCte(0)
-  ,fCtt(1e10)
-  ,fCcy(0)
-  ,fCcz(0)
-  ,fCce(0)
-  ,fCct(0)
-  ,fCcc(1e10)
-  ,fLhElectron(0)
-  ,fNWrong(0)
-  ,fNRotate(0)
-  ,fNCross(0)
-  ,fNExpected(0)
-  ,fNLast(0)
-  ,fNExpectedLast(0)
-  ,fNdedx(0)
-  ,fChi2Last(1e10)
-  ,fBackupTrack(0x0)
+AliTRDtrack::AliTRDtrack():
+  AliKalmanTrack(),
+  fSeedLab(-1),
+  fdEdx(0),
+  fdEdxT(0),
+  fDE(0),
+  fStopped(kFALSE),
+  fLhElectron(0),
+  fNWrong(0),
+  fNRotate(0),
+  fNCross(0),
+  fNExpected(0),
+  fNLast(0),
+  fNExpectedLast(0),
+  fNdedx(0),
+  fChi2Last(1e10),
+  fBackupTrack(0x0)
 {
-  //
-  // AliTRDtrack default constructor
-  //
-
-  Int_t  i = 0;
-  Int_t  j = 0;
-  UInt_t k = 0;
-
-  for (i = 0; i < kNplane; i++) {
-    for (j = 0; j < kNslice; j++) {
+  for (Int_t i=0; i<kNplane; i++) {
+    for (Int_t j=0; j<kNslice; j++) {
       fdEdxPlane[i][j] = 0;
     }
     fTimBinPlane[i] = -1;
   }
-
-  for (k = 0; k < kMAXCLUSTERSPERTRACK; k++) {
-    fIndex[k]       = 0;
-    fIndexBackup[k] = 0;
-    fdQdl[k]        = 0;
-  }
-
-  for (i = 0; i < 3; i++) {
-    fBudget[i]      = 0;
+  for (UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
+    fIndex[i] = 0;
+    fIndexBackup[i] = 0;
+    fdQdl[i] = 0;
   }
-
+  for (Int_t i=0; i<3; i++) fBudget[i] = 0;
 }
 
 //_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, UInt_t index, 
-                         const Double_t xx[5], const Double_t cc[15], 
-                         Double_t xref, Double_t alpha) 
-  :AliKalmanTrack() 
-  ,fSeedLab(-1)
-  ,fdEdx(0.0)
-  ,fDE(0.0)
-  ,fAlpha(alpha)
-  ,fX(xref)
-  ,fStopped(kFALSE)
-  ,fY(xx[0])
-  ,fZ(xx[1])
-  ,fE(xx[2])
-  ,fT(xx[3])
-  ,fC(xx[4])
-  ,fCyy(cc[0])
-  ,fCzy(cc[1])
-  ,fCzz(cc[2])
-  ,fCey(cc[3])  
-  ,fCez(cc[4])  
-  ,fCee(cc[5])
-  ,fCty(cc[6])  
-  ,fCtz(cc[7])  
-  ,fCte(cc[8])  
-  ,fCtt(cc[9])
-  ,fCcy(cc[10]) 
-  ,fCcz(cc[11]) 
-  ,fCce(cc[12]) 
-  ,fCct(cc[13]) 
-  ,fCcc(cc[14])  
-  ,fLhElectron(0.0)
-  ,fNWrong(0)
-  ,fNRotate(0)
-  ,fNCross(0)
-  ,fNExpected(0)
-  ,fNLast(0)
-  ,fNExpectedLast(0)
-  ,fNdedx(0)
-  ,fChi2Last(1e10)
-  ,fBackupTrack(0x0)
+AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, Int_t index, 
+                         const Double_t p[5], const Double_t cov[15], 
+                         Double_t x, Double_t alpha) : 
+  AliKalmanTrack(),
+  fSeedLab(-1),
+  fdEdx(0),
+  fdEdxT(0),
+  fDE(0),
+  fStopped(kFALSE),
+  fLhElectron(0),
+  fNWrong(0),
+  fNRotate(0),
+  fNCross(0),
+  fNExpected(0),
+  fNLast(0),
+  fNExpectedLast(0),
+  fNdedx(0),
+  fChi2Last(1e10),
+  fBackupTrack(0x0) 
 {
-  //
-  // AliTRDtrack main constructor
-  //
-
-  Int_t  i = 0;
-  Int_t  j = 0;
-  UInt_t k = 0;
-
-  if (fAlpha <  -TMath::Pi()) {
-    fAlpha += 2.0 * TMath::Pi();
-  }
-  if (fAlpha >=  TMath::Pi()) {
-    fAlpha -= 2.0 * TMath::Pi();   
-  } 
+  //-----------------------------------------------------------------
+  // This is the main track constructor.
+  //-----------------------------------------------------------------
+  Double_t cnv=1./(GetBz()*kB2C);
+
+  Double_t pp[5]={
+    p[0],
+    p[1],
+    x*p[4] - p[2],
+    p[3],
+    p[4]*cnv
+  };
+
+  Double_t c22 = x*x*cov[14] - 2*x*cov[12] + cov[5];
+  Double_t c32 = x*cov[13] - cov[8];
+  Double_t c20 = x*cov[10] - cov[3], 
+           c21 = x*cov[11] - cov[4], c42 = x*cov[14] - cov[12];
+
+  Double_t cc[15]={
+    cov[0 ],
+    cov[1 ],     cov[2 ],
+    c20,         c21,         c22,
+    cov[6 ],     cov[7 ],     c32,     cov[9 ],
+    cov[10]*cnv, cov[11]*cnv, c42*cnv, cov[13]*cnv, cov[14]*cnv*cnv
+  };
+
+  Set(x,alpha,pp,cc);
 
-  SaveLocalConvConst();
-
-  fIndex[0] = index;
   SetNumberOfClusters(1);
+  fIndex[0]=index;
 
-  for (i = 0; i < kNplane; i++) {
-    for (j = 0; j < kNslice; j++) {
+  for (Int_t i=0;i<kNplane;i++){
+    for (Int_t j=0; j<kNslice; j++) {
       fdEdxPlane[i][j] = 0;
     }
     fTimBinPlane[i] = -1;
   }
 
   Double_t q = TMath::Abs(c->GetQ());
-  Double_t s = fX * fC - fE;
-  Double_t t = fT;
-  if (s*s < 1.0) {
-    q *= TMath::Sqrt((1-s*s)/(1+t*t));
-  }
-  fdQdl[0] = q;
-  
-  for (k = 1; k < kMAXCLUSTERSPERTRACK; k++) {
-    fdQdl[k]        = 0;
-    fIndex[k]       = 0;
-    fIndexBackup[k] = 0; 
-  }
+  Double_t s = GetSnp(), t=GetTgl();
+  if(s*s < 1) q *= TMath::Sqrt((1-s*s)/(1+t*t));
 
-  for (i = 0; i < 3; i++) { 
-    fBudget[i]      = 0;
+  fdQdl[0] = q;  
+  // initialisation [SR, GSI 18.02.2003] (i startd for 1)
+  for(UInt_t i=1; i<kMAXCLUSTERSPERTRACK; i++) {
+    fdQdl[i] = 0;
+    fIndex[i] = 0;
+    fIndexBackup[i] = 0;  //backup indexes MI    
   }
-
+  for (Int_t i=0;i<3;i++) fBudget[i]=0;
 }                              
            
 //_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliTRDtrack &t) 
-  :AliKalmanTrack(t) 
-  ,fSeedLab(t.fSeedLab)
-  ,fdEdx(t.fdEdx)
-  ,fDE(t.fDE)
-  ,fAlpha(t.fAlpha)
-  ,fX(t.fX)
-  ,fStopped(t.fStopped)
-  ,fY(t.fY)
-  ,fZ(t.fZ)
-  ,fE(t.fE)
-  ,fT(t.fT)
-  ,fC(t.fC)
-  ,fCyy(t.fCyy)
-  ,fCzy(t.fCzy)
-  ,fCzz(t.fCzz)
-  ,fCey(t.fCey)  
-  ,fCez(t.fCez)  
-  ,fCee(t.fCee)
-  ,fCty(t.fCty)  
-  ,fCtz(t.fCtz)  
-  ,fCte(t.fCte)  
-  ,fCtt(t.fCtt)
-  ,fCcy(t.fCcy) 
-  ,fCcz(t.fCcz) 
-  ,fCce(t.fCce) 
-  ,fCct(t.fCct)
-  ,fCcc(t.fCcc)  
-  ,fLhElectron(0.0)
-  ,fNWrong(t.fNWrong)
-  ,fNRotate(t.fNRotate)
-  ,fNCross(t.fNCross)
-  ,fNExpected(t.fNExpected)
-  ,fNLast(t.fNLast)
-  ,fNExpectedLast(t.fNExpectedLast)
-  ,fNdedx(t.fNdedx)
-  ,fChi2Last(t.fChi2Last)
-  ,fBackupTrack(0x0)
+AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : 
+  AliKalmanTrack(t), 
+  fSeedLab(t.GetSeedLabel()),
+  fdEdx(t.fdEdx),
+  fdEdxT(t.fdEdx),
+  fDE(t.fDE),
+  fStopped(t.fStopped),
+  fLhElectron(0),
+  fNWrong(t.fNWrong),
+  fNRotate(t.fNRotate),
+  fNCross(t.fNCross),
+  fNExpected(t.fNExpected),
+  fNLast(t.fNLast),
+  fNExpectedLast(t.fNExpectedLast),
+  fNdedx(t.fNdedx),
+  fChi2Last(t.fChi2Last),
+  fBackupTrack(0x0) 
 {
   //
   // Copy constructor.
   //
-
-  Int_t  i = 0;
-  Int_t  j = 0;
-  UInt_t k = 0;
-
-  for (i = 0; i < kNplane; i++) {
-    for (j = 0; j < kNslice; j++) {
+  for (Int_t i=0;i<kNplane;i++){
+    for (Int_t j=0; j<kNslice; j++) {
       fdEdxPlane[i][j] = t.fdEdxPlane[i][j];
     }
     fTimBinPlane[i] = t.fTimBinPlane[i];
     fTracklets[i]   = t.fTracklets[i];
   }
 
-  Int_t n = t.GetNumberOfClusters(); 
-  for (i = 0; i < n; i++) {
-    fIndex[i]       = t.fIndex[i];
-    fIndexBackup[i] = t.fIndex[i];
-    fdQdl[i]        = t.fdQdl[i];
-  }
-  for (k = n; k < kMAXCLUSTERSPERTRACK; k++) {
-    fdQdl[k]        = 0;
-    fIndex[k]       = 0;
-    fIndexBackup[k] = 0; 
-  }
-
-  for (i = 0; i < 6; i++) {
-    fTracklets[i] = t.fTracklets[i];
+  Int_t n=t.GetNumberOfClusters(); 
+  SetNumberOfClusters(n);
+  for (Int_t i=0; i<n; i++) {
+    fIndex[i]=t.fIndex[i];
+    fIndexBackup[i]=t.fIndex[i];  // MI - backup indexes
+    fdQdl[i]=t.fdQdl[i];
   }
 
-  for (i = 0; i < 3; i++) { 
-    fBudget[i]    = t.fBudget[i];
+  // initialisation (i starts from n) [SR, GSI, 18.02.2003]
+  for(UInt_t i=n; i<kMAXCLUSTERSPERTRACK; i++) {
+    fdQdl[i] = 0;
+    fIndex[i] = 0;
+    fIndexBackup[i] = 0;  //MI backup indexes
   }
-
+  for (Int_t i=0;i<3;i++) fBudget[i]=t.fBudget[i];
 }                                
 
 //_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliKalmanTrack &t, Double_t alpha) 
-  :AliKalmanTrack(t) 
-  ,fSeedLab(-1)
-  ,fdEdx(t.GetPIDsignal())
-  ,fDE(0)
-  ,fAlpha(alpha)
-  ,fX(0)
-  ,fStopped(kFALSE)
-  ,fY(0)
-  ,fZ(0)
-  ,fE(0)
-  ,fT(0)
-  ,fC(0)
-  ,fCyy(0)
-  ,fCzy(0)
-  ,fCzz(0)
-  ,fCey(0)
-  ,fCez(0)
-  ,fCee(0)
-  ,fCty(0)
-  ,fCtz(0)
-  ,fCte(0)
-  ,fCtt(0)
-  ,fCcy(0)
-  ,fCcz(0)
-  ,fCce(0)
-  ,fCct(0)
-  ,fCcc(0)
-  ,fLhElectron(0.0)
-  ,fNWrong(0)
-  ,fNRotate(0)
-  ,fNCross(0)
-  ,fNExpected(0)
-  ,fNLast(0)
-  ,fNExpectedLast(0)
-  ,fNdedx(0)
-  ,fChi2Last(0.0)
-  ,fBackupTrack(0x0)
+AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t /*alpha*/): 
+  AliKalmanTrack(t), 
+  fSeedLab(-1),
+  fdEdx(t.GetPIDsignal()),
+  fdEdxT(0),
+  fDE(0),
+  fStopped(kFALSE),
+  fLhElectron(0.0),
+  fNWrong(0),
+  fNRotate(0),
+  fNCross(0),
+  fNExpected(0),
+  fNLast(0),
+  fNExpectedLast(0),
+  fNdedx(0),
+  fChi2Last(0.0),
+  fBackupTrack(0x0)
 {
   //
   // Constructor from AliTPCtrack or AliITStrack .
   //
 
-  Int_t  i = 0;
-  Int_t  j = 0;
-  UInt_t k = 0;
-
-  SetChi2(0.0);
+  SetLabel(t.GetLabel());
+  SetChi2(0.);
+  SetMass(t.GetMass());
   SetNumberOfClusters(0);
 
-  for (i = 0; i < kNplane; i++) {
-    for (j = 0; j < kNslice; j++) {
+  for (Int_t i=0;i<kNplane;i++){
+    for (Int_t j=0;j<kNslice;j++){
       fdEdxPlane[i][j] = 0.0;
     }
     fTimBinPlane[i] = -1;
   }
 
-  if      (fAlpha < -TMath::Pi()) {
-    fAlpha += 2.0 * TMath::Pi();
-  }
-  else if (fAlpha >= TMath::Pi()) {
-    fAlpha -= 2.0 * TMath::Pi();
-  }
-
-  Double_t x;
-  Double_t p[5]; 
-  t.GetExternalParameters(x,p);
-  fX = x;
-  fY = p[0];
-  fZ = p[1];
-  fT = p[3]; 
-  x  = GetLocalConvConst();
-  fC = p[4] / x;
-  fE = fC * fX - p[2];   
-
-  // Conversion of the covariance matrix
-  Double_t c[15]; 
-  t.GetExternalCovariance(c);
-  c[10] /= x; 
-  c[11] /= x; 
-  c[12] /= x; 
-  c[13] /= x; 
-  c[14] /= x*x;
-
-  Double_t c22 = fX*fX * c[14] - 2.0*fX*c[12] + c[ 5];
-  Double_t c32 = fX    * c[13] -        c[ 8];
-  Double_t c20 = fX    * c[10] -        c[ 3]; 
-  Double_t c21 = fX    * c[11] -        c[ 4];
-  Double_t c42 = fX    * c[14] -        c[12];
-
-  fCyy = c[ 0];
-  fCzy = c[ 1];  fCzz = c[ 2];
-  fCey = c20;    fCez = c21;    fCee = c22;
-  fCty = c[ 6];  fCtz = c[ 7];  fCte = c32;  fCtt = c[ 9];
-  fCcy = c[10];  fCcz = c[11];  fCce = c42;  fCct = c[13];  fCcc = c[14];  
-
-  for (k = 0; k < kMAXCLUSTERSPERTRACK; k++) {
-    fdQdl[k]        = 0;
-    fIndex[k]       = 0;
-    fIndexBackup[k] = 0;
+  // Initialization [SR, GSI, 18.02.2003]
+  for(UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
+    fdQdl[i] = 0;
+    fIndex[i] = 0;
+    fIndexBackup[i] = 0;  // MI backup indexes    
   }
   
-  for (i = 0; i < 3; i++) { 
-    fBudget[i]      = 0;
-  }
-
+  for (Int_t i=0;i<3;i++) { fBudget[i]=0;};
 }              
 
 //_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliESDtrack &t) 
-  :AliKalmanTrack() 
-  ,fSeedLab(-1)
-  ,fdEdx(t.GetTRDsignal())
-  ,fDE(0)
-  ,fAlpha(t.GetAlpha())
-  ,fX(0)
-  ,fStopped(kFALSE)
-  ,fY(0)
-  ,fZ(0)
-  ,fE(0)
-  ,fT(0)
-  ,fC(0)
-  ,fCyy(1e10)
-  ,fCzy(0)
-  ,fCzz(1e10)
-  ,fCey(0)
-  ,fCez(0)
-  ,fCee(1e10)
-  ,fCty(0)
-  ,fCtz(0)
-  ,fCte(0)
-  ,fCtt(1e10)
-  ,fCcy(0)
-  ,fCcz(0)
-  ,fCce(0)
-  ,fCct(0)
-  ,fCcc(1e10)
-  ,fLhElectron(0.0)
-  ,fNWrong(0)
-  ,fNRotate(0)
-  ,fNCross(0)
-  ,fNExpected(0)
-  ,fNLast(0)
-  ,fNExpectedLast(0)
-  ,fNdedx(0)
-  ,fChi2Last(0.0)
-  ,fBackupTrack(0x0)
+AliTRDtrack::AliTRDtrack(const AliESDtrack &t):
+  AliKalmanTrack(), 
+  fSeedLab(-1),
+  fdEdx(t.GetTRDsignal()),
+  fdEdxT(0),
+  fDE(0),
+  fStopped(kFALSE),
+  fLhElectron(0),
+  fNWrong(0),
+  fNRotate(0),
+  fNCross(0),
+  fNExpected(0),
+  fNLast(0),
+  fNExpectedLast(0),
+  fNdedx(0),
+  fChi2Last(1e10),
+  fBackupTrack(0x0)
 {
   //
   // Constructor from AliESDtrack
   //
-
-  Int_t  i = 0;
-  Int_t  j = 0;
-  UInt_t k = 0;
-
   SetLabel(t.GetLabel());
   SetChi2(0.);
   SetMass(t.GetMass());
   SetNumberOfClusters(t.GetTRDclusters(fIndex)); 
 
   Int_t ncl = t.GetTRDclusters(fIndexBackup);
-  for (k = ncl; k < kMAXCLUSTERSPERTRACK; k++) {
-    fIndexBackup[k] = 0;
-    fIndex[k]       = 0;
+  for (UInt_t i=ncl;i<kMAXCLUSTERSPERTRACK;i++) {
+    fIndexBackup[i]=0;
+    fIndex[i] = 0; //MI store indexes
   }
-
-  for (i = 0; i < kNplane; i++) {
-    for (j = 0; j < kNslice; j++) {
+  for (Int_t i=0;i<kNplane;i++){
+    for (Int_t j=0;j<kNslice;j++){
       fdEdxPlane[i][j] = t.GetTRDsignals(i,j);
     }
     fTimBinPlane[i] = t.GetTRDTimBin(i);
   }
 
-  if      (fAlpha <  -TMath::Pi()) {
-    fAlpha += 2.0 * TMath::Pi();
-  }
-  else if (fAlpha >=  TMath::Pi()) {
-    fAlpha -= 2.0 * TMath::Pi();
-  }
 
-  // Conversion of the covariance matrix
-  Double_t x;
-  Double_t p[5]; 
-  t.GetExternalParameters(x,p);
-  Double_t c[15]; 
-  t.GetExternalCovariance(c);
-  if (t.GetStatus() & AliESDtrack::kTRDbackup) {
-    t.GetOuterExternalParameters(fAlpha,x,p);
-    t.GetOuterExternalCovariance(c);
-    if      (fAlpha <  -TMath::Pi()) {
-      fAlpha += 2.0 * TMath::Pi();
-    }
-    else if (fAlpha >=  TMath::Pi()) {
-      fAlpha -= 2.0 * TMath::Pi();
-    }
+  const AliExternalTrackParam *par=&t;
+  if (t.GetStatus()&AliESDtrack::kTRDbackup) { 
+    par=t.GetOuterParam();
+    if (!par) {AliError("***** No backup info !!! ****"); par=&t;}
   }
+  Set(par->GetX(),par->GetAlpha(),par->GetParameter(),par->GetCovariance());
 
-  fX = x;
-  fY = p[0];
-  fZ = p[1]; 
-  SaveLocalConvConst();
-  fT = p[3]; 
-  x  = GetLocalConvConst();
-  fC = p[4] / x;
-  fE = fC*fX - p[2];   
-
-  c[10] /= x; 
-  c[11] /= x; 
-  c[12] /= x; 
-  c[13] /= x;
-  c[14] /= x*x;
-
-  Double_t c22 = fX*fX * c[14] - 2.0*fX*c[12] + c[ 5];
-  Double_t c32 = fX    * c[13] - c[ 8];
-  Double_t c20 = fX    * c[10] - c[ 3];
-  Double_t c21 = fX    * c[11] - c[ 4];
-  Double_t c42 = fX    * c[14] - c[12];
-
-  fCyy = c[ 0];
-  fCzy = c[ 1];  fCzz = c[ 2];
-  fCey = c20;    fCez = c21;    fCee = c22;
-  fCty = c[ 6];  fCtz = c[ 7];  fCte = c32;  fCtt = c[ 9];
-  fCcy = c[10];  fCcz = c[11];  fCce = c42;  fCct = c[13];  fCcc = c[14];  
-
-  for (k = 0; k < kMAXCLUSTERSPERTRACK; k++) {
-    fdQdl[k] = 0;
-    //fIndex[k] = 0; //MI store indexes
-  }
+  
+  for (UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) fdQdl[i] = 0;
 
-  for (i = 0; i < 3; i++) { 
-    fBudget[i] = 0;
-  }
-  if ((t.GetStatus() & AliESDtrack::kTIME) == 0) {
-    return;
-  }
+  for (Int_t i=0;i<3;i++) fBudget[i]=0;
 
+  if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return;
   StartTimeIntegral();
-  Double_t times[10]; 
-  t.GetIntegratedTimes(times); 
-  SetIntegratedTimes(times);
+  Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times);
   SetIntegratedLength(t.GetIntegratedLength());
 
 }  
@@ -521,44 +298,11 @@ AliTRDtrack::~AliTRDtrack()
   // Destructor
   //
 
-  if (fBackupTrack) {
-    delete fBackupTrack;
-  }
+  if (fBackupTrack) delete fBackupTrack;
   fBackupTrack = 0;
 
 }
 
-//____________________________________________________________________________
-AliTRDtrack &AliTRDtrack::operator=(const AliTRDtrack &t)
-{
-  //
-  // Assignment operator
-  //
-
-  fLhElectron    = 0.0;
-  fNWrong        = 0;
-  fStopped       = 0;
-  fNRotate       = 0;
-  fNExpected     = 0;
-  fNExpectedLast = 0;
-  fNdedx         = 0;
-  fNCross        = 0;
-  fNLast         = 0;
-  fChi2Last      = 0;
-  fBackupTrack   = 0;
-
-  fAlpha = t.GetAlpha();
-  if      (fAlpha <  -TMath::Pi()) {
-    fAlpha += 2.0 * TMath::Pi();
-  }
-  else if (fAlpha >=  TMath::Pi()) {
-    fAlpha -= 2.0 * TMath::Pi();
-  }
-
-  return *this;
-
-}
-
 //____________________________________________________________________________
 Float_t AliTRDtrack::StatusForTOF()
 {
@@ -566,70 +310,21 @@ Float_t AliTRDtrack::StatusForTOF()
   // Defines the status of the TOF extrapolation
   //
 
-  // Definition of res ????
-  Float_t res = (0.2 + 0.8 * (fN / (fNExpected + 5.0)))
-              * (0.4 + 0.6 * fTracklets[5].GetN() / 20.0);
-  res *= (0.25 + 0.8 * 40.0 / (40.0 + fBudget[2]));
+  Float_t res = (0.2 + 0.8*(fN/(fNExpected+5.)))*(0.4+0.6*fTracklets[5].GetN()/20.);
+  res *= (0.25+0.8*40./(40.+fBudget[2]));
   return res;
 
-  // This part of the function is never reached ????
-  // What defines these parameters ????
-  Int_t status = 0;
-  if (GetNumberOfClusters()                <  20)  return 0;
-  if ((fN                                  > 110) && 
-      (fChi2/(Float_t(fN))                 < 3.0)) return 3; // Gold
-  if ((fNLast                              >  30) && 
-      (fChi2Last/(Float_t(fNLast))         < 3.0)) return 3; // Gold
-  if ((fNLast                              >  20) && 
-      (fChi2Last/(Float_t(fNLast))         < 2.0)) return 3; // Gold
-  if ((fNLast/(fNExpectedLast+3.0)         > 0.8) && 
-      (fChi2Last/Float_t(fNLast)           < 5.0) &&
-      (fNLast                              >  20)) return 2; // Silver
-  if ((fNLast                              >   5) &&  
-      (((fNLast+1.0)/(fNExpectedLast+1.0)) > 0.8) &&
-      (fChi2Last/(fNLast-5.0)              < 6.0)) return 1; 
+  Int_t status=0;
+  if (GetNumberOfClusters()<20) return 0;   //
+  if (fN>110&&fChi2/(Float_t(fN))<3) return 3;            //gold
+  if (fNLast>30&&fChi2Last/(Float_t(fNLast))<3) return 3; //gold
+  if (fNLast>20&&fChi2Last/(Float_t(fNLast))<2) return 3; //gold
+  if (fNLast/(fNExpectedLast+3.)>0.8 && fChi2Last/Float_t(fNLast)<5&&fNLast>20) return 2; //silber
+  if (fNLast>5 &&((fNLast+1.)/(fNExpectedLast+1.))>0.8&&fChi2Last/(fNLast-5.)<6)   return 1; 
   
   return status;
 
 }
-            
-//_____________________________________________________________________________
-void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const 
-{
-  //
-  // This function returns external representation of the covriance matrix.
-  //
-
-  Double_t a   = GetLocalConvConst();
-
-  Double_t c22 = fX*fX*fCcc  - 2.0*fX*fCce+fCee;
-  Double_t c32 = fX*fCct-fCte;
-  Double_t c20 = fX*fCcy-fCey;
-  Double_t c21 = fX*fCcz-fCez;
-  Double_t c42 = fX*fCcc-fCce;
-
-  cc[ 0]=fCyy;
-  cc[ 1]=fCzy;   cc[ 2]=fCzz;
-  cc[ 3]=c20;    cc[ 4]=c21;    cc[ 5]=c22;
-  cc[ 6]=fCty;   cc[ 7]=fCtz;   cc[ 8]=c32;   cc[ 9]=fCtt;
-  cc[10]=fCcy*a; cc[11]=fCcz*a; cc[12]=c42*a; cc[13]=fCct*a; cc[14]=fCcc*a*a; 
-  
-}               
-                       
-//_____________________________________________________________________________
-void AliTRDtrack::GetCovariance(Double_t cc[15]) const 
-{
-  //
-  // Returns the track covariance matrix
-  //
-
-  cc[ 0]=fCyy;
-  cc[ 1]=fCzy; cc[ 2]=fCzz;
-  cc[ 3]=fCey; cc[ 4]=fCez; cc[ 5]=fCee;
-  cc[ 6]=fCcy; cc[ 7]=fCcz; cc[ 8]=fCce; cc[ 9]=fCcc;
-  cc[10]=fCty; cc[11]=fCtz; cc[12]=fCte; cc[13]=fCct; cc[14]=fCtt;
-  
-}    
 
 //_____________________________________________________________________________
 Int_t AliTRDtrack::Compare(const TObject *o) const 
@@ -697,384 +392,128 @@ void AliTRDtrack::CookdEdx(Double_t low, Double_t up)
   dedx /= (nu - nl + 1.0);
   SetdEdx(dedx);
 
-  delete [] index;
-
 }                     
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
+Bool_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
 {
-  //
   // Propagates a track of particle with mass=pm to a reference plane 
   // defined by x=xk through media of density=rho and radiationLength=x0
-  //
 
-  if (xk == fX) {
-    return 1;
-  }
-
-  if (TMath::Abs(fC*xk - fE) >= 0.9) {
-    return 0;
-  }
+  if (xk == GetX()) return kTRUE;
 
-  Double_t lcc = GetLocalConvConst();
+  Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ();
 
-  Double_t oldX = fX;
-  Double_t oldY = fY;
-  Double_t oldZ = fZ;  
+  Double_t bz=GetBz();
+  if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE;
 
-  Double_t x1 = fX;
-  Double_t x2 = x1 + (xk - x1);
-  Double_t dx = x2 - x1;
-  Double_t y1 = fY;
-  Double_t z1 = fZ;
-  Double_t c1 = fC*x1 - fE;
-  if ((c1*c1) > 1) {
-    return 0;
+  Double_t x=GetX(), y=GetY(), z=GetZ();
+ Double_t d=TMath::Sqrt((x-oldX)*(x-oldX)+(y-oldY)*(y-oldY)+(z-oldZ)*(z-oldZ));
+  if (oldX < xk)
+  if (IsStartedTimeIntegral()) {
+    Double_t l2=d;
+    Double_t crv=GetC();
+    if (TMath::Abs(l2*crv)>0.0001){
+      // make correction for curvature if neccesary
+      l2 = 0.5*TMath::Sqrt((x-oldX)*(x-oldX) + (y-oldY)*(y-oldY));
+      l2 = 2*TMath::ASin(l2*crv)/crv;
+      l2 = TMath::Sqrt(l2*l2+(z-oldZ)*(z-oldZ));
+    }
+    AddTimeStep(l2);
   }
 
-  Double_t r1 = TMath::Sqrt(1.0 - c1*c1);
-  Double_t c2 = fC*x2 - fE; 
-  if ((c2*c2) > 1) {
-    return 0;
-  }
+  Double_t ll = (oldX < xk) ? -d : d;
+  if (!AliExternalTrackParam::CorrectForMaterial(ll*rho/x0,x0,GetMass())) 
+     return kFALSE;
 
-  Double_t r2 = TMath::Sqrt(1.0 - c2*c2);
-
-  fY += dx*(c1+c2) / (r1+r2);
-  fZ += dx*(c1+c2) / (c1*r2 + c2*r1) * fT;
-
-  // f = F - 1
-  Double_t rr  =  r1+r2;
-  Double_t cc  =  c1+c2;
-  Double_t xx  =  x1+x2;
-  Double_t f02 = -dx*(2*rr + cc*(c1/r1 + c2/r2))/(rr*rr);
-  Double_t f04 =  dx*(rr*xx + cc*(c1*x1/r1+c2*x2/r2))/(rr*rr);
-  Double_t cr  =  c1*r2+c2*r1;
-  Double_t f12 = -dx*fT*(2*cr + cc*(c2*c1/r1-r1 + c1*c2/r2-r2))/(cr*cr);
-  Double_t f13 =  dx*cc/cr;
-  Double_t f14 =  dx*fT*(cr*xx-cc*(r1*x2-c2*c1*x1/r1+r2*x1-c1*c2*x2/r2))/(cr*cr);
-
-  // b = C*ft
-  Double_t b00 = f02*fCey + f04*fCcy;
-  Double_t b01 = f12*fCey + f14*fCcy + f13*fCty;
-  Double_t b10 = f02*fCez + f04*fCcz;
-  Double_t b11 = f12*fCez + f14*fCcz + f13*fCtz;
-  Double_t b20 = f02*fCee + f04*fCce;
-  Double_t b21 = f12*fCee + f14*fCce + f13*fCte;
-  Double_t b30 = f02*fCte + f04*fCct;
-  Double_t b31 = f12*fCte + f14*fCct + f13*fCtt;
-  Double_t b40 = f02*fCce + f04*fCcc;
-  Double_t b41 = f12*fCce + f14*fCcc + f13*fCct;
-
-  // a = f*b = f*C*ft
-  Double_t a00 = f02*b20 + f04*b40;
-  Double_t a01 = f02*b21 + f04*b41;
-  Double_t a11 = f12*b21 + f14*b41 + f13*b31;
-
-  // F*C*Ft = C + (a + b + bt)
-  fCyy += a00 + 2.0*b00;
-  fCzy += a01 + b01 + b10;
-  fCey += b20;
-  fCty += b30;
-  fCcy += b40;
-  fCzz += a11 + 2.0*b11;
-  fCez += b21;
-  fCtz += b31;
-  fCcz += b41;
-
-  fX = x2;                                                     
-
-  // Change of the magnetic field
-  SaveLocalConvConst();
-  cc =  fC;
-  fC *= lcc / GetLocalConvConst();
-  fE += fX  * (fC-cc);
-
-  // Multiple scattering
-  // What is 14.1 ????
-  Double_t d      = TMath::Sqrt((x1-fX)*(x1-fX) + (y1-fY)*(y1-fY) + (z1-fZ)*(z1-fZ));
-  Double_t p2     = (1.0 + GetTgl()*GetTgl()) / (Get1Pt()*Get1Pt());
-  Double_t beta2  = p2 / (p2 + GetMass()*GetMass());
-  Double_t theta2 = 14.1*14.1 / (beta2*p2*1e6) * d / x0 * rho;
-  Double_t ey     = fC*fX - fE;
-  Double_t ez     = fT;
-  Double_t xz     = fC*ez;
-  Double_t zz1    = ez*ez + 1.0;
-  Double_t xy     = fE + ey;
-  
-  fCee += (2.0*ey*ez*ez*fE + 1.0 - ey*ey + ez*ez + fE*fE*ez*ez) * theta2;
-  fCte += ez*zz1*xy*theta2;
-  fCtt += zz1*zz1*theta2;
-  fCce += xz*ez*xy*theta2;
-  fCct += xz*zz1*theta2;
-  fCcc += xz*xz*theta2;
-
-  // Energy losses
-  // What is 5940.0 ???? and 0.153e-3 ????
-  if ((5940.0*beta2 / (1.0 - beta2 + 1e-10) - beta2) < 0.0) {
-    return 0;
-  }
-  Double_t dE     = 0.153e-3/beta2 * (TMath::Log(5940.0*beta2 / (1.0 - beta2 + 1e-10)) - beta2) 
-                  * d * rho;
-  Float_t  budget = d * rho;
-  fBudget[0] +=budget;
-  // Suspicious part - think about it ????
+  {//Energy losses************************
+  Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt());
+  Double_t beta2=p2/(p2 + GetMass()*GetMass());
+  if ((5940*beta2/(1-beta2+1e-10) - beta2) < 0) return kFALSE;
+
+  Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-10)) - beta2)*d*rho;
+  Float_t budget = d*rho;
+  fBudget[0] += budget;
+  /*
+  // suspicious part - think about it ?
   Double_t kinE =  TMath::Sqrt(p2);
-  if (dE > 0.8 * kinE) {
-    dE = 0.8 * kinE;
-  }
-  if (dE <        0.0) {
-    dE = 0.0;       // Not valid region for Bethe bloch 
-  }
-  fDE += dE;
-  if (x1 < x2) {
-    dE = -dE;
-  }
-  cc  = fC;
-  fC *= (1.0 - TMath::Sqrt(p2 + GetMass()*GetMass()) / p2 * dE);
-  fE += fX * (fC - cc);    
-
-  // Energy loss fluctuation 
-  // Why 0.07 ????
-  Double_t sigmade = 0.07 * TMath::Sqrt(TMath::Abs(dE));  
-  Double_t sigmac2 = sigmade*sigmade * fC*fC * (p2 + GetMass()*GetMass()) / (p2*p2);
+  if (dE>0.8*kinE) dE = 0.8*kinE;  //      
+  if (dE<0)        dE = 0.0;       // not valid region for Bethe bloch 
+  */
+  //
+  fDE+=dE;
+  /*
+  // Suspicious ! I.B.
+  Double_t sigmade = 0.07*TMath::Sqrt(TMath::Abs(dE));   // energy loss fluctuation 
+  Double_t sigmac2 = sigmade*sigmade*fC*fC*(p2+GetMass()*GetMass())/(p2*p2);
   fCcc += sigmac2;
-  fCee += fX*fX * sigmac2;  
-
-  // Track time measurement
-  if (x1 < x2) {
-    if (IsStartedTimeIntegral()) {
-      Double_t l2 = TMath::Sqrt((fX-oldX)*(fX-oldX) 
-                              + (fY-oldY)*(fY-oldY) 
-                              + (fZ-oldZ)*(fZ-oldZ));
-      if (TMath::Abs(l2*fC) > 0.0001){
-        // <ake correction for curvature if neccesary
-        l2 = 0.5 * TMath::Sqrt((fX-oldX)*(fX-oldX) 
-                             + (fY-oldY)*(fY-oldY));
-        l2 = 2.0 * TMath::ASin(l2 * fC) / fC;
-        l2 = TMath::Sqrt(l2*l2 + (fZ-oldZ)*(fZ-oldZ));
-      }
-      AddTimeStep(l2);
-    }
+  fCee += fX*fX*sigmac2;  
+  */
   }
 
-  return 1;            
+  return kTRUE;            
 
 }     
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq
-                        , UInt_t index, Double_t h01)
+Bool_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, Int_t index,
+                          Double_t h01)
 {
-  //
-  // Assignes a found cluster to the track and updates track information
-  //
+  // Assignes found cluster to the track and updates track information
 
   Bool_t fNoTilt = kTRUE;
-  // What is 0.003 ????
-  if (TMath::Abs(h01) > 0.003) {
-    fNoTilt = kFALSE;
-  }
-
-  // Add angular effect to the error contribution
-  Float_t tangent2  = (fC*fX-fE) * (fC*fX-fE);
+  if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE;
+  // add angular effect to the error contribution -  MI
+  Float_t tangent2 = GetSnp()*GetSnp();
   if (tangent2 < 0.90000){
-    tangent2 = tangent2 / (1.0 - tangent2);
-  }
-  // What is 0.04 ????
-  Float_t errang    = tangent2 * 0.04;
-  Float_t padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0);
-
-  Double_t r00 = c->GetSigmaY2() + errang;
-  Double_t r01 = 0.0;
-  Double_t r11 = c->GetSigmaZ2() * 100.0;
-  r00 += fCyy; 
-  r01 += fCzy; 
-  r11 += fCzz;
-  Double_t det = r00*r11 - r01*r01;
-  Double_t tmp = r00; 
-  r00 =  r11 / det; 
-  r11 =  tmp / det; 
-  r01 = -r01 / det;
-
-  Double_t k00 = fCyy*r00 + fCzy*r01;
-  Double_t k01 = fCyy*r01 + fCzy*r11;
-  Double_t k10 = fCzy*r00 + fCzz*r01;
-  Double_t k11 = fCzy*r01 + fCzz*r11;
-  Double_t k20 = fCey*r00 + fCez*r01; 
-  Double_t k21 = fCey*r01 + fCez*r11;
-  Double_t k30 = fCty*r00 + fCtz*r01;
-  Double_t k31 = fCty*r01 + fCtz*r11;
-  Double_t k40 = fCcy*r00 + fCcz*r01; 
-  Double_t k41 = fCcy*r01 + fCcz*r11;
-
-  Double_t dy  = c->GetY() - fY;
-  Double_t dz  = c->GetZ() - fZ;
-  Double_t cur = fC + k40*dy + k41*dz;
-  Double_t eta = fE + k20*dy + k21*dz;
-
-  if (fNoTilt) {
-
-    if (TMath::Abs(cur*fX-eta) >= 0.9) {
-      return 0;
-    }
-    fY += k00*dy + k01*dz;
-    fZ += k10*dy + k11*dz;
-    fE  = eta;
-    fC  = cur;
-
+    tangent2 = tangent2/(1.-tangent2);
   }
-  else {
+  //Float_t errang = tangent2*0.04; //
 
-    // Empirical factor set by C.Xu in the first tilt version      
-    // Is this factor still ok ???? 
-    Double_t xuFactor = 100.0;  
-    dy   = c->GetY() - fY; 
-    dz   = c->GetZ() - fZ;     
-    dy   = dy + h01*dz;
-
-    Float_t add = 0.0;
-    if (TMath::Abs(dz) > padlength/2.0) {
-      Float_t dy2  = c->GetY() - fY;
-      Float_t sign = (dz > 0.0) ? -1.0 : 1.0;
-      dy2 += h01 * sign * padlength/2.0;       
-      dy   = dy2;
-      add  = 0.0;
-    }
-  
-    r00  = c->GetSigmaY2() + errang + add;
-    r01  = 0.0;
-    r11  = c->GetSigmaZ2() * xuFactor; 
-    r00 += (fCyy + 2.0*h01*fCzy + h01*h01*fCzz);
-    r01 += (fCzy + h01*fCzz);
-    r11 += fCzz;
-
-    det  =  r00*r11 - r01*r01;
-    tmp  =  r00; 
-    r00  =  r11/det; 
-    r11  =  tmp/det; 
-    r01  = -r01/det;
-
-    k00  = fCyy*r00 + fCzy * (r01 + h01*r00);
-    k01  = fCyy*r01 + fCzy * (r11 + h01*r01);
-    k10  = fCzy*r00 + fCzz * (r01 + h01*r00);
-    k11  = fCzy*r01 + fCzz * (r11 + h01*r01);
-    k20  = fCey*r00 + fCez * (r01 + h01*r00);
-    k21  = fCey*r01 + fCez * (r11 + h01*r01);
-    k30  = fCty*r00 + fCtz * (r01 + h01*r00);
-    k31  = fCty*r01 + fCtz * (r11 + h01*r01);
-    k40  = fCcy*r00 + fCcz * (r01 + h01*r00);
-    k41  = fCcy*r01 + fCcz * (r11 + h01*r01);  
-
-    cur  = fC + k40*dy + k41*dz; 
-    eta  = fE + k20*dy + k21*dz;
-    if (TMath::Abs(cur*fX - eta) >= 0.9) {
-      return 0;
-    }                           
-
-    fY  += k00*dy + k01*dz;
-    fZ  += k10*dy + k11*dz;
-    fE   = eta;
-    fT  += k30*dy + k31*dz;
-    fC   = cur;
-    
-    k01 += h01*k00;
-    k11 += h01*k10;
-    k21 += h01*k20;
-    k31 += h01*k30;
-    k41 += h01*k40;  
-    
-  }
+  Double_t p[2]={c->GetY(), c->GetZ()};
+  //Double_t cov[3]={c->GetSigmaY2()+errang, 0., c->GetSigmaZ2()*100.};
+  Double_t sy2=c->GetSigmaY2()*4;
+  Double_t sz2=c->GetSigmaZ2()*4;
+  Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2};
 
-  Double_t c01 = fCzy;
-  Double_t c02 = fCey;
-  Double_t c03 = fCty;
-  Double_t c04 = fCcy;
-  Double_t c12 = fCez;
-  Double_t c13 = fCtz;
-  Double_t c14 = fCcz;
-
-  fCyy -= k00*fCyy + k01*fCzy; 
-  fCzy -= k00*c01  + k01*fCzz;
-  fCey -= k00*c02  + k01*c12; 
-  fCty -= k00*c03  + k01*c13;
-  fCcy -= k00*c04  + k01*c14;
-  
-  fCzz -= k10*c01  + k11*fCzz;
-  fCez -= k10*c02  + k11*c12;
-  fCtz -= k10*c03  + k11*c13;
-  fCcz -= k10*c04  + k11*c14;
-  
-  fCee -= k20*c02  + k21*c12;
-  fCte -= k20*c03  + k21*c13;
-  fCce -= k20*c04  + k21*c14;
-  
-  fCtt -= k30*c03  + k31*c13;
-  fCct -= k40*c03  + k41*c13;  
-  
-  fCcc -= k40*c04  + k41*c14;                 
+  if (!AliExternalTrackParam::Update(p,cov)) return kFALSE;
 
-  Int_t n = GetNumberOfClusters();
-  fIndex[n] = index;
+  Int_t n=GetNumberOfClusters();
+  fIndex[n]=index;
   SetNumberOfClusters(n+1);
 
   SetChi2(GetChi2()+chisq);
 
-  return 1;     
-
+  return kTRUE;     
 }                     
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq
-                          , UInt_t index, Double_t h01 
-                         , Int_t /*plane*/)
-{
-  //
+Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, Int_t index,                            Double_t h01, Int_t /*plane*/) {
   // Assignes found cluster to the track and updates track information
-  //
-
   Bool_t fNoTilt = kTRUE;
-  if (TMath::Abs(h01) > 0.003) {
-    fNoTilt = kFALSE;
-  }
-
-  //
-  // Add angular effect to the error contribution and make correction
-  // Still needed ???? 
-  // AliTRDclusterCorrection *corrector = AliTRDclusterCorrection::GetCorrection();
+  if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE;
+  // add angular effect to the error contribution and make correction  -  MI
   // 
-
-  Double_t tangent2 = (fC*fX-fE) * (fC*fX-fE);
-  if (tangent2 < 0.9) {
-    tangent2 = tangent2 / (1.0 - tangent2);
-  }
-  Double_t tangent  = TMath::Sqrt(tangent2);
-  if ((fC*fX-fE) < 0.0) {
-    tangent *= -1.0;
+  Double_t tangent2 = GetSnp()*GetSnp();
+  if (tangent2 < 0.90000){
+    tangent2 = tangent2/(1.-tangent2);
   }
+  Double_t tangent = TMath::Sqrt(tangent2);
+  if (GetSnp()<0) tangent*=-1;
+  //  Double_t correction = 0*plane;
+  /*
+  Double_t errang = tangent2*0.04;  //
+  Double_t errsys =0.025*0.025*20;  //systematic error part 
 
-  // Where are the parameters from ????
-  Double_t errang = tangent2 * 0.04;
-  Double_t errsys = 0.025*0.025 * 20.0;  // Systematic error part 
-
-  Float_t  extend = 1.0;
-  if (c->GetNPads() == 4) extend = 2.0;
+  Float_t extend =1;
+  if (c->GetNPads()==4) extend=2;
+  */
+  //if (c->GetNPads()==5)  extend=3;
+  //if (c->GetNPads()==6)  extend=3;
+  //if (c->GetQ()<15) return 1;
 
-  /////////////////////////////////////////////////////////////////////////////
-  //
-  // Is this still needed or will it be needed ????
-  //
-  //if (c->GetNPads() == 5) extend = 3.0;
-  //if (c->GetNPads() == 6) extend = 3.0;
-  //if (c->GetQ() < 15) {
-  //  return 1;
-  //}
-  //
-  // Will this be needed ????
   /*
-  if (corrector !=0 ) {
+  if (corrector!=0){
   //if (0){
     correction = corrector->GetCorrection(plane,c->GetLocalTimeBin(),tangent);
     if (TMath::Abs(correction)>0){
@@ -1085,223 +524,90 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq
     }
   }
   */
-  //  
-  //  Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12.);
-  /////////////////////////////////////////////////////////////////////////////
-
-  Double_t r00 = (c->GetSigmaY2() + errang + errsys) * extend;
-  Double_t r01 = 0.0;
-  Double_t r11 = c->GetSigmaZ2()*10000.0;
-  r00 += fCyy; 
-  r01 += fCzy; 
-  r11 += fCzz;
-  Double_t det =r00*r11 - r01*r01;
-  Double_t tmp =r00;
-  r00  =  r11 / det; 
-  r11  =  tmp / det; 
-  r01  = -r01 / det;
-
-  Double_t k00 = fCyy*r00 + fCzy*r01;
-  Double_t k01 = fCyy*r01 + fCzy*r11;
-  Double_t k10 = fCzy*r00 + fCzz*r01;
-  Double_t k11 = fCzy*r01 + fCzz*r11;
-  Double_t k20 = fCey*r00 + fCez*r01;
-  Double_t k21 = fCey*r01 + fCez*r11;
-  Double_t k30 = fCty*r00 + fCtz*r01;
-  Double_t k31 = fCty*r01 + fCtz*r11;
-  Double_t k40 = fCcy*r00 + fCcz*r01;
-  Double_t k41 = fCcy*r01 + fCcz*r11;
-
-  Double_t dy  = c->GetY() - fY;
-  Double_t dz  = c->GetZ() - fZ;
-  Double_t cur = fC + k40*dy + k41*dz;
-  Double_t eta = fE + k20*dy + k21*dz;
-
-  if (fNoTilt) {
-
-    if (TMath::Abs(cur*fX - eta) >= 0.9) {
-      return 0;
-    }
-
-    fY += k00*dy + k01*dz;
-    fZ += k10*dy + k11*dz;
-    fE  = eta;
-    fC  = cur;
-
-  }
-  else {
-
-    Double_t padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0);
-    // Empirical factor set by C.Xu in the first tilt version 
-    Double_t xuFactor  = 1000.0;  
-
-    dy = c->GetY() - fY; 
-    dz = c->GetZ() - fZ;     
-    //dy = dy + h01*dz + correction; // Still needed ????
-    
-    Double_t tiltdz = dz;
-    if (TMath::Abs(tiltdz) > padlength/2.0) {
-      tiltdz = TMath::Sign(padlength/2.0,dz);
-    }
-    dy = dy + h01*tiltdz;
-
-    Double_t add = 0.0;
-    if (TMath::Abs(dz) > padlength/2.0) {
-      //Double_t dy2 = c->GetY() - fY;     // Still needed ????
-      //Double_t sign = (dz>0) ? -1.: 1.;
-      //dy2-=h01*sign*padlength/2.;    
-      //dy = dy2;
-      add = 1.0;
+  //
+  //Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12.);
+  /*
+    {
+      Double_t dy=c->GetY() - GetY(), dz=c->GetZ() - GetZ();     
+      printf("%e %e %e %e\n",dy,dz,padlength/2,h01);
     }
+  */
+  Double_t p[2]={c->GetY(), c->GetZ()};
+  /*
+  Double_t cov[3]={(c->GetSigmaY2()+errang+errsys)*extend, 0., 
+                  c->GetSigmaZ2()*10000.};
+  */
+  Double_t sy2=c->GetSigmaY2()*4;
+  Double_t sz2=c->GetSigmaZ2()*4;
+  Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2};
 
-    Double_t s00 = (c->GetSigmaY2() + errang) * extend + errsys + add;  // Error pad
-    Double_t s11 = c->GetSigmaZ2() * xuFactor;                          // Error pad-row
-    //
-    r00  = fCyy + 2*fCzy*h01 + fCzz*h01*h01 + s00;
-    r01  = fCzy + fCzz*h01;
-    r11  = fCzz + s11;
-    det  = r00*r11 - r01*r01;
-
-    // Inverse matrix
-    tmp  =  r00; 
-    r00  =  r11 / det; 
-    r11  =  tmp / det; 
-    r01  = -r01 / det;
-
-    // K matrix
-    k00  = fCyy*r00 + fCzy * (r01 + h01*r00);
-    k01  = fCyy*r01 + fCzy * (r11 + h01*r01);
-    k10  = fCzy*r00 + fCzz * (r01 + h01*r00);
-    k11  = fCzy*r01 + fCzz * (r11 + h01*r01);
-    k20  = fCey*r00 + fCez * (r01 + h01*r00);
-    k21  = fCey*r01 + fCez * (r11 + h01*r01);
-    k30  = fCty*r00 + fCtz * (r01 + h01*r00);
-    k31  = fCty*r01 + fCtz * (r11 + h01*r01);
-    k40  = fCcy*r00 + fCcz * (r01 + h01*r00);
-    k41  = fCcy*r01 + fCcz * (r11 + h01*r01);  
-    
-    // Update measurement
-    cur  = fC + k40*dy + k41*dz; 
-    eta  = fE + k20*dy + k21*dz;
-    if (TMath::Abs(cur*fX - eta) >= 0.9) {
-      return 0;
-    }                           
-    fY  += k00*dy + k01*dz;
-    fZ  += k10*dy + k11*dz;
-    fE   = eta;
-    fT  += k30*dy + k31*dz;
-    fC   = cur;
-    
-    k01 += h01*k00;
-    k11 += h01*k10;
-    k21 += h01*k20;
-    k31 += h01*k30;
-    k41 += h01*k40;  
-    
-  }
-
-  // Update the covariance matrix
-  Double_t oldyy = fCyy;
-  Double_t oldzz = fCzz; 
-  //Double_t oldee = fCee;
-  //Double_t oldcc = fCcc;
-  Double_t oldzy = fCzy;
-  Double_t oldey = fCey;
-  Double_t oldty = fCty;
-  Double_t oldcy = fCcy;
-  Double_t oldez = fCez;
-  Double_t oldtz = fCtz;
-  Double_t oldcz = fCcz;
-  //Double_t oldte = fCte;
-  //Double_t oldce = fCce;
-  //Double_t oldct = fCct;
+  if (!AliExternalTrackParam::Update(p,cov)) return kFALSE;
 
-  fCyy -= k00*oldyy + k01*oldzy;   
-  fCzy -= k10*oldyy + k11*oldzy;
-  fCey -= k20*oldyy + k21*oldzy;   
-  fCty -= k30*oldyy + k31*oldzy;
-  fCcy -= k40*oldyy + k41*oldzy;  
-  
-  fCzz -= k10*oldzy + k11*oldzz;
-  fCez -= k20*oldzy + k21*oldzz;   
-  fCtz -= k30*oldzy + k31*oldzz;
-  fCcz -= k40*oldzy + k41*oldzz;
-  
-  fCee -= k20*oldey + k21*oldez;   
-  fCte -= k30*oldey + k31*oldez;
-  fCce -= k40*oldey + k41*oldez;
-  
-  fCtt -= k30*oldty + k31*oldtz;
-  fCct -= k40*oldty + k41*oldtz;
-  
-  fCcc -= k40*oldcy + k41*oldcz;                 
-
-  Int_t n = GetNumberOfClusters();
-  fIndex[n] = index;
+  Int_t n=GetNumberOfClusters();
+  fIndex[n]=index;
   SetNumberOfClusters(n+1);
+  SetChi2(GetChi2()+chisq);
 
-  SetChi2(GetChi2() + chisq);
-
-  return 1;      
-
+  return kTRUE;      
 }                     
-
+/*
 //_____________________________________________________________________________
 Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet)
 {
   //
   // Assignes found tracklet to the track and updates track information
   //
-  
-  Double_t r00 = (tracklet.GetTrackletSigma2());
-  Double_t r01 = 0.0;
-  Double_t r11 = 10000.0;
-  r00 += fCyy; 
-  r01 += fCzy; 
-  r11 += fCzz;
-  
-  Double_t det = r00*r11 - r01*r01;
-  Double_t tmp = r00; 
-  r00 =  r11 / det; 
-  r11 =  tmp / det; 
-  r01 = -r01 / det;
+  //
+  Double_t r00=(tracklet.GetTrackletSigma2()), r01=0., r11= 10000.;
+  r00+=fCyy; r01+=fCzy; r11+=fCzz;
+  //
+  Double_t det=r00*r11 - r01*r01;
+  Double_t tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det;
+  //
 
-  Double_t dy  = tracklet.GetY() - fY;
-  Double_t dz  = tracklet.GetZ() - fZ;
+  Double_t dy=tracklet.GetY() - fY, dz=tracklet.GetZ() - fZ;
 
-  Double_t s00 = tracklet.GetTrackletSigma2();  // Error pad
-  Double_t s11 = 100000.0;                      // Error pad-row
-  Float_t  h01 = tracklet.GetTilt();
   
-  r00 = fCyy + fCzz*h01*h01 + s00;
-  r01 = fCzy;
+  Double_t s00 = tracklet.GetTrackletSigma2();  // error pad
+  Double_t s11 = 100000;   // error pad-row
+  Float_t  h01 = tracklet.GetTilt();
+  //
+  //  r00 = fCyy + 2*fCzy*h01 + fCzz*h01*h01+s00;
+  r00 = fCyy + fCzz*h01*h01+s00;
+  //  r01 = fCzy + fCzz*h01;
+  r01 = fCzy ;
   r11 = fCzz + s11;
   det = r00*r11 - r01*r01;
-
-  // Inverse matrix
-  tmp =  r00; 
-  r00 =  r11 / det; 
-  r11 =  tmp / det; 
-  r01 = -r01 / det;
-
-  // K matrix
-  Double_t k00 = fCyy*r00 + fCzy*r01;
-  Double_t k01 = fCyy*r01 + fCzy*r11;
-  Double_t k10 = fCzy*r00 + fCzz*r01;
-  Double_t k11 = fCzy*r01 + fCzz*r11;
-  Double_t k20 = fCey*r00 + fCez*r01;
-  Double_t k21 = fCey*r01 + fCez*r11;
-  Double_t k30 = fCty*r00 + fCtz*r01;
-  Double_t k31 = fCty*r01 + fCtz*r11;
-  Double_t k40 = fCcy*r00 + fCcz*r01;
-  Double_t k41 = fCcy*r01 + fCcz*r11;
+  // inverse matrix
+  tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det;
+
+  Double_t k00=fCyy*r00+fCzy*r01, k01=fCyy*r01+fCzy*r11;
+  Double_t k10=fCzy*r00+fCzz*r01, k11=fCzy*r01+fCzz*r11;
+  Double_t k20=fCey*r00+fCez*r01, k21=fCey*r01+fCez*r11;
+  Double_t k30=fCty*r00+fCtz*r01, k31=fCty*r01+fCtz*r11;
+  Double_t k40=fCcy*r00+fCcz*r01, k41=fCcy*r01+fCcz*r11;
   
-  // Update measurement
-  Double_t cur = fC + k40*dy + k41*dz;
-  Double_t eta = fE + k20*dy + k21*dz;  
-  if (TMath::Abs(cur*fX-eta) >= 0.9) {
+  // K matrix
+//   k00=fCyy*r00+fCzy*(r01+h01*r00),k01=fCyy*r01+fCzy*(r11+h01*r01);
+//   k10=fCzy*r00+fCzz*(r01+h01*r00),k11=fCzy*r01+fCzz*(r11+h01*r01);
+//   k20=fCey*r00+fCez*(r01+h01*r00),k21=fCey*r01+fCez*(r11+h01*r01);
+//   k30=fCty*r00+fCtz*(r01+h01*r00),k31=fCty*r01+fCtz*(r11+h01*r01);
+//   k40=fCcy*r00+fCcz*(r01+h01*r00),k41=fCcy*r01+fCcz*(r11+h01*r01);  
+  //
+  //Update measurement
+  Double_t cur=fC + k40*dy + k41*dz, eta=fE + k20*dy + k21*dz;  
+  //  cur=fC + k40*dy + k41*dz; eta=fE + k20*dy + k21*dz;
+  if (TMath::Abs(cur*fX-eta) >= 0.90000) {
+    //Int_t n=GetNumberOfClusters();
+    //      if (n>4) cerr<<n<<" AliTRDtrack warning: Filtering failed !\n";
     return 0;
   }                           
+//   k01+=h01*k00;
+//   k11+=h01*k10;
+//   k21+=h01*k20;
+//   k31+=h01*k30;
+//   k41+=h01*k40;  
+
 
   fY += k00*dy + k01*dz;
   fZ += k10*dy + k11*dz;
@@ -1309,140 +615,67 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet)
   fT += k30*dy + k31*dz;
   fC  = cur;
     
-  // Update the covariance matrix
-  Double_t oldyy = fCyy;
-  Double_t oldzz = fCzz; 
-  //Double_t oldee = fCee;
-  //Double_t oldcc = fCcc;
-  Double_t oldzy = fCzy;
-  Double_t oldey = fCey;
-  Double_t oldty = fCty;
-  Double_t oldcy = fCcy;
-  Double_t oldez = fCez;
-  Double_t oldtz = fCtz;
-  Double_t oldcz = fCcz;
-  //Double_t oldte = fCte;
-  //Double_t oldce = fCce;
+  
+  //Update covariance
+  //
+  //
+  Double_t oldyy = fCyy, oldzz = fCzz; //, oldee=fCee, oldcc =fCcc;
+  Double_t oldzy = fCzy, oldey = fCey, oldty=fCty, oldcy =fCcy;
+  Double_t oldez = fCez, oldtz = fCtz, oldcz=fCcz;
+  //Double_t oldte = fCte, oldce = fCce;
   //Double_t oldct = fCct;
 
-  fCyy -= k00*oldyy + k01*oldzy;   
-  fCzy -= k10*oldyy + k11*oldzy;
-  fCey -= k20*oldyy + k21*oldzy;   
-  fCty -= k30*oldyy + k31*oldzy;
-  fCcy -= k40*oldyy + k41*oldzy;  
-  
-  fCzz -= k10*oldzy + k11*oldzz;
-  fCez -= k20*oldzy + k21*oldzz;   
-  fCtz -= k30*oldzy + k31*oldzz;
-  fCcz -= k40*oldzy + k41*oldzz;
-  
-  fCee -= k20*oldey + k21*oldez;   
-  fCte -= k30*oldey + k31*oldez;
-  fCce -= k40*oldey + k41*oldez;
-  
-  fCtt -= k30*oldty + k31*oldtz;
-  fCct -= k40*oldty + k41*oldtz;
+  fCyy-=k00*oldyy+k01*oldzy;   
+  fCzy-=k10*oldyy+k11*oldzy;
+  fCey-=k20*oldyy+k21*oldzy;   
+  fCty-=k30*oldyy+k31*oldzy;
+  fCcy-=k40*oldyy+k41*oldzy;  
+  //
+  fCzz-=k10*oldzy+k11*oldzz;
+  fCez-=k20*oldzy+k21*oldzz;   
+  fCtz-=k30*oldzy+k31*oldzz;
+  fCcz-=k40*oldzy+k41*oldzz;
+  //
+  fCee-=k20*oldey+k21*oldez;   
+  fCte-=k30*oldey+k31*oldez;
+  fCce-=k40*oldey+k41*oldez;
+  //
+  fCtt-=k30*oldty+k31*oldtz;
+  fCct-=k40*oldty+k41*oldtz;
+  //
+  fCcc-=k40*oldcy+k41*oldcz;                 
+  //
   
-  fCcc -= k40*oldcy + k41*oldcz;                 
+  //Int_t n=GetNumberOfClusters();
+  //fIndex[n]=index;
+  //SetNumberOfClusters(n+1);
+
+  //SetChi2(GetChi2()+chisq);
+  //  cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
 
   return 1;      
 
 }                     
+*/
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::Rotate(Double_t alpha, Bool_t absolute)
+Bool_t AliTRDtrack::Rotate(Double_t alpha, Bool_t absolute)
 {
-  //
-  // Rotates the track parameters in the R*phi plane,
-  // if the absolute rotation alpha is in global system.
-  // Otherwise the rotation is relative to the current rotation angle
-  //  
-
+  // Rotates track parameters in R*phi plane
+  // if absolute rotation alpha is in global system
+  // otherwise alpha rotation is relative to the current rotation angle
+  
   if (absolute) {
-    alpha -= fAlpha;
+    alpha -= GetAlpha();
   }
   else{
     fNRotate++;
   }
 
-  fAlpha += alpha;
-  if (fAlpha <  -TMath::Pi()) {
-    fAlpha += 2.0 * TMath::Pi();
-  }
-  if (fAlpha >=  TMath::Pi()) {
-    fAlpha -= 2.0 * TMath::Pi();
-  }
-
-  Double_t x1 = fX;
-  Double_t y1 = fY;
-  Double_t ca = TMath::Cos(alpha);
-  Double_t sa = TMath::Sin(alpha);
-  Double_t r1 = fC*fX - fE;
-
-  fX =  x1*ca + y1*sa;
-  fY = -x1*sa + y1*ca;
-  if ((r1*r1) > 1.0) {
-    return 0;
-  }
-  fE = fE*ca + (fC*y1 + TMath::Sqrt(1.0 - r1*r1)) * sa;
-
-  Double_t r2 = fC*fX - fE;
-  if (TMath::Abs(r2) >= 0.9) {
-    Int_t n = GetNumberOfClusters();
-    if (n > 4) {
-      AliError(Form("Rotation failed N = %d !\n",n));
-    }
-    return 0;
-  }
-
-  if ((r2*r2) > 1.0) {
-    return 0;
-  }
-  Double_t y0 = fY + TMath::Sqrt(1.0 - r2*r2) / fC;
-  if ((fY-y0)*fC >= 0.0) {
-    Int_t n = GetNumberOfClusters();
-    if (n > 4) {
-      AliError(Form("Rotation failed N = %d !\n",n));
-    }
-    return 0;
-  }
-
-  // f = F - 1
-  Double_t f00 = ca-1.0;
-  Double_t f24 = (y1 - r1*x1/TMath::Sqrt(1.0 - r1*r1)) * sa;
-  Double_t f20 = fC*sa; 
-  Double_t f22 = (ca + sa*r1/TMath::Sqrt(1.0 - r1*r1)) - 1.0;
-
-  // b = C*ft
-  Double_t b00 = fCyy*f00;
-  Double_t b02 = fCyy*f20 + fCcy*f24 + fCey*f22;
-  Double_t b10 = fCzy*f00;
-  Double_t b12 = fCzy*f20 + fCcz*f24 + fCez*f22;
-  Double_t b20 = fCey*f00;
-  Double_t b22 = fCey*f20 + fCce*f24 + fCee*f22;
-  Double_t b30 = fCty*f00;
-  Double_t b32 = fCty*f20 + fCct*f24 + fCte*f22;
-  Double_t b40 = fCcy*f00;
-  Double_t b42 = fCcy*f20 + fCcc*f24 + fCce*f22;
-
-  // a = f*b = f*C*ft
-  Double_t a00 = f00*b00;
-  Double_t a02 = f00*b02;
-  Double_t a22 = f20*b02  + f24*b42  + f22*b22;
-
-  // F*C*Ft = C + (a + b + bt)
-  fCyy += a00 + 2.0*b00;
-  fCzy += b10;
-  fCey += a02 +     b20 + b02;
-  fCty += b30;
-  fCcy += b40;
-  fCez += b12;
-  fCte += b32;
-  fCee += a22 + 2.0*b22;
-  fCce += b42;
-
-  return 1;                            
+  if (GetLabel()==277)
+    printf("Rotate %e %e %e %e\n",GetAlpha(),GetX(),GetY(),GetZ());
 
+  return AliExternalTrackParam::Rotate(GetAlpha()+alpha);
 }                         
 
 //_____________________________________________________________________________
@@ -1452,147 +685,56 @@ Double_t AliTRDtrack::GetPredictedChi2(const AliTRDcluster *c, Double_t h01) con
   // Returns the track chi2
   //  
 
-  Bool_t fNoTilt = kTRUE;
-  if (TMath::Abs(h01) > 0.003) {
-    fNoTilt = kFALSE;
-  }
+  Double_t p[2]={c->GetY(), c->GetZ()};
+  Double_t sy2=c->GetSigmaY2()*4;
+  Double_t sz2=c->GetSigmaZ2()*4;
+  Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2};
+
+  return AliExternalTrackParam::GetPredictedChi2(p,cov);
 
-  Double_t chi2;
-  Double_t dy;
-  Double_t r00;
-  Double_t r01;
-  Double_t r11;
+  /*
+  Bool_t fNoTilt = kTRUE;
+  if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE;
 
-  if (fNoTilt) {
+  return (c->GetY() - GetY())*(c->GetY() - GetY())/c->GetSigmaY2();
+  */
 
-    dy   = c->GetY() - fY;
-    r00  = c->GetSigmaY2();    
-    chi2 = (dy*dy) / r00;    
+  /*
+  Double_t chi2, dy, r00, r01, r11;
 
+  if(fNoTilt) {
+    dy=c->GetY() - fY;
+    r00=c->GetSigmaY2();    
+    chi2 = (dy*dy)/r00;    
   }
   else {
+    Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12);
+    //
+    r00=c->GetSigmaY2(); r01=0.; r11=c->GetSigmaZ2();
+    r00+=fCyy; r01+=fCzy; r11+=fCzz;
 
-    Double_t padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0);
-
-    r00  = c->GetSigmaY2(); 
-    r01  = 0.0; 
-    r11  = c->GetSigmaZ2();
-    r00 += fCyy; 
-    r01 += fCzy; 
-    r11 += fCzz;
-
-    Double_t det = r00*r11 - r01*r01;
+    Double_t det=r00*r11 - r01*r01;
     if (TMath::Abs(det) < 1.e-10) {
-      Int_t n = GetNumberOfClusters(); 
-      if (n > 4) {
-        AliError(Form("Singular matrix N = %d!\n",n));
-      }
+      Int_t n=GetNumberOfClusters(); 
+      if (n>4) cerr<<n<<" AliTRDtrack warning: Singular matrix !\n";
       return 1e10;
     }
-
-    Double_t tmp = r00; 
-    r00  =  r11; 
-    r11  =  tmp; 
-    r01  = -r01;
-    Double_t dy     = c->GetY() - fY;
-    Double_t dz     = c->GetZ() - fZ;
+    Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01;
+    Double_t dy=c->GetY() - fY, dz=c->GetZ() - fZ;
     Double_t tiltdz = dz;
-    if (TMath::Abs(tiltdz) > padlength/2.0) {
-      tiltdz = TMath::Sign(padlength/2.0,dz);
+    if (TMath::Abs(tiltdz)>padlength/2.) {
+      tiltdz = TMath::Sign(padlength/2,dz);
     }
-    dy = dy + h01*tiltdz;
-
-    chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz) / det; 
+    //    dy=dy+h01*dz;
+    dy=dy+h01*tiltdz;
 
+    chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; 
   }
 
   return chi2;
-
+  */
 }      
 
-//_________________________________________________________________________
-void AliTRDtrack::GetPxPyPz(Double_t& px, Double_t& py, Double_t& pz) const
-{
-  //
-  // Returns reconstructed track momentum in the global system.
-  //
-
-  Double_t pt = TMath::Abs(GetPt());
-  Double_t r  = fC*fX - fE;
-
-  Double_t y0; 
-  if      (r >  1) { 
-    py =  pt; 
-    px = 0.0;
-  }
-  else if (r < -1) { 
-    py = -pt; 
-    px = 0.0;
-  }
-  else {
-    y0 =  fY + TMath::Sqrt(1.0 - r*r) / fC;  
-    px = -pt * (fY - y0) * fC; //cos(phi);
-    py = -pt * (fE - fX*fC);   //sin(phi);
-  }
-
-  pz = pt*fT;
-  Double_t tmp = px * TMath::Cos(fAlpha) 
-               - py * TMath::Sin(fAlpha);
-  py = px * TMath::Sin(fAlpha) 
-     + py * TMath::Cos(fAlpha);
-  px = tmp;            
-
-}                                
-
-//_________________________________________________________________________
-void AliTRDtrack::GetGlobalXYZ(Double_t& x, Double_t& y, Double_t& z) const
-{
-  //
-  // Returns reconstructed track coordinates in the global system.
-  //
-
-  x = fX; 
-  y = fY; 
-  z = fZ
-; 
-  Double_t tmp = x * TMath::Cos(fAlpha)
-               - y * TMath::Sin(fAlpha);
-  y = x * TMath::Sin(fAlpha) 
-    + y * TMath::Cos(fAlpha);
-  x = tmp;            
-
-}                                
-
-//_________________________________________________________________________
-void AliTRDtrack::ResetCovariance() 
-{
-  //
-  // Resets covariance matrix
-  //
-
-  fCyy *= 10.0;
-  fCzy  =  0.0;  fCzz *= 10.0;
-  fCey  =  0.0;  fCez  =  0.0;  fCee *= 10.0;
-  fCty  =  0.0;  fCtz  =  0.0;  fCte  =  0.0;  fCtt *= 10.0;
-  fCcy  =  0.0;  fCcz  =  0.0;  fCce  =  0.0;  fCct  =  0.0;  fCcc *= 10.0;  
-
-}                                                         
-
-//_____________________________________________________________________________
-void AliTRDtrack::ResetCovariance(Float_t mult) 
-{
-  //
-  // Resets covariance matrix
-  //
-
-  fCyy *= mult;
-  fCzy *= 0.0;   fCzz *= 1.0;
-  fCey *= 0.0;   fCez *= 0.0;   fCee *= mult;
-  fCty *= 0.0;   fCtz *= 0.0;   fCte *= 0.0;   fCtt *= 1.0;
-  fCcy *= 0.0;   fCcz *= 0.0;   fCce *= 0.0;   fCct *= 0.0;   fCcc *= mult;  
-
-}                                                         
-
 //_____________________________________________________________________________
 void AliTRDtrack::MakeBackupTrack()
 {
@@ -1600,10 +742,7 @@ void AliTRDtrack::MakeBackupTrack()
   // Creates a backup track
   //
 
-  if (fBackupTrack) {
-    delete fBackupTrack;
-  }
-
+  if (fBackupTrack) delete fBackupTrack;
   fBackupTrack = new AliTRDtrack(*this);
   
 }
@@ -1613,74 +752,51 @@ Int_t AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z)
 {
   //
   // Find prolongation at given x
-  // Return 0 if it does not exist
-  //
+  // return 0 if not exist
   
-  Double_t c1 = fC*fX - fE;
-  if (TMath::Abs(c1) > 1.0) {
-    return 0;
-  }
-
-  Double_t r1 = TMath::Sqrt(1.0 - c1*c1);
-  Double_t c2 = fC*xk - fE;
-  if (TMath::Abs(c2) > 1.0) {
-    return 0;  
-  }
+  Double_t bz=GetBz();
 
-  Double_t r2 = TMath::Sqrt(1.0 - c2*c2);
-  y = fY + (xk-fX)*(c1+c2)/(r1+r2);
-  z = fZ + (xk-fX)*(c1+c2)/(c1*r2 + c2*r1)*fT;
+  if (!AliExternalTrackParam::GetYAt(xk,bz,y)) return 0;
+  if (!AliExternalTrackParam::GetZAt(xk,bz,z)) return 0;
 
-  return 1;
-  
+  return 1;  
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step)
+Int_t   AliTRDtrack::PropagateToX(Double_t xr, Double_t step)
 {
   //
-  // Propagate track to a given x position 
-  // Works inside of the 20 degree segmentation
-  // (local cooordinate frame for TRD , TPC, TOF)
+  // Propagate track to given x  position 
+  // works inside of the 20 degree segmentation (local cooordinate frame for TRD , TPC, TOF)
   // 
-  // The material budget is taken from the geo manager
-  //
-  Double_t  xyz0[3];
-  Double_t  xyz1[3];
-  Double_t  y;
-  Double_t  z;
-
-  // Critical alpha  - cross sector indication
-  const Double_t kAlphac  = TMath::Pi()/9.0;   
+  // material budget from geo manager
+  // 
+  Double_t  xyz0[3], xyz1[3],y,z;
+  const Double_t kAlphac  = TMath::Pi()/9.;   
   const Double_t kTalphac = TMath::Tan(kAlphac*0.5);
-
-  // Direction +-
-  Double_t dir = (fX > xr) ? -1.0 : 1.0;
-
-  for (Double_t x = fX + dir*step; dir*x < dir*xr; x += dir*step) {
-    
-    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+  // critical alpha  - cross sector indication
+  //
+  Double_t dir = (GetX()>xr) ? -1.:1.;
+  // direction +-
+  for (Double_t x=GetX()+dir*step;dir*x<dir*xr;x+=dir*step){
+    //
+    GetXYZ(xyz0);      
     GetProlongation(x,y,z);
-    xyz1[0] = x * TMath::Cos(fAlpha) + y * TMath::Sin(fAlpha); 
-    xyz1[1] = x * TMath::Sin(fAlpha) - y * TMath::Cos(fAlpha);
+    xyz1[0] = x*TMath::Cos(GetAlpha())+y*TMath::Sin(GetAlpha()); 
+    xyz1[1] = x*TMath::Sin(GetAlpha())-y*TMath::Cos(GetAlpha());
     xyz1[2] = z;
     Double_t param[7];
     AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
-    
-    if ((param[0] > 0) && 
-        (param[1] > 0)) {
-      PropagateTo(x,param[1],param[0]);
-    }
-    if (fY >  fX*kTalphac) {
+    //
+    if (param[0]>0&&param[1]>0) PropagateTo(x,param[1],param[0]);
+    if (GetY()>GetX()*kTalphac){
       Rotate(-kAlphac);
     }
-    if (fY < -fX*kTalphac) {
+    if (GetY()<-GetX()*kTalphac){
       Rotate(kAlphac);
     }
-
   }
-
+  //
   PropagateTo(xr);
 
   return 0;
@@ -1688,53 +804,42 @@ Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step)
 }
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::PropagateToR(Double_t r,Double_t step)
+Int_t   AliTRDtrack::PropagateToR(Double_t r,Double_t step)
 {
   //
-  // Propagate a track to a given radial position
-  // The rotation is always connected to the last track position
+  // propagate track to the radial position
+  // rotation always connected to the last track position
   //
-
-  Double_t xyz0[3];
-  Double_t xyz1[3];
-  Double_t y;
-  Double_t z; 
-
-  // Direction +-
-  Double_t radius = TMath::Sqrt(fX*fX + fY*fY);
-  Double_t dir    = (radius > r) ? -1.0 : 1.0;   
-  
-  for (Double_t x = radius + dir*step; dir*x < dir*r; x += dir*step) {
-    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+  Double_t  xyz0[3], xyz1[3],y,z; 
+  Double_t radius = TMath::Sqrt(GetX()*GetX() + GetY()*GetY());
+  Double_t dir = (radius>r) ? -1.:1.;   // direction +-
+  //
+  for (Double_t x=radius+dir*step;dir*x<dir*r;x+=dir*step){
+    GetXYZ(xyz0);      
     Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]);
     Rotate(alpha,kTRUE);
-    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+    GetXYZ(xyz0);      
     GetProlongation(x,y,z);
-    xyz1[0] = x * TMath::Cos(alpha) + y * TMath::Sin(alpha); 
-    xyz1[1] = x * TMath::Sin(alpha) - y * TMath::Cos(alpha);
+    xyz1[0] = x*TMath::Cos(alpha)+y*TMath::Sin(alpha); 
+    xyz1[1] = x*TMath::Sin(alpha)-y*TMath::Cos(alpha);
     xyz1[2] = z;
     Double_t param[7];
     AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
-    if (param[1] <= 0.0) {
-      param[1] = 100000000.0;
-    }
+    if (param[1]<=0) param[1] =100000000;
     PropagateTo(x,param[1],param[0]);
   } 
-
-  GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);       
+  GetXYZ(xyz0);        
   Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]);
   Rotate(alpha,kTRUE);
-  GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);       
+  GetXYZ(xyz0);        
   GetProlongation(r,y,z);
-  xyz1[0] = r * TMath::Cos(alpha) + y * TMath::Sin(alpha); 
-  xyz1[1] = r * TMath::Sin(alpha) - y * TMath::Cos(alpha);
+  xyz1[0] = r*TMath::Cos(alpha)+y*TMath::Sin(alpha); 
+  xyz1[1] = r*TMath::Sin(alpha)-y*TMath::Cos(alpha);
   xyz1[2] = z;
   Double_t param[7];
   AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
-  
-  if (param[1] <= 0.0) {
-    param[1] = 100000000.0;
-  }
+  //
+  if (param[1]<=0) param[1] =100000000;
   PropagateTo(r,param[1],param[0]);
 
   return 0;
@@ -1748,58 +853,12 @@ Int_t AliTRDtrack::GetSector() const
   // Return the current sector
   //
 
-  return Int_t(TVector2::Phi_0_2pi(fAlpha)
+  return Int_t(TVector2::Phi_0_2pi(GetAlpha())
              / AliTRDgeometry::GetAlpha())
              % AliTRDgeometry::kNsect;
 
 }
 
-//_____________________________________________________________________________
-Double_t AliTRDtrack::Get1Pt() const                       
-{ 
-  //
-  // Returns the inverse Pt (1/GeV/c)
-  // (or 1/"most probable pt", if the field is too weak)
-  //
-
-  if (TMath::Abs(GetLocalConvConst()) > kVeryBigConvConst) {
-    return 1.0 / kMostProbableMomentum 
-               / TMath::Sqrt(1.0 + GetTgl()*GetTgl());
-  }
-
-  return (TMath::Sign(1.0e-9,fC) + fC) * GetLocalConvConst();
-
-}
-
-//_____________________________________________________________________________
-Double_t AliTRDtrack::GetP() const                         
-{ 
-  //
-  // Returns the total momentum
-  //
-
-  return TMath::Abs(GetPt()) * TMath::Sqrt(1.0 + GetTgl()*GetTgl());  
-
-}
-
-//_____________________________________________________________________________
-Double_t AliTRDtrack::GetYat(Double_t xk) const            
-{     
-  //
-  // This function calculates the Y-coordinate of a track at 
-  // the plane x = xk.
-  // Needed for matching with the TOF (I.Belikov)
-  //
-
-  Double_t c1 = fC*fX - fE;
-  Double_t r1 = TMath::Sqrt(1.0 - c1*c1);
-  Double_t c2 = fC*xk - fE;
-  Double_t r2 = TMath::Sqrt(1.0-  c2*c2);
-
-  return fY + (xk-fX)*(c1+c2)/(r1+r2);
-
-}
-
 //_____________________________________________________________________________
 void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i)    
 {
@@ -1809,8 +868,7 @@ void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i)
 
   Double_t s = GetSnp();
   Double_t t = GetTgl();
-
-  q *= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t));
+  q *= TMath::Sqrt((1-s*s)/(1+t*t));
   fdQdl[i] = q;
 
 }     
@@ -1824,24 +882,19 @@ void AliTRDtrack::SetSampledEdx(Float_t q)
 
   Double_t s = GetSnp();
   Double_t t = GetTgl();
-
-  q*= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t));
+  q*= TMath::Sqrt((1-s*s)/(1+t*t));
   fdQdl[fNdedx] = q;
   fNdedx++;
 
 }     
 
-//_____________________________________________________________________________
-void AliTRDtrack::GetXYZ(Float_t r[3]) const 
-{
+Double_t AliTRDtrack::GetBz() const {
   //
-  // Returns the position of the track in the global coord. system 
+  // returns Bz component of the magnetic field (kG)
   //
+  if (AliTracker::UniformField()) return AliTracker::GetBz();
+  Double_t r[3]; GetXYZ(r);
+  return AliTracker::GetBz(r);
+}
 
-  Double_t cs = TMath::Cos(fAlpha);
-  Double_t sn = TMath::Sin(fAlpha);
-  r[0] = fX*cs - fY*sn; 
-  r[1] = fX*sn + fY*cs; 
-  r[2] = fZ;
 
-}