X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TRD%2FAliTRDtrack.cxx;h=5ce8128b6182c535aa7c4d51678f8cc21aa03d83;hb=67a579df46073a0f86850f7eed91111e1352e25d;hp=09be24027543ff2a0b3d1e6d152cd48bf0204e84;hpb=ca6c93d6586d7fb979f6682a44ac63651c3ab78d;p=u%2Fmrichter%2FAliRoot.git diff --git a/TRD/AliTRDtrack.cxx b/TRD/AliTRDtrack.cxx index 09be2402754..5ce8128b618 100644 --- a/TRD/AliTRDtrack.cxx +++ b/TRD/AliTRDtrack.cxx @@ -13,535 +13,1019 @@ * provided "as is" without express or implied warranty. * **************************************************************************/ -/* -$Log$ -Revision 1.10 2002/06/12 09:54:35 cblume -Update of tracking code provided by Sergei +/* $Id$ */ -Revision 1.8 2001/05/30 12:17:47 hristov -Loop variables declared once +#include -Revision 1.7 2001/05/28 17:07:58 hristov -Last minute changes; ExB correction in AliTRDclusterizerV1; taking into account of material in G10 TEC frames and material between TEC planes (C.Blume,S.Sedykh) +#include +#include -Revision 1.4 2000/12/08 16:07:02 cblume -Update of the tracking by Sergei - -Revision 1.3 2000/10/15 23:40:01 cblume -Remove AliTRDconst - -Revision 1.2 2000/10/06 16:49:46 cblume -Made Getters const - -Revision 1.1.2.1 2000/09/22 14:47:52 cblume -Add the tracking code - -*/ - -#include -#include +#include "AliTracker.h" +#include "AliESDtrack.h" #include "AliTRDgeometry.h" #include "AliTRDcluster.h" #include "AliTRDtrack.h" -#include "../TPC/AliTPCtrack.h" +#include "AliTRDtracklet.h" ClassImp(AliTRDtrack) +/////////////////////////////////////////////////////////////////////////////// +// // +// Represents a reconstructed TRD track // +// Local TRD Kalman track // +// // +/////////////////////////////////////////////////////////////////////////////// //_____________________________________________________________________________ +AliTRDtrack::AliTRDtrack() + :AliKalmanTrack() + ,fSeedLab(-1) + ,fdEdx(0) + ,fDE(0) + ,fStopped(kFALSE) + ,fLhElectron(0) + ,fNWrong(0) + ,fNRotate(0) + ,fNCross(0) + ,fNExpected(0) + ,fNLast(0) + ,fNExpectedLast(0) + ,fNdedx(0) + ,fChi2Last(1e10) + ,fBackupTrack(0x0) +{ + // + // AliTRDtrack default constructor + // -AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, UInt_t index, - const Double_t xx[5], const Double_t cc[15], - Double_t xref, Double_t alpha) : AliKalmanTrack() { - //----------------------------------------------------------------- - // This is the main track constructor. - //----------------------------------------------------------------- + for (Int_t i = 0; i < kNplane; i++) { + for (Int_t j = 0; j < kNslice; j++) { + fdEdxPlane[i][j] = 0.0; + } + fTimBinPlane[i] = -1; + } - fSeedLab = -1; + for (UInt_t i = 0; i < kMAXCLUSTERSPERTRACK; i++) { + fIndex[i] = 0; + fIndexBackup[i] = 0; + fdQdl[i] = 0; + } - fAlpha=alpha; - if (fAlpha<-TMath::Pi()) fAlpha += 2*TMath::Pi(); - if (fAlpha>=TMath::Pi()) fAlpha -= 2*TMath::Pi(); + for (Int_t i = 0; i < 3; i++) { + fBudget[i] = 0; + } - fX=xref; +} - fY=xx[0]; fZ=xx[1]; fC=xx[2]; fE=xx[3]; fT=xx[4]; +//_____________________________________________________________________________ +AliTRDtrack::AliTRDtrack(const AliTRDcluster *c, Int_t index + , const Double_t p[5], const Double_t cov[15] + , Double_t x, Double_t alpha) + :AliKalmanTrack() + ,fSeedLab(-1) + ,fdEdx(0) + ,fDE(0) + ,fStopped(kFALSE) + ,fLhElectron(0) + ,fNWrong(0) + ,fNRotate(0) + ,fNCross(0) + ,fNExpected(0) + ,fNLast(0) + ,fNExpectedLast(0) + ,fNdedx(0) + ,fChi2Last(1e10) + ,fBackupTrack(0x0) +{ + // + // The main AliTRDtrack constructor. + // + + Double_t cnv = 1.0/(GetBz() * kB2C); + + Double_t pp[5] = { p[0] + , p[1] + , x*p[4] - p[2] + , p[3] + , p[4]*cnv }; + + Double_t c22 = x*x*cov[14] - 2*x*cov[12] + cov[5]; + Double_t c32 = x*cov[13] - cov[8]; + Double_t c20 = x*cov[10] - cov[3]; + Double_t c21 = x*cov[11] - cov[4]; + Double_t c42 = x*cov[14] - cov[12]; - fCyy=cc[0]; - fCzy=cc[1]; fCzz=cc[2]; - fCcy=cc[3]; fCcz=cc[4]; fCcc=cc[5]; - fCey=cc[6]; fCez=cc[7]; fCec=cc[8]; fCee=cc[9]; - fCty=cc[10]; fCtz=cc[11]; fCtc=cc[12]; fCte=cc[13]; fCtt=cc[14]; + Double_t cc[15] = { cov[0 ] + , cov[1 ], cov[2 ] + , c20, c21, c22 + , cov[6 ], cov[7 ], c32, cov[9 ] + , cov[10]*cnv, cov[11]*cnv, c42*cnv, cov[13]*cnv, cov[14]*cnv*cnv }; - fIndex[0]=index; + Set(x,alpha,pp,cc); SetNumberOfClusters(1); + fIndex[0] = index; - fdEdx=0.; + for (Int_t i = 0; i < kNplane; i++) { + for (Int_t j = 0; j < kNslice; j++) { + fdEdxPlane[i][j] = 0.0; + } + fTimBinPlane[i] = -1; + } Double_t q = TMath::Abs(c->GetQ()); - Double_t s = fX*fC - fE, t=fT; - if(s*s < 1) q *= TMath::Sqrt((1-s*s)/(1+t*t)); + Double_t s = GetSnp(); + Double_t t = GetTgl(); + if (s*s < 1) { + q *= TMath::Sqrt((1-s*s)/(1+t*t)); + } + + fdQdl[0] = q; + + for (UInt_t i = 1; i < kMAXCLUSTERSPERTRACK; i++) { + fdQdl[i] = 0; + fIndex[i] = 0; + fIndexBackup[i] = 0; + } + + for (Int_t i = 0; i < 3;i++) { + fBudget[i] = 0; + } - fdQdl[0] = q; } //_____________________________________________________________________________ -AliTRDtrack::AliTRDtrack(const AliTRDtrack& t) : AliKalmanTrack(t) { +AliTRDtrack::AliTRDtrack(const AliTRDtrack &t) + :AliKalmanTrack(t) + ,fSeedLab(t.GetSeedLabel()) + ,fdEdx(t.fdEdx) + ,fDE(t.fDE) + ,fStopped(t.fStopped) + ,fLhElectron(0) + ,fNWrong(t.fNWrong) + ,fNRotate(t.fNRotate) + ,fNCross(t.fNCross) + ,fNExpected(t.fNExpected) + ,fNLast(t.fNLast) + ,fNExpectedLast(t.fNExpectedLast) + ,fNdedx(t.fNdedx) + ,fChi2Last(t.fChi2Last) + ,fBackupTrack(0x0) +{ // // Copy constructor. // - SetLabel(t.GetLabel()); - fSeedLab=t.GetSeedLabel(); - - SetChi2(t.GetChi2()); - fdEdx=t.fdEdx; + for (Int_t i = 0; i < kNplane; i++) { + for (Int_t j = 0; j < kNslice; j++) { + fdEdxPlane[i][j] = t.fdEdxPlane[i][j]; + } + fTimBinPlane[i] = t.fTimBinPlane[i]; + fTracklets[i] = t.fTracklets[i]; + } - fAlpha=t.fAlpha; - fX=t.fX; + Int_t n = t.GetNumberOfClusters(); + SetNumberOfClusters(n); - fY=t.fY; fZ=t.fZ; fC=t.fC; fE=t.fE; fT=t.fT; + for (Int_t i = 0; i < n; i++) { + fIndex[i] = t.fIndex[i]; + fIndexBackup[i] = t.fIndex[i]; + fdQdl[i] = t.fdQdl[i]; + } - fCyy=t.fCyy; - fCzy=t.fCzy; fCzz=t.fCzz; - fCcy=t.fCcy; fCcz=t.fCcz; fCcc=t.fCcc; - fCey=t.fCey; fCez=t.fCez; fCec=t.fCec; fCee=t.fCee; - fCty=t.fCty; fCtz=t.fCtz; fCtc=t.fCtc; fCte=t.fCte; fCtt=t.fCtt; + for (UInt_t i = n; i < kMAXCLUSTERSPERTRACK; i++) { + fdQdl[i] = 0; + fIndex[i] = 0; + fIndexBackup[i] = 0; + } - Int_t n=t.GetNumberOfClusters(); - SetNumberOfClusters(n); - for (Int_t i=0; i= TMath::Pi()) fAlpha -= 2*TMath::Pi(); + for (UInt_t i = 0; i < kMAXCLUSTERSPERTRACK; i++) { + fdQdl[i] = 0; + fIndex[i] = 0; + fIndexBackup[i] = 0; + } + + for (Int_t i = 0; i < 3; i++) { + fBudget[i] = 0; + } - Double_t x, p[5]; t.GetExternalParameters(x,p); +} - fX=x; +//_____________________________________________________________________________ +AliTRDtrack::AliTRDtrack(const AliESDtrack &t) + :AliKalmanTrack() + ,fSeedLab(-1) + ,fdEdx(t.GetTRDsignal()) + ,fDE(0) + ,fStopped(kFALSE) + ,fLhElectron(0) + ,fNWrong(0) + ,fNRotate(0) + ,fNCross(0) + ,fNExpected(0) + ,fNLast(0) + ,fNExpectedLast(0) + ,fNdedx(0) + ,fChi2Last(1e10) + ,fBackupTrack(0x0) +{ + // + // Constructor from AliESDtrack + // + + SetLabel(t.GetLabel()); + SetChi2(0.0); + SetMass(t.GetMass()); + SetNumberOfClusters(t.GetTRDclusters(fIndex)); + + Int_t ncl = t.GetTRDclusters(fIndexBackup); + for (UInt_t i = ncl; i < kMAXCLUSTERSPERTRACK; i++) { + fIndexBackup[i] = 0; + fIndex[i] = 0; + } - x = GetConvConst(); + for (Int_t i = 0; i < kNplane; i++) { + for (Int_t j = 0; j < kNslice; j++) { + fdEdxPlane[i][j] = t.GetTRDsignals(i,j); + } + fTimBinPlane[i] = t.GetTRDTimBin(i); + } - fY=p[0]; fZ=p[1]; fC=p[4]/x; - fE=fX*fC-p[2]; fT=p[3]; + const AliExternalTrackParam *par = &t; + if (t.GetStatus() & AliESDtrack::kTRDbackup) { + par = t.GetOuterParam(); + if (!par) { + AliError("No backup info!"); + par = &t; + } + } + Set(par->GetX(),par->GetAlpha(),par->GetParameter(),par->GetCovariance()); - //Conversion of the covariance matrix - Double_t c[15]; t.GetExternalCovariance(c); + + for (UInt_t i = 0; i < kMAXCLUSTERSPERTRACK; i++) { + fdQdl[i] = 0; + } - c[10]/=x; c[11]/=x; c[12]/=x; c[13]/=x; c[14]/=x*x; + for (Int_t i = 0; i < 3; i++) { + fBudget[i] = 0; + } - Double_t c22=fX*fX*c[14] - 2*fX*c[12] + c[5]; - Double_t c32=fX*c[13] - c[8]; - Double_t c20=fX*c[10] - c[3], c21=fX*c[11] - c[4], c42=fX*c[14] - c[12]; + if ((t.GetStatus() & AliESDtrack::kTIME) == 0) { + return; + } - fCyy=c[0 ]; - fCzy=c[1 ]; fCzz=c[2 ]; - fCcy=c[10]; fCcz=c[11]; fCcc=c[14]; - fCey=c20; fCez=c21; fCec=c42; fCee=c22; - fCty=c[6 ]; fCtz=c[7 ]; fCtc=c[13]; fCte=c32; fCtt=c[9 ]; + StartTimeIntegral(); + Double_t times[10]; + t.GetIntegratedTimes(times); + SetIntegratedTimes(times); + SetIntegratedLength(t.GetIntegratedLength()); -} +} //____________________________________________________________________________ -void AliTRDtrack::GetExternalParameters(Double_t& xr, Double_t x[5]) const { +AliTRDtrack::~AliTRDtrack() +{ // - // This function returns external TRD track representation + // Destructor // - xr=fX; - x[0]=GetY(); - x[1]=GetZ(); - x[2]=GetSnp(); - x[3]=GetTgl(); - x[4]=fC*GetConvConst(); -} -//_____________________________________________________________________________ -void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const { + if (fBackupTrack) { + delete fBackupTrack; + } + fBackupTrack = 0; + +} + +//____________________________________________________________________________ +Float_t AliTRDtrack::StatusForTOF() +{ // - // This function returns external representation of the covriance matrix. + // Defines the status of the TOF extrapolation // - Double_t a=GetConvConst(); - - Double_t c22=fX*fX*fCcc-2*fX*fCec+fCee; - Double_t c32=fX*fCtc-fCte; - Double_t c20=fX*fCcy-fCey, c21=fX*fCcz-fCez, c42=fX*fCcc-fCec; - cc[0 ]=fCyy; - cc[1 ]=fCzy; cc[2 ]=fCzz; - cc[3 ]=c20; cc[4 ]=c21; cc[5 ]=c22; - cc[6 ]=fCty; cc[7 ]=fCtz; cc[8 ]=c32; cc[9 ]=fCtt; - cc[10]=fCcy*a; cc[11]=fCcz*a; cc[12]=c42*a; cc[13]=fCtc*a; cc[14]=fCcc*a*a; -} - + // Definition of res ???? + Float_t res = (0.2 + 0.8 * (fN / (fNExpected + 5.0))) + * (0.4 + 0.6 * fTracklets[5].GetN() / 20.0); + res *= (0.25 + 0.8 * 40.0 / (40.0 + fBudget[2])); + return res; + + // This part of the function is never reached ???? + // What defines these parameters ???? + Int_t status = 0; + if (GetNumberOfClusters() < 20) return 0; + if ((fN > 110) && + (fChi2/(Float_t(fN)) < 3)) return 3; // Gold + if ((fNLast > 30) && + (fChi2Last/(Float_t(fNLast)) < 3)) return 3; // Gold + if ((fNLast > 20) && + (fChi2Last/(Float_t(fNLast)) < 2)) return 3; // Gold + if ((fNLast/(fNExpectedLast+3.0) > 0.8) && + (fChi2Last/Float_t(fNLast) < 5) && + (fNLast > 20)) return 2; // Silber + if ((fNLast > 5) && + (((fNLast+1.0)/(fNExpectedLast+1.0)) > 0.8) && + (fChi2Last/(fNLast-5.0) < 6)) return 1; + + return status; -//_____________________________________________________________________________ -void AliTRDtrack::GetCovariance(Double_t cc[15]) const { - cc[0]=fCyy; - cc[1]=fCzy; cc[2]=fCzz; - cc[3]=fCcy; cc[4]=fCcz; cc[5]=fCcc; - cc[6]=fCey; cc[7]=fCez; cc[8]=fCec; cc[9]=fCee; - cc[10]=fCty; cc[11]=fCtz; cc[12]=fCtc; cc[13]=fCte; cc[14]=fCtt; -} +} //_____________________________________________________________________________ -Int_t AliTRDtrack::Compare(const TObject *o) const { - -// Compares tracks according to their Y2 or curvature +Int_t AliTRDtrack::Compare(const TObject *o) const +{ + // + // Compares tracks according to their Y2 or curvature + // - AliTRDtrack *t=(AliTRDtrack*)o; - // Double_t co=t->GetSigmaY2(); - // Double_t c =GetSigmaY2(); + AliTRDtrack *t = (AliTRDtrack *) o; - Double_t co=TMath::Abs(t->GetC()); - Double_t c =TMath::Abs(GetC()); + Double_t co = TMath::Abs(t->GetC()); + Double_t c = TMath::Abs(GetC()); - if (c>co) return 1; - else if (c co) { + return 1; + } + else if (c < co) { + return -1; + } return 0; + } //_____________________________________________________________________________ -void AliTRDtrack::CookdEdx(Double_t low, Double_t up) { - //----------------------------------------------------------------- - // Calculates dE/dX within the "low" and "up" cuts. - //----------------------------------------------------------------- +void AliTRDtrack::CookdEdx(Double_t low, Double_t up) +{ + // + // Calculates the truncated dE/dx within the "low" and "up" cuts. + // - Int_t i; - Int_t nc=GetNumberOfClusters(); + Int_t i = 0; - Float_t sorted[kMAX_CLUSTERS_PER_TRACK]; - for (i=0; i < nc; i++) { - sorted[i]=fdQdl[i]; + // Array to sort the dEdx values according to amplitude + Float_t sorted[kMAXCLUSTERSPERTRACK]; + + // Number of clusters used for dedx + Int_t nc = fNdedx; + + // Require at least 10 clusters for a dedx measurement + if (nc < 10) { + SetdEdx(0); + return; } - Int_t swap; + // Lower and upper bound + Int_t nl = Int_t(low * nc); + Int_t nu = Int_t( up * nc); - do { - swap=0; - for (i=0; i= 0.99999) { - Int_t n=GetNumberOfClusters(); - if (n>4) cerr< 1) return 0; - Double_t r1=sqrt(1.- c1*c1); - Double_t c2=fC*x2 - fE; - if((c2*c2) > 1) return 0; - Double_t r2=sqrt(1.- c2*c2); - - fY += dx*(c1+c2)/(r1+r2); - fZ += dx*(c1+c2)/(c1*r2 + c2*r1)*fT; - - //f = F - 1 - Double_t rr=r1+r2, cc=c1+c2, xx=x1+x2; - Double_t f02= dx*(rr*xx + cc*(c1*x1/r1+c2*x2/r2))/(rr*rr); - Double_t f03=-dx*(2*rr + cc*(c1/r1 + c2/r2))/(rr*rr); - Double_t cr=c1*r2+c2*r1; - Double_t f12= dx*fT*(cr*xx-cc*(r1*x2-c2*c1*x1/r1+r2*x1-c1*c2*x2/r2))/(cr*cr); - Double_t f13=-dx*fT*(2*cr + cc*(c2*c1/r1-r1 + c1*c2/r2-r2))/(cr*cr); - Double_t f14= dx*cc/cr; - - //b = C*ft - Double_t b00=f02*fCcy + f03*fCey, b01=f12*fCcy + f13*fCey + f14*fCty; - Double_t b10=f02*fCcz + f03*fCez, b11=f12*fCcz + f13*fCez + f14*fCtz; - Double_t b20=f02*fCcc + f03*fCec, b21=f12*fCcc + f13*fCec + f14*fCtc; - Double_t b30=f02*fCec + f03*fCee, b31=f12*fCec + f13*fCee + f14*fCte; - Double_t b40=f02*fCtc + f03*fCte, b41=f12*fCtc + f13*fCte + f14*fCtt; - - //a = f*b = f*C*ft - Double_t a00=f02*b20+f03*b30,a01=f02*b21+f03*b31,a11=f12*b21+f13*b31+f14*b41; - - //F*C*Ft = C + (a + b + bt) - fCyy += a00 + 2*b00; - fCzy += a01 + b01 + b10; - fCcy += b20; - fCey += b30; - fCty += b40; - fCzz += a11 + 2*b11; - fCcz += b21; - fCez += b31; - fCtz += b41; - - fX=x2; - - - //Multiple scattering ****************** - - Double_t d=sqrt((x1-fX)*(x1-fX)+(y1-fY)*(y1-fY)+(z1-fZ)*(z1-fZ)); - Double_t p2=GetPt()*GetPt()*(1.+fT*fT); - p2 = TMath::Min(p2,1e+08); // to avoid division by (1-1) for stiff tracks - Double_t beta2=p2/(p2 + pm*pm); - - Double_t ey=fC*fX - fE, ez=fT; - Double_t xz=fC*ez, zz1=ez*ez+1, xy=fE+ey; - - Double_t theta2=14.1*14.1/(beta2*p2*1e6)*d/x0*rho; - fCcc += xz*xz*theta2; - fCec += xz*ez*xy*theta2; - fCtc += xz*zz1*theta2; - fCee += (2*ey*ez*ez*fE+1-ey*ey+ez*ez+fE*fE*ez*ez)*theta2; - fCte += ez*zz1*xy*theta2; - fCtt += zz1*zz1*theta2; - - - //Energy losses************************ - if (x1 < x2) d=-d; - Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2)*d*rho; - //PH SetLength(GetLength()+d); - - cc = fC; - fC*=(1.- sqrt(p2+pm*pm)/p2*dE); - fE+=fX*(fC-cc); - - return 1; + Double_t oldX = GetX(); + Double_t oldY = GetY(); + Double_t oldZ = GetZ(); + + Double_t bz = GetBz(); + + if (!AliExternalTrackParam::PropagateTo(xk,bz)) { + return kFALSE; + } + + Double_t x = GetX(); + Double_t y = GetY(); + Double_t z = GetZ(); + Double_t d = TMath::Sqrt((x-oldX)*(x-oldX) + + (y-oldY)*(y-oldY) + + (z-oldZ)*(z-oldZ)); + if (oldX < xk) { + if (IsStartedTimeIntegral()) { + Double_t l2 = d; + Double_t crv = GetC(); + if (TMath::Abs(l2*crv) > 0.0001) { + // Make correction for curvature if neccesary + l2 = 0.5 * TMath::Sqrt((x-oldX)*(x-oldX) + (y-oldY)*(y-oldY)); + l2 = 2.0 * TMath::ASin(l2 * crv) / crv; + l2 = TMath::Sqrt(l2*l2 + (z-oldZ)*(z-oldZ)); + } + AddTimeStep(l2); + } + } + + Double_t ll = (oldX < xk) ? -d : d; + if (!AliExternalTrackParam::CorrectForMaterial(ll*rho/x0,x0,GetMass())) { + return kFALSE; + } + + { + + // Energy losses************************ + Double_t p2 = (1.0 + GetTgl()*GetTgl()) / (Get1Pt()*Get1Pt()); + Double_t beta2 = p2 / (p2 + GetMass()*GetMass()); + if (beta2<1.0e-10 || (5940.0 * beta2/(1.0 - beta2 + 1.0e-10) - beta2) < 0.0) { + return kFALSE; + } + + Double_t dE = 0.153e-3 / beta2 + * (log(5940.0 * beta2/(1.0 - beta2 + 1.0e-10)) - beta2) + * d * rho; + Float_t budget = d * rho; + fBudget[0] += budget; + + /* + // Suspicious part - think about it ? + Double_t kinE = TMath::Sqrt(p2); + if (dE > 0.8*kinE) dE = 0.8 * kinE; // + if (dE < 0) dE = 0.0; // Not valid region for Bethe bloch + */ + + fDE += dE; + + /* + // Suspicious ! I.B. + Double_t sigmade = 0.07 * TMath::Sqrt(TMath::Abs(dE)); // Energy loss fluctuation + Double_t sigmac2 = sigmade*sigmade*fC*fC*(p2+GetMass()*GetMass())/(p2*p2); + fCcc += sigmac2; + fCee += fX*fX * sigmac2; + */ + + } + + return kTRUE; } //_____________________________________________________________________________ -Int_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, UInt_t index) +Bool_t AliTRDtrack::Update(const AliTRDcluster *c, Double_t chisq, Int_t index + , Double_t h01) { + // // Assignes found cluster to the track and updates track information + // - Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); - r00+=fCyy; r01+=fCzy; r11+=fCzz; - Double_t det=r00*r11 - r01*r01; - Double_t tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det; - - Double_t k00=fCyy*r00+fCzy*r01, k01=fCyy*r01+fCzy*r11; - Double_t k10=fCzy*r00+fCzz*r01, k11=fCzy*r01+fCzz*r11; - Double_t k20=fCcy*r00+fCcz*r01, k21=fCcy*r01+fCcz*r11; - Double_t k30=fCey*r00+fCez*r01, k31=fCey*r01+fCez*r11; - Double_t k40=fCty*r00+fCtz*r01, k41=fCty*r01+fCtz*r11; - - Double_t dy=c->GetY() - fY, dz=c->GetZ() - fZ; - Double_t cur=fC + k20*dy + k21*dz, eta=fE + k30*dy + k31*dz; - if (TMath::Abs(cur*fX-eta) >= 0.99999) { - Int_t n=GetNumberOfClusters(); - if (n>4) cerr< 0.003) { + fNoTilt = kFALSE; } - fY += k00*dy + k01*dz; - fZ += k10*dy + k11*dz; - fC = cur; - fE = eta; - fT += k40*dy + k41*dz; + // Add angular effect to the error contribution - MI + Float_t tangent2 = GetSnp()*GetSnp(); + if (tangent2 < 0.90000) { + tangent2 = tangent2 / (1.0 - tangent2); + } + //Float_t errang = tangent2 * 0.04; - Double_t c01=fCzy, c02=fCcy, c03=fCey, c04=fCty; - Double_t c12=fCcz, c13=fCez, c14=fCtz; + Double_t p[2] = {c->GetY(), c->GetZ() }; + //Double_t cov[3] = {c->GetSigmaY2()+errang, 0.0, c->GetSigmaZ2()*100.0 }; + Double_t sy2 = c->GetSigmaY2() * 4.0; + Double_t sz2 = c->GetSigmaZ2() * 4.0; + Double_t cov[3] = {sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2 }; - fCyy-=k00*fCyy+k01*fCzy; fCzy-=k00*c01+k01*fCzz; - fCcy-=k00*c02+k01*c12; fCey-=k00*c03+k01*c13; - fCty-=k00*c04+k01*c14; + if (!AliExternalTrackParam::Update(p,cov)) { + return kFALSE; + } - fCzz-=k10*c01+k11*fCzz; - fCcz-=k10*c02+k11*c12; fCez-=k10*c03+k11*c13; - fCtz-=k10*c04+k11*c14; + Int_t n = GetNumberOfClusters(); + fIndex[n] = index; + SetNumberOfClusters(n+1); - fCcc-=k20*c02+k21*c12; fCec-=k20*c03+k21*c13; - fCtc-=k20*c04+k21*c14; + SetChi2(GetChi2()+chisq); - fCee-=k30*c03+k31*c13; - fCte-=k30*c04+k31*c14; + return kTRUE; - fCtt-=k40*c04+k41*c14; +} - Int_t n=GetNumberOfClusters(); - fIndex[n]=index; - SetNumberOfClusters(n+1); +//_____________________________________________________________________________ +Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq, Int_t index + , Double_t h01, Int_t /*plane*/) +{ + // + // Assignes found cluster to the track and updates track information + // + + Bool_t fNoTilt = kTRUE; + if (TMath::Abs(h01) > 0.003) { + fNoTilt = kFALSE; + } + + // Add angular effect to the error contribution and make correction - MI + Double_t tangent2 = GetSnp()*GetSnp(); + if (tangent2 < 0.90000){ + tangent2 = tangent2 / (1.0-tangent2); + } + Double_t tangent = TMath::Sqrt(tangent2); + if (GetSnp() < 0) { + tangent *= -1; + } - SetChi2(GetChi2()+chisq); - // cerr<<"in update: fIndex["<GetNPads()==4) extend=2; + */ + //if (c->GetNPads()==5) extend=3; + //if (c->GetNPads()==6) extend=3; + //if (c->GetQ()<15) return 1; + + /* + if (corrector!=0){ + //if (0){ + correction = corrector->GetCorrection(plane,c->GetLocalTimeBin(),tangent); + if (TMath::Abs(correction)>0){ + //if we have info + errang = corrector->GetSigma(plane,c->GetLocalTimeBin(),tangent); + errang *= errang; + errang += tangent2*0.04; + } + } + */ + // + //Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12.); + /* + { + Double_t dy=c->GetY() - GetY(), dz=c->GetZ() - GetZ(); + printf("%e %e %e %e\n",dy,dz,padlength/2,h01); + } + */ + + Double_t p[2] = { c->GetY(), c->GetZ() }; + //Double_t cov[3]={ (c->GetSigmaY2()+errang+errsys)*extend, 0.0, c->GetSigmaZ2()*10000.0 }; + Double_t sy2 = c->GetSigmaY2() * 4.0; + Double_t sz2 = c->GetSigmaZ2() * 4.0; + Double_t cov[3] = { sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2 }; + + if (!AliExternalTrackParam::Update(p,cov)) { + return kFALSE; + } + + Int_t n = GetNumberOfClusters(); + fIndex[n] = index; + SetNumberOfClusters(n+1); + SetChi2(GetChi2() + chisq); + + return kTRUE; - return 1; } +// //_____________________________________________________________________________ +// Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet) +// { +// // +// // Assignes found tracklet to the track and updates track information +// // +// // Can this be removed ???? +// // +// +// Double_t r00=(tracklet.GetTrackletSigma2()), r01=0., r11= 10000.; +// r00+=fCyy; r01+=fCzy; r11+=fCzz; +// // +// Double_t det=r00*r11 - r01*r01; +// Double_t tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det; +// // + +// Double_t dy=tracklet.GetY() - fY, dz=tracklet.GetZ() - fZ; + + +// Double_t s00 = tracklet.GetTrackletSigma2(); // error pad +// Double_t s11 = 100000; // error pad-row +// Float_t h01 = tracklet.GetTilt(); +// // +// // r00 = fCyy + 2*fCzy*h01 + fCzz*h01*h01+s00; +// r00 = fCyy + fCzz*h01*h01+s00; +// // r01 = fCzy + fCzz*h01; +// r01 = fCzy ; +// r11 = fCzz + s11; +// det = r00*r11 - r01*r01; +// // inverse matrix +// tmp=r00; r00=r11/det; r11=tmp/det; r01=-r01/det; + +// Double_t k00=fCyy*r00+fCzy*r01, k01=fCyy*r01+fCzy*r11; +// Double_t k10=fCzy*r00+fCzz*r01, k11=fCzy*r01+fCzz*r11; +// Double_t k20=fCey*r00+fCez*r01, k21=fCey*r01+fCez*r11; +// Double_t k30=fCty*r00+fCtz*r01, k31=fCty*r01+fCtz*r11; +// Double_t k40=fCcy*r00+fCcz*r01, k41=fCcy*r01+fCcz*r11; + +// // K matrix +// // k00=fCyy*r00+fCzy*(r01+h01*r00),k01=fCyy*r01+fCzy*(r11+h01*r01); +// // k10=fCzy*r00+fCzz*(r01+h01*r00),k11=fCzy*r01+fCzz*(r11+h01*r01); +// // k20=fCey*r00+fCez*(r01+h01*r00),k21=fCey*r01+fCez*(r11+h01*r01); +// // k30=fCty*r00+fCtz*(r01+h01*r00),k31=fCty*r01+fCtz*(r11+h01*r01); +// // k40=fCcy*r00+fCcz*(r01+h01*r00),k41=fCcy*r01+fCcz*(r11+h01*r01); +// // +// //Update measurement +// Double_t cur=fC + k40*dy + k41*dz, eta=fE + k20*dy + k21*dz; +// // cur=fC + k40*dy + k41*dz; eta=fE + k20*dy + k21*dz; +// if (TMath::Abs(cur*fX-eta) >= 0.90000) { +// //Int_t n=GetNumberOfClusters(); +// // if (n>4) cerr<GetY(), c->GetZ() }; + Double_t sy2 = c->GetSigmaY2() * 4.0; + Double_t sz2 = c->GetSigmaZ2() * 4.0; + Double_t cov[3] = { sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2 }; + + return AliExternalTrackParam::GetPredictedChi2(p,cov); + + // + // Can the following be removed ???? + // + /* + Bool_t fNoTilt = kTRUE; + if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE; + + return (c->GetY() - GetY())*(c->GetY() - GetY())/c->GetSigmaY2(); + */ + + /* + Double_t chi2, dy, r00, r01, r11; + + if(fNoTilt) { + dy=c->GetY() - fY; + r00=c->GetSigmaY2(); + chi2 = (dy*dy)/r00; } + else { + Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12); + // + r00=c->GetSigmaY2(); r01=0.; r11=c->GetSigmaZ2(); + r00+=fCyy; r01+=fCzy; r11+=fCzz; + + Double_t det=r00*r11 - r01*r01; + if (TMath::Abs(det) < 1.e-10) { + Int_t n=GetNumberOfClusters(); + if (n>4) cerr<GetY() - fY, dz=c->GetZ() - fZ; + Double_t tiltdz = dz; + if (TMath::Abs(tiltdz)>padlength/2.) { + tiltdz = TMath::Sign(padlength/2,dz); + } + // dy=dy+h01*dz; + dy=dy+h01*tiltdz; - fX = x1*ca + y1*sa; - fY=-x1*sa + y1*ca; - fE=fE*ca + (fC*y1 + sqrt(1.- r1*r1))*sa; + chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; + } - Double_t r2=fC*fX - fE; - if (TMath::Abs(r2) >= 0.99999) { - Int_t n=GetNumberOfClusters(); - if (n>4) cerr<= 0.) { - Int_t n=GetNumberOfClusters(); - if (n>4) cerr<GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); - r00+=fCyy; r01+=fCzy; r11+=fCzz; + // + // Propagate track to given x position + // Works inside of the 20 degree segmentation (local cooordinate frame for TRD , TPC, TOF) + // + // Material budget from geo manager + // + + Double_t xyz0[3]; + Double_t xyz1[3]; + Double_t y; + Double_t z; + + const Double_t kAlphac = TMath::Pi()/9.0; + const Double_t kTalphac = TMath::Tan(kAlphac*0.5); + + // Critical alpha - cross sector indication + Double_t dir = (GetX()>xr) ? -1.0 : 1.0; + + // Direction +- + for (Double_t x = GetX()+dir*step; dir*x < dir*xr; x += dir*step) { + + GetXYZ(xyz0); + GetProlongation(x,y,z); + xyz1[0] = x * TMath::Cos(GetAlpha()) + y * TMath::Sin(GetAlpha()); + xyz1[1] = x * TMath::Sin(GetAlpha()) - y * TMath::Cos(GetAlpha()); + xyz1[2] = z; + Double_t param[7]; + AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); + + if ((param[0] > 0) && + (param[1] > 0)) { + PropagateTo(x,param[1],param[0]); + } + + if (GetY() > GetX()*kTalphac) { + Rotate(-kAlphac); + } + if (GetY() < -GetX()*kTalphac) { + Rotate( kAlphac); + } - Double_t det=r00*r11 - r01*r01; - if (TMath::Abs(det) < 1.e-10) { - if (fN>4) cerr<GetY() - fY, dz=c->GetZ() - fZ; + PropagateTo(xr); - return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; - */ + return 0; - Double_t dy=c->GetY() - fY; - Double_t r00=c->GetSigmaY2(); +} - return (dy*dy)/r00; +//_____________________________________________________________________________ +Int_t AliTRDtrack::PropagateToR(Double_t r,Double_t step) +{ + // + // Propagate track to the radial position + // Rotation always connected to the last track position + // -} + Double_t xyz0[3]; + Double_t xyz1[3]; + Double_t y; + Double_t z; + + Double_t radius = TMath::Sqrt(GetX()*GetX() + GetY()*GetY()); + // Direction +- + Double_t dir = (radius>r) ? -1.0 : 1.0; + + for (Double_t x = radius+dir*step; dir*x < dir*r; x += dir*step) { + + GetXYZ(xyz0); + Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]); + Rotate(alpha,kTRUE); + GetXYZ(xyz0); + GetProlongation(x,y,z); + xyz1[0] = x * TMath::Cos(alpha) + y * TMath::Sin(alpha); + xyz1[1] = x * TMath::Sin(alpha) - y * TMath::Cos(alpha); + xyz1[2] = z; + Double_t param[7]; + AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); + if (param[1] <= 0) { + param[1] = 100000000; + } + PropagateTo(x,param[1],param[0]); + + } + + GetXYZ(xyz0); + Double_t alpha = TMath::ATan2(xyz0[1],xyz0[0]); + Rotate(alpha,kTRUE); + GetXYZ(xyz0); + GetProlongation(r,y,z); + xyz1[0] = r * TMath::Cos(alpha) + y * TMath::Sin(alpha); + xyz1[1] = r * TMath::Sin(alpha) - y * TMath::Cos(alpha); + xyz1[2] = z; + Double_t param[7]; + AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); + + if (param[1] <= 0) { + param[1] = 100000000; + } + PropagateTo(r,param[1],param[0]); + return 0; + +} -//_________________________________________________________________________ -void AliTRDtrack::GetPxPyPz(Double_t& px, Double_t& py, Double_t& pz) const +//_____________________________________________________________________________ +Int_t AliTRDtrack::GetSector() const { - // Returns reconstructed track momentum in the global system. + // + // Return the current sector + // - Double_t pt=TMath::Abs(GetPt()); // GeV/c - Double_t r=fC*fX-fE; + return Int_t(TVector2::Phi_0_2pi(GetAlpha()) / AliTRDgeometry::GetAlpha()) + % AliTRDgeometry::kNsect; - Double_t y0; - if(r > 1) { py = pt; px = 0; } - else if(r < -1) { py = -pt; px = 0; } - else { - y0=fY + sqrt(1.- r*r)/fC; - px=-pt*(fY-y0)*fC; //cos(phi); - py=-pt*(fE-fX*fC); //sin(phi); - } - pz=pt*fT; - Double_t tmp=px*TMath::Cos(fAlpha) - py*TMath::Sin(fAlpha); - py=px*TMath::Sin(fAlpha) + py*TMath::Cos(fAlpha); - px=tmp; +} -} +//_____________________________________________________________________________ +void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i) +{ + // + // The sampled energy loss + // -//_________________________________________________________________________ -void AliTRDtrack::GetGlobalXYZ(Double_t& x, Double_t& y, Double_t& z) const + Double_t s = GetSnp(); + Double_t t = GetTgl(); + q *= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t)); + fdQdl[i] = q; + +} + +//_____________________________________________________________________________ +void AliTRDtrack::SetSampledEdx(Float_t q) { - // Returns reconstructed track coordinates in the global system. + // + // The sampled energy loss + // - x = fX; y = fY; z = fZ; - Double_t tmp=x*TMath::Cos(fAlpha) - y*TMath::Sin(fAlpha); - y=x*TMath::Sin(fAlpha) + y*TMath::Cos(fAlpha); - x=tmp; + Double_t s = GetSnp(); + Double_t t = GetTgl(); + q *= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t)); + fdQdl[fNdedx] = q; + fNdedx++; -} +} -//_________________________________________________________________________ -void AliTRDtrack::ResetCovariance() { +//_____________________________________________________________________________ +Double_t AliTRDtrack::GetBz() const +{ // - // Resets covariance matrix + // Returns Bz component of the magnetic field (kG) // - fCyy*=10.; - fCzy=0.; fCzz*=10.; - fCcy=0.; fCcz=0.; fCcc*=10.; - fCey=0.; fCez=0.; fCec=0.; fCee*=10.; - fCty=0.; fCtz=0.; fCtc=0.; fCte=0.; fCtt*=10.; + if (AliTracker::UniformField()) { + return AliTracker::GetBz(); + } + Double_t r[3]; + GetXYZ(r); + + return AliTracker::GetBz(r); -} +}