]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/AliITStrackV2.cxx
New method to fix the references of the daughter tracks
[u/mrichter/AliRoot.git] / ITS / AliITStrackV2.cxx
index 569e6f9bbdd481e96aee451ce1181fc2492f6f22..5a3bc188d422c8a9b869cd31063b3022149acdcb 100644 (file)
@@ -24,7 +24,6 @@
 #include <TMath.h>
 
 #include "AliCluster.h"
-#include "AliESDtrack.h"
 #include "AliESDVertex.h"
 #include "AliITSReconstructor.h"
 #include "AliITStrackV2.h"
@@ -37,17 +36,20 @@ ClassImp(AliITStrackV2)
 
 //____________________________________________________________________________
 AliITStrackV2::AliITStrackV2() : AliKalmanTrack(),
+  fCheckInvariant(kTRUE),
   fdEdx(0),
   fESDtrack(0)
 {
   for(Int_t i=0; i<2*AliITSgeomTGeo::kNLayers; i++) {fIndex[i]=-1; fModule[i]=-1;}
+  for(Int_t i=0; i<AliITSgeomTGeo::kNLayers; i++) {fSharedWeight[i]=0;}
   for(Int_t i=0; i<4; i++) fdEdxSample[i]=0;
 }
 
 
 //____________________________________________________________________________
-AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) :
+AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c):
   AliKalmanTrack(),
+  fCheckInvariant(kTRUE),
   fdEdx(t.GetITSsignal()),
   fESDtrack(&t)
 {
@@ -58,12 +60,10 @@ AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) :
   const AliExternalTrackParam *par=&t;
   if (c) {
     par=t.GetConstrainedParam();
-    if (!par) throw "AliITStrackV2: conversion failed !\n";
+    if (!par) AliError("AliITStrackV2: conversion failed !\n");
   }
   Set(par->GetX(),par->GetAlpha(),par->GetParameter(),par->GetCovariance());
 
-  //if (!Invariant()) throw "AliITStrackV2: conversion failed !\n";
-
   SetLabel(t.GetLabel());
   SetMass(t.GetMass());
   SetNumberOfClusters(t.GetITSclusters(fIndex));
@@ -74,6 +74,7 @@ AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) :
     SetIntegratedLength(t.GetIntegratedLength());
   }
 
+  for(Int_t i=0; i<AliITSgeomTGeo::kNLayers; i++) {fSharedWeight[i]=0;}
   for(Int_t i=0; i<4; i++) fdEdxSample[i]=0;
 }
 
@@ -83,6 +84,7 @@ void AliITStrackV2::ResetClusters() {
   // Reset the array of attached clusters.
   //------------------------------------------------------------------
   for (Int_t i=0; i<2*AliITSgeomTGeo::kNLayers; i++) fIndex[i]=-1;
+  for (Int_t i=0; i<AliITSgeomTGeo::kNLayers; i++) {fSharedWeight[i]=0;}
   SetChi2(0.); 
   SetNumberOfClusters(0);
 } 
@@ -92,19 +94,31 @@ void AliITStrackV2::UpdateESDtrack(ULong_t flags) const {
   // Update track params
   fESDtrack->UpdateTrackParams(this,flags);
   // copy the module indices
-  for(Int_t i=0;i<12;i++) {
+  Int_t i;
+  for(i=0;i<2*AliITSgeomTGeo::kNLayers;i++) {
     //   printf("     %d\n",GetModuleIndex(i));
     fESDtrack->SetITSModuleIndex(i,GetModuleIndex(i));
   }
+  // copy the map of shared clusters
+  if(flags==AliESDtrack::kITSin) {
+    UChar_t itsSharedMap=0;
+    for(i=0;i<AliITSgeomTGeo::kNLayers;i++) {
+      if(fSharedWeight[i]>0) SETBIT(itsSharedMap,i);
+      
+    }
+    fESDtrack->SetITSSharedMap(itsSharedMap);
+  }
+
   // copy the 4 dedx samples
   Double_t sdedx[4]={0.,0.,0.,0.};
-  for(Int_t i=0; i<4; i++) sdedx[i]=fdEdxSample[i];
+  for(i=0; i<4; i++) sdedx[i]=fdEdxSample[i];
   fESDtrack->SetITSdEdxSamples(sdedx);
 }
 
 //____________________________________________________________________________
 AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : 
   AliKalmanTrack(t),
+  fCheckInvariant(t.fCheckInvariant),
   fdEdx(t.fdEdx),
   fESDtrack(t.fESDtrack) 
 {
@@ -117,6 +131,7 @@ AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) :
     fIndex[i]=t.fIndex[i];
     fModule[i]=t.fModule[i];
   }
+  for (i=0; i<AliITSgeomTGeo::kNLayers; i++) {fSharedWeight[i]=t.fSharedWeight[i];}
 }
 
 //_____________________________________________________________________________
@@ -281,6 +296,8 @@ Bool_t AliITStrackV2::Invariant() const {
   //------------------------------------------------------------------
   // This function is for debugging purpose only
   //------------------------------------------------------------------
+  if(!fCheckInvariant) return kTRUE;
+
   Int_t n=GetNumberOfClusters();
 
   // take into account the misalignment error
@@ -389,47 +406,78 @@ Bool_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) {
   //------------------------------------------------------------------
   //This function improves angular track parameters
   //------------------------------------------------------------------
+  //Store the initail track parameters
+
+  Double_t x = GetX();
+  Double_t alpha = GetAlpha();
+  Double_t par[] = {GetY(),GetZ(),GetSnp(),GetTgl(),GetSigned1Pt()};
+  Double_t cov[] = {
+    GetSigmaY2(),
+    GetSigmaZY(),
+    GetSigmaZ2(),
+    GetSigmaSnpY(),
+    GetSigmaSnpZ(),
+    GetSigmaSnp2(),
+    GetSigmaTglY(),
+    GetSigmaTglZ(),
+    GetSigmaTglSnp(),
+    GetSigmaTgl2(),
+    GetSigma1PtY(),
+    GetSigma1PtZ(),
+    GetSigma1PtSnp(),
+    GetSigma1PtTgl(),
+    GetSigma1Pt2()
+  }; 
+
+
   Double_t cs=TMath::Cos(GetAlpha()), sn=TMath::Sin(GetAlpha());
-//Double_t xv = xyz[0]*cs + xyz[1]*sn; // vertex
+  Double_t xv = xyz[0]*cs + xyz[1]*sn; // vertex
   Double_t yv =-xyz[0]*sn + xyz[1]*cs; // in the
   Double_t zv = xyz[2];                // local frame
 
-  Double_t dy = Par(0) - yv, dz = Par(1) - zv;
-  Double_t r2=GetX()*GetX() + dy*dy;
+  Double_t dx = x - xv, dy = par[0] - yv, dz = par[1] - zv;
+  Double_t r2=dx*dx + dy*dy;
   Double_t p2=(1.+ GetTgl()*GetTgl())/(GetSigned1Pt()*GetSigned1Pt());
   Double_t beta2=p2/(p2 + GetMass()*GetMass());
   x0*=TMath::Sqrt((1.+ GetTgl()*GetTgl())/(1.- GetSnp()*GetSnp()));
   Double_t theta2=14.1*14.1/(beta2*p2*1e6)*x0;
   //Double_t theta2=1.0259e-6*14*14/28/(beta2*p2)*x0*9.36*2.33;
 
-  Double_t cnv=GetBz()*kB2C;
+  Double_t bz=GetBz();
+  Double_t cnv=bz*kB2C;
+  Double_t curv=GetC(bz);
   {
-    Double_t dummy = 4/r2 - GetC()*GetC();
+    Double_t dummy = 4/r2 - curv*curv;
     if (dummy < 0) return kFALSE;
-    Double_t parp = 0.5*(GetC()*GetX() + dy*TMath::Sqrt(dummy));
-    Double_t sigma2p = theta2*(1.- GetSnp()*GetSnp())*(1. + GetTgl()*GetTgl());
-    sigma2p += Cov(0)/r2*(1.- dy*dy/r2)*(1.- dy*dy/r2);
+    Double_t parp = 0.5*(curv*dx + dy*TMath::Sqrt(dummy));
+    Double_t sigma2p = theta2*(1.-GetSnp())*(1.+GetSnp())*(1. + GetTgl()*GetTgl());
+    Double_t ovSqr2 = 1./TMath::Sqrt(r2);
+    Double_t tfact = ovSqr2*(1.-dy*ovSqr2)*(1.+dy*ovSqr2);
+    sigma2p += cov[0]*tfact*tfact;
     sigma2p += ers[1]*ers[1]/r2;
-    sigma2p += 0.25*Cov(14)*cnv*cnv*GetX()*GetX();
-    Double_t eps2p=sigma2p/(Cov(5) + sigma2p);
-    Par(0) += Cov(3)/(Cov(5) + sigma2p)*(parp - GetSnp());
-    Par(2)  = eps2p*GetSnp() + (1 - eps2p)*parp;
-    Cov(5) *= eps2p;
-    Cov(3) *= eps2p;
+    sigma2p += 0.25*cov[14]*cnv*cnv*dx*dx;
+    Double_t eps2p=sigma2p/(cov[5] + sigma2p);
+    par[0] += cov[3]/(cov[5] + sigma2p)*(parp - GetSnp());
+    par[2]  = eps2p*GetSnp() + (1 - eps2p)*parp;
+    cov[5] *= eps2p;
+    cov[3] *= eps2p;
   }
   {
-    Double_t parl=0.5*GetC()*dz/TMath::ASin(0.5*GetC()*TMath::Sqrt(r2));
+    Double_t parl=0.5*curv*dz/TMath::ASin(0.5*curv*TMath::Sqrt(r2));
     Double_t sigma2l=theta2;
-    sigma2l += Cov(2)/r2 + Cov(0)*dy*dy*dz*dz/(r2*r2*r2);
+    sigma2l += cov[2]/r2 + cov[0]*dy*dy*dz*dz/(r2*r2*r2);
     sigma2l += ers[2]*ers[2]/r2;
-    Double_t eps2l = sigma2l/(Cov(9) + sigma2l);
-    Par(1) += Cov(7 )/(Cov(9) + sigma2l)*(parl - Par(3));
-    Par(4) += Cov(13)/(Cov(9) + sigma2l)*(parl - Par(3));
-    Par(3)  = eps2l*Par(3) + (1-eps2l)*parl;
-    Cov(9) *= eps2l; 
-    Cov(13)*= eps2l; 
-    Cov(7) *= eps2l; 
+    Double_t eps2l = sigma2l/(cov[9] + sigma2l);
+    par[1] += cov[7 ]/(cov[9] + sigma2l)*(parl - par[3]);
+    par[4] += cov[13]/(cov[9] + sigma2l)*(parl - par[3]);
+    par[3]  = eps2l*par[3] + (1-eps2l)*parl;
+    cov[9] *= eps2l; 
+    cov[13]*= eps2l; 
+    cov[7] *= eps2l; 
   }
+
+  Set(x,alpha,par,cov);
+
   if (!Invariant()) return kFALSE;
 
   return kTRUE;
@@ -542,3 +590,4 @@ GetLocalXat(Double_t r,Double_t &xloc) const {
 
   return kTRUE;
 }
+