X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITStrackV2.cxx;h=af3a54b691aba9a8bea93f5f9b744194ead02245;hb=3c09f7a37f79cd060062e84ab05866a82101807c;hp=05df21ede935b0e0f6a96fb00dc448d6259f772e;hpb=83d735005d2c279d149e176175f85aed209c9af9;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITStrackV2.cxx b/ITS/AliITStrackV2.cxx index 05df21ede93..af3a54b691a 100644 --- a/ITS/AliITStrackV2.cxx +++ b/ITS/AliITStrackV2.cxx @@ -19,13 +19,9 @@ // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch // dEdx analysis by: Boris Batyunya, JINR, Boris.Batiounia@cern.ch //------------------------------------------------------------------------- - -#include - #include #include "AliCluster.h" -#include "AliTPCtrack.h" #include "AliESDtrack.h" #include "AliITStrackV2.h" @@ -59,58 +55,24 @@ AliITStrackV2::AliITStrackV2():AliKalmanTrack(), fC43(0), fC44(0), fESDtrack(0) - { - for(Int_t i=0; i ITS track - //------------------------------------------------------------------ - SetChi2(0.); - SetNumberOfClusters(0); - - fdEdx = t.GetdEdx(); - SetMass(t.GetMass()); - - fAlpha = t.GetAlpha(); - if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi(); - else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi(); - - //Conversion of the track parameters - Double_t x,p[5]; t.GetExternalParameters(x,p); - fX=x; x=GetConvConst(); - fP0=p[0]; - fP1=p[1]; - fP2=p[2]; - fP3=p[3]; - fP4=p[4]/x; - - //Conversion of the covariance matrix - Double_t c[15]; t.GetExternalCovariance(c); - - fC00=c[0 ]; - fC10=c[1 ]; fC11=c[2 ]; - fC20=c[3 ]; fC21=c[4 ]; fC22=c[5 ]; - fC30=c[6 ]; fC31=c[7 ]; fC32=c[8 ]; fC33=c[9 ]; - fC40=c[10]/x; fC41=c[11]/x; fC42=c[12]/x; fC43=c[13]/x; fC44=c[14]/x/x; - - if (!Invariant()) throw "AliITStrackV2: conversion failed !\n"; - -} //____________________________________________________________________________ -AliITStrackV2::AliITStrackV2(AliESDtrack& t) throw (const Char_t *) : +AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) : AliKalmanTrack() { //------------------------------------------------------------------ - //Conversion ESD track -> ITS track + // Conversion ESD track -> ITS track. + // If c==kTRUE, create the ITS track out of the constrained params. //------------------------------------------------------------------ SetNumberOfClusters(t.GetITSclusters(fIndex)); SetLabel(t.GetLabel()); SetMass(t.GetMass()); + // + // fdEdx=t.GetITSsignal(); fAlpha = t.GetAlpha(); @@ -118,7 +80,9 @@ AliKalmanTrack() { else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi(); //Conversion of the track parameters - Double_t x,p[5]; t.GetExternalParameters(x,p); + Double_t x,p[5]; + if (c) t.GetConstrainedExternalParameters(x,p); + else t.GetExternalParameters(x,p); fX=x; x=GetConvConst(); fP0=p[0]; fP1=p[1]; @@ -127,13 +91,14 @@ AliKalmanTrack() { fP4=p[4]/x; //Conversion of the covariance matrix - Double_t c[15]; t.GetExternalCovariance(c); - - fC00=c[0 ]; - fC10=c[1 ]; fC11=c[2 ]; - fC20=c[3 ]; fC21=c[4 ]; fC22=c[5 ]; - fC30=c[6 ]; fC31=c[7 ]; fC32=c[8 ]; fC33=c[9 ]; - fC40=c[10]/x; fC41=c[11]/x; fC42=c[12]/x; fC43=c[13]/x; fC44=c[14]/x/x; + Double_t cv[15]; + if (c) t.GetConstrainedExternalCovariance(cv); + else t.GetExternalCovariance(cv); + fC00=cv[0 ]; + fC10=cv[1 ]; fC11=cv[2 ]; + fC20=cv[3 ]; fC21=cv[4 ]; fC22=cv[5 ]; + fC30=cv[6 ]; fC31=cv[7 ]; fC32=cv[8 ]; fC33=cv[9 ]; + fC40=cv[10]/x; fC41=cv[11]/x; fC42=cv[12]/x; fC43=cv[13]/x; fC44=cv[14]/x/x; if (t.GetStatus()&AliESDtrack::kTIME) { StartTimeIntegral(); @@ -142,13 +107,17 @@ AliKalmanTrack() { } fESDtrack=&t; - if (!Invariant()) throw "AliITStrackV2: conversion failed !\n"; + // if (!Invariant()) throw "AliITStrackV2: conversion failed !\n"; + for(Int_t i=0; i<4; i++) fdEdxSample[i]=0; } -void AliITStrackV2::UpdateESDtrack(ULong_t flags) { +void AliITStrackV2::UpdateESDtrack(ULong_t flags) const { fESDtrack->UpdateTrackParams(this,flags); } +void AliITStrackV2::SetConstrainedESDtrack(Double_t chi2) const { + fESDtrack->SetConstrainedTrackParams(this,chi2); +} //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : AliKalmanTrack(t) { @@ -169,8 +138,8 @@ AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : AliKalmanTrack(t) { Int_t n=GetNumberOfClusters(); for (Int_t i=0; iGetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); r00+=fC00; r01+=fC10; r11+=fC11; - + // Double_t det=r00*r11 - r01*r01; if (TMath::Abs(det) < 1.e-30) { Int_t n=GetNumberOfClusters(); @@ -273,7 +242,7 @@ Int_t AliITStrackV2::CorrectForMaterial(Double_t d, Double_t x0) { //------------------------------------------------------------------ //This function corrects the track parameters for crossed material //------------------------------------------------------------------ - Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt()); + Double_t p2=(1.+ fP3*fP3)/(Get1Pt()*Get1Pt()); Double_t beta2=p2/(p2 + GetMass()*GetMass()); d*=TMath::Sqrt((1.+ fP3*fP3)/(1.- fP2*fP2)); @@ -293,7 +262,8 @@ Int_t AliITStrackV2::CorrectForMaterial(Double_t d, Double_t x0) { Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2)*d; if (beta2/(1-beta2)>3.5*3.5) dE=0.153e-3/beta2*(log(3.5*5940)+0.5*log(beta2/(1-beta2)) - beta2)*d; - fP4*=(1.- sqrt(p2+GetMass()*GetMass())/p2*dE); + + fP4*=(1.- TMath::Sqrt(p2+GetMass()*GetMass())/p2*dE); } if (!Invariant()) return 0; @@ -308,10 +278,12 @@ Int_t AliITStrackV2::PropagateTo(Double_t xk, Double_t d, Double_t x0) { //------------------------------------------------------------------ Double_t x1=fX, x2=xk, dx=x2-x1; Double_t f1=fP2, f2=f1 + fP4*dx; - if (TMath::Abs(f2) >= 0.9999) { - Int_t n=GetNumberOfClusters(); - if (n>kWARN) - Warning("PropagateTo","Propagation failed !\n",n); + if (TMath::Abs(f2) >= 0.98) { + // MI change - don't propagate highly inclined tracks + // covariance matrix distorted + // Int_t n=GetNumberOfClusters(); + // if (n>kWARN) + // Warning("PropagateTo","Propagation failed !\n",n); return 0; } @@ -397,6 +369,7 @@ Int_t AliITStrackV2::Update(const AliCluster* c, Double_t chi2, UInt_t index) { Double_t det=r00*r11 - r01*r01; Double_t tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det; + Double_t k00=fC00*r00+fC10*r01, k01=fC00*r01+fC10*r11; Double_t k10=fC10*r00+fC11*r01, k11=fC10*r01+fC11*r11; Double_t k20=fC20*r00+fC21*r01, k21=fC20*r01+fC21*r11; @@ -441,6 +414,8 @@ Int_t AliITStrackV2::Update(const AliCluster* c, Double_t chi2, UInt_t index) { return 0; } + if (chi2<0) return 1; + Int_t n=GetNumberOfClusters(); fIndex[n]=index; SetNumberOfClusters(n+1); @@ -500,7 +475,6 @@ Int_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { Double_t ca=TMath::Cos(alp-fAlpha), sa=TMath::Sin(alp-fAlpha); Double_t sf=fP2, cf=TMath::Sqrt(1.- fP2*fP2); - TMatrixD *T=0; // **** rotation ********************** { fAlpha = alp; @@ -508,37 +482,40 @@ Int_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { fP0= -x*sa + p0*ca; fP2= sf*ca - cf*sa; - TMatrixD C(5,5); - C(0,0)=c00; - C(1,0)=c10; C(1,1)=c11; - C(2,0)=c20; C(2,1)=c21; C(2,2)=c22; - C(3,0)=c30; C(3,1)=c31; C(3,2)=c32; C(3,3)=c33; - C(4,0)=c40; C(4,1)=c41; C(4,2)=c42; C(4,3)=c43; C(4,4)=c44; - C(0,1)=C(1,0); - C(0,2)=C(2,0); C(1,2)=C(2,1); - C(0,3)=C(3,0); C(1,3)=C(3,1); C(2,3)=C(3,2); - C(0,4)=C(4,0); C(1,4)=C(4,1); C(2,4)=C(4,2); C(3,4)=C(4,3); - - TMatrixD F(6,5); - F(0,0)=sa; - F(1,0)=ca; - F(2,1)=F(4,3)=F(5,4)=1; - F(3,2)=ca + sf/cf*sa; - - TMatrixD tmp(C,TMatrixD::kMult,TMatrixD(TMatrixD::kTransposed, F)); - T=new TMatrixD(F,TMatrixD::kMult,tmp); + Double_t rr=(ca+sf/cf*sa); + + fC00 *= (ca*ca); + fC10 *= ca; + fC20 *= ca*rr; + fC30 *= ca; + fC40 *= ca; + //fC11 = fC11; + fC21 *= rr; + //fC31 = fC31; + //fC41 = fC41; + fC22 *= rr*rr; + fC32 *= rr; + fC42 *= rr; + //fC33=fC33; + //fC43=fC43; + //fC44=fC44; + } // **** translation ****************** { Double_t dx=xk-fX; Double_t f1=fP2, f2=f1 + fP4*dx; - if (TMath::Abs(f2) >= 0.9999) { - Int_t n=GetNumberOfClusters(); - if (n>kWARN) - Warning("Propagate","Propagation failed (%d) !\n",n); + if (TMath::Abs(f2) >= 0.98) { + // don't propagate highly inclined tracks MI return 0; } + // if (TMath::Abs(f2) >= 0.9999) { +// Int_t n=GetNumberOfClusters(); +// if (n>kWARN) +// Warning("Propagate","Propagation failed (%d) !\n",n); +// return 0; +// } Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2); fX=xk; @@ -546,27 +523,45 @@ Int_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { fP1 += dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; fP2 += dx*fP4; - TMatrixD F(5,6); - F(0,1)=F(1,2)=F(2,3)=F(3,4)=F(4,5)=1; - F(0,3)=dx/(r1+r2)*(2+(f1+f2)*(f2/r2+f1/r1)/(r1+r2)); - F(0,5)=dx*dx/(r1+r2)*(1+(f1+f2)*f2/(r1+r2)); - F(1,3)=dx*fP3/(f1*r2 + f2*r1)*(2-(f1+f2)*(r2-f1*f2/r2+r1-f2*f1/r1)/(f1*r2 + f2*r1)); - F(1,4)=dx*(f1+f2)/(f1*r2 + f2*r1); - F(1,5)=dx*dx*fP3/(f1*r2 + f2*r1)*(1-(f1+f2)*(-f1*f2/r2+r1)/(f1*r2 + f2*r1)); - F(2,5)=dx; - F(0,0)=-1/(r1+r2)*((f1+f2)+dx*fP4*(1+(f1+f2)/(r1+r2)*f2/r2)); - F(1,0)=-fP3/(f1*r2 + f2*r1)*((f1+f2)+dx*fP4*(1+(f1+f2)/(f1*r2 + f2*r1)*(f1*f2/r2-r1))); - F(2,0)=-fP4; - - TMatrixD tmp(*T,TMatrixD::kMult,TMatrixD(TMatrixD::kTransposed, F)); - delete T; - TMatrixD C(F,TMatrixD::kMult,tmp); - - fC00=C(0,0); - fC10=C(1,0); fC11=C(1,1); - fC20=C(2,0); fC21=C(2,1); fC22=C(2,2); - fC30=C(3,0); fC31=C(3,1); fC32=C(3,2); fC33=C(3,3); - fC40=C(4,0); fC41=C(4,1); fC42=C(4,2); fC43=C(4,3); fC44=C(4,4); + //f = F - 1 + + Double_t f02= dx/(r1*r1*r1); + Double_t f04=0.5*dx*dx/(r1*r1*r1); + Double_t f12= dx*fP3*f1/(r1*r1*r1); + Double_t f14=0.5*dx*dx*fP3*f1/(r1*r1*r1); + Double_t f13= dx/r1; + Double_t f24= dx; + + //b = C*ft + Double_t b00=f02*fC20 + f04*fC40, b01=f12*fC20 + f14*fC40 + f13*fC30; + Double_t b02=f24*fC40; + Double_t b10=f02*fC21 + f04*fC41, b11=f12*fC21 + f14*fC41 + f13*fC31; + Double_t b12=f24*fC41; + Double_t b20=f02*fC22 + f04*fC42, b21=f12*fC22 + f14*fC42 + f13*fC32; + Double_t b22=f24*fC42; + Double_t b40=f02*fC42 + f04*fC44, b41=f12*fC42 + f14*fC44 + f13*fC43; + Double_t b42=f24*fC44; + Double_t b30=f02*fC32 + f04*fC43, b31=f12*fC32 + f14*fC43 + f13*fC33; + Double_t b32=f24*fC43; + + //a = f*b = f*C*ft + Double_t a00=f02*b20+f04*b40,a01=f02*b21+f04*b41,a02=f02*b22+f04*b42; + Double_t a11=f12*b21+f14*b41+f13*b31,a12=f12*b22+f14*b42+f13*b32; + Double_t a22=f24*b42; + + //F*C*Ft = C + (b + bt + a) + fC00 += b00 + b00 + a00; + fC10 += b10 + b01 + a01; + fC20 += b20 + b02 + a02; + fC30 += b30; + fC40 += b40; + fC11 += b11 + b11 + a11; + fC21 += b21 + b12 + a12; + fC31 += b31; + fC41 += b41; + fC22 += b22 + b22 + a22; + fC32 += b32; + fC42 += b42; if (!Invariant()) { fAlpha=alpha; @@ -584,6 +579,7 @@ Int_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { return 1; } + Double_t AliITStrackV2::GetD(Double_t x, Double_t y) const { //------------------------------------------------------------------ // This function calculates the transverse impact parameter @@ -602,6 +598,24 @@ Double_t AliITStrackV2::GetD(Double_t x, Double_t y) const { return a/(1 + TMath::Sqrt(sn*sn + cs*cs)); } +Double_t AliITStrackV2::GetZat(Double_t x) const { + //------------------------------------------------------------------ + // This function calculates the z at given x point - in current coordinate system + //------------------------------------------------------------------ + Double_t x1=fX, x2=x, dx=x2-x1; + // + Double_t f1=fP2, f2=f1 + fP4*dx; + if (TMath::Abs(f2) >= 0.9999) { + return 10000000; + } + Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2); + Double_t z = fP1 + dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; + return z; +} + + + + Int_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { //------------------------------------------------------------------ //This function improves angular track parameters @@ -618,7 +632,9 @@ Int_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { 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 parp=0.5*(fP4*fX + dy*TMath::Sqrt(4/r2-fP4*fP4)); + Double_t dummy=4/r2-fP4*fP4; + if (dummy < 0) return 0; + Double_t parp=0.5*(fP4*fX + dy*TMath::Sqrt(dummy)); Double_t sigma2p = theta2*(1.- GetSnp()*GetSnp())*(1. + GetTgl()*GetTgl()); sigma2p += fC00/r2*(1.- dy*dy/r2)*(1.- dy*dy/r2); sigma2p += ers[1]*ers[1]/r2; @@ -645,47 +661,6 @@ Int_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { return 1; } -/* -Int_t AliITStrackV2::Improve(Double_t x0,Double_t yv,Double_t zv) { - //------------------------------------------------------------------ - //This function improves angular track parameters - //------------------------------------------------------------------ - Double_t dy=fP0-yv, dz=fP1-zv; - Double_t r2=fX*fX+dy*dy; - Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt()); - 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 par=0.5*(fP4*fX + dy*TMath::Sqrt(4/r2-fP4*fP4)); - Double_t sigma2 = theta2*(1.- GetSnp()*GetSnp())*(1. + GetTgl()*GetTgl()); - sigma2 += fC00/r2*(1.- dy*dy/r2)*(1.- dy*dy/r2); - sigma2 += kSigmaYV*kSigmaYV/r2; - sigma2 += 0.25*fC44*fX*fX; - Double_t eps2=sigma2/(fC22+sigma2), eps=TMath::Sqrt(eps2); - if (10*r2*fC44