X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITStrackV2.cxx;h=cf2a7f0521e16770168416a0025838e169f8949a;hb=af6a50bbbb153c6b9e953722fa0506f244ca275e;hp=27cd59fd2fff4fbb4ce1db799b5d6cf21cf797ef;hpb=b5205c9050d8a1cca676bf23076c163425c10731;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITStrackV2.cxx b/ITS/AliITStrackV2.cxx index 27cd59fd2ff..cf2a7f0521e 100644 --- a/ITS/AliITStrackV2.cxx +++ b/ITS/AliITStrackV2.cxx @@ -24,7 +24,6 @@ #include #include "AliCluster.h" -#include "AliESDtrack.h" #include "AliESDVertex.h" #include "AliITSReconstructor.h" #include "AliITStrackV2.h" @@ -37,6 +36,7 @@ ClassImp(AliITStrackV2) //____________________________________________________________________________ AliITStrackV2::AliITStrackV2() : AliKalmanTrack(), + fCheckInvariant(kTRUE), fdEdx(0), fESDtrack(0) { @@ -48,6 +48,7 @@ AliITStrackV2::AliITStrackV2() : AliKalmanTrack(), //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) : AliKalmanTrack(), + fCheckInvariant(kTRUE), fdEdx(t.GetITSsignal()), fESDtrack(&t) { @@ -87,18 +88,25 @@ void AliITStrackV2::ResetClusters() { SetNumberOfClusters(0); } +//____________________________________________________________________________ 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++) { // printf(" %d\n",GetModuleIndex(i)); fESDtrack->SetITSModuleIndex(i,GetModuleIndex(i)); } + // 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]; + fESDtrack->SetITSdEdxSamples(sdedx); } //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : AliKalmanTrack(t), + fCheckInvariant(t.fCheckInvariant), fdEdx(t.fdEdx), fESDtrack(t.fESDtrack) { @@ -174,8 +182,10 @@ Bool_t AliITStrackV2::PropagateTo(Double_t xk, Double_t d, Double_t x0) { Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ(); - Double_t bz=GetBz(); - if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE; + //Double_t bz=GetBz(); + //if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE; + Double_t b[3]; GetBxByBz(b); + if (!AliExternalTrackParam::PropagateToBxByBz(xk,b)) return kFALSE; Double_t xOverX0,xTimesRho; xOverX0 = d; xTimesRho = d*x0; if (!CorrectForMeanMaterial(xOverX0,xTimesRho,kTRUE)) return kFALSE; @@ -201,7 +211,11 @@ Bool_t AliITStrackV2::PropagateToTGeo(Double_t xToGo, Int_t nstep, Double_t &xOv Double_t sign = (startxGetY(), c->GetZ()}; - Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()}; + Double_t cov[3]={c->GetSigmaY2(), c->GetSigmaYZ(), c->GetSigmaZ2()}; if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; @@ -249,8 +266,10 @@ Bool_t AliITStrackV2::Update(const AliCluster* c, Double_t chi2, Int_t index) if (chi2<0) return kTRUE; // fill residuals for ITS+TPC tracks - if (fESDtrack->GetStatus()&AliESDtrack::kTPCin) { - AliTracker::FillResiduals(this,p,cov,c->GetVolumeId()); + if (fESDtrack) { + if (fESDtrack->GetStatus()&AliESDtrack::kTPCin) { + AliTracker::FillResiduals(this,p,cov,c->GetVolumeId()); + } } fIndex[n]=index; @@ -264,13 +283,15 @@ 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 Float_t maxMisalErrY2=0,maxMisalErrZ2=0; for (Int_t lay=0; layGetClusterMisalErrorY(lay)); - maxMisalErrZ2 = TMath::Max(maxMisalErrZ2,AliITSReconstructor::GetRecoParam()->GetClusterMisalErrorZ(lay)); + maxMisalErrY2 = TMath::Max(maxMisalErrY2,AliITSReconstructor::GetRecoParam()->GetClusterMisalErrorY(lay,GetBz())); + maxMisalErrZ2 = TMath::Max(maxMisalErrZ2,AliITSReconstructor::GetRecoParam()->GetClusterMisalErrorZ(lay,GetBz())); } maxMisalErrY2 *= maxMisalErrY2; maxMisalErrZ2 *= maxMisalErrZ2; @@ -318,8 +339,10 @@ Bool_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { //------------------------------------------------------------------ //This function propagates a track //------------------------------------------------------------------ - Double_t bz=GetBz(); - if (!AliExternalTrackParam::Propagate(alp,xk,bz)) return kFALSE; + //Double_t bz=GetBz(); + //if (!AliExternalTrackParam::Propagate(alp,xk,bz)) return kFALSE; + Double_t b[3]; GetBxByBz(b); + if (!AliExternalTrackParam::PropagateBxByBz(alp,xk,b)) return kFALSE; if (!Invariant()) { Int_t n=GetNumberOfClusters(); @@ -370,12 +393,38 @@ 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 + + return kTRUE; //PH temporary switched off + + 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 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 dy = par[0] - yv, dz = par[1] - zv; Double_t r2=GetX()*GetX() + dy*dy; Double_t p2=(1.+ GetTgl()*GetTgl())/(GetSigned1Pt()*GetSigned1Pt()); Double_t beta2=p2/(p2 + GetMass()*GetMass()); @@ -388,29 +437,34 @@ Bool_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { Double_t dummy = 4/r2 - GetC()*GetC(); 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 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*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; } { Double_t parl=0.5*GetC()*dz/TMath::ASin(0.5*GetC()*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; @@ -420,36 +474,47 @@ void AliITStrackV2::CookdEdx(Double_t low, Double_t up) { //----------------------------------------------------------------- // This function calculates dE/dX within the "low" and "up" cuts. // Origin: Boris Batyunya, JINR, Boris.Batiounia@cern.ch + // Updated: F. Prino 8-June-2009 //----------------------------------------------------------------- - // The clusters order is: SSD-2, SSD-1, SDD-2, SDD-1, SPD-2, SPD-1 + // The cluster order is: SDD-1, SDD-2, SSD-1, SSD-2 - Int_t i; Int_t nc=0; - for (i=0; i>28; - if (idx>1) nc++; // Take only SSD and SDD + Float_t dedx[4]; + for (Int_t il=0; il<4; il++) { // count good (>0) dE/dx values + if(fdEdxSample[il]>0.){ + dedx[nc]= fdEdxSample[il]; + nc++; + } + } + if(nc<1){ + SetdEdx(0.); + return; } - Int_t swap;//stupid sorting + Int_t swap; // sort in ascending order do { swap=0; - for (i=0; i0) dedx /= (nu-nl); - SetdEdx(dedx); + Double_t nl=low*nc, nu =up*nc; + Float_t sumamp = 0; + Float_t sumweight =0; + for (Int_t i=0; inu-1) weight = TMath::Max(nu-i,0.); + sumamp+= dedx[i]*weight; + sumweight+=weight; + } + SetdEdx(sumamp/sumweight); } //____________________________________________________________________________ @@ -461,13 +526,25 @@ GetPhiZat(Double_t r, Double_t &phi, Double_t &z) const { // The track curvature is neglected. //------------------------------------------------------------------ Double_t d=GetD(0.,0.); - if (TMath::Abs(d) > r) return kFALSE; + if (TMath::Abs(d) > r) { + if (r>1e-1) return kFALSE; + r = TMath::Abs(d); + } Double_t rcurr=TMath::Sqrt(GetX()*GetX() + GetY()*GetY()); - if (TMath::Abs(d) > rcurr) return kFALSE; - Double_t phicurr=GetAlpha()+TMath::ASin(GetSnp()); + if (TMath::Abs(d) > rcurr) return kFALSE; + Double_t globXYZcurr[3]; GetXYZ(globXYZcurr); + Double_t phicurr=TMath::ATan2(globXYZcurr[1],globXYZcurr[0]); + + if (GetX()>=0.) { + phi=phicurr+TMath::ASin(d/r)-TMath::ASin(d/rcurr); + } else { + phi=phicurr+TMath::ASin(d/r)+TMath::ASin(d/rcurr)-TMath::Pi(); + } - phi=phicurr+TMath::ASin(d/r)-TMath::ASin(d/rcurr); + // return a phi in [0,2pi[ + if (phi<0.) phi+=2.*TMath::Pi(); + else if (phi>=2.*TMath::Pi()) phi-=2.*TMath::Pi(); z=GetZ()+GetTgl()*(TMath::Sqrt((r-d)*(r+d))-TMath::Sqrt((rcurr-d)*(rcurr+d))); return kTRUE; } @@ -480,11 +557,20 @@ GetLocalXat(Double_t r,Double_t &xloc) const { // The track curvature is neglected. //------------------------------------------------------------------ Double_t d=GetD(0.,0.); - if (TMath::Abs(d) > r) return kFALSE; + if (TMath::Abs(d) > r) { + if (r>1e-1) return kFALSE; + r = TMath::Abs(d); + } Double_t rcurr=TMath::Sqrt(GetX()*GetX() + GetY()*GetY()); - Double_t phicurr=GetAlpha()+TMath::ASin(GetSnp()); - Double_t phi=phicurr+TMath::ASin(d/r)-TMath::ASin(d/rcurr); + Double_t globXYZcurr[3]; GetXYZ(globXYZcurr); + Double_t phicurr=TMath::ATan2(globXYZcurr[1],globXYZcurr[0]); + Double_t phi; + if (GetX()>=0.) { + phi=phicurr+TMath::ASin(d/r)-TMath::ASin(d/rcurr); + } else { + phi=phicurr+TMath::ASin(d/r)+TMath::ASin(d/rcurr)-TMath::Pi(); + } xloc=r*(TMath::Cos(phi)*TMath::Cos(GetAlpha()) +TMath::Sin(phi)*TMath::Sin(GetAlpha()));