]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDtrack.cxx
PropagateToDCA in case of track and vertex (M.Ivanov)
[u/mrichter/AliRoot.git] / STEER / AliESDtrack.cxx
index 0fb1e888c698669ebfb3d0a62207ad1c69923216..44755fb2f59bc259f8bd170f0f49746a6e361ecc 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "TMath.h"
 
+#include "AliESDVertex.h"
 #include "AliESDtrack.h"
 #include "AliKalmanTrack.h"
 #include "AliTrackPointArray.h"
@@ -63,8 +64,8 @@ AliESDtrack::AliESDtrack() :
   fLabel(0),
   fID(0),
   fTrackLength(0),
-  fD(0),
-  fZ(0),
+  fD(0),fZ(0),
+  fCdd(0),fCdz(0),fCzz(0),
   fStopVertex(0),
   fCp(0),
   fCchi2(1e10),
@@ -78,8 +79,11 @@ AliESDtrack::AliESDtrack() :
   fITStrack(0),
   fTPCchi2(0),
   fTPCncls(0),
+  fTPCnclsF(0),
   fTPCClusterMap(159),//number of padrows
   fTPCsignal(0),
+  fTPCsignalN(0),
+  fTPCsignalS(0),
   fTPCLabel(0),
   fTRDchi2(0),
   fTRDncls(0),
@@ -91,9 +95,10 @@ AliESDtrack::AliESDtrack() :
   fTRDtrack(0),
   fTOFchi2(0),
   fTOFindex(0),
+  fTOFCalChannel(-1),
   fTOFsignal(-1),
-  fPHOSsignal(-1),
-  fEMCALsignal(-1),
+  fTOFsignalToT(0),
+  //  fPHOSsignal(-1),
   fRICHchi2(1e10),
   fRICHncls(0),
   fRICHindex(0),
@@ -117,21 +122,18 @@ AliESDtrack::AliESDtrack() :
     fRICHr[i]=1.;
   }
   
-  for (Int_t i=0; i<AliPID::kSPECIESN; i++) {
-    fPHOSr[i]  = 1.;
-    fEMCALr[i] = 1.;
-  }
+  //  for (Int_t i=0; i<AliPID::kSPECIESN; i++) {
+  //  fPHOSr[i]  = 1.;
+  // } 
+  //  fPHOSpos[0]=fPHOSpos[1]=fPHOSpos[2]=0.;
 
-  fPHOSpos[0]=fPHOSpos[1]=fPHOSpos[2]=0.;
-  fEMCALpos[0]=fEMCALpos[1]=fEMCALpos[2]=0.;
   Int_t i;
   for (i=0;i<12;i++) fITSchi2MIP[i] =1e10;
   for (i=0; i<6; i++)  { fITSindex[i]=0; }
   for (i=0; i<180; i++){ fTPCindex[i]=0; }
   for (i=0; i<3;i++)   { fKinkIndexes[i]=0;}
   for (i=0; i<3;i++)   { fV0Indexes[i]=-1;}
-  for (i=0; i<130; i++) { fTRDindex[i]=0; }
+  for (i=0; i<180; i++) { fTRDindex[i]=0; }
   for (i=0;i<kNPlane;i++) {fTRDsignals[i]=0.; fTRDTimBin[i]=-1;}
   for (i=0;i<4;i++) {fTPCPoints[i]=-1;}
   for (i=0;i<3;i++) {fTOFLabel[i]=-1;}
@@ -152,8 +154,8 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fLabel(track.fLabel),
   fID(track.fID),
   fTrackLength(track.fTrackLength),
-  fD(track.fD),
-  fZ(track.fZ),
+  fD(track.fD),fZ(track.fZ),
+  fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
   fStopVertex(track.fStopVertex),
   fCp(0),
   fCchi2(track.fCchi2),
@@ -167,8 +169,11 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fITStrack(0),    //coping separatelly - in user code
   fTPCchi2(track.fTPCchi2),
   fTPCncls(track.fTPCncls),
+  fTPCnclsF(track.fTPCnclsF),
   fTPCClusterMap(track.fTPCClusterMap),
   fTPCsignal(track.fTPCsignal),
+  fTPCsignalN(track.fTPCsignalN),
+  fTPCsignalS(track.fTPCsignalS),
   fTPCLabel(track.fTPCLabel),
   fTRDchi2(track.fTRDchi2),
   fTRDncls(track.fTRDncls),
@@ -180,9 +185,10 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fTRDtrack(0),
   fTOFchi2(track.fTOFchi2),
   fTOFindex(track.fTOFindex),
+  fTOFCalChannel(track.fTOFCalChannel),
   fTOFsignal(track.fTOFsignal),
-  fPHOSsignal(track.fPHOSsignal),
-  fEMCALsignal(track.fEMCALsignal),
+  fTOFsignalToT(track.fTOFsignalToT),
+  //fPHOSsignal(track.fPHOSsignal),
   fRICHchi2(track.fRICHchi2),
   fRICHncls(track.fRICHncls),
   fRICHindex(track.fRICHindex),
@@ -190,8 +196,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fRICHtheta(track.fRICHtheta),
   fRICHphi(track.fRICHphi),
   fRICHdx(track.fRICHdx),
-  fRICHdy(track.fRICHdy),
-  fPoints(track.fPoints)
+  fRICHdy(track.fRICHdy)
 {
   //
   //copy constructor
@@ -209,7 +214,7 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   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];}
   //
-  for (Int_t i=0;i<130;i++) fTRDindex[i]=track.fTRDindex[i];   
+  for (Int_t i=0;i<180;i++) fTRDindex[i]=track.fTRDindex[i];   
   for (Int_t i=0;i<kNPlane;i++) {
       fTRDsignals[i]=track.fTRDsignals[i]; 
       fTRDTimBin[i]=track.fTRDTimBin[i];
@@ -220,17 +225,18 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
   for (Int_t i=0;i<10;i++) fTOFInfo[i]=track.fTOFInfo[i];
   //
-  for (Int_t i=0;i<3;i++) fPHOSpos[i]=track.fPHOSpos[i]; 
-  for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i]=track.fPHOSr[i]; 
-  //
-  for (Int_t i=0;i<3;i++) fEMCALpos[i]=track.fEMCALpos[i]; 
-  for (Int_t i=0;i<AliPID::kSPECIESN;i++) fEMCALr[i]=track.fEMCALr[i]; 
+  //  for (Int_t i=0;i<3;i++) fPHOSpos[i]=track.fPHOSpos[i]; 
+  //for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i]=track.fPHOSr[i]; 
   //
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fRICHr[i]=track.fRICHr[i];
 
   if (track.fCp) fCp=new AliExternalTrackParam(*track.fCp);
   if (track.fIp) fIp=new AliExternalTrackParam(*track.fIp);
   if (track.fOp) fOp=new AliExternalTrackParam(*track.fOp);
+  fPoints =0;
+  if (track.fPoints){
+    fPoints  = new AliTrackPointArray(*(track.fPoints));
+  }
 }
 //_______________________________________________________________________
 AliESDtrack::~AliESDtrack(){ 
@@ -289,9 +295,12 @@ void AliESDtrack::MakeMiniESDtrack(){
   // Reset TPC related track information
   fTPCchi2 = 0;       
   fTPCncls = 0;       
+  fTPCnclsF = 0;       
   for (Int_t i=0;i<180;i++) fTPCindex[i] = 0;  
   fTPCClusterMap = 0;  
   fTPCsignal= 0;      
+  fTPCsignalS= 0;      
+  fTPCsignalN= 0;      
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTPCr[i]=0; 
   fTPCLabel=0;       
   for (Int_t i=0;i<4;i++) fTPCPoints[i] = 0;
@@ -302,7 +311,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   fTRDchi2 = 0;        
   fTRDncls = 0;       
   fTRDncls0 = 0;       
-  for (Int_t i=0;i<130;i++) fTRDindex[i] = 0;   
+  for (Int_t i=0;i<180;i++) fTRDindex[i] = 0;   
   fTRDsignal = 0;      
   for (Int_t i=0;i<kNPlane;i++) {
       fTRDsignals[i] = 0; 
@@ -318,20 +327,17 @@ void AliESDtrack::MakeMiniESDtrack(){
   fTOFchi2 = 0;        
   fTOFindex = 0;       
   fTOFsignal = 0;      
+  fTOFCalChannel = -1;
+  fTOFsignalToT = 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;
 
   // Reset PHOS related track information
-  for (Int_t i=0;i<3;i++) fPHOSpos[i] = 0; 
-  fPHOSsignal = 0; 
-  for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i] = 0;
-  // Reset EMCAL related track information
-  for (Int_t i=0;i<3;i++) fEMCALpos[i] = 0; 
-  fEMCALsignal = 0; 
-  for (Int_t i=0;i<AliPID::kSPECIESN;i++) fEMCALr[i] = 0;
+  //for (Int_t i=0;i<3;i++) fPHOSpos[i] = 0; 
+  //fPHOSsignal = 0; 
+  //for (Int_t i=0;i<AliPID::kSPECIESN;i++) fPHOSr[i] = 0;
+  
   // Reset RICH related track information
   fRICHchi2 = 0;     
   fRICHncls = 0;     
@@ -386,7 +392,7 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
   }
 
   Set(*t);
-
+  
   switch (flags) {
     
   case kITSin: case kITSout: case kITSrefit:
@@ -402,10 +408,12 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
     fTPCLabel = t->GetLabel();
     if (!fIp) fIp=new AliExternalTrackParam(*t);
     else fIp->Set(*t);
-
   case kTPCout:
-  
-    fTPCncls=t->GetNumberOfClusters();
+    if (flags & kTPCout){
+      if (!fOp) fOp=new AliExternalTrackParam(*t);
+      else fOp->Set(*t);
+    }
+    fTPCncls=t->GetNumberOfClusters();    
     fTPCchi2=t->GetChi2();
     
      {//prevrow must be declared in separate namespace, otherwise compiler cries:
@@ -458,11 +466,6 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
         }
      }
     fTPCsignal=t->GetPIDsignal();
-    {Double_t mass=t->GetMass();    // preliminary mass setting 
-    if (mass>0.5) fR[4]=1.;         //        used by
-    else if (mass<0.4) fR[2]=1.;    // the ITS reconstruction
-    else fR[3]=1.;}
-                     //
     break;
 
   case kTRDout: case kTRDin: case kTRDrefit:
@@ -491,18 +494,6 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
   return rc;
 }
 
-//_______________________________________________________________________
-void 
-AliESDtrack::SetConstrainedTrackParams(const AliKalmanTrack *t, Double_t chi2) {
-  // 
-  // This function sets the constrained track parameters 
-  //
-  if (!fCp) fCp=new AliExternalTrackParam(*t);
-  else fCp->Set(*t);
-  fCchi2=chi2;
-}
-
-
 //_______________________________________________________________________
 void AliESDtrack::GetExternalParameters(Double_t &x, Double_t p[5]) const {
   //---------------------------------------------------------------------
@@ -521,66 +512,77 @@ void AliESDtrack::GetExternalCovariance(Double_t cov[15]) const {
 }
 
 //_______________________________________________________________________
-void 
-AliESDtrack::GetConstrainedExternalParameters(Double_t &x, Double_t p[5])const{
+Bool_t AliESDtrack::GetConstrainedExternalParameters
+                 (Double_t &alpha, Double_t &x, Double_t p[5]) const {
   //---------------------------------------------------------------------
   // This function returns the constrained external track parameters
   //---------------------------------------------------------------------
-  if (!fCp) return;
+  if (!fCp) return kFALSE;
+  alpha=fCp->GetAlpha();
   x=fCp->GetX();
   for (Int_t i=0; i<5; i++) p[i]=fCp->GetParameter()[i];
+  return kTRUE;
 }
 
 //_______________________________________________________________________
-void 
+Bool_t 
 AliESDtrack::GetConstrainedExternalCovariance(Double_t c[15]) const {
   //---------------------------------------------------------------------
   // This function returns the constrained external cov. matrix
   //---------------------------------------------------------------------
-  if (!fCp) return;
+  if (!fCp) return kFALSE;
   for (Int_t i=0; i<15; i++) c[i]=fCp->GetCovariance()[i];
+  return kTRUE;
 }
 
-void AliESDtrack::GetInnerExternalParameters(Double_t &x, Double_t p[5]) const 
-{
- //---------------------------------------------------------------------
+Bool_t
+AliESDtrack::GetInnerExternalParameters
+                 (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 TPC
   //---------------------------------------------------------------------
-  if (!fIp) return;
+  if (!fIp) return kFALSE;
+  alpha=fIp->GetAlpha();
   x=fIp->GetX();
   for (Int_t i=0; i<5; i++) p[i]=fIp->GetParameter()[i];
+  return kTRUE;
 }
 
-void AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const
-{
+Bool_t 
+AliESDtrack::GetInnerExternalCovariance(Double_t cov[15]) const {
  //---------------------------------------------------------------------
  // This function returns external representation of the cov. matrix 
  // at the inner layer of TPC
  //---------------------------------------------------------------------
-  if (!fIp) return;
+  if (!fIp) return kFALSE;
   for (Int_t i=0; i<15; i++) cov[i]=fIp->GetCovariance()[i];
+  return kTRUE;
 }
 
-void AliESDtrack::GetOuterExternalParameters(Double_t &x, Double_t p[5]) const 
-{
- //---------------------------------------------------------------------
+Bool_t 
+AliESDtrack::GetOuterExternalParameters
+                 (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 (!fOp) return;
+  if (!fOp) return kFALSE;
+  alpha=fOp->GetAlpha();
   x=fOp->GetX();
   for (Int_t i=0; i<5; i++) p[i]=fOp->GetParameter()[i];
+  return kTRUE;
 }
 
-void AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const
-{
+Bool_t 
+AliESDtrack::GetOuterExternalCovariance(Double_t cov[15]) const {
  //---------------------------------------------------------------------
  // This function returns external representation of the cov. matrix 
  // at the inner layer of TRD
  //---------------------------------------------------------------------
-  if (!fOp) return;
+  if (!fOp) return kFALSE;
   for (Int_t i=0; i<15; i++) cov[i]=fOp->GetCovariance()[i];
+  return kTRUE;
 }
 
 Int_t AliESDtrack::GetNcls(Int_t idet) const
@@ -719,7 +721,7 @@ Int_t AliESDtrack::GetTRDclusters(UInt_t *idx) const {
   // This function returns indices of the assgined TRD clusters 
   //---------------------------------------------------------------------
   if (idx!=0)
-    for (Int_t i=0; i<130; i++) idx[i]=fTRDindex[i];  // MI I prefer some constant
+    for (Int_t i=0; i<180; i++) idx[i]=fTRDindex[i];  // MI I prefer some constant
   return fTRDncls;
 }
 
@@ -788,32 +790,6 @@ void AliESDtrack::SetTOFInfo(Float_t*info) {
 
 
 
-//_______________________________________________________________________
-void AliESDtrack::SetPHOSpid(const Double_t *p) {  
-  // Sets the probability of each particle type (in PHOS)
-  SetPIDValues(fPHOSr,p,AliPID::kSPECIESN);
-  SetStatus(AliESDtrack::kPHOSpid);
-}
-
-//_______________________________________________________________________
-void AliESDtrack::GetPHOSpid(Double_t *p) const {
-  // Gets probabilities of each particle type (in PHOS)
-  for (Int_t i=0; i<AliPID::kSPECIESN; i++) p[i]=fPHOSr[i];
-}
-
-//_______________________________________________________________________
-void AliESDtrack::SetEMCALpid(const Double_t *p) {  
-  // Sets the probability of each particle type (in EMCAL)
-  SetPIDValues(fEMCALr,p,AliPID::kSPECIESN);
-  SetStatus(AliESDtrack::kEMCALpid);
-}
-
-//_______________________________________________________________________
-void AliESDtrack::GetEMCALpid(Double_t *p) const {
-  // Gets probabilities of each particle type (in EMCAL)
-  for (Int_t i=0; i<AliPID::kSPECIESN; i++) p[i]=fEMCALr[i];
-}
-
 //_______________________________________________________________________
 void AliESDtrack::SetRICHpid(const Double_t *p) {  
   // Sets the probability of each particle type (in RICH)
@@ -842,6 +818,67 @@ void AliESDtrack::GetESDpid(Double_t *p) const {
   for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
 }
 
+//_______________________________________________________________________
+Bool_t AliESDtrack::RelateToVertex
+(const AliESDVertex *vtx, Double_t b, Double_t maxd) {
+  //
+  // 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.
+  //
+  //    In the case of success, the returned value is kTRUE
+  //    (otherwise, it's kFALSE)
+  //  
+  Double_t alpha=GetAlpha();
+  Double_t sn=TMath::Sin(alpha), cs=TMath::Cos(alpha);
+  Double_t x=GetX(), y=GetParameter()[0], snp=GetParameter()[2];
+  Double_t xv= vtx->GetXv()*cs + vtx->GetYv()*sn;
+  Double_t yv=-vtx->GetXv()*sn + vtx->GetYv()*cs, zv=vtx->GetZv();
+  x-=xv; y-=yv;
+
+  //Estimate the impact parameter neglecting the track curvature
+  Double_t d=TMath::Abs(x*snp - y*TMath::Sqrt(1.- snp*snp));
+  if (d > maxd) return kFALSE; 
+
+  //Propagate to the DCA
+  Double_t crv=0.299792458e-3*b*GetParameter()[4];
+  Double_t tgfv=-(crv*x - snp)/(crv*y + TMath::Sqrt(1.-snp*snp));
+  sn=tgfv/TMath::Sqrt(1.+ tgfv*tgfv); cs=TMath::Sqrt(1.- sn*sn);
+
+  x = xv*cs + yv*sn;
+  yv=-xv*sn + yv*cs; xv=x;
+
+  if (!Propagate(alpha+TMath::ASin(sn),xv,b)) return kFALSE;
+
+  fD = GetParameter()[0] - yv;
+  fZ = GetParameter()[1] - zv;
+  
+  Double_t cov[6]; vtx->GetCovMatrix(cov);
+  fCdd = GetCovariance()[0] + cov[2];      // neglecting non-diagonals
+  fCdz = GetCovariance()[1];               //     in the vertex's    
+  fCzz = GetCovariance()[2] + cov[5];      //    covariance matrix
+
+  {//Try to constrain 
+    Double_t p[2]={yv,zv}, c[3]={cov[2],0.,cov[5]};
+    Double_t chi2=GetPredictedChi2(p,c);
+
+    if (chi2>77.) return kFALSE;
+
+    AliExternalTrackParam tmp(*this);
+    if (!tmp.Update(p,c)) return kFALSE;
+
+    fCchi2=chi2;
+    if (!fCp) fCp=new AliExternalTrackParam();
+    new (fCp) AliExternalTrackParam(tmp);
+  }
+
+  return kTRUE;
+}
+
 //_______________________________________________________________________
 void AliESDtrack::Print(Option_t *) const {
   // Prints info on the track
@@ -884,18 +921,13 @@ void AliESDtrack::Print(Option_t *) const {
       printf("%f, ", p[index]) ;
     printf("\n           signal = %f\n", GetRICHsignal()) ;
   }
-  if( IsOn(kPHOSpid) ){
-    printf("From PHOS: ") ; 
-    GetPHOSpid(p) ; 
-    for(index = 0 ; index < AliPID::kSPECIESN; index++) 
-      printf("%f, ", p[index]) ;
-    printf("\n           signal = %f\n", GetPHOSsignal()) ;
-  }
-  if( IsOn(kEMCALpid) ){
-    printf("From EMCAL: ") ; 
-    GetEMCALpid(p) ; 
-    for(index = 0 ; index < AliPID::kSPECIESN; index++) 
-      printf("%f, ", p[index]) ;
-    printf("\n           signal = %f\n", GetEMCALsignal()) ;
-  }
+  // Since 9 March 2006 PHOS left ESDtrack for ESDCaloCluster
+  // and cannot participate in the global PID for the moment
+//   if( IsOn(kPHOSpid) ){
+//     printf("From PHOS: ") ; 
+//     GetPHOSpid(p) ; 
+//     for(index = 0 ; index < AliPID::kSPECIESN; index++) 
+//       printf("%f, ", p[index]) ;
+//     printf("\n           signal = %f\n", GetPHOSsignal()) ;
+//   }
 }