]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDtrack.cxx
Transient pointer of ESDtrack back to the event introduced.
[u/mrichter/AliRoot.git] / STEER / AliESDtrack.cxx
index 1b8c595c285babd3d72a387f8f821c5550685484..14714f4b771cc7838d7fecdcff12ed831dc958d0 100644 (file)
 
 #include <TMath.h>
 #include <TParticle.h>
+#include <TDatabasePDG.h>
 
 #include "AliESDVertex.h"
 #include "AliESDtrack.h"
+#include "AliESDEvent.h"
 #include "AliKalmanTrack.h"
 #include "AliVTrack.h"
 #include "AliLog.h"
@@ -160,6 +162,7 @@ AliESDtrack::AliESDtrack() :
   fIp(0),
   fTPCInner(0),
   fOp(0),
+  fHMPIDp(0),  
   fFriendTrack(new AliESDfriendTrack()),
   fTPCClusterMap(159),//number of padrows
   fTPCSharedMap(159),//number of padrows
@@ -189,6 +192,7 @@ AliESDtrack::AliESDtrack() :
   fTRDchi2(0),
   fTOFchi2(0),
   fHMPIDchi2(0),
+  fGlobalChi2(0),
   fITSsignal(0),
   fTPCsignal(0),
   fTPCsignalS(0),
@@ -199,6 +203,7 @@ AliESDtrack::AliESDtrack() :
   fTOFsignalToT(0),
   fTOFsignalRaw(0),
   fTOFsignalDz(0),
+  fTOFsignalDx(0),
   fHMPIDtrkX(0),
   fHMPIDtrkY(0),
   fHMPIDmipX(0),
@@ -210,10 +215,11 @@ AliESDtrack::AliESDtrack() :
   fITSClusterMap(0),
   fTRDncls(0),
   fTRDncls0(0),
-  fTRDpidQuality(0),
+  fTRDntracklets(0),
   fTRDnSlices(0),
-  fTRDslices(0x0)
-  
+  fTRDslices(0x0),
+  fVertexID(-2),// -2 means an orphan track 
+  fESDEvent(0)
 {
   //
   // The default ESD constructor 
@@ -234,6 +240,7 @@ AliESDtrack::AliESDtrack() :
   for (i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=0;
   }
+  for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
   for (i=0;i<4;i++) {fTPCPoints[i]=0;}
   for (i=0;i<3;i++) {fTOFLabel[i]=0;}
   for (i=0;i<10;i++) {fTOFInfo[i]=0;}
@@ -247,6 +254,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fIp(0),
   fTPCInner(0),
   fOp(0),
+  fHMPIDp(0),  
   fFriendTrack(0),
   fTPCClusterMap(track.fTPCClusterMap),
   fTPCSharedMap(track.fTPCSharedMap),
@@ -276,6 +284,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTRDchi2(track.fTRDchi2),
   fTOFchi2(track.fTOFchi2),
   fHMPIDchi2(track.fHMPIDchi2),
+  fGlobalChi2(track.fGlobalChi2),
   fITSsignal(track.fITSsignal),
   fTPCsignal(track.fTPCsignal),
   fTPCsignalS(track.fTPCsignalS),
@@ -286,6 +295,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTOFsignalToT(track.fTOFsignalToT),
   fTOFsignalRaw(track.fTOFsignalRaw),
   fTOFsignalDz(track.fTOFsignalDz),
+  fTOFsignalDx(track.fTOFsignalDx),
   fHMPIDtrkX(track.fHMPIDtrkX),
   fHMPIDtrkY(track.fHMPIDtrkY),
   fHMPIDmipX(track.fHMPIDmipX),
@@ -297,9 +307,11 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fITSClusterMap(track.fITSClusterMap),
   fTRDncls(track.fTRDncls),
   fTRDncls0(track.fTRDncls0),
-  fTRDpidQuality(track.fTRDpidQuality),
+  fTRDntracklets(track.fTRDntracklets),
   fTRDnSlices(track.fTRDnSlices),
-  fTRDslices(0x0)
+  fTRDslices(0x0),
+  fVertexID(track.fVertexID),
+  fESDEvent(track.fESDEvent)
 {
   //
   //copy constructor
@@ -310,6 +322,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=track.fITSr[i]; 
   //
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=track.fTPCr[i]; 
+  for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=track.fITSdEdxSamples[i];}
   for (Int_t i=0;i<4;i++) {fTPCPoints[i]=track.fTPCPoints[i];}
   for (Int_t i=0; i<3;i++)   { fKinkIndexes[i]=track.fKinkIndexes[i];}
   for (Int_t i=0; i<3;i++)   { fV0Indexes[i]=track.fV0Indexes[i];}
@@ -334,7 +347,8 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
   if (track.fTPCInner) fTPCInner=new AliExternalTrackParam(*track.fTPCInner);
   if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
-
+  if (track.fHMPIDp) fHMPIDp=new AliExternalTrackParam(*track.fHMPIDp);
+  
   if (track.fFriendTrack) fFriendTrack=new AliESDfriendTrack(*(track.fFriendTrack));
 }
 
@@ -345,6 +359,7 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   fIp(0),
   fTPCInner(0),
   fOp(0),
+  fHMPIDp(0),  
   fFriendTrack(0),
   fTPCClusterMap(159),//number of padrows
   fTPCSharedMap(159),//number of padrows
@@ -374,6 +389,7 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   fTRDchi2(0),
   fTOFchi2(0),
   fHMPIDchi2(0),
+  fGlobalChi2(0),
   fITSsignal(0),
   fTPCsignal(0),
   fTPCsignalS(0),
@@ -384,6 +400,7 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   fTOFsignalToT(0),
   fTOFsignalRaw(0),
   fTOFsignalDz(0),
+  fTOFsignalDx(0),
   fHMPIDtrkX(0),
   fHMPIDtrkY(0),
   fHMPIDmipX(0),
@@ -395,9 +412,11 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   fITSClusterMap(0),
   fTRDncls(0),
   fTRDncls0(0),
-  fTRDpidQuality(0),
+  fTRDntracklets(0),
   fTRDnSlices(0),
-  fTRDslices(0x0)
+  fTRDslices(0x0),
+  fVertexID(-2),  // -2 means an orphan track
+  fESDEvent(0)  
 {
   //
   // ESD track from AliVTrack.
@@ -428,6 +447,7 @@ AliESDtrack::AliESDtrack(const AliVTrack *track) :
   for (i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=0;
   }
+  for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
   for (i=0;i<4;i++) {fTPCPoints[i]=0;}
   for (i=0;i<3;i++) {fTOFLabel[i]=0;}
   for (i=0;i<10;i++) {fTOFInfo[i]=0;}
@@ -462,6 +482,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fIp(0),
   fTPCInner(0),
   fOp(0),
+  fHMPIDp(0),  
   fFriendTrack(0),
   fTPCClusterMap(159),//number of padrows
   fTPCSharedMap(159),//number of padrows
@@ -491,6 +512,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTRDchi2(0),
   fTOFchi2(0),
   fHMPIDchi2(0),
+  fGlobalChi2(0),
   fITSsignal(0),
   fTPCsignal(0),
   fTPCsignalS(0),
@@ -501,6 +523,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTOFsignalToT(0),
   fTOFsignalRaw(0),
   fTOFsignalDz(0),
+  fTOFsignalDx(0),
   fHMPIDtrkX(0),
   fHMPIDtrkY(0),
   fHMPIDmipX(0),
@@ -512,9 +535,11 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fITSClusterMap(0),
   fTRDncls(0),
   fTRDncls0(0),
-  fTRDpidQuality(0),
+  fTRDntracklets(0),
   fTRDnSlices(0),
-  fTRDslices(0x0)
+  fTRDslices(0x0),
+  fVertexID(-2),  // -2 means an orphan track
+  fESDEvent(0)
 {
   //
   // ESD track from TParticle
@@ -537,6 +562,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   for (i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=0;
   }
+  for (i=0;i<4;i++) {fITSdEdxSamples[i]=0.;}
   for (i=0;i<4;i++) {fTPCPoints[i]=0;}
   for (i=0;i<3;i++) {fTOFLabel[i]=0;}
   for (i=0;i<10;i++) {fTOFInfo[i]=0;}
@@ -640,6 +666,7 @@ AliESDtrack::~AliESDtrack(){
   delete fIp; 
   delete fTPCInner; 
   delete fOp;
+  delete fHMPIDp;
   delete fCp; 
   delete fFriendTrack;
   if(fTRDnSlices)
@@ -699,6 +726,19 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
     fOp = 0;
   }
 
+  
+  if(source.fHMPIDp){
+    // we have the trackparam: assign or copy construct
+    if(fHMPIDp) *fHMPIDp = *source.fHMPIDp;
+    else fHMPIDp = new AliExternalTrackParam(*source.fHMPIDp);
+  }
+  else{
+    // no track param delete the old one
+    if(fHMPIDp)delete fHMPIDp;
+    fHMPIDp = 0;
+  }
+
+  
   // copy also the friend track 
   // use copy constructor
   if(source.fFriendTrack){
@@ -772,8 +812,10 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
   fTOFchi2   = source.fTOFchi2;      
   fHMPIDchi2 = source.fHMPIDchi2;      
 
+  fGlobalChi2 = source.fGlobalChi2;      
 
   fITSsignal  = source.fITSsignal;     
+  for (Int_t i=0;i<4;i++) {fITSdEdxSamples[i]=source.fITSdEdxSamples[i];}
   fTPCsignal  = source.fTPCsignal;     
   fTPCsignalS = source.fTPCsignalS;    
   for(int i = 0; i< 4;++i){
@@ -800,6 +842,7 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
   fTOFsignalToT = source.fTOFsignalToT;   
   fTOFsignalRaw = source.fTOFsignalRaw;  
   fTOFsignalDz  = source.fTOFsignalDz;      
+  fTOFsignalDx  = source.fTOFsignalDx;      
   
   for(int i = 0;i<10;++i){
     fTOFInfo[i] = source.fTOFInfo[i];    
@@ -818,7 +861,8 @@ AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
   fITSClusterMap = source.fITSClusterMap; 
   fTRDncls   = source.fTRDncls;       
   fTRDncls0  = source.fTRDncls0;      
-  fTRDpidQuality  = source.fTRDpidQuality; 
+  fTRDntracklets  = source.fTRDntracklets; 
+  fVertexID = source.fVertexID;
   return *this;
 }
 
@@ -953,6 +997,8 @@ void AliESDtrack::MakeMiniESDtrack(){
   delete fTPCInner;fTPCInner=0;
   // Reset track parameters at the inner wall of the TRD
   delete fOp;fOp = 0;
+  // Reset track parameters at the HMPID
+  delete fHMPIDp;fHMPIDp = 0;
 
 
   // Reset ITS track related information
@@ -960,6 +1006,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   fITSncls = 0;       
   fITSClusterMap=0;
   fITSsignal = 0;     
+  for (Int_t i=0;i<4;i++) fITSdEdxSamples[i] = 0.;
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fITSr[i]=0; 
   fITSLabel = 0;       
 
@@ -989,7 +1036,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0; 
   fTRDLabel = 0;       
   fTRDQuality  = 0;
-  fTRDpidQuality = 0;
+  fTRDntracklets = 0;
   if(fTRDnSlices)
     delete[] fTRDslices;
   fTRDslices=0x0;
@@ -1004,6 +1051,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   fTOFsignalToT = 0;
   fTOFsignalRaw = 0;
   fTOFsignalDz = 0;
+  fTOFsignalDx = 0;
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i] = 0;
   for (Int_t i=0;i<3;i++) fTOFLabel[i] = 0;
   for (Int_t i=0;i<10;i++) fTOFInfo[i] = 0;
@@ -1022,6 +1070,11 @@ void AliESDtrack::MakeMiniESDtrack(){
   fHMPIDmipY = 0;
   fEMCALindex = kEMCALNoMatch;
 
+  // reset global track chi2
+  fGlobalChi2 = 0;
+
+  fVertexID = -2; // an orphan track
+
   delete fFriendTrack; fFriendTrack = 0;
 } 
 //_______________________________________________________________________
@@ -1092,6 +1145,9 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
   }
 
   Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
+  if (flags==kITSout) fFriendTrack->SetITSOut(*t);
+  if (flags==kTPCout) fFriendTrack->SetTPCOut(*t);
+  if (flags==kTRDrefit) fFriendTrack->SetTRDIn(*t);
   
   switch (flags) {
     
@@ -1114,7 +1170,7 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
       if (!fOp) fOp=new AliExternalTrackParam(*t);
       else 
         fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
-    }      
+    }   
     break;
     
   case kTPCin: case kTPCrefit:
@@ -1187,7 +1243,9 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
     fTPCsignal=t->GetPIDsignal();
     break;
 
-  case kTRDout: case kTRDin: case kTRDrefit:
+  case kTRDin: case kTRDrefit:
+    break;
+  case kTRDout:
     index     = fFriendTrack->GetTRDindices();
     fTRDLabel = t->GetLabel(); 
     fTRDchi2  = t->GetChi2();
@@ -1208,6 +1266,11 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
     break;
   case kTRDStop:
     break;
+  case kHMPIDout:
+  if (!fHMPIDp) fHMPIDp=new AliExternalTrackParam(*t);
+    else 
+      fHMPIDp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance());
+    break;
   default: 
     AliError("Wrong flag !");
     return kFALSE;
@@ -1292,6 +1355,16 @@ AliESDtrack::SetOuterParam(const AliExternalTrackParam *p, ULong_t flags) {
   fOp=new AliExternalTrackParam(*p);
 }
 
+void 
+AliESDtrack::SetOuterHmpParam(const AliExternalTrackParam *p, ULong_t flags) {
+  //
+  // This is a direct setter for the outer track parameters
+  //
+  SetStatus(flags);
+  if (fHMPIDp) delete fHMPIDp;
+  fHMPIDp=new AliExternalTrackParam(*p);
+}
+
 Bool_t 
 AliESDtrack::GetOuterExternalParameters
                  (Double_t &alpha, Double_t &x, Double_t p[5]) const {
@@ -1306,6 +1379,20 @@ AliESDtrack::GetOuterExternalParameters
   return kTRUE;
 }
 
+Bool_t 
+AliESDtrack::GetOuterHmpExternalParameters
+                 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
+  //---------------------------------------------------------------------
+  // This function returns external representation of the track parameters 
+  // at the inner layer of TRD
+  //---------------------------------------------------------------------
+  if (!fHMPIDp) return kFALSE;
+  alpha=fHMPIDp->GetAlpha();
+  x=fHMPIDp->GetX();
+  for (Int_t i=0; i<5; i++) p[i]=fHMPIDp->GetParameter()[i];
+  return kTRUE;
+}
+
 Bool_t 
 AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
  //---------------------------------------------------------------------
@@ -1317,6 +1404,17 @@ AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
   return kTRUE;
 }
 
+Bool_t 
+AliESDtrack::GetOuterHmpExternalCovariance(Double_t cov[15]) const {
+ //---------------------------------------------------------------------
+ // This function returns external representation of the cov. matrix 
+ // at the inner layer of TRD
+ //---------------------------------------------------------------------
+  if (!fHMPIDp) return kFALSE;
+  for (Int_t i=0; i<15; i++) cov[i]=fHMPIDp->GetCovariance()[i];
+  return kTRUE;
+}
+
 Int_t AliESDtrack::GetNcls(Int_t idet) const
 {
   // Get number of clusters by subdetector index
@@ -1545,14 +1643,23 @@ UChar_t AliESDtrack::GetTRDclusters(Int_t *idx) const {
 
 //_______________________________________________________________________
 UChar_t AliESDtrack::GetTRDtracklets(Int_t *idx) const {
-  //---------------------------------------------------------------------
-  // This function returns indices of the assigned TRD tracklets 
-  //---------------------------------------------------------------------
-  if (idx!=0) {
-     Int_t *index=fFriendTrack->GetTRDindices();
-     for (Int_t i=0; i<6/*AliESDfriendTrack::kMaxTRDcluster*/; i++) idx[i]=index[i];
+//
+// This function returns the number of TRD tracklets used in tracking
+// and it fills the indices of these tracklets in the array "idx" as they 
+// are registered in the TRD track list. 
+// 
+// Caution :
+//   1. The idx array has to be allocated with a size >= AliESDtrack::kTRDnPlanes
+//   2. The idx array store not only the index but also the layer of the tracklet. 
+//      Therefore tracks with TRD gaps contain default values for indices [-1] 
+
+  if (!idx) return GetTRDntracklets();
+  Int_t *index=fFriendTrack->GetTRDindices(), n(0);
+  for (Int_t i=0; i<kTRDnPlanes; i++){ 
+    if(index[i]>=0) n++;
+    idx[i]=index[i];
   }
-  return fTRDncls;
+  return n;
 }
 
 //_______________________________________________________________________
@@ -1581,26 +1688,88 @@ Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
   return fTRDr[iSpecies];
 }
 
+//____________________________________________________
+Int_t AliESDtrack::GetNumberOfTRDslices() const 
+{
+  // built in backward compatibility
+  Int_t idx = fTRDnSlices - (kTRDnPlanes<<1);
+  return idx<18 ? fTRDnSlices/kTRDnPlanes : idx/kTRDnPlanes;
+}
+
+//____________________________________________________
+Double_t AliESDtrack::GetTRDmomentum(Int_t plane, Double_t *sp) const
+{
+//Returns momentum estimation and optional its error (sp)
+// in TRD layer "plane".
+
+  if (!fTRDnSlices) {
+    AliError("No TRD info allocated for this track !");
+    return -1.;
+  }
+  if ((plane<0) || (plane>=kTRDnPlanes)) {
+    AliError("Info for TRD plane not available!");
+    return -1.;
+  }
+
+  Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
+  // Protection for backward compatibility
+  if(idx<(GetNumberOfTRDslices()*kTRDnPlanes)) return -1.;
+
+  if(sp) (*sp) = fTRDslices[idx+kTRDnPlanes];
+  return fTRDslices[idx];
+}
+
+//____________________________________________________
+Double_t  AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
+  //Gets the charge from the slice of the plane
+
+  if(!fTRDslices) {
+    //AliError("No TRD slices allocated for this track !");
+    return -1.;
+  }
+  if ((plane<0) || (plane>=kTRDnPlanes)) {
+    AliError("Info for TRD plane not available !");
+    return -1.;
+  }
+  Int_t ns=GetNumberOfTRDslices();
+  if ((slice<-1) || (slice>=ns)) {
+    //AliError("Wrong TRD slice !");  
+    return -1.;
+  }
+
+  if(slice>=0) return fTRDslices[plane*ns + slice];
+
+  // return average of the dEdx measurements
+  Double_t q=0.; Double32_t *s = &fTRDslices[plane*ns];
+  for (Int_t i=0; i<ns; i++, s++) if((*s)>0.) q+=(*s);
+  return q/ns;
+}
+
+//____________________________________________________
 void  AliESDtrack::SetNumberOfTRDslices(Int_t n) {
   //Sets the number of slices used for PID 
-  if (fTRDnSlices != 0) return;
-  fTRDnSlices=kTRDnPlanes*n;
+  if (fTRDnSlices) return;
+
+  fTRDnSlices=n;
   fTRDslices=new Double32_t[fTRDnSlices];
-  for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=-1.;
+  
+  // set-up correctly the allocated memory
+  memset(fTRDslices, 0, n*sizeof(Double32_t));
+  for (Int_t i=GetNumberOfTRDslices(); i--;) fTRDslices[i]=-1.;
 }
 
+//____________________________________________________
 void  AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
   //Sets the charge q in the slice of the plane
-  Int_t ns=GetNumberOfTRDslices();
-  if (ns==0) {
+  if(!fTRDslices) {
     AliError("No TRD slices allocated for this track !");
     return;
   }
-
   if ((plane<0) || (plane>=kTRDnPlanes)) {
-    AliError("Wrong TRD plane !");
+    AliError("Info for TRD plane not allocated !");
     return;
   }
+  Int_t ns=GetNumberOfTRDslices();
   if ((slice<0) || (slice>=ns)) {
     AliError("Wrong TRD slice !");
     return;
@@ -1609,30 +1778,25 @@ void  AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
   fTRDslices[n]=q;
 }
 
-Double_t  AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
-  //Gets the charge from the slice of the plane
-  Int_t ns=GetNumberOfTRDslices();
-  if (ns==0) {
-    //AliError("No TRD slices allocated for this track !");
-    return -1.;
-  }
 
-  if ((plane<0) || (plane>=kTRDnPlanes)) {
-    AliError("Wrong TRD plane !");
-    return -1.;
+//____________________________________________________
+void AliESDtrack::SetTRDmomentum(Double_t p, Int_t plane, Double_t *sp)
+{
+  if(!fTRDslices) {
+    AliError("No TRD slices allocated for this track !");
+    return;
   }
-  if ((slice<-1) || (slice>=ns)) {
-    //AliError("Wrong TRD slice !");  
-    return -1.;
+  if ((plane<0) || (plane>=kTRDnPlanes)) {
+    AliError("Info for TRD plane not allocated !");
+    return;
   }
 
-  if (slice==-1) {
-    Double_t q=0.;
-    for (Int_t i=0; i<ns; i++) q+=fTRDslices[plane*ns + i];
-    return q/ns;
-  }
+  Int_t idx = fTRDnSlices-(kTRDnPlanes<<1)+plane;
+  // Protection for backward compatibility
+  if(idx<GetNumberOfTRDslices()*kTRDnPlanes) return;
 
-  return fTRDslices[plane*ns + slice];
+  if(sp) fTRDslices[idx+kTRDnPlanes] = (*sp);
+  fTRDslices[idx] = p;
 }
 
 
@@ -1749,6 +1913,54 @@ Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
   return kTRUE;
 }
 
+//_______________________________________________________________________
+Bool_t AliESDtrack::RelateToVertexTPCBxByBz(const AliESDVertex *vtx, 
+Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
+  //
+  // Try to relate the TPC-only track parameters to the vertex "vtx", 
+  // if the (rough) transverse impact parameter is not bigger then "maxd". 
+  //
+  // All three components of the magnetic field ,"b[3]" (kG), 
+  // are taken into account.
+  //
+  // a) The TPC-only paramters are extapolated to the DCA to the vertex.
+  // b) The impact parameters and their covariance matrix are calculated.
+  // c) An attempt to constrain the TPC-only params to the vertex is done.
+  //    The constrained params are returned via "cParam".
+  //
+  // In the case of success, the returned value is kTRUE
+  // otherwise, it's kFALSE)
+  // 
+
+  if (!fTPCInner) return kFALSE;
+  if (!vtx) return kFALSE;
+
+  Double_t dz[2],cov[3];
+  if (!fTPCInner->PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
+
+  fdTPC = dz[0];
+  fzTPC = dz[1];  
+  fCddTPC = cov[0];
+  fCdzTPC = cov[1];
+  fCzzTPC = cov[2];
+  
+  Double_t covar[6]; vtx->GetCovMatrix(covar);
+  Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
+  Double_t c[3]={covar[2],0.,covar[5]};
+
+  Double_t chi2=GetPredictedChi2(p,c);
+  if (chi2>kVeryBig) return kFALSE;
+
+  fCchi2TPC=chi2;
+
+  if (!cParam) return kTRUE;
+
+  *cParam = *fTPCInner;
+  if (!cParam->Update(p,c)) return kFALSE;
+
+  return kTRUE;
+}
+
 //_______________________________________________________________________
 Bool_t AliESDtrack::RelateToVertex(const AliESDVertex *vtx, 
 Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
@@ -1794,6 +2006,62 @@ Double_t b, Double_t maxd, AliExternalTrackParam *cParam) {
   if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
   //----------------------------------------
 
+  fVertexID = vtx->GetID();
+
+  if (!cParam) return kTRUE;
+
+  *cParam = *this;
+  if (!cParam->Update(p,c)) return kFALSE; 
+
+  return kTRUE;
+}
+
+//_______________________________________________________________________
+Bool_t AliESDtrack::RelateToVertexBxByBz(const AliESDVertex *vtx, 
+Double_t b[3], Double_t maxd, AliExternalTrackParam *cParam) {
+  //
+  // Try to relate this track to the vertex "vtx", 
+  // if the (rough) transverse impact parameter is not bigger then "maxd". 
+  //            Magnetic field is "b" (kG).
+  //
+  // a) The track gets extapolated to the DCA to the vertex.
+  // b) The impact parameters and their covariance matrix are calculated.
+  // c) An attempt to constrain this track to the vertex is done.
+  //    The constrained params are returned via "cParam".
+  //
+  // In the case of success, the returned value is kTRUE
+  // (otherwise, it's kFALSE)
+  //  
+
+  if (!vtx) return kFALSE;
+
+  Double_t dz[2],cov[3];
+  if (!PropagateToDCABxByBz(vtx, b, maxd, dz, cov)) return kFALSE;
+
+  fD = dz[0];
+  fZ = dz[1];  
+  fCdd = cov[0];
+  fCdz = cov[1];
+  fCzz = cov[2];
+  
+  Double_t covar[6]; vtx->GetCovMatrix(covar);
+  Double_t p[2]={GetParameter()[0]-dz[0],GetParameter()[1]-dz[1]};
+  Double_t c[3]={covar[2],0.,covar[5]};
+
+  Double_t chi2=GetPredictedChi2(p,c);
+  if (chi2>kVeryBig) return kFALSE;
+
+  fCchi2=chi2;
+
+
+  //--- Could now these lines be removed ? ---
+  delete fCp;
+  fCp=new AliExternalTrackParam(*this);  
+
+  if (!fCp->Update(p,c)) {delete fCp; fCp=0; return kFALSE;}
+  //----------------------------------------
+
+  fVertexID = vtx->GetID();
 
   if (!cParam) return kTRUE;
 
@@ -1860,6 +2128,7 @@ void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR,
   arrayRef.AddLast(new AliExternalTrackParam(*this));
   if (fIp) arrayRef.AddLast(new AliExternalTrackParam(*fIp));
   if (fOp) arrayRef.AddLast(new AliExternalTrackParam(*fOp));
+  if (fHMPIDp) arrayRef.AddLast(new AliExternalTrackParam(*fHMPIDp));
   //
   Double_t mpos[3]={0,0,0};
   Int_t entries=arrayRef.GetEntries();
@@ -1903,3 +2172,21 @@ void AliESDtrack::FillPolymarker(TPolyMarker3D *pol, Float_t magF, Float_t minR,
     }
   }
 }
+
+//_______________________________________________________________________
+void AliESDtrack::SetITSdEdxSamples(const Double_t s[4]) {
+  //
+  // Store the dE/dx samples measured by the two SSD and two SDD layers.
+  // These samples are corrected for the track segment length. 
+  //
+  for (Int_t i=0; i<4; i++) fITSdEdxSamples[i]=s[i];
+}
+
+//_______________________________________________________________________
+void AliESDtrack::GetITSdEdxSamples(Double_t *s) const {
+  //
+  // Get the dE/dx samples measured by the two SSD and two SDD layers.  
+  // These samples are corrected for the track segment length.
+  //
+  for (Int_t i=0; i<4; i++) s[i]=fITSdEdxSamples[i];
+}