]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TRD/AliTRDtrack.cxx
Storing the trigger class mask into the raw data header. Should be ok for TPC,PHOS...
[u/mrichter/AliRoot.git] / TRD / AliTRDtrack.cxx
index 782a160bcef2f3c53d9e8ccf25964022aa2ed3b8..c8c41f78740afe86da7c1a7d77414e6643c4e6be 100644 (file)
 /* $Id$ */
 
 #include <Riostream.h>
-#include <TObject.h>   
+#include <TMath.h>
+#include <TVector2.h>
 
+#include "AliESDtrack.h"
 #include "AliTRDgeometry.h" 
 #include "AliTRDcluster.h" 
 #include "AliTRDtrack.h"
-#include "AliTRDclusterCorrection.h"
+#include "AliTRDtracklet.h"
 
-ClassImp(AliTRDtracklet)
 ClassImp(AliTRDtrack)
 
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+//  Represents a reconstructed TRD track                                     //
+//  Local TRD Kalman track                                                   //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+
+AliTRDtrack::AliTRDtrack():
+  AliKalmanTrack(),
+  fSeedLab(-1),
+  fdEdx(0),
+  fdEdxT(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)
 
-  AliTRDtracklet::AliTRDtracklet():fY(0),fX(0),fAlpha(0),fSigma2(0),fP0(0),fP1(0),fNFound(0),fNCross(0),fPlane(0),fExpectedSigma2(0),fChi2(0){
+{
+  for (Int_t i=0; i<kNplane; i++) {
+    fdEdxPlane[i] = 0;
+    fTimBinPlane[i] = -1;
+  }
+  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() {
@@ -61,7 +116,9 @@ AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, UInt_t index,
   SetNumberOfClusters(1);
 
   fdEdx=0.;
-  for (Int_t i=0;i<kNPlane;i++){
+  fdEdxT=0.;
+  fDE=0.;
+  for (Int_t i=0;i<kNplane;i++){
       fdEdxPlane[i] = 0.;
       fTimBinPlane[i] = -1;
   }
@@ -83,16 +140,20 @@ AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, UInt_t index,
   fdQdl[0] = q;
   
   // initialisation [SR, GSI 18.02.2003] (i startd for 1)
-  for(UInt_t i=1; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+  for(UInt_t i=1; i<kMAXCLUSTERSPERTRACK; i++) {
     fdQdl[i] = 0;
     fIndex[i] = 0;
-    fIndexBackup[i] = 0;  //bacup indexes MI    
+    fIndexBackup[i] = 0;  //backup indexes MI    
   }
-  fBackupTrack =0;  
+  for (Int_t i=0;i<3;i++) { fBudget[i]=0;};
+
+  fBackupTrack = 0;  
+
 }                              
            
 //_____________________________________________________________________________
-AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) {
+AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) 
+{
   //
   // Copy constructor.
   //
@@ -102,9 +163,12 @@ AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) {
 
   SetChi2(t.GetChi2());
   fdEdx=t.fdEdx;
-  for (Int_t i=0;i<kNPlane;i++){
+  fdEdxT=t.fdEdxT;
+  fDE=t.fDE;
+  for (Int_t i=0;i<kNplane;i++){
       fdEdxPlane[i] = t.fdEdxPlane[i];
       fTimBinPlane[i] = t.fTimBinPlane[i];
+      fTracklets[i]   = t.fTracklets[i];
   }
 
   fLhElectron = 0.0;
@@ -139,16 +203,21 @@ AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) {
   }
 
   // initialisation (i starts from n) [SR, GSI, 18.02.2003]
-  for(UInt_t i=n; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+  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<6;i++){
+    fTracklets[i] = t.fTracklets[i];
+  }
+  for (Int_t i=0;i<3;i++) { fBudget[i]=t.fBudget[i];};
 }                                
 
 //_____________________________________________________________________________
 AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t alpha) 
-           :AliKalmanTrack(t) {
+           :AliKalmanTrack(t) 
+{
   //
   // Constructor from AliTPCtrack or AliITStrack .
   //
@@ -159,7 +228,8 @@ AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t alpha)
   SetNumberOfClusters(0);
 
   fdEdx=t.GetPIDsignal();
-  for (Int_t i=0;i<kNPlane;i++){
+  fDE  = 0;
+  for (Int_t i=0;i<kNplane;i++){
     fdEdxPlane[i] = 0.0;
     fTimBinPlane[i] = -1;
   }
@@ -206,16 +276,19 @@ AliTRDtrack::AliTRDtrack(const AliKalmanTrack& t, Double_t alpha)
   fCcy=c[10];   fCcz=c[11];   fCce=c42;   fCct=c[13]; fCcc=c[14];  
 
   // Initialization [SR, GSI, 18.02.2003]
-  for(UInt_t i=0; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+  for(UInt_t i=0; 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]=0;};
 }              
+
 //_____________________________________________________________________________
 AliTRDtrack::AliTRDtrack(const AliESDtrack& t) 
-           :AliKalmanTrack() {
+           :AliKalmanTrack() 
+{
   //
   // Constructor from AliESDtrack
   //
@@ -225,12 +298,13 @@ AliTRDtrack::AliTRDtrack(const AliESDtrack& t)
   SetMass(t.GetMass());
   SetNumberOfClusters(t.GetTRDclusters(fIndex)); 
   Int_t ncl = t.GetTRDclusters(fIndexBackup);
-  for (UInt_t i=ncl;i<kMAX_CLUSTERS_PER_TRACK;i++) {
+  for (UInt_t i=ncl;i<kMAXCLUSTERSPERTRACK;i++) {
     fIndexBackup[i]=0;
     fIndex[i] = 0; //MI store indexes
   }
-  fdEdx=t.GetTRDsignal();
-  for (Int_t i=0;i<kNPlane;i++){
+  fdEdx=t.GetTRDsignal();  
+  fDE =0;     
+  for (Int_t i=0;i<kNplane;i++){
     fdEdxPlane[i] = t.GetTRDsignals(i);
     fTimBinPlane[i] = t.GetTRDTimBin(i);
   }
@@ -255,7 +329,8 @@ AliTRDtrack::AliTRDtrack(const AliESDtrack& t)
   //Conversion of the covariance matrix
   Double_t c[15]; t.GetExternalCovariance(c);
   if (t.GetStatus()&AliESDtrack::kTRDbackup){
-    t.GetTRDExternalParameters(x,fAlpha,p,c);
+    t.GetOuterExternalParameters(fAlpha,x,p);
+    t.GetOuterExternalCovariance(c);
     if      (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi();
     else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
   }
@@ -282,11 +357,12 @@ AliTRDtrack::AliTRDtrack(const AliESDtrack& t)
   fCcy=c[10];   fCcz=c[11];   fCce=c42;   fCct=c[13]; fCcc=c[14];  
 
   // Initialization [SR, GSI, 18.02.2003]
-  for(UInt_t i=0; i<kMAX_CLUSTERS_PER_TRACK; i++) {
+  for(UInt_t i=0; i<kMAXCLUSTERSPERTRACK; i++) {
     fdQdl[i] = 0;
     //    fIndex[i] = 0; //MI store indexes
   }
 
+  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);
@@ -294,19 +370,90 @@ AliTRDtrack::AliTRDtrack(const AliESDtrack& t)
 
 }  
 
+//____________________________________________________________________________
 AliTRDtrack::~AliTRDtrack()
 {
   //
+  // Destructor
   //
 
   if (fBackupTrack) delete fBackupTrack;
-  fBackupTrack=0;
+  fBackupTrack = 0;
 
 }
 
+//____________________________________________________________________________
+AliTRDtrack &AliTRDtrack::operator=(const AliTRDtrack &t)
+{
+  //
+  // Assignment operator
+  //
 
-Float_t    AliTRDtrack::StatusForTOF()
+  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*TMath::Pi();
+  else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi();
+
+  return *this;
+
+}
+
+// //____________________________________________________________________________
+// AliTRDtrack * AliTRDtrack::MakeTrack(const AliTrackReference *ref, Double_t mass)
+// {
+//   //
+//   // Make dummy track from the track reference 
+//   // negative mass means opposite charge 
+//   //
+//   Double_t xx[5];
+//   Double_t cc[15];
+//   for (Int_t i=0;i<15;i++) cc[i]=0;
+//   Double_t x = ref->X(), y = ref->Y(), z = ref->Z();
+//   Double_t alpha = TMath::ATan2(y,x);
+//   Double_t xr = TMath::Sqrt(x*x+y*y);
+//   xx[0] = 0;
+//   xx[1] = z;
+//   xx[3] = ref->Pz()/ref->Pt();
+//   Float_t b[3];
+//   Float_t xyz[3]={x,y,z};
+//   Float_t convConst = 0;
+//   (AliKalmanTrack::GetFieldMap())->Field(xyz,b);
+//   convConst=1000/0.299792458/(1e-13 - b[2]);
+//   xx[4] = 1./(convConst*ref->Pt());
+//   if (mass<0) xx[4]*=-1.;  // negative mass - negative direction
+//   Double_t lcos = (x*ref->Px()+y*ref->Py())/(xr*ref->Pt());
+//   Double_t lsin = TMath::Sin(TMath::ACos(lcos));
+//   if (mass<0) lsin*=-1.;
+//   xx[2]   = xr*xx[4]-lsin;
+//   AliTRDcluster cl;
+//   AliTRDtrack * track = new  AliTRDtrack(&cl,100,xx,cc,xr,alpha);
+//   track->SetMass(TMath::Abs(mass));
+//   track->StartTimeIntegral();  
+//   return track;
+// }
+
+//____________________________________________________________________________
+Float_t AliTRDtrack::StatusForTOF()
 {
+  //
+  // Defines the status of the TOF extrapolation
+  //
+
+  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;
+
   Int_t status=0;
   if (GetNumberOfClusters()<20) return 0;   //
   if (fN>110&&fChi2/(Float_t(fN))<3) return 3;            //gold
@@ -314,30 +461,34 @@ Float_t    AliTRDtrack::StatusForTOF()
   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::GetExternalParameters(Double_t& xr, Double_t x[5]) const {
+void AliTRDtrack::GetExternalParameters(Double_t& xr, Double_t x[5]) const 
+{
   //
   // This function returns external TRD track representation
   //
-     xr=fX;
-     x[0]=GetY();
-     x[1]=GetZ();
-     x[2]=GetSnp();
-     x[3]=GetTgl();
-     x[4]=Get1Pt();
+
+  xr   = fX;
+  x[0] = GetY();
+  x[1] = GetZ();
+  x[2] = GetSnp();
+  x[3] = GetTgl();
+  x[4] = Get1Pt();
+
 }           
 
 //_____________________________________________________________________________
-void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const {
+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*fX*fCce+fCee;
@@ -352,9 +503,12 @@ void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const {
   
 }               
                        
-
 //_____________________________________________________________________________
-void AliTRDtrack::GetCovariance(Double_t cc[15]) const {
+void AliTRDtrack::GetCovariance(Double_t cc[15]) const 
+{
+  //
+  // Returns the track covariance matrix
+  //
 
   cc[0]=fCyy;
   cc[1]=fCzy;  cc[2]=fCzz;
@@ -365,9 +519,11 @@ void AliTRDtrack::GetCovariance(Double_t cc[15]) const {
 }    
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::Compare(const TObject *o) const {
-
-// Compares tracks according to their Y2 or curvature
+Int_t AliTRDtrack::Compare(const TObject *o) const 
+{
+  //
+  // Compares tracks according to their Y2 or curvature
+  //
 
   AliTRDtrack *t=(AliTRDtrack*)o;
   //  Double_t co=t->GetSigmaY2();
@@ -376,9 +532,10 @@ Int_t AliTRDtrack::Compare(const TObject *o) const {
   Double_t co=TMath::Abs(t->GetC());
   Double_t c =TMath::Abs(GetC());  
 
-  if (c>co) return 1;
+  if      (c>co) return 1;
   else if (c<co) return -1;
   return 0;
+
 }                
 
 //_____________________________________________________________________________
@@ -395,23 +552,10 @@ void AliTRDtrack::CookdEdx(Double_t low, Double_t up) {
     return;
   }
 
-  Float_t sorted[kMAX_CLUSTERS_PER_TRACK];
+  Float_t sorted[kMAXCLUSTERSPERTRACK];
   for (i=0; i < nc; i++) {
     sorted[i]=fdQdl[i];
   }
-  /*
-  Int_t swap; 
-
-  do {
-    swap=0;
-    for (i=0; i<nc-1; i++) {
-      if (sorted[i]<=sorted[i+1]) continue;
-      Float_t tmp=sorted[i];
-      sorted[i]=sorted[i+1]; sorted[i+1]=tmp;
-      swap++;
-    }
-  } while (swap);
-  */
   Int_t nl=Int_t(low*nc), nu=Int_t(up*nc);
   Float_t dedx=0;
   //for (i=nl; i<=nu; i++) dedx += sorted[i];
@@ -419,9 +563,22 @@ void AliTRDtrack::CookdEdx(Double_t low, Double_t up) {
   for (i=0; i<nc; i++) dedx += sorted[i];       // ADDED by PS
   if((nu-nl)) dedx /= (nu-nl);                  // ADDED by PS
 
+  //SetdEdx(dedx);
+  //
+  // now real truncated mean
+  for (i=0; i < nc; i++) {
+    sorted[i]=TMath::Abs(fdQdl[i]);
+  }
+  Int_t * index = new Int_t[nc];
+  TMath::Sort(nc, sorted, index,kFALSE);
+  dedx=0;
+  for (i=nl; i<=nu; i++) dedx += sorted[index[i]];
+  dedx /= (nu-nl+1);
+  fdEdxT = dedx;
+  delete [] index;
   SetdEdx(dedx);
-}                     
 
+}                     
 
 //_____________________________________________________________________________
 Int_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
@@ -524,24 +681,45 @@ Int_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho)
   if((5940*beta2/(1-beta2+1e-10) - beta2) < 0) return 0;
 
   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)        dE = 0.0;       // not valid region for Bethe bloch 
+  //
+  //
+  fDE+=dE;
   if (x1 < x2) dE=-dE;
   cc=fC;
   fC*=(1.- sqrt(p2+GetMass()*GetMass())/p2*dE);
   fE+=fX*(fC-cc);    
+  //  Double_t sigmade = 0.1*dE*TMath::Sqrt(TMath::Sqrt(1+fT*fT)*90./(d+0.0001));   // 20 percent fluctuation - normalized to some length 
+  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 [SR, GSI 17.02.2002]
   if (x1 < x2)
   if (IsStartedTimeIntegral()) {
-    Double_t l2 = (fX-oldX)*(fX-oldX) + (fY-oldY)*(fY-oldY) + (fZ-oldZ)*(fZ-oldZ);
-    AddTimeStep(TMath::Sqrt(l2));
+    Double_t l2 = TMath::Sqrt((fX-oldX)*(fX-oldX) + (fY-oldY)*(fY-oldY) + (fZ-oldZ)*(fZ-oldZ));
+    if (TMath::Abs(l2*fC)>0.0001){
+      // make correction for curvature if neccesary
+      l2 = 0.5*TMath::Sqrt((fX-oldX)*(fX-oldX) + (fY-oldY)*(fY-oldY));
+      l2 = 2*TMath::ASin(l2*fC)/fC;
+      l2 = TMath::Sqrt(l2*l2+(fZ-oldZ)*(fZ-oldZ));
+    }
+    AddTimeStep(l2);
   }
 
   return 1;            
 }     
 
-
 //_____________________________________________________________________________
-Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index,                          Double_t h01)
+Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index
+                        , Double_t h01)
 {
   // Assignes found cluster to the track and updates track information
 
@@ -583,7 +761,7 @@ Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index,
     fC  = cur;
   }
   else {
-    Double_t xu_factor = 100.;  // empirical factor set by C.Xu
+    Double_t xuFactor = 100.;  // empirical factor set by C.Xu
                                 // in the first tilt version      
     dy=c->GetY() - fY; dz=c->GetZ() - fZ;     
     dy=dy+h01*dz;
@@ -598,10 +776,11 @@ Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index,
    
 
 
-    r00=c->GetSigmaY2()+errang+add, r01=0., r11=c->GetSigmaZ2()*xu_factor; 
+    r00=c->GetSigmaY2()+errang+add, r01=0., r11=c->GetSigmaZ2()*xuFactor; 
     r00+=(fCyy+2.0*h01*fCzy+h01*h01*fCzz);
+    r01+=(fCzy+h01*fCzz);
+    r11+=fCzz;
 
-    r01+=(fCzy+h01*fCzz);  
     det=r00*r11 - r01*r01;
     tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det;
 
@@ -660,7 +839,9 @@ Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index,
   //  cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
 
   return 1;     
+
 }                     
+
 //_____________________________________________________________________________
 Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, UInt_t index, Double_t h01, 
                            Int_t /*plane*/)
@@ -732,7 +913,7 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, UInt_t index
   else {
     Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12);
   
-    Double_t xu_factor = 1000.;  // empirical factor set by C.Xu
+    Double_t xuFactor = 1000.;  // empirical factor set by C.Xu
                                 // in the first tilt version      
     dy=c->GetY() - fY; dz=c->GetZ() - fZ;     
     //dy=dy+h01*dz+correction;
@@ -753,7 +934,7 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, UInt_t index
       add =1;
     }
     Double_t s00 = (c->GetSigmaY2()+errang)*extend+errsys+add;  // error pad
-    Double_t s11 = c->GetSigmaZ2()*xu_factor;   // error pad-row
+    Double_t s11 = c->GetSigmaZ2()*xuFactor;   // error pad-row
     //
     r00 = fCyy + 2*fCzy*h01 + fCzz*h01*h01+s00;
     r01 = fCzy + fCzz*h01;
@@ -827,9 +1008,8 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, UInt_t index
   //  cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
 
   return 1;      
-}                     
-
 
+}                     
 
 //_____________________________________________________________________________
 Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet)
@@ -933,17 +1113,24 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet)
   SetChi2(GetChi2()+chisq);
   //  cerr<<"in update: fIndex["<<fN<<"] = "<<index<<endl;
   */
-  return 1;      
-}                     
 
+  return 1;      
 
+}                     
 
 //_____________________________________________________________________________
-Int_t AliTRDtrack::Rotate(Double_t alpha)
+Int_t AliTRDtrack::Rotate(Double_t alpha, Bool_t absolute)
 {
   // 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
   
-  fNRotate++;
+  if (absolute) {
+    alpha -= fAlpha;
+  }
+  else{
+    fNRotate++;
+  }
 
   fAlpha += alpha;
   if (fAlpha<-TMath::Pi()) fAlpha += 2*TMath::Pi();
@@ -999,13 +1186,16 @@ Int_t AliTRDtrack::Rotate(Double_t alpha)
   fCce += b42;
 
   return 1;                            
-}                         
 
+}                         
 
 //_____________________________________________________________________________
 Double_t AliTRDtrack::GetPredictedChi2(const AliTRDcluster *c, Double_t h01) const
 {
-  
+  //
+  // Returns the track chi2
+  //  
+
   Bool_t fNoTilt = kTRUE;
   if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE;
   Double_t chi2, dy, r00, r01, r11;
@@ -1038,9 +1228,10 @@ Double_t AliTRDtrack::GetPredictedChi2(const AliTRDcluster *c, Double_t h01) con
 
     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
@@ -1078,7 +1269,8 @@ void AliTRDtrack::GetGlobalXYZ(Double_t& x, Double_t& y, Double_t& z) const
 }                                
 
 //_________________________________________________________________________
-void AliTRDtrack::ResetCovariance() {
+void AliTRDtrack::ResetCovariance() 
+{
   //
   // Resets covariance matrix
   //
@@ -1088,9 +1280,12 @@ void AliTRDtrack::ResetCovariance() {
   fCey=0.;  fCez=0.;  fCee*=10.;
   fCty=0.;  fCtz=0.;  fCte=0.;  fCtt*=10.;
   fCcy=0.;  fCcz=0.;  fCce=0.;  fCct=0.;  fCcc*=10.;  
+
 }                                                         
 
-void AliTRDtrack::ResetCovariance(Float_t mult) {
+//_____________________________________________________________________________
+void AliTRDtrack::ResetCovariance(Float_t mult) 
+{
   //
   // Resets covariance matrix
   //
@@ -1100,22 +1295,24 @@ void AliTRDtrack::ResetCovariance(Float_t mult) {
   fCey*=0.;  fCez*=0.;  fCee*=mult;
   fCty*=0.;  fCtz*=0.;  fCte*=0.;  fCtt*=1.;
   fCcy*=0.;  fCcz*=0.;  fCce*=0.;  fCct*=0.;  fCcc*=mult;  
-}                                                         
-
-
-
 
+}                                                         
 
+//_____________________________________________________________________________
 void AliTRDtrack::MakeBackupTrack()
 {
   //
+  // Creates a backup track
   //
+
   if (fBackupTrack) delete fBackupTrack;
   fBackupTrack = new AliTRDtrack(*this);
   
 }
 
-Int_t  AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z){
+//_____________________________________________________________________________
+Int_t AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z)
+{
   //
   // Find prolongation at given x
   // return 0 if not exist
@@ -1132,3 +1329,184 @@ Int_t  AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z){
   return 1;
   
 }
+
+//_____________________________________________________________________________
+Int_t   AliTRDtrack::PropagateToX(Double_t xr, Double_t step)
+{
+  //
+  // Propagate track to given x  position 
+  // works inside of the 20 degree segmentation (local cooordinate frame for TRD , TPC, TOF)
+  // 
+  // 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);
+  // critical alpha  - cross sector indication
+  //
+  Double_t dir = (fX>xr) ? -1.:1.;
+  // direction +-
+  for (Double_t x=fX+dir*step;dir*x<dir*xr;x+=dir*step){
+    //
+    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+    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[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){
+      Rotate(-kAlphac);
+    }
+    if (fY<-fX*kTalphac){
+      Rotate(kAlphac);
+    }
+  }
+  //
+  PropagateTo(xr);
+
+  return 0;
+
+}
+
+//_____________________________________________________________________________
+Int_t   AliTRDtrack::PropagateToR(Double_t r,Double_t step)
+{
+  //
+  // propagate track to the radial position
+  // rotation always connected to the last track position
+  //
+  Double_t  xyz0[3], xyz1[3],y,z; 
+  Double_t radius = TMath::Sqrt(fX*fX+fY*fY);
+  Double_t dir = (radius>r) ? -1.:1.;   // direction +-
+  //
+  for (Double_t x=radius+dir*step;dir*x<dir*r;x+=dir*step){
+    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+    Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]);
+    Rotate(alpha,kTRUE);
+    GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);     
+    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[2] = z;
+    Double_t param[7];
+    AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
+    if (param[1]<=0) param[1] =100000000;
+    PropagateTo(x,param[1],param[0]);
+  } 
+  GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);       
+  Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]);
+  Rotate(alpha,kTRUE);
+  GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]);       
+  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[2] = z;
+  Double_t param[7];
+  AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param);
+  //
+  if (param[1]<=0) param[1] =100000000;
+  PropagateTo(r,param[1],param[0]);
+
+  return 0;
+
+}
+
+//_____________________________________________________________________________
+Int_t AliTRDtrack::GetSector() const
+{
+  //
+  // Return the current sector
+  //
+
+  return Int_t(TVector2::Phi_0_2pi(fAlpha)
+             / AliTRDgeometry::GetAlpha())
+             % AliTRDgeometry::kNsect;
+
+}
+
+//_____________________________________________________________________________
+Double_t  AliTRDtrack::Get1Pt() const                       
+{ 
+  //
+  // Returns 1 / pt
+  //
+
+  return (TMath::Sign(1e-9,fC) + fC)*GetLocalConvConst(); 
+
+}
+
+//_____________________________________________________________________________
+Double_t  AliTRDtrack::GetP() const                         
+{ 
+  //
+  // Returns the total momentum
+  //
+
+  return TMath::Abs(GetPt())*sqrt(1.+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)    
+{
+  //
+  // The sampled energy loss
+  //
+
+  Double_t s = GetSnp();
+  Double_t t = GetTgl();
+  q *= TMath::Sqrt((1-s*s)/(1+t*t));
+  fdQdl[i] = q;
+
+}     
+
+ //_____________________________________________________________________________
+void AliTRDtrack::SetSampledEdx(Float_t q) 
+{
+  //
+  // The sampled energy loss
+  //
+
+  Double_t s = GetSnp();
+  Double_t t = GetTgl();
+  q*= TMath::Sqrt((1-s*s)/(1+t*t));
+  fdQdl[fNdedx] = q;
+  fNdedx++;
+
+}     
+
+//_____________________________________________________________________________
+void AliTRDtrack::GetXYZ(Float_t r[3]) const 
+{
+
+  //---------------------------------------------------------------------
+  // Returns the position of the track in the global coord. system 
+  //---------------------------------------------------------------------
+
+  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;
+
+}