From 6c94f3308e8e21efdd662a43a6a60db688334d59 Mon Sep 17 00:00:00 2001 From: hristov Date: Tue, 5 Sep 2006 08:45:28 +0000 Subject: [PATCH] Common track parametrization in the barrel detectors (Yu.Belikov) --- HLT/ITS/AliL3ITStrack.cxx | 20 - HLT/ITS/AliL3ITStrack.h | 2 - HLT/ITS/AliL3ITStracker.cxx | 4 +- HLT/hough/AliL3HoughKalmanTrack.cxx | 47 +- ITS/AliITSComparisonV2.C | 2 - ITS/AliITSPid.cxx | 2 +- ITS/AliITSVertexerTracks.cxx | 4 +- ITS/AliITStrackMI.cxx | 137 +- ITS/AliITStrackMI.h | 6 +- ITS/AliITStrackSA.cxx | 56 +- ITS/AliITStrackV2.cxx | 709 +---- ITS/AliITStrackV2.h | 114 +- ITS/AliITStrackerANN.cxx | 8 +- ITS/AliITStrackerMI.cxx | 131 +- ITS/AliITStrackerSA.cxx | 4 +- ITS/AliITStrackerV2.cxx | 101 +- ITS/AliITStrackerV2.h | 11 +- STEER/AliESDV0MI.h | 2 +- STEER/AliESDtrack.cxx | 64 +- STEER/AliESDtrack.h | 14 +- STEER/AliExternalTrackParam.cxx | 115 +- STEER/AliExternalTrackParam.h | 50 +- STEER/AliHelix.cxx | 10 +- STEER/AliKalmanTrack.cxx | 97 +- STEER/AliKalmanTrack.h | 59 +- STEER/AliKink.cxx | 116 + STEER/AliKink.h | 24 + STEER/AliTracker.h | 12 +- STEER/AliV0.cxx | 173 ++ STEER/AliV0.h | 24 + STEER/AliVertexerTracks.cxx | 2 +- STEER/ESDLinkDef.h | 3 - STEER/STEERLinkDef.h | 5 + STEER/libESD.pkg | 6 +- STEER/libSTEER.pkg | 3 +- TOF/AliTOFtrack.cxx | 472 +--- TOF/AliTOFtrack.h | 71 +- TOF/AliTOFtracker.cxx | 37 +- TOF/AliTOFtrackerMI.cxx | 4 +- TPC/AliTPCseed.cxx | 133 +- TPC/AliTPCseed.h | 14 +- TPC/AliTPCtrack.cxx | 528 +--- TPC/AliTPCtrack.h | 138 +- TPC/AliTPCtracker.cxx | 56 +- TPC/AliTPCtracker.h | 29 +- TPC/AliTPCtrackerMI.cxx | 180 +- TPC/AliTPCtrackerMI.h | 4 +- TPC/AliTPCtrackerParam.cxx | 48 +- TRD/AliTRDtrack.cxx | 1863 ++++--------- TRD/AliTRDtrack.h | 250 +- TRD/AliTRDtracker.cxx | 3775 ++++++++++++--------------- 51 files changed, 3620 insertions(+), 6119 deletions(-) create mode 100644 STEER/AliKink.cxx create mode 100644 STEER/AliKink.h create mode 100644 STEER/AliV0.cxx create mode 100644 STEER/AliV0.h diff --git a/HLT/ITS/AliL3ITStrack.cxx b/HLT/ITS/AliL3ITStrack.cxx index d75392f5a6e..5fe23392f1b 100644 --- a/HLT/ITS/AliL3ITStrack.cxx +++ b/HLT/ITS/AliL3ITStrack.cxx @@ -66,23 +66,3 @@ Int_t AliL3ITStrack::Compare(const TObject *o) const { else if (c 0.999999) return kFALSE; - - Double_t pt=1./TMath::Abs(p[0]); - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - Double_t r=TMath::Sqrt(1 - p[1]*p[1]); - p[0]=pt*(r*cs - p[1]*sn); p[1]=pt*(p[1]*cs + r*sn); p[2]=pt*p[2]; - - return kTRUE; -} diff --git a/HLT/ITS/AliL3ITStrack.h b/HLT/ITS/AliL3ITStrack.h index 1e1dcd3158a..6e7621c02d0 100644 --- a/HLT/ITS/AliL3ITStrack.h +++ b/HLT/ITS/AliL3ITStrack.h @@ -26,8 +26,6 @@ public: Int_t Compare(const TObject *o) const; - Bool_t GetPxPyPzAt(Double_t x,Double_t *p) const; - ClassDef(AliL3ITStrack,2) //HLT ITS reconstructed track }; diff --git a/HLT/ITS/AliL3ITStracker.cxx b/HLT/ITS/AliL3ITStracker.cxx index 3d752f1fa58..8a9ba3738c9 100644 --- a/HLT/ITS/AliL3ITStracker.cxx +++ b/HLT/ITS/AliL3ITStracker.cxx @@ -82,7 +82,7 @@ Int_t AliL3ITStracker::Clusters2Tracks(AliESD *event) { delete t; continue; } - if (TMath::Abs(t->GetD())>5) { + if (TMath::Abs(t->GetD(GetX(),GetY()))>5) { delete t; continue; } @@ -124,7 +124,7 @@ Int_t AliL3ITStracker::Clusters2Tracks(AliESD *event) { } if (!fBestTrack.PropagateTo(3.,0.0028,65.19)) continue; - if (!fBestTrack.PropagateToVertex()) continue; + if (!fBestTrack.PropagateToVertex(event->GetVertex())) continue; fBestTrack.SetLabel(tpcLabel); fBestTrack.CookdEdx(); CookLabel(&fBestTrack,0.); //For comparison only diff --git a/HLT/hough/AliL3HoughKalmanTrack.cxx b/HLT/hough/AliL3HoughKalmanTrack.cxx index eaffbb9af57..3825c5f4f09 100644 --- a/HLT/hough/AliL3HoughKalmanTrack.cxx +++ b/HLT/hough/AliL3HoughKalmanTrack.cxx @@ -45,27 +45,20 @@ AliL3HoughKalmanTrack::AliL3HoughKalmanTrack(const AliL3HoughTrack& t) throw (co SetMass(0.13957); fdEdx=0; - fAlpha = fmod((t.GetSector()+0.5)*(2*TMath::Pi()/18),2*TMath::Pi()); - if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi(); - else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi(); + Double_t alpha = fmod((t.GetSector()+0.5)*(2*TMath::Pi()/18),2*TMath::Pi()); + if (alpha < -TMath::Pi()) alpha += 2*TMath::Pi(); + else if (alpha >= TMath::Pi()) alpha -= 2*TMath::Pi(); const Double_t xhit = 82.97; const Double_t zvertex = t.GetFirstPointZ(); - Double_t xx[5]; + Double_t par[5]; Double_t deltax = t.GetPterr(); Double_t deltay = t.GetPsierr(); Double_t deltaeta = t.GetTglerr(); - if(CalcExternalParams(t,0,0,0,zvertex,xhit,xx)==0) throw "AliL3HoughKalmanTrack: conversion failed !\n"; + if(CalcExternalParams(t,0,0,0,zvertex,xhit,par)==0) throw "AliL3HoughKalmanTrack: conversion failed !\n"; - //Filling of the track paramaters - fX=xhit; - fP0=xx[0]; - fP1=xx[1]; - fP2=xx[2]; - fP3=xx[3]; - fP4=xx[4]; - - SaveLocalConvConst(); + Double_t cnv=1./(GetBz()*kB2C); + par[4]*=cnv;; //and covariance matrix //For the moment estimate the covariance matrix numerically @@ -78,14 +71,19 @@ AliL3HoughKalmanTrack::AliL3HoughKalmanTrack(const AliL3HoughTrack& t) throw (co Double_t dx1[5],dx2[5],dx3[5]; for(Int_t i=0;i<5;i++) { - dx1[i]=xx1[i]-xx[i]; - dx2[i]=xx2[i]-xx[i]; - dx3[i]=xx3[i]-xx[i]; + dx1[i]=xx1[i]-par[i]; + dx2[i]=xx2[i]-par[i]; + dx3[i]=xx3[i]-par[i]; } - fC00=dx1[0]*dx1[0]+dx2[0]*dx2[0]; - fC22=dx1[2]*dx1[2]+dx2[2]*dx2[2]; - fC44=dx1[4]*dx1[4]+dx2[4]*dx2[4]; + Double_t cov[15]={ + dx1[0]*dx1[0]+dx2[0]*dx2[0], + 0., dx3[1]*dx3[1], + 0., 0., dx1[2]*dx1[2]+dx2[2]*dx2[2], + 0., dx3[3]*dx3[1], 0., dx3[3]*dx3[3], + 0., 0., 0., 0., dx1[4]*dx1[4]+dx2[4]*dx2[4] + }; + /* fC20=dx1[2]*dx1[0]+dx2[2]*dx2[0]; fC40=dx1[4]*dx1[0]+dx2[4]*dx2[0]; fC42=dx1[4]*dx1[2]+dx2[4]*dx2[2]; @@ -94,6 +92,10 @@ AliL3HoughKalmanTrack::AliL3HoughKalmanTrack(const AliL3HoughTrack& t) throw (co fC31=dx3[3]*dx3[1]; fC10=fC30=fC21=fC41=fC32=fC43=0; fC20=fC42=fC40=0; + */ + cov[10]*=cnv; cov[11]*=cnv; cov[12]*=cnv; cov[13]*=cnv; cov[14]*=(cnv*cnv); + + Set(xhit,alpha,par,cov); } @@ -132,12 +134,9 @@ Int_t CalcExternalParams(const AliL3HoughTrack& t, Double_t deltax, Double_t del Double_t tanl = 1./tan(theta); zhit = zvertex + stot*tanl; - //Local sine of track azimuthal angle - Double_t sinbeta = centerx/radius; - xx[0] = yhit; xx[1] = zhit; - xx[2] = sinbeta; + xx[2] = (xhit-centerx)/radius; xx[3] = tanl; xx[4] = kappa; return 1; diff --git a/ITS/AliITSComparisonV2.C b/ITS/AliITSComparisonV2.C index e142816392b..7b3e01baf66 100644 --- a/ITS/AliITSComparisonV2.C +++ b/ITS/AliITSComparisonV2.C @@ -208,8 +208,6 @@ Int_t AliITSComparisonV2 numb[nmult]=cnt; nmult++; } - if (esd->GetITSFakeRatio()Fill(ptg); else { fake[nfake++]=lab; diff --git a/ITS/AliITSPid.cxx b/ITS/AliITSPid.cxx index 6300d29fe17..e6a504514de 100644 --- a/ITS/AliITSPid.cxx +++ b/ITS/AliITSPid.cxx @@ -213,7 +213,7 @@ Int_t AliITSPid::GetPcode(AliITStrackV2 *track) if(track==0)return 0; // track->Propagate(track->GetAlpha(),3.,0.1/65.19*1.848,0.1*1.848); track->PropagateTo(3.,0.0028,65.19); - track->PropagateToVertex(); + //track->PropagateToVertex(); Not needed. (I.B.) Double_t xk,par[5]; track->GetExternalParameters(xk,par); Float_t lam=TMath::ATan(par[3]); Float_t pt1=TMath::Abs(par[4]); diff --git a/ITS/AliITSVertexerTracks.cxx b/ITS/AliITSVertexerTracks.cxx index ad1949abbe1..9e44cf54c99 100644 --- a/ITS/AliITSVertexerTracks.cxx +++ b/ITS/AliITSVertexerTracks.cxx @@ -271,7 +271,7 @@ Int_t AliITSVertexerTracks::PrepareTracks(TTree &trkTree) { // propagate track to vtxSeed alpha = track->GetAlpha(); xlStart = fNominalPos[0]*TMath::Cos(alpha)+fNominalPos[1]*TMath::Sin(alpha); - track->PropagateTo(xlStart,field); // to vtxSeed + track->AliExternalTrackParam::PropagateTo(xlStart,field); // to vtxSeed // select tracks with d0rphi < maxd0rphi @@ -494,7 +494,7 @@ void AliITSVertexerTracks::VertexFitter() { t = (AliESDtrack*)fTrkArray.At(k); alpha = t->GetAlpha(); xlStart = initPos[0]*TMath::Cos(alpha)+initPos[1]*TMath::Sin(alpha); - t->PropagateTo(xlStart,AliTracker::GetBz()); // to vtxSeed + t->AliExternalTrackParam::PropagateTo(xlStart,AliTracker::GetBz()); // to vtxSeed rotAngle = alpha; if(alpha<0.) rotAngle += 2.*TMath::Pi(); cosRot = TMath::Cos(rotAngle); diff --git a/ITS/AliITStrackMI.cxx b/ITS/AliITStrackMI.cxx index c3ab69542e0..634b6a7b17e 100644 --- a/ITS/AliITStrackMI.cxx +++ b/ITS/AliITStrackMI.cxx @@ -133,21 +133,9 @@ Double_t AliITStrackMI::GetPredictedChi2MI(Double_t cy, Double_t cz, Double_t ce //----------------------------------------------------------------- // This function calculates a predicted chi2 increment. //----------------------------------------------------------------- - Double_t r00=cerry*cerry, r01=0., r11=cerrz*cerrz; - r00+=fC00; r01+=fC10; r11+=fC11; - // - Double_t det=r00*r11 - r01*r01; - if (TMath::Abs(det) < 1.e-30) { - Int_t n=GetNumberOfClusters(); - if (n>kWARN) - Warning("GetPredictedChi2","Singular matrix (%d) !\n",n); - return 1e10; - } - Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01; - - Double_t dy=cy - fP0, dz=cz - fP1; - - return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; + Double_t p[2]={cy, cz}; + Double_t cov[3]={cerry*cerry, 0., cerrz*cerrz}; + return AliExternalTrackParam::GetPredictedChi2(p,cov); } //____________________________________________________________________________ @@ -155,22 +143,22 @@ Int_t AliITStrackMI::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()); + //d=x0=0.; + + Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt()); Double_t et = p2 + GetMass()*GetMass(); Double_t beta2=p2/et; et = sqrt(et); - d*=TMath::Sqrt((1.+ fP3*fP3)/(1.- fP2*fP2)); - //d*=TMath::Sqrt(1.+ fP3*fP3 +fP2*fP2/(1.- fP2*fP2)); + d*=TMath::Sqrt((1.+ GetTgl()*GetTgl())/(1.- GetSnp()*GetSnp())); //Multiple scattering****************** if (d!=0) { Double_t theta2=14.1*14.1/(beta2*p2*1e6)*TMath::Abs(d); //Double_t theta2=1.0259e-6*14*14/28/(beta2*p2)*TMath::Abs(d)*9.36*2.33; - fC22 += theta2*(1.- fP2*fP2)*(1. + fP3*fP3); - fC33 += theta2*(1. + fP3*fP3)*(1. + fP3*fP3); - fC43 += theta2*fP3*fP4*(1. + fP3*fP3); - fC44 += theta2*fP3*fP4*fP3*fP4; + Cov(5) += theta2*(1.- GetSnp()*GetSnp())*(1. + GetTgl()*GetTgl()); + Cov(9) += theta2*(1. + GetTgl()*GetTgl())*(1. + GetTgl()*GetTgl()); + Cov(13)+= theta2*GetTgl()*Get1Pt()*(1. + GetTgl()*GetTgl()); + Cov(14)+= theta2*GetTgl()*Get1Pt()*GetTgl()*Get1Pt(); } //Energy losses************************ @@ -179,19 +167,18 @@ Int_t AliITStrackMI::CorrectForMaterial(Double_t d, Double_t x0) { // Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2)*d; //Double_t dE=0; Double_t dE = 0.265*0.153e-3*(39.2-55.6*beta2+28.7*beta2*beta2+27.41/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; - } - else{ - dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2)*d; - dE+=0.06e-3/(beta2*beta2)*d; - } - */ - fP4*=(1.- et/p2*dE); - Double_t delta44 = (dE*fP4*et/p2); + //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; + //} + //else{ + // dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2)) - beta2)*d; + // dE+=0.06e-3/(beta2*beta2)*d; + //} + + Par(4)*=(1.- et/p2*dE); + Double_t delta44 = (dE*Get1Pt()*et/p2); delta44*=delta44; - fC44+= delta44/400.; + Cov(14)+= delta44/400.; } if (!Invariant()) return 0; @@ -200,72 +187,24 @@ Int_t AliITStrackMI::CorrectForMaterial(Double_t d, Double_t x0) { } //____________________________________________________________________________ -Int_t AliITStrackMI::UpdateMI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz, Double_t chi2,UInt_t index) { +Bool_t AliITStrackMI::UpdateMI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz, Double_t chi2, Int_t index) { //------------------------------------------------------------------ //This function updates track parameters //------------------------------------------------------------------ - Double_t p0=fP0,p1=fP1,p2=fP2,p3=fP3,p4=fP4; - Double_t c00=fC00; - Double_t c10=fC10, c11=fC11; - Double_t c20=fC20, c21=fC21, c22=fC22; - Double_t c30=fC30, c31=fC31, c32=fC32, c33=fC33; - Double_t c40=fC40, c41=fC41, c42=fC42, c43=fC43, c44=fC44; - - - Double_t r00=cerry*cerry, r01=0., r11=cerrz*cerrz; - r00+=fC00; r01+=fC10; r11+=fC11; - 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; - Double_t k30=fC30*r00+fC31*r01, k31=fC30*r01+fC31*r11; - Double_t k40=fC40*r00+fC41*r01, k41=fC40*r01+fC41*r11; - - Double_t dy=cy - fP0, dz=cz - fP1; + Double_t dy=cy - GetY(), dz=cz - GetZ(); Int_t layer = (index & 0xf0000000) >> 28; fDy[layer] = dy; fDz[layer] = dz; - fSigmaY[layer] = TMath::Sqrt(cerry*cerry+fC00); - fSigmaZ[layer] = TMath::Sqrt(cerrz*cerrz+fC11); - - Double_t sf=fP2 + k20*dy + k21*dz; - - fP0 += k00*dy + k01*dz; - fP1 += k10*dy + k11*dz; - fP2 = sf; - fP3 += k30*dy + k31*dz; - fP4 += k40*dy + k41*dz; - - Double_t c01=fC10, c02=fC20, c03=fC30, c04=fC40; - Double_t c12=fC21, c13=fC31, c14=fC41; - - fC00-=k00*fC00+k01*fC10; fC10-=k00*c01+k01*fC11; - fC20-=k00*c02+k01*c12; fC30-=k00*c03+k01*c13; - fC40-=k00*c04+k01*c14; - - fC11-=k10*c01+k11*fC11; - fC21-=k10*c02+k11*c12; fC31-=k10*c03+k11*c13; - fC41-=k10*c04+k11*c14; + fSigmaY[layer] = TMath::Sqrt(cerry*cerry+GetSigmaY2()); + fSigmaZ[layer] = TMath::Sqrt(cerrz*cerrz+GetSigmaZ2()); - fC22-=k20*c02+k21*c12; fC32-=k20*c03+k21*c13; - fC42-=k20*c04+k21*c14; - - fC33-=k30*c03+k31*c13; - fC43-=k30*c04+k31*c14; - - fC44-=k40*c04+k41*c14; + Double_t p[2]={cy, cz}; + Double_t cov[3]={cerry*cerry, 0., cerrz*cerrz}; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; if (!Invariant()) { - fP0=p0; fP1=p1; fP2=p2; fP3=p3; fP4=p4; - fC00=c00; - fC10=c10; fC11=c11; - fC20=c20; fC21=c21; fC22=c22; - fC30=c30; fC31=c31; fC32=c32; fC33=c33; - fC40=c40; fC41=c41; fC42=c42; fC43=c43; fC44=c44; - return 0; + AliWarning("Wrong invariant !"); + return kFALSE; } if (chi2<0) return 1; @@ -274,7 +213,7 @@ Int_t AliITStrackMI::UpdateMI(Double_t cy, Double_t cz, Double_t cerry, Double_t SetNumberOfClusters(n+1); SetChi2(GetChi2()+chi2); - return 1; + return kTRUE; } Int_t AliITStrackMI::GetProlongationFast(Double_t alp, Double_t xk,Double_t &y, Double_t &z) @@ -282,19 +221,19 @@ Int_t AliITStrackMI::GetProlongationFast(Double_t alp, Double_t xk,Double_t &y, //----------------------------------------------------------------------------- //get fast prolongation //----------------------------------------------------------------------------- - Double_t ca=TMath::Cos(alp-fAlpha), sa=TMath::Sin(alp-fAlpha); - Double_t cf=TMath::Sqrt(1.- fP2*fP2); + Double_t ca=TMath::Cos(alp-GetAlpha()), sa=TMath::Sin(alp-GetAlpha()); + Double_t cf=TMath::Sqrt(1.- GetSnp()*GetSnp()); // **** rotation ********************** - y= -fX*sa + fP0*ca; + y= -GetX()*sa + GetY()*ca; // **** translation ****************** - Double_t dx = xk- fX*ca - fP0*sa; - Double_t f1=fP2*ca - cf*sa, f2=f1 + fP4*dx; + Double_t dx = xk- GetX()*ca - GetY()*sa; + Double_t f1=GetSnp()*ca - cf*sa, f2=f1 + GetC()*dx; if (TMath::Abs(f2) >= 0.9999) { return 0; } Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2); y += dx*(f1+f2)/(r1+r2); - z = fP1+dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; + z = GetZ()+dx*(f1+f2)/(f1*r2 + f2*r1)*GetTgl(); return 1; } diff --git a/ITS/AliITStrackMI.h b/ITS/AliITStrackMI.h index 14e0227de5f..72f161398f5 100644 --- a/ITS/AliITStrackMI.h +++ b/ITS/AliITStrackMI.h @@ -41,7 +41,7 @@ public: AliITStrackMI(AliESDtrack& t,Bool_t c=kFALSE) throw (const Char_t *); AliITStrackMI(const AliITStrackMI& t); Int_t GetProlongationFast(Double_t alpha, Double_t xr,Double_t &y, Double_t &z); - Int_t UpdateMI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz, Double_t chi2,UInt_t i); + Bool_t UpdateMI(Double_t cy, Double_t cz, Double_t cerry, Double_t cerrz, Double_t chi2, Int_t i); Int_t CorrectForMaterial(Double_t d, Double_t x0=21.82); void UpdateESDtrack(ULong_t flags); @@ -56,8 +56,8 @@ public: Float_t GetNUsed() const {return fNUsed;} Int_t Compare(const TObject *o) const; - Double_t GetCov33() const {return fC33;} // cov. matrix el. 3,3 - Double_t GetCov44() const {return fC44;} // cov. matrix el. 4,4 + Double_t GetCov33() const {return GetCovariance()[9];} // cov. matrix el. 3,3 + //Double_t GetCov44() const {return GetCovariance()[15];}// cov. matrix el. 4,4 Float_t GetDy(Int_t i) const {return fDy[i];} Float_t GetDz(Int_t i) const {return fDz[i];} Float_t GetSigmaY(Int_t i) const {return fSigmaY[i];} diff --git a/ITS/AliITStrackSA.cxx b/ITS/AliITStrackSA.cxx index 27444e7c27c..81d344566c4 100755 --- a/ITS/AliITStrackSA.cxx +++ b/ITS/AliITStrackSA.cxx @@ -88,9 +88,9 @@ AliITStrackSA::AliITStrackSA(AliITSgeom* geom,Int_t layer, Int_t ladder, Int_t d // cluster of this track (data member fAlpha) Float_t rotmatr[9]; geom->GetRotMatrix(layer,ladder,detector,rotmatr); - fAlpha=TMath::ATan2(rotmatr[1],rotmatr[0])+TMath::Pi(); - fAlpha+=TMath::Pi()/2.; - if(layer==1) fAlpha+=TMath::Pi(); + Double_t sAlpha=TMath::ATan2(rotmatr[1],rotmatr[0])+TMath::Pi(); + sAlpha+=TMath::Pi()/2.; + if(layer==1) sAlpha+=TMath::Pi(); // get the radius of this detector. Procedure taken from the @@ -102,33 +102,36 @@ AliITStrackSA::AliITStrackSA(AliITSgeom* geom,Int_t layer, Int_t ladder, Int_t d fi+=TMath::Pi()/2; if (layer==1) fi+=TMath::Pi(); Double_t cp=TMath::Cos(fi), sp=TMath::Sin(fi); - fX=x*cp+y*sp; + Double_t sX=x*cp+y*sp; fdEdx = 0; - fC00 = 0.000009; // 0.000009 - fC10 = 0.; - fC11 = 0.000003; //0.000030 - fC20 = 0.; - fC21 = 0.; - fC22 = 0.000001; //0.000001 - fC30 = 0.; - fC31 = 0.; - fC32 = 0.; - fC33 = 0.000002; //0.000002 - fC40 = 0.; - fC41 = 0.; - fC42 = 0.; - fC43 = 0.; - fC44 = 0.000001; //0.0000001 - - fP0 = Ycoor; - fP1 = Zcoor; - - fP2 = TMath::Sin(phi-fAlpha); - fP3 = tanlambda; - fP4 = curv; + Double_t conv=GetBz()*kB2C; + Double_t sC[] = {0.000009, // 0.000009 + 0., + 0.000003, //0.000030 + 0., + 0., + 0.000001, //0.000001 + 0., + 0., + 0., + 0.000002, //0.000002 + 0., + 0., + 0., + 0., + 0.000001/(conv*conv)}; //0.0000001 + + Double_t sP[] = {Ycoor, + Zcoor, + TMath::Sin(phi-sAlpha), + tanlambda, + curv/conv}; + + Set(sX,sAlpha,sP,sC); + for(Int_t i=0; i #include "AliCluster.h" +#include "AliTracker.h" #include "AliESDtrack.h" #include "AliITStrackV2.h" @@ -30,30 +31,8 @@ ClassImp(AliITStrackV2) const Int_t kWARN=5; //____________________________________________________________________________ -AliITStrackV2::AliITStrackV2():AliKalmanTrack(), - fX(0), - fAlpha(0), +AliITStrackV2::AliITStrackV2() : AliKalmanTrack(), fdEdx(0), - fP0(0), - fP1(0), - fP2(0), - fP3(0), - fP4(0), - fC00(0), - fC10(0), - fC11(0), - fC20(0), - fC21(0), - fC22(0), - fC30(0), - fC31(0), - fC32(0), - fC33(0), - fC40(0), - fC41(0), - fC42(0), - fC43(0), - fC44(0), fESDtrack(0) { for(Int_t i=0; i<2*kMaxLayer; i++) fIndex[i]=-1; @@ -63,51 +42,33 @@ AliITStrackV2::AliITStrackV2():AliKalmanTrack(), //____________________________________________________________________________ AliITStrackV2::AliITStrackV2(AliESDtrack& t,Bool_t c) throw (const Char_t *) : -AliKalmanTrack() { + AliKalmanTrack(), + fdEdx(t.GetITSsignal()), + fESDtrack(&t) +{ //------------------------------------------------------------------ // Conversion ESD track -> ITS track. // If c==kTRUE, create the ITS track out of the constrained params. //------------------------------------------------------------------ - SetNumberOfClusters(t.GetITSclusters(fIndex)); + const AliExternalTrackParam *par=&t; + if (c) { + par=t.GetConstrainedExternalParameters(); + if (!par) throw "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()); - // - // - - fdEdx=t.GetITSsignal(); - 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]; - if (c) t.GetConstrainedExternalParameters(fAlpha,x,p); - else t.GetExternalParameters(x,p); - fX=x; - fP0=p[0]; - fP1=p[1]; SaveLocalConvConst(); - fP2=p[2]; - fP3=p[3]; x=GetLocalConvConst(); - fP4=p[4]/x; - - //Conversion of the covariance matrix - 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; + SetNumberOfClusters(t.GetITSclusters(fIndex)); if (t.GetStatus()&AliESDtrack::kTIME) { StartTimeIntegral(); Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times); SetIntegratedLength(t.GetIntegratedLength()); } - fESDtrack=&t; - // if (!Invariant()) throw "AliITStrackV2: conversion failed !\n"; for(Int_t i=0; i<4; i++) fdEdxSample[i]=0; } @@ -116,27 +77,17 @@ void AliITStrackV2::UpdateESDtrack(ULong_t flags) const { } //____________________________________________________________________________ -AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : AliKalmanTrack(t) { +AliITStrackV2::AliITStrackV2(const AliITStrackV2& t) : + AliKalmanTrack(t), + fdEdx(t.fdEdx), + fESDtrack(t.fESDtrack) +{ //------------------------------------------------------------------ //Copy constructor //------------------------------------------------------------------ - fX=t.fX; - fAlpha=t.fAlpha; - fdEdx=t.fdEdx; - - fP0=t.fP0; fP1=t.fP1; fP2=t.fP2; fP3=t.fP3; fP4=t.fP4; - - fC00=t.fC00; - fC10=t.fC10; fC11=t.fC11; - fC20=t.fC20; fC21=t.fC21; fC22=t.fC22; - fC30=t.fC30; fC31=t.fC31; fC32=t.fC32; fC33=t.fC33; - fC40=t.fC40; fC41=t.fC41; fC42=t.fC42; fC43=t.fC43; fC44=t.fC44; - Int_t i; - for (i=0; i<2*kMaxLayer; i++) fIndex[i]=t.fIndex[i]; for (i=0; i<4; i++) fdEdxSample[i]=t.fdEdxSample[i]; - - fESDtrack=t.fESDtrack; + for (i=0; i<2*kMaxLayer; i++) fIndex[i]=t.fIndex[i]; } //_____________________________________________________________________________ @@ -154,556 +105,191 @@ Int_t AliITStrackV2::Compare(const TObject *o) const { return 0; } -//_____________________________________________________________________________ -void AliITStrackV2::GetExternalCovariance(Double_t cc[15]) const { - //------------------------------------------------------------------------- - // This function returns an external representation of the covriance matrix. - // (See comments in AliTPCtrack.h about external track representation) - //------------------------------------------------------------------------- - Double_t a=GetLocalConvConst(); - - cc[0 ]=fC00; - cc[1 ]=fC10; cc[2 ]=fC11; - cc[3 ]=fC20; cc[4 ]=fC21; cc[5 ]=fC22; - cc[6 ]=fC30; cc[7 ]=fC31; cc[8 ]=fC32; cc[9 ]=fC33; - cc[10]=fC40*a; cc[11]=fC41*a; cc[12]=fC42*a; cc[13]=fC43*a; cc[14]=fC44*a*a; -} - //____________________________________________________________________________ -Int_t AliITStrackV2::PropagateToVertex(Double_t d,Double_t x0) { +Bool_t +AliITStrackV2::PropagateToVertex(const AliESDVertex *v,Double_t d,Double_t x0) +{ //------------------------------------------------------------------ //This function propagates a track to the minimal distance from the origin - //------------------------------------------------------------------ - //Double_t xv=fP2*(fX*fP2 - fP0*TMath::Sqrt(1.- fP2*fP2)); //linear approxim. - Double_t tgf=-(fP4*fX - fP2)/(fP4*fP0 + TMath::Sqrt(1 - fP2*fP2)); - Double_t snf=tgf/TMath::Sqrt(1.+ tgf*tgf); - Double_t xv=(snf - fP2)/fP4 + fX; - return PropagateTo(xv,d,x0); + //------------------------------------------------------------------ + Double_t bz=GetBz(); + if (PropagateToDCA(v,bz,kVeryBig)) + if (AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass())) return kTRUE; + return kFALSE; } //____________________________________________________________________________ -Int_t AliITStrackV2:: +Bool_t AliITStrackV2:: GetGlobalXYZat(Double_t xk, Double_t &x, Double_t &y, Double_t &z) const { //------------------------------------------------------------------ //This function returns a track position in the global system //------------------------------------------------------------------ - 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("GetGlobalXYZat","Propagation failed (%d) !\n",n); - return 0; - } - - Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2); - - Double_t yk = fP0 + dx*(f1+f2)/(r1+r2); - Double_t zk = fP1 + dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; - - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - x = xk*cs - yk*sn; - y = xk*sn + yk*cs; - z = zk; - - return 1; + Double_t r[3]; + Bool_t rc=GetXYZAt(xk, AliTracker::GetBz(), r); + x=r[0]; y=r[1]; z=r[2]; + return rc; } //_____________________________________________________________________________ -Double_t AliITStrackV2::GetPredictedChi2(const AliCluster *c) const -{ +Double_t AliITStrackV2::GetPredictedChi2(const AliCluster *c) const { //----------------------------------------------------------------- // This function calculates a predicted chi2 increment. //----------------------------------------------------------------- - Double_t r00=c->GetSigmaY2(), 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(); - if (n>kWARN) - Warning("GetPredictedChi2","Singular matrix (%d) !\n",n); - return 1e10; - } - Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01; - - Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1; - - return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; -} - -//____________________________________________________________________________ -Int_t AliITStrackV2::CorrectForMaterial(Double_t d, Double_t x0) { - //------------------------------------------------------------------ - //This function corrects the track parameters for crossed material - //------------------------------------------------------------------ - Double_t p2=(1.+ fP3*fP3)/(Get1Pt()*Get1Pt()); - Double_t beta2=p2/(p2 + GetMass()*GetMass()); - d*=TMath::Sqrt((1.+ fP3*fP3)/(1.- fP2*fP2)); - - //Multiple scattering****************** - if (d!=0) { - Double_t theta2=14.1*14.1/(beta2*p2*1e6)*TMath::Abs(d); - //Double_t theta2=1.0259e-6*14*14/28/(beta2*p2)*TMath::Abs(d)*9.36*2.33; - fC22 += theta2*(1.- fP2*fP2)*(1. + fP3*fP3); - fC33 += theta2*(1. + fP3*fP3)*(1. + fP3*fP3); - fC43 += theta2*fP3*fP4*(1. + fP3*fP3); - fC44 += theta2*fP3*fP4*fP3*fP4; - } - - //Energy losses************************ - if (x0!=0.) { - d*=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.- TMath::Sqrt(p2+GetMass()*GetMass())/p2*dE); - } - - if (!Invariant()) return 0; - - return 1; + Double_t p[2]={c->GetY(), c->GetZ()}; + Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()}; + return AliExternalTrackParam::GetPredictedChi2(p,cov); } //____________________________________________________________________________ -Int_t AliITStrackV2::PropagateTo(Double_t xk, Double_t d, Double_t x0) { +Bool_t AliITStrackV2::PropagateTo(Double_t xk, Double_t d, Double_t x0) { //------------------------------------------------------------------ //This function propagates a track //------------------------------------------------------------------ - Double_t x1=fX, x2=xk, dx=x2-x1; - Double_t f1=fP2, f2=f1 + fP4*dx; - 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; - } - Double_t lcc=GetLocalConvConst(); - - // old position [SR, GSI, 17.02.2003] - Double_t oldX = fX, oldY = fP0, oldZ = fP1; - - Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2); + Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ(); - fP0 += dx*(f1+f2)/(r1+r2); - fP1 += dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; - fP2 += dx*fP4; + Double_t bz=GetBz(); + if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE; + if (!AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass())) return kFALSE; - //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; - - fX=x2; - - //Change of the magnetic field ************* - SaveLocalConvConst(); - fP4*=lcc/GetLocalConvConst(); - - if (!CorrectForMaterial(d,x0)) return 0; - - // Integrated Time [SR, GSI, 17.02.2003] - if (IsStartedTimeIntegral() && fX>oldX) { - Double_t l2 = (fX-oldX)*(fX-oldX)+(fP0-oldY)*(fP0-oldY)+ - (fP1-oldZ)*(fP1-oldZ); + Double_t x=GetX(), y=GetZ(), z=GetZ(); + if (IsStartedTimeIntegral() && x>oldX) { + Double_t l2 = (x-oldX)*(x-oldX) + (y-oldY)*(y-oldY) + (z-oldZ)*(z-oldZ); AddTimeStep(TMath::Sqrt(l2)); } - // - return 1; + return kTRUE; } //____________________________________________________________________________ -Int_t AliITStrackV2::Update(const AliCluster* c, Double_t chi2, UInt_t index) { +Bool_t AliITStrackV2::Update(const AliCluster* c, Double_t chi2, Int_t index) +{ //------------------------------------------------------------------ //This function updates track parameters //------------------------------------------------------------------ - Double_t p0=fP0,p1=fP1,p2=fP2,p3=fP3,p4=fP4; - Double_t c00=fC00; - Double_t c10=fC10, c11=fC11; - Double_t c20=fC20, c21=fC21, c22=fC22; - Double_t c30=fC30, c31=fC31, c32=fC32, c33=fC33; - Double_t c40=fC40, c41=fC41, c42=fC42, c43=fC43, c44=fC44; - - - Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); - r00+=fC00; r01+=fC10; r11+=fC11; - 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; - Double_t k30=fC30*r00+fC31*r01, k31=fC30*r01+fC31*r11; - Double_t k40=fC40*r00+fC41*r01, k41=fC40*r01+fC41*r11; - - Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1; - Double_t sf=fP2 + k20*dy + k21*dz; - - fP0 += k00*dy + k01*dz; - fP1 += k10*dy + k11*dz; - fP2 = sf; - fP3 += k30*dy + k31*dz; - fP4 += k40*dy + k41*dz; - - Double_t c01=fC10, c02=fC20, c03=fC30, c04=fC40; - Double_t c12=fC21, c13=fC31, c14=fC41; - - fC00-=k00*fC00+k01*fC10; fC10-=k00*c01+k01*fC11; - fC20-=k00*c02+k01*c12; fC30-=k00*c03+k01*c13; - fC40-=k00*c04+k01*c14; - - fC11-=k10*c01+k11*fC11; - fC21-=k10*c02+k11*c12; fC31-=k10*c03+k11*c13; - fC41-=k10*c04+k11*c14; - - fC22-=k20*c02+k21*c12; fC32-=k20*c03+k21*c13; - fC42-=k20*c04+k21*c14; + Double_t p[2]={c->GetY(), c->GetZ()}; + Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()}; - fC33-=k30*c03+k31*c13; - fC43-=k30*c04+k31*c14; - - fC44-=k40*c04+k41*c14; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; if (!Invariant()) { - fP0=p0; fP1=p1; fP2=p2; fP3=p3; fP4=p4; - fC00=c00; - fC10=c10; fC11=c11; - fC20=c20; fC21=c21; fC22=c22; - fC30=c30; fC31=c31; fC32=c32; fC33=c33; - fC40=c40; fC41=c41; fC42=c42; fC43=c43; fC44=c44; - return 0; + AliWarning("Wrong invariant !"); + return kFALSE; } - if (chi2<0) return 1; + if (chi2<0) return kTRUE; Int_t n=GetNumberOfClusters(); fIndex[n]=index; SetNumberOfClusters(n+1); SetChi2(GetChi2()+chi2); - return 1; + return kTRUE; } -Int_t AliITStrackV2::Invariant() const { +Bool_t AliITStrackV2::Invariant() const { //------------------------------------------------------------------ // This function is for debugging purpose only //------------------------------------------------------------------ Int_t n=GetNumberOfClusters(); - - if (TMath::Abs(fP2)>=0.9999){ - if (n>kWARN) Warning("Invariant","fP2=%f\n",fP2); - return 0; + + Double_t sP2=GetParameter()[2]; + if (TMath::Abs(sP2) >= kAlmost1){ + if (n>kWARN) Warning("Invariant","fP2=%f\n",sP2); + return kFALSE; } - if (fC00<=0 || fC00>9.) { - if (n>kWARN) Warning("Invariant","fC00=%f\n",fC00); - return 0; + Double_t sC00=GetCovariance()[0]; + if (sC00<=0 || sC00>9.) { + if (n>kWARN) Warning("Invariant","fC00=%f\n",sC00); + return kFALSE; } - if (fC11<=0 || fC11>9.) { - if (n>kWARN) Warning("Invariant","fC11=%f\n",fC11); - return 0; + Double_t sC11=GetCovariance()[2]; + if (sC11<=0 || sC11>9.) { + if (n>kWARN) Warning("Invariant","fC11=%f\n",sC11); + return kFALSE; } - if (fC22<=0 || fC22>1.) { - if (n>kWARN) Warning("Invariant","fC22=%f\n",fC22); - return 0; + Double_t sC22=GetCovariance()[5]; + if (sC22<=0 || sC22>1.) { + if (n>kWARN) Warning("Invariant","fC22=%f\n",sC22); + return kFALSE; } - if (fC33<=0 || fC33>1.) { - if (n>kWARN) Warning("Invariant","fC33=%f\n",fC33); - return 0; + Double_t sC33=GetCovariance()[9]; + if (sC33<=0 || sC33>1.) { + if (n>kWARN) Warning("Invariant","fC33=%f\n",sC33); + return kFALSE; } - if (fC44<=0 || fC44>6e-5) { - if (n>kWARN) Warning("Invariant","fC44=%f\n",fC44); - return 0; + Double_t sC44=GetCovariance()[14]; + if (sC44<=0 /*|| sC44>6e-5*/) { + if (n>kWARN) Warning("Invariant","fC44=%f\n",sC44); + return kFALSE; } - return 1; + + return kTRUE; } //____________________________________________________________________________ -Int_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { +Bool_t AliITStrackV2::Propagate(Double_t alp,Double_t xk) { //------------------------------------------------------------------ //This function propagates a track //------------------------------------------------------------------ - Double_t alpha=fAlpha, x=fX; - Double_t p0=fP0,p1=fP1,p2=fP2,p3=fP3,p4=fP4; - Double_t c00=fC00; - Double_t c10=fC10, c11=fC11; - Double_t c20=fC20, c21=fC21, c22=fC22; - Double_t c30=fC30, c31=fC31, c32=fC32, c33=fC33; - Double_t c40=fC40, c41=fC41, c42=fC42, c43=fC43, c44=fC44; - - if (alp < -TMath::Pi()) alp += 2*TMath::Pi(); - else if (alp >= TMath::Pi()) alp -= 2*TMath::Pi(); - Double_t ca=TMath::Cos(alp-fAlpha), sa=TMath::Sin(alp-fAlpha); - Double_t sf=fP2, cf=TMath::Sqrt(1.- fP2*fP2); - - // **** rotation ********************** - { - fAlpha = alp; - fX = x*ca + p0*sa; - fP0= -x*sa + p0*ca; - fP2= sf*ca - cf*sa; - - 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.98) { - // don't propagate highly inclined tracks MI - return 0; - } - // Int_t n=GetNumberOfClusters(); - // if (n>kWARN) - // Warning("Propagate","Propagation failed (%d) !\n",n); - // return 0; - //} - Double_t lcc=GetLocalConvConst(); - - Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2); - - fX=xk; - fP0 += dx*(f1+f2)/(r1+r2); - fP1 += dx*(f1+f2)/(f1*r2 + f2*r1)*fP3; - fP2 += dx*fP4; - - //Change of the magnetic field ************* - SaveLocalConvConst(); - fP4*=lcc/GetLocalConvConst(); - - //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; + Double_t bz=GetBz(); + if (!AliExternalTrackParam::Propagate(alp,xk,bz)) return kFALSE; if (!Invariant()) { - fAlpha=alpha; - fX=x; - fP0=p0; fP1=p1; fP2=p2; fP3=p3; fP4=p4; - fC00=c00; - fC10=c10; fC11=c11; - fC20=c20; fC21=c21; fC22=c22; - fC30=c30; fC31=c31; fC32=c32; fC33=c33; - fC40=c40; fC41=c41; fC42=c42; fC43=c43; fC44=c44; - return 0; - } - } - - return 1; -} - - -Double_t AliITStrackV2::GetD(Double_t x, Double_t y) const { - //------------------------------------------------------------------ - // This function calculates the transverse impact parameter - // with respect to a point with global coordinates (x,y) - //------------------------------------------------------------------ - Double_t xt=fX, yt=fP0; - - Double_t sn=TMath::Sin(fAlpha), cs=TMath::Cos(fAlpha); - Double_t a = x*cs + y*sn; - y = -x*sn + y*cs; x=a; - xt-=x; yt-=y; - - sn=fP4*xt - fP2; cs=fP4*yt + TMath::Sqrt(1.- fP2*fP2); - a=2*(xt*fP2 - yt*TMath::Sqrt(1.- fP2*fP2))-fP4*(xt*xt + yt*yt); - return -a/(1 + TMath::Sqrt(sn*sn + cs*cs)); -} - -void -AliITStrackV2::GetDZ(Double_t x, Double_t y, Double_t z, Float_t dz[2]) const { - //------------------------------------------------------------------ - // This function calculates the transverse and longitudinal impact parameters - // with respect to a point with global coordinates (x,y,z) - //------------------------------------------------------------------ - Double_t f1 = fP2, r1 = TMath::Sqrt(1. - f1*f1); - Double_t xt=fX, yt=fP0; - Double_t sn=TMath::Sin(fAlpha), cs=TMath::Cos(fAlpha); - Double_t a = x*cs + y*sn; - y = -x*sn + y*cs; x=a; - xt-=x; yt-=y; - - Double_t rp4=fP4; - if (TMath::Abs(rp4) < kAlmost0) { - dz[0] = -(xt*f1 - yt*r1); - dz[1] = fP1 + (dz[0]*f1 - xt)/r1*fP3 - z; - return; + AliWarning("Wrong invariant !"); + return kFALSE; } - sn=rp4*xt - f1; cs=rp4*yt + r1; - a=2*(xt*f1 - yt*r1)-rp4*(xt*xt + yt*yt); - Double_t rr=TMath::Sqrt(sn*sn + cs*cs); - dz[0] = -a/(1 + rr); - Double_t f2 = -sn/rr, r2 = TMath::Sqrt(1. - f2*f2); - dz[1] = fP1 + fP3/rp4*TMath::ASin(f2*r1 - f1*r2) - z; + return kTRUE; } -Double_t AliITStrackV2::GetZat(Double_t x) const { +Bool_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { //------------------------------------------------------------------ - // This function calculates the z at given x point - in current coordinate system + //This function improves angular track parameters //------------------------------------------------------------------ - 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; -} - - + 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 - -Int_t AliITStrackV2::Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]) { - //------------------------------------------------------------------ - //This function improves angular track parameters - //------------------------------------------------------------------ - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - //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=fP0-yv, dz=fP1-zv; - Double_t r2=fX*fX+dy*dy; + Double_t dy = Par(0) - yv, dz = Par(1) - zv; + Double_t r2=GetX()*GetX() + 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 cnv=GetBz()*kB2C; { - 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; - sigma2p += 0.25*fC44*fX*fX; - Double_t eps2p=sigma2p/(fC22+sigma2p); - fP0 += fC20/(fC22+sigma2p)*(parp-fP2); - fP2 = eps2p*fP2 + (1-eps2p)*parp; - fC22 *= eps2p; - fC20 *= eps2p; + 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); + sigma2p += ers[1]*ers[1]/r2; + sigma2p += 0.25*Cov(14)*cnv*cnv*GetX()*GetX(); + Double_t eps2p=sigma2p/(Cov(2) + 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*fP4*dz/TMath::ASin(0.5*fP4*TMath::Sqrt(r2)); - Double_t sigma2l=theta2; - sigma2l += fC11/r2+fC00*dy*dy*dz*dz/(r2*r2*r2); - sigma2l += ers[2]*ers[2]/r2; - Double_t eps2l=sigma2l/(fC33+sigma2l); - fP1 += fC31/(fC33+sigma2l)*(parl-fP3); - fP4 += fC43/(fC33+sigma2l)*(parl-fP3); - fP3 = eps2l*fP3 + (1-eps2l)*parl; - fC33 *= eps2l; fC43 *= eps2l; - fC31 *= eps2l; + 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 += 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/cnv/cnv); + Cov(7) *= eps2l; } - if (!Invariant()) return 0; - return 1; -} - -void AliITStrackV2::ResetCovariance() { - //------------------------------------------------------------------ - //This function makes a track forget its history :) - //------------------------------------------------------------------ - - fC00*=10.; - fC10=0.; fC11*=10.; - fC20=0.; fC21=0.; fC22*=10.; - fC30=0.; fC31=0.; fC32=0.; fC33*=10.; - fC40=0.; fC41=0.; fC42=0.; fC43=0.; fC44*=10.; + if (!Invariant()) return kFALSE; + return kTRUE; } void AliITStrackV2::CookdEdx(Double_t low, Double_t up) { @@ -742,39 +328,12 @@ void AliITStrackV2::CookdEdx(Double_t low, Double_t up) { SetdEdx(dedx); } -Double_t AliITStrackV2:: -PropagateToDCA(AliKalmanTrack *p, Double_t d, Double_t x0) { - //-------------------------------------------------------------- - // Propagates this track and the argument track to the position of the - // distance of closest approach. - // Returns the (weighed !) distance of closest approach. - //-------------------------------------------------------------- - Double_t xthis, xp, dca; - { - //Temporary solution - Double_t b=1./GetLocalConvConst()/kB2C; - AliExternalTrackParam dummy1(*this), dummy2(*p); - dca=dummy1.GetDCA(&dummy2,b,xthis,xp); - } - if (!PropagateTo(xthis,d,x0)) { - //AliWarning(" propagation failed !"); - return 1e+33; - } - - if (!p->PropagateTo(xp,d,x0)) { - //AliWarning(" propagation failed !"; - return 1e+33; - } - - return dca; -} - -Double_t AliITStrackV2::Get1Pt() const { - //-------------------------------------------------------------- - // Returns the inverse Pt (1/GeV/c) - // (or 1/"most probable pt", if the field is too weak) - //-------------------------------------------------------------- - if (TMath::Abs(GetLocalConvConst()) > kVeryBigConvConst) - return 1./kMostProbableMomentum/TMath::Sqrt(1.+ GetTgl()*GetTgl()); - return (TMath::Sign(1e-9,fP4) + fP4)*GetLocalConvConst(); +Double_t AliITStrackV2::GetBz() const { + // + // returns Bz component of the magnetic field (kG) + // + if (AliTracker::UniformField()) return AliTracker::GetBz(); + Double_t r[3]; GetXYZ(r); + return AliTracker::GetBz(r); } + diff --git a/ITS/AliITStrackV2.h b/ITS/AliITStrackV2.h index 9464ea62af9..77b95dabb59 100644 --- a/ITS/AliITStrackV2.h +++ b/ITS/AliITStrackV2.h @@ -10,23 +10,7 @@ // dEdx analysis by: Boris Batyunya, JINR, Boris.Batiounia@cern.ch //------------------------------------------------------------------------- - -/***************************************************************************** - * December 18, 2000 * - * Internal view of the ITS track parametrisation as well as the order of * - * track parameters are subject for possible changes ! * - * Use GetExternalParameters() and GetExternalCovariance() to access ITS * - * track information regardless of its internal representation. * - * This formation is now fixed in the following way: * - * external param0: local Y-coordinate of a track (cm) * - * external param1: local Z-coordinate of a track (cm) * - * external param2: local sine of the track momentum azimuthal angle * - * external param3: tangent of the track momentum dip angle * - * external param4: 1/pt (1/(GeV/c)) * - *****************************************************************************/ - #include - #include "AliITSrecoV2.h" class AliESDtrack; @@ -37,87 +21,61 @@ public: AliITStrackV2(); AliITStrackV2(AliESDtrack& t,Bool_t c=kFALSE) throw (const Char_t *); AliITStrackV2(const AliITStrackV2& t); - Int_t PropagateToVertex(Double_t d=0., Double_t x0=0.); - Int_t Propagate(Double_t alpha, Double_t xr); - virtual Int_t CorrectForMaterial(Double_t d, Double_t x0=21.82); - Int_t PropagateTo(Double_t xr, Double_t d, Double_t x0=21.82); - Double_t PropagateToDCA(AliKalmanTrack *p, Double_t d=0., Double_t x0=0.); - Int_t Update(const AliCluster* cl,Double_t chi2,UInt_t i); - Int_t Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]); + + Bool_t CorrectForMaterial(Double_t d, Double_t x0=21.82) { + return AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass()); + } + Bool_t PropagateTo(Double_t xr, Double_t d, Double_t x0=21.82); + Double_t GetPredictedChi2(const AliCluster *cluster) const; + Bool_t Update(const AliCluster *cl, Double_t chi2, Int_t i); + + Bool_t + PropagateToVertex(const AliESDVertex *v,Double_t d=0.,Double_t x0=0.); + Bool_t Propagate(Double_t alpha, Double_t xr); + Bool_t Improve(Double_t x0,Double_t xyz[3],Double_t ers[3]); + void SetdEdx(Double_t dedx) {fdEdx=dedx;} void SetSampledEdx(Float_t q, Int_t i); void CookdEdx(Double_t low=0., Double_t up=0.51); void SetDetectorIndex(Int_t i) {SetLabel(i);} - void ResetCovariance(); void ResetClusters() { SetChi2(0.); SetNumberOfClusters(0); } void UpdateESDtrack(ULong_t flags) const; AliESDtrack *GetESDtrack() const {return fESDtrack;} Int_t GetDetectorIndex() const {return GetLabel();} - Double_t GetX() const {return fX;} - Double_t GetAlpha()const {return fAlpha;} Double_t GetdEdx() const {return fdEdx;} Double_t GetPIDsignal() const {return GetdEdx();} - Double_t GetY() const {return fP0;} - Double_t GetZ() const {return fP1;} - Double_t GetSnp() const {return fP2;} - Double_t GetTgl() const {return fP3;} - Double_t GetC() const {return fP4;} - Double_t Get1Pt() const; - Double_t GetD(Double_t x=0, Double_t y=0) const; - void GetDZ(Double_t xv, Double_t yv, Double_t zv, Float_t dz[2]) const; - Double_t GetZat(Double_t x=0) const; - - Double_t GetSigmaY2() const {return fC00;} - Double_t GetSigmaZ2() const {return fC11;} + Double_t GetC() const {return AliExternalTrackParam::GetC(GetBz());} + Double_t GetD(Double_t x, Double_t y) const { + return AliExternalTrackParam::GetD(x,y,GetBz()); + } + void GetDZ(Double_t xv, Double_t yv, Double_t zv, Float_t dz[2]) const { + return AliExternalTrackParam::GetDZ(xv,yv,zv,GetBz(),dz); + } + + Bool_t GetGlobalXYZat(Double_t r,Double_t &x,Double_t &y,Double_t &z) const; + Int_t Compare(const TObject *o) const; - void GetExternalParameters(Double_t& xr, Double_t x[5]) const ; - void GetExternalCovariance(Double_t cov[15]) const ; Int_t GetClusterIndex(Int_t i) const {return fIndex[i];} - Int_t GetGlobalXYZat(Double_t r,Double_t &x,Double_t &y,Double_t &z) const; - Double_t GetPredictedChi2(const AliCluster *cluster) const; - Int_t Invariant() const; + Bool_t Invariant() const; void SetExtraCluster(Int_t i, Int_t idx) {fIndex[kMaxLayer+i]=idx;} Int_t GetExtraCluster(Int_t i) const {return fIndex[kMaxLayer+i];} - -protected: - void GetXYZ(Float_t r[3]) const; - Double_t fX; // X-coordinate of this track (reference plane) - Double_t fAlpha; // rotation angle - - Double_t fdEdx; // dE/dx - - Double_t fP0; // Y-coordinate of a track - Double_t fP1; // Z-coordinate of a track - Double_t fP2; // sine of the track momentum azimuthal angle - Double_t fP3; // tangent of the track momentum dip angle - Double_t fP4; // track curvature - - Double_t fC00; // covariance - Double_t fC10, fC11; // matrix - Double_t fC20, fC21, fC22; // of the - Double_t fC30, fC31, fC32, fC33; // track - Double_t fC40, fC41, fC42, fC43, fC44; // parameters +protected: + Double_t GetBz() const ; + Double_t fdEdx; // dE/dx + Float_t fdEdxSample[4]; // array of dE/dx samples b.b. Int_t fIndex[2*kMaxLayer]; // indices of associated clusters - Float_t fdEdxSample[4]; // array of dE/dx samples b.b. AliESDtrack *fESDtrack; //! pointer to the connected ESD track - ClassDef(AliITStrackV2,5) //ITS reconstructed track -}; -inline -void AliITStrackV2::GetExternalParameters(Double_t& xr, Double_t x[5]) const { - //--------------------------------------------------------------------- - // This function return external ITS track representation - //--------------------------------------------------------------------- - xr=fX; - x[0]=GetY(); x[1]=GetZ(); x[2]=GetSnp(); x[3]=GetTgl(); - x[4]=(TMath::Sign(1e-9,fP4) + fP4)*GetLocalConvConst(); -} +private: + AliITStrackV2 &operator=(const AliITStrackV2 &tr); + ClassDef(AliITStrackV2,6) //ITS reconstructed track +}; inline void AliITStrackV2::SetSampledEdx(Float_t q, Int_t i) { @@ -132,14 +90,6 @@ void AliITStrackV2::SetSampledEdx(Float_t q, Int_t i) { fdEdxSample[i]=q; } -inline void AliITStrackV2::GetXYZ(Float_t r[3]) const { - //--------------------------------------------------------------------- - // Returns the position of the track in the global coord. system - //--------------------------------------------------------------------- - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - r[0]=fX*cs - fP0*sn; r[1]=fX*sn + fP0*cs; r[2]=fP1; -} - #endif diff --git a/ITS/AliITStrackerANN.cxx b/ITS/AliITStrackerANN.cxx index 58e227315bd..f1a60ae8b90 100644 --- a/ITS/AliITStrackerANN.cxx +++ b/ITS/AliITStrackerANN.cxx @@ -1448,11 +1448,11 @@ Int_t AliITStrackerANN::SaveTracks(Int_t sector) if (cluster) trac->AddClusterV2(l, (node[l]->ClusterRef() & 0x0fffffff)>>0); } AliITStrackV2* ot = new AliITStrackV2(*trac); - ot->ResetCovariance(); + ot->ResetCovariance(10.); ot->ResetClusters(); if (RefitAt(49.,ot,trac)) { //fit from layer 1 to layer 6 AliITStrackV2 *otrack2 = new AliITStrackV2(*ot); - otrack2->ResetCovariance(); + otrack2->ResetCovariance(10.); otrack2->ResetClusters(); //fit from layer 6 to layer 1 if (RefitAt(3.7,otrack2,ot)) fFoundTracks->AddLast(otrack2); @@ -1613,11 +1613,11 @@ Int_t AliITStrackerANN::StoreTracks() if (cluster) trac->AddClusterV2(l, (annTrack[l]->ClusterRef() & 0x0fffffff)>>0); } AliITStrackV2* ot = new AliITStrackV2(*trac); - ot->ResetCovariance(); + ot->ResetCovariance(10.); ot->ResetClusters(); if (RefitAt(49.,ot,trac)) { //fit from layer 1 to layer 6 AliITStrackV2 *otrack2 = new AliITStrackV2(*ot); - otrack2->ResetCovariance(); + otrack2->ResetCovariance(10.); otrack2->ResetClusters(); //fit from layer 6 to layer 1 if (RefitAt(3.7,otrack2,ot)) fFoundTracks->AddLast(otrack2); diff --git a/ITS/AliITStrackerMI.cxx b/ITS/AliITStrackerMI.cxx index 563120c3dab..19e8fa7f480 100644 --- a/ITS/AliITStrackerMI.cxx +++ b/ITS/AliITStrackerMI.cxx @@ -30,7 +30,7 @@ #include #include "AliESD.h" -#include "AliESDV0MI.h" +#include "AliV0.h" #include "AliHelix.h" #include "AliITSRecPoint.h" #include "AliITSgeom.h" @@ -410,13 +410,13 @@ Int_t AliITStrackerMI::PropagateBack(AliESD *event) { // propagete to vertex [SR, GSI 17.02.2003] // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) { - if (fTrackToFollow.PropagateToVertex()) { + if (fTrackToFollow.PropagateToVertex(event->GetVertex())) { fTrackToFollow.StartTimeIntegral(); } fTrackToFollow.PropagateTo(3.,-0.0028,65.19); } - fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters(); + fTrackToFollow.ResetCovariance(10.); fTrackToFollow.ResetClusters(); if (RefitAt(49.,&fTrackToFollow,t)) { if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) { //Warning("PropagateBack", @@ -478,7 +478,7 @@ Int_t AliITStrackerMI::RefitInward(AliESD *event) { fTrackToFollow.ResetClusters(); if ((esd->GetStatus()&AliESDtrack::kTPCin)==0) - fTrackToFollow.ResetCovariance(); + fTrackToFollow.ResetCovariance(10.); //Refitting... if (RefitAt(3.7, &fTrackToFollow, t,kTRUE)) { @@ -794,7 +794,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin ntracks[ilayer]++; } - if (constrain&&itrack<1&&TMath::Abs(currenttrack1.fP3)>1.1){ //big theta -- for low mult. runs + if (constrain&&itrack<1&&TMath::Abs(currenttrack1.GetTgl())>1.1){ //big theta -- for low mult. runs AliITStrackMI* vtrack = new (&tracks[ilayer][ntracks[ilayer]]) AliITStrackMI(currenttrack1); vtrack->fClIndex[ilayer]=0; fI = ilayer; @@ -889,10 +889,10 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin for (Int_t i=0;i<3;i++){ Int_t index = otrack->fESDtrack->GetV0Index(i); if (index==0) break; - AliESDV0MI * vertex = fEsd->GetV0MI(index); + AliV0 * vertex = (AliV0*)fEsd->GetV0MI(index); if (vertex->GetStatus()<0) continue; // rejected V0 // - if (otrack->fP4>0) { + if (otrack->GetSign()>0) { vertex->SetIndex(0,esdindex); } else{ @@ -911,7 +911,7 @@ void AliITStrackerMI::FollowProlongationTree(AliITStrackMI * otrack, Int_t esdin if (nearestold<5&&nearest<5){ Bool_t accept = track.fNormChi2[nearest]<10; if (accept){ - if (track.fP4>0) { + if (track.GetSign()>0) { vertex->SetP(track); vertex->Update(fprimvertex); // vertex->SetIndex(0,track.fESDtrack->GetID()); @@ -1871,32 +1871,32 @@ Double_t AliITStrackerMI::GetMatchingChi2(AliITStrackMI * track1, AliITStrackMI AliITStrackMI track3(*track2); track3.Propagate(track1->GetAlpha(),track1->GetX()); TMatrixD vec(5,1); - vec(0,0)=track1->fP0-track3.fP0; - vec(1,0)=track1->fP1-track3.fP1; - vec(2,0)=track1->fP2-track3.fP2; - vec(3,0)=track1->fP3-track3.fP3; - vec(4,0)=track1->fP4-track3.fP4; + vec(0,0)=track1->GetY() - track3.GetY(); + vec(1,0)=track1->GetZ() - track3.GetZ(); + vec(2,0)=track1->GetSnp() - track3.GetSnp(); + vec(3,0)=track1->GetTgl() - track3.GetTgl(); + vec(4,0)=track1->Get1Pt() - track3.Get1Pt(); // TMatrixD cov(5,5); - cov(0,0) = track1->fC00+track3.fC00; - cov(1,1) = track1->fC11+track3.fC11; - cov(2,2) = track1->fC22+track3.fC22; - cov(3,3) = track1->fC33+track3.fC33; - cov(4,4) = track1->fC44+track3.fC44; + cov(0,0) = track1->GetSigmaY2()+track3.GetSigmaY2(); + cov(1,1) = track1->GetSigmaZ2()+track3.GetSigmaZ2(); + cov(2,2) = track1->GetSigmaSnp2()+track3.GetSigmaSnp2(); + cov(3,3) = track1->GetSigmaTgl2()+track3.GetSigmaTgl2(); + cov(4,4) = track1->GetSigma1Pt2()+track3.GetSigma1Pt2(); - cov(0,1)=cov(1,0) = track1->fC10+track3.fC10; - cov(0,2)=cov(2,0) = track1->fC20+track3.fC20; - cov(0,3)=cov(3,0) = track1->fC30+track3.fC30; - cov(0,4)=cov(4,0) = track1->fC40+track3.fC40; + cov(0,1)=cov(1,0) = track1->GetSigmaZY()+track3.GetSigmaZY(); + cov(0,2)=cov(2,0) = track1->GetSigmaSnpY()+track3.GetSigmaSnpY(); + cov(0,3)=cov(3,0) = track1->GetSigmaTglY()+track3.GetSigmaTglY(); + cov(0,4)=cov(4,0) = track1->GetSigma1PtY()+track3.GetSigma1PtY(); // - cov(1,2)=cov(2,1) = track1->fC21+track3.fC21; - cov(1,3)=cov(3,1) = track1->fC31+track3.fC31; - cov(1,4)=cov(4,1) = track1->fC41+track3.fC41; + cov(1,2)=cov(2,1) = track1->GetSigmaSnpZ()+track3.GetSigmaSnpZ(); + cov(1,3)=cov(3,1) = track1->GetSigmaTglZ()+track3.GetSigmaTglZ(); + cov(1,4)=cov(4,1) = track1->GetSigma1PtZ()+track3.GetSigma1PtZ(); // - cov(2,3)=cov(3,2) = track1->fC32+track3.fC32; - cov(2,4)=cov(4,2) = track1->fC42+track3.fC42; + cov(2,3)=cov(3,2) = track1->GetSigmaTglSnp()+track3.GetSigmaTglSnp(); + cov(2,4)=cov(4,2) = track1->GetSigma1PtSnp()+track3.GetSigma1PtSnp(); // - cov(3,4)=cov(4,3) = track1->fC43+track3.fC43; + cov(3,4)=cov(4,3) = track1->GetSigma1PtTgl()+track3.GetSigma1PtTgl(); cov.Invert(); TMatrixD vec2(cov,TMatrixD::kMult,vec); @@ -2681,15 +2681,15 @@ AliITStrackMI * AliITStrackerMI::GetBestHypothesys(Int_t esdindex, AliITStrackMI if (track->fConstrain){ if (!backtrack->PropagateTo(3.,0.0028,65.19)) continue; if (!backtrack->Improve(0,xyzv,ersv)) continue; - if (!backtrack->PropagateTo(2.,0.0028,0)) continue; - if (!backtrack->Improve(0,xyzv,ersv)) continue; - if (!backtrack->PropagateTo(1.,0.0028,0)) continue; - if (!backtrack->Improve(0,xyzv,ersv)) continue; - if (!backtrack->PropagateToVertex()) continue; - backtrack->ResetCovariance(); - if (!backtrack->Improve(0,xyzv,ersv)) continue; + //if (!backtrack->PropagateTo(2.,0.0028,0)) continue; // This + //if (!backtrack->Improve(0,xyzv,ersv)) continue; // is + //if (!backtrack->PropagateTo(1.,0.0028,0)) continue; // an over-kill + //if (!backtrack->Improve(0,xyzv,ersv)) continue; // (I.B.) + //if (!backtrack->PropagateToVertex()) continue; // + backtrack->ResetCovariance(10.); + //if (!backtrack->Improve(0,xyzv,ersv)) continue; }else{ - backtrack->ResetCovariance(); + backtrack->ResetCovariance(10.); } backtrack->ResetClusters(); @@ -3065,7 +3065,7 @@ Double_t AliITStrackerMI::GetPredictedChi2MI(AliITStrackMI* track, const AliITSR track->fSigmaY[layer] = erry; track->fSigmaZ[layer] = errz; //track->fNormQ[layer] = cluster->GetQ()/TMath::Sqrt(1+theta*theta+phi*phi); - track->fNormQ[layer] = cluster->GetQ()/TMath::Sqrt((1.+ track->fP3*track->fP3)/(1.- track->fP2*track->fP2)); + track->fNormQ[layer] = cluster->GetQ()/TMath::Sqrt((1.+ track->GetTgl()*track->GetTgl())/(1.- track->GetSnp()*track->GetSnp())); return chi2; } @@ -3274,8 +3274,8 @@ void AliITStrackerMI::GetDCASigma(AliITStrackMI* track, Float_t & sigmarfi, Fl //to be paramterized using external parameters in future // // - sigmarfi = 0.004+1.4 *TMath::Abs(track->fP4)+332.*track->fP4*track->fP4; - sigmaz = 0.011+4.37*TMath::Abs(track->fP4); + sigmarfi = 0.004+1.4 *TMath::Abs(track->GetC())+332.*track->GetC()*track->GetC(); + sigmaz = 0.011+4.37*TMath::Abs(track->GetC()); } @@ -3458,7 +3458,7 @@ void AliITStrackerMI::UpdateTPCV0(AliESD *event){ if (clayer < 5 ){ // calculate chi2 after vertex Float_t chi2p = 0, chi2m=0; // - if (trackp&&TMath::Abs(trackp->fP3)<1.){ + if (trackp&&TMath::Abs(trackp->GetTgl())<1.){ for (Int_t ilayer=clayer;ilayer<6;ilayer++){ if (trackp->fClIndex[ilayer]>0){ chi2p+=trackp->fDy[ilayer]*trackp->fDy[ilayer]/(trackp->fSigmaY[ilayer]*trackp->fSigmaY[ilayer])+ @@ -3472,7 +3472,7 @@ void AliITStrackerMI::UpdateTPCV0(AliESD *event){ chi2p = 0; } // - if (trackm&&TMath::Abs(trackm->fP3)<1.){ + if (trackm&&TMath::Abs(trackm->GetTgl())<1.){ for (Int_t ilayer=clayer;ilayer<6;ilayer++){ if (trackm->fClIndex[ilayer]>0){ chi2m+=trackm->fDy[ilayer]*trackm->fDy[ilayer]/(trackm->fSigmaY[ilayer]*trackm->fSigmaY[ilayer])+ @@ -3542,7 +3542,7 @@ void AliITStrackerMI::FindV02(AliESD *event) Float_t *minr = new Float_t[ntracks+2]; Float_t *minPointAngle= new Float_t[ntracks+2]; // - AliESDV0MI *pvertex = new AliESDV0MI; + AliV0 *pvertex = new AliV0; AliITStrackMI * dummy= new AliITStrackMI; dummy->SetLabel(0); AliITStrackMI trackat0; //temporary track for DCA calculation @@ -3626,19 +3626,20 @@ void AliITStrackerMI::FindV02(AliESD *event) best = original; bestLong = original; } - trackat0 = *bestLong; + //I.B. trackat0 = *bestLong; + new (&trackat0) AliITStrackV2(*bestLong); Double_t xx,yy,zz,alpha; bestLong->GetGlobalXYZat(bestLong->GetX(),xx,yy,zz); alpha = TMath::ATan2(yy,xx); trackat0.Propagate(alpha,0); // calculate normalized distances to the vertex // - Float_t ptfac = (1.+100.*TMath::Abs(trackat0.fP4)); + Float_t ptfac = (1.+100.*TMath::Abs(trackat0.GetC())); if ( bestLong->fN>3 ){ - dist[itsindex] = trackat0.fP0; - norm[itsindex] = ptfac*TMath::Sqrt(trackat0.fC00); - normdist0[itsindex] = TMath::Abs(trackat0.fP0/norm[itsindex]); - normdist1[itsindex] = TMath::Abs((trackat0.fP1-primvertex[2])/(ptfac*TMath::Sqrt(trackat0.fC11))); + dist[itsindex] = trackat0.GetY(); + norm[itsindex] = ptfac*TMath::Sqrt(trackat0.GetSigmaY2()); + normdist0[itsindex] = TMath::Abs(trackat0.GetY()/norm[itsindex]); + normdist1[itsindex] = TMath::Abs((trackat0.GetZ()-primvertex[2])/(ptfac*TMath::Sqrt(trackat0.GetSigmaZ2()))); normdist[itsindex] = TMath::Sqrt(normdist0[itsindex]*normdist0[itsindex]+normdist1[itsindex]*normdist1[itsindex]); if (!bestConst){ if (bestLong->fN+bestLong->fNDeadZone<6) normdist[itsindex]*=2.; @@ -3657,12 +3658,12 @@ void AliITStrackerMI::FindV02(AliESD *event) normdist1[itsindex] = TMath::Abs(bestConst->fD[0]/norm[itsindex]); normdist[itsindex] = TMath::Sqrt(normdist0[itsindex]*normdist0[itsindex]+normdist1[itsindex]*normdist1[itsindex]); }else{ - dist[itsindex] = trackat0.fP0; - norm[itsindex] = ptfac*TMath::Sqrt(trackat0.fC00); - normdist0[itsindex] = TMath::Abs(trackat0.fP0/norm[itsindex]); - normdist1[itsindex] = TMath::Abs((trackat0.fP1-primvertex[2])/(ptfac*TMath::Sqrt(trackat0.fC11))); + dist[itsindex] = trackat0.GetY(); + norm[itsindex] = ptfac*TMath::Sqrt(trackat0.GetSigmaY2()); + normdist0[itsindex] = TMath::Abs(trackat0.GetY()/norm[itsindex]); + normdist1[itsindex] = TMath::Abs((trackat0.GetZ()-primvertex[2])/(ptfac*TMath::Sqrt(trackat0.GetSigmaZ2()))); normdist[itsindex] = TMath::Sqrt(normdist0[itsindex]*normdist0[itsindex]+normdist1[itsindex]*normdist1[itsindex]); - if (TMath::Abs(trackat0.fP3)>1.05){ + if (TMath::Abs(trackat0.GetTgl())>1.05){ if (normdist[itsindex]<3) forbidden[itsindex]=kTRUE; if (normdist[itsindex]>3) { minr[itsindex] = TMath::Max(Float_t(40.),minr[itsindex]); @@ -3756,7 +3757,7 @@ void AliITStrackerMI::FindV02(AliESD *event) if (forbidden[itrack0]) continue; AliITStrackMI * btrack0 = (AliITStrackMI*)trackarray.At(itrack0); if (!btrack0) continue; - if (btrack0->fP4>0) continue; + if (btrack0->GetC()>0) continue; AliITStrackMI *trackc0 = (AliITStrackMI*)trackarrayc.At(itrack0); // for (Int_t iesd1=0;iesd1fP4<0) continue; + if (btrack1->GetC()<0) continue; Bool_t isGold = kFALSE; if (TMath::Abs(TMath::Abs(btrack0->GetLabel())-TMath::Abs(btrack1->GetLabel()))==1){ isGold = kTRUE; @@ -3845,10 +3846,10 @@ void AliITStrackerMI::FindV02(AliESD *event) // // TObjArray * array0b = (TObjArray*)fBestHypothesys.At(itrack0); - if (!array0b&&pvertex->GetRr()<40 && TMath::Abs(track0->fP3)<1.1) + if (!array0b&&pvertex->GetRr()<40 && TMath::Abs(track0->GetTgl())<1.1) FollowProlongationTree((AliITStrackMI*)fOriginal.At(itrack0),itrack0, kFALSE); TObjArray * array1b = (TObjArray*)fBestHypothesys.At(itrack1); - if (!array1b&&pvertex->GetRr()<40 && TMath::Abs(track1->fP3)<1.1) + if (!array1b&&pvertex->GetRr()<40 && TMath::Abs(track1->GetTgl())<1.1) FollowProlongationTree((AliITStrackMI*)fOriginal.At(itrack1),itrack1, kFALSE); // AliITStrackMI * track0b = (AliITStrackMI*)fOriginal.At(itrack0); @@ -3868,7 +3869,7 @@ void AliITStrackerMI::FindV02(AliESD *event) if (!btrack) continue; if (btrack->fN>track0l->fN) track0l = btrack; // if (btrack->fXGetRr()-2.-0.5/(0.1+pvertex->GetAnglep()[2])) { - if (btrack->fXGetRr()-2.) { + if (btrack->GetX()GetRr()-2.) { if ( (maxLayer>i+2|| (i==0)) && btrack->fN==(6-i)&&i<3){ Float_t sumchi2= 0; Float_t sumn = 0; @@ -3912,7 +3913,7 @@ void AliITStrackerMI::FindV02(AliESD *event) if (!btrack) continue; if (btrack->fN>track1l->fN) track1l = btrack; // if (btrack->fXGetRr()-2-0.5/(0.1+pvertex->GetAnglep()[2])){ - if (btrack->fXGetRr()-2){ + if (btrack->GetX()GetRr()-2){ if ((maxLayer>i+2 || (i==0))&&btrack->fN==(6-i)&&(i<3)){ Float_t sumchi2= 0; Float_t sumn = 0; @@ -3952,9 +3953,9 @@ void AliITStrackerMI::FindV02(AliESD *event) } // // position resolution - used for DCA cut - Float_t sigmad = track0b->fC00+track0b->fC11+track1b->fC00+track1b->fC11+ - (track0b->fX-pvertex->GetRr())*(track0b->fX-pvertex->GetRr())*(track0b->fC22+track0b->fC33)+ - (track1b->fX-pvertex->GetRr())*(track1b->fX-pvertex->GetRr())*(track1b->fC22+track1b->fC33); + Float_t sigmad = track0b->GetSigmaY2()+track0b->GetSigmaZ2()+track1b->GetSigmaY2()+track1b->GetSigmaZ2()+ + (track0b->GetX()-pvertex->GetRr())*(track0b->GetX()-pvertex->GetRr())*(track0b->GetSigmaSnp2()+track0b->GetSigmaTgl2())+ + (track1b->GetX()-pvertex->GetRr())*(track1b->GetX()-pvertex->GetRr())*(track1b->GetSigmaSnp2()+track1b->GetSigmaTgl2()); sigmad =TMath::Sqrt(sigmad)+0.04; if (pvertex->GetRr()>50){ Double_t cov0[15],cov1[15]; @@ -3966,7 +3967,7 @@ void AliITStrackerMI::FindV02(AliESD *event) sigmad =TMath::Sqrt(sigmad)+0.05; } // - AliESDV0MI vertex2; + AliV0 vertex2; vertex2.SetM(*track0b); vertex2.SetP(*track1b); vertex2.Update(primvertex); @@ -4115,9 +4116,9 @@ void AliITStrackerMI::RefitV02(AliESD *event) // Int_t nv0s = event->GetNumberOfV0MIs(); Float_t primvertex[3]={GetX(),GetY(),GetZ()}; - AliESDV0MI v0temp; + AliV0 v0temp; for (Int_t iv0 = 0; iv0GetV0MI(iv0); + AliV0 * v0mi = (AliV0*)event->GetV0MI(iv0); if (!v0mi) continue; Int_t itrack0 = v0mi->GetIndex(0); Int_t itrack1 = v0mi->GetIndex(1); diff --git a/ITS/AliITStrackerSA.cxx b/ITS/AliITStrackerSA.cxx index cb5694e2866..d3d13715523 100644 --- a/ITS/AliITStrackerSA.cxx +++ b/ITS/AliITStrackerSA.cxx @@ -620,12 +620,12 @@ AliITStrackV2* AliITStrackerSA::FitTrack(AliITStrackSA* tr,Double_t *primaryVert AliITStrackMI* ot = new AliITStrackSA(*trac); - ot->ResetCovariance(); + ot->ResetCovariance(10.); ot->ResetClusters(); if(RefitAt(49.,ot,trac)){ //fit from layer 1 to layer 6 AliITStrackMI *otrack2 = new AliITStrackMI(*ot); - otrack2->ResetCovariance(); + otrack2->ResetCovariance(10.); otrack2->ResetClusters(); //fit from layer 6 to layer 1 if(RefitAt(3.7,otrack2,ot)) { diff --git a/ITS/AliITStrackerV2.cxx b/ITS/AliITStrackerV2.cxx index 9f40d657d23..9236c8be2b8 100644 --- a/ITS/AliITStrackerV2.cxx +++ b/ITS/AliITStrackerV2.cxx @@ -37,7 +37,62 @@ ClassImp(AliITStrackerV2) AliITStrackerV2::AliITSlayer AliITStrackerV2::fgLayers[kMaxLayer]; // ITS layers -AliITStrackerV2::AliITStrackerV2(const AliITSgeom *geom) : AliTracker() { +AliITStrackerV2::AliITStrackerV2(): + AliTracker(), + fI(kMaxLayer), + fBestTrack(), + fTrackToFollow(), + fPass(0), + fLastLayerToTrackTo(kLastLayerToTrackTo) +{ + //-------------------------------------------------------------------- + //This is the AliITStrackerV2 default constructor + //-------------------------------------------------------------------- + + for (Int_t i=1; iGetD())>4) { + if (TMath::Abs(t->GetD(GetX(),GetY()))>4) { delete t; continue; } @@ -300,13 +351,13 @@ Int_t AliITStrackerV2::PropagateBack(AliESD *event) { // propagete to vertex [SR, GSI 17.02.2003] // Start Time measurement [SR, GSI 17.02.2003], corrected by I.Belikov if (fTrackToFollow.PropagateTo(3.,0.0028,65.19)) { - if (fTrackToFollow.PropagateToVertex()) { + if (fTrackToFollow.PropagateToVertex(event->GetVertex())) { fTrackToFollow.StartTimeIntegral(); } fTrackToFollow.PropagateTo(3.,-0.0028,65.19); } - fTrackToFollow.ResetCovariance(); fTrackToFollow.ResetClusters(); + fTrackToFollow.ResetCovariance(10.); fTrackToFollow.ResetClusters(); if (RefitAt(49.,&fTrackToFollow,t)) { if (CorrectForDeadZoneMaterial(&fTrackToFollow)!=0) { Warning("PropagateBack", @@ -551,7 +602,7 @@ Int_t AliITStrackerV2::TakeNextProlongation() { } if (fTrackToFollow.GetNumberOfClusters()>1) - if (TMath::Abs(fTrackToFollow.GetD())>4) return 0; + if (TMath::Abs(fTrackToFollow.GetD(GetX(),GetY()))>4) return 0; fTrackToFollow. SetSampledEdx(cc->GetQ(),fTrackToFollow.GetNumberOfClusters()-1); //b.b. @@ -573,35 +624,43 @@ Int_t AliITStrackerV2::TakeNextProlongation() { } -AliITStrackerV2::AliITSlayer::AliITSlayer() { +AliITStrackerV2::AliITSlayer::AliITSlayer(): + fR(0.), + fPhiOffset(0.), + fNladders(0), + fZOffset(0.), + fNdetectors(0), + fDetectors(0), + fNsel(0), + fRoad(2*fR*TMath::Sqrt(3.14/1.)) //assuming that there's only one cluster +{ //-------------------------------------------------------------------- //default AliITSlayer constructor //-------------------------------------------------------------------- - fR=0.; fPhiOffset=0.; fZOffset=0.; - fNladders=0; fNdetectors=0; - fDetectors=0; for (Int_t i=0; iGetIntegratedLength()); } - Set(*t); + Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance()); switch (flags) { @@ -393,18 +390,19 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){ fITSchi2=t->GetChi2(); fITSsignal=t->GetPIDsignal(); fITSLabel = t->GetLabel(); - fITSFakeRatio = t->GetFakeRatio(); break; case kTPCin: case kTPCrefit: fTPCLabel = t->GetLabel(); if (!fIp) fIp=new AliExternalTrackParam(*t); - else fIp->Set(*t); + else + fIp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance()); case kTPCout: index=fFriendTrack->GetTPCindices(); if (flags & kTPCout){ if (!fOp) fOp=new AliExternalTrackParam(*t); - else fOp->Set(*t); + else + fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance()); } fTPCncls=t->GetNumberOfClusters(); fTPCchi2=t->GetChi2(); @@ -473,7 +471,8 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){ break; case kTRDbackup: if (!fOp) fOp=new AliExternalTrackParam(*t); - else fOp->Set(*t); + else + fOp->Set(t->GetX(),t->GetAlpha(),t->GetParameter(),t->GetCovariance()); fTRDncls0 = t->GetNumberOfClusters(); break; case kTOFin: @@ -939,3 +938,52 @@ void AliESDtrack::Print(Option_t *) const { printf("\n signal = %f\n", GetRICHsignal()) ; } } + +Bool_t AliESDtrack::PropagateTo(Double_t xToGo, Double_t b, Double_t mass, +Double_t maxStep, Bool_t rotateTo, Double_t maxSnp){ + //---------------------------------------------------------------- + // + // MI's function + // + // Propagates this track to the plane X=xk (cm) + // in the magnetic field "b" (kG), + // the correction for the material is included + // + // mass - mass used in propagation - used for energy loss correction + // maxStep - maximal step for propagation + //---------------------------------------------------------------- + const Double_t kEpsilon = 0.00001; + Double_t xpos = GetX(); + Double_t dir = (xpos kEpsilon){ + Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep); + Double_t x = xpos+step; + Double_t xyz0[3],xyz1[3],param[7]; + GetXYZ(xyz0); //starting global position + if (!GetXYZAt(x,b,xyz1)) return kFALSE; // no prolongation + xyz1[2]+=kEpsilon; // waiting for bug correction in geo + AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); + if (TMath::Abs(GetSnpAt(x,b)) >= maxSnp) return kFALSE; + if (!AliExternalTrackParam::PropagateTo(x,b)) return kFALSE; + + Double_t rho=param[0],x0=param[1],distance=param[4]; + Double_t d=distance*rho/x0; + + if (!CorrectForMaterial(d,x0,mass)) return kFALSE; + if (rotateTo){ + if (TMath::Abs(GetSnp()) >= maxSnp) return kFALSE; + GetXYZ(xyz0); // global position + Double_t alphan = TMath::ATan2(xyz0[1], xyz0[0]); + // + Double_t ca=TMath::Cos(alphan-GetAlpha()), + sa=TMath::Sin(alphan-GetAlpha()); + Double_t sf=GetSnp(), cf=TMath::Sqrt(1.- sf*sf); + Double_t sinNew = sf*ca - cf*sa; + if (TMath::Abs(sinNew) >= maxSnp) return kFALSE; + if (!Rotate(alphan)) return kFALSE; + } + xpos = GetX(); + } + return kTRUE; +} diff --git a/STEER/AliESDtrack.h b/STEER/AliESDtrack.h index c117236198f..b6812c6bd66 100644 --- a/STEER/AliESDtrack.h +++ b/STEER/AliESDtrack.h @@ -73,6 +73,9 @@ public: if (!fCp) return kFALSE; return fCp->GetXYZ(r); } + const AliExternalTrackParam *GetConstrainedExternalParameters() const { + return fCp; + } Bool_t GetConstrainedExternalParameters (Double_t &alpha, Double_t &x, Double_t p[5]) const; Bool_t GetConstrainedExternalCovariance(Double_t cov[15]) const; @@ -115,8 +118,6 @@ public: Float_t GetITSchi2() const {return fITSchi2;} Int_t GetITSclusters(Int_t *idx) const; Int_t GetITSLabel() const {return fITSLabel;} - Float_t GetITSFakeRatio() const {return fITSFakeRatio;} - void SetITStrack(AliKalmanTrack * track){ fFriendTrack->SetITStrack(track); } @@ -170,7 +171,6 @@ public: Float_t GetTRDchi2() const {return fTRDchi2;} Int_t GetTRDclusters(Int_t *idx) const; Int_t GetTRDncls() const {return fTRDncls;} - Int_t GetTRDncls0() const {return fTRDncls0;} void SetTRDpid(Int_t iSpecies, Float_t p); Float_t GetTRDpid(Int_t iSpecies) const; Int_t GetTRDLabel() const {return fTRDLabel;} @@ -238,6 +238,10 @@ public: } virtual void Print(Option_t * opt) const ; + //MI + Bool_t PropagateTo(Double_t x, Double_t b, Double_t mass, Double_t maxStep, + Bool_t rotateTo=kTRUE, Double_t maxSnp=0.8); + enum { kITSin=0x0001,kITSout=0x0002,kITSrefit=0x0004,kITSpid=0x0008, kTPCin=0x0010,kTPCout=0x0020,kTPCrefit=0x0040,kTPCpid=0x0080, @@ -283,8 +287,6 @@ protected: Float_t fITSsignal; // detector's PID signal Float_t fITSr[AliPID::kSPECIES]; // "detector response probabilities" (for the PID) Int_t fITSLabel; // label according TPC - Float_t fITSFakeRatio; // ration of fake tracks - // TPC related track information Float_t fTPCchi2; // chi2 in the TPC @@ -344,7 +346,7 @@ protected: AliESDtrack & operator=(const AliESDtrack & ) {return *this;} - ClassDef(AliESDtrack,29) //ESDtrack + ClassDef(AliESDtrack,30) //ESDtrack }; #endif diff --git a/STEER/AliExternalTrackParam.cxx b/STEER/AliExternalTrackParam.cxx index c4ecff6b1aa..3d6859fbb02 100644 --- a/STEER/AliExternalTrackParam.cxx +++ b/STEER/AliExternalTrackParam.cxx @@ -26,14 +26,14 @@ // Origin: I.Belikov, CERN, Jouri.Belikov@cern.ch // /////////////////////////////////////////////////////////////////////////////// #include "AliExternalTrackParam.h" -#include "AliKalmanTrack.h" #include "AliESDVertex.h" - +#include "AliLog.h" ClassImp(AliExternalTrackParam) //_____________________________________________________________________________ AliExternalTrackParam::AliExternalTrackParam() : + TObject(), fX(0), fAlpha(0) { @@ -44,10 +44,24 @@ AliExternalTrackParam::AliExternalTrackParam() : for (Int_t i = 0; i < 15; i++) fC[i] = 0; } +//_____________________________________________________________________________ +AliExternalTrackParam::AliExternalTrackParam(const AliExternalTrackParam &track): + TObject(track), + fX(track.fX), + fAlpha(track.fAlpha) +{ + // + // copy constructor + // + for (Int_t i = 0; i < 5; i++) fP[i] = track.fP[i]; + for (Int_t i = 0; i < 15; i++) fC[i] = track.fC[i]; +} + //_____________________________________________________________________________ AliExternalTrackParam::AliExternalTrackParam(Double_t x, Double_t alpha, const Double_t param[5], const Double_t covar[15]) : + TObject(), fX(x), fAlpha(alpha) { @@ -59,23 +73,15 @@ AliExternalTrackParam::AliExternalTrackParam(Double_t x, Double_t alpha, } //_____________________________________________________________________________ -AliExternalTrackParam::AliExternalTrackParam(const AliKalmanTrack& track) : - fX(0), - fAlpha(track.GetAlpha()) -{ - // - // - track.GetExternalParameters(fX,fP); - track.GetExternalCovariance(fC); -} - -//_____________________________________________________________________________ -void AliExternalTrackParam::Set(const AliKalmanTrack& track) { +void AliExternalTrackParam::Set(Double_t x, Double_t alpha, + const Double_t p[5], const Double_t cov[15]) { // + // Sets the parameters // - fAlpha=track.GetAlpha(); - track.GetExternalParameters(fX,fP); - track.GetExternalCovariance(fC); + fX=x; + fAlpha=alpha; + for (Int_t i = 0; i < 5; i++) fP[i] = p[i]; + for (Int_t i = 0; i < 15; i++) fC[i] = cov[i]; } //_____________________________________________________________________________ @@ -775,6 +781,26 @@ AliExternalTrackParam::GetYAt(Double_t x, Double_t b, Double_t &y) const { return kTRUE; } +Bool_t +AliExternalTrackParam::GetZAt(Double_t x, Double_t b, Double_t &z) const { + //--------------------------------------------------------------------- + // This function returns the local Z-coordinate of the intersection + // point between this track and the reference plane "x" (cm). + // Magnetic field "b" (kG) + //--------------------------------------------------------------------- + Double_t dx=x-fX; + if(TMath::Abs(dx)<=kAlmost0) {z=fP[1]; return kTRUE;} + + Double_t f1=fP[2], f2=f1 + dx*fP[4]*b*kB2C; + + if (TMath::Abs(f1) >= kAlmost1) return kFALSE; + if (TMath::Abs(f2) >= kAlmost1) return kFALSE; + + Double_t r1=sqrt(1.- f1*f1), r2=sqrt(1.- f2*f2); + z = fP[1] + dx*(r2 + f2*(f1+f2)/(r1+r2))*fP[3]; // Many thanks to P.Hristov ! + return kTRUE; +} + Bool_t AliExternalTrackParam::GetXYZAt(Double_t x, Double_t b, Double_t *r) const { //--------------------------------------------------------------------- @@ -792,7 +818,7 @@ AliExternalTrackParam::GetXYZAt(Double_t x, Double_t b, Double_t *r) const { Double_t r1=TMath::Sqrt(1.- f1*f1), r2=TMath::Sqrt(1.- f2*f2); r[0] = x; r[1] = fP[0] + dx*(f1+f2)/(r1+r2); - r[2] = fP[1] + dx*(r2 + f2*(f1+f2)/(r1+r2))*fP[3];//Many thanks to P.Hristov ! + r[2] = fP[1] + dx*(f1+f2)/(f1*r2 + f2*r1)*fP[3]; return Local2GlobalPosition(r,fAlpha); } @@ -823,56 +849,3 @@ Double_t AliExternalTrackParam::GetSnpAt(Double_t x,Double_t b) const { Double_t res = fP[2]+dx*crv; return res; } - -Bool_t AliExternalTrackParam::PropagateTo(Double_t xToGo, Double_t b, Double_t mass, Double_t maxStep, Bool_t rotateTo, Double_t maxSnp){ - //---------------------------------------------------------------- - // - // Very expensive function ! Don't abuse it ! - // - // Propagates this track to the plane X=xk (cm) - // in the magnetic field "b" (kG), - // the correction for the material is included - // - // Requires acces to geomanager - // - // mass - mass used in propagation - used for energy loss correction - // maxStep - maximal step for propagation - //---------------------------------------------------------------- - const Double_t kEpsilon = 0.00001; - Double_t xpos = GetX(); - Double_t dir = (xpos kEpsilon){ - Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep); - Double_t x = xpos+step; - Double_t xyz0[3],xyz1[3],param[7]; - GetXYZ(xyz0); //starting global position - if (!GetXYZAt(x,b,xyz1)) return kFALSE; // no prolongation - xyz1[2]+=kEpsilon; // waiting for bug correction in geo - AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); - if (TMath::Abs(GetSnpAt(x,b)) >= maxSnp) return kFALSE; - if (!PropagateTo(x,b)) return kFALSE; - - Double_t rho=param[0],x0=param[1],distance=param[4]; - Double_t d=distance*rho/x0; - - if (!CorrectForMaterial(d,x0,mass)) return kFALSE; - if (rotateTo){ - if (TMath::Abs(fP[2]) >= maxSnp) return kFALSE; - GetXYZ(xyz0); // global position - Double_t alphan = TMath::ATan2(xyz0[1], xyz0[0]); - // - Double_t ca=TMath::Cos(alphan-fAlpha), sa=TMath::Sin(alphan-fAlpha); - Double_t sf=fP[2], cf=TMath::Sqrt(1.- fP[2]*fP[2]); - Double_t sinNew = sf*ca - cf*sa; - if (TMath::Abs(sinNew) >= maxSnp) return kFALSE; - if (!Rotate(alphan)) return kFALSE; - } - xpos = GetX(); - } - return kTRUE; -} - - - - diff --git a/STEER/AliExternalTrackParam.h b/STEER/AliExternalTrackParam.h index f9f100a6f2c..7a6f6b13600 100644 --- a/STEER/AliExternalTrackParam.h +++ b/STEER/AliExternalTrackParam.h @@ -19,6 +19,7 @@ * Origin: I.Belikov, CERN, Jouri.Belikov@cern.ch * *****************************************************************************/ #include "TObject.h" +#include "TMath.h" const Double_t kAlmost1=0.999; const Double_t kAlmost0=1e-33; @@ -29,30 +30,59 @@ const Double_t kAlmost0Field=1.e-13; const Double_t kVeryBigConvConst=1/kB2C/kAlmost0Field; const Double_t kMostProbableMomentum=0.35; -class AliKalmanTrack; class AliESDVertex; class AliExternalTrackParam: public TObject { public: AliExternalTrackParam(); + AliExternalTrackParam(const AliExternalTrackParam &); AliExternalTrackParam(Double_t x, Double_t alpha, const Double_t param[5], const Double_t covar[15]); - AliExternalTrackParam(const AliKalmanTrack& track); virtual ~AliExternalTrackParam(){} + void Set(Double_t x,Double_t alpha, + const Double_t param[5], const Double_t covar[15]); void Reset(); - void Set(const AliKalmanTrack& track); + void ResetCovariance(Double_t s2) { + fC[0]*= s2; + fC[1] = 0.; fC[2]*= s2; + fC[3] = 0.; fC[4] = 0.; fC[5]*= s2; + fC[6] = 0.; fC[7] = 0.; fC[8] = 0.; fC[9]*= s2; + fC[10]= 0.; fC[11]= 0.; fC[12]= 0.; fC[13]= 0.; fC[14]*=10.; + } const Double_t *GetParameter() const {return fP;} const Double_t *GetCovariance() const {return fC;} - Double_t GetSigmaY2() const {return fC[0];} - Double_t GetSigmaZ2() const {return fC[2];} + + Double_t GetAlpha() const {return fAlpha;} Double_t GetX() const {return fX;} Double_t GetY() const {return fP[0];} Double_t GetZ() const {return fP[1];} - Double_t GetAlpha() const {return fAlpha;} + Double_t GetSnp() const {return fP[2];} + Double_t GetTgl() const {return fP[3];} + Double_t Get1Pt() const {return fP[4];} + + Double_t GetSigmaY2() const {return fC[0];} + Double_t GetSigmaZY() const {return fC[1];} + Double_t GetSigmaZ2() const {return fC[2];} + Double_t GetSigmaSnpY() const {return fC[3];} + Double_t GetSigmaSnpZ() const {return fC[4];} + Double_t GetSigmaSnp2() const {return fC[5];} + Double_t GetSigmaTglY() const {return fC[6];} + Double_t GetSigmaTglZ() const {return fC[7];} + Double_t GetSigmaTglSnp() const {return fC[8];} + Double_t GetSigmaTgl2() const {return fC[9];} + Double_t GetSigma1PtY() const {return fC[10];} + Double_t GetSigma1PtZ() const {return fC[11];} + Double_t GetSigma1PtSnp() const {return fC[12];} + Double_t GetSigma1PtTgl() const {return fC[13];} + Double_t GetSigma1Pt2() const {return fC[14];} + Double_t GetSign() const {return (fP[4]>0) ? 1 : -1;} Double_t GetP() const; + Double_t GetPt() const { + return (TMath::Abs(fP[4])>kAlmost0) ? 1./fP[4]:TMath::Sign(kVeryBig,fP[4]); + } Double_t Get1P() const; Double_t GetC(Double_t b) const {return fP[4]*b*kB2C;} void GetDZ(Double_t x,Double_t y,Double_t z,Double_t b,Float_t dz[2]) const; @@ -81,10 +111,14 @@ class AliExternalTrackParam: public TObject { Bool_t GetPxPyPzAt(Double_t x, Double_t b, Double_t p[3]) const; Bool_t GetXYZAt(Double_t x, Double_t b, Double_t r[3]) const; Bool_t GetYAt(Double_t x, Double_t b, Double_t &y) const; + Bool_t GetZAt(Double_t x, Double_t b, Double_t &z) const; void Print(Option_t* option = "") const; - // MI - virtual Bool_t PropagateTo(Double_t x, Double_t b, Double_t mass, Double_t maxStep, Bool_t rotateTo=kTRUE, Double_t maxSnp=0.8); Double_t GetSnpAt(Double_t x,Double_t b) const; + +protected: + Double_t &Par(Int_t i) {return fP[i];} + Double_t &Cov(Int_t i) {return fC[i];} + private: Double_t fX; // X coordinate for the point of parametrisation Double_t fAlpha; // Local <-->global coor.system rotation angle diff --git a/STEER/AliHelix.cxx b/STEER/AliHelix.cxx index 7050e3bb89a..268e1d877ab 100644 --- a/STEER/AliHelix.cxx +++ b/STEER/AliHelix.cxx @@ -23,7 +23,7 @@ #include "AliHelix.h" #include "AliKalmanTrack.h" -#include "AliExternalTrackParam.h" +#include "AliTracker.h" #include "TMath.h" ClassImp(AliHelix) @@ -56,7 +56,7 @@ AliHelix::AliHelix(const AliKalmanTrack &t) //circle parameters //PH Sometimes fP4 and fHelix[4] are very big and the calculation //PH of the Sqrt cannot be done. To be investigated... - fHelix[4]=fHelix[4]/t.GetConvConst(); // C + fHelix[4]=fHelix[4]/(1000/0.299792458/AliTracker::GetBz()); // C cs=TMath::Cos(alpha); sn=TMath::Sin(alpha); Double_t xc, yc, rc; @@ -101,7 +101,7 @@ AliHelix::AliHelix(const AliExternalTrackParam &t) //circle parameters //PH Sometimes fP4 and fHelix[4] are very big and the calculation //PH of the Sqrt cannot be done. To be investigated... - fHelix[4]=fHelix[4]/AliKalmanTrack::GetConvConst(); // C + fHelix[4]=fHelix[4]/(1000/0.299792458/AliTracker::GetBz()); // C cs=TMath::Cos(alpha); sn=TMath::Sin(alpha); Double_t xc, yc, rc; @@ -137,7 +137,7 @@ AliHelix::AliHelix(Double_t x[3], Double_t p[3], Double_t charge, Double_t conve // Double_t pt = TMath::Sqrt(p[0]*p[0]+p[1]*p[1]); if (TMath::Abs(conversion)<0.00000001) - conversion = AliKalmanTrack::GetConvConst(); + conversion = 1000/0.299792458/AliTracker::GetBz(); // // fHelix[4] = charge/(conversion*pt); // C @@ -175,7 +175,7 @@ void AliHelix::GetMomentum(Double_t phase, Double_t p[4],Double_t conversion, D // return momentum at given phase Double_t x[3],g[3],gg[3]; Evaluate(phase,x,g,gg); - if (TMath::Abs(conversion)<0.0001) conversion = AliKalmanTrack::GetConvConst(); + if (TMath::Abs(conversion)<0.0001) conversion = 1000/0.299792458/AliTracker::GetBz(); Double_t mt = TMath::Sqrt(g[0]*g[0]+g[1]*g[1]); p[0] = fHelix[8]*g[0]/(mt*conversion); p[1] = fHelix[8]*g[1]/(mt*conversion); diff --git a/STEER/AliKalmanTrack.cxx b/STEER/AliKalmanTrack.cxx index 439a3a4bc83..a3d09ffe168 100644 --- a/STEER/AliKalmanTrack.cxx +++ b/STEER/AliKalmanTrack.cxx @@ -20,51 +20,42 @@ // that is the base for AliTPCtrack, AliITStrackV2 and AliTRDtrack // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch //------------------------------------------------------------------------- -#include "AliTracker.h" +#include #include "AliKalmanTrack.h" -#include "TGeoManager.h" ClassImp(AliKalmanTrack) //_______________________________________________________________________ -AliKalmanTrack::AliKalmanTrack(): + AliKalmanTrack::AliKalmanTrack():AliExternalTrackParam(), fLab(-3141593), fFakeRatio(0), fChi2(0), fMass(AliPID::ParticleMass(AliPID::kPion)), fN(0), - fLocalConvConst(0), fStartTimeIntegral(kFALSE), fIntegratedLength(0) { // // Default constructor // - if (AliTracker::GetFieldMap()==0) { - AliError("The magnetic field has not been set!"); - } for(Int_t i=0; i helix parameters - //-------------------------------------------------------------------- - Double_t alpha,x,cs,sn; - GetExternalParameters(x,helix); alpha=GetAlpha(); - - cs=TMath::Cos(alpha); sn=TMath::Sin(alpha); - helix[5]=x*cs - helix[0]*sn; // x0 - helix[0]=x*sn + helix[0]*cs; // y0 -//helix[1]= // z0 - helix[2]=TMath::ASin(helix[2]) + alpha; // phi0 -//helix[3]= // tgl - helix[4]=helix[4]/GetLocalConvConst(); // C -} - Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Double_t *mparam) { - // + // // calculate mean material budget and material properties beween point start and end // mparam - returns parameters used for dEdx and multiple scatering // - // mparam[0] - density mean + // mparam[0] - density mean // mparam[1] - rad length // mparam[2] - A mean // mparam[3] - Z mean @@ -202,10 +177,10 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub // mparam[5] - Z/A mean // mparam[6] - number of boundary crosses // - mparam[0]=0; mparam[1]=1; mparam[2] =0; mparam[3] =0, mparam[4]=0, mparam[5]=0; mparam[6]=0; + mparam[0]=0; mparam[1]=1; mparam[2] =0; mparam[3] =0, mparam[4]=0, mparam[5]=0; mparam[6]=0; // Double_t bparam[6], lparam[6]; // bparam - total param - lparam - local parameters - for (Int_t i=0;i<6;i++) bparam[i]=0; // + for (Int_t i=0;i<6;i++) bparam[i]=0; // if (!gGeoManager) { printf("ERROR: no TGeo\n"); @@ -215,8 +190,8 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub Double_t length; Double_t dir[3]; length = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0])+ - (end[1]-start[1])*(end[1]-start[1])+ - (end[2]-start[2])*(end[2]-start[2])); + (end[1]-start[1])*(end[1]-start[1])+ + (end[2]-start[2])*(end[2]-start[2])); mparam[4]=length; if (lengthGetRadLen(); lparam[2] = material->GetA(); lparam[3] = material->GetZ(); - lparam[4] = length; + lparam[4] = length; lparam[5] = lparam[3]/lparam[2]; if (material->IsMixture()) { lparam[1]*=lparam[0]; // different normalization in the modeler for mixture @@ -254,7 +229,7 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub Double_t step = 0.0; // If no boundary within proposed length, return current density if (snext>=length) { - for (Int_t ip=0;ip<5;ip++) mparam[ip] = lparam[ip]; + for (Int_t ip=0;ip<5;ip++) mparam[ip] = lparam[ip]; return lparam[0]; } // Try to cross the boundary and see what is next @@ -265,7 +240,7 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub bparam[1] += snext*lparam[1]; bparam[2] += snext*lparam[2]; bparam[3] += snext*lparam[3]; - bparam[5] += snext*lparam[5]; + bparam[5] += snext*lparam[5]; bparam[0] += snext*lparam[0]; if (snext>=length) break; @@ -275,15 +250,15 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub gGeoManager->SetStep(1.E-3); currentnode = gGeoManager->Step(); if (!gGeoManager->IsEntering() || !currentnode) { - // printf("ERROR: cannot cross boundary\n"); - mparam[0] = bparam[0]/step; - mparam[1] = bparam[1]/step; - mparam[2] = bparam[2]/step; - mparam[3] = bparam[3]/step; - mparam[5] = bparam[5]/step; - mparam[4] = step; - mparam[0] = 0.; // if crash of navigation take mean density 0 - mparam[1] = 1000000; // and infinite rad length + // printf("ERROR: cannot cross boundary\n"); + mparam[0] = bparam[0]/step; + mparam[1] = bparam[1]/step; + mparam[2] = bparam[2]/step; + mparam[3] = bparam[3]/step; + mparam[5] = bparam[5]/step; + mparam[4] = step; + mparam[0] = 0.; // if crash of navigation take mean density 0 + mparam[1] = 1000000; // and infinite rad length return bparam[0]/step; } step += 1.E-3; @@ -304,39 +279,23 @@ Double_t AliKalmanTrack::MeanMaterialBudget(Double_t *start, Double_t *end, Doub if (material->IsMixture()) { lparam[1]*=lparam[0]; TGeoMixture * mixture = (TGeoMixture*)material; - lparam[5]=0; + lparam[5]=0; Double_t sum =0; for (Int_t iel=0;ielGetNelements();iel++){ - sum+= mixture->GetWmixt()[iel]; - lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; + sum+= mixture->GetWmixt()[iel]; + lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel]; } lparam[5]/=sum; } gGeoManager->FindNextBoundary(length); snext = gGeoManager->GetStep(); - } + } mparam[0] = bparam[0]/step; mparam[1] = bparam[1]/step; mparam[2] = bparam[2]/step; - mparam[3] = bparam[3]/step; - mparam[5] = bparam[5]/step; - return bparam[0]/step; - -} + mparam[3] = bparam[3]/step; + mparam[5] = bparam[5]/step; + return bparam[0]/step; -Double_t AliKalmanTrack::GetConvConst() { - return 1000/0.299792458/AliTracker::GetBz(); } -void AliKalmanTrack::SaveLocalConvConst() { - //--------------------------------------------------------------------- - // Saves local conversion constant "curvature (1/cm) -> pt (GeV/c)" - //--------------------------------------------------------------------- - if (AliTracker::UniformField()) { - fLocalConvConst=1000/0.299792458/AliTracker::GetBz(); - } else { - Float_t r[3]; GetXYZ(r); - fLocalConvConst=1000/0.299792458/AliTracker::GetBz(r); - } -} - diff --git a/STEER/AliKalmanTrack.h b/STEER/AliKalmanTrack.h index 4596e3097aa..92cd1702ebd 100644 --- a/STEER/AliKalmanTrack.h +++ b/STEER/AliKalmanTrack.h @@ -12,24 +12,26 @@ // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch //------------------------------------------------------------------------- -#include +#include "AliExternalTrackParam.h" #include "AliLog.h" #include "AliPID.h" class AliCluster; -class AliKalmanTrack : public TObject { +class AliKalmanTrack : public AliExternalTrackParam { public: AliKalmanTrack(); AliKalmanTrack(const AliKalmanTrack &t); - virtual ~AliKalmanTrack(){}; + void SetLabel(Int_t lab) {fLab=lab;} - void SetFakeRatio(Float_t ratio) {fFakeRatio=ratio;} + + virtual Double_t GetPredictedChi2(const AliCluster *c) const = 0; + virtual Bool_t PropagateTo(Double_t xr, Double_t x0, Double_t rho) = 0; + virtual Bool_t Update(const AliCluster* c, Double_t chi2, Int_t index) = 0; Bool_t IsSortable() const {return kTRUE;} Int_t GetLabel() const {return fLab;} - Float_t GetFakeRatio() const {return fFakeRatio;} Double_t GetChi2() const {return fChi2;} Double_t GetMass() const {return fMass;} Int_t GetNumberOfClusters() const {return fN;} @@ -42,51 +44,36 @@ public: return 0.; } - virtual Double_t GetAlpha() const { - AliWarning("Method must be overloaded !\n"); - return 0.; - } - virtual Double_t GetSigmaY2() const { - AliWarning("Method must be overloaded !\n"); - return 0.; - } - virtual Double_t GetSigmaZ2() const { - AliWarning("Method must be overloaded !\n"); - return 0.; - } - virtual Int_t Compare(const TObject *) const {return 0;} - virtual void GetExternalParameters(Double_t&/*xr*/,Double_t/*x*/[5]) const=0; - virtual void GetExternalCovariance(Double_t /*cov*/[15]) const = 0; - - virtual Double_t GetPredictedChi2(const AliCluster *) const = 0; - virtual Int_t PropagateTo(Double_t/*xr*/,Double_t/*x0*/,Double_t/*rho*/) = 0; + void GetExternalParameters(Double_t &xr,Double_t p[5]) const { + xr=GetX(); + for (Int_t i=0; i<5; i++) p[i]=GetParameter()[i]; + } + void GetExternalCovariance(Double_t cov[15]) const { + for (Int_t i=0; i<15; i++) cov[i]=GetCovariance()[i]; + } - virtual Int_t Update(const AliCluster*, Double_t /*chi2*/, UInt_t) = 0; + static + Double_t MeanMaterialBudget(Double_t *start,Double_t *end,Double_t *mparam); - static Double_t MeanMaterialBudget(Double_t *start, Double_t *end, Double_t *mparam); - // Time integration (S.Radomski@gsi.de) - void StartTimeIntegral(); + void StartTimeIntegral(); void SetIntegratedLength(Double_t l) {fIntegratedLength=l;} void SetIntegratedTimes(const Double_t *times); Bool_t IsStartedTimeIntegral() const {return fStartTimeIntegral;} - void AddTimeStep(Double_t length); + void AddTimeStep(Double_t length); void GetIntegratedTimes(Double_t *times) const; Double_t GetIntegratedTime(Int_t pdg) const; Double_t GetIntegratedLength() const {return fIntegratedLength;} - virtual void GetXYZ(Float_t r[3]) const = 0; - static Double_t GetConvConst(); void SetNumberOfClusters(Int_t n) {fN=n;} -protected: - void SaveLocalConvConst(); - Double_t GetLocalConvConst() const {return fLocalConvConst;} - void External2Helix(Double_t helix[6]) const; + void SetFakeRatio(Float_t ratio) {fFakeRatio=ratio;} + Float_t GetFakeRatio() const {return fFakeRatio;} +protected: void SetChi2(Double_t chi2) {fChi2=chi2;} void SetMass(Double_t mass) {fMass=mass;} @@ -97,14 +84,12 @@ protected: Int_t fN; // number of associated clusters private: - Double_t fLocalConvConst; //local conversion "curvature(1/cm) -> pt(GeV/c)" - // variables for time integration (S.Radomski@gsi.de) Bool_t fStartTimeIntegral; // indicator wether integrate time Double_t fIntegratedTime[AliPID::kSPECIES]; // integrated time Double_t fIntegratedLength; // integrated length - ClassDef(AliKalmanTrack,5) // Reconstructed track + ClassDef(AliKalmanTrack,6) // Reconstructed track }; #endif diff --git a/STEER/AliKink.cxx b/STEER/AliKink.cxx new file mode 100644 index 00000000000..f04eba081b9 --- /dev/null +++ b/STEER/AliKink.cxx @@ -0,0 +1,116 @@ +/************************************************************************** + * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * * + * Author: The ALICE Off-line Project. * + * Contributors are mentioned in the code where appropriate. * + * * + * Permission to use, copy, modify and distribute this software and its * + * documentation strictly for non-commercial purposes is hereby granted * + * without fee, provided that the above copyright notice appears in all * + * copies and that both the copyright notice and this permission notice * + * appear in the supporting documentation. The authors make no claims * + * about the suitability of this software for any purpose. It is * + * provided "as is" without express or implied warranty. * + **************************************************************************/ + +//------------------------------------------------------------------------- +// Origin: Marian Ivanov marian.ivanov@cern.ch +//------------------------------------------------------------------------- + +#include +#include "AliKink.h" +#include "AliHelix.h" + + +ClassImp(AliKink) + +void AliKink::Update() +{ + // + // updates Kink Info + // + Float_t distance2=1000; + // + AliHelix dhelix1(fParamDaughter); + AliHelix mhelix(fParamMother); + // + //find intersection linear + // + Double_t phase[2][2],radius[2]; + Double_t delta1=10000,delta2=10000; + Int_t points=0; + /* + Float_t distance1=0; + Int_t points = dhelix1.GetRPHIintersections(mhelix, phase, radius,200); + + if (points>0){ + dhelix1.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + } + if (points==2){ + dhelix1.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + } + distance1 = TMath::Min(delta1,delta2); + */ + // + //find intersection parabolic + // + points = dhelix1.GetRPHIintersections(mhelix, phase, radius,7); + + delta1=10000,delta2=10000; + Double_t d1=1000.,d2=10000.; + if (points>0){ + dhelix1.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1,6); + // dhelix1.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + Double_t xd[3],xm[3]; + dhelix1.Evaluate(phase[0][0],xd); + mhelix.Evaluate(phase[0][1],xm); + d1 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]); + } + if (points==2){ + dhelix1.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2,6); + //dhelix1.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + Double_t xd[3],xm[3]; + dhelix1.Evaluate(phase[1][0],xd); + mhelix.Evaluate(phase[1][1],xm); + d2 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]); + } + // + distance2 = TMath::Min(delta1,delta2); + if (delta1 + +#include "AliV0.h" +#include "AliHelix.h" + + +ClassImp(AliV0) + +void AliV0::Update(Float_t vertex[3]) +{ + // + // updates Kink Info + // + // Float_t distance1,distance2; + Float_t distance2; + // + AliHelix phelix(fParamP); + AliHelix mhelix(fParamM); + // + //find intersection linear + // + Double_t phase[2][2],radius[2]; + Int_t points = phelix.GetRPHIintersections(mhelix, phase, radius,200); + Double_t delta1=10000,delta2=10000; + /* + if (points<=0) return; + if (points>0){ + phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + phelix.LinearDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + } + if (points==2){ + phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + phelix.LinearDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + } + distance1 = TMath::Min(delta1,delta2); + */ + // + //find intersection parabolic + // + points = phelix.GetRPHIintersections(mhelix, phase, radius); + delta1=10000,delta2=10000; + Double_t d1=1000.,d2=10000.; + Double_t err[3],angles[3]; + if (points<=0) return; + if (points>0){ + phelix.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + phelix.ParabolicDCA(mhelix,phase[0][0],phase[0][1],radius[0],delta1); + if (TMath::Abs(fParamP.GetX()-TMath::Sqrt(radius[0])<3) && TMath::Abs(fParamM.GetX()-TMath::Sqrt(radius[0])<3)){ + // if we are close to vertex use error parama + // + err[1] = fParamP.GetCovariance()[0]+fParamM.GetCovariance()[0]+0.05*0.05 + +0.3*(fParamP.GetCovariance()[2]+fParamM.GetCovariance()[2]); + err[2] = fParamP.GetCovariance()[2]+fParamM.GetCovariance()[2]+0.05*0.05 + +0.3*(fParamP.GetCovariance()[0]+fParamM.GetCovariance()[0]); + + phelix.GetAngle(phase[0][0],mhelix,phase[0][1],angles); + Double_t tfi = TMath::Abs(TMath::Tan(angles[0])); + Double_t tlam = TMath::Abs(TMath::Tan(angles[1])); + err[0] = err[1]/((0.2+tfi)*(0.2+tfi))+err[2]/((0.2+tlam)*(0.2+tlam)); + err[0] = ((err[1]*err[2]/((0.2+tfi)*(0.2+tfi)*(0.2+tlam)*(0.2+tlam))))/err[0]; + phelix.ParabolicDCA2(mhelix,phase[0][0],phase[0][1],radius[0],delta1,err); + } + Double_t xd[3],xm[3]; + phelix.Evaluate(phase[0][0],xd); + mhelix.Evaluate(phase[0][1],xm); + d1 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]); + } + if (points==2){ + phelix.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + phelix.ParabolicDCA(mhelix,phase[1][0],phase[1][1],radius[1],delta2); + if (TMath::Abs(fParamP.GetX()-TMath::Sqrt(radius[1])<3) && TMath::Abs(fParamM.GetX()-TMath::Sqrt(radius[1])<3)){ + // if we are close to vertex use error paramatrization + // + err[1] = fParamP.GetCovariance()[0]+fParamM.GetCovariance()[0]+0.05*0.05 + +0.3*(fParamP.GetCovariance()[2]+fParamM.GetCovariance()[2]); + err[2] = fParamP.GetCovariance()[2]+fParamM.GetCovariance()[2]+0.05*0.05 + +0.3*(fParamP.GetCovariance()[0]+fParamM.GetCovariance()[0]); + + phelix.GetAngle(phase[1][0],mhelix,phase[1][1],angles); + Double_t tfi = TMath::Abs(TMath::Tan(angles[0])); + Double_t tlam = TMath::Abs(TMath::Tan(angles[1])); + err[0] = err[1]/((0.2+tfi)*(0.2+tfi))+err[2]/((0.2+tlam)*(0.2+tlam)); + err[0] = ((err[1]*err[2]/((0.2+tfi)*(0.2+tfi)*(0.2+tlam)*(0.2+tlam))))/err[0]; + phelix.ParabolicDCA2(mhelix,phase[1][0],phase[1][1],radius[1],delta2,err); + } + Double_t xd[3],xm[3]; + phelix.Evaluate(phase[1][0],xd); + mhelix.Evaluate(phase[1][1],xm); + d2 = (xd[0]-xm[0])*(xd[0]-xm[0])+(xd[1]-xm[1])*(xd[1]-xm[1])+(xd[2]-xm[2])*(xd[2]-xm[2]); + } + // + distance2 = TMath::Min(delta1,delta2); + if (delta1100000) return; + Double_t vnorm3 = TMath::Sqrt(TMath::Abs(v[2]*v[2]+vnorm2)); + vnorm2 = TMath::Sqrt(vnorm2); + Double_t pnorm2 = p[0]*p[0]+p[1]*p[1]; + Double_t pnorm3 = TMath::Sqrt(p[2]*p[2]+pnorm2); + pnorm2 = TMath::Sqrt(pnorm2); + fPointAngleFi = (v[0]*p[0]+v[1]*p[1])/(vnorm2*pnorm2); + fPointAngleTh = (v[2]*p[2]+vnorm2*pnorm2)/(vnorm3*pnorm3); + fPointAngle = (v[0]*p[0]+v[1]*p[1]+v[2]*p[2])/(vnorm3*pnorm3); + // +} + diff --git a/STEER/AliV0.h b/STEER/AliV0.h new file mode 100644 index 00000000000..aca70a04af6 --- /dev/null +++ b/STEER/AliV0.h @@ -0,0 +1,24 @@ +#ifndef ALIV0_H +#define ALIV0_H + +/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * + * See cxx source for full Copyright notice */ + + +//------------------------------------------------------------------------- +// V0 Vertex Class +// This class is part of the reconstruction +// Origin: Marian Ivanov marian.ivanov@cern.ch +//------------------------------------------------------------------------- + +#include "AliESDV0MI.h" + +class AliV0 : public AliESDV0MI { +public: + AliV0(){;} + void Update(Float_t vertex[3]); //update + ClassDef(AliV0,1) // V0 MI vertex +}; + + +#endif diff --git a/STEER/AliVertexerTracks.cxx b/STEER/AliVertexerTracks.cxx index 8802526c8ad..661dff7e264 100644 --- a/STEER/AliVertexerTracks.cxx +++ b/STEER/AliVertexerTracks.cxx @@ -840,7 +840,7 @@ void AliVertexerTracks::VertexFitter(Bool_t useNominalVtx) { t = (AliESDtrack*)fTrkArray.At(k); alpha = t->GetAlpha(); xlStart = initPos[0]*TMath::Cos(alpha)+initPos[1]*TMath::Sin(alpha); - t->PropagateTo(xlStart,AliTracker::GetBz()); // to vtxSeed + t->AliExternalTrackParam::PropagateTo(xlStart,AliTracker::GetBz()); // to vtxSeed rotAngle = alpha; if(alpha<0.) rotAngle += 2.*TMath::Pi(); cosRot = TMath::Cos(rotAngle); diff --git a/STEER/ESDLinkDef.h b/STEER/ESDLinkDef.h index 2e2783c89e1..66066640f36 100644 --- a/STEER/ESDLinkDef.h +++ b/STEER/ESDLinkDef.h @@ -29,7 +29,6 @@ #pragma link C++ class AliESDCaloCluster+; #pragma link C++ class AliKalmanTrack+; -#pragma link C++ class AliHelix+; #pragma link C++ class AliExternalTrackParam+; #pragma link C++ class AliLog+; #pragma link C++ class AliPID+; @@ -49,7 +48,6 @@ #pragma link C++ class AliTrackPointArray+; #pragma link C++ class AliTrackPoint+; -#pragma link C++ class AliCluster+; #pragma link C++ class AliESDFMD+; #pragma link C++ class AliFMDMap+; @@ -57,7 +55,6 @@ #pragma link C++ class AliESDMultITS+; #pragma link C++ class AliMultiplicity+; -#pragma link C++ class AliTracker+; #endif diff --git a/STEER/STEERLinkDef.h b/STEER/STEERLinkDef.h index 47d61ddefa8..a2dc81afe19 100644 --- a/STEER/STEERLinkDef.h +++ b/STEER/STEERLinkDef.h @@ -116,5 +116,10 @@ #pragma link C++ class AliCTPRawStream+; #pragma link C++ class AliMathBase+; #pragma link C++ class AliSignalProcesor+; +#pragma link C++ class AliHelix+; +#pragma link C++ class AliCluster+; +#pragma link C++ class AliTracker+; +#pragma link C++ class AliV0+; +#pragma link C++ class AliKink+; #endif diff --git a/STEER/libESD.pkg b/STEER/libESD.pkg index 4f52b26ec3e..3005d009ad3 100644 --- a/STEER/libESD.pkg +++ b/STEER/libESD.pkg @@ -4,14 +4,14 @@ SRCS = AliESD.cxx AliESDfriend.cxx\ AliESDv0.cxx AliESDcascade.cxx AliVertex.cxx AliESDVertex.cxx \ AliESDpid.cxx AliESDkink.cxx AliESDV0MI.cxx \ AliESDCaloCluster.cxx \ - AliKalmanTrack.cxx AliHelix.cxx AliExternalTrackParam.cxx \ + AliKalmanTrack.cxx AliExternalTrackParam.cxx \ AliLog.cxx AliPID.cxx AliESDV0MIParams.cxx \ AliRunTag.cxx AliLHCTag.cxx AliDetectorTag.cxx AliEventTag.cxx \ AliTagCreator.cxx AliTagAnalysis.cxx AliEventTagCuts.cxx AliRunTagCuts.cxx\ - AliTrackPointArray.cxx AliCluster.cxx \ + AliTrackPointArray.cxx \ AliESDFMD.cxx AliFMDMap.cxx AliFMDFloatMap.cxx \ AliESDMultITS.cxx \ - AliTracker.cxx AliMultiplicity.cxx AliXMLCollection.cxx + AliMultiplicity.cxx AliXMLCollection.cxx HDRS:= $(SRCS:.cxx=.h) diff --git a/STEER/libSTEER.pkg b/STEER/libSTEER.pkg index 67d12efe44f..5be9f56e7a3 100644 --- a/STEER/libSTEER.pkg +++ b/STEER/libSTEER.pkg @@ -31,7 +31,8 @@ AliTrackResiduals.cxx AliTrackResidualsChi2.cxx AliTrackResidualsFast.cxx AliTra AliAlignmentTracks.cxx \ AliExpression.cxx \ AliCTPRawData.cxx AliCTPRawStream.cxx \ -AliMathBase.cxx AliSignalProcesor.cxx +AliMathBase.cxx AliSignalProcesor.cxx \ +AliTracker.cxx AliCluster.cxx AliHelix.cxx AliV0.cxx AliKink.cxx HDRS:= $(SRCS:.cxx=.h) diff --git a/TOF/AliTOFtrack.cxx b/TOF/AliTOFtrack.cxx index 24f7431aaa3..47309c9b431 100644 --- a/TOF/AliTOFtrack.cxx +++ b/TOF/AliTOFtrack.cxx @@ -26,9 +26,9 @@ ///////////////////////////////////////////////////////////////////////////// #include "AliESDtrack.h" -#include "AliLog.h" +#include "AliTracker.h" -#include "AliTOFGeometryV5.h" +#include "AliTOFGeometryV4.h" #include "AliTOFGeometry.h" #include "AliTOFtrack.h" @@ -39,156 +39,46 @@ AliTOFtrack::AliTOFtrack() : AliKalmanTrack(), fSeedInd(-1), fSeedLab(-1), - fAlpha(0), - fX(0), - fY(0), - fZ(0), - fE(0), - fT(0), - fC(0), - fCyy(0), - fCzy(0), - fCzz(0), - fCey(0), - fCez(0), - fCee(0), - fCty(0), - fCtz(0), - fCte(0), - fCtt(0), - fCcy(0), - fCcz(0), - fCce(0), - fCct(0), - fCcc(0), - fTOFgeometry(0x0) - { -}//_____________________________________________________________________________ -AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) : AliKalmanTrack(t), - fSeedInd(-1), - fSeedLab(-1), - fAlpha(0), - fX(0), - fY(0), - fZ(0), - fE(0), - fT(0), - fC(0), - fCyy(0), - fCzy(0), - fCzz(0), - fCey(0), - fCez(0), - fCee(0), - fCty(0), - fCtz(0), - fCte(0), - fCtt(0), - fCcy(0), - fCcz(0), - fCce(0), - fCct(0), - fCcc(0), - fTOFgeometry(0x0) - { + fTOFgeometry(0) +{ // - // Copy constructor. + // Default constructor. // - - SetSeedIndex(t.GetSeedIndex()); - SetLabel(t.GetLabel()); - fSeedLab=t.GetSeedLabel(); - SetChi2(t.GetChi2()); - - fAlpha=t.fAlpha; - fX=t.fX; - - fY=t.fY; fZ=t.fZ; fE=t.fE; fT=t.fT; fC=t.fC; - - fCyy=t.fCyy; - fCzy=t.fCzy; fCzz=t.fCzz; - fCey=t.fCey; fCez=t.fCez; fCee=t.fCee; - fCty=t.fCty; fCtz=t.fCtz; fCte=t.fCte; fCtt=t.fCtt; - fCcy=t.fCcy; fCcz=t.fCcz; fCce=t.fCce; fCct=t.fCct; fCcc=t.fCcc; - - fTOFgeometry = new AliTOFGeometryV5(); +} +//_____________________________________________________________________________ +AliTOFtrack::AliTOFtrack(const AliTOFtrack& t) : + AliKalmanTrack(t), + fSeedInd(t.fSeedInd), + fSeedLab(t.fSeedLab), + fTOFgeometry(new AliTOFGeometryV4()) +{ + // + // Copy constructor. + // } //_____________________________________________________________________________ -AliTOFtrack::AliTOFtrack(const AliESDtrack& t): - AliKalmanTrack(), +AliTOFtrack::AliTOFtrack(const AliESDtrack& t) : + AliKalmanTrack(), fSeedInd(-1), fSeedLab(-1), - fAlpha(0), - fX(0), - fY(0), - fZ(0), - fE(0), - fT(0), - fC(0), - fCyy(0), - fCzy(0), - fCzz(0), - fCey(0), - fCez(0), - fCee(0), - fCty(0), - fCtz(0), - fCte(0), - fCtt(0), - fCcy(0), - fCcz(0), - fCce(0), - fCct(0), - fCcc(0), - fTOFgeometry(0x0) - { + fTOFgeometry(new AliTOFGeometryV4()) +{ // // Constructor from AliESDtrack // - - fTOFgeometry = new AliTOFGeometryV5(); - - SetSeedIndex(-1); SetLabel(t.GetLabel()); SetChi2(0.); SetMass(t.GetMass()); - fAlpha = t.GetAlpha(); - if (fAlpha < -TMath::Pi()) fAlpha += 2*TMath::Pi(); - else if (fAlpha >= TMath::Pi()) fAlpha -= 2*TMath::Pi(); - Double_t x, p[5]; t.GetExternalParameters(x,p); - - fX=x; - - fY=p[0]; - fZ=p[1]; SaveLocalConvConst(); - fT=p[3]; x=GetLocalConvConst(); - fC=p[4]/x; - fE=fC*fX - p[2]; - - //Conversion of the covariance matrix - Double_t c[15]; t.GetExternalCovariance(c); - - c[10]/=x; c[11]/=x; c[12]/=x; c[13]/=x; c[14]/=x*x; - - 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]; - - fCyy=c[0 ]; - fCzy=c[1 ]; fCzz=c[2 ]; - fCey=c20; fCez=c21; fCee=c22; - fCty=c[6 ]; fCtz=c[7 ]; fCte=c32; fCtt=c[9 ]; - fCcy=c[10]; fCcz=c[11]; fCce=c42; fCct=c[13]; fCcc=c[14]; + Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance()); if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return; StartTimeIntegral(); Double_t times[10]; t.GetIntegratedTimes(times); SetIntegratedTimes(times); SetIntegratedLength(t.GetIntegratedLength()); - } //____________________________________________________________________________ @@ -201,151 +91,28 @@ AliTOFtrack& AliTOFtrack::operator=(const AliTOFtrack &source) } -//____________________________________________________________________________ -void AliTOFtrack::GetExternalParameters(Double_t& xr, Double_t x[5]) const { - // - // This function returns external TOF track representation - // - xr=fX; - x[0]=GetY(); - x[1]=GetZ(); - x[2]=GetSnp(); - x[3]=GetTgl(); - x[4]=Get1Pt(); -} - -//_____________________________________________________________________________ -void AliTOFtrack::GetExternalCovariance(Double_t cc[15]) const { - // - // This function returns external representation of the covriance matrix. - // - Double_t a=GetLocalConvConst(); - Double_t c22=fX*fX*fCcc-2*fX*fCce+fCee; - Double_t c32=fX*fCct-fCte; - Double_t c20=fX*fCcy-fCey, c21=fX*fCcz-fCez, c42=fX*fCcc-fCce; - - 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]=fCct*a; cc[14]=fCcc*a*a; - -} - - //_____________________________________________________________________________ -void AliTOFtrack::GetCovariance(Double_t cc[15]) const { - // - // Returns the covariance matrix. - // - - cc[0]=fCyy; - cc[1]=fCzy; cc[2]=fCzz; - cc[3]=fCey; cc[4]=fCez; cc[5]=fCee; - cc[6]=fCcy; cc[7]=fCcz; cc[8]=fCce; cc[9]=fCcc; - cc[10]=fCty; cc[11]=fCtz; cc[12]=fCte; cc[13]=fCct; cc[14]=fCtt; - -} - - -//_____________________________________________________________________________ -Int_t AliTOFtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho) +Bool_t AliTOFtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho) { // Propagates a track of particle with mass=pm to a reference plane // defined by x=xk through media of density=rho and radiationLength=x0 - if (xk == fX) return 1; + if (xk == GetX()) return kTRUE; - if (TMath::Abs(fC*xk - fE) >= 0.90000) { - return 0; - } - Double_t lcc=GetLocalConvConst(); + Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ(); - // track Length measurement [SR, GSI, 17.02.2003] + Double_t bz=GetBz(); + if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE; - Double_t oldX = fX, oldY = fY, oldZ = fZ; + Double_t d = TMath::Sqrt((GetX()-oldX)*(GetX()-oldX) + + (GetY()-oldY)*(GetY()-oldY) + + (GetZ()-oldZ)*(GetZ()-oldZ)); + if (IsStartedTimeIntegral() && GetX()>oldX) AddTimeStep(d); + + if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass())) + return kFALSE; - Double_t x1=fX, x2=x1+(xk-x1), dx=x2-x1, y1=fY, z1=fZ; - Double_t c1=fC*x1 - fE; - if((c1*c1) > 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*(2*rr + cc*(c1/r1 + c2/r2))/(rr*rr); - Double_t f04= dx*(rr*xx + cc*(c1*x1/r1+c2*x2/r2))/(rr*rr); - Double_t cr=c1*r2+c2*r1; - Double_t f12=-dx*fT*(2*cr + cc*(c2*c1/r1-r1 + c1*c2/r2-r2))/(cr*cr); - Double_t f13= dx*cc/cr; - Double_t f14=dx*fT*(cr*xx-cc*(r1*x2-c2*c1*x1/r1+r2*x1-c1*c2*x2/r2))/(cr*cr); - - //b = C*ft - Double_t b00=f02*fCey + f04*fCcy, b01=f12*fCey + f14*fCcy + f13*fCty; - Double_t b10=f02*fCez + f04*fCcz, b11=f12*fCez + f14*fCcz + f13*fCtz; - Double_t b20=f02*fCee + f04*fCce, b21=f12*fCee + f14*fCce + f13*fCte; - Double_t b30=f02*fCte + f04*fCct, b31=f12*fCte + f14*fCct + f13*fCtt; - Double_t b40=f02*fCce + f04*fCcc, b41=f12*fCce + f14*fCcc + f13*fCct; - - //a = f*b = f*C*ft - Double_t a00=f02*b20+f04*b40,a01=f02*b21+f04*b41,a11=f12*b21+f14*b41+f13*b31; - - //F*C*Ft = C + (a + b + bt) - fCyy += a00 + 2*b00; - fCzy += a01 + b01 + b10; - fCey += b20; - fCty += b30; - fCcy += b40; - fCzz += a11 + 2*b11; - fCez += b21; - fCtz += b31; - fCcz += b41; - - fX=x2; - - //Change of the magnetic field ************* - SaveLocalConvConst(); - cc=fC; - fC*=lcc/GetLocalConvConst(); - fE+=fX*(fC-cc); - - //Multiple scattering ****************** - Double_t d=sqrt((x1-fX)*(x1-fX)+(y1-fY)*(y1-fY)+(z1-fZ)*(z1-fZ)); - Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt()); - Double_t beta2=p2/(p2 + GetMass()*GetMass()); - Double_t theta2=14.1*14.1/(beta2*p2*1e6)*d/x0*rho; - - Double_t ey=fC*fX - fE, ez=fT; - Double_t xz=fC*ez, zz1=ez*ez+1, xy=fE+ey; - - 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; - fCce += xz*ez*xy*theta2; - fCct += xz*zz1*theta2; - fCcc += xz*xz*theta2; /* - Double_t dc22 = (1-ey*ey+xz*xz*fX*fX)*theta2; - Double_t dc32 = (xz*fX*zz1)*theta2; - Double_t dc33 = (zz1*zz1)*theta2; - Double_t dc42 = (xz*fX*xz)*theta2; - Double_t dc43 = (zz1*xz)*theta2; - Double_t dc44 = (xz*xz)*theta2; - fCee += dc22; - fCte += dc32; - fCtt += dc33; - fCce += dc42; - fCct += dc43; - fCcc += dc44; - */ //Energy losses************************ if((5940*beta2/(1-beta2+1e-10) - beta2) < 0){return 0;} @@ -355,25 +122,13 @@ Int_t AliTOFtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho) 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 - // - // - if (x1 < x2) dE=-dE; - cc=fC; - fC*=(1.- sqrt(p2+GetMass()*GetMass())/p2*dE); - fE+=fX*(fC-cc); - - // track time measurement [SR, GSI 17.02.2002] - if (x1 < x2) - if (IsStartedTimeIntegral()) { - Double_t l2 = (fX-oldX)*(fX-oldX) + (fY-oldY)*(fY-oldY) + (fZ-oldZ)*(fZ-oldZ); - AddTimeStep(TMath::Sqrt(l2)); - } + */ - return 1; + return kTRUE; } //_____________________________________________________________________________ -Int_t AliTOFtrack::PropagateToInnerTOF( Bool_t holes) +Bool_t AliTOFtrack::PropagateToInnerTOF(Bool_t holes) { // Propagates a track of particle with mass=pm to a reference plane // defined by x=xk through media of density=rho and radiationLength=x0 @@ -382,16 +137,16 @@ Int_t AliTOFtrack::PropagateToInnerTOF( Bool_t holes) Double_t ymax=fTOFgeometry->RinTOF()*TMath::Tan(0.5*AliTOFGeometry::GetAlpha()); Bool_t skip = kFALSE; Double_t y=GetYat(fTOFgeometry->RinTOF(),skip); - if(skip){ - return 0; + if (skip) { + return kFALSE; } if (y > ymax) { if (!Rotate(AliTOFGeometry::GetAlpha())) { - return 0; + return kFALSE; } } else if (y <-ymax) { if (!Rotate(-AliTOFGeometry::GetAlpha())) { - return 0; + return kFALSE; } } @@ -408,143 +163,20 @@ Int_t AliTOFtrack::PropagateToInnerTOF( Bool_t holes) if(!PropagateTo(fTOFgeometry->RinTOF()))return 0; - return 1; + return kTRUE; } -//_____________________________________________________________________________ -Int_t AliTOFtrack::Rotate(Double_t alpha) -{ - // Rotates track parameters in R*phi plane - - - fAlpha += alpha; - if (fAlpha<-TMath::Pi()) fAlpha += 2*TMath::Pi(); - if (fAlpha>=TMath::Pi()) fAlpha -= 2*TMath::Pi(); - - Double_t x1=fX, y1=fY; - Double_t ca=cos(alpha), sa=sin(alpha); - Double_t r1=fC*fX - fE; - - fX = x1*ca + y1*sa; - fY =-x1*sa + y1*ca; - if((r1*r1) > 1) return 0; - fE=fE*ca + (fC*y1 + sqrt(1.- r1*r1))*sa; - - Double_t r2=fC*fX - fE; - if (TMath::Abs(r2) >= 0.90000) { - AliWarning("Rotation failed !"); - return 0; - } - - if((r2*r2) > 1) return 0; - Double_t y0=fY + sqrt(1.- r2*r2)/fC; - if ((fY-y0)*fC >= 0.) { - AliWarning("Rotation failed !!!"); - return 0; - } - - //f = F - 1 - Double_t f00=ca-1, f24=(y1 - r1*x1/sqrt(1.- r1*r1))*sa, - f20=fC*sa, f22=(ca + sa*r1/sqrt(1.- r1*r1))-1; - - //b = C*ft - Double_t b00=fCyy*f00, b02=fCyy*f20+fCcy*f24+fCey*f22; - Double_t b10=fCzy*f00, b12=fCzy*f20+fCcz*f24+fCez*f22; - Double_t b20=fCey*f00, b22=fCey*f20+fCce*f24+fCee*f22; - Double_t b30=fCty*f00, b32=fCty*f20+fCct*f24+fCte*f22; - Double_t b40=fCcy*f00, b42=fCcy*f20+fCcc*f24+fCce*f22; - - //a = f*b = f*C*ft - Double_t a00=f00*b00, a02=f00*b02, a22=f20*b02+f24*b42+f22*b22; - - //F*C*Ft = C + (a + b + bt) - fCyy += a00 + 2*b00; - fCzy += b10; - fCey += a02+b20+b02; - fCty += b30; - fCcy += b40; - fCez += b12; - fCte += b32; - fCee += a22 + 2*b22; - fCce += b42; - - return 1; -} - //_________________________________________________________________________ Double_t AliTOFtrack::GetYat(Double_t xk, Bool_t & skip) const { //----------------------------------------------------------------- // This function calculates the Y-coordinate of a track at the plane x=xk. // Needed for matching with the TOF (I.Belikov) //----------------------------------------------------------------- - skip=kFALSE; - Double_t c1=fC*fX - fE, r1=TMath::Sqrt(TMath::Abs(1.- c1*c1)); - Double_t c2=fC*xk - fE, r2=TMath::Sqrt(TMath::Abs(1.- c2*c2)); - if( ((1.- c2*c2)<0) || ((1.- c1*c1)<0) ) skip=kTRUE; - return fY + (xk-fX)*(c1+c2)/(r1+r2); + Double_t y=0.; + skip=(!GetYAt(xk,GetBz(),y)); + return y; } -//_________________________________________________________________________ -void AliTOFtrack::GetPxPyPz(Double_t& px, Double_t& py, Double_t& pz) const -{ - // Returns reconstructed track momentum in the global system. - - Double_t pt=TMath::Abs(GetPt()); // GeV/c - Double_t r=fC*fX-fE; - - 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 AliTOFtrack::GetGlobalXYZ(Double_t& x, Double_t& y, Double_t& z) const -{ - // Returns reconstructed track coordinates in the global system. - - 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; - -} - -//_________________________________________________________________________ -void AliTOFtrack::ResetCovariance() { - // - // Resets covariance matrix - // - - fCyy*=10.; - fCzy=0.; fCzz*=10.; - fCey=0.; fCez=0.; fCee*=10.; - fCty=0.; fCtz=0.; fCte=0.; fCtt*=10.; - fCcy=0.; fCcz=0.; fCce=0.; fCct=0.; fCcc*=10.; -} - - -//_________________________________________________________________________ -void AliTOFtrack::ResetCovariance(Float_t mult) { - // - // Resets covariance matrix - // - - fCyy*=mult; - fCzy*=0.; fCzz*=mult; - fCey*=0.; fCez*=0.; fCee*=mult; - fCty*=0.; fCtz*=0.; fCte*=0.; fCtt*=mult; - fCcy*=0.; fCcz*=0.; fCce*=0.; fCct*=0.; fCcc*=mult; -} //_____________________________________________________________________________ Int_t AliTOFtrack::Compare(const TObject *o) const { @@ -559,6 +191,15 @@ Int_t AliTOFtrack::Compare(const TObject *o) const { return 0; } +Double_t AliTOFtrack::GetBz() const { + // + // returns Bz component of the magnetic field (kG) + // + if (AliTracker::UniformField()) return AliTracker::GetBz(); + Double_t r[3]; GetXYZ(r); + return AliTracker::GetBz(r); +} + //_____________________________________________________________________________ void AliTOFtrack::GetPropagationParameters(Bool_t holes, Double_t *param) { @@ -588,9 +229,8 @@ void AliTOFtrack::GetPropagationParameters(Bool_t holes, Double_t *param) { Double_t rhoTRD =0.33; Int_t isec = GetSector(); - Double_t xtr,ytr,ztr; - GetGlobalXYZ(xtr,ytr,ztr); - Float_t thetatr = TMath::ATan2(TMath::Sqrt(xtr*xtr+ytr*ytr),ztr); + Double_t r[3]; GetXYZ(r); + Float_t thetatr = TMath::ATan2(TMath::Sqrt(r[0]*r[0]+r[1]*r[1]),r[2]); if(holes){ if (isec == 0 || isec == 1 || isec == 2 ) { @@ -600,7 +240,7 @@ void AliTOFtrack::GetPropagationParameters(Bool_t holes, Double_t *param) { } } if (isec == 11 || isec == 12 || isec == 13 || isec == 14 || isec == 15 ) { - if( ztr>=zmin && ztr<=zmax){ + if( r[2]>=zmin && r[2]<=zmax){ x0TRD= x0Air; rhoTRD = rhoAir; } diff --git a/TOF/AliTOFtrack.h b/TOF/AliTOFtrack.h index 9d149eadc16..079269d4606 100644 --- a/TOF/AliTOFtrack.h +++ b/TOF/AliTOFtrack.h @@ -25,94 +25,45 @@ class AliTOFtrack : public AliKalmanTrack { public: - AliTOFtrack(); + AliTOFtrack(); AliTOFtrack(const AliTOFtrack& t); AliTOFtrack(const AliESDtrack& t); AliTOFtrack& operator=(const AliTOFtrack &source); // ass. op. - Double_t GetAlpha() const {return fAlpha;} Int_t GetSector() const { - return Int_t(TVector2::Phi_0_2pi(fAlpha)/AliTOFGeometry::GetAlpha())%AliTOFGeometry::NSectors();} + return Int_t(TVector2::Phi_0_2pi(GetAlpha())/AliTOFGeometry::GetAlpha())%AliTOFGeometry::NSectors();} - Double_t GetC() const {return fC;} - void GetCovariance(Double_t cov[15]) const; // track covariance - Double_t GetEta() const {return fE;} - - void GetExternalCovariance(Double_t cov[15]) const ;// track covariance - void GetExternalParameters(Double_t& xr, Double_t x[5]) const ;//track parameters - Double_t GetSigmaY2() const {return fCyy;} - Double_t GetSigmaZ2() const {return fCzz;} - - Double_t Get1Pt() const { - return (TMath::Sign(1e-9,fC) + fC)*GetLocalConvConst(); - } - Double_t GetP() const { - return TMath::Abs(GetPt())*sqrt(1.+GetTgl()*GetTgl()); - } - Double_t GetPt() const {return 1./Get1Pt();} - void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const ; - void GetGlobalXYZ(Double_t &x, Double_t &y, Double_t &z) const ; Int_t GetSeedLabel() const { return fSeedLab; } Int_t GetSeedIndex() const { return fSeedInd; } void SetSeedLabel(Int_t lab) { fSeedLab=lab; } void SetSeedIndex(Int_t ind) { fSeedInd=ind; } - Double_t GetSnp() const {return fX*fC - fE;} - Double_t GetTgl() const {return fT;} - Double_t GetX() const {return fX;} - Double_t GetY() const {return fY;} - Double_t GetZ() const {return fZ;} Int_t Compare(const TObject *o) const; - Double_t GetYat(Double_t xk, Bool_t & skip) const; - Int_t PropagateTo(Double_t xr, Double_t x0=8.72, Double_t rho=5.86e-3); - Int_t PropagateToInnerTOF(Bool_t holes); - void ResetCovariance(); - void ResetCovariance(Float_t mult); - Int_t Rotate(Double_t angle); + Bool_t PropagateTo(Double_t xr, Double_t x0=8.72, Double_t rho=5.86e-3); + Bool_t PropagateToInnerTOF(Bool_t holes); + Bool_t Rotate(Double_t angle) { + return AliExternalTrackParam::Rotate(GetAlpha()+angle); + } protected: - void GetXYZ(Float_t r[3]) const; - - Int_t Update(const AliCluster */*c*/, Double_t /*chi2*/, UInt_t /*idx*/) { + Double_t GetBz() const; + Bool_t Update(const AliCluster */*c*/, Double_t /*chi2*/, Int_t /*idx*/) { return 0; } Double_t GetPredictedChi2(const AliCluster */*c*/) const {return 0.;} - + Int_t fSeedInd; // ESD seed track index Int_t fSeedLab; // track label taken from seeding - Double_t fAlpha; // rotation angle - Double_t fX; // running local X-coordinate of the track (time bin) - - Double_t fY; // Y-coordinate of the track - Double_t fZ; // Z-coordinate of the track - Double_t fE; // C*x0 - Double_t fT; // tangent of the track momentum dip angle - Double_t fC; // track curvature - - Double_t fCyy; // covariance - Double_t fCzy, fCzz; // matrix - Double_t fCey, fCez, fCee; // of the - Double_t fCty, fCtz, fCte, fCtt; // track - Double_t fCcy, fCcz, fCce, fCct, fCcc; // parameters - AliTOFGeometry *fTOFgeometry; // pointer to the TOF geometry private: void GetPropagationParameters(Bool_t holes, Double_t *param); - ClassDef(AliTOFtrack,0) // TOF reconstructed tracks + ClassDef(AliTOFtrack,1) // TOF reconstructed tracks }; -inline void AliTOFtrack::GetXYZ(Float_t r[3]) const { - //--------------------------------------------------------------------- - // Returns the position of the track in the global coord. system - //--------------------------------------------------------------------- - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - r[0]=fX*cs - fY*sn; r[1]=fX*sn + fY*cs; r[2]=fZ; -} - #endif diff --git a/TOF/AliTOFtracker.cxx b/TOF/AliTOFtracker.cxx index 54877d21199..b44c706fe1f 100644 --- a/TOF/AliTOFtracker.cxx +++ b/TOF/AliTOFtracker.cxx @@ -212,8 +212,6 @@ Int_t AliTOFtracker::PropagateBack(AliESD* event) { t->SetTOFcluster(seed->GetTOFcluster()); t->SetTOFsignalToT(seed->GetTOFsignalToT()); t->SetTOFCalChannel(seed->GetTOFCalChannel()); - Int_t tlab[3]; seed->GetTOFLabel(tlab); - t->SetTOFLabel(tlab); AliTOFtrack *track = new AliTOFtrack(*seed); t->UpdateTrackParams(track,AliESDtrack::kTOFout); delete track; @@ -318,6 +316,7 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ trackTOFin->GetExternalParameters(x,par); Double_t cov[15]; trackTOFin->GetExternalCovariance(cov); + Float_t scalefact=3.; Double_t dphi= scalefact* @@ -325,7 +324,7 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ Double_t dz= scalefact* (5*TMath::Sqrt(cov[2]) + 0.5*fDz + 2.5*TMath::Abs(par[3])); - + Double_t phi=TMath::ATan2(par[0],x) + trackTOFin->GetAlpha(); if (phi<-TMath::Pi())phi+=2*TMath::Pi(); if (phi>=TMath::Pi())phi-=2*TMath::Pi(); @@ -346,14 +345,21 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ AliTOFcluster *c=fClusters[k]; if (c->GetZ() > z+dz) break; if (c->IsUsed()) continue; - if (!c->GetStatus()) continue; // skip bad channels as declared in OCDB - //AliInfo(Form(" fClusters[k]->GetZ() (%f) z-dz (%f) %4i ", fClusters[k]->GetZ(), z-dz, k)); Double_t dph=TMath::Abs(c->GetPhi()-phi); if (dph>TMath::Pi()) dph-=2.*TMath::Pi(); if (TMath::Abs(dph)>dphi) continue; - + + { + Double_t maxChi2=150.; // "calibratin constant". Needs to be tuned. + Double_t yc=(c->GetPhi() - trackTOFin->GetAlpha())*c->GetR(); + Double_t p[2]={yc, c->GetZ()}; + Double_t cov[3]={fDy*fDy/12., 0., fDz*fDz/12.}; + if (trackTOFin->AliExternalTrackParam::GetPredictedChi2(p,cov) > 150.) + continue; + } + clind[0][nc] = c->GetDetInd(0); clind[1][nc] = c->GetDetInd(1); clind[2][nc] = c->GetDetInd(2); @@ -385,7 +391,7 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ Bool_t skip=kFALSE; Double_t ysect=trackTOFin->GetYat(xs,skip); - if(skip)break; + if (skip) break; if (ysect > ymax) { if (!trackTOFin->Rotate(AliTOFGeometry::GetAlpha())) { break; @@ -404,11 +410,11 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ // store the running point (Globalrf) - fine propagation - Double_t x,y,z; - trackTOFin->GetGlobalXYZ(x,y,z); - trackPos[0][istep]= (Float_t) x; - trackPos[1][istep]= (Float_t) y; - trackPos[2][istep]= (Float_t) z; + Double_t r[3]; + trackTOFin->GetXYZ(r); + trackPos[0][istep]= (Float_t) r[0]; + trackPos[1][istep]= (Float_t) r[1]; + trackPos[2][istep]= (Float_t) r[2]; trackPos[3][istep]= trackTOFin->GetIntegratedLength(); } @@ -521,12 +527,6 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ ind[4]=c->GetDetInd(4); Int_t calindex = calib->GetIndex(ind); t->SetTOFCalChannel(calindex); - - // keep track of the track labels in the matched cluster - Int_t tlab[3]; - tlab[0]=c->GetLabel(0); - tlab[1]=c->GetLabel(1); - tlab[2]=c->GetLabel(2); Double_t tof=AliTOFGeometry::TdcBinWidth()*c->GetTDC()+32; // in ps t->SetTOFsignal(tof); @@ -544,7 +544,6 @@ void AliTOFtracker::MatchTracks( Bool_t mLastStep){ t->UpdateTrackParams(trackTOFout,AliESDtrack::kTOFout); t->SetIntegratedLength(recL); t->SetIntegratedTimes(time); - t->SetTOFLabel(tlab); delete trackTOFout; } diff --git a/TOF/AliTOFtrackerMI.cxx b/TOF/AliTOFtrackerMI.cxx index f965f9dfc7c..698429dfa47 100644 --- a/TOF/AliTOFtrackerMI.cxx +++ b/TOF/AliTOFtrackerMI.cxx @@ -798,8 +798,8 @@ Float_t AliTOFtrackerMI::GetLinearDistances(AliTOFtrack * track, AliTOFcluster * // Double_t v0[3]; Double_t dir[3]; - track->GetGlobalXYZ(v0[0],v0[1],v0[2]); - track->GetPxPyPz(dir[0],dir[1],dir[2]); + track->GetXYZ(v0); + track->GetPxPyPz(dir); dir[0]/=track->GetP(); dir[1]/=track->GetP(); dir[2]/=track->GetP(); diff --git a/TPC/AliTPCseed.cxx b/TPC/AliTPCseed.cxx index a36626dfe11..56ffe624527 100644 --- a/TPC/AliTPCseed.cxx +++ b/TPC/AliTPCseed.cxx @@ -167,10 +167,9 @@ AliTPCseed::AliTPCseed(const AliTPCtrack &t): for (Int_t i=0;i<12;i++) fOverlapLabels[i] = -1; } -AliTPCseed::AliTPCseed(UInt_t index, const Double_t xx[5], - const Double_t cc[15], - Double_t xr, Double_t alpha): - AliTPCtrack(index, xx, cc, xr, alpha), +AliTPCseed::AliTPCseed(Double_t xr, Double_t alpha, const Double_t xx[5], + const Double_t cc[15], Int_t index): + AliTPCtrack(xr, alpha, xx, cc, index), fEsd(0x0), fClusterOwner(kFALSE), fPoints(0x0), @@ -328,7 +327,7 @@ void AliTPCseed::Reset(Bool_t all) SetNumberOfClusters(0); fNFoundable = 0; SetChi2(0); - ResetCovariance(); + ResetCovariance(10.); /* if (fTrackPoints){ for (Int_t i=0;i<8;i++){ @@ -354,14 +353,11 @@ void AliTPCseed::Modify(Double_t factor) //This function makes a track forget its history :) //------------------------------------------------------------------ if (factor<=0) { - ResetCovariance(); + ResetCovariance(10.); return; } - fC00*=factor; - fC10*=0; fC11*=factor; - fC20*=0; fC21*=0; fC22*=factor; - fC30*=0; fC31*=0; fC32*=0; fC33*=factor; - fC40*=0; fC41*=0; fC42*=0; fC43*=0; fC44*=factor; + ResetCovariance(factor); + SetNumberOfClusters(0); fNFoundable =0; SetChi2(0); @@ -383,25 +379,25 @@ Int_t AliTPCseed::GetProlongation(Double_t xk, Double_t &y, Double_t & z) const // doesn't change internal state of the track //----------------------------------------------------------------- - Double_t x1=fX, x2=x1+(xk-x1), dx=x2-x1; + Double_t x1=GetX(), x2=x1+(xk-x1), dx=x2-x1; - if (TMath::Abs(fP4*xk - fP2) >= AliTPCReconstructor::GetMaxSnpTrack()) { + if (TMath::Abs(GetSnp()+GetC()*dx) >= AliTPCReconstructor::GetMaxSnpTrack()) { return 0; } // Double_t y1=fP0, z1=fP1; - Double_t c1=fP4*x1 - fP2, r1=sqrt(1.- c1*c1); - Double_t c2=fP4*x2 - fP2, r2=sqrt(1.- c2*c2); + Double_t c1=GetSnp(), r1=sqrt(1.- c1*c1); + Double_t c2=c1 + GetC()*dx, r2=sqrt(1.- c2*c2); - y = fP0; - z = fP1; + y = GetY(); + z = GetZ(); //y += dx*(c1+c2)/(r1+r2); //z += dx*(c1+c2)/(c1*r2 + c2*r1)*fP3; Double_t dy = dx*(c1+c2)/(r1+r2); Double_t dz = 0; // - Double_t delta = fP4*dx*(c1+c2)/(c1*r2 + c2*r1); + Double_t delta = GetC()*dx*(c1+c2)/(c1*r2 + c2*r1); /* if (TMath::Abs(delta)>0.0001){ dz = fP3*TMath::ASin(delta)/fP4; @@ -410,7 +406,7 @@ Int_t AliTPCseed::GetProlongation(Double_t xk, Double_t &y, Double_t & z) const } */ // dz = fP3*AliTPCFastMath::FastAsin(delta)/fP4; - dz = fP3*TMath::ASin(delta)/fP4; + dz = GetTgl()*TMath::ASin(delta)/GetC(); // y+=dy; z+=dz; @@ -426,24 +422,11 @@ Double_t AliTPCseed::GetPredictedChi2(const AliCluster *c) const //----------------------------------------------------------------- // This function calculates a predicted chi2 increment. //----------------------------------------------------------------- - //Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); - Double_t r00=fErrorY2, r01=0., r11=fErrorZ2; - r00+=fC00; r01+=fC10; r11+=fC11; - - Double_t det=r00*r11 - r01*r01; - if (TMath::Abs(det) < 1.e-10) { - //Int_t n=GetNumberOfClusters(); - //if (n>4) cerr<GetY() - fP0, dz=c->GetZ() - fP1; - - return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; + Double_t p[2]={c->GetY(), c->GetZ()}; + Double_t cov[3]={fErrorY2, 0., fErrorZ2}; + return AliExternalTrackParam::GetPredictedChi2(p,cov); } - //_________________________________________________________________________________________ @@ -452,7 +435,7 @@ Int_t AliTPCseed::Compare(const TObject *o) const { // This function compares tracks according to the sector - for given sector according z //----------------------------------------------------------------- AliTPCseed *t=(AliTPCseed*)o; - const Double_t kfC44mean = 0.0001; + if (fSort == 0){ if (t->fRelativeSector>fRelativeSector) return -1; if (t->fRelativeSectorfC44<0){ - AliError("Non positive covariance"); - t->Dump(); - return -1; - } - if (fC44<0){ - AliError("Non positive covariance"); - Dump(); - return 1; - } - // Float_t f2 =1; - f2 = 1./(kfC44mean+TMath::Sqrt(TMath::Abs(t->fC44))); + f2 = 1-20*TMath::Sqrt(t->GetSigma1Pt2())/(TMath::Abs(t->Get1Pt())+0.0066); if (t->fBConstrain) f2=1.2; Float_t f1 =1; - f1 = 1./(kfC44mean+TMath::Sqrt(TMath::Abs(fC44))); + f1 = 1-20*TMath::Sqrt(GetSigma1Pt2())/(TMath::Abs(Get1Pt())+0.0066); if (fBConstrain) f1=1.2; @@ -492,59 +464,22 @@ Int_t AliTPCseed::Compare(const TObject *o) const { //_____________________________________________________________________________ -Int_t AliTPCseed::Update(const AliCluster *c, Double_t chisq, UInt_t /*index*/) { +Bool_t AliTPCseed::Update(const AliCluster *c, Double_t chisq, Int_t /*index*/) +{ //----------------------------------------------------------------- // This function associates a cluster with this track. //----------------------------------------------------------------- - Double_t r00=fErrorY2, r01=0., r11=fErrorZ2; + Double_t p[2]={c->GetY(), c->GetZ()}; + Double_t cov[3]={fErrorY2, 0., fErrorZ2}; - r00+=fC00; r01+=fC10; r11+=fC11; - 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; - Double_t k30=fC30*r00+fC31*r01, k31=fC30*r01+fC31*r11; - Double_t k40=fC40*r00+fC41*r01, k41=fC40*r01+fC41*r11; - - Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1; - Double_t cur=fP4 + k40*dy + k41*dz, eta=fP2 + k20*dy + k21*dz; - if (TMath::Abs(cur*fX-eta) >= AliTPCReconstructor::GetMaxSnpTrack()) { - return 0; - } - - fP0 += k00*dy + k01*dz; - fP1 += k10*dy + k11*dz; - fP2 = eta; - fP3 += k30*dy + k31*dz; - fP4 = cur; - - Double_t c01=fC10, c02=fC20, c03=fC30, c04=fC40; - Double_t c12=fC21, c13=fC31, c14=fC41; - - fC00-=k00*fC00+k01*fC10; fC10-=k00*c01+k01*fC11; - fC20-=k00*c02+k01*c12; fC30-=k00*c03+k01*c13; - fC40-=k00*c04+k01*c14; - - fC11-=k10*c01+k11*fC11; - fC21-=k10*c02+k11*c12; fC31-=k10*c03+k11*c13; - fC41-=k10*c04+k11*c14; - - fC22-=k20*c02+k21*c12; fC32-=k20*c03+k21*c13; - fC42-=k20*c04+k21*c14; - - fC33-=k30*c03+k31*c13; - fC43-=k40*c03+k41*c13; - - fC44-=k40*c04+k41*c14; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; Int_t n=GetNumberOfClusters(); // fIndex[n]=index; SetNumberOfClusters(n+1); SetChi2(GetChi2()+chisq); - return 1; + return kTRUE; } @@ -805,7 +740,7 @@ void AliTPCseed::CookPID() Double_t sumr =0; for (Int_t j=0; jAliTPCReconstructor::GetMaxSnpTrack()) return 0.; //patch 01 jan 06 + Double_t c1=GetSnp(), r1=TMath::Sqrt(1.- c1*c1); + Double_t c2=c1+GetC()*(xk-GetX()); + if (TMath::Abs(c2)>AliTPCReconstructor::GetMaxSnpTrack()) return 0; + Double_t r2=TMath::Sqrt(1.- c2*c2); + return GetY() + (xk-GetX())*(c1+c2)/(r1+r2); +} + diff --git a/TPC/AliTPCseed.h b/TPC/AliTPCseed.h index 4e6fd72baf9..a16c0356b7d 100644 --- a/TPC/AliTPCseed.h +++ b/TPC/AliTPCseed.h @@ -35,18 +35,22 @@ class AliTPCseed : public AliTPCtrack { AliTPCseed(const AliTPCtrack &t); AliTPCseed(const AliTPCseed &s, Bool_t clusterOwner = kFALSE); //AliTPCseed(const AliTPCseed &t, Double_t a); - AliTPCseed(UInt_t index, const Double_t xx[5], - const Double_t cc[15], Double_t xr, Double_t alpha); + AliTPCseed(Double_t xr, Double_t alpha, const Double_t xx[5], + const Double_t cc[15], Int_t i); Int_t Compare(const TObject *o) const; void Reset(Bool_t all = kTRUE); Int_t GetProlongation(Double_t xr, Double_t &y, Double_t & z) const; virtual Double_t GetPredictedChi2(const AliCluster *cluster2) const; - virtual Int_t Update(const AliCluster* c2, Double_t chi2, UInt_t i); + virtual Bool_t Update(const AliCluster* c2, Double_t chi2, Int_t i); AliTPCTrackerPoint * GetTrackPoint(Int_t i); AliTPCclusterMI * GetClusterFast(Int_t irow){ return fClusterPointer[irow];} void RebuildSeed(); // rebuild seed to be ready for storing Double_t GetDensityFirst(Int_t n); - Double_t GetSigma2C() const {return fC44;}; + Double_t GetSigma2C() const { + Double_t cnv=GetBz()*kB2C; + return GetSigma1Pt2()*cnv*cnv; + } + Double_t GetEta() const { return GetC()*GetX() - GetSnp();} void GetClusterStatistic(Int_t first, Int_t last, Int_t &found, Int_t &foundable, Int_t &shared, Bool_t plus2); void Modify(Double_t factor); @@ -62,6 +66,8 @@ class AliTPCseed : public AliTPCtrack { return pica; } + Double_t GetYat(Double_t x) const; + void SetErrorY2(Float_t sy2){fErrorY2=sy2;} void SetErrorZ2(Float_t sz2){fErrorZ2=sz2;} Float_t CookdEdx(Double_t low=0.05, Double_t up=0.70, Int_t i1=0, Int_t i2=159, Bool_t onlyused = kFALSE); diff --git a/TPC/AliTPCtrack.cxx b/TPC/AliTPCtrack.cxx index d6733b39e26..fce664fdfbc 100644 --- a/TPC/AliTPCtrack.cxx +++ b/TPC/AliTPCtrack.cxx @@ -25,38 +25,15 @@ #include "AliTPCtrack.h" #include "AliCluster.h" +#include "AliTracker.h" #include "AliESDtrack.h" -#include "AliTPCReconstructor.h" ClassImp(AliTPCtrack) //_________________________________________________________________________ AliTPCtrack::AliTPCtrack(): AliKalmanTrack(), - fX(0), - fAlpha(0), fdEdx(0), - fP0(0), - fP1(0), - fP2(0), - fP3(0), - fP4(0), - fC00(1e10), - fC10(0), - fC11(1e10), - fC20(0), - fC21(0), - fC22(1e10), - fC30(0), - fC31(0), - fC32(0), - fC33(1e10), - fC40(0), - fC41(0), - fC42(0), - fC43(0), - fC44(0), - fNumber(0), fSdEdx(1e10), fNFoundable(0), fBConstrain(kFALSE), @@ -82,32 +59,10 @@ AliTPCtrack::AliTPCtrack(): -AliTPCtrack::AliTPCtrack(UInt_t index, const Double_t xx[5], -const Double_t cc[15], Double_t xref, Double_t alpha) : +AliTPCtrack::AliTPCtrack(Double_t x, Double_t alpha, const Double_t p[5], + const Double_t cov[15], Int_t index) : AliKalmanTrack(), - fX(xref), fdEdx(0), - fP0(xx[0]), - fP1(xx[1]), - fP2(xx[2]), - fP3(xx[3]), - fP4(xx[4]), - fC00(cc[0]), - fC10(cc[1]), - fC11(cc[2]), - fC20(cc[3]), - fC21(cc[4]), - fC22(cc[5]), - fC30(cc[6]), - fC31(cc[7]), - fC32(cc[8]), - fC33(cc[9]), - fC40(cc[10]), - fC41(cc[11]), - fC42(cc[12]), - fC43(cc[13]), - fC44(cc[14]), - fNumber(1), fSdEdx(1e10), fNFoundable(0), fBConstrain(kFALSE), @@ -122,11 +77,31 @@ const Double_t cc[15], Double_t xref, Double_t alpha) : //----------------------------------------------------------------- // This is the main track constructor. //----------------------------------------------------------------- - fAlpha=alpha; - if (fAlpha<-TMath::Pi()) fAlpha += 2*TMath::Pi(); - if (fAlpha>=TMath::Pi()) fAlpha -= 2*TMath::Pi(); - SaveLocalConvConst(); + Double_t cnv=1./(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], + c21 = x*cov[11] - cov[4], c42 = x*cov[14] - cov[12]; + + 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 + }; + + Set(x,alpha,pp,cc); SetNumberOfClusters(1); @@ -141,6 +116,7 @@ const Double_t cc[15], Double_t xref, Double_t alpha) : //_____________________________________________________________________________ AliTPCtrack::AliTPCtrack(const AliESDtrack& t) : AliKalmanTrack(), + fdEdx(t.GetTPCsignal()), fSdEdx(1e10), fNFoundable(0), fBConstrain(kFALSE), @@ -163,34 +139,7 @@ AliTPCtrack::AliTPCtrack(const AliESDtrack& t) : for (Int_t i=0; i<3;i++) fKinkIndexes[i]=0; for (Int_t i=0; i<3;i++) fV0Indexes[i]=0; - fdEdx = t.GetTPCsignal(); - 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); - Double_t c[15]; t.GetExternalCovariance(c); - - fX=x; - fP0=p[0]; - fP1=p[1]; SaveLocalConvConst(); - fP3=p[3]; x=GetLocalConvConst(); - fP4=p[4]/x; - fP2=fP4*fX - p[2]; - - //Conversion of the covariance matrix - c[10]/=x; c[11]/=x; c[12]/=x; c[13]/=x; c[14]/=x*x; - - 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]; - - fC00=c[0 ]; - fC10=c[1 ]; fC11=c[2 ]; - fC20=c20; fC21=c21; fC22=c22; - fC30=c[6 ]; fC31=c[7 ]; fC32=c32; fC33=c[9 ]; - fC40=c[10]; fC41=c[11]; fC42=c42; fC43=c[13]; fC44=c[14]; + Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance()); if ((t.GetStatus()&AliESDtrack::kTIME) == 0) return; StartTimeIntegral(); @@ -201,30 +150,7 @@ AliTPCtrack::AliTPCtrack(const AliESDtrack& t) : //_____________________________________________________________________________ AliTPCtrack::AliTPCtrack(const AliTPCtrack& t) : AliKalmanTrack(t), - fX(t.fX), - fAlpha(t.fAlpha), fdEdx(t.fdEdx), - fP0(t.fP0), - fP1(t.fP1), - fP2(t.fP2), - fP3(t.fP3), - fP4(t.fP4), - fC00(t.fC00), - fC10(t.fC10), - fC11(t.fC11), - fC20(t.fC20), - fC21(t.fC21), - fC22(t.fC22), - fC30(t.fC30), - fC31(t.fC31), - fC32(t.fC32), - fC33(t.fC33), - fC40(t.fC40), - fC41(t.fC41), - fC42(t.fC42), - fC43(t.fC43), - fC44(t.fC44), - fNumber(t.fNumber), fSdEdx(t.fSdEdx), fNFoundable(t.fNFoundable), fBConstrain(t.fBConstrain), @@ -240,6 +166,8 @@ AliTPCtrack::AliTPCtrack(const AliTPCtrack& t) : //----------------------------------------------------------------- // This is a track copy constructor. //----------------------------------------------------------------- + Set(t.GetX(),t.GetAlpha(),t.GetParameter(),t.GetCovariance()); + 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-10) { - Int_t n=GetNumberOfClusters(); - if (n>4) cerr<GetY() - fP0, dz=c->GetZ() - fP1; - - return (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; -} - -Double_t AliTPCtrack::GetYat(Double_t xk) const { -//----------------------------------------------------------------- -// This function calculates the Y-coordinate of a track at the plane x=xk. -//----------------------------------------------------------------- - if (TMath::Abs(fP4*fX - fP2)>AliTPCReconstructor::GetMaxSnpTrack()) return 0.; //patch 01 jan 06 - Double_t c1=fP4*fX - fP2, r1=TMath::Sqrt(1.- c1*c1); - Double_t c2=fP4*xk - fP2; - if (c2*c2>AliTPCReconstructor::GetMaxSnpTrack()) { - // Int_t n=GetNumberOfClusters(); - // if (n>4) cerr<GetY(), c->GetZ()}; + Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()}; + return AliExternalTrackParam::GetPredictedChi2(p,cov); } //_____________________________________________________________________________ -Int_t AliTPCtrack::PropagateTo(Double_t xk,Double_t /*x0*/,Double_t rho) { +Bool_t AliTPCtrack::PropagateTo(Double_t xk,Double_t rho,Double_t x0) { //----------------------------------------------------------------- - // This function propagates a track to a reference plane x=xk. + // This function propagates a track to a reference plane x=xk. + // rho - density of the crossed matrial (g/cm^3) + // x0 - radiation length of the crossed material (g/cm^2) //----------------------------------------------------------------- - if (TMath::Abs(fP4*xk - fP2) >= AliTPCReconstructor::GetMaxSnpTrack()) { - // Int_t n=GetNumberOfClusters(); - //if (n>4) cerr<oldX) AddTimeStep(d); + + if (oldX < xk) d = -d; + if (!AliExternalTrackParam::CorrectForMaterial(d*rho/x0,x0,GetMass())) + return kFALSE; - return 1; + return kTRUE; } //_____________________________________________________________________________ -Int_t AliTPCtrack::PropagateToVertex(Double_t x0,Double_t rho) +Bool_t +AliTPCtrack::PropagateToVertex(const AliESDVertex *v,Double_t d,Double_t x0) { //----------------------------------------------------------------- - // This function propagates tracks to the "vertex". + // This function propagates tracks to the vertex. //----------------------------------------------------------------- - Double_t c=fP4*fX - fP2; - Double_t tgf=-fP2/(fP4*fP0 + sqrt(1-c*c)); - Double_t snf=tgf/sqrt(1.+ tgf*tgf); - Double_t xv=(fP2+snf)/fP4; - return PropagateTo(xv,x0,rho); + Double_t bz=GetBz(); + if (PropagateToDCA(v,bz,kVeryBig)) + if (AliExternalTrackParam::CorrectForMaterial(d,x0,GetMass())) return kTRUE; + return kFALSE; } //_____________________________________________________________________________ -Int_t AliTPCtrack::Update(const AliCluster *c, Double_t chisq, UInt_t index) { +Bool_t AliTPCtrack::Update(const AliCluster *c, Double_t chisq, Int_t index) { //----------------------------------------------------------------- // This function associates a cluster with this track. //----------------------------------------------------------------- - Double_t r00=c->GetSigmaY2(), r01=0., r11=c->GetSigmaZ2(); - r00+=fC00; r01+=fC10; r11+=fC11; - 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; - Double_t k30=fC30*r00+fC31*r01, k31=fC30*r01+fC31*r11; - Double_t k40=fC40*r00+fC41*r01, k41=fC40*r01+fC41*r11; - - Double_t dy=c->GetY() - fP0, dz=c->GetZ() - fP1; - Double_t cur=fP4 + k40*dy + k41*dz, eta=fP2 + k20*dy + k21*dz; - if (TMath::Abs(cur*fX-eta) >= AliTPCReconstructor::GetMaxSnpTrack()) { - // Int_t n=GetNumberOfClusters(); - //if (n>4) cerr<GetY(), c->GetZ()}; + Double_t cov[3]={c->GetSigmaY2(), 0., c->GetSigmaZ2()}; - fC44-=k40*c04+k41*c14; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; Int_t n=GetNumberOfClusters(); fIndex[n]=index; SetNumberOfClusters(n+1); SetChi2(GetChi2()+chisq); - return 1; + return kTRUE; } -//_____________________________________________________________________________ -Int_t AliTPCtrack::Rotate(Double_t alpha) -{ - //----------------------------------------------------------------- - // This function rotates this track. - //----------------------------------------------------------------- - fAlpha += alpha; - if (fAlpha<-TMath::Pi()) fAlpha += 2*TMath::Pi(); - if (fAlpha>=TMath::Pi()) fAlpha -= 2*TMath::Pi(); - - Double_t x1=fX, y1=fP0; - Double_t ca=cos(alpha), sa=sin(alpha); - Double_t r1=fP4*fX - fP2; - - if (TMath::Abs(r1)>=AliTPCReconstructor::GetMaxSnpTrack()) return 0; //patch 01 jan 06 - - fX = x1*ca + y1*sa; - fP0=-x1*sa + y1*ca; - fP2=fP2*ca + (fP4*y1 + sqrt(1.- r1*r1))*sa; - - Double_t r2=fP4*fX - fP2; - if (TMath::Abs(r2) >= AliTPCReconstructor::GetMaxSnpTrack()) { - //Int_t n=GetNumberOfClusters(); - // if (n>4) cerr<= 0.) { - //Int_t n=GetNumberOfClusters(); - // if (n>4) cerr<=2*TMath::Pi()) phi-=2*TMath::Pi(); - return phi; -} -//////////////////////////////////////////////////////////////////////// - - - //////////////////////////////////////////////////////////////////////// // MI ADDITION @@ -645,43 +296,6 @@ Float_t AliTPCtrack::Density2(Int_t row0, Int_t row1) return density; } - -Double_t AliTPCtrack::GetZat0() const -{ - // - // return virtual z - supposing that x = 0 - if (TMath::Abs(fP2)>1) return 0; - if (TMath::Abs(fX*fP4-fP2)>1) return 0; - Double_t vz = fP1+fP3/fP4*(asin(-fP2)-asin(fX*fP4-fP2)); - return vz; -} - - -Double_t AliTPCtrack::GetD(Double_t x, Double_t y) const { - //------------------------------------------------------------------ - // This function calculates the transverse impact parameter - // with respect to a point with global coordinates (x,y) - //------------------------------------------------------------------ - //Double_t xt=fX, yt=fP0; - - Double_t sn=TMath::Sin(fAlpha), cs=TMath::Cos(fAlpha); - Double_t a = x*cs + y*sn; - y = -x*sn + y*cs; x=a; - // - Double_t r = TMath::Abs(1/fP4); - Double_t x0 = TMath::Abs(fP2*r); - Double_t y0 = fP0; - y0= fP0+TMath::Sqrt(1-(fP4*fX-fP2)*(fP4*fX-fP2))/fP4; - - Double_t delta = TMath::Sqrt((x-x0)*(x-x0)+(y-y0)*(y-y0)); - // Double_t delta = TMath::Sqrt(TMath::Abs(x*x-2*x0*x+x0*x0+ y*y-2*y*y0+y0*y0)); - delta -= TMath::Abs(r); - return delta; -} - -// -// - void AliTPCtrack::UpdatePoints() { //-------------------------------------------------- @@ -741,12 +355,12 @@ void AliTPCtrack::UpdatePoints() // } -Double_t AliTPCtrack::Get1Pt() const { - //-------------------------------------------------------------- - // Returns the inverse Pt (1/GeV/c) - // (or 1/"most probable pt", if the field is too weak) - //-------------------------------------------------------------- - if (TMath::Abs(GetLocalConvConst()) > kVeryBigConvConst) - return 1./kMostProbableMomentum/TMath::Sqrt(1.+ GetTgl()*GetTgl()); - return (TMath::Sign(1e-9,fP4) + fP4)*GetLocalConvConst(); +Double_t AliTPCtrack::GetBz() const { + // + // returns Bz component of the magnetic field (kG) + // + if (AliTracker::UniformField()) return AliTracker::GetBz(); + Double_t r[3]; GetXYZ(r); + return AliTracker::GetBz(r); } + diff --git a/TPC/AliTPCtrack.h b/TPC/AliTPCtrack.h index 472830825c4..9cc92c52216 100644 --- a/TPC/AliTPCtrack.h +++ b/TPC/AliTPCtrack.h @@ -9,133 +9,74 @@ // // Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch // -// December 18, 2000 -// Internal view of the TPC track parametrisation as well as the order of -// track parameters are subject for possible changes ! -// Use GetExternalParameters() and GetExternalCovariance() to access TPC -// track information regardless of its internal representation. -// This formation is now fixed in the following way: -// external param0: local Y-coordinate of a track (cm) -// external param1: local Z-coordinate of a track (cm) -// external param2: local sine of the track momentum azimuth angle -// external param3: tangent of the track momentum dip angle -// external param4: 1/pt (1/(GeV/c)) +// The track parameterization is fixed in the following way: +// param0: local Y-coordinate of a track (cm) +// param1: local Z-coordinate of a track (cm) +// param2: local sine of the track momentum azimuth angle +// param3: tangent of the track momentum dip angle +// param4: 1/pt (1/(GeV/c)) // +//------------------------------------------------------- + #include #include #include "AliTPCreco.h" #include "AliExternalTrackParam.h" class AliESDtrack; +class AliESDVertex; //_____________________________________________________________________________ class AliTPCtrack : public AliKalmanTrack { public: AliTPCtrack(); - AliTPCtrack(UInt_t index, const Double_t xx[5], - const Double_t cc[15], Double_t xr, Double_t alpha); + AliTPCtrack(Double_t x, Double_t alpha, const Double_t p[5], + const Double_t cov[15], Int_t index); AliTPCtrack(const AliESDtrack& t); AliTPCtrack(const AliTPCtrack& t); virtual ~AliTPCtrack() {} - Int_t PropagateToVertex(Double_t x0=36.66,Double_t rho=1.2e-3); - Int_t Rotate(Double_t angle); - void SetdEdx(Double_t dedx) {fdEdx=dedx;} - - Double_t GetYat(Double_t x) const ; - Double_t GetX() const {return fX;} - Double_t GetAlpha() const {return fAlpha;} - Double_t GetdEdx() const {return fdEdx;} - Double_t GetPIDsignal() const {return GetdEdx();} - - Double_t GetY() const {return fP0;} - Double_t GetZ() const {return fP1;} - Double_t GetSnp() const {return fX*fP4 - fP2;} - Double_t Get1Pt() const; - Double_t GetTgl() const {return fP3;} - - Double_t GetSigmaY2() const {return fC00;} - Double_t GetSigmaZ2() const {return fC11;} - -// Some methods useful for users. Implementation is not -// optimized for speed but for minimal maintanance effort - Double_t Phi() const; - Double_t Theta() const {return TMath::Pi()/2.-TMath::ATan(GetTgl());} - Double_t Px() const {return TMath::Cos(Phi())/TMath::Abs(Get1Pt());} - Double_t Py() const {return TMath::Sin(Phi())/TMath::Abs(Get1Pt());} - Double_t Pz() const {return GetTgl()/TMath::Abs(Get1Pt());} - Double_t Pt() const {return 1./TMath::Abs(Get1Pt());} - Double_t P() const {return TMath::Sqrt(Pt()*Pt()+Pz()*Pz());} Int_t Compare(const TObject *o) const; - void GetExternalParameters(Double_t& xr, Double_t x[5]) const ; - void GetExternalCovariance(Double_t cov[15]) const ; - - // [SR, 01.04.2003] - Int_t GetNumber() const {return fNumber;} - void SetNumber(Int_t n) {fNumber = n;} - // + void SetdEdx(Double_t dedx) {fdEdx=dedx;} + Double_t GetdEdx() const {return fdEdx;} + Double_t GetPIDsignal() const {return GetdEdx();} Int_t GetClusterIndex(Int_t i) const {return fIndex[i];} -//******** To be removed next release !!! ************** - Double_t GetEta() const {return fP2;} - Double_t GetC() const {return fP4;} - void GetCovariance(Double_t cc[15]) const { - cc[0 ]=fC00; - cc[1 ]=fC10; cc[2 ]=fC11; - cc[3 ]=fC20; cc[4 ]=fC21; cc[5 ]=fC22; - cc[6 ]=fC40; cc[7 ]=fC41; cc[8 ]=fC42; cc[9 ]=fC44; - cc[10]=fC30; cc[11]=fC31; cc[12]=fC32; cc[13]=fC43; cc[14]=fC33; - } -//****************************************************** + Double_t GetC() const {return AliExternalTrackParam::GetC(GetBz());} - virtual Double_t GetPredictedChi2(const AliCluster *cluster) const; - Int_t PropagateTo(Double_t xr,Double_t x0=28.94,Double_t rho=0.9e-3); - Int_t Update(const AliCluster* c, Double_t chi2, UInt_t i); - void ResetCovariance(); + Double_t GetPredictedChi2(const AliCluster *cluster) const; + Bool_t PropagateTo(Double_t xr, Double_t rho=0.9e-3, Double_t x0=28.94); + Bool_t Update(const AliCluster *c, Double_t chi2, Int_t i); + Bool_t Rotate(Double_t alpha) { + return AliExternalTrackParam::Rotate(GetAlpha()+alpha); + } + + Bool_t PropagateToVertex(const AliESDVertex *v, + Double_t rho=1.2e-3, Double_t x0=36.66); void ResetClusters() {SetNumberOfClusters(0); SetChi2(0.);} void UpdatePoints();//update points Float_t* GetPoints() {return fPoints;} - // - // TClonesArray * fHelixIn; //array of helixes - //TClonesArray * fHelixOut; //array of helixes - // + Float_t Density(Int_t row0, Int_t row1); //calculate cluster density Float_t Density2(Int_t row0, Int_t row1); //calculate cluster density - Double_t GetZat0() const; - Double_t GetD(Double_t x=0, Double_t y=0) const; + Double_t GetD(Double_t x=0, Double_t y=0) const { + return AliExternalTrackParam::GetD(x,y,GetBz()); + } AliExternalTrackParam & GetReference(){ return fReference;} void UpdateReference(){ new (&fReference) AliExternalTrackParam(*this);} Int_t GetKinkIndex(Int_t i) const{ return fKinkIndexes[i];} Int_t* GetKinkIndexes() { return fKinkIndexes;} Int_t GetV0Index(Int_t i) const{ return fV0Indexes[i];} Int_t* GetV0Indexes() { return fV0Indexes;} -protected: - void GetXYZ(Float_t r[3]) const; - - Double_t fX; // X-coordinate of this track (reference plane) - Double_t fAlpha; // Rotation angle the local (TPC sector) - // coordinate system and the global ALICE one. +protected: + Double_t GetBz() const; Double_t fdEdx; // dE/dx - Double_t fP0; // Y-coordinate of a track - Double_t fP1; // Z-coordinate of a track - Double_t fP2; // C*x0 - Double_t fP3; // tangent of the track momentum dip angle - Double_t fP4; // track curvature - - Double_t fC00; // covariance - Double_t fC10, fC11; // matrix - Double_t fC20, fC21, fC22; // of the - Double_t fC30, fC31, fC32, fC33; // track - Double_t fC40, fC41, fC42, fC43, fC44; // parameters - Int_t fIndex[kMaxRow]; // indices of associated clusters Float_t fPoints[4]; //first, max dens row end points of the track and max density - //[SR, 01.04.2003] - Int_t fNumber; // magic number used for number of clusters // MI addition Float_t fSdEdx; // sigma of dedx // @@ -152,25 +93,8 @@ protected: Int_t fKinkIndexes[3]; // kink indexes - minus = mother + daughter Int_t fV0Indexes[3]; // kink indexes - minus = mother + daughter - ClassDef(AliTPCtrack,2) // Time Projection Chamber reconstructed tracks + ClassDef(AliTPCtrack,3) // Time Projection Chamber reconstructed tracks }; -inline -void AliTPCtrack::GetExternalParameters(Double_t& xr, Double_t x[5]) const { - // This function return external TPC track representation - xr=fX; - x[0]=GetY(); x[1]=GetZ(); x[2]=GetSnp(); x[3]=GetTgl(); - x[4]=(TMath::Sign(1e-9,fP4) + fP4)*GetLocalConvConst(); -} - -inline void AliTPCtrack::GetXYZ(Float_t r[3]) const { - //--------------------------------------------------------------------- - // Returns the position of the track in the global coord. system - //--------------------------------------------------------------------- - Double_t cs=TMath::Cos(fAlpha), sn=TMath::Sin(fAlpha); - r[0]=fX*cs - fP0*sn; r[1]=fX*sn + fP0*cs; r[2]=fP1; -} - - #endif diff --git a/TPC/AliTPCtracker.cxx b/TPC/AliTPCtracker.cxx index e5891f865a0..b8d0e23d3bd 100644 --- a/TPC/AliTPCtracker.cxx +++ b/TPC/AliTPCtracker.cxx @@ -34,23 +34,43 @@ ClassImp(AliTPCtracker) +//_____________________________________________________________________________ +AliTPCtracker::AliTPCtracker(): + AliTracker(), + fkNIS(0), + fInnerSec(0), + fkNOS(0), + fOuterSec(0), + fN(0), + fSectors(0), + fParam(0), + fSeeds(0) +{ + // + // The default TPC tracker constructor + // +} + //_____________________________________________________________________________ AliTPCtracker::AliTPCtracker(const AliTPCParam *par): -AliTracker(), fkNIS(par->GetNInnerSector()/2), fkNOS(par->GetNOuterSector()/2) + AliTracker(), + fkNIS(par->GetNInnerSector()/2), + fInnerSec(new AliTPCSector[fkNIS]), + fkNOS(par->GetNOuterSector()/2), + fOuterSec(new AliTPCSector[fkNOS]), + fN(0), + fSectors(0), + fParam((AliTPCParam*) par), + fSeeds(0) { //--------------------------------------------------------------------- // The main TPC tracker constructor //--------------------------------------------------------------------- - fInnerSec=new AliTPCSector[fkNIS]; - fOuterSec=new AliTPCSector[fkNOS]; Int_t i; for (i=0; iGetAlpha())%fN; Int_t idx=-1, sec=-1, row=-1; - Int_t nc=seed.GetNumber(); + Int_t nc=track.GetNumberOfClusters(); if (nc--) { idx=track.GetClusterIndex(nc); @@ -333,7 +353,8 @@ Int_t AliTPCtracker::FollowBackProlongation Int_t nr=fSectors->GetNRows(); for (Int_t i=0; iGetX(i), ymax=fSectors->GetMaxY(i); - Double_t y=seed.GetYat(x); + Double_t y; + if (!seed.GetYAt(x,GetBz(),y)) return 0; if (y > ymax) { s = (s+1) % fN; @@ -348,7 +369,7 @@ Int_t AliTPCtracker::FollowBackProlongation AliTPCcluster *cl=0; Int_t index=0; Double_t maxchi2=kMaxCHI2; - Double_t pt=seed.GetConvConst()/(100/0.299792458/0.2)/seed.Get1Pt(); + Double_t pt=1./seed.Get1Pt(); Double_t sy2=AliTPCcluster::SigmaY2(seed.GetX(),seed.GetTgl(),pt); Double_t sz2=AliTPCcluster::SigmaZ2(seed.GetX(),seed.GetTgl()); Double_t road=4.*sqrt(seed.GetSigmaY2() + sy2), z=seed.GetZ(); @@ -402,8 +423,6 @@ Int_t AliTPCtracker::FollowBackProlongation } - seed.SetNumber(nc); - return 1; } @@ -496,8 +515,8 @@ void AliTPCtracker::MakeSeeds(Int_t i1, Int_t i2) { c[13]=f30*sy1*f40+f32*sy2*f42; c[14]=f40*sy1*f40+f42*sy2*f42+f43*sy3*f43; - UInt_t index=kr1.GetIndex(is); - AliTPCseed *track=new AliTPCseed(index, x, c, x1, ns*alpha+shift); + Int_t index=kr1.GetIndex(is); + AliTPCseed *track=new AliTPCseed(x1, ns*alpha+shift, x, c, index); Float_t l=fSectors->GetPadPitchWidth(); track->SetSampledEdx(kr1[is]->GetQ()/l,0); @@ -639,7 +658,7 @@ Int_t AliTPCtracker::RefitInward(AliESD* event) { AliTPCtrack* tpcTrack = new AliTPCtrack(*track); AliTPCseed* seed=new AliTPCseed(*tpcTrack); seed->ResetClusters(); - if ( (status & AliESDtrack::kTRDrefit) == 0 ) seed->ResetCovariance(); + if ( (status & AliESDtrack::kTRDrefit) == 0 ) seed->ResetCovariance(10.); fSectors = fOuterSec; @@ -690,10 +709,7 @@ Int_t AliTPCtracker::PropagateBack(AliESD *event) { const AliTPCtrack t(*esd); AliTPCseed s(t); s.ResetClusters(); - if ( (status & AliESDtrack::kITSout) == 0 ) s.ResetCovariance(); - - Int_t nc=t.GetNumberOfClusters(); - s.SetNumber(nc); //set number of the cluster to start with + if ( (status & AliESDtrack::kITSout) == 0 ) s.ResetCovariance(10.); //inner sectors fSectors=fInnerSec; fN=fkNIS; @@ -713,7 +729,7 @@ Int_t AliTPCtracker::PropagateBack(AliESD *event) { //outer sectors fSectors=fOuterSec; fN=fkNOS; - nc=s.GetNumberOfClusters(); + Int_t nc=s.GetNumberOfClusters(); alpha=s.GetAlpha() - fSectors->GetAlphaShift(); if (alpha > 2.*TMath::Pi()) alpha -= 2.*TMath::Pi(); diff --git a/TPC/AliTPCtracker.h b/TPC/AliTPCtracker.h index 1c6ebd86200..cd1bdaa9150 100644 --- a/TPC/AliTPCtracker.h +++ b/TPC/AliTPCtracker.h @@ -25,10 +25,7 @@ class AliESD; class AliTPCtracker : public AliTracker { public: - AliTPCtracker():AliTracker(),fkNIS(0),fkNOS(0) { - fInnerSec=fOuterSec=0; fSeeds=0; - fParam = 0; - } + AliTPCtracker(); AliTPCtracker(const AliTPCParam *par); ~AliTPCtracker(); @@ -48,11 +45,9 @@ public: //**************** Internal tracker class ********************** class AliTPCRow { public: - AliTPCRow() { - fN=0; - fSize=kMaxClusterPerRow/8; - fClusterArray=new AliTPCcluster[fSize]; - } + AliTPCRow(): + fN(0), fSize(kMaxClusterPerRow/8), + fClusterArray(new AliTPCcluster[fSize]), fX(0) {} ~AliTPCRow() {delete[] fClusterArray;} void InsertCluster(const AliTPCcluster *c, Int_t sec, Int_t row); void ResetClusters() {fN=0; delete[] fClusterArray; fClusterArray=0;} @@ -68,22 +63,22 @@ public: Double_t GetX() const {return fX;} private: + AliTPCRow(const AliTPCRow& r); //dummy copy constructor + AliTPCRow &operator=(const AliTPCRow& r); //dummy assignment operator Int_t fN; //number of clusters const AliTPCcluster *fClusters[kMaxClusterPerRow]; //pointers to clusters Int_t fSize; //size of array of clusters AliTPCcluster *fClusterArray; //array of clusters UInt_t fIndex[kMaxClusterPerRow]; //indeces of clusters Double_t fX; //X-coordinate of this row - - private: - AliTPCRow(const AliTPCRow& r); //dummy copy constructor - AliTPCRow &operator=(const AliTPCRow& r); //dummy assignment operator }; //**************** Internal tracker class ********************** class AliTPCSector { public: - AliTPCSector() { fN=0; fRow = 0; } + AliTPCSector(): + fN(0),fRow(0),fAlpha(0),fAlphaShift(0), + fPadPitchWidth(0),f1PadPitchLength(0),f2PadPitchLength(0){} ~AliTPCSector() { delete[] fRow; } AliTPCRow& operator[](Int_t i) const { return *(fRow+i); } Int_t GetNRows() const { return fN; } @@ -135,9 +130,9 @@ public: public: AliTPCseed():AliTPCtrack(){} AliTPCseed(const AliTPCtrack &t):AliTPCtrack(t){} - AliTPCseed(UInt_t index, const Double_t xx[5], - const Double_t cc[15], Double_t xr, Double_t alpha): - AliTPCtrack(index, xx, cc, xr, alpha) {} + AliTPCseed(Double_t xr, Double_t alpha, const Double_t xx[5], + const Double_t cc[15], Int_t index): + AliTPCtrack(xr, alpha, xx, cc, index) {} void SetSampledEdx(Float_t q, Int_t i) { Double_t s=GetSnp(), t=GetTgl(); q *= TMath::Sqrt((1-s*s)/(1+t*t)); diff --git a/TPC/AliTPCtrackerMI.cxx b/TPC/AliTPCtrackerMI.cxx index ce187049a08..ceb6fdbe6c8 100644 --- a/TPC/AliTPCtrackerMI.cxx +++ b/TPC/AliTPCtrackerMI.cxx @@ -30,11 +30,11 @@ #include #include #include -#include "AliLog.h" #include "AliComplexCluster.h" #include "AliESD.h" -#include "AliESDkink.h" +#include "AliKink.h" +#include "AliV0.h" #include "AliHelix.h" #include "AliRunLoader.h" #include "AliTPCClustersRow.h" @@ -47,7 +47,6 @@ #include "AliTPCtrackerMI.h" #include "TStopwatch.h" #include "AliTPCReconstructor.h" -#include "AliESDkink.h" #include "AliPID.h" #include "TTreeStream.h" #include "AliAlignObj.h" @@ -1443,16 +1442,6 @@ Int_t AliTPCtrackerMI::FollowToNext(AliTPCseed& t, Int_t nr) { y=t.GetY(); Double_t z=t.GetZ(); // - if (!IsActive(t.fRelativeSector,nr)) { - t.fInDead = kTRUE; - t.SetClusterIndex2(nr,-1); - return 0; - } - //AliInfo(Form("A - Sector%d phi %f - alpha %f", t.fRelativeSector,y/x, t.GetAlpha())); - Bool_t isActive = IsActive(t.fRelativeSector,nr); - Bool_t isActive2 = (nr>=fInnerSec->GetNRows()) ? fOuterSec[t.fRelativeSector][nr-fInnerSec->GetNRows()].GetN()>0:fInnerSec[t.fRelativeSector][nr].GetN()>0; - - if (!isActive || !isActive2) return 0; const AliTPCRow &krow=GetRow(t.fRelativeSector,nr); if ( (t.GetSigmaY2()<0) || t.GetSigmaZ2()<0) return 0; Double_t roady =1.; @@ -1684,12 +1673,6 @@ Int_t AliTPCtrackerMI::UpdateClusters(AliTPCseed& t, Int_t nr) { } // if (TMath::Abs(t.GetSnp())>AliTPCReconstructor::GetMaxSnpTracker()) return 0; - if (!IsActive(t.fRelativeSector,nr)) { - t.fInDead = kTRUE; - t.SetClusterIndex2(nr,-1); - return 0; - } - //AliInfo(Form("A - Sector%d phi %f - alpha %f", t.fRelativeSector,y/x, t.GetAlpha())); AliTPCRow &krow=GetRow(t.fRelativeSector,nr); if (TMath::Abs(TMath::Abs(y)-ymax)GetKink(index-1); + AliKink * kink = (AliKink*)fEvent->GetKink(index-1); if (!kink){ printf("PROBLEM\n"); } @@ -1884,7 +1867,7 @@ Int_t AliTPCtrackerMI::FollowBackProlongation(AliTPCseed& t, Int_t rf) { if (index==0) break; if (index>0) continue; index = TMath::Abs(index); - AliESDkink * kink = fEvent->GetKink(index-1); + AliKink * kink = (AliKink*)fEvent->GetKink(index-1); if (!kink){ printf("PROBLEM\n"); } @@ -2668,6 +2651,7 @@ Int_t AliTPCtrackerMI::PropagateBack(AliESD *event) Info("PropagateBack","Number of back propagated tracks %d",ntracks); fEvent =0; //WriteTracks(); + return 0; } @@ -2676,12 +2660,14 @@ void AliTPCtrackerMI::DeleteSeeds() { // //delete Seeds + Int_t nseed = fSeeds->GetEntriesFast(); for (Int_t i=0;iAt(i); if (seed) delete fSeeds->RemoveAt(i); } delete fSeeds; + fSeeds =0; } @@ -2725,8 +2711,8 @@ void AliTPCtrackerMI::ReadSeeds(AliESD *event, Int_t direction) } } - if (((status&AliESDtrack::kITSout)==0)&&(direction==1)) seed->ResetCovariance(); - if ( direction ==2 &&(status & AliESDtrack::kTRDrefit) == 0 ) seed->ResetCovariance(); + if (((status&AliESDtrack::kITSout)==0)&&(direction==1)) seed->ResetCovariance(10.); + if ( direction ==2 &&(status & AliESDtrack::kTRDrefit) == 0 ) seed->ResetCovariance(10.); if ( direction ==2 && ((status & AliESDtrack::kTPCout) == 0) ) { fSeeds->AddAt(0,i); delete seed; @@ -2742,7 +2728,7 @@ void AliTPCtrackerMI::ReadSeeds(AliESD *event, Int_t direction) if (esd->GetTRDncls()>0) trdchi2 = esd->GetTRDchi2()/esd->GetTRDncls(); //reset covariance if suspicious if ( (delta1>0.1) || (delta2>0.006) ||trdchi2>7.) - seed->ResetCovariance(); + seed->ResetCovariance(10.); } // @@ -3020,7 +3006,7 @@ void AliTPCtrackerMI::MakeSeeds3(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, // if (!BuildSeed(kr1[is],kcl,0,x1,x2,x3,x,c)) continue; UInt_t index=kr1.GetIndex(is); - AliTPCseed *track=new(seed) AliTPCseed(index, x, c, x1, ns*alpha+shift); + AliTPCseed *track=new(seed) AliTPCseed(x1, ns*alpha+shift, x, c, index); track->fIsSeeding = kTRUE; track->fSeed1 = i1; @@ -3311,7 +3297,7 @@ void AliTPCtrackerMI::MakeSeeds5(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, // if (!BuildSeed(kr1[is],kcl,0,x1,x2,x3,x,c)) continue; UInt_t index=kr1.GetIndex(is); - AliTPCseed *track=new(seed) AliTPCseed(index, x, c, x1, sec*alpha+shift); + AliTPCseed *track=new(seed) AliTPCseed(x1, sec*alpha+shift, x, c, index); track->fIsSeeding = kTRUE; @@ -3590,7 +3576,7 @@ void AliTPCtrackerMI::MakeSeeds2(TObjArray * arr, Int_t sec, Int_t i1, Int_t i2, UInt_t index=0; //kr0.GetIndex(is); - AliTPCseed *track=new (seed) AliTPCseed(index, x, c, x1, sec*alpha+shift); + AliTPCseed *track=new (seed) AliTPCseed(x1,sec*alpha+shift,x,c,index); track->fIsSeeding = kTRUE; Int_t rc=FollowProlongation(*track, i2); if (constrain) track->fBConstrain =1; @@ -3739,7 +3725,7 @@ AliTPCseed *AliTPCtrackerMI::MakeSeed(AliTPCseed *track, Float_t r0, Float_t r1, c[14]=f40*sy1*f40+f42*sy2*f42+f43*sy3*f43; // Int_t row1 = fSectors->GetRowNumber(x2[0]); - AliTPCseed *seed=new AliTPCseed(0, x, c, x2[0], sec2*fSectors->GetAlpha()+fSectors->GetAlphaShift()); + AliTPCseed *seed=new AliTPCseed(x2[0], sec2*fSectors->GetAlpha()+fSectors->GetAlphaShift(), x, c, 0); // Double_t y0,z0,y1,z1, y2,z2; //seed->GetProlongation(x0[0],y0,z0); // seed->GetProlongation(x1[0],y1,z1); @@ -3859,7 +3845,7 @@ AliTPCseed *AliTPCtrackerMI::ReSeed(AliTPCseed *track, Float_t r0, Float_t r1, F c[14]=f40*sy1*f40+f42*sy2*f42+f43*sy3*f43; // Int_t row1 = fSectors->GetRowNumber(xyz[2][0]); - AliTPCseed *seed=new AliTPCseed(0, x, c, xyz[2][0], sec[2]*fSectors->GetAlpha()+fSectors->GetAlphaShift()); + AliTPCseed *seed=new AliTPCseed(xyz[2][0], sec[2]*fSectors->GetAlpha()+fSectors->GetAlphaShift(), x, c, 0); seed->fLastPoint = row[2]; seed->fFirstPoint = row[2]; return seed; @@ -4008,7 +3994,7 @@ AliTPCseed *AliTPCtrackerMI::ReSeed(AliTPCseed *track,Int_t r0, Bool_t forward) c[14]=f40*sy1*f40+f42*sy2*f42+f43*sy3*f43; // Int_t row1 = fSectors->GetRowNumber(xyz[2][0]); - AliTPCseed *seed=new AliTPCseed(0, x, c, xyz[2][0], sec[2]*fSectors->GetAlpha()+fSectors->GetAlphaShift()); + AliTPCseed *seed=new AliTPCseed(xyz[2][0], sec[2]*fSectors->GetAlpha()+fSectors->GetAlphaShift(), x, c, 0); seed->fLastPoint = row[2]; seed->fFirstPoint = row[2]; for (Int_t i=row[0];iAt(i0); if (!track0) continue; if (track0->fN<40) continue; - if (TMath::Abs(1./track0->fP4)>200) continue; + if (TMath::Abs(1./track0->GetC())>200) continue; for (Int_t i1=i0+1;i1At(i1); if (!track1) continue; if (track1->fN<40) continue; - if ( TMath::Abs(track1->fP3+track0->fP3)>0.1) continue; + if ( TMath::Abs(track1->GetTgl()+track0->GetTgl())>0.1) continue; if (track0->fBConstrain&&track1->fBConstrain) continue; - if (TMath::Abs(1./track1->fP4)>200) continue; - if (track1->fP4*track0->fP4>0) continue; - if (track1->fP3*track0->fP3>0) continue; - if (max(TMath::Abs(1./track0->fP4),TMath::Abs(1./track1->fP4))>190) continue; - if (track0->fBConstrain&&TMath::Abs(track1->fP4)fP4)) continue; //returning - lower momenta - if (track1->fBConstrain&&TMath::Abs(track0->fP4)fP4)) continue; //returning - lower momenta + if (TMath::Abs(1./track1->GetC())>200) continue; + if (track1->Get1Pt()*track0->Get1Pt()>0) continue; + if (track1->GetTgl()*track0->GetTgl()>0) continue; + if (max(TMath::Abs(1./track0->GetC()),TMath::Abs(1./track1->GetC()))>190) continue; + if (track0->fBConstrain&&TMath::Abs(track1->Get1Pt())Get1Pt())) continue; //returning - lower momenta + if (track1->fBConstrain&&TMath::Abs(track0->Get1Pt())Get1Pt())) continue; //returning - lower momenta // Float_t mindcar = TMath::Min(TMath::Abs(dca[i0]),TMath::Abs(dca[i1])); if (mindcar<5) continue; @@ -4171,7 +4157,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) if (sign){ circular[i0] = kTRUE; circular[i1] = kTRUE; - if (TMath::Abs(track0->fP4)fP4)){ + if (TMath::Abs(track0->Get1Pt())Get1Pt())){ track0->fCircular += 1; track1->fCircular += 2; } @@ -4346,7 +4332,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) if (mpt<1){ //for high momenta momentum not defined well in first iteration - Double_t qt = TMath::Sin(kink->GetAngle(2))*ktrack1->P(); + Double_t qt = TMath::Sin(kink->GetAngle(2))*ktrack1->GetP(); if (qt>0.35) continue; } @@ -4373,12 +4359,12 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) // angle and densities not defined yet if (kink->GetTPCDensityFactor()<0.8) continue; if ((2-kink->GetTPCDensityFactor())*kink->GetDistance() >0.25) continue; - if (kink->GetAngle(2)*ktrack0->P()<0.003) continue; //too small angle + if (kink->GetAngle(2)*ktrack0->GetP()<0.003) continue; //too small angle if (kink->GetAngle(2)>0.2&&kink->GetTPCDensityFactor()<1.15) continue; if (kink->GetAngle(2)>0.2&&kink->GetTPCDensity(0,1)>0.05) continue; - Float_t criticalangle = track0->fC22+track0->fC33; - criticalangle+= track1->fC22+track1->fC33; + Float_t criticalangle = track0->GetSigmaSnp2()+track0->GetSigmaTgl2(); + criticalangle+= track1->GetSigmaSnp2()+track1->GetSigmaTgl2(); criticalangle= 3*TMath::Sqrt(criticalangle); if (criticalangle>0.02) criticalangle=0.02; if (kink->GetAngle(2)AddKink(kink); kinks->AddLast(kink); - kink = new AliESDkink; + kink = new AliKink; ncandidates++; } } @@ -4425,7 +4411,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) // for (Int_t i=0;iAt(i); + AliKink *kink = (AliKink*)kinks->At(i); // // refit kinks towards vertex // @@ -4487,12 +4473,12 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) //remove double find kinks // for (Int_t ikink0=1;ikink0At(indexes[ikink0]); + AliKink * kink0 = (AliKink*) kinks->At(indexes[ikink0]); if (!kink0) continue; // for (Int_t ikink1=0;ikink1At(indexes[ikink1]); + AliKink * kink1 = (AliKink*) kinks->At(indexes[ikink1]); if (!kink1) continue; // if not close kink continue if (TMath::Abs(kink1->GetPosition()[2]-kink0->GetPosition()[2])>10) continue; @@ -4555,7 +4541,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) for (Int_t i=0;iAt(indexes[i]); + AliKink * kink = (AliKink*) kinks->At(indexes[i]); if (!kink) continue; kink->SetTPCRow0(GetRowNumber(kink->GetR())); Int_t index0 = kink->GetIndex(0); @@ -4610,7 +4596,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) for (Int_t i=0;iAt(i); if (!track0) continue; - if (track0->Pt()<1.4) continue; + if (track0->GetPt()<1.4) continue; //remove double high momenta tracks - overlapped with kink candidates Int_t shared=0; Int_t all =0; @@ -4630,11 +4616,11 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) AliTPCseed *pmother = new AliTPCseed(); AliTPCseed *pdaughter = new AliTPCseed(); - AliESDkink *pkink = new AliESDkink; + AliKink *pkink = new AliKink; AliTPCseed & mother = *pmother; AliTPCseed & daughter = *pdaughter; - AliESDkink & kink = *pkink; + AliKink & kink = *pkink; if (CheckKinkPoint(track0,mother,daughter, kink)){ if (mother.fN<30||daughter.fN<20) { delete pmother; @@ -4642,7 +4628,7 @@ void AliTPCtrackerMI::FindKinks(TObjArray * array, AliESD *esd) delete pkink; continue; //too short tracks } - if (mother.Pt()<1.4) { + if (mother.GetPt()<1.4) { delete pmother; delete pdaughter; delete pkink; @@ -4753,9 +4739,9 @@ void AliTPCtrackerMI::FindV0s(TObjArray * array, AliESD *esd) // // dca error parrameterezation + pulls // - sdcar[i] = TMath::Sqrt(0.150*0.150+(100*track->fP4)*(100*track->fP4)); - if (TMath::Abs(track->fP3)>1) sdcar[i]*=2.5; - cdcar[i] = TMath::Exp((TMath::Abs(track->fP4)-0.0106)*525.3); + sdcar[i] = TMath::Sqrt(0.150*0.150+(100*track->GetC())*(100*track->GetC())); + if (TMath::Abs(track->GetTgl())>1) sdcar[i]*=2.5; + cdcar[i] = TMath::Exp((TMath::Abs(track->GetC())-0.0106)*525.3); pulldcar[i] = (dca[i]-cdcar[i])/sdcar[i]; pulldcaz[i] = (z0[i]-zvertex)/sdcar[i]; pulldca[i] = TMath::Sqrt(pulldcar[i]*pulldcar[i]+pulldcaz[i]*pulldcaz[i]); @@ -4784,7 +4770,7 @@ void AliTPCtrackerMI::FindV0s(TObjArray * array, AliESD *esd) // // TTreeSRedirector &cstream = *fDebugStreamer; Float_t fprimvertex[3]={GetX(),GetY(),GetZ()}; - AliESDV0MI vertex; + AliV0 vertex; Double_t cradius0 = 10*10; Double_t cradius1 = 200*200; Double_t cdist1=3.; @@ -4811,7 +4797,7 @@ void AliTPCtrackerMI::FindV0s(TObjArray * array, AliESD *esd) "\n"; } // - if (track0->fP4<0) continue; + if (track0->Get1Pt()<0) continue; if (track0->GetKinkIndex(0)>0||isPrim[i]) continue; //daughter kink // if (TMath::Abs(helixes[i].GetHelix(4))<0.000000001) continue; @@ -5047,12 +5033,14 @@ void AliTPCtrackerMI::FindV0s(TObjArray * array, AliESD *esd) timer.Print(); } -Int_t AliTPCtrackerMI::RefitKink(AliTPCseed &mother, AliTPCseed &daughter, AliESDkink &kink) +Int_t AliTPCtrackerMI::RefitKink(AliTPCseed &mother, AliTPCseed &daughter, AliESDkink &knk) { // // refit kink towards to the vertex // // + AliKink &kink=(AliKink &)knk; + Int_t row0 = GetRowNumber(kink.GetR()); FollowProlongation(mother,0); mother.Reset(kFALSE); @@ -5067,7 +5055,7 @@ Int_t AliTPCtrackerMI::RefitKink(AliTPCseed &mother, AliTPCseed &daughter, AliES const Int_t kNdiv =5; AliTPCseed param0[kNdiv]; // parameters along the track AliTPCseed param1[kNdiv]; // parameters along the track - AliESDkink kinks[kNdiv]; // corresponding kink parameters + AliKink kinks[kNdiv]; // corresponding kink parameters // Int_t rows[kNdiv]; for (Int_t irow=0; irow240.) continue; if (TMath::Abs(kinks[irow].GetR())<100.) continue; // - Float_t normdist = TMath::Abs(param0[irow].fX-kinks[irow].GetR())*(0.1+kink.GetDistance()); + Float_t normdist = TMath::Abs(param0[irow].GetX()-kinks[irow].GetR())*(0.1+kink.GetDistance()); normdist/= (param0[irow].fN+param1[irow].fN+40.); if (normdist < mindist){ mindist = normdist; @@ -5189,7 +5177,7 @@ void AliTPCtrackerMI::UpdateKinkQualityD(AliTPCseed * seed){ } -Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTPCseed &daughter, AliESDkink &kink) +Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTPCseed &daughter, AliESDkink &knk) { // // check kink point for given track @@ -5197,6 +5185,7 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP // otherwise seed0 correspond to mother particle // seed1 correspond to daughter particle // kink parameter of kink point + AliKink &kink=(AliKink &)knk; Int_t middlerow = (seed->fFirstPoint+seed->fLastPoint)/2; Int_t first = seed->fFirstPoint; @@ -5218,7 +5207,7 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP // AliTPCseed param0[20]; // parameters along the track AliTPCseed param1[20]; // parameters along the track - AliESDkink kinks[20]; // corresponding kink parameters + AliKink kinks[20]; // corresponding kink parameters Int_t rows[20]; for (Int_t irow=0; irow<20;irow++){ rows[irow] = first +((last-first)*irow)/19; @@ -5245,7 +5234,7 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP for (Int_t irow=1;irow<19;irow++){ if (TMath::Abs(kinks[irow].GetR())>240.) continue; if (TMath::Abs(kinks[irow].GetR())<110.) continue; - Float_t quality = TMath::Abs(kinks[irow].GetAngle(2))/(3.+TMath::Abs(kinks[irow].GetR()-param0[irow].fX)); + Float_t quality = TMath::Abs(kinks[irow].GetAngle(2))/(3.+TMath::Abs(kinks[irow].GetR()-param0[irow].GetX())); if ( quality > maxchange){ maxchange = quality; index = irow; @@ -5261,15 +5250,15 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP seed1 = new AliTPCseed(param1[index]); seed0->Reset(kFALSE); seed1->Reset(kFALSE); - seed0->ResetCovariance(); - seed1->ResetCovariance(); + seed0->ResetCovariance(10.); + seed1->ResetCovariance(10.); FollowProlongation(*seed0,0); FollowBackProlongation(*seed1,158); new (&mother) AliTPCseed(*seed0); // backup mother at position 0 seed0->Reset(kFALSE); seed1->Reset(kFALSE); - seed0->ResetCovariance(); - seed1->ResetCovariance(); + seed0->ResetCovariance(10.); + seed1->ResetCovariance(10.); // first = TMath::Max(row0-20,0); last = TMath::Min(row0+20,158); @@ -5301,7 +5290,7 @@ Int_t AliTPCtrackerMI::CheckKinkPoint(AliTPCseed*seed,AliTPCseed &mother, AliTP for (Int_t irow=0;irow<20;irow++){ if (TMath::Abs(kinks[irow].GetR())>250.) continue; if (TMath::Abs(kinks[irow].GetR())<90.) continue; - Float_t quality = TMath::Abs(kinks[irow].GetAngle(2))/(3.+TMath::Abs(kinks[irow].GetR()-param0[irow].fX)); + Float_t quality = TMath::Abs(kinks[irow].GetAngle(2))/(3.+TMath::Abs(kinks[irow].GetR()-param0[irow].GetX())); if ( quality > maxchange){ maxchange = quality; index = irow; @@ -5459,7 +5448,7 @@ Int_t AliTPCtrackerMI::Clusters2Tracks() { } // RemoveUsed2(fSeeds,0.85,0.85,0); - if (AliTPCReconstructor::GetRecoParam()->GetDoKinks()) FindKinks(fSeeds,fEvent); + FindKinks(fSeeds,fEvent); RemoveUsed2(fSeeds,0.5,0.4,20); // // // // refit short tracks @@ -5657,7 +5646,6 @@ TObjArray * AliTPCtrackerMI::Tracking() { // // - if (AliTPCReconstructor::GetRecoParam()->GetSpecialSeeding()) return TrackingSpecial(); TStopwatch timer; timer.Start(); Int_t nup=fOuterSec->GetNRows()+fInnerSec->GetNRows(); @@ -5808,49 +5796,6 @@ TObjArray * AliTPCtrackerMI::Tracking() } -TObjArray * AliTPCtrackerMI::TrackingSpecial() -{ - // - // seeding adjusted for laser and cosmic tests - short tracks with big inclination angle - // no primary vertex seeding tried - // - TStopwatch timer; - timer.Start(); - Int_t nup=fOuterSec->GetNRows()+fInnerSec->GetNRows(); - - TObjArray * seeds = new TObjArray; - TObjArray * arr=0; - - Int_t gap = 15; - Float_t cuts[4]; - Float_t fnumber = 3.0; - Float_t fdensity = 3.0; - - // find secondaries - cuts[0] = AliTPCReconstructor::GetRecoParam()->GetMaxC(); // max curvature - cuts[1] = 3.5; // max tan(phi) angle for seeding - cuts[2] = 3.; // not used (cut on z primary vertex) - cuts[3] = 3.5; // max tan(theta) angle for seeding - - for (Int_t delta = 0; nup-delta-gap-1>0; delta+=3){ - // - arr = Tracking(4,nup-1-delta,nup-1-delta-gap,cuts,-1); - SumTracks(seeds,arr); - SignClusters(seeds,fnumber,fdensity); - } - - if (fDebug>0){ - Info("Tracking()","\n\nSecondary seeding\t%d\n\n",seeds->GetEntriesFast()); - timer.Print(); - timer.Start(); - } - - return seeds; - // - -} - - void AliTPCtrackerMI::SumTracks(TObjArray *arr1,TObjArray *arr2) const { // @@ -5860,13 +5805,6 @@ void AliTPCtrackerMI::SumTracks(TObjArray *arr1,TObjArray *arr2) const for (Int_t i=0;iUncheckedAt(i); if (pt){ - // - // remove tracks with too big curvature - // - if (TMath::Abs(pt->GetC())>AliTPCReconstructor::GetRecoParam()->GetMaxC()){ - delete arr2->RemoveAt(i); - continue; - } // REMOVE VERY SHORT TRACKS if (pt->GetNumberOfClusters()<20){ delete arr2->RemoveAt(i); diff --git a/TPC/AliTPCtrackerMI.h b/TPC/AliTPCtrackerMI.h index 2b9c347337b..a9969e32020 100644 --- a/TPC/AliTPCtrackerMI.h +++ b/TPC/AliTPCtrackerMI.h @@ -36,8 +36,6 @@ public: fInnerSec=fOuterSec=0; fSeeds=0; } AliTPCtrackerMI(const AliTPCParam *par); - AliTPCtrackerMI(const AliTPCtrackerMI& r); //dummy copy constructor - AliTPCtrackerMI &operator=(const AliTPCtrackerMI& r);//dummy assignment operator virtual ~AliTPCtrackerMI(); // void SetIteration(Int_t iteration){fIteration = iteration;} @@ -194,6 +192,8 @@ private: Int_t AcceptCluster(AliTPCseed * seed, AliTPCclusterMI * cluster, Float_t factor, Float_t cory=1., Float_t corz=1.); private: + AliTPCtrackerMI(const AliTPCtrackerMI& r); //dummy copy constructor + AliTPCtrackerMI &operator=(const AliTPCtrackerMI& r);//dummy assignment operator inline AliTPCRow &GetRow(Int_t sec, Int_t row); inline Bool_t IsActive(Int_t sec, Int_t row); inline Double_t GetXrow(Int_t row) const; diff --git a/TPC/AliTPCtrackerParam.cxx b/TPC/AliTPCtrackerParam.cxx index 3067362585d..bd4c3c72cb7 100644 --- a/TPC/AliTPCtrackerParam.cxx +++ b/TPC/AliTPCtrackerParam.cxx @@ -992,17 +992,17 @@ void AliTPCtrackerParam::BuildTrack(AliTPCseedGeant *s,Int_t ch) { // fAlpha = Alpha Rotation angle the local (TPC sector) // fP0 = YL Y-coordinate of a track // fP1 = ZG Z-coordinate of a track - // fP2 = C*x0 x0 is center x in rotated frame + // fP2 = sin(phi) sine of the (local) azimuthal angle // fP3 = Tgl tangent of the track momentum dip angle // fP4 = C track curvature xx[0] = s->GetYL(); xx[1] = s->GetZL(); + xx[2] = ch/rho*(xref-x0); xx[3] = s->GetPz()/s->GetPt(); xx[4] = ch/rho; - xx[2] = xx[4]*x0; // create the object AliTPCtrack - AliTPCtrack track(0,xx,cc,xref,s->GetAlpha()); + AliTPCtrack track(xref,s->GetAlpha(),xx,cc,0); new(&fTrack) AliTPCtrack(track); return; @@ -1047,7 +1047,7 @@ void AliTPCtrackerParam::CompareTPCtracks( Double_t ptgener; Bool_t usethis; Int_t label; - Double_t cc[15],dAlpha; + Double_t dAlpha; Int_t pi=0,ka=0,mu=0,el=0,pr=0; Int_t *geaPi = new Int_t[effBins]; Int_t *geaKa = new Int_t[effBins]; @@ -1211,30 +1211,30 @@ void AliTPCtrackerParam::CompareTPCtracks( cmptrk.dP0 = kaltrack->GetY()-geatrack->GetY(); cmptrk.dP1 = kaltrack->GetZ()-geatrack->GetZ(); - cmptrk.dP2 = kaltrack->GetEta()-geatrack->GetEta(); + cmptrk.dP2 = kaltrack->GetSnp()-geatrack->GetSnp(); cmptrk.dP3 = kaltrack->GetTgl()-geatrack->GetTgl(); cmptrk.dP4 = kaltrack->GetC()-geatrack->GetC(); cmptrk.dpt = 1/kaltrack->Get1Pt()-1/geatrack->Get1Pt(); // get covariance matrix // beware: lines 3 and 4 in the matrix are inverted! - kaltrack->GetCovariance(cc); - - cmptrk.c00 = cc[0]; - cmptrk.c10 = cc[1]; - cmptrk.c11 = cc[2]; - cmptrk.c20 = cc[3]; - cmptrk.c21 = cc[4]; - cmptrk.c22 = cc[5]; - cmptrk.c30 = cc[10]; - cmptrk.c31 = cc[11]; - cmptrk.c32 = cc[12]; - cmptrk.c33 = cc[14]; - cmptrk.c40 = cc[6]; - cmptrk.c41 = cc[7]; - cmptrk.c42 = cc[8]; - cmptrk.c43 = cc[13]; - cmptrk.c44 = cc[9]; + //kaltrack->GetCovariance(cc); + + cmptrk.c00 = kaltrack->GetSigmaY2(); + cmptrk.c10 = kaltrack->GetSigmaZY(); + cmptrk.c11 = kaltrack->GetSigmaZ2(); + cmptrk.c20 = kaltrack->GetSigmaSnpY(); + cmptrk.c21 = kaltrack->GetSigmaSnpY(); + cmptrk.c22 = kaltrack->GetSigmaSnp2(); + cmptrk.c30 = kaltrack->GetSigmaTglY(); + cmptrk.c31 = kaltrack->GetSigmaTglZ(); + cmptrk.c32 = kaltrack->GetSigmaTglSnp(); + cmptrk.c33 = kaltrack->GetSigmaTgl2(); + cmptrk.c40 = kaltrack->GetSigma1PtY(); + cmptrk.c41 = kaltrack->GetSigma1PtZ(); + cmptrk.c42 = kaltrack->GetSigma1PtSnp(); + cmptrk.c43 = kaltrack->GetSigma1PtTgl(); + cmptrk.c44 = kaltrack->GetSigma1Pt2(); // fill tree cmptrktree->Fill(); @@ -1414,7 +1414,7 @@ void AliTPCtrackerParam::CookTrack(Double_t pt,Double_t eta) { alpha=fTrack.GetAlpha(); xx[0]=fTrack.GetY(); xx[1]=fTrack.GetZ(); - xx[2]=fTrack.GetX()*fTrack.GetC()-fTrack.GetSnp(); + xx[2]=fTrack.GetSnp(); xx[3]=fTrack.GetTgl(); xx[4]=fTrack.GetC(); @@ -1422,7 +1422,7 @@ void AliTPCtrackerParam::CookTrack(Double_t pt,Double_t eta) { xxsm[0]=xref; SmearTrack(xx,xxsm,covMatSmear); - AliTPCtrack track(0,xxsm,cc,xref,alpha); + AliTPCtrack track(xref,alpha,xxsm,cc,0); new(&fTrack) AliTPCtrack(track); return; diff --git a/TRD/AliTRDtrack.cxx b/TRD/AliTRDtrack.cxx index f5efc943eac..be6a3630454 100644 --- a/TRD/AliTRDtrack.cxx +++ b/TRD/AliTRDtrack.cxx @@ -19,6 +19,7 @@ #include #include +#include "AliTracker.h" #include "AliESDtrack.h" #include "AliTRDgeometry.h" #include "AliTRDcluster.h" @@ -34,482 +35,258 @@ ClassImp(AliTRDtrack) // // /////////////////////////////////////////////////////////////////////////////// -//_____________________________________________________________________________ -AliTRDtrack::AliTRDtrack() - :AliKalmanTrack() - ,fSeedLab(-1) - ,fdEdx(0) - ,fDE(0) - ,fAlpha(0) - ,fX(0) - ,fStopped(kFALSE) - ,fY(0) - ,fZ(0) - ,fE(0) - ,fT(0) - ,fC(0) - ,fCyy(1e10) - ,fCzy(0) - ,fCzz(1e10) - ,fCey(0) - ,fCez(0) - ,fCee(1e10) - ,fCty(0) - ,fCtz(0) - ,fCte(0) - ,fCtt(1e10) - ,fCcy(0) - ,fCcz(0) - ,fCce(0) - ,fCct(0) - ,fCcc(1e10) - ,fLhElectron(0) - ,fNWrong(0) - ,fNRotate(0) - ,fNCross(0) - ,fNExpected(0) - ,fNLast(0) - ,fNExpectedLast(0) - ,fNdedx(0) - ,fChi2Last(1e10) - ,fBackupTrack(0x0) +AliTRDtrack::AliTRDtrack(): + AliKalmanTrack(), + fSeedLab(-1), + fdEdx(0), + fdEdxT(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 - // - - Int_t i = 0; - Int_t j = 0; - UInt_t k = 0; - - for (i = 0; i < kNplane; i++) { - for (j = 0; j < kNslice; j++) { + for (Int_t i=0; i= TMath::Pi()) { - fAlpha -= 2.0 * TMath::Pi(); - } + //----------------------------------------------------------------- + // This is the main track constructor. + //----------------------------------------------------------------- + Double_t cnv=1./(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], + c21 = x*cov[11] - cov[4], c42 = x*cov[14] - cov[12]; + + 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 + }; + + Set(x,alpha,pp,cc); - SaveLocalConvConst(); - - fIndex[0] = index; SetNumberOfClusters(1); + fIndex[0]=index; - for (i = 0; i < kNplane; i++) { - for (j = 0; j < kNslice; j++) { + for (Int_t i=0;iGetQ()); - Double_t s = fX * fC - fE; - Double_t t = fT; - if (s*s < 1.0) { - q *= TMath::Sqrt((1-s*s)/(1+t*t)); - } - fdQdl[0] = q; - - for (k = 1; k < kMAXCLUSTERSPERTRACK; k++) { - fdQdl[k] = 0; - fIndex[k] = 0; - fIndexBackup[k] = 0; - } + Double_t s = GetSnp(), t=GetTgl(); + if(s*s < 1) q *= TMath::Sqrt((1-s*s)/(1+t*t)); - for (i = 0; i < 3; i++) { - fBudget[i] = 0; + fdQdl[0] = q; + // initialisation [SR, GSI 18.02.2003] (i startd for 1) + for(UInt_t i=1; i= TMath::Pi()) { - fAlpha -= 2.0 * TMath::Pi(); - } - - Double_t x; - Double_t p[5]; - t.GetExternalParameters(x,p); - fX = x; - fY = p[0]; - fZ = p[1]; - fT = p[3]; - x = GetLocalConvConst(); - fC = p[4] / x; - fE = fC * fX - p[2]; - - // Conversion of the covariance matrix - Double_t c[15]; - t.GetExternalCovariance(c); - c[10] /= x; - c[11] /= x; - c[12] /= x; - c[13] /= x; - c[14] /= x*x; - - Double_t c22 = fX*fX * c[14] - 2.0*fX*c[12] + c[ 5]; - Double_t c32 = fX * c[13] - c[ 8]; - Double_t c20 = fX * c[10] - c[ 3]; - Double_t c21 = fX * c[11] - c[ 4]; - Double_t c42 = fX * c[14] - c[12]; - - fCyy = c[ 0]; - fCzy = c[ 1]; fCzz = c[ 2]; - fCey = c20; fCez = c21; fCee = c22; - fCty = c[ 6]; fCtz = c[ 7]; fCte = c32; fCtt = c[ 9]; - fCcy = c[10]; fCcz = c[11]; fCce = c42; fCct = c[13]; fCcc = c[14]; - - for (k = 0; k < kMAXCLUSTERSPERTRACK; k++) { - fdQdl[k] = 0; - fIndex[k] = 0; - fIndexBackup[k] = 0; + // Initialization [SR, GSI, 18.02.2003] + for(UInt_t i=0; i= TMath::Pi()) { - fAlpha -= 2.0 * TMath::Pi(); - } - // Conversion of the covariance matrix - Double_t x; - Double_t p[5]; - t.GetExternalParameters(x,p); - Double_t c[15]; - t.GetExternalCovariance(c); - if (t.GetStatus() & AliESDtrack::kTRDbackup) { - t.GetOuterExternalParameters(fAlpha,x,p); - t.GetOuterExternalCovariance(c); - if (fAlpha < -TMath::Pi()) { - fAlpha += 2.0 * TMath::Pi(); - } - else if (fAlpha >= TMath::Pi()) { - fAlpha -= 2.0 * TMath::Pi(); - } + 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()); - fX = x; - fY = p[0]; - fZ = p[1]; - SaveLocalConvConst(); - fT = p[3]; - x = GetLocalConvConst(); - fC = p[4] / x; - fE = fC*fX - p[2]; - - c[10] /= x; - c[11] /= x; - c[12] /= x; - c[13] /= x; - c[14] /= x*x; - - Double_t c22 = fX*fX * c[14] - 2.0*fX*c[12] + c[ 5]; - Double_t c32 = fX * c[13] - c[ 8]; - Double_t c20 = fX * c[10] - c[ 3]; - Double_t c21 = fX * c[11] - c[ 4]; - Double_t c42 = fX * c[14] - c[12]; - - fCyy = c[ 0]; - fCzy = c[ 1]; fCzz = c[ 2]; - fCey = c20; fCez = c21; fCee = c22; - fCty = c[ 6]; fCtz = c[ 7]; fCte = c32; fCtt = c[ 9]; - fCcy = c[10]; fCcz = c[11]; fCce = c42; fCct = c[13]; fCcc = c[14]; - - for (k = 0; k < kMAXCLUSTERSPERTRACK; k++) { - fdQdl[k] = 0; - //fIndex[k] = 0; //MI store indexes - } + + for (UInt_t i=0; i= TMath::Pi()) { - fAlpha -= 2.0 * TMath::Pi(); - } - - return *this; - -} - //____________________________________________________________________________ Float_t AliTRDtrack::StatusForTOF() { @@ -566,70 +310,21 @@ Float_t AliTRDtrack::StatusForTOF() // Defines the status of the TOF extrapolation // - // 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])); + Float_t res = (0.2 + 0.8*(fN/(fNExpected+5.)))*(0.4+0.6*fTracklets[5].GetN()/20.); + res *= (0.25+0.8*40./(40.+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.0)) return 3; // Gold - if ((fNLast > 30) && - (fChi2Last/(Float_t(fNLast)) < 3.0)) return 3; // Gold - if ((fNLast > 20) && - (fChi2Last/(Float_t(fNLast)) < 2.0)) return 3; // Gold - if ((fNLast/(fNExpectedLast+3.0) > 0.8) && - (fChi2Last/Float_t(fNLast) < 5.0) && - (fNLast > 20)) return 2; // Silver - if ((fNLast > 5) && - (((fNLast+1.0)/(fNExpectedLast+1.0)) > 0.8) && - (fChi2Last/(fNLast-5.0) < 6.0)) return 1; + 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.8 && fChi2Last/Float_t(fNLast)<5&&fNLast>20) return 2; //silber + if (fNLast>5 &&((fNLast+1.)/(fNExpectedLast+1.))>0.8&&fChi2Last/(fNLast-5.)<6) return 1; return status; } - -//_____________________________________________________________________________ -void AliTRDtrack::GetExternalCovariance(Double_t cc[15]) const -{ - // - // This function returns external representation of the covriance matrix. - // - - Double_t a = GetLocalConvConst(); - - Double_t c22 = fX*fX*fCcc - 2.0*fX*fCce+fCee; - Double_t c32 = fX*fCct-fCte; - Double_t c20 = fX*fCcy-fCey; - Double_t c21 = fX*fCcz-fCez; - Double_t c42 = fX*fCcc-fCce; - - 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]=fCct*a; cc[14]=fCcc*a*a; - -} - -//_____________________________________________________________________________ -void AliTRDtrack::GetCovariance(Double_t cc[15]) const -{ - // - // Returns the track covariance matrix - // - - cc[ 0]=fCyy; - cc[ 1]=fCzy; cc[ 2]=fCzz; - cc[ 3]=fCey; cc[ 4]=fCez; cc[ 5]=fCee; - cc[ 6]=fCcy; cc[ 7]=fCcz; cc[ 8]=fCce; cc[ 9]=fCcc; - cc[10]=fCty; cc[11]=fCtz; cc[12]=fCte; cc[13]=fCct; cc[14]=fCtt; - -} //_____________________________________________________________________________ Int_t AliTRDtrack::Compare(const TObject *o) const @@ -697,384 +392,128 @@ void AliTRDtrack::CookdEdx(Double_t low, Double_t up) dedx /= (nu - nl + 1.0); SetdEdx(dedx); - delete [] index; - } //_____________________________________________________________________________ -Int_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho) +Bool_t AliTRDtrack::PropagateTo(Double_t xk,Double_t x0,Double_t rho) { - // // Propagates a track of particle with mass=pm to a reference plane // defined by x=xk through media of density=rho and radiationLength=x0 - // - if (xk == fX) { - return 1; - } - - if (TMath::Abs(fC*xk - fE) >= 0.9) { - return 0; - } + if (xk == GetX()) return kTRUE; - Double_t lcc = GetLocalConvConst(); + Double_t oldX=GetX(), oldY=GetY(), oldZ=GetZ(); - Double_t oldX = fX; - Double_t oldY = fY; - Double_t oldZ = fZ; + Double_t bz=GetBz(); + if (!AliExternalTrackParam::PropagateTo(xk,bz)) return kFALSE; - Double_t x1 = fX; - Double_t x2 = x1 + (xk - x1); - Double_t dx = x2 - x1; - Double_t y1 = fY; - Double_t z1 = fZ; - Double_t c1 = fC*x1 - fE; - if ((c1*c1) > 1) { - return 0; + Double_t x=GetX(), y=GetY(), 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*TMath::ASin(l2*crv)/crv; + l2 = TMath::Sqrt(l2*l2+(z-oldZ)*(z-oldZ)); + } + AddTimeStep(l2); } - Double_t r1 = TMath::Sqrt(1.0 - c1*c1); - Double_t c2 = fC*x2 - fE; - if ((c2*c2) > 1) { - return 0; - } + Double_t ll = (oldX < xk) ? -d : d; + if (!AliExternalTrackParam::CorrectForMaterial(ll*rho/x0,x0,GetMass())) + return kFALSE; - Double_t r2 = TMath::Sqrt(1.0 - 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; - Double_t cc = c1+c2; - Double_t xx = x1+x2; - Double_t f02 = -dx*(2*rr + cc*(c1/r1 + c2/r2))/(rr*rr); - Double_t f04 = dx*(rr*xx + cc*(c1*x1/r1+c2*x2/r2))/(rr*rr); - Double_t cr = c1*r2+c2*r1; - Double_t f12 = -dx*fT*(2*cr + cc*(c2*c1/r1-r1 + c1*c2/r2-r2))/(cr*cr); - Double_t f13 = dx*cc/cr; - Double_t f14 = dx*fT*(cr*xx-cc*(r1*x2-c2*c1*x1/r1+r2*x1-c1*c2*x2/r2))/(cr*cr); - - // b = C*ft - Double_t b00 = f02*fCey + f04*fCcy; - Double_t b01 = f12*fCey + f14*fCcy + f13*fCty; - Double_t b10 = f02*fCez + f04*fCcz; - Double_t b11 = f12*fCez + f14*fCcz + f13*fCtz; - Double_t b20 = f02*fCee + f04*fCce; - Double_t b21 = f12*fCee + f14*fCce + f13*fCte; - Double_t b30 = f02*fCte + f04*fCct; - Double_t b31 = f12*fCte + f14*fCct + f13*fCtt; - Double_t b40 = f02*fCce + f04*fCcc; - Double_t b41 = f12*fCce + f14*fCcc + f13*fCct; - - // a = f*b = f*C*ft - Double_t a00 = f02*b20 + f04*b40; - Double_t a01 = f02*b21 + f04*b41; - Double_t a11 = f12*b21 + f14*b41 + f13*b31; - - // F*C*Ft = C + (a + b + bt) - fCyy += a00 + 2.0*b00; - fCzy += a01 + b01 + b10; - fCey += b20; - fCty += b30; - fCcy += b40; - fCzz += a11 + 2.0*b11; - fCez += b21; - fCtz += b31; - fCcz += b41; - - fX = x2; - - // Change of the magnetic field - SaveLocalConvConst(); - cc = fC; - fC *= lcc / GetLocalConvConst(); - fE += fX * (fC-cc); - - // Multiple scattering - // What is 14.1 ???? - Double_t d = TMath::Sqrt((x1-fX)*(x1-fX) + (y1-fY)*(y1-fY) + (z1-fZ)*(z1-fZ)); - Double_t p2 = (1.0 + GetTgl()*GetTgl()) / (Get1Pt()*Get1Pt()); - Double_t beta2 = p2 / (p2 + GetMass()*GetMass()); - Double_t theta2 = 14.1*14.1 / (beta2*p2*1e6) * d / x0 * rho; - Double_t ey = fC*fX - fE; - Double_t ez = fT; - Double_t xz = fC*ez; - Double_t zz1 = ez*ez + 1.0; - Double_t xy = fE + ey; - - fCee += (2.0*ey*ez*ez*fE + 1.0 - ey*ey + ez*ez + fE*fE*ez*ez) * theta2; - fCte += ez*zz1*xy*theta2; - fCtt += zz1*zz1*theta2; - fCce += xz*ez*xy*theta2; - fCct += xz*zz1*theta2; - fCcc += xz*xz*theta2; - - // Energy losses - // What is 5940.0 ???? and 0.153e-3 ???? - if ((5940.0*beta2 / (1.0 - beta2 + 1e-10) - beta2) < 0.0) { - return 0; - } - Double_t dE = 0.153e-3/beta2 * (TMath::Log(5940.0*beta2 / (1.0 - beta2 + 1e-10)) - beta2) - * d * rho; - Float_t budget = d * rho; - fBudget[0] +=budget; - - // Suspicious part - think about it ???? + {//Energy losses************************ + Double_t p2=(1.+ GetTgl()*GetTgl())/(Get1Pt()*Get1Pt()); + Double_t beta2=p2/(p2 + GetMass()*GetMass()); + if ((5940*beta2/(1-beta2+1e-10) - beta2) < 0) return kFALSE; + + Double_t dE=0.153e-3/beta2*(log(5940*beta2/(1-beta2+1e-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.0) { - dE = 0.0; // Not valid region for Bethe bloch - } - fDE += dE; - if (x1 < x2) { - dE = -dE; - } - cc = fC; - fC *= (1.0 - TMath::Sqrt(p2 + GetMass()*GetMass()) / p2 * dE); - fE += fX * (fC - cc); - - // Energy loss fluctuation - // Why 0.07 ???? - Double_t sigmade = 0.07 * TMath::Sqrt(TMath::Abs(dE)); - Double_t sigmac2 = sigmade*sigmade * fC*fC * (p2 + GetMass()*GetMass()) / (p2*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; - - // Track time measurement - if (x1 < x2) { - if (IsStartedTimeIntegral()) { - Double_t l2 = TMath::Sqrt((fX-oldX)*(fX-oldX) - + (fY-oldY)*(fY-oldY) - + (fZ-oldZ)*(fZ-oldZ)); - if (TMath::Abs(l2*fC) > 0.0001){ - // 0.003) { - fNoTilt = kFALSE; - } - - // Add angular effect to the error contribution - Float_t tangent2 = (fC*fX-fE) * (fC*fX-fE); + if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE; + // add angular effect to the error contribution - MI + Float_t tangent2 = GetSnp()*GetSnp(); if (tangent2 < 0.90000){ - tangent2 = tangent2 / (1.0 - tangent2); - } - // What is 0.04 ???? - Float_t errang = tangent2 * 0.04; - Float_t padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0); - - Double_t r00 = c->GetSigmaY2() + errang; - Double_t r01 = 0.0; - Double_t r11 = c->GetSigmaZ2() * 100.0; - 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; - Double_t k01 = fCyy*r01 + fCzy*r11; - Double_t k10 = fCzy*r00 + fCzz*r01; - Double_t k11 = fCzy*r01 + fCzz*r11; - Double_t k20 = fCey*r00 + fCez*r01; - Double_t k21 = fCey*r01 + fCez*r11; - Double_t k30 = fCty*r00 + fCtz*r01; - Double_t k31 = fCty*r01 + fCtz*r11; - Double_t k40 = fCcy*r00 + fCcz*r01; - Double_t k41 = fCcy*r01 + fCcz*r11; - - Double_t dy = c->GetY() - fY; - Double_t dz = c->GetZ() - fZ; - Double_t cur = fC + k40*dy + k41*dz; - Double_t eta = fE + k20*dy + k21*dz; - - if (fNoTilt) { - - if (TMath::Abs(cur*fX-eta) >= 0.9) { - return 0; - } - fY += k00*dy + k01*dz; - fZ += k10*dy + k11*dz; - fE = eta; - fC = cur; - + tangent2 = tangent2/(1.-tangent2); } - else { + //Float_t errang = tangent2*0.04; // - // Empirical factor set by C.Xu in the first tilt version - // Is this factor still ok ???? - Double_t xuFactor = 100.0; - dy = c->GetY() - fY; - dz = c->GetZ() - fZ; - dy = dy + h01*dz; - - Float_t add = 0.0; - if (TMath::Abs(dz) > padlength/2.0) { - Float_t dy2 = c->GetY() - fY; - Float_t sign = (dz > 0.0) ? -1.0 : 1.0; - dy2 += h01 * sign * padlength/2.0; - dy = dy2; - add = 0.0; - } - - r00 = c->GetSigmaY2() + errang + add; - r01 = 0.0; - r11 = c->GetSigmaZ2() * xuFactor; - r00 += (fCyy + 2.0*h01*fCzy + h01*h01*fCzz); - r01 += (fCzy + h01*fCzz); - r11 += fCzz; - - det = r00*r11 - r01*r01; - tmp = r00; - r00 = r11/det; - r11 = tmp/det; - r01 = -r01/det; - - 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); - - cur = fC + k40*dy + k41*dz; - eta = fE + k20*dy + k21*dz; - if (TMath::Abs(cur*fX - eta) >= 0.9) { - return 0; - } - - fY += k00*dy + k01*dz; - fZ += k10*dy + k11*dz; - fE = eta; - fT += k30*dy + k31*dz; - fC = cur; - - k01 += h01*k00; - k11 += h01*k10; - k21 += h01*k20; - k31 += h01*k30; - k41 += h01*k40; - - } + Double_t p[2]={c->GetY(), c->GetZ()}; + //Double_t cov[3]={c->GetSigmaY2()+errang, 0., c->GetSigmaZ2()*100.}; + Double_t sy2=c->GetSigmaY2()*4; + Double_t sz2=c->GetSigmaZ2()*4; + Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2}; - Double_t c01 = fCzy; - Double_t c02 = fCey; - Double_t c03 = fCty; - Double_t c04 = fCcy; - Double_t c12 = fCez; - Double_t c13 = fCtz; - Double_t c14 = fCcz; - - fCyy -= k00*fCyy + k01*fCzy; - fCzy -= k00*c01 + k01*fCzz; - fCey -= k00*c02 + k01*c12; - fCty -= k00*c03 + k01*c13; - fCcy -= k00*c04 + k01*c14; - - fCzz -= k10*c01 + k11*fCzz; - fCez -= k10*c02 + k11*c12; - fCtz -= k10*c03 + k11*c13; - fCcz -= k10*c04 + k11*c14; - - fCee -= k20*c02 + k21*c12; - fCte -= k20*c03 + k21*c13; - fCce -= k20*c04 + k21*c14; - - fCtt -= k30*c03 + k31*c13; - fCct -= k40*c03 + k41*c13; - - fCcc -= k40*c04 + k41*c14; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; - Int_t n = GetNumberOfClusters(); - fIndex[n] = index; + Int_t n=GetNumberOfClusters(); + fIndex[n]=index; SetNumberOfClusters(n+1); SetChi2(GetChi2()+chisq); - return 1; - + return kTRUE; } //_____________________________________________________________________________ -Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq - , UInt_t index, Double_t h01 - , Int_t /*plane*/) -{ - // +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 - // Still needed ???? - // AliTRDclusterCorrection *corrector = AliTRDclusterCorrection::GetCorrection(); + if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE; + // add angular effect to the error contribution and make correction - MI // - - Double_t tangent2 = (fC*fX-fE) * (fC*fX-fE); - if (tangent2 < 0.9) { - tangent2 = tangent2 / (1.0 - tangent2); - } - Double_t tangent = TMath::Sqrt(tangent2); - if ((fC*fX-fE) < 0.0) { - tangent *= -1.0; + Double_t tangent2 = GetSnp()*GetSnp(); + if (tangent2 < 0.90000){ + tangent2 = tangent2/(1.-tangent2); } + Double_t tangent = TMath::Sqrt(tangent2); + if (GetSnp()<0) tangent*=-1; + // Double_t correction = 0*plane; + /* + Double_t errang = tangent2*0.04; // + Double_t errsys =0.025*0.025*20; //systematic error part - // Where are the parameters from ???? - Double_t errang = tangent2 * 0.04; - Double_t errsys = 0.025*0.025 * 20.0; // Systematic error part - - Float_t extend = 1.0; - if (c->GetNPads() == 4) extend = 2.0; + Float_t extend =1; + if (c->GetNPads()==4) extend=2; + */ + //if (c->GetNPads()==5) extend=3; + //if (c->GetNPads()==6) extend=3; + //if (c->GetQ()<15) return 1; - ///////////////////////////////////////////////////////////////////////////// - // - // Is this still needed or will it be needed ???? - // - //if (c->GetNPads() == 5) extend = 3.0; - //if (c->GetNPads() == 6) extend = 3.0; - //if (c->GetQ() < 15) { - // return 1; - //} - // - // Will this be needed ???? /* - if (corrector !=0 ) { + if (corrector!=0){ //if (0){ correction = corrector->GetCorrection(plane,c->GetLocalTimeBin(),tangent); if (TMath::Abs(correction)>0){ @@ -1085,223 +524,90 @@ Int_t AliTRDtrack::UpdateMI(const AliTRDcluster *c, Double_t chisq } } */ - // - // Double_t padlength = TMath::Sqrt(c->GetSigmaZ2()*12.); - ///////////////////////////////////////////////////////////////////////////// - - Double_t r00 = (c->GetSigmaY2() + errang + errsys) * extend; - Double_t r01 = 0.0; - Double_t r11 = c->GetSigmaZ2()*10000.0; - 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; - Double_t k01 = fCyy*r01 + fCzy*r11; - Double_t k10 = fCzy*r00 + fCzz*r01; - Double_t k11 = fCzy*r01 + fCzz*r11; - Double_t k20 = fCey*r00 + fCez*r01; - Double_t k21 = fCey*r01 + fCez*r11; - Double_t k30 = fCty*r00 + fCtz*r01; - Double_t k31 = fCty*r01 + fCtz*r11; - Double_t k40 = fCcy*r00 + fCcz*r01; - Double_t k41 = fCcy*r01 + fCcz*r11; - - Double_t dy = c->GetY() - fY; - Double_t dz = c->GetZ() - fZ; - Double_t cur = fC + k40*dy + k41*dz; - Double_t eta = fE + k20*dy + k21*dz; - - if (fNoTilt) { - - if (TMath::Abs(cur*fX - eta) >= 0.9) { - return 0; - } - - fY += k00*dy + k01*dz; - fZ += k10*dy + k11*dz; - fE = eta; - fC = cur; - - } - else { - - Double_t padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0); - // Empirical factor set by C.Xu in the first tilt version - Double_t xuFactor = 1000.0; - - dy = c->GetY() - fY; - dz = c->GetZ() - fZ; - //dy = dy + h01*dz + correction; // Still needed ???? - - Double_t tiltdz = dz; - if (TMath::Abs(tiltdz) > padlength/2.0) { - tiltdz = TMath::Sign(padlength/2.0,dz); - } - dy = dy + h01*tiltdz; - - Double_t add = 0.0; - if (TMath::Abs(dz) > padlength/2.0) { - //Double_t dy2 = c->GetY() - fY; // Still needed ???? - //Double_t sign = (dz>0) ? -1.: 1.; - //dy2-=h01*sign*padlength/2.; - //dy = dy2; - add = 1.0; + // + //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., + c->GetSigmaZ2()*10000.}; + */ + Double_t sy2=c->GetSigmaY2()*4; + Double_t sz2=c->GetSigmaZ2()*4; + Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2}; - Double_t s00 = (c->GetSigmaY2() + errang) * extend + errsys + add; // Error pad - Double_t s11 = c->GetSigmaZ2() * xuFactor; // Error pad-row - // - r00 = fCyy + 2*fCzy*h01 + fCzz*h01*h01 + s00; - r01 = fCzy + fCzz*h01; - r11 = fCzz + s11; - det = r00*r11 - r01*r01; - - // Inverse matrix - tmp = r00; - r00 = r11 / det; - r11 = tmp / det; - r01 = -r01 / det; - - // 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 - cur = fC + k40*dy + k41*dz; - eta = fE + k20*dy + k21*dz; - if (TMath::Abs(cur*fX - eta) >= 0.9) { - return 0; - } - fY += k00*dy + k01*dz; - fZ += k10*dy + k11*dz; - fE = eta; - fT += k30*dy + k31*dz; - fC = cur; - - k01 += h01*k00; - k11 += h01*k10; - k21 += h01*k20; - k31 += h01*k30; - k41 += h01*k40; - - } - - // Update the covariance matrix - Double_t oldyy = fCyy; - Double_t oldzz = fCzz; - //Double_t oldee = fCee; - //Double_t oldcc = fCcc; - Double_t oldzy = fCzy; - Double_t oldey = fCey; - Double_t oldty = fCty; - Double_t oldcy = fCcy; - Double_t oldez = fCez; - Double_t oldtz = fCtz; - Double_t oldcz = fCcz; - //Double_t oldte = fCte; - //Double_t oldce = fCce; - //Double_t oldct = fCct; + if (!AliExternalTrackParam::Update(p,cov)) return kFALSE; - fCyy -= k00*oldyy + k01*oldzy; - fCzy -= k10*oldyy + k11*oldzy; - fCey -= k20*oldyy + k21*oldzy; - fCty -= k30*oldyy + k31*oldzy; - fCcy -= k40*oldyy + k41*oldzy; - - fCzz -= k10*oldzy + k11*oldzz; - fCez -= k20*oldzy + k21*oldzz; - fCtz -= k30*oldzy + k31*oldzz; - fCcz -= k40*oldzy + k41*oldzz; - - fCee -= k20*oldey + k21*oldez; - fCte -= k30*oldey + k31*oldez; - fCce -= k40*oldey + k41*oldez; - - fCtt -= k30*oldty + k31*oldtz; - fCct -= k40*oldty + k41*oldtz; - - fCcc -= k40*oldcy + k41*oldcz; - - Int_t n = GetNumberOfClusters(); - fIndex[n] = index; + Int_t n=GetNumberOfClusters(); + fIndex[n]=index; SetNumberOfClusters(n+1); + SetChi2(GetChi2()+chisq); - SetChi2(GetChi2() + chisq); - - return 1; - + return kTRUE; } - +/* //_____________________________________________________________________________ Int_t AliTRDtrack::UpdateMI(const AliTRDtracklet &tracklet) { // // Assignes found tracklet to the track and updates track information // - - Double_t r00 = (tracklet.GetTrackletSigma2()); - Double_t r01 = 0.0; - Double_t r11 = 10000.0; - 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 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; - Double_t dz = tracklet.GetZ() - fZ; + Double_t dy=tracklet.GetY() - fY, dz=tracklet.GetZ() - fZ; - Double_t s00 = tracklet.GetTrackletSigma2(); // Error pad - Double_t s11 = 100000.0; // Error pad-row - Float_t h01 = tracklet.GetTilt(); - r00 = fCyy + fCzz*h01*h01 + s00; - r01 = fCzy; + 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; - - // K matrix - Double_t k00 = fCyy*r00 + fCzy*r01; - Double_t k01 = fCyy*r01 + fCzy*r11; - Double_t k10 = fCzy*r00 + fCzz*r01; - Double_t k11 = fCzy*r01 + fCzz*r11; - Double_t k20 = fCey*r00 + fCez*r01; - Double_t k21 = fCey*r01 + fCez*r11; - Double_t k30 = fCty*r00 + fCtz*r01; - Double_t k31 = fCty*r01 + fCtz*r11; - Double_t k40 = fCcy*r00 + fCcz*r01; - Double_t k41 = fCcy*r01 + fCcz*r11; + // 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; - // Update measurement - Double_t cur = fC + k40*dy + k41*dz; - Double_t eta = fE + k20*dy + k21*dz; - if (TMath::Abs(cur*fX-eta) >= 0.9) { + // 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< 1.0) { - return 0; - } - Double_t y0 = fY + TMath::Sqrt(1.0 - r2*r2) / fC; - if ((fY-y0)*fC >= 0.0) { - Int_t n = GetNumberOfClusters(); - if (n > 4) { - AliError(Form("Rotation failed N = %d !\n",n)); - } - return 0; - } - - // f = F - 1 - Double_t f00 = ca-1.0; - Double_t f24 = (y1 - r1*x1/TMath::Sqrt(1.0 - r1*r1)) * sa; - Double_t f20 = fC*sa; - Double_t f22 = (ca + sa*r1/TMath::Sqrt(1.0 - r1*r1)) - 1.0; - - // b = C*ft - Double_t b00 = fCyy*f00; - Double_t b02 = fCyy*f20 + fCcy*f24 + fCey*f22; - Double_t b10 = fCzy*f00; - Double_t b12 = fCzy*f20 + fCcz*f24 + fCez*f22; - Double_t b20 = fCey*f00; - Double_t b22 = fCey*f20 + fCce*f24 + fCee*f22; - Double_t b30 = fCty*f00; - Double_t b32 = fCty*f20 + fCct*f24 + fCte*f22; - Double_t b40 = fCcy*f00; - Double_t b42 = fCcy*f20 + fCcc*f24 + fCce*f22; - - // a = f*b = f*C*ft - Double_t a00 = f00*b00; - Double_t a02 = f00*b02; - Double_t a22 = f20*b02 + f24*b42 + f22*b22; - - // F*C*Ft = C + (a + b + bt) - fCyy += a00 + 2.0*b00; - fCzy += b10; - fCey += a02 + b20 + b02; - fCty += b30; - fCcy += b40; - fCez += b12; - fCte += b32; - fCee += a22 + 2.0*b22; - fCce += b42; - - return 1; + if (GetLabel()==277) + printf("Rotate %e %e %e %e\n",GetAlpha(),GetX(),GetY(),GetZ()); + return AliExternalTrackParam::Rotate(GetAlpha()+alpha); } //_____________________________________________________________________________ @@ -1452,147 +685,56 @@ Double_t AliTRDtrack::GetPredictedChi2(const AliTRDcluster *c, Double_t h01) con // Returns the track chi2 // - Bool_t fNoTilt = kTRUE; - if (TMath::Abs(h01) > 0.003) { - fNoTilt = kFALSE; - } + Double_t p[2]={c->GetY(), c->GetZ()}; + Double_t sy2=c->GetSigmaY2()*4; + Double_t sz2=c->GetSigmaZ2()*4; + Double_t cov[3]={sy2 + h01*h01*sz2, h01*(sy2-sz2), sz2 + h01*h01*sy2}; + + return AliExternalTrackParam::GetPredictedChi2(p,cov); - Double_t chi2; - Double_t dy; - Double_t r00; - Double_t r01; - Double_t r11; + /* + Bool_t fNoTilt = kTRUE; + if(TMath::Abs(h01) > 0.003) fNoTilt = kFALSE; - if (fNoTilt) { + return (c->GetY() - GetY())*(c->GetY() - GetY())/c->GetSigmaY2(); + */ - dy = c->GetY() - fY; - r00 = c->GetSigmaY2(); - chi2 = (dy*dy) / r00; + /* + 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 padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0); - - r00 = c->GetSigmaY2(); - r01 = 0.0; - r11 = c->GetSigmaZ2(); - r00 += fCyy; - r01 += fCzy; - r11 += fCzz; - - Double_t det = r00*r11 - r01*r01; + Double_t det=r00*r11 - r01*r01; if (TMath::Abs(det) < 1.e-10) { - Int_t n = GetNumberOfClusters(); - if (n > 4) { - AliError(Form("Singular matrix N = %d!\n",n)); - } + Int_t n=GetNumberOfClusters(); + if (n>4) cerr<GetY() - fY; - Double_t dz = c->GetZ() - fZ; + Double_t tmp=r00; r00=r11; r11=tmp; r01=-r01; + Double_t dy=c->GetY() - fY, dz=c->GetZ() - fZ; Double_t tiltdz = dz; - if (TMath::Abs(tiltdz) > padlength/2.0) { - tiltdz = TMath::Sign(padlength/2.0,dz); + if (TMath::Abs(tiltdz)>padlength/2.) { + tiltdz = TMath::Sign(padlength/2,dz); } - dy = dy + h01*tiltdz; - - chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz) / det; + // dy=dy+h01*dz; + dy=dy+h01*tiltdz; + chi2 = (dy*r00*dy + 2*r01*dy*dz + dz*r11*dz)/det; } return chi2; - + */ } -//_________________________________________________________________________ -void AliTRDtrack::GetPxPyPz(Double_t& px, Double_t& py, Double_t& pz) const -{ - // - // Returns reconstructed track momentum in the global system. - // - - Double_t pt = TMath::Abs(GetPt()); - Double_t r = fC*fX - fE; - - Double_t y0; - if (r > 1) { - py = pt; - px = 0.0; - } - else if (r < -1) { - py = -pt; - px = 0.0; - } - else { - y0 = fY + TMath::Sqrt(1.0 - 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::GetGlobalXYZ(Double_t& x, Double_t& y, Double_t& z) const -{ - // - // Returns reconstructed track coordinates in the global system. - // - - 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; - -} - -//_________________________________________________________________________ -void AliTRDtrack::ResetCovariance() -{ - // - // Resets covariance matrix - // - - fCyy *= 10.0; - fCzy = 0.0; fCzz *= 10.0; - fCey = 0.0; fCez = 0.0; fCee *= 10.0; - fCty = 0.0; fCtz = 0.0; fCte = 0.0; fCtt *= 10.0; - fCcy = 0.0; fCcz = 0.0; fCce = 0.0; fCct = 0.0; fCcc *= 10.0; - -} - -//_____________________________________________________________________________ -void AliTRDtrack::ResetCovariance(Float_t mult) -{ - // - // Resets covariance matrix - // - - fCyy *= mult; - fCzy *= 0.0; fCzz *= 1.0; - fCey *= 0.0; fCez *= 0.0; fCee *= mult; - fCty *= 0.0; fCtz *= 0.0; fCte *= 0.0; fCtt *= 1.0; - fCcy *= 0.0; fCcz *= 0.0; fCce *= 0.0; fCct *= 0.0; fCcc *= mult; - -} - //_____________________________________________________________________________ void AliTRDtrack::MakeBackupTrack() { @@ -1600,10 +742,7 @@ void AliTRDtrack::MakeBackupTrack() // Creates a backup track // - if (fBackupTrack) { - delete fBackupTrack; - } - + if (fBackupTrack) delete fBackupTrack; fBackupTrack = new AliTRDtrack(*this); } @@ -1613,74 +752,51 @@ Int_t AliTRDtrack::GetProlongation(Double_t xk, Double_t &y, Double_t &z) { // // Find prolongation at given x - // Return 0 if it does not exist - // + // return 0 if not exist - Double_t c1 = fC*fX - fE; - if (TMath::Abs(c1) > 1.0) { - return 0; - } - - Double_t r1 = TMath::Sqrt(1.0 - c1*c1); - Double_t c2 = fC*xk - fE; - if (TMath::Abs(c2) > 1.0) { - return 0; - } + Double_t bz=GetBz(); - Double_t r2 = TMath::Sqrt(1.0 - c2*c2); - y = fY + (xk-fX)*(c1+c2)/(r1+r2); - z = fZ + (xk-fX)*(c1+c2)/(c1*r2 + c2*r1)*fT; + if (!AliExternalTrackParam::GetYAt(xk,bz,y)) return 0; + if (!AliExternalTrackParam::GetZAt(xk,bz,z)) return 0; - return 1; - + return 1; } //_____________________________________________________________________________ -Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step) +Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step) { // - // Propagate track to a given x position - // Works inside of the 20 degree segmentation - // (local cooordinate frame for TRD , TPC, TOF) + // Propagate track to given x position + // works inside of the 20 degree segmentation (local cooordinate frame for TRD , TPC, TOF) // - // The material budget is taken from the geo manager - // - - Double_t xyz0[3]; - Double_t xyz1[3]; - Double_t y; - Double_t z; - - // Critical alpha - cross sector indication - const Double_t kAlphac = TMath::Pi()/9.0; + // material budget from geo manager + // + Double_t xyz0[3], xyz1[3],y,z; + const Double_t kAlphac = TMath::Pi()/9.; const Double_t kTalphac = TMath::Tan(kAlphac*0.5); - - // Direction +- - Double_t dir = (fX > xr) ? -1.0 : 1.0; - - for (Double_t x = fX + dir*step; dir*x < dir*xr; x += dir*step) { - - GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]); + // critical alpha - cross sector indication + // + Double_t dir = (GetX()>xr) ? -1.:1.; + // direction +- + for (Double_t x=GetX()+dir*step;dir*x 0) && - (param[1] > 0)) { - PropagateTo(x,param[1],param[0]); - } - if (fY > fX*kTalphac) { + // + if (param[0]>0&¶m[1]>0) PropagateTo(x,param[1],param[0]); + if (GetY()>GetX()*kTalphac){ Rotate(-kAlphac); } - if (fY < -fX*kTalphac) { + if (GetY()<-GetX()*kTalphac){ Rotate(kAlphac); } - } - + // PropagateTo(xr); return 0; @@ -1688,53 +804,42 @@ Int_t AliTRDtrack::PropagateToX(Double_t xr, Double_t step) } //_____________________________________________________________________________ -Int_t AliTRDtrack::PropagateToR(Double_t r,Double_t step) +Int_t AliTRDtrack::PropagateToR(Double_t r,Double_t step) { // - // Propagate a track to a given radial position - // The rotation is always connected to the last track position + // 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; - - // Direction +- - Double_t radius = TMath::Sqrt(fX*fX + fY*fY); - Double_t dir = (radius > r) ? -1.0 : 1.0; - - for (Double_t x = radius + dir*step; dir*x < dir*r; x += dir*step) { - GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]); + Double_t xyz0[3], xyz1[3],y,z; + Double_t radius = TMath::Sqrt(GetX()*GetX() + GetY()*GetY()); + Double_t dir = (radius>r) ? -1.:1.; // direction +- + // + for (Double_t x=radius+dir*step;dir*x kVeryBigConvConst) { - return 1.0 / kMostProbableMomentum - / TMath::Sqrt(1.0 + GetTgl()*GetTgl()); - } - - return (TMath::Sign(1.0e-9,fC) + fC) * GetLocalConvConst(); - -} - -//_____________________________________________________________________________ -Double_t AliTRDtrack::GetP() const -{ - // - // Returns the total momentum - // - - return TMath::Abs(GetPt()) * TMath::Sqrt(1.0 + GetTgl()*GetTgl()); - -} - -//_____________________________________________________________________________ -Double_t AliTRDtrack::GetYat(Double_t xk) const -{ - // - // This function calculates the Y-coordinate of a track at - // the plane x = xk. - // Needed for matching with the TOF (I.Belikov) - // - - Double_t c1 = fC*fX - fE; - Double_t r1 = TMath::Sqrt(1.0 - c1*c1); - Double_t c2 = fC*xk - fE; - Double_t r2 = TMath::Sqrt(1.0- c2*c2); - - return fY + (xk-fX)*(c1+c2)/(r1+r2); - -} - //_____________________________________________________________________________ void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i) { @@ -1809,8 +868,7 @@ void AliTRDtrack::SetSampledEdx(Float_t q, Int_t i) Double_t s = GetSnp(); Double_t t = GetTgl(); - - q *= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t)); + q *= TMath::Sqrt((1-s*s)/(1+t*t)); fdQdl[i] = q; } @@ -1824,24 +882,19 @@ void AliTRDtrack::SetSampledEdx(Float_t q) Double_t s = GetSnp(); Double_t t = GetTgl(); - - q*= TMath::Sqrt((1.0 - s*s) / (1.0 + t*t)); + q*= TMath::Sqrt((1-s*s)/(1+t*t)); fdQdl[fNdedx] = q; fNdedx++; } -//_____________________________________________________________________________ -void AliTRDtrack::GetXYZ(Float_t r[3]) const -{ +Double_t AliTRDtrack::GetBz() const { // - // Returns the position of the track in the global coord. system + // returns Bz component of the magnetic field (kG) // + if (AliTracker::UniformField()) return AliTracker::GetBz(); + Double_t r[3]; GetXYZ(r); + return AliTracker::GetBz(r); +} - Double_t cs = TMath::Cos(fAlpha); - Double_t sn = TMath::Sin(fAlpha); - r[0] = fX*cs - fY*sn; - r[1] = fX*sn + fY*cs; - r[2] = fZ; -} diff --git a/TRD/AliTRDtrack.h b/TRD/AliTRDtrack.h index 76a0aa623b2..19c1d47e9e7 100644 --- a/TRD/AliTRDtrack.h +++ b/TRD/AliTRDtrack.h @@ -13,14 +13,10 @@ /////////////////////////////////////////////////////////////////////////////// #include "AliKalmanTrack.h" - #include "AliTRDtracklet.h" class AliESDtrack; class AliTrackReference; -class AliTPCtrack; - -class AliTRDcluster; const unsigned kMAXCLUSTERSPERTRACK = 210; @@ -38,150 +34,116 @@ class AliTRDtrack : public AliKalmanTrack { public: - AliTRDtrack(); - AliTRDtrack(const AliTRDcluster *c, UInt_t index, const Double_t xx[5] - , const Double_t cc[15], Double_t xr, Double_t alpha); - AliTRDtrack(const AliTRDtrack &t); - AliTRDtrack(const AliKalmanTrack &t, Double_t alpha); - AliTRDtrack(const AliESDtrack &t); - virtual ~AliTRDtrack(); - AliTRDtrack &operator=(const AliTRDtrack &t); - - Int_t Compare(const TObject *o) const; - void CookdEdx(Double_t low = 0.05, Double_t up = 0.7); - Float_t StatusForTOF(); - - Double_t GetAlpha() const { return fAlpha; } - Int_t GetSector() const; - Double_t GetC() const { return fC; } - Int_t GetClusterIndex(Int_t i) const { return fIndex[i]; } - Float_t GetClusterdQdl(Int_t i) const { return fdQdl[i]; } - void GetCovariance(Double_t cov[15]) const; - Double_t GetdEdx() const { return fdEdx; } - Double_t GetPIDsignal() const { return GetdEdx(); } - Float_t GetPIDsignals(Int_t iPlane, Int_t iSlice) const - { return fdEdxPlane[iPlane][iSlice]; } - Int_t GetPIDTimBin(Int_t i) const { return fTimBinPlane[i]; } - Double_t GetEta() const { return fE; } - void GetExternalCovariance(Double_t cov[15]) const; - void GetExternalParameters(Double_t &xr, Double_t x[5]) const; - Double_t GetLikelihoodElectron() const { return fLhElectron; } - Double_t Get1Pt() const; - Double_t GetP() const; - Double_t GetPredictedChi2(const AliTRDcluster *c, Double_t h01) const; - Double_t GetPt() const { return 1.0 / Get1Pt(); } - void GetPxPyPz(Double_t &px, Double_t &py, Double_t &pz) const; - void GetGlobalXYZ(Double_t &x, Double_t &y, Double_t &z) const; - Int_t GetSeedLabel() const { return fSeedLab; } - Double_t GetSigmaC2() const { return fCcc; } - Double_t GetSigmaTgl2() const { return fCtt; } - Double_t GetSigmaY2() const { return fCyy; } - Double_t GetSigmaZ2() const { return fCzz; } - Double_t GetSnp() const { return fX * fC - fE; } - Double_t GetTgl() const { return fT; } - Double_t GetX() const { return fX; } - Double_t GetY() const { return fY; } - Double_t GetZ() const { return fZ; } - Int_t *GetBackupIndexes() { return fIndexBackup; } - Int_t *GetIndexes() { return fIndex; } - Double_t GetYat(Double_t xk) const; - Int_t GetProlongation(Double_t xk, Double_t &y, Double_t &z); - Int_t GetNWrong() const { return fNWrong; } - Int_t GetNRotate() const { return fNRotate; } - Int_t GetNCross() const { return fNCross; } - Bool_t GetStop() const { return fStopped; } - - void SetdEdx(Float_t dedx) { fdEdx = dedx; } - void SetPIDsignals(Float_t dedx, Int_t iPlane, Int_t iSlice) - { fdEdxPlane[iPlane][iSlice] = dedx; } - void SetPIDTimBin(Int_t timbin, Int_t i) { fTimBinPlane[i] = timbin; } - void SetLikelihoodElectron(Float_t l) { fLhElectron = l; } - void SetSampledEdx(Float_t q, Int_t i); - void SetSampledEdx(Float_t q); - void SetSeedLabel(Int_t lab) { fSeedLab = lab; } - void SetStop(Bool_t stop) { fStopped = stop; } - - Int_t PropagateTo(Double_t xr, Double_t x0 = 8.72, Double_t rho = 5.86e-3); - Int_t PropagateToX(Double_t xr, Double_t step); - Int_t PropagateToR(Double_t xr, Double_t step); - void ResetCovariance(); - void ResetCovariance(Float_t mult); - void ResetClusters() { SetChi2(0.0); - SetNumberOfClusters(0); } - Int_t Rotate(Double_t angle, Bool_t absolute = kFALSE); - Int_t Update(const AliTRDcluster *c, Double_t chi2, UInt_t i, Double_t h01); - Int_t UpdateMI(const AliTRDcluster *c, Double_t chi2, UInt_t i, Double_t h01, Int_t plane); - Int_t UpdateMI(const AliTRDtracklet &tracklet); - void AddNWrong() { fNWrong++; } - void IncCross() { fNCross++; - if (fBackupTrack) - fBackupTrack->IncCross(); } - AliTRDtrack *GetBackupTrack() { return fBackupTrack; } - void MakeBackupTrack(); + AliTRDtrack(); + AliTRDtrack(const AliTRDcluster *c, Int_t index, const Double_t xx[5], + const Double_t cc[15], Double_t xr, Double_t alpha); + AliTRDtrack(const AliTRDtrack& t); + AliTRDtrack(const AliESDtrack& t); + ~AliTRDtrack(); - protected: + AliTRDtrack(const AliKalmanTrack& t, Double_t alpha); - inline void GetXYZ(Float_t r[3]) const; - Double_t GetPredictedChi2(const AliCluster*/*c*/) const { return 0.0; } - Int_t Update(const AliCluster*/*c*/, Double_t /*chi2*/, UInt_t /*i*/) { return 0; } - - Int_t fSeedLab; // Track label taken from seeding - Float_t fdEdx; // dE/dx - truncated mean - Float_t fDE; // Integrated delta energy - Float_t fdEdxPlane[kNplane][kNslice]; // dE/dx from all 6 planes in 3 slices each - Int_t fTimBinPlane[kNplane]; // Time bin of Max cluster from all 6 planes - - Double_t fAlpha; // Rotation angle - Double_t fX; // Running local X-coordinate of the track (time bin) - Bool_t fStopped; // Track stop indication - - Double_t fY; // Y-coordinate of the track - Double_t fZ; // Z-coordinate of the track - Double_t fE; // C*x0 - Double_t fT; // Tangent of the track momentum dip angle - Double_t fC; // Track curvature - - Double_t fCyy; // Covariance - Double_t fCzy, fCzz; // matrix - Double_t fCey, fCez, fCee; // of the - Double_t fCty, fCtz, fCte, fCtt; // track - Double_t fCcy, fCcz, fCce, fCct, fCcc; // parameters - - Int_t fIndex[kMAXCLUSTERSPERTRACK]; // Global indexes of clusters - Int_t fIndexBackup[kMAXCLUSTERSPERTRACK]; // Backup indexes of clusters - used in iterations - Float_t fdQdl[kMAXCLUSTERSPERTRACK]; // Cluster amplitudes corrected for track angles + Int_t Compare(const TObject *o) const; + + void SetdEdx(Double_t dedx) {fdEdx=dedx;} + Double_t GetdEdx() const {return fdEdx;} + Double_t GetPIDsignal() const {return GetdEdx();} + + Int_t GetClusterIndex(Int_t i) const {return fIndex[i];} + + Double_t GetC() const {return AliExternalTrackParam::GetC(GetBz());} + + Double_t GetPredictedChi2(const AliTRDcluster* c, Double_t h01) const; + Bool_t PropagateTo(Double_t xr, Double_t x0=8.72, Double_t rho=5.86e-3); + Bool_t Update(const AliTRDcluster* c, Double_t chi2, Int_t i, Double_t h01); + Bool_t Rotate(Double_t angle, Bool_t absolute=kFALSE); + + void ResetClusters() { SetChi2(0.); SetNumberOfClusters(0); } + + void CookdEdx(Double_t low=0.05, Double_t up=0.7); + Float_t StatusForTOF(); + + Int_t GetSector() const; + + Float_t GetClusterdQdl(Int_t i) const { return fdQdl[i]; } + + Float_t GetPIDsignals(Int_t iPlane, Int_t iSlice) const + { return fdEdxPlane[iPlane][iSlice]; } + Int_t GetPIDTimBin(Int_t i) const { return fTimBinPlane[i];} + + Double_t GetLikelihoodElectron() const { return fLhElectron; } + + + Int_t GetSeedLabel() const { return fSeedLab; } + + Int_t *GetBackupIndexes() { return fIndexBackup; } + Int_t *GetIndexes() { return fIndex; } + + Int_t GetProlongation(Double_t xk, Double_t &y, Double_t &z); + + void SetStop(Bool_t stop) { fStopped = stop; } + Bool_t GetStop() const { return fStopped; } + + Int_t PropagateToX(Double_t xr, Double_t step); + Int_t PropagateToR(Double_t xr, Double_t step); + + void SetPIDsignals(Float_t dedx, Int_t iPlane, Int_t iSlice) + { fdEdxPlane[iPlane][iSlice] = dedx; } + void SetPIDTimBin(Int_t timbin, Int_t i) { fTimBinPlane[i] = timbin; } + void SetLikelihoodElectron(Float_t l) { fLhElectron = l; } + + void SetSampledEdx(Float_t q, Int_t i); + void SetSampledEdx(Float_t q); + void SetSeedLabel(Int_t lab) { fSeedLab = lab; } + + Int_t UpdateMI(const AliTRDcluster* c, Double_t chi2, Int_t i, Double_t h01, Int_t plane); + //Int_t UpdateMI(const AliTRDtracklet & tracklet); + + void AddNWrong() { fNWrong++; } + + Int_t GetNWrong() const { return fNWrong; } + Int_t GetNRotate() const { return fNRotate; } + Int_t GetNCross() const { return fNCross; } + void IncCross() { fNCross++; if (fBackupTrack) fBackupTrack->IncCross(); } + AliTRDtrack *GetBackupTrack() { return fBackupTrack; } + void MakeBackupTrack(); + + protected: + Double_t GetBz() const; + Bool_t Update(const AliCluster */*c*/, Double_t /*chi2*/, Int_t /*idx*/) { + return 0; + } + Double_t GetPredictedChi2(const AliCluster */*c*/) const {return 0.;} + + AliTRDtrack &operator=(const AliTRDtrack &t); + + Int_t fSeedLab; // track label taken from seeding + Float_t fdEdx; // dE/dx + Float_t fdEdxT; // dE/dx - truncated mean + Float_t fDE; // integrated delta energy + Float_t fdEdxPlane[kNplane][kNslice]; // dE/dx from all 6 planes in 3 slices each + Int_t fTimBinPlane[kNplane]; // time bin of Max cluster from all 6 planes + + Bool_t fStopped; // track stop indication + Int_t fIndex[kMAXCLUSTERSPERTRACK]; // global indexes of clusters + Int_t fIndexBackup[kMAXCLUSTERSPERTRACK]; // backup indexes of clusters - used in iterations + Float_t fdQdl[kMAXCLUSTERSPERTRACK]; // cluster amplitudes corrected for track angles - Float_t fLhElectron; // Likelihood to be an electron - Int_t fNWrong; // Number of wrong clusters - Int_t fNRotate; // Number of rotation - Int_t fNCross; // Number of the cross materials - Int_t fNExpected; // Expected number of cluster - Int_t fNLast; // Number of clusters in last 2 layers - Int_t fNExpectedLast; // Number of expected clusters on last 2 layers - Int_t fNdedx; // Number of clusters for dEdx measurment - Float_t fChi2Last; // Chi2 in the last 2 layers - AliTRDtracklet fTracklets[6]; // Tracklets - Float_t fBudget[3]; // Integrated material budget - AliTRDtrack *fBackupTrack; //! Backup track - - ClassDef(AliTRDtrack,6) // TRD reconstructed tracks + Float_t fLhElectron; // Likelihood to be an electron + Int_t fNWrong; // number of wrong clusters + Int_t fNRotate; // number of rotation + Int_t fNCross; // number of the cross materials + Int_t fNExpected; // expected number of cluster + Int_t fNLast; // number of clusters in last 2 layers + Int_t fNExpectedLast; // number of expected clusters on last 2 layers + Int_t fNdedx; // number of clusters for dEdx measurment + Float_t fChi2Last; // chi2 in the last 2 layers + AliTRDtracklet fTracklets[6]; // tracklets + Float_t fBudget[3]; // integrated material budget + AliTRDtrack *fBackupTrack; //! backup track + + ClassDef(AliTRDtrack,7) // TRD reconstructed tracks }; -//_____________________________________________________________________________ -inline void AliTRDtrack::GetExternalParameters(Double_t &xr, Double_t x[5]) const -{ - // - // This function returns external TRD track representation - // - - xr = fX; - x[0] = GetY(); - x[1] = GetZ(); - x[2] = GetSnp(); - x[3] = GetTgl(); - x[4] = (TMath::Sign(1.0e-9,fC) + fC) * GetLocalConvConst(); - -} - #endif diff --git a/TRD/AliTRDtracker.cxx b/TRD/AliTRDtracker.cxx index a14a1a5d425..6575742e957 100644 --- a/TRD/AliTRDtracker.cxx +++ b/TRD/AliTRDtracker.cxx @@ -23,20 +23,10 @@ /////////////////////////////////////////////////////////////////////////////// #include - #include #include #include #include -#include -#include -#include - -#include "AliESD.h" -#include "AliRieman.h" -#include "AliAlignObj.h" -#include "AliTrackPointArray.h" -#include "AliLog.h" #include "AliTRDgeometry.h" #include "AliTRDpadPlane.h" @@ -44,9 +34,18 @@ #include "AliTRDcluster.h" #include "AliTRDtrack.h" #include "AliTRDseed.h" +#include "AliESD.h" + #include "AliTRDcalibDB.h" #include "AliTRDCommonParam.h" + +#include "TTreeStream.h" +#include "TGraph.h" #include "AliTRDtracker.h" +#include "TLinearFitter.h" +#include "AliRieman.h" +#include "AliTrackPointArray.h" +#include "AliAlignObj.h" #include "AliTRDReconstructor.h" ClassImp(AliTRDtracker) @@ -58,38 +57,33 @@ ClassImp(AliTRDtracker) const Double_t AliTRDtracker::fgkMaxStep = 2.; // maximal step size in propagation //_____________________________________________________________________________ -AliTRDtracker::AliTRDtracker() - :AliTracker() - ,fGeom(0) - ,fNclusters(0) - ,fClusters(0) - ,fNseeds(0) - ,fSeeds(0) - ,fNtracks(0) - ,fTracks(0) - ,fTimeBinsPerPlane(0) - ,fAddTRDseeds(kFALSE) - ,fNoTilt(kFALSE) - ,fDebugStreamer(0) +AliTRDtracker::AliTRDtracker(): + AliTracker(), + fGeom(0), + fNclusters(0), + fClusters(0), + fNseeds(0), + fSeeds(0), + fNtracks(0), + fTracks(0), + fTimeBinsPerPlane(0), + fAddTRDseeds(kFALSE), + fNoTilt(kFALSE), + fDebugStreamer(0) { // // Default constructor // - for (Int_t i = 0; i < kTrackingSectors; i++) { - fTrSec[i] = 0; - } - for (Int_t j = 0; j < 5; j++) { - for (Int_t k = 0; k < 18; k++) { - fHoles[j][k] = kFALSE; - } - } + for(Int_t i=0;iIsOpen()) { - AliWarning("Geometry file is not open!\n"); - AliWarning("FULL TRD geometry and DEFAULT TRD parameter will be used\n"); + printf("AliTRDtracker::AliTRDtracker(): geometry file is not open!\n"); + printf(" FULL TRD geometry and DEFAULT TRD parameter will be used\n"); } else { in->cd(); - fGeom = (AliTRDgeometry *) in->Get("TRDgeometry"); + fGeom = (AliTRDgeometry*) in->Get("TRDgeometry"); } - if (!fGeom) { - AliWarning("Can't find TRD geometry!\n"); + if(fGeom) { + // printf("Found geometry version %d on file \n", fGeom->IsVersion()); + } + else { + printf("AliTRDtracker::AliTRDtracker(): can't find TRD geometry!\n"); fGeom = new AliTRDgeometry(); } fGeom->ReadGeoMatrices(); savedir->cd(); - for (Int_t geomS = 0; geomS < kTrackingSectors; geomS++) { + for(Int_t geomS = 0; geomS < kTrackingSectors; geomS++) { Int_t trS = CookSectorIndex(geomS); - fTrSec[trS] = new AliTRDtrackingSector(fGeom,geomS); - for (Int_t icham = 0; icham < AliTRDgeometry::kNcham; icham++) { - fHoles[icham][trS] = fGeom->IsHole(0,icham,geomS); + fTrSec[trS] = new AliTRDtrackingSector(fGeom, geomS); + for (Int_t icham=0;ichamIsHole(0,icham,geomS); } } AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(0,0); Float_t tiltAngle = TMath::Abs(padPlane->GetTiltingAngle()); - if (tiltAngle < 0.1) { + if(tiltAngle < 0.1) { fNoTilt = kTRUE; } fTimeBinsPerPlane = AliTRDcalibDB::Instance()->GetNumberOfTimeBins(); - fDebugStreamer = new TTreeSRedirector("TRDdebug.root"); + fDebugStreamer = new TTreeSRedirector("TRDdebug.root"); savedir->cd(); @@ -193,6 +188,7 @@ AliTRDtracker::~AliTRDtracker() delete fTrSec[geomS]; } if (fDebugStreamer) { + //fDebugStreamer->Close(); delete fDebugStreamer; } @@ -205,9 +201,9 @@ Int_t AliTRDtracker::LocalToGlobalID(Int_t lid) // Transform internal TRD ID to global detector ID // - Int_t isector = fGeom->GetSector(lid); - Int_t ichamber = fGeom->GetChamber(lid); - Int_t iplan = fGeom->GetPlane(lid); + Int_t isector = fGeom->GetSector(lid); + Int_t ichamber= fGeom->GetChamber(lid); + Int_t iplan = fGeom->GetPlane(lid); // AliAlignObj::ELayerID iLayer = AliAlignObj::kTRD1; switch (iplan) { @@ -230,8 +226,7 @@ Int_t AliTRDtracker::LocalToGlobalID(Int_t lid) iLayer = AliAlignObj::kTRD6; break; }; - - Int_t modId = isector * fGeom->Ncham() + ichamber; + Int_t modId = isector*fGeom->Ncham()+ichamber; UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,modId); return volid; @@ -245,34 +240,34 @@ Int_t AliTRDtracker::GlobalToLocalID(Int_t gid) // Transform global detector ID to local detector ID // - Int_t modId = 0; - AliAlignObj::ELayerID layerId = AliAlignObj::VolUIDToLayer(gid,modId); - Int_t isector = modId / fGeom->Ncham(); - Int_t ichamber = modId % fGeom->Ncham(); - Int_t iLayer = -1; + Int_t modId=0; + AliAlignObj::ELayerID layerId = AliAlignObj::VolUIDToLayer(gid, modId); + Int_t isector = modId/fGeom->Ncham(); + Int_t ichamber = modId%fGeom->Ncham(); + Int_t iLayer = -1; switch (layerId) { case AliAlignObj::kTRD1: - iLayer = 0; + iLayer = 0; break; case AliAlignObj::kTRD2: - iLayer = 1; + iLayer = 1; break; case AliAlignObj::kTRD3: - iLayer = 2; + iLayer = 2; break; case AliAlignObj::kTRD4: - iLayer = 3; + iLayer = 3; break; case AliAlignObj::kTRD5: - iLayer = 4; + iLayer = 4; break; case AliAlignObj::kTRD6: - iLayer = 5; + iLayer = 5; break; default: - iLayer = -1; + iLayer =-1; } - if (iLayer < 0) return -1; + if (iLayer<0) return -1; Int_t lid = fGeom->GetDetector(iLayer,ichamber,isector); return lid; @@ -280,74 +275,73 @@ Int_t AliTRDtracker::GlobalToLocalID(Int_t gid) } //_____________________________________________________________________________ -Bool_t AliTRDtracker::Transform(AliTRDcluster *cluster) +Bool_t AliTRDtracker::Transform(AliTRDcluster * cluster) { // // Transform something ... whatever ... // - // Magic constants for geo manager transformation - const Double_t kX0shift = 2.52; - const Double_t kX0shift5 = 3.05; - + const Double_t kX0shift = 2.52; // magic constants for geo manager transformation + const Double_t kX0shift5 = 3.05; // // - // Apply alignment and calibration to transform cluster // - Int_t detector = cluster->GetDetector(); - Int_t plane = fGeom->GetPlane(cluster->GetDetector()); - Int_t chamber = fGeom->GetChamber(cluster->GetDetector()); - Int_t sector = fGeom->GetSector(cluster->GetDetector()); - - Double_t dxAmp = (Double_t) fGeom->CamHght(); // Amplification region - Double_t driftX = TMath::Max(cluster->GetX()-dxAmp*0.5,0.0); // Drift distance + // apply alignment and calibration to transform cluster + // + // + Int_t detector = cluster->GetDetector(); + Int_t plane = fGeom->GetPlane(cluster->GetDetector()); + Int_t chamber = fGeom->GetChamber(cluster->GetDetector()); + Int_t sector = fGeom->GetSector(cluster->GetDetector()); + Double_t dxAmp = (Double_t) fGeom->CamHght(); // Amplification region + Double_t driftX = TMath::Max(cluster->GetX()-dxAmp*0.5,0.); // drift distance // // ExB correction // Double_t vdrift = AliTRDcalibDB::Instance()->GetVdrift(cluster->GetDetector(),0,0); - Double_t exB = AliTRDcalibDB::Instance()->GetOmegaTau(vdrift); - - AliTRDCommonParam *commonParam = AliTRDCommonParam::Instance(); - AliTRDpadPlane *padPlane = commonParam->GetPadPlane(plane,chamber); + Double_t exB = AliTRDcalibDB::Instance()->GetOmegaTau(vdrift); + // + AliTRDCommonParam* commonParam = AliTRDCommonParam::Instance(); + AliTRDpadPlane * padPlane = commonParam->GetPadPlane(plane,chamber); Double_t zshiftIdeal = 0.5*(padPlane->GetRow0()+padPlane->GetRowEnd()); - Double_t localPos[3]; - Double_t localPosTracker[3]; + Double_t localPos[3], localPosTracker[3]; localPos[0] = -cluster->GetX(); localPos[1] = cluster->GetY() - driftX*exB; - localPos[2] = cluster->GetZ() - zshiftIdeal; - + localPos[2] = cluster->GetZ() -zshiftIdeal; + // cluster->SetY(cluster->GetY() - driftX*exB); Double_t xplane = (Double_t) AliTRDgeometry::GetTime0(plane); cluster->SetX(xplane- cluster->GetX()); - - TGeoHMatrix *matrix = fGeom->GetCorrectionMatrix(cluster->GetDetector()); + // + TGeoHMatrix * matrix = fGeom->GetCorrectionMatrix(cluster->GetDetector()); if (!matrix){ - // No matrix found - if somebody used geometry with holes + // no matrix found - if somebody used geometry with holes AliError("Invalid Geometry - Default Geometry used\n"); return kTRUE; } matrix->LocalToMaster(localPos, localPosTracker); - - if (AliTRDReconstructor::StreamLevel() > 1) { - (* fDebugStreamer) << "Transform" - << "Cl.=" << cluster - << "matrix.=" << matrix - << "Detector=" << detector - << "Sector=" << sector - << "Plane=" << plane - << "Chamber=" << chamber - << "lx0=" << localPosTracker[0] - << "ly0=" << localPosTracker[1] - << "lz0=" << localPosTracker[2] - << "\n"; + // + // + // + if (AliTRDReconstructor::StreamLevel()>1){ + (*fDebugStreamer)<<"Transform"<< + "Cl.="<SetX(localPosTracker[0]+kX0shift5); - } - else { + else cluster->SetX(localPosTracker[0]+kX0shift); - } + cluster->SetY(localPosTracker[1]); cluster->SetZ(localPosTracker[2]); @@ -443,23 +437,18 @@ Bool_t AliTRDtracker::AdjustSector(AliTRDtrack *track) // Double_t alpha = AliTRDgeometry::GetAlpha(); - Double_t y = track->GetY(); - Double_t ymax = track->GetX() * TMath::Tan(0.5*alpha); + Double_t y = track->GetY(); + Double_t ymax = track->GetX()*TMath::Tan(0.5*alpha); //Int_t ns = AliTRDgeometry::kNsect; //Int_t s=Int_t(track->GetAlpha()/alpha)%ns; - if (y > ymax) { + if (y > ymax) { //s = (s+1) % ns; - if (!track->Rotate(alpha)) { - return kFALSE; - } - } - else if (y < -ymax) { + if (!track->Rotate(alpha)) return kFALSE; + } else if (y <-ymax) { //s = (s-1+ns) % ns; - if (!track->Rotate(-alpha)) { - return kFALSE; - } + if (!track->Rotate(-alpha)) return kFALSE; } return kTRUE; @@ -474,21 +463,16 @@ AliTRDcluster *AliTRDtracker::GetCluster(AliTRDtrack *track, Int_t plane // Try to find cluster in the backup list // - AliTRDcluster *cl = 0; - Int_t *indexes = track->GetBackupIndexes(); - - for (UInt_t i = 0; i < kMaxTimeBinIndex; i++) { - if (indexes[i] == 0) break; - AliTRDcluster *cli = (AliTRDcluster *) fClusters->UncheckedAt(indexes[i]); - if (!cli) { - break; - } - if (cli->GetLocalTimeBin() != timebin) { - continue; - } + AliTRDcluster * cl =0; + Int_t *indexes = track->GetBackupIndexes(); + for (UInt_t i=0;iUncheckedAt(indexes[i]); + if (!cli) break; + if (cli->GetLocalTimeBin()!=timebin) continue; Int_t iplane = fGeom->GetPlane(cli->GetDetector()); - if (iplane == plane) { - cl = cli; + if (iplane==plane) { + cl = cli; index = indexes[i]; break; } @@ -499,22 +483,19 @@ AliTRDcluster *AliTRDtracker::GetCluster(AliTRDtrack *track, Int_t plane } //_____________________________________________________________________________ -Int_t AliTRDtracker::GetLastPlane(AliTRDtrack *track) +Int_t AliTRDtracker::GetLastPlane(AliTRDtrack * track) { // // Return last updated plane // - Int_t lastplane = 0; - Int_t *indexes = track->GetBackupIndexes(); - - for (UInt_t i = 0; i < kMaxTimeBinIndex; i++) { - AliTRDcluster *cli = (AliTRDcluster *) fClusters->UncheckedAt(indexes[i]); - if (!cli) { - break; - } + Int_t lastplane=0; + Int_t *indexes = track->GetBackupIndexes(); + for (UInt_t i=0;iUncheckedAt(indexes[i]); + if (!cli) break; Int_t iplane = fGeom->GetPlane(cli->GetDetector()); - if (iplane > lastplane) { + if (iplane>lastplane) { lastplane = iplane; } } @@ -534,31 +515,33 @@ Int_t AliTRDtracker::Clusters2Tracks(AliESD* event) // of the TRD and the ESD event is updated // - Int_t timeBins = fTrSec[0]->GetNumberOfTimeBins(); + Int_t timeBins = fTrSec[0]->GetNumberOfTimeBins(); Float_t foundMin = fgkMinClustersInTrack * timeBins; - Int_t nseed = 0; - Int_t found = 0; - //Int_t innerTB = fTrSec[0]->GetInnerTimeBin(); + Int_t nseed = 0; + Int_t found = 0; + // Int_t innerTB = fTrSec[0]->GetInnerTimeBin(); Int_t n = event->GetNumberOfTracks(); - for (Int_t i = 0; i < n; i++) { - AliESDtrack *seed = event->GetTrack(i); - ULong_t status = seed->GetStatus(); - if ((status & AliESDtrack::kTRDout) == 0) continue; - if ((status & AliESDtrack::kTRDin) != 0) continue; + for (Int_t i=0; iGetTrack(i); + ULong_t status=seed->GetStatus(); + if ( (status & AliESDtrack::kTRDout ) == 0 ) continue; + if ( (status & AliESDtrack::kTRDin) != 0 ) continue; nseed++; - AliTRDtrack *seed2 = new AliTRDtrack(*seed); + AliTRDtrack* seed2 = new AliTRDtrack(*seed); //seed2->ResetCovariance(); AliTRDtrack *pt = new AliTRDtrack(*seed2,seed2->GetAlpha()); + //AliTRDtrack *pt = new AliTRDtrack(*seed2); // !!! AliTRDtrack &t=*pt; FollowProlongation(t); if (t.GetNumberOfClusters() >= foundMin) { UseClusters(&t); - CookLabel(pt,1-fgkLabelFraction); - //t.CookdEdx(); + CookLabel(pt, 1-fgkLabelFraction); + // t.CookdEdx(); } found++; +// cout<GetNumberOfTracks(); - - // Sort tracks - Float_t *quality = new Float_t[n]; - Int_t *index = new Int_t[n]; - for (Int_t i = 0; i < n; i++) { - AliESDtrack *seed = event->GetTrack(i); + Int_t n = event->GetNumberOfTracks(); + // + //Sort tracks + Float_t *quality =new Float_t[n]; + Int_t *index =new Int_t[n]; + for (Int_t i=0; iGetTrack(i); Double_t covariance[15]; seed->GetExternalCovariance(covariance); quality[i] = covariance[0]+covariance[2]; } TMath::Sort(n,quality,index,kFALSE); - - for (Int_t i = 0; i < n; i++) { - + // + for (Int_t i=0; iGetTrack(i); AliESDtrack* seed=event->GetTrack(index[i]); - ULong_t status = seed->GetStatus(); - if ((status & AliESDtrack::kTPCout) == 0) continue; - if ((status & AliESDtrack::kTRDout) != 0) continue; + ULong_t status=seed->GetStatus(); + if ( (status & AliESDtrack::kTPCout ) == 0 ) continue; + if ( (status & AliESDtrack::kTRDout) != 0 ) continue; Int_t lbl = seed->GetLabel(); AliTRDtrack *track = new AliTRDtrack(*seed); track->SetSeedLabel(lbl); - seed->UpdateTrackParams(track,AliESDtrack::kTRDbackup); // Make backup + seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup); //make backup fNseeds++; - Float_t p4 = track->GetC(); - + Float_t p4 = track->GetC(); + // Int_t expectedClr = FollowBackProlongation(*track); - if ((TMath::Abs(track->GetC()-p4)/TMath::Abs(p4) < 0.2) || - (TMath::Abs(track->GetPt()) > 0.8)) { - + if (TMath::Abs(track->GetC()-p4)/TMath::Abs(p4)<0.2 || TMath::Abs(track->GetPt())>0.8 ) { // - // Make backup for back propagation + //make backup for back propagation // Int_t foundClr = track->GetNumberOfClusters(); if (foundClr >= foundMin) { track->CookdEdx(); CookdEdxTimBin(*track); - CookLabel(track,1-fgkLabelFraction); - if (track->GetBackupTrack()) { - UseClusters(track->GetBackupTrack()); - } - if (track->GetChi2()/track->GetNumberOfClusters() < 4) { - // Sign only gold tracks - if ((seed->GetKinkIndex(0) == 0) && - (TMath::Abs(track->GetPt()) < 1.5)) { - UseClusters(track); - } + CookLabel(track, 1-fgkLabelFraction); + if (track->GetBackupTrack()) UseClusters(track->GetBackupTrack()); + if(track->GetChi2()/track->GetNumberOfClusters()<4) { // sign only gold tracks + if (seed->GetKinkIndex(0)==0&&TMath::Abs(track->GetPt())<1.5 ) UseClusters(track); } Bool_t isGold = kFALSE; - if (track->GetChi2()/track->GetNumberOfClusters() < 5) { - // Full gold track - //seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup); - if (track->GetBackupTrack()) { - seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup); - } + if (track->GetChi2()/track->GetNumberOfClusters()<5) { //full gold track + // seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup); + if (track->GetBackupTrack()) seed->UpdateTrackParams(track->GetBackupTrack(), AliESDtrack::kTRDbackup); isGold = kTRUE; } - if ((!isGold) && - (track->GetNCross() == 0) && - (track->GetChi2()/track->GetNumberOfClusters() < 7)){ - // Almost gold track - //seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup); - if (track->GetBackupTrack()) { - seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup); - } + if (!isGold && track->GetNCross()==0&&track->GetChi2()/track->GetNumberOfClusters()<7){ //almost gold track + // seed->UpdateTrackParams(track, AliESDtrack::kTRDbackup); + if (track->GetBackupTrack()) seed->UpdateTrackParams(track->GetBackupTrack(), AliESDtrack::kTRDbackup); isGold = kTRUE; } - if (!isGold && track->GetBackupTrack()) { - if ((track->GetBackupTrack()->GetNumberOfClusters() > foundMin) && - ((track->GetBackupTrack()->GetChi2()/(track->GetBackupTrack()->GetNumberOfClusters()+1)) < 7)) { - seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup); + if (!isGold && track->GetBackupTrack()){ + if (track->GetBackupTrack()->GetNumberOfClusters()>foundMin&& + (track->GetBackupTrack()->GetChi2()/(track->GetBackupTrack()->GetNumberOfClusters()+1))<7){ + seed->UpdateTrackParams(track->GetBackupTrack(), AliESDtrack::kTRDbackup); isGold = kTRUE; } } - if ((track->StatusForTOF() > 0) && - (track->fNCross == 0) && - (Float_t(track->fN)/Float_t(track->fNExpected) > 0.4)){ - //seed->UpdateTrackParams(track->GetBackupTrack(),AliESDtrack::kTRDbackup); + if (track->StatusForTOF()>0 &&track->fNCross==0 && Float_t(track->fN)/Float_t(track->fNExpected)>0.4){ + //seed->UpdateTrackParams(track->GetBackupTrack(), AliESDtrack::kTRDbackup); } } } - // Debug part of tracking - TTreeSRedirector &cstream = *fDebugStreamer; + TTreeSRedirector& cstream = *fDebugStreamer; Int_t eventNr = event->GetEventNumber(); - if (AliTRDReconstructor::StreamLevel() > 0) { - if (track->GetBackupTrack()) { - cstream << "Tracks" - << "EventNr=" << eventNr - << "ESD.=" << seed - << "trd.=" << track - << "trdback.=" << track->GetBackupTrack() - << "\n"; - } - else { - cstream << "Tracks" - << "EventNr=" << eventNr - << "ESD.=" << seed - << "trd.=" << track - << "trdback.=" << track - << "\n"; + if (AliTRDReconstructor::StreamLevel()>0){ + if (track->GetBackupTrack()){ + cstream<<"Tracks"<< + "EventNr="<GetStop() == kFALSE) { + // + //Propagation to the TOF (I.Belikov) + if (track->GetStop()==kFALSE){ - //???? - Double_t xtof = 371.0; - Double_t c2 = track->GetC()*xtof - track->GetEta(); - if (TMath::Abs(c2) >= 0.99) { + Double_t xtof=371.; + Double_t c2=track->GetSnp() + track->GetC()*(xtof - track->GetX()); + if (TMath::Abs(c2)>=0.99) { delete track; continue; } Double_t xTOF0 = 370. ; PropagateToX(*track,xTOF0,fgkMaxStep); - - // Energy losses taken to the account - check one more time - c2 = track->GetC()*xtof - track->GetEta(); - if (TMath::Abs(c2) >= 0.99) { + // + //energy losses taken to the account - check one more time + c2=track->GetSnp() + track->GetC()*(xtof - track->GetX()); + if (TMath::Abs(c2)>=0.99) { delete track; continue; } - Double_t ymax = xtof*TMath::Tan(0.5*AliTRDgeometry::GetAlpha()); - Double_t y = track->GetYat(xtof); - if (y > ymax) { + // + Double_t ymax=xtof*TMath::Tan(0.5*AliTRDgeometry::GetAlpha()); + Double_t y; track->GetYAt(xtof,GetBz(),y); + if (y > ymax) { if (!track->Rotate(AliTRDgeometry::GetAlpha())) { delete track; continue; } - } - else if (y < -ymax) { + } else if (y <-ymax) { if (!track->Rotate(-AliTRDgeometry::GetAlpha())) { delete track; continue; @@ -733,26 +700,22 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event) } if (track->PropagateTo(xtof)) { - seed->UpdateTrackParams(track,AliESDtrack::kTRDout); - for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) { - for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) { + seed->UpdateTrackParams(track, AliESDtrack::kTRDout); + for (Int_t i=0;iSetTRDsignals(track->GetPIDsignals(i,j),i,j); } seed->SetTRDTimBin(track->GetPIDTimBin(i),i); } - //seed->SetTRDtrack(new AliTRDtrack(*track)); - if (track->GetNumberOfClusters() > foundMin) { - found++; - } + // seed->SetTRDtrack(new AliTRDtrack(*track)); + if (track->GetNumberOfClusters()>foundMin) found++; } - } - else { - if ((track->GetNumberOfClusters() > 15) && - (track->GetNumberOfClusters() > 0.5*expectedClr)) { - seed->UpdateTrackParams(track,AliESDtrack::kTRDout); + }else{ + if (track->GetNumberOfClusters()>15&&track->GetNumberOfClusters()>0.5*expectedClr){ + seed->UpdateTrackParams(track, AliESDtrack::kTRDout); //seed->SetStatus(AliESDtrack::kTRDStop); - for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) { - for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) { + for (Int_t i=0;iSetTRDsignals(track->GetPIDsignals(i,j),i,j); } seed->SetTRDTimBin(track->GetPIDTimBin(i),i); @@ -765,20 +728,20 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event) seed->SetTRDBudget(track->fBudget[0]); delete track; + // + //End of propagation to the TOF + //if (foundClr>foundMin) + // seed->UpdateTrackParams(track, AliESDtrack::kTRDout); + } - - AliInfo(Form("Number of seeds: %d",fNseeds)); - AliInfo(Form("Number of back propagated TRD tracks: %d",found)); - - // New seeding - if (AliTRDReconstructor::SeedingOn()) { - MakeSeedsMI(3,5,event); - } - fSeeds->Clear(); - fNseeds = 0; + cerr<<"Number of seeds: "<Clear(); fNseeds=0; delete [] index; delete [] quality; @@ -787,7 +750,7 @@ Int_t AliTRDtracker::PropagateBack(AliESD *event) } //_____________________________________________________________________________ -Int_t AliTRDtracker::RefitInward(AliESD *event) +Int_t AliTRDtracker::RefitInward(AliESD* event) { // // Refits tracks within the TRD. The ESD event is expected to contain seeds @@ -797,79 +760,92 @@ Int_t AliTRDtracker::RefitInward(AliESD *event) // Origin: Thomas KUHR (Thomas.Kuhr@cern.ch) // - Int_t timeBins = fTrSec[0]->GetNumberOfTimeBins(); + Int_t timeBins = fTrSec[0]->GetNumberOfTimeBins(); Float_t foundMin = fgkMinClustersInTrack * timeBins; - Int_t nseed = 0; - Int_t found = 0; - //Int_t innerTB = fTrSec[0]->GetInnerTimeBin(); + Int_t nseed = 0; + Int_t found = 0; + // Int_t innerTB = fTrSec[0]->GetInnerTimeBin(); AliTRDtrack seed2; - + Int_t n = event->GetNumberOfTracks(); - for (Int_t i = 0; i < n; i++) { - AliESDtrack *seed = event->GetTrack(i); + for (Int_t i=0; iGetTrack(i); new(&seed2) AliTRDtrack(*seed); - if (seed2.GetX() < 270) { - // Backup TPC track - only update - seed->UpdateTrackParams(&seed2,AliESDtrack::kTRDbackup); + if (seed2.GetX()<270){ + seed->UpdateTrackParams(&seed2, AliESDtrack::kTRDbackup); // backup TPC track - only update continue; } - ULong_t status = seed->GetStatus(); - if ((status & AliESDtrack::kTRDout) == 0) { + ULong_t status=seed->GetStatus(); + if ( (status & AliESDtrack::kTRDout ) == 0 ) { continue; } - if ((status & AliESDtrack::kTRDin) != 0) { + if ( (status & AliESDtrack::kTRDin) != 0 ) { continue; } - nseed++; + nseed++; + + seed2.ResetCovariance(50.); + +// if (1/seed2.Get1Pt()>1.5&& seed2.GetX()>260.) { +// Double_t oldx = seed2.GetX(); +// seed2.PropagateTo(500.); +// seed2.ResetCovariance(1.); +// seed2.PropagateTo(oldx); +// } +// else{ +// seed2.ResetCovariance(5.); +// } AliTRDtrack *pt = new AliTRDtrack(seed2,seed2.GetAlpha()); - Int_t *indexes2 = seed2.GetIndexes(); - for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) { - for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) { + //AliTRDtrack *pt = new AliTRDtrack(seed2); // !!! + Int_t * indexes2 = seed2.GetIndexes(); + for (Int_t i=0;iSetPIDsignals(seed2.GetPIDsignals(i,j),i,j); } pt->SetPIDTimBin(seed2.GetPIDTimBin(i),i); } - Int_t *indexes3 = pt->GetBackupIndexes(); - for (Int_t i = 0; i < 200; i++) { - if (indexes2[i] == 0) break; + Int_t * indexes3 = pt->GetBackupIndexes(); + for (Int_t i=0;i<200;i++) { + if (indexes2[i]==0) break; indexes3[i] = indexes2[i]; } //AliTRDtrack *pt = seed2; - AliTRDtrack &t = *pt; + AliTRDtrack &t=*pt; FollowProlongation(t); if (t.GetNumberOfClusters() >= foundMin) { - //UseClusters(&t); - //CookLabel(pt,1-fgkLabelFraction); + // UseClusters(&t); + //CookLabel(pt, 1-fgkLabelFraction); t.CookdEdx(); CookdEdxTimBin(t); } found++; - +// cout<UpdateTrackParams(pt,AliESDtrack::kTRDrefit); - for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) { - for (Int_t j = 0;j < AliESDtrack::kNSlice; j++) { + if(PropagateToX(t,xTPC,fgkMaxStep)) { + seed->UpdateTrackParams(pt, AliESDtrack::kTRDrefit); + for (Int_t i=0;iSetTRDsignals(pt->GetPIDsignals(i,j),i,j); } seed->SetTRDTimBin(pt->GetPIDTimBin(i),i); } - } - else{ - // If not prolongation to TPC - propagate without update - AliTRDtrack *seed2 = new AliTRDtrack(*seed); + }else{ + //if not prolongation to TPC - propagate without update + AliTRDtrack* seed2 = new AliTRDtrack(*seed); seed2->ResetCovariance(5.); AliTRDtrack *pt2 = new AliTRDtrack(*seed2,seed2->GetAlpha()); + //AliTRDtrack *pt2 = new AliTRDtrack(*seed2); // !!! delete seed2; if (PropagateToX(*pt2,xTPC,fgkMaxStep)) { - pt2->CookdEdx(); + //pt2->CookdEdx(0.,1.); + pt2->CookdEdx( ); // Modification by PS CookdEdxTimBin(*pt2); - seed->UpdateTrackParams(pt2,AliESDtrack::kTRDrefit); - for (Int_t i = 0; i < AliESDtrack::kNPlane; i++) { - for (Int_t j = 0; j < AliESDtrack::kNSlice; j++) { + seed->UpdateTrackParams(pt2, AliESDtrack::kTRDrefit); + for (Int_t i=0;iSetTRDsignals(pt2->GetPIDsignals(i,j),i,j); } seed->SetTRDTimBin(pt2->GetPIDTimBin(i),i); @@ -880,15 +856,15 @@ Int_t AliTRDtracker::RefitInward(AliESD *event) delete pt; } - AliInfo(Form("Number of loaded seeds: %d",nseed)); - AliInfo(Form("Number of found tracks from loaded seeds: %d",found)); + cout<<"Number of loaded seeds: "<= 0; iplane--) { - - Int_t row0 = GetGlobalTimeBin(0,iplane,GetTimeBinsPerPlane()-1); - Int_t rowlast = GetGlobalTimeBin(0,iplane,0); - + Double_t rho = 0.0; + Int_t expectedNumberOfClusters = 0; + // + // + // + for (Int_t iplane = lastplane; iplane>=0; iplane--){ + // + Int_t row0 = GetGlobalTimeBin(0, iplane,GetTimeBinsPerPlane()-1); + Int_t rowlast = GetGlobalTimeBin(0, iplane,0); // - // Propagate track close to the plane if neccessary + // propagate track close to the plane if neccessary // Double_t currentx = fTrSec[0]->GetLayer(rowlast)->GetX(); - if (currentx < (-fgkMaxStep + t.GetX())) { - // Propagate closer to chamber - safety space fgkMaxStep - if (!PropagateToX(t,currentx+fgkMaxStep,fgkMaxStep)) break; + if (currentx < -fgkMaxStep +t.GetX()){ + //propagate closer to chamber - safety space fgkMaxStep + if (!PropagateToX(t, currentx+fgkMaxStep, fgkMaxStep)) break; } if (!AdjustSector(&t)) break; - // - // Get material budget + // get material budget // - Double_t xyz0[3]; - Double_t xyz1[3]; - Double_t param[7]; - Double_t x; - Double_t y; - Double_t z; - // Starting global position - t.GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]); - // End global position + Double_t xyz0[3],xyz1[3],param[7],x,y,z; + t.GetXYZ(xyz0); //starting global position + // end global position x = fTrSec[0]->GetLayer(row0)->GetX(); if (!t.GetProlongation(x,y,z)) break; - xyz1[0] = x * TMath::Cos(t.GetAlpha()) - y*TMath::Sin(t.GetAlpha()); - xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y*TMath::Cos(t.GetAlpha()); - xyz1[2] = z; + xyz1[0] = x*TMath::Cos(t.GetAlpha())-y*TMath::Sin(t.GetAlpha()); + xyz1[1] = +x*TMath::Sin(t.GetAlpha())+y*TMath::Cos(t.GetAlpha()); + xyz1[2] = z; AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); - // Get mean propagation parameters - rho = param[0]; - radLength = param[1]; - + rho = param[0]; + radLength = param[1]; // get mean propagation parameters // - // propagate and update + // propagate nad update // sector = t.GetSector(); - //for (Int_t itime = GetTimeBinsPerPlane()-1; itime >= 0; itime--) { - for (Int_t itime = 0; itime < GetTimeBinsPerPlane(); itime++) { - Int_t ilayer = GetGlobalTimeBin(0,iplane,itime); + // for (Int_t itime=GetTimeBinsPerPlane()-1;itime>=0;itime--) { + for (Int_t itime=0 ;itime 345) { - t.fNExpectedLast++; - } - AliTRDpropagationLayer &timeBin = *(fTrSec[sector]->GetLayer(ilayer)); - AliTRDcluster *cl = 0; - UInt_t index = 0; - Double_t maxChi2 = fgkMaxChi2; + if (t.GetX()>345) t.fNExpectedLast++; + AliTRDpropagationLayer& timeBin=*(fTrSec[sector]->GetLayer(ilayer)); + AliTRDcluster *cl=0; + UInt_t index=0; + Double_t maxChi2=fgkMaxChi2; x = timeBin.GetX(); if (timeBin) { - AliTRDcluster *cl0 = timeBin[0]; - // No clusters in given time bin - if (!cl0) continue; - Int_t plane = fGeom->GetPlane(cl0->GetDetector()); - if (plane > lastplane) continue; + AliTRDcluster * cl0 = timeBin[0]; + if (!cl0) continue; // no clusters in given time bin + Int_t plane = fGeom->GetPlane(cl0->GetDetector()); + if (plane>lastplane) continue; Int_t timebin = cl0->GetLocalTimeBin(); - AliTRDcluster *cl2 = GetCluster(&t,plane, timebin,index); - + AliTRDcluster * cl2= GetCluster(&t,plane, timebin,index); + // if (cl2) { - cl = cl2; - Double_t h01 = GetTiltFactor(cl); - maxChi2 = t.GetPredictedChi2(cl,h01); + cl =cl2; + //Double_t h01 = GetTiltFactor(cl); + //maxChi2=t.GetPredictedChi2(cl,h01); + // + //if (t.GetLabel()==277) + // printf("%e %e %x\n",t.GetX(),maxChi2,(UInt_t)cl); + // } if (cl) { - //if (cl->GetNPads()<5) + // if (cl->GetNPads()<5) Double_t dxsample = timeBin.GetdX(); t.SetSampledEdx(TMath::Abs(cl->GetQ()/dxsample)); - Double_t h01 = GetTiltFactor(cl); - Int_t det = cl->GetDetector(); - Int_t plane = fGeom->GetPlane(det); - if (t.fX > 345) { + Double_t h01 = GetTiltFactor(cl); + Int_t det = cl->GetDetector(); + Int_t plane = fGeom->GetPlane(det); + if (t.GetX()>345){ t.fNLast++; t.fChi2Last+=maxChi2; } Double_t xcluster = cl->GetX(); t.PropagateTo(xcluster,radLength,rho); - if (!t.UpdateMI(cl,maxChi2,index,h01,plane)) { - //???? + if (!AdjustSector(&t)) break; + maxChi2=t.GetPredictedChi2(cl,h01); + + if (t.GetLabel()==277) + printf("%e %e %e %e\n",t.GetAlpha(),t.GetX(),t.GetY(),t.GetZ()); + + if(!t.UpdateMI(cl,maxChi2,index,h01,plane)) { } - } + } } - } - + } } return expectedNumberOfClusters; @@ -1009,127 +982,111 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack& t) // Use GEO manager for material Description // - Int_t sector; - Int_t clusters[1000]; - Double_t radLength = 0.0; - Double_t rho = 0.0; - Int_t expectedNumberOfClusters = 0; - Float_t ratio0 = 0.0; + Int_t sector; + Int_t clusters[1000]; + for (Int_t i=0;i<1000;i++) clusters[i]=-1; + Double_t radLength = 0.0; + Double_t rho = 0.0; + Int_t expectedNumberOfClusters = 0; + Float_t ratio0=0; AliTRDtracklet tracklet; - - for (Int_t i = 0; i < 1000; i++) { - clusters[i] = -1; - } - - for (Int_t iplane = 0; iplaneGetLayer(row0)->GetX(); - if (currentx < t.GetX()) continue; - - // Propagate closer to chamber if neccessary - if (currentx > fgkMaxStep + t.GetX()) { - if (!PropagateToX(t,currentx-fgkMaxStep,fgkMaxStep)) break; + // + // + for (Int_t iplane = 0; iplaneGetLayer(row0)->GetX(); + if (currentx fgkMaxStep +t.GetX()){ + if (!PropagateToX(t, currentx-fgkMaxStep, fgkMaxStep)) break; } if (!AdjustSector(&t)) break; if (TMath::Abs(t.GetSnp())>fgkMaxSnp) break; - // - // Get material budget inside of chamber + // get material budget inside of chamber // - Double_t xyz0[3]; - Double_t xyz1[3]; - Double_t param[7]; - Double_t x; - Double_t y; - Double_t z; - // Starting global position - t.GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]); - // End global position + Double_t xyz0[3],xyz1[3],param[7],x,y,z; + t.GetXYZ(xyz0); //starting global position + // end global position x = fTrSec[0]->GetLayer(rowlast)->GetX(); if (!t.GetProlongation(x,y,z)) break; - xyz1[0] = x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha()); - xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha()); - xyz1[2] = z; + xyz1[0] = x*TMath::Cos(t.GetAlpha())-y*TMath::Sin(t.GetAlpha()); + xyz1[1] = +x*TMath::Sin(t.GetAlpha())+y*TMath::Cos(t.GetAlpha()); + xyz1[2] = z; AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); - // Get mean propagation parameters - rho = param[0]; - radLength = param[1]; - + rho = param[0]; + radLength = param[1]; // get mean propagation parameters // // Find clusters // - sector = t.GetSector(); - Float_t ncl = FindClusters(sector,row0,rowlast,&t,clusters,tracklet); - if (tracklet.GetN() < GetTimeBinsPerPlane()/3) continue; - + sector = t.GetSector(); + Float_t ncl = FindClusters(sector,row0,rowlast,&t,clusters,tracklet); + if (tracklet.GetN()= 0; itime--) { - Int_t ilayer = GetGlobalTimeBin(0, iplane,itime); + for (Int_t itime= GetTimeBinsPerPlane()-1;itime>=0;itime--) { + Int_t ilayer = GetGlobalTimeBin(0, iplane,itime); expectedNumberOfClusters++; t.fNExpected++; - if (t.fX > 345) { - t.fNExpectedLast++; - } - AliTRDpropagationLayer &timeBin = *(fTrSec[sector]->GetLayer(ilayer)); - AliTRDcluster *cl = 0; - UInt_t index = 0; - Double_t maxChi2 = fgkMaxChi2; + if (t.GetX()>345) t.fNExpectedLast++; + AliTRDpropagationLayer& timeBin=*(fTrSec[sector]->GetLayer(ilayer)); + AliTRDcluster *cl=0; + UInt_t index=0; + Double_t maxChi2=fgkMaxChi2; x = timeBin.GetX(); - + // if (timeBin) { - - if (clusters[ilayer] > 0) { + if (clusters[ilayer]>0) { index = clusters[ilayer]; cl = (AliTRDcluster*)GetCluster(index); - Double_t h01 = GetTiltFactor(cl); - maxChi2 = t.GetPredictedChi2(cl,h01); + //Double_t h01 = GetTiltFactor(cl); + //maxChi2=t.GetPredictedChi2(cl,h01); + // + //if (t.GetLabel()==277) + // printf("%e %e %x\n",t.GetX(),maxChi2,(UInt_t)cl); + // } if (cl) { - //if (cl->GetNPads()<5) + // if (cl->GetNPads()<5) Double_t dxsample = timeBin.GetdX(); t.SetSampledEdx(TMath::Abs(cl->GetQ()/dxsample)); - Double_t h01 = GetTiltFactor(cl); - Int_t det = cl->GetDetector(); - Int_t plane = fGeom->GetPlane(det); - if (t.fX > 345) { + Double_t h01 = GetTiltFactor(cl); + Int_t det = cl->GetDetector(); + Int_t plane = fGeom->GetPlane(det); + if (t.GetX()>345){ t.fNLast++; - t.fChi2Last += maxChi2; + t.fChi2Last+=maxChi2; } Double_t xcluster = cl->GetX(); t.PropagateTo(xcluster,radLength,rho); + maxChi2=t.GetPredictedChi2(cl,h01); + + if (t.GetLabel()==277) + printf("%e %e %e %e\n",t.GetAlpha(),t.GetX(),t.GetY(),t.GetZ()); + if(!t.UpdateMI(cl,maxChi2,index,h01,plane)) { if(!t.Update(cl,maxChi2,index,h01)) { - //???? } } - // Reset material budget if 2 consecutive gold - if (plane > 0) { - if ((t.fTracklets[plane].GetN() + t.fTracklets[plane-1].GetN()) > 20) { + // + // reset material budget if 2 consecutive gold + if (plane>0) + if (t.fTracklets[plane].GetN()+t.fTracklets[plane-1].GetN()>20){ t.fBudget[2] = 0; } - } - } - + } } - } - - ratio0 = ncl / Float_t(fTimeBinsPerPlane); - Float_t ratio1 = Float_t(t.fN+1) / Float_t(t.fNExpected+1.0); - if ((tracklet.GetChi2() < 18.0) && - (ratio0 > 0.8) && - (ratio1 > 0.6) && - (ratio0+ratio1 > 1.5) && - (t.GetNCross() == 0) && - (TMath::Abs(t.GetSnp()) < 0.85) && - (t.fN > 20)) { - // Make backup of the track until is gold - t.MakeBackupTrack(); + ratio0 = ncl/Float_t(fTimeBinsPerPlane); + Float_t ratio1 = Float_t(t.fN+1)/Float_t(t.fNExpected+1.); + if (tracklet.GetChi2()<18.&&ratio0>0.8 && ratio1>0.6 && ratio0+ratio1>1.5 && t.GetNCross()==0 && TMath::Abs(t.GetSnp())<0.85&&t.fN>20){ + t.MakeBackupTrack(); // make backup of the track until is gold } } @@ -1139,7 +1096,7 @@ Int_t AliTRDtracker::FollowBackProlongation(AliTRDtrack& t) } //_____________________________________________________________________________ -Int_t AliTRDtracker::PropagateToX(AliTRDtrack &t, Double_t xToGo, Double_t maxStep) +Int_t AliTRDtracker::PropagateToX(AliTRDtrack& t, Double_t xToGo, Double_t maxStep) { // // Starting from current radial position of track this function @@ -1148,36 +1105,27 @@ Int_t AliTRDtracker::PropagateToX(AliTRDtrack &t, Double_t xToGo, Double_t maxS // const Double_t kEpsilon = 0.00001; - //Double_t tanmax = TMath::Tan(0.5*AliTRDgeometry::GetAlpha()); - Double_t xpos = t.GetX(); - Double_t dir = (xpos < xToGo) ? 1.0 : -1.0; - - while ((xToGo-xpos)*dir > kEpsilon) { - - Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos),maxStep); - - Double_t xyz0[3]; - Double_t xyz1[3]; - Double_t param[7]; - Double_t x; - Double_t y; - Double_t z; - // Starting global position - t.GetGlobalXYZ(xyz0[0],xyz0[1],xyz0[2]); - x = xpos + step; - - // No prolongation - if (!t.GetProlongation(x,y,z)) return 0; - - xyz1[0] = x * TMath::Cos(t.GetAlpha()) - y * TMath::Sin(t.GetAlpha()); - xyz1[1] = +x * TMath::Sin(t.GetAlpha()) + y * TMath::Cos(t.GetAlpha()); - xyz1[2] = z; - + // Double_t tanmax = TMath::Tan(0.5*AliTRDgeometry::GetAlpha()); + Double_t xpos = t.GetX(); + Double_t dir = (xpos kEpsilon){ + Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep); + // + Double_t xyz0[3],xyz1[3],param[7],x,y,z; + t.GetXYZ(xyz0); //starting global position + x = xpos+step; + // + if (!t.GetProlongation(x,y,z)) return 0; // no prolongation + // + xyz1[0] = x*TMath::Cos(t.GetAlpha())-y*TMath::Sin(t.GetAlpha()); + xyz1[1] = +x*TMath::Sin(t.GetAlpha())+y*TMath::Cos(t.GetAlpha()); + xyz1[2] = z; + // AliKalmanTrack::MeanMaterialBudget(xyz0,xyz1,param); if (!t.PropagateTo(x,param[1],param[0])) return 0; AdjustSector(&t); xpos = t.GetX(); - } return 1; @@ -1193,45 +1141,45 @@ Int_t AliTRDtracker::LoadClusters(TTree *cTree) // differs from that of TRD sectors // + cout<<"\n Read Sectors clusters"<GetEntriesFast(); - fNclusters = ncl; - AliInfo(Form("LoadSectors: sorting %d clusters",ncl)); + Int_t ncl=fClusters->GetEntriesFast(); + fNclusters=ncl; + cout<<"\n LoadSectors: sorting "<UncheckedAt(ncl); - Int_t detector = c->GetDetector(); - Int_t localTimeBin = c->GetLocalTimeBin(); - Int_t sector = fGeom->GetSector(detector); - Int_t plane = fGeom->GetPlane(detector); + while (ncl--) { +// printf("\r %d left ",ncl); + AliTRDcluster *c=(AliTRDcluster*)fClusters->UncheckedAt(ncl); + Int_t detector=c->GetDetector(); + Int_t localTimeBin=c->GetLocalTimeBin(); + Int_t sector=fGeom->GetSector(detector); + Int_t plane=fGeom->GetPlane(detector); + Int_t trackingSector = CookSectorIndex(sector); - if (c->GetLabel(0) > 0) { + if (c->GetLabel(0)>0){ Int_t chamber = fGeom->GetChamber(detector); - fHoles[chamber][trackingSector] = kFALSE; + fHoles[chamber][trackingSector]=kFALSE; } - Int_t gtb = fTrSec[trackingSector]->CookTimeBinIndex(plane,localTimeBin); + Int_t gtb = fTrSec[trackingSector]->CookTimeBinIndex(plane,localTimeBin); if(gtb < 0) continue; Int_t layer = fTrSec[trackingSector]->GetLayerNumber(gtb); - index = ncl; - - // Apply pos correction + index=ncl; + // + // apply pos correction Transform(c); fTrSec[trackingSector]->GetLayer(layer)->InsertCluster(c,index); - } return 0; @@ -1245,26 +1193,20 @@ void AliTRDtracker::UnloadClusters() // Clears the arrays of clusters and tracks. Resets sectors and timebins // - Int_t i; - Int_t nentr; + Int_t i, nentr; nentr = fClusters->GetEntriesFast(); - for (i = 0; i < nentr; i++) { - delete fClusters->RemoveAt(i); - } + for (i = 0; i < nentr; i++) delete fClusters->RemoveAt(i); fNclusters = 0; nentr = fSeeds->GetEntriesFast(); - for (i = 0; i < nentr; i++) { - delete fSeeds->RemoveAt(i); - } + for (i = 0; i < nentr; i++) delete fSeeds->RemoveAt(i); nentr = fTracks->GetEntriesFast(); - for (i = 0; i < nentr; i++) { - delete fTracks->RemoveAt(i); - } + for (i = 0; i < nentr; i++) delete fTracks->RemoveAt(i); Int_t nsec = AliTRDgeometry::kNsect; + for (i = 0; i < nsec; i++) { for(Int_t pl = 0; pl < fTrSec[i]->GetNumberOfLayers(); pl++) { fTrSec[i]->GetLayer(pl)->Clear(); @@ -1280,719 +1222,620 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD * esd) // Creates seeds using clusters between position inner plane and outer plane // - const Double_t kMaxTheta = 1.0; - const Double_t kMaxPhi = 2.0; - - const Double_t kRoad0y = 6.0; // Road for middle cluster - const Double_t kRoad0z = 8.5; // Road for middle cluster - - const Double_t kRoad1y = 2.0; // Road in y for seeded cluster - const Double_t kRoad1z = 20.0; // Road in z for seeded cluster - - const Double_t kRoad2y = 3.0; // Road in y for extrapolated cluster - const Double_t kRoad2z = 20.0; // Road in z for extrapolated cluster + const Double_t kMaxTheta = 1; + const Double_t kMaxPhi = 2.0; + // + const Double_t kRoad0y = 6; // road for middle cluster + const Double_t kRoad0z = 8.5; // road for middle cluster + // + const Double_t kRoad1y = 2; // road in y for seeded cluster + const Double_t kRoad1z = 20; // road in z for seeded cluster + // + const Double_t kRoad2y = 3; // road in y for extrapolated cluster + const Double_t kRoad2z = 20; // road in z for extrapolated cluster const Int_t kMaxSeed = 3000; - Int_t maxSec = AliTRDgeometry::kNsect; + Int_t maxSec=AliTRDgeometry::kNsect; - // Linear fitters in planes - TLinearFitter fitterTC(2,"hyp2"); // Fitting with tilting pads - kz fixed - kz= Z/x, + vertex const - TLinearFitter fitterT2(4,"hyp4"); // Fitting with tilting pads - kz not fixed + // + // linear fitters in planes + TLinearFitter fitterTC(2,"hyp2"); // fitting with tilting pads - kz fixed - kz= Z/x, + vertex const + TLinearFitter fitterT2(4,"hyp4"); // fitting with tilting pads - kz not fixed fitterTC.StoreData(kTRUE); fitterT2.StoreData(kTRUE); - AliRieman rieman(1000); // Rieman fitter - AliRieman rieman2(1000); // Rieman fitter - + AliRieman rieman(1000); // rieman fitter + AliRieman rieman2(1000); // rieman fitter // - // Find the maximal and minimal layer for the planes + // find the maximal and minimal layer for the planes // Int_t layers[6][2]; - AliTRDpropagationLayer *reflayers[6]; - for (Int_t i = 0; i < 6; i++) { - layers[i][0] = 10000; - layers[i][1] = 0; - } - for (Int_t ns = 0; ns < maxSec; ns++) { - for (Int_t ilayer = 0; ilayer < fTrSec[ns]->GetNumberOfLayers(); ilayer++) { - AliTRDpropagationLayer &layer= *(fTrSec[ns]->GetLayer(ilayer)); - if (layer == 0) continue; + AliTRDpropagationLayer* reflayers[6]; + for (Int_t i=0;i<6;i++){layers[i][0]=10000; layers[i][1]=0;} + for (Int_t ns=0;nsGetNumberOfLayers();ilayer++){ + AliTRDpropagationLayer& layer=*(fTrSec[ns]->GetLayer(ilayer)); + if (layer==0) continue; Int_t det = layer[0]->GetDetector(); Int_t plane = fGeom->GetPlane(det); - if (ilayer < layers[plane][0]) layers[plane][0] = ilayer; - if (ilayer > layers[plane][1]) layers[plane][1] = ilayer; + if (ilayerlayers[plane][1]) layers[plane][1] = ilayer; } } - + // AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(0,0); - Double_t h01 = TMath::Tan(-TMath::Pi()/180.0 * padPlane->GetTiltingAngle()); - Double_t hL[6]; // Tilting angle - Double_t xcl[6]; // x - position of reference cluster - Double_t ycl[6]; // y - position of reference cluster - Double_t zcl[6]; // z - position of reference cluster - AliTRDcluster *cl[6] = { 0, 0, 0, 0, 0, 0 }; // Seeding clusters - Float_t padlength[6] = { 10, 10, 10, 10, 10, 10 }; // Current pad-length - Double_t chi2R = 0.0; - Double_t chi2Z = 0.0; - Double_t chi2RF = 0.0; - Double_t chi2ZF = 0.0; - - // Total number of clusters - Int_t nclusters; - for (Int_t i = 0; i < 6; i++) { - hL[i] = h01; - if (i%2 == 1) hL[i] *= -1.0; - } - - // Registered seed + Double_t h01 = TMath::Tan(-TMath::Pi() / 180.0 * padPlane->GetTiltingAngle()); + Double_t hL[6]; // tilting angle + Double_t xcl[6]; // x - position of reference cluster + Double_t ycl[6]; // y - position of reference cluster + Double_t zcl[6]; // z - position of reference cluster + AliTRDcluster *cl[6]={0,0,0,0,0,0}; // seeding clusters + Float_t padlength[6]={10,10,10,10,10,10}; //current pad-length + Double_t chi2R =0, chi2Z=0; + Double_t chi2RF =0, chi2ZF=0; + // + Int_t nclusters; // total number of clusters + for (Int_t i=0;i<6;i++) {hL[i]=h01; if (i%2==1) hL[i]*=-1.;} + // + // + // registered seed AliTRDseed *pseed = new AliTRDseed[kMaxSeed*6]; AliTRDseed *seed[kMaxSeed]; - for (Int_t iseed = 0; iseed < kMaxSeed; iseed++) { - seed[iseed] = &pseed[iseed*6]; - } + for (Int_t iseed=0;iseed= 0; sLayer--) { - //for (Int_t dseed=5;dseed<15; dseed+=3){ - iter += 1.0; - Int_t dseed = 5 + Int_t(iter)*3; + // + Double_t seedquality[kMaxSeed]; + Double_t seedquality2[kMaxSeed]; + Double_t seedparams[kMaxSeed][7]; + Int_t seedlayer[kMaxSeed]; + Int_t registered =0; + Int_t sort[kMaxSeed]; + // + // seeding part + // + for (Int_t ns = 0; ns=0;sLayer--){ + //for (Int_t dseed=5;dseed<15; dseed+=3){ //loop over central seeding time bins + iter+=1.; + Int_t dseed = 5+Int_t(iter)*3; // Initialize seeding layers - for (Int_t ilayer = 0; ilayer < 6; ilayer++) { + for (Int_t ilayer=0;ilayer<6;ilayer++){ reflayers[ilayer] = fTrSec[ns]->GetLayer(layers[ilayer][1]-dseed); xcl[ilayer] = reflayers[ilayer]->GetX(); } - Double_t xref = (xcl[sLayer+1] + xcl[sLayer+2]) * 0.5; - AliTRDpropagationLayer &layer0 = *reflayers[sLayer+0]; - AliTRDpropagationLayer &layer1 = *reflayers[sLayer+1]; - AliTRDpropagationLayer &layer2 = *reflayers[sLayer+2]; - AliTRDpropagationLayer &layer3 = *reflayers[sLayer+3]; - - Int_t maxn3 = layer3; - for (Int_t icl3 = 0; icl3 < maxn3; icl3++) { + // + Double_t xref = (xcl[sLayer+1] + xcl[sLayer+2])*0.5; + AliTRDpropagationLayer& layer0=*reflayers[sLayer+0]; + AliTRDpropagationLayer& layer1=*reflayers[sLayer+1]; + AliTRDpropagationLayer& layer2=*reflayers[sLayer+2]; + AliTRDpropagationLayer& layer3=*reflayers[sLayer+3]; + // + Int_t maxn3 = layer3; + for (Int_t icl3=0;icl3GetSigmaZ2()*12.); ycl[sLayer+3] = cl3->GetY(); zcl[sLayer+3] = cl3->GetZ(); - Float_t yymin0 = ycl[sLayer+3] - 1 - kMaxPhi * (xcl[sLayer+3] - xcl[sLayer+0]); - Float_t yymax0 = ycl[sLayer+3] + 1 + kMaxPhi * (xcl[sLayer+3] - xcl[sLayer+0]); - Int_t maxn0 = layer0; - - for (Int_t icl0 = layer0.Find(yymin0); icl0 < maxn0; icl0++) { - + Float_t yymin0 = ycl[sLayer+3] - 1- kMaxPhi *(xcl[sLayer+3]-xcl[sLayer+0]); + Float_t yymax0 = ycl[sLayer+3] + 1+ kMaxPhi *(xcl[sLayer+3]-xcl[sLayer+0]); + Int_t maxn0 = layer0; // + for (Int_t icl0=layer0.Find(yymin0);icl0IsUsed() && cl0->IsUsed()) continue; + if (cl3->IsUsed()&&cl0->IsUsed()) continue; ycl[sLayer+0] = cl0->GetY(); zcl[sLayer+0] = cl0->GetZ(); - if (ycl[sLayer+0] > yymax0) break; - Double_t tanphi = (ycl[sLayer+3] - ycl[sLayer+0]) / (xcl[sLayer+3] - xcl[sLayer+0]); - if (TMath::Abs(tanphi) > kMaxPhi) continue; - Double_t tantheta = (zcl[sLayer+3] - zcl[sLayer+0]) / (xcl[sLayer+3] - xcl[sLayer+0]); - if (TMath::Abs(tantheta) > kMaxTheta) continue; - padlength[sLayer+0] = TMath::Sqrt(cl0->GetSigmaZ2()*12.0); - - // Expected position in 1 layer - Double_t y1exp = ycl[sLayer+0] + (tanphi) * (xcl[sLayer+1] - xcl[sLayer+0]); - Double_t z1exp = zcl[sLayer+0] + (tantheta) * (xcl[sLayer+1] - xcl[sLayer+0]); - Float_t yymin1 = y1exp - kRoad0y - tanphi; - Float_t yymax1 = y1exp + kRoad0y + tanphi; - Int_t maxn1 = layer1; - - for (Int_t icl1 = layer1.Find(yymin1); icl1 < maxn1; icl1++) { - + if ( ycl[sLayer+0]>yymax0) break; + Double_t tanphi = (ycl[sLayer+3]-ycl[sLayer+0])/(xcl[sLayer+3]-xcl[sLayer+0]); + if (TMath::Abs(tanphi)>kMaxPhi) continue; + Double_t tantheta = (zcl[sLayer+3]-zcl[sLayer+0])/(xcl[sLayer+3]-xcl[sLayer+0]); + if (TMath::Abs(tantheta)>kMaxTheta) continue; + padlength[sLayer+0] = TMath::Sqrt(cl0->GetSigmaZ2()*12.); + // + // expected position in 1 layer + Double_t y1exp = ycl[sLayer+0]+(tanphi) *(xcl[sLayer+1]-xcl[sLayer+0]); + Double_t z1exp = zcl[sLayer+0]+(tantheta)*(xcl[sLayer+1]-xcl[sLayer+0]); + Float_t yymin1 = y1exp - kRoad0y-tanphi; + Float_t yymax1 = y1exp + kRoad0y+tanphi; + Int_t maxn1 = layer1; // + // + for (Int_t icl1=layer1.Find(yymin1);icl1IsUsed()) nusedCl++; if (cl0->IsUsed()) nusedCl++; if (cl1->IsUsed()) nusedCl++; - if (nusedCl > 1) continue; + if (nusedCl>1) continue; ycl[sLayer+1] = cl1->GetY(); zcl[sLayer+1] = cl1->GetZ(); - if (ycl[sLayer+1] > yymax1) break; - if (TMath::Abs(ycl[sLayer+1] - y1exp) > kRoad0y+tanphi) continue; - if (TMath::Abs(zcl[sLayer+1] - z1exp) > kRoad0z) continue; + if ( ycl[sLayer+1]>yymax1) break; + if (TMath::Abs(ycl[sLayer+1]-y1exp)>kRoad0y+tanphi) continue; + if (TMath::Abs(zcl[sLayer+1]-z1exp)>kRoad0z) continue; padlength[sLayer+1] = TMath::Sqrt(cl1->GetSigmaZ2()*12.); - - Double_t y2exp = ycl[sLayer+0] + (tanphi) - * (xcl[sLayer+2] - xcl[sLayer+0]) + (ycl[sLayer+1] - y1exp); - Double_t z2exp = zcl[sLayer+0] + (tantheta) - * (xcl[sLayer+2] - xcl[sLayer+0]); - Int_t index2 = layer2.FindNearestCluster(y2exp,z2exp,kRoad1y,kRoad1z); - if (index2 <= 0) continue; - AliTRDcluster *cl2 = (AliTRDcluster *) GetCluster(index2); - padlength[sLayer+2] = TMath::Sqrt(cl2->GetSigmaZ2()*12.0); - ycl[sLayer+2] = cl2->GetY(); - zcl[sLayer+2] = cl2->GetZ(); - if (TMath::Abs(cl2->GetZ()-z2exp) > kRoad0z) continue; - + // + Double_t y2exp = ycl[sLayer+0]+(tanphi) *(xcl[sLayer+2]-xcl[sLayer+0])+(ycl[sLayer+1]-y1exp); + Double_t z2exp = zcl[sLayer+0]+(tantheta)*(xcl[sLayer+2]-xcl[sLayer+0]); + Int_t index2 = layer2.FindNearestCluster(y2exp,z2exp,kRoad1y, kRoad1z); + if (index2<=0) continue; + AliTRDcluster *cl2 = (AliTRDcluster*)GetCluster(index2); + padlength[sLayer+2] = TMath::Sqrt(cl2->GetSigmaZ2()*12.); + ycl[sLayer+2] = cl2->GetY(); + zcl[sLayer+2] = cl2->GetZ(); + if (TMath::Abs(cl2->GetZ()-z2exp)>kRoad0z) continue; + // rieman.Reset(); rieman.AddPoint(xcl[sLayer+0],ycl[sLayer+0],zcl[sLayer+0],1,10); rieman.AddPoint(xcl[sLayer+1],ycl[sLayer+1],zcl[sLayer+1],1,10); rieman.AddPoint(xcl[sLayer+3],ycl[sLayer+3],zcl[sLayer+3],1,10); rieman.AddPoint(xcl[sLayer+2],ycl[sLayer+2],zcl[sLayer+2],1,10); rieman.Update(); - - // Reset fitter - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { + // + // reset fitter + for (Int_t iLayer=0;iLayer<6;iLayer++){ cseed[iLayer].Reset(); } - chi2Z = 0.0; - chi2R = 0.0; - for (Int_t iLayer = 0; iLayer < 4; iLayer++) { + chi2Z =0.; chi2R=0.; + for (Int_t iLayer=0;iLayer<4;iLayer++){ cseed[sLayer+iLayer].fZref[0] = rieman.GetZat(xcl[sLayer+iLayer]); - chi2Z += (cseed[sLayer+iLayer].fZref[0]- zcl[sLayer+iLayer]) - * (cseed[sLayer+iLayer].fZref[0]- zcl[sLayer+iLayer]); + chi2Z += (cseed[sLayer+iLayer].fZref[0]- zcl[sLayer+iLayer])* + (cseed[sLayer+iLayer].fZref[0]- zcl[sLayer+iLayer]); cseed[sLayer+iLayer].fZref[1] = rieman.GetDZat(xcl[sLayer+iLayer]); cseed[sLayer+iLayer].fYref[0] = rieman.GetYat(xcl[sLayer+iLayer]); - chi2R += (cseed[sLayer+iLayer].fYref[0]- ycl[sLayer+iLayer]) - * (cseed[sLayer+iLayer].fYref[0]- ycl[sLayer+iLayer]); + chi2R += (cseed[sLayer+iLayer].fYref[0]- ycl[sLayer+iLayer])* + (cseed[sLayer+iLayer].fYref[0]- ycl[sLayer+iLayer]); cseed[sLayer+iLayer].fYref[1] = rieman.GetDYat(xcl[sLayer+iLayer]); } - if (TMath::Sqrt(chi2R) > 1.0/iter) continue; - if (TMath::Sqrt(chi2Z) > 7.0/iter) continue; - - Float_t minmax[2] = { -100.0, 100.0 }; - for (Int_t iLayer = 0; iLayer < 4; iLayer++) { - Float_t max = zcl[sLayer+iLayer] + padlength[sLayer+iLayer] * 0.5 + 1.0 - -cseed[sLayer+iLayer].fZref[0]; - if (max < minmax[1]) minmax[1] = max; - Float_t min = zcl[sLayer+iLayer] - padlength[sLayer+iLayer] * 0.5 - 1.0 - -cseed[sLayer+iLayer].fZref[0]; - if (min > minmax[0]) minmax[0] = min; + if (TMath::Sqrt(chi2R)>1./iter) continue; + if (TMath::Sqrt(chi2Z)>7./iter) continue; + // + // + // + Float_t minmax[2]={-100,100}; + for (Int_t iLayer=0;iLayer<4;iLayer++){ + Float_t max = zcl[sLayer+iLayer]+padlength[sLayer+iLayer]*0.5+1 -cseed[sLayer+iLayer].fZref[0]; + if (maxminmax[0]) minmax[0]=min; } - Bool_t isFake = kFALSE; - if (cl0->GetLabel(0) != cl3->GetLabel(0)) isFake = kTRUE; - if (cl1->GetLabel(0) != cl3->GetLabel(0)) isFake = kTRUE; - if (cl2->GetLabel(0) != cl3->GetLabel(0)) isFake = kTRUE; - // Debugging print - if (AliTRDReconstructor::StreamLevel() > 0) { - if ((!isFake) || ((icl3%10) == 0)) { - TTreeSRedirector &cstream = *fDebugStreamer; - cstream << "Seeds0" - << "isFake=" << isFake - << "Cl0.=" << cl0 - << "Cl1.=" << cl1 - << "Cl2.=" << cl2 - << "Cl3.=" << cl3 - << "Xref=" << xref - << "X0=" << xcl[sLayer+0] - << "X1=" << xcl[sLayer+1] - << "X2=" << xcl[sLayer+2] - << "X3=" << xcl[sLayer+3] - << "Y2exp=" << y2exp - << "Z2exp=" << z2exp - << "Chi2R=" << chi2R - << "Chi2Z=" << chi2Z - << "Seed0.=" << &cseed[sLayer+0] - << "Seed1.=" << &cseed[sLayer+1] - << "Seed2.=" << &cseed[sLayer+2] - << "Seed3.=" << &cseed[sLayer+3] - << "Zmin=" << minmax[0] - << "Zmax=" << minmax[1] - << "\n"; + if (cl0->GetLabel(0)!=cl3->GetLabel(0)) isFake = kTRUE; + if (cl1->GetLabel(0)!=cl3->GetLabel(0)) isFake = kTRUE; + if (cl2->GetLabel(0)!=cl3->GetLabel(0)) isFake = kTRUE; + if (AliTRDReconstructor::StreamLevel()>0){ + if ((!isFake) || (icl3%10)==0 ){ //debugging print + TTreeSRedirector& cstream = *fDebugStreamer; + cstream<<"Seeds0"<< + "isFake="< 0) { - roadz = padlength[sLayer+jLayer]; - } - - Float_t quality = 10000.0; - for (Int_t iTime = 2; iTime < 20; iTime++) { - - AliTRDpropagationLayer &layer = *(fTrSec[ns]->GetLayer(layers[sLayer+jLayer][1]-iTime)); - Double_t dxlayer = layer.GetX() - xcl[sLayer+jLayer]; - Double_t zexp = cl[sLayer+jLayer]->GetZ(); - if (iter > 0) { - // Try 2 pad-rows in second iteration - zexp = tseed.fZref[0] + tseed.fZref[1]*dxlayer; - if (zexp > cl[sLayer+jLayer]->GetZ()) { - zexp = cl[sLayer+jLayer]->GetZ() + padlength[sLayer+jLayer] * 0.5; - } - if (zexp < cl[sLayer+jLayer]->GetZ()) { - zexp = cl[sLayer+jLayer]->GetZ() - padlength[sLayer+jLayer] * 0.5; - } + Float_t roadz = padlength[sLayer+jLayer]*0.5; + if (iter>0) roadz = padlength[sLayer+jLayer]; + // + Float_t quality =10000; + for (Int_t iTime=2;iTime<20;iTime++){ + AliTRDpropagationLayer& layer = *(fTrSec[ns]->GetLayer(layers[sLayer+jLayer][1]-iTime)); + Double_t dxlayer= layer.GetX()-xcl[sLayer+jLayer]; + Double_t zexp = cl[sLayer+jLayer]->GetZ() ; + if (iter>0){ + // try 2 pad-rows in second iteration + zexp = tseed.fZref[0]+ tseed.fZref[1]*dxlayer; + if (zexp>cl[sLayer+jLayer]->GetZ()) zexp = cl[sLayer+jLayer]->GetZ()+padlength[sLayer+jLayer]*0.5; + if (zexpGetZ()) zexp = cl[sLayer+jLayer]->GetZ()-padlength[sLayer+jLayer]*0.5; } - - Double_t yexp = tseed.fYref[0] + tseed.fYref[1] * dxlayer; - Int_t index = layer.FindNearestCluster(yexp,zexp,kRoad1y,roadz); - if (index <= 0) continue; - AliTRDcluster *cl = (AliTRDcluster *) GetCluster(index); - - // Register cluster + // + Double_t yexp = tseed.fYref[0]+ + tseed.fYref[1]*dxlayer; + Int_t index = layer.FindNearestCluster(yexp,zexp,kRoad1y, roadz); + if (index<=0) continue; + AliTRDcluster *cl = (AliTRDcluster*)GetCluster(index); + // tseed.fIndexes[iTime] = index; - tseed.fClusters[iTime] = cl; - tseed.fX[iTime] = dxlayer; - tseed.fY[iTime] = cl->GetY(); - tseed.fZ[iTime] = cl->GetZ(); - + tseed.fClusters[iTime] = cl; // register cluster + tseed.fX[iTime] = dxlayer; // register cluster + tseed.fY[iTime] = cl->GetY(); // register cluster + tseed.fZ[iTime] = cl->GetZ(); // register cluster } - tseed.Update(); - // Count the number of clusters and distortions into quality - Float_t dangle = tseed.fYfit[1] - tseed.fYref[1]; - Float_t tquality = (18.0 - tseed.fN2) / 2.0 + TMath::Abs(dangle) / 0.1 - + TMath::Abs(tseed.fYfit[0] - tseed.fYref[0]) / 0.2 - + 2.0 * TMath::Abs(tseed.fMeanz - tseed.fZref[0]) / padlength[jLayer]; - if ((iter == 0) && tseed.IsOK()) { + //count the number of clusters and distortions into quality + Float_t dangle = tseed.fYfit[1]-tseed.fYref[1]; + Float_t tquality = (18-tseed.fN2)/2. + TMath::Abs(dangle)/0.1+ + TMath::Abs(tseed.fYfit[0]-tseed.fYref[0])/0.2+ + 2.*TMath::Abs(tseed.fMeanz-tseed.fZref[0])/padlength[jLayer]; + if (iter==0 && tseed.IsOK()) { cseed[sLayer+jLayer] = tseed; - quality = tquality; - if (tquality < 5) break; + quality = tquality; + if (tquality<5) break; } - if (tseed.IsOK() && (tquality < quality)) { - cseed[sLayer+jLayer] = tseed; - } - + if (tseed.IsOK() && tquality 25) { + nusedCl+= cseed[sLayer+jLayer].fNUsed; + if (nusedCl>25){ isOK = kFALSE; break; } - } - + // if (!isOK) continue; - nclusters = 0; - for (Int_t iLayer = 0; iLayer < 4; iLayer++) { - if (cseed[sLayer+iLayer].IsOK()) { - nclusters += cseed[sLayer+iLayer].fN2; + nclusters=0; + for (Int_t iLayer=0;iLayer<4;iLayer++){ + if (cseed[sLayer+iLayer].IsOK()){ + nclusters+=cseed[sLayer+iLayer].fN2; } } - - // Iteration 0 + // + // iteration 0 rieman.Reset(); - for (Int_t iLayer = 0; iLayer < 4; iLayer++) { - rieman.AddPoint(xcl[sLayer+iLayer] - ,cseed[sLayer+iLayer].fYfitR[0] - ,cseed[sLayer+iLayer].fZProb - ,1 - ,10); + for (Int_t iLayer=0;iLayer<4;iLayer++){ + rieman.AddPoint(xcl[sLayer+iLayer],cseed[sLayer+iLayer].fYfitR[0], + cseed[sLayer+iLayer].fZProb,1,10); } rieman.Update(); - - chi2R = 0.0; - chi2Z = 0.0; - for (Int_t iLayer = 0; iLayer < 4; iLayer++) { + // + // + chi2R =0; chi2Z=0; + for (Int_t iLayer=0;iLayer<4;iLayer++){ cseed[sLayer+iLayer].fYref[0] = rieman.GetYat(xcl[sLayer+iLayer]); - chi2R += (cseed[sLayer+iLayer].fYref[0] - cseed[sLayer+iLayer].fYfitR[0]) - * (cseed[sLayer+iLayer].fYref[0] - cseed[sLayer+iLayer].fYfitR[0]); + chi2R += (cseed[sLayer+iLayer].fYref[0]-cseed[sLayer+iLayer].fYfitR[0])* + (cseed[sLayer+iLayer].fYref[0]-cseed[sLayer+iLayer].fYfitR[0]); cseed[sLayer+iLayer].fYref[1] = rieman.GetDYat(xcl[sLayer+iLayer]); cseed[sLayer+iLayer].fZref[0] = rieman.GetZat(xcl[sLayer+iLayer]); - chi2Z += (cseed[sLayer+iLayer].fZref[0] - cseed[sLayer+iLayer].fMeanz) - * (cseed[sLayer+iLayer].fZref[0] - cseed[sLayer+iLayer].fMeanz); + chi2Z += (cseed[sLayer+iLayer].fZref[0]- cseed[sLayer+iLayer].fMeanz)* + (cseed[sLayer+iLayer].fZref[0]- cseed[sLayer+iLayer].fMeanz); cseed[sLayer+iLayer].fZref[1] = rieman.GetDZat(xcl[sLayer+iLayer]); } Double_t curv = rieman.GetC(); - // - // Likelihoods + // likelihoods // - Double_t sumda = TMath::Abs(cseed[sLayer+0].fYfitR[1] - cseed[sLayer+0].fYref[1]) - + TMath::Abs(cseed[sLayer+1].fYfitR[1] - cseed[sLayer+1].fYref[1]) - + TMath::Abs(cseed[sLayer+2].fYfitR[1] - cseed[sLayer+2].fYref[1]) - + TMath::Abs(cseed[sLayer+3].fYfitR[1] - cseed[sLayer+3].fYref[1]); - Double_t likea = TMath::Exp(-sumda * 10.6); - Double_t likechi2 = 0.0000000001; - if (chi2R < 0.5) { - likechi2 += TMath::Exp(-TMath::Sqrt(chi2R) * 7.73); - } - Double_t likechi2z = TMath::Exp(-chi2Z * 0.088) / TMath::Exp(-chi2Z * 0.019); - Double_t likeN = TMath::Exp(-(72 - nclusters) * 0.19); - Double_t like = likea * likechi2 * likechi2z * likeN; - - Double_t likePrimY = TMath::Exp(-TMath::Abs(cseed[sLayer+0].fYref[1] - 130*curv) * 1.9); - Double_t likePrimZ = TMath::Exp(-TMath::Abs(cseed[sLayer+0].fZref[1] - - cseed[sLayer+0].fZref[0] / xcl[sLayer+0]) * 5.9); - Double_t likePrim = TMath::Max(likePrimY * likePrimZ,0.0005); + Double_t sumda = + TMath::Abs(cseed[sLayer+0].fYfitR[1]- cseed[sLayer+0].fYref[1])+ + TMath::Abs(cseed[sLayer+1].fYfitR[1]- cseed[sLayer+1].fYref[1])+ + TMath::Abs(cseed[sLayer+2].fYfitR[1]- cseed[sLayer+2].fYref[1])+ + TMath::Abs(cseed[sLayer+3].fYfitR[1]- cseed[sLayer+3].fYref[1]); + Double_t likea = TMath::Exp(-sumda*10.6); + Double_t likechi2 = 0.0000000001; + if (chi2R<0.5) likechi2+=TMath::Exp(-TMath::Sqrt(chi2R)*7.73); + Double_t likechi2z = TMath::Exp(-chi2Z*0.088)/TMath::Exp(-chi2Z*0.019); + Double_t likeN = TMath::Exp(-(72-nclusters)*0.19); + Double_t like = likea*likechi2*likechi2z*likeN; + // + Double_t likePrimY = TMath::Exp(-TMath::Abs(cseed[sLayer+0].fYref[1]-130*curv)*1.9); + Double_t likePrimZ = TMath::Exp(-TMath::Abs(cseed[sLayer+0].fZref[1]- + cseed[sLayer+0].fZref[0]/xcl[sLayer+0])*5.9); + Double_t likePrim = TMath::Max(likePrimY*likePrimZ,0.0005); - seedquality[registered] = like; - seedlayer[registered] = sLayer; - if (TMath::Log(0.000000000000001 + like) < -15) continue; + seedquality[registered] = like; + seedlayer[registered] = sLayer; + if (TMath::Log(0.000000000000001+like)<-15) continue; AliTRDseed seedb[6]; - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { + for (Int_t iLayer=0;iLayer<6;iLayer++){ seedb[iLayer] = cseed[iLayer]; } - // + //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + //<<<<<<<<<<<<<<< FULL TRACK FIT PART <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< + //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< // - // FULL TRACK FIT PART + Int_t nlayers = 0; + Int_t nusedf = 0; + Int_t findable = 0; // + // add new layers - avoid long extrapolation // - - Int_t nlayers = 0; - Int_t nusedf = 0; - Int_t findable = 0; - - // - // Add new layers - avoid long extrapolation + Int_t tLayer[2]={0,0}; + if (sLayer==2) {tLayer[0]=1; tLayer[1]=0;} + if (sLayer==1) {tLayer[0]=5; tLayer[1]=0;} + if (sLayer==0) {tLayer[0]=4; tLayer[1]=5;} // - Int_t tLayer[2] = { 0, 0 }; - if (sLayer == 2) { - tLayer[0] = 1; - tLayer[1] = 0; - } - if (sLayer == 1) { - tLayer[0] = 5; - tLayer[1] = 0; - } - if (sLayer == 0) { - tLayer[0] = 4; - tLayer[1] = 5; - } - - for (Int_t iLayer = 0; iLayer < 2; iLayer++) { - - // Set tracking layer - Int_t jLayer = tLayer[iLayer]; + for (Int_t iLayer=0;iLayer<2;iLayer++){ + Int_t jLayer = tLayer[iLayer]; // set tracking layer cseed[jLayer].Reset(); - cseed[jLayer].fTilt = hL[jLayer]; + cseed[jLayer].fTilt = hL[jLayer]; cseed[jLayer].fPadLength = padlength[jLayer]; - cseed[jLayer].fX0 = xcl[jLayer]; - // Get pad length and rough cluster - Int_t indexdummy = reflayers[jLayer]->FindNearestCluster(cseed[jLayer].fYref[0] - ,cseed[jLayer].fZref[0] - ,kRoad2y - ,kRoad2z); - if (indexdummy <= 0) continue; - AliTRDcluster *cldummy = (AliTRDcluster *) GetCluster(indexdummy); - padlength[jLayer] = TMath::Sqrt(cldummy->GetSigmaZ2() * 12.0); - + cseed[jLayer].fX0 = xcl[jLayer]; + // get pad length and rough cluster + Int_t indexdummy = reflayers[jLayer]->FindNearestCluster(cseed[jLayer].fYref[0], + cseed[jLayer].fZref[0],kRoad2y,kRoad2z); + if (indexdummy<=0) continue; + AliTRDcluster *cldummy = (AliTRDcluster*)GetCluster(indexdummy); + padlength[jLayer] = TMath::Sqrt(cldummy->GetSigmaZ2()*12.); } - - AliTRDseed::FitRiemanTilt(cseed,kTRUE); - - for (Int_t iLayer = 0; iLayer < 2; iLayer++) { - - // Set tracking layer - Int_t jLayer = tLayer[iLayer]; - if ((jLayer == 0) && !(cseed[1].IsOK())) continue; // break not allowed - if ((jLayer == 5) && !(cseed[4].IsOK())) continue; // break not allowed + AliTRDseed::FitRiemanTilt(cseed, kTRUE); + // + for (Int_t iLayer=0;iLayer<2;iLayer++){ + Int_t jLayer = tLayer[iLayer]; // set tracking layer + if ( (jLayer==0) && !(cseed[1].IsOK())) continue; // break not allowed + if ( (jLayer==5) && !(cseed[4].IsOK())) continue; // break not allowed Float_t zexp = cseed[jLayer].fZref[0]; - Double_t zroad = padlength[jLayer] * 0.5 + 1.0; - - for (Int_t iter = 0; iter < 2; iter++) { - + Double_t zroad = padlength[jLayer]*0.5+1.; + // + // + for (Int_t iter=0;iter<2;iter++){ AliTRDseed tseed = cseed[jLayer]; - Float_t quality = 10000.0; - for (Int_t iTime = 2; iTime < 20; iTime++) { - - AliTRDpropagationLayer &layer = *(fTrSec[ns]->GetLayer(layers[jLayer][1]-iTime)); - Double_t dxlayer = layer.GetX() - xcl[jLayer]; - Double_t yexp = tseed.fYref[0] + tseed.fYref[1] * dxlayer; - Float_t yroad = kRoad1y; - Int_t index = layer.FindNearestCluster(yexp,zexp,yroad,zroad); - if (index <= 0) continue; - AliTRDcluster *cl = (AliTRDcluster *) GetCluster(index); - - // Register cluster + Float_t quality = 10000; + for (Int_t iTime=2;iTime<20;iTime++){ + AliTRDpropagationLayer& layer = *(fTrSec[ns]->GetLayer(layers[jLayer][1]-iTime)); + Double_t dxlayer = layer.GetX()-xcl[jLayer]; + Double_t yexp = tseed.fYref[0]+tseed.fYref[1]*dxlayer; + Float_t yroad = kRoad1y; + Int_t index = layer.FindNearestCluster(yexp,zexp, yroad, zroad); + if (index<=0) continue; + AliTRDcluster *cl = (AliTRDcluster*)GetCluster(index); + // tseed.fIndexes[iTime] = index; - tseed.fClusters[iTime] = cl; - tseed.fX[iTime] = dxlayer; - tseed.fY[iTime] = cl->GetY(); - tseed.fZ[iTime] = cl->GetZ(); - + tseed.fClusters[iTime] = cl; // register cluster + tseed.fX[iTime] = dxlayer; // register cluster + tseed.fY[iTime] = cl->GetY(); // register cluster + tseed.fZ[iTime] = cl->GetZ(); // register cluster } - tseed.Update(); - if (tseed.IsOK()) { - Float_t dangle = tseed.fYfit[1] - tseed.fYref[1]; - Float_t tquality = (18.0 - tseed.fN2) / 2.0 - + TMath::Abs(dangle) / 0.1 - + TMath::Abs(tseed.fYfit[0] - tseed.fYref[0])/0.2 - + 2.0 * TMath::Abs(tseed.fMeanz - tseed.fZref[0])/padlength[jLayer]; - if (tquality < quality) { - cseed[jLayer] = tseed; - quality = tquality; + if (tseed.IsOK()){ + Float_t dangle = tseed.fYfit[1]-tseed.fYref[1]; + Float_t tquality = (18-tseed.fN2)/2. + TMath::Abs(dangle)/0.1+ + TMath::Abs(tseed.fYfit[0]-tseed.fYref[0])/0.2+ + 2.*TMath::Abs(tseed.fMeanz-tseed.fZref[0])/padlength[jLayer]; + // + if (tquality= lastquality) || - (chi2 > lastchi2)) break; + if (sumquality>=lastquality || chi2>lastchi2) break; lastquality = sumquality; lastchi2 = chi2; - if (iter > 0) { - for (Int_t jLayer = 0; jLayer < 6; jLayer++) { + if (iter>0){ + for (Int_t jLayer=0;jLayer<6;jLayer++){ cseed[jLayer] = bseed[jLayer]; } } TMath::Sort(6,squality,sortindexes,kFALSE); - - for (Int_t jLayer = 5; jLayer > 1; jLayer--) { - - Int_t bLayer = sortindexes[jLayer]; - AliTRDseed tseed = bseed[bLayer]; - + // + // + for (Int_t jLayer=5;jLayer>1;jLayer--){ + Int_t bLayer = sortindexes[jLayer]; + AliTRDseed tseed = bseed[bLayer]; for (Int_t iTime=2;iTime<20;iTime++){ - - AliTRDpropagationLayer &layer = *(fTrSec[ns]->GetLayer(layers[bLayer][1] - iTime)); - Double_t dxlayer = layer.GetX()-xcl[bLayer]; - - Double_t zexp = tseed.fZref[0]; - Double_t zcor = tseed.fTilt*(tseed.fZProb - tseed.fZref[0]); - - Float_t roadz = padlength[bLayer] + 1.0; - if (TMath::Abs(tseed.fZProb - zexp) > padlength[bLayer]*0.5) { - roadz = padlength[bLayer] * 0.5; - } - if (tseed.fZfit[1]*tseed.fZref[1] < 0) { - roadz = padlength[bLayer] * 0.5; - } - if (TMath::Abs(tseed.fZProb - zexp) < 0.1*padlength[bLayer]) { - zexp = tseed.fZProb; - roadz = padlength[bLayer] * 0.5; + AliTRDpropagationLayer& layer = *(fTrSec[ns]->GetLayer(layers[bLayer][1]-iTime)); + Double_t dxlayer= layer.GetX()-xcl[bLayer]; + // + Double_t zexp = tseed.fZref[0]; + Double_t zcor = tseed.fTilt*(tseed.fZProb-tseed.fZref[0]); + // + Float_t roadz = padlength[bLayer]+1; + if (TMath::Abs(tseed.fZProb-zexp)> padlength[bLayer]*0.5) {roadz = padlength[bLayer]*0.5;} + if (tseed.fZfit[1]*tseed.fZref[1]<0) {roadz = padlength[bLayer]*0.5;} + if (TMath::Abs(tseed.fZProb-zexp)<0.1*padlength[bLayer]) { + zexp = tseed.fZProb; + roadz = padlength[bLayer]*0.5; } - - Double_t yexp = tseed.fYref[0] + tseed.fYref[1] * dxlayer - zcor; - Int_t index = layer.FindNearestCluster(yexp,zexp,kRoad1y,roadz); - if (index <= 0) continue; - AliTRDcluster *cl = (AliTRDcluster *) GetCluster(index); - // Register cluster + // + Double_t yexp = tseed.fYref[0]+ + tseed.fYref[1]*dxlayer-zcor; + Int_t index = layer.FindNearestCluster(yexp,zexp,kRoad1y, roadz); + if (index<=0) continue; + AliTRDcluster *cl = (AliTRDcluster*)GetCluster(index); + // tseed.fIndexes[iTime] = index; - tseed.fClusters[iTime] = cl; - tseed.fX[iTime] = dxlayer; - tseed.fY[iTime] = cl->GetY(); - tseed.fZ[iTime] = cl->GetZ(); - + tseed.fClusters[iTime] = cl; // register cluster + tseed.fX[iTime] = dxlayer; // register cluster + tseed.fY[iTime] = cl->GetY(); // register cluster + tseed.fZ[iTime] = cl->GetZ(); // register cluster } - tseed.Update(); if (tseed.IsOK()) { - Float_t dangle = tseed.fYfit[1] - tseed.fYref[1]; - Double_t zcor = tseed.fTilt * (tseed.fZProb - tseed.fZref[0]); - Float_t tquality = (18.0 - tseed.fN2) / 2.0 - + TMath::Abs(dangle) / 0.1 - + TMath::Abs(tseed.fYfit[0] - (tseed.fYref[0] - zcor)) / 0.2 - + 2.0 * TMath::Abs(tseed.fMeanz - tseed.fZref[0]) - / padlength[jLayer]; - if (tquality < squality[bLayer]) { + Float_t dangle = tseed.fYfit[1]-tseed.fYref[1]; + Double_t zcor = tseed.fTilt*(tseed.fZProb-tseed.fZref[0]); + // + Float_t tquality = (18-tseed.fN2)/2. + TMath::Abs(dangle)/0.1+ + TMath::Abs(tseed.fYfit[0]-(tseed.fYref[0]-zcor))/0.2+ + 2.*TMath::Abs(tseed.fMeanz-tseed.fZref[0])/padlength[jLayer]; + // + if (tquality (padlength[iLayer] * 0.5 + 1.0)) { + Bool_t acceptablez =kTRUE; + for (Int_t iLayer=0; iLayer<6;iLayer++){ + if (cseed[iLayer].IsOK()){ + Double_t zT2 = rpolz0+rpolz1*(xcl[iLayer] - xref2); + if (TMath::Abs(cseed[iLayer].fZProb-zT2)>padlength[iLayer]*0.5+1) acceptablez = kFALSE; - } } } - if (!acceptablez) { + if (!acceptablez){ fitterT2.FixParameter(3,zmf); fitterT2.FixParameter(4,dzmf); fitterT2.Eval(); @@ -2001,368 +1844,328 @@ void AliTRDtracker::MakeSeedsMI(Int_t /*inner*/, Int_t /*outer*/, AliESD * esd) rpolz0 = fitterT2.GetParameter(3); rpolz1 = fitterT2.GetParameter(4); } - - Double_t chi2TR = fitterT2.GetChisquare() / Float_t(npointsT); - Double_t chi2TC = fitterTC.GetChisquare() / Float_t(npointsT); - + // + Double_t chi2TR = fitterT2.GetChisquare()/Float_t(npointsT); + Double_t chi2TC = fitterTC.GetChisquare()/Float_t(npointsT); + // Double_t polz1c = fitterTC.GetParameter(2); - Double_t polz0c = polz1c * xref2; - - Double_t aC = fitterTC.GetParameter(0); - Double_t bC = fitterTC.GetParameter(1); - Double_t cC = aC / TMath::Sqrt(bC * bC + 1.0); // Curvature - - Double_t aR = fitterT2.GetParameter(0); - Double_t bR = fitterT2.GetParameter(1); - Double_t dR = fitterT2.GetParameter(2); - Double_t cR = 1.0 + bR*bR - dR*aR; - Double_t dca = 0.0; - - if (cR > 0.0) { - dca = -dR / (TMath::Sqrt(1.0 + bR*bR - dR*aR) + TMath::Sqrt(1.0 + bR*bR)); - cR = aR / TMath::Sqrt(cR); + Double_t polz0c = polz1c*xref2; + // + Double_t aC = fitterTC.GetParameter(0); + Double_t bC = fitterTC.GetParameter(1); + Double_t cC = aC/TMath::Sqrt(bC*bC+1.); // curvature + // + Double_t aR = fitterT2.GetParameter(0); + Double_t bR = fitterT2.GetParameter(1); + Double_t dR = fitterT2.GetParameter(2); + Double_t cR = 1+bR*bR-dR*aR; + Double_t dca = 0.; + if (cR>0){ + dca = -dR/(TMath::Sqrt(1+bR*bR-dR*aR)+TMath::Sqrt(1+bR*bR)); + cR = aR/TMath::Sqrt(cR); } - - Double_t chi2ZT2 = 0.0; - Double_t chi2ZTC = 0.0; - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { - if (cseed[iLayer].IsOK()) { - Double_t zT2 = rpolz0 + rpolz1 * (xcl[iLayer] - xref2); - Double_t zTC = polz0c + polz1c * (xcl[iLayer] - xref2); - chi2ZT2 += TMath::Abs(cseed[iLayer].fMeanz - zT2); - chi2ZTC += TMath::Abs(cseed[iLayer].fMeanz - zTC); + // + Double_t chi2ZT2=0, chi2ZTC=0; + for (Int_t iLayer=0; iLayer<6;iLayer++){ + if (cseed[iLayer].IsOK()){ + Double_t zT2 = rpolz0+rpolz1*(xcl[iLayer] - xref2); + Double_t zTC = polz0c+polz1c*(xcl[iLayer] - xref2); + chi2ZT2 += TMath::Abs(cseed[iLayer].fMeanz-zT2); + chi2ZTC += TMath::Abs(cseed[iLayer].fMeanz-zTC); } } - chi2ZT2 /= TMath::Max((nlayers - 3.0),1.0); - chi2ZTC /= TMath::Max((nlayers - 3.0),1.0); - - AliTRDseed::FitRiemanTilt(cseed,kTRUE); - Float_t sumdaf = 0.0; - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { - if (cseed[iLayer].IsOK()) { - sumdaf += TMath::Abs((cseed[iLayer].fYfit[1] - cseed[iLayer].fYref[1]) - / cseed[iLayer].fSigmaY2); - } + chi2ZT2/=TMath::Max((nlayers-3.),1.); + chi2ZTC/=TMath::Max((nlayers-3.),1.); + // + // + // + AliTRDseed::FitRiemanTilt(cseed, kTRUE); + Float_t sumdaf = 0; + for (Int_t iLayer=0;iLayer<6;iLayer++){ + if (cseed[iLayer].IsOK()) + sumdaf += TMath::Abs((cseed[iLayer].fYfit[1]-cseed[iLayer].fYref[1])/cseed[iLayer].fSigmaY2); } - sumdaf /= Float_t (nlayers - 2.0); - + sumdaf /= Float_t (nlayers-2.); // - // Likelihoods for full track + // likelihoods for full track // - Double_t likezf = TMath::Exp(-chi2ZF * 0.14); - Double_t likechi2C = TMath::Exp(-chi2TC * 0.677); - Double_t likechi2TR = TMath::Exp(-chi2TR * 0.78); - Double_t likeaf = TMath::Exp(-sumdaf * 3.23); - seedquality2[registered] = likezf * likechi2TR * likeaf; - - // Needed still ???? + Double_t likezf = TMath::Exp(-chi2ZF*0.14); + Double_t likechi2C = TMath::Exp(-chi2TC*0.677); + Double_t likechi2TR = TMath::Exp(-chi2TR*0.78); + Double_t likeaf = TMath::Exp(-sumdaf*3.23); + seedquality2[registered] = likezf*likechi2TR*likeaf; // Bool_t isGold = kFALSE; // -// if (nlayers == 6 && TMath::Log(0.000000001+seedquality2[index])<-5.) -// isGold =kTRUE; // gold -// if (nlayers == findable && TMath::Log(0.000000001+seedquality2[index])<-4.) -// isGold =kTRUE; // gold +// if (nlayers == 6 && TMath::Log(0.000000001+seedquality2[index])<-5.) isGold =kTRUE; // gold +// if (nlayers == findable && TMath::Log(0.000000001+seedquality2[index])<-4.) isGold =kTRUE; // gold // if (isGold &&nusedf<10){ // for (Int_t jLayer=0;jLayer<6;jLayer++){ -// if ( seed[index][jLayer].IsOK()&& -// TMath::Abs(seed[index][jLayer].fYfit[1]-seed[index][jLayer].fYfit[1])<0.1) +// if ( seed[index][jLayer].IsOK()&&TMath::Abs(seed[index][jLayer].fYfit[1]-seed[index][jLayer].fYfit[1])<0.1) // seed[index][jLayer].UseClusters(); //sign gold // } // } - - Int_t index0 = 0; - if (!cseed[0].IsOK()) { + // + // + // + Int_t index0=0; + if (!cseed[0].IsOK()){ index0 = 1; - if (!cseed[1].IsOK()) { - index0 = 2; - } + if (!cseed[1].IsOK()) index0 = 2; } seedparams[registered][0] = cseed[index0].fX0; seedparams[registered][1] = cseed[index0].fYref[0]; seedparams[registered][2] = cseed[index0].fZref[0]; seedparams[registered][5] = cR; - seedparams[registered][3] = cseed[index0].fX0 * cR - - TMath::Sin(TMath::ATan(cseed[0].fYref[1])); - seedparams[registered][4] = cseed[index0].fZref[1] - / TMath::Sqrt(1.0 + cseed[index0].fYref[1] - * cseed[index0].fYref[1]); + seedparams[registered][3] = cseed[index0].fX0*cR - TMath::Sin(TMath::ATan(cseed[0].fYref[1])); + seedparams[registered][4] = cseed[index0].fZref[1]/ + TMath::Sqrt(1+cseed[index0].fYref[1]*cseed[index0].fYref[1]); seedparams[registered][6] = ns; - - Int_t labels[12]; - Int_t outlab[24]; - Int_t nlab = 0; - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { + // + // + Int_t labels[12], outlab[24]; + Int_t nlab=0; + for (Int_t iLayer=0;iLayer<6;iLayer++){ if (!cseed[iLayer].IsOK()) continue; - if (cseed[iLayer].fLabels[0] >= 0) { + if (cseed[iLayer].fLabels[0]>=0) { labels[nlab] = cseed[iLayer].fLabels[0]; nlab++; } - if (cseed[iLayer].fLabels[1] >= 0) { + if (cseed[iLayer].fLabels[1]>=0) { labels[nlab] = cseed[iLayer].fLabels[1]; nlab++; } } Freq(nlab,labels,outlab,kFALSE); - Int_t label = outlab[0]; - Int_t frequency = outlab[1]; - for (Int_t iLayer = 0; iLayer < 6; iLayer++) { + Int_t label = outlab[0]; + Int_t frequency = outlab[1]; + for (Int_t iLayer=0;iLayer<6;iLayer++){ cseed[iLayer].fFreq = frequency; cseed[iLayer].fC = cR; - cseed[iLayer].fCC = cC; + cseed[iLayer].fCC = cC; cseed[iLayer].fChi2 = chi2TR; cseed[iLayer].fChi2Z = chi2ZF; } - - // Debugging print - if (1 || (!isFake)){ + // + if (1||(!isFake)){ //debugging print Float_t zvertex = GetZ(); - TTreeSRedirector &cstream = *fDebugStreamer; - if (AliTRDReconstructor::StreamLevel() > 0) { - cstream << "Seeds1" - << "isFake=" << isFake - << "Vertex=" << zvertex - << "Rieman2.=" << &rieman2 - << "Rieman.=" << &rieman - << "Xref=" << xref - << "X0=" << xcl[0] - << "X1=" << xcl[1] - << "X2=" << xcl[2] - << "X3=" << xcl[3] - << "X4=" << xcl[4] - << "X5=" << xcl[5] - << "Chi2R=" << chi2R - << "Chi2Z=" << chi2Z - << "Chi2RF=" << chi2RF // Chi2 of trackletes on full track - << "Chi2ZF=" << chi2ZF // Chi2 z on tracklets on full track - << "Chi2ZT2=" << chi2ZT2 // Chi2 z on tracklets on full track - rieman tilt - << "Chi2ZTC=" << chi2ZTC // Chi2 z on tracklets on full track - rieman tilt const - << "Chi2TR=" << chi2TR // Chi2 without vertex constrain - << "Chi2TC=" << chi2TC // Chi2 with vertex constrain - << "C=" << curv // Non constrained - no tilt correction - << "DR=" << dR // DR parameter - tilt correction - << "DCA=" << dca // DCA - tilt correction - << "CR=" << cR // Non constrained curvature - tilt correction - << "CC=" << cC // Constrained curvature - << "Polz0=" << polz0c - << "Polz1=" << polz1c - << "RPolz0=" << rpolz0 - << "RPolz1=" << rpolz1 - << "Ncl=" << nclusters - << "Nlayers=" << nlayers - << "NUsedS=" << nusedCl - << "NUsed=" << nusedf - << "Findable=" << findable - << "Like=" << like - << "LikePrim=" << likePrim - << "Likechi2C=" << likechi2C - << "Likechi2TR=" << likechi2TR - << "Likezf=" << likezf - << "LikeF=" << seedquality2[registered] - << "S0.=" << &cseed[0] - << "S1.=" << &cseed[1] - << "S2.=" << &cseed[2] - << "S3.=" << &cseed[3] - << "S4.=" << &cseed[4] - << "S5.=" << &cseed[5] - << "SB0.=" << &seedb[0] - << "SB1.=" << &seedb[1] - << "SB2.=" << &seedb[2] - << "SB3.=" << &seedb[3] - << "SB4.=" << &seedb[4] - << "SB5.=" << &seedb[5] - << "Label=" << label - << "Freq=" << frequency - << "sLayer=" << sLayer - << "\n"; - } + TTreeSRedirector& cstream = *fDebugStreamer; + if (AliTRDReconstructor::StreamLevel()>0) + cstream<<"Seeds1"<< + "isFake="<GetLabel(ilab); - if (tindex >=0) { + if (tindex>=0){ labelsall[nlabelsall] = tindex; nlabelsall++; } } } } - } - } - - if (nused > 30) continue; - - if (iter == 0) { - if (nlayers < 6) continue; - if (TMath::Log(0.000000001 + seedquality2[index]) < -5.0) continue; // Gold + // + if (nused>30) continue; + // + if (iter==0){ + if (nlayers<6) continue; + if (TMath::Log(0.000000001+seedquality2[index])<-5.) continue; // gold } - - if (iter == 1) { - if (nlayers < findable) continue; - if (TMath::Log(0.000000001+seedquality2[index]) < -4.0) continue; + // + if (iter==1){ + if (nlayers= 0) { + // + Int_t labels[1000], outlab[1000]; + Int_t nlab=0; + for (Int_t iLayer=0;iLayer<6;iLayer++){ + if (seed[index][iLayer].IsOK()){ + if (seed[index][iLayer].fLabels[0]>=0) { labels[nlab] = seed[index][iLayer].fLabels[0]; nlab++; } - if (seed[index][iLayer].fLabels[1] >= 0) { + if (seed[index][iLayer].fLabels[1]>=0) { labels[nlab] = seed[index][iLayer].fLabels[1]; nlab++; } } } Freq(nlab,labels,outlab,kFALSE); - Int_t label = outlab[0]; - Int_t frequency = outlab[1]; + Int_t label = outlab[0]; + Int_t frequency = outlab[1]; Freq(nlabelsall,labelsall,outlab,kFALSE); - Int_t label1 = outlab[0]; - Int_t label2 = outlab[2]; - Float_t fakeratio = (naccepted - outlab[1]) / Float_t(naccepted); - Float_t ratio = Float_t(nused) / Float_t(ncl); - if (ratio < 0.25) { - for (Int_t jLayer = 0; jLayer < 6; jLayer++) { - if (seed[index][jLayer].IsOK() && - TMath::Abs(seed[index][jLayer].fYfit[1] - seed[index][jLayer].fYfit[1]) < 0.2) { - seed[index][jLayer].UseClusters(); // Sign gold - } + Int_t label1 = outlab[0]; + Int_t label2 = outlab[2]; + Float_t fakeratio = (naccepted-outlab[1])/Float_t(naccepted); + Float_t ratio = Float_t(nused)/Float_t(ncl); + if (ratio<0.25){ + for (Int_t jLayer=0;jLayer<6;jLayer++){ + if ( seed[index][jLayer].IsOK()&&TMath::Abs(seed[index][jLayer].fYfit[1]-seed[index][jLayer].fYfit[1])<0.2 ) + seed[index][jLayer].UseClusters(); //sign gold } } - + // Int_t eventNr = esd->GetEventNumber(); - TTreeSRedirector &cstream = *fDebugStreamer; - + TTreeSRedirector& cstream = *fDebugStreamer; // - // Register seed + // register seed // - AliTRDtrack *track = RegisterSeed(seed[index],seedparams[index]); - AliTRDtrack dummy; - if (!track) { - track = &dummy; - } - else { + AliTRDtrack * track = RegisterSeed(seed[index],seedparams[index]); + AliTRDtrack dummy; + if (!track) track=&dummy; + else{ AliESDtrack esdtrack; - esdtrack.UpdateTrackParams(track,AliESDtrack::kTRDout); + esdtrack.UpdateTrackParams(track, AliESDtrack::kTRDout); esdtrack.SetLabel(label); esd->AddTrack(&esdtrack); - TTreeSRedirector &cstream = *fDebugStreamer; - if (AliTRDReconstructor::StreamLevel() > 0) { - cstream << "Tracks" - << "EventNr=" << eventNr - << "ESD.=" << &esdtrack - << "trd.=" << track - << "trdback.=" << track - << "\n"; - } - } - - if (AliTRDReconstructor::StreamLevel() > 0) { - cstream << "Seeds2" - << "Iter=" << iter - << "Track.=" << track - << "Like=" << seedquality[index] - << "LikeF=" << seedquality2[index] - << "S0.=" << &seed[index][0] - << "S1.=" << &seed[index][1] - << "S2.=" << &seed[index][2] - << "S3.=" << &seed[index][3] - << "S4.=" << &seed[index][4] - << "S5.=" << &seed[index][5] - << "Label=" << label - << "Label1=" << label1 - << "Label2=" << label2 - << "FakeRatio=" << fakeratio - << "Freq=" << frequency - << "Ncl=" << ncl - << "Nlayers=" << nlayers - << "Findable=" << findable - << "NUsed=" << nused - << "sLayer=" << sLayer - << "EventNr=" << eventNr - << "\n"; + TTreeSRedirector& cstream = *fDebugStreamer; + if (AliTRDReconstructor::StreamLevel()>0) + cstream<<"Tracks"<< + "EventNr="<0) + cstream<<"Seeds2"<< + "Iter="<GetTotBytes() / (sizeof(AliTRDcluster))); - TObjArray *clusterArray = new TObjArray(nsize + 1000); + Int_t nsize = Int_t(ClusterTree->GetTotBytes()/(sizeof(AliTRDcluster))); + TObjArray *clusterArray = new TObjArray(nsize+1000); TBranch *branch=ClusterTree->GetBranch("TRDcluster"); if (!branch) { - AliError("Can't get the cluster branch!"); + Error("ReadClusters","Can't get the branch !"); return 1; } branch->SetAddress(&clusterArray); + Int_t nEntries = (Int_t) ClusterTree->GetEntries(); + // printf("found %d entries in %s.\n",nEntries,ClusterTree->GetName()); + // Loop through all entries in the tree - Int_t nEntries = (Int_t) ClusterTree->GetEntries(); - Int_t nbytes = 0; + Int_t nbytes = 0; AliTRDcluster *c = 0; + // printf("\n"); for (Int_t iEntry = 0; iEntry < nEntries; iEntry++) { // Import the tree @@ -2398,16 +2204,18 @@ Int_t AliTRDtracker::ReadClusters(TObjArray *array, TTree *ClusterTree) const // Get the number of points in the detector Int_t nCluster = clusterArray->GetEntriesFast(); +// printf("\r Read %d clusters from entry %d", nCluster, iEntry); // Loop through all TRD digits for (Int_t iCluster = 0; iCluster < nCluster; iCluster++) { - c = (AliTRDcluster *) clusterArray->UncheckedAt(iCluster); + c = (AliTRDcluster*)clusterArray->UncheckedAt(iCluster); AliTRDcluster *co = c; array->AddLast(co); + // delete clusterArray->RemoveAt(iCluster); clusterArray->RemoveAt(iCluster); } - } +// cout<<"Allocated"<GetEntriesFast()<<"\n"; delete clusterArray; @@ -2416,22 +2224,22 @@ Int_t AliTRDtracker::ReadClusters(TObjArray *array, TTree *ClusterTree) const } //_____________________________________________________________________________ -Bool_t AliTRDtracker::GetTrackPoint(Int_t index, AliTrackPoint &p) const +Bool_t AliTRDtracker::GetTrackPoint(Int_t index, AliTrackPoint& p) const { // // Get track space point with index i // Origin: C.Cheshkov // - AliTRDcluster *cl = (AliTRDcluster *) fClusters->UncheckedAt(index); - Int_t idet = cl->GetDetector(); - Int_t isector = fGeom->GetSector(idet); - Int_t ichamber = fGeom->GetChamber(idet); - Int_t iplan = fGeom->GetPlane(idet); + AliTRDcluster *cl = (AliTRDcluster*)fClusters->UncheckedAt(index); + Int_t idet = cl->GetDetector(); + Int_t isector = fGeom->GetSector(idet); + Int_t ichamber= fGeom->GetChamber(idet); + Int_t iplan = fGeom->GetPlane(idet); Double_t local[3]; - local[0] = GetX(isector,iplan,cl->GetLocalTimeBin()); - local[1] = cl->GetY(); - local[2] = cl->GetZ(); + local[0]=GetX(isector,iplan,cl->GetLocalTimeBin()); + local[1]=cl->GetY(); + local[2]=cl->GetZ(); Double_t global[3]; fGeom->RotateBack(idet,local,global); p.SetXYZ(global[0],global[1],global[2]); @@ -2456,7 +2264,7 @@ Bool_t AliTRDtracker::GetTrackPoint(Int_t index, AliTrackPoint &p) const iLayer = AliAlignObj::kTRD6; break; }; - Int_t modId = isector * fGeom->Ncham() + ichamber; + Int_t modId = isector*fGeom->Ncham()+ichamber; UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,modId); p.SetVolumeID(volid); @@ -2471,49 +2279,43 @@ void AliTRDtracker::CookLabel(AliKalmanTrack* pt, Float_t wrong) const // This cooks a label. Mmmmh, smells good... // - Int_t label = 123456789; - Int_t index; - Int_t i; - Int_t j; - Int_t ncl = pt->GetNumberOfClusters(); - const Int_t kRange = fTrSec[0]->GetOuterTimeBin() + 1; + Int_t label=123456789, index, i, j; + Int_t ncl=pt->GetNumberOfClusters(); + const Int_t kRange = fTrSec[0]->GetOuterTimeBin()+1; Bool_t labelAdded; - Int_t **s = new Int_t*[kRange]; - for (i = 0; i < kRange; i++) { + // Int_t s[kRange][2]; + Int_t **s = new Int_t* [kRange]; + for (i=0; iGetClusterIndex(i); - AliTRDcluster *c = (AliTRDcluster *) fClusters->UncheckedAt(index); - t0 = c->GetLabel(0); - t1 = c->GetLabel(1); - t2 = c->GetLabel(2); + Int_t t0,t1,t2; + for (i=0; iGetClusterIndex(i); + AliTRDcluster *c=(AliTRDcluster*)fClusters->UncheckedAt(index); + t0=c->GetLabel(0); + t1=c->GetLabel(1); + t2=c->GetLabel(2); } - for (i = 0; i < ncl; i++) { - index = pt->GetClusterIndex(i); - AliTRDcluster *c = (AliTRDcluster *) fClusters->UncheckedAt(index); - for (Int_t k = 0; k < 3; k++) { - label = c->GetLabel(k); - labelAdded = kFALSE; - j = 0; + for (i=0; iGetClusterIndex(i); + AliTRDcluster *c=(AliTRDcluster*)fClusters->UncheckedAt(index); + for (Int_t k=0; k<3; k++) { + label=c->GetLabel(k); + labelAdded=kFALSE; j=0; if (label >= 0) { - while ((!labelAdded) && (j < kRange)) { - if ((s[j][0] == label) || - (s[j][1] == 0)) { - s[j][0] = label; - s[j][1] = s[j][1] + 1; - labelAdded = kTRUE; + while ( (!labelAdded) && ( j < kRange ) ) { + if (s[j][0]==label || s[j][1]==0) { + s[j][0]=label; + s[j][1]=s[j][1]+1; + labelAdded=kTRUE; } j++; } @@ -2521,25 +2323,22 @@ void AliTRDtracker::CookLabel(AliKalmanTrack* pt, Float_t wrong) const } } - Int_t max = 0; - label = -123456789; + Int_t max=0; + label = -123456789; - for (i = 0; i < kRange; i++) { - if (s[i][1] > max) { - max = s[i][1]; - label = s[i][0]; + for (i=0; imax) { + max=s[i][1]; label=s[i][0]; } } - for (i = 0; i < kRange; i++) { - delete [] s[i]; + for (i=0; i wrong) { - label = -label; - } + if ((1.- Float_t(max)/ncl) > wrong) label=-label; pt->SetLabel(label); @@ -2552,17 +2351,18 @@ void AliTRDtracker::UseClusters(const AliKalmanTrack* t, Int_t from) const // Use clusters, but don't abuse them! // - const Float_t kmaxchi2 = 18.0; - const Float_t kmincl = 10.0; - AliTRDtrack *track = (AliTRDtrack *) t; - - Int_t ncl = t->GetNumberOfClusters(); - for (Int_t i = from; i < ncl; i++) { + const Float_t kmaxchi2 =18; + const Float_t kmincl =10; + AliTRDtrack * track = (AliTRDtrack*)t; + // + Int_t ncl=t->GetNumberOfClusters(); + for (Int_t i=from; iGetClusterIndex(i); - AliTRDcluster *c= (AliTRDcluster *) fClusters->UncheckedAt(index); + AliTRDcluster *c=(AliTRDcluster*)fClusters->UncheckedAt(index); + // Int_t iplane = fGeom->GetPlane(c->GetDetector()); - if (track->fTracklets[iplane].GetChi2() > kmaxchi2) continue; - if (track->fTracklets[iplane].GetN() < kmincl) continue; + if (track->fTracklets[iplane].GetChi2()>kmaxchi2) continue; + if (track->fTracklets[iplane].GetN()IsUsed())) c->Use(); } @@ -2576,7 +2376,6 @@ Double_t AliTRDtracker::ExpectedSigmaY2(Double_t , Double_t , Double_t ) const // Double_t s = 0.08 * 0.08; - return s; } @@ -2588,8 +2387,7 @@ Double_t AliTRDtracker::ExpectedSigmaZ2(Double_t , Double_t ) const // Parametrised "expected" error of the cluster reconstruction in Z // - Double_t s = 9.0 * 9.0 / 12.0; - + Double_t s = 9 * 9 /12.; return s; } @@ -2602,9 +2400,8 @@ Double_t AliTRDtracker::GetX(Int_t sector, Int_t plane, Int_t localTB) const // in tracking sector and plane // - Int_t index = fTrSec[sector]->CookTimeBinIndex(plane,localTB); - Int_t pl = fTrSec[sector]->GetLayerNumber(index); - + Int_t index = fTrSec[sector]->CookTimeBinIndex(plane, localTB); + Int_t pl = fTrSec[sector]->GetLayerNumber(index); return fTrSec[sector]->GetLayer(pl)->GetX(); } @@ -2653,35 +2450,6 @@ AliTRDtracker::AliTRDpropagationLayer } -//_____________________________________________________________________________ -AliTRDtracker::AliTRDpropagationLayer - ::AliTRDpropagationLayer(const AliTRDpropagationLayer &/*p*/) - :fN(0) - ,fSec(0) - ,fClusters(NULL) - ,fIndex(NULL) - ,fX(0) - ,fdX(0) - ,fRho(0) - ,fX0(0) - ,fTimeBinIndex(0) - ,fPlane(0) - ,fYmax(0) - ,fYmaxSensitive(0) - ,fHole(kFALSE) - ,fHoleZc(0) - ,fHoleZmax(0) - ,fHoleYc(0) - ,fHoleYmax(0) - ,fHoleRho(0) - ,fHoleX0(0) -{ - // - // Copy constructor - // - -} - //_____________________________________________________________________________ void AliTRDtracker::AliTRDpropagationLayer ::SetHole(Double_t Zmax, Double_t Ymax, Double_t rho @@ -2691,13 +2459,13 @@ void AliTRDtracker::AliTRDpropagationLayer // Sets hole in the layer // - fHole = kTRUE; - fHoleZc = Zc; + fHole = kTRUE; + fHoleZc = Zc; fHoleZmax = Zmax; - fHoleYc = Yc; + fHoleYc = Yc; fHoleYmax = Ymax; - fHoleRho = rho; - fHoleX0 = radLength; + fHoleRho = rho; + fHoleX0 = radLength; } @@ -2817,16 +2585,15 @@ Int_t AliTRDtracker::AliTRDtrackingSector ::CookTimeBinIndex(Int_t plane, Int_t localTB) const { // - // Depending on the digitization parameters calculates "global" + // depending on the digitization parameters calculates "global" // time bin index for timebin in plane // // Int_t tbPerPlane = AliTRDcalibDB::Instance()->GetNumberOfTimeBins(); - Int_t gtb = (plane + 1) * tbPerPlane - localTB - 1; - - if (localTB < 0) return -1; - if (gtb < 0) return -1; + Int_t gtb = (plane+1) * tbPerPlane - localTB -1; + if (localTB<0) return -1; + if (gtb<0) return -1; return gtb; @@ -2843,20 +2610,19 @@ void AliTRDtracker::AliTRDtrackingSector Int_t index; - for (Int_t i = 0; i < fN; i++) { - + for(Int_t i = 0; i < fN; i++) { index = fLayers[i]->GetTimeBinIndex(); + + // printf("gtb %d -> pl %d -> x %f \n", index, i, fLayers[i]->GetX()); if(index < 0) continue; if(index >= (Int_t) kMaxTimeBinIndex) { - AliWarningGeneral("AliTRDtrackingSector::MapTimeBinLayers()" - ,Form("Index %d exceeds allowed maximum of %d!\n" - ,index,kMaxTimeBinIndex-1)); + printf("*** AliTRDtracker::MapTimeBinLayers: \n"); + printf(" index %d exceeds allowed maximum of %d!\n", + index, kMaxTimeBinIndex-1); continue; } - fTimeBinIndex[index] = i; - } } @@ -2869,29 +2635,18 @@ Int_t AliTRDtracker::AliTRDtrackingSector // Returns the number of time bin which in radial position is closest to // - if (x >= fLayers[fN-1]->GetX()) return fN - 1; - if (x <= fLayers[0]->GetX()) return 0; - - Int_t b = 0; - Int_t e = fN - 1; - Int_t m = (b + e) / 2; + if(x >= fLayers[fN-1]->GetX()) return fN-1; + if(x <= fLayers[0]->GetX()) return 0; - for (; b < e; m = (b + e)/ 2) { - if (x > fLayers[m]->GetX()) { - b = m + 1; - } - else { - e = m; - } + Int_t b=0, e=fN-1, m=(b+e)/2; + for (; b fLayers[m]->GetX()) b=m+1; + else e=m; } + if(TMath::Abs(x - fLayers[m]->GetX()) > + TMath::Abs(x - fLayers[m+1]->GetX())) return m+1; - if (TMath::Abs(x - fLayers[m]->GetX()) > - TMath::Abs(x - fLayers[m+1]->GetX())) { - return m+1; - } - else { - return m; - } + else return m; } @@ -2927,15 +2682,13 @@ Int_t AliTRDtracker::AliTRDtrackingSector // Returns number of SENSITIVE time bins // - Int_t tb; - Int_t layer; - - for (tb = kMaxTimeBinIndex - 1; tb >= 0; tb--) { + Int_t tb, layer; + for(tb = kMaxTimeBinIndex-1; tb >=0; tb--) { layer = GetLayerNumber(tb); - if (layer >= 0) break; + if(layer>=0) break; } - return tb + 1; + return tb+1; } @@ -2948,22 +2701,15 @@ void AliTRDtracker::AliTRDtrackingSector // Layers are sorted according to X coordinate. // - if (fN == ((Int_t) kMaxLayersPerSector)) { - AliWarningGeneral("AliTRDtrackingSector::InsertLayer" - ,"Too many layers !\n"); - return; - } - - if (fN == 0) { - fLayers[fN++] = pl; + if ( fN == ((Int_t) kMaxLayersPerSector)) { + printf("AliTRDtrackingSector::InsertLayer(): Too many layers !\n"); return; } + if (fN==0) {fLayers[fN++] = pl; return;} + Int_t i=Find(pl->GetX()); - Int_t i = Find(pl->GetX()); - memmove(fLayers + i + 1,fLayers + i - ,(fN-i)*sizeof(AliTRDpropagationLayer*)); - fLayers[i] = pl; - fN++; + memmove(fLayers+i+1 ,fLayers+i,(fN-i)*sizeof(AliTRDpropagationLayer*)); + fLayers[i]=pl; fN++; } @@ -2975,20 +2721,12 @@ Int_t AliTRDtracker::AliTRDtrackingSector // Returns index of the propagation layer nearest to X // - if (x <= fLayers[0]->GetX()) return 0; - if (x > fLayers[fN-1]->GetX()) return fN; - - Int_t b = 0; - Int_t e = fN - 1; - Int_t m = (b + e) / 2; - - for (; b < e; m = (b + e) / 2) { - if (x > fLayers[m]->GetX()) { - b = m + 1; - } - else { - e = m; - } + if (x <= fLayers[0]->GetX()) return 0; + if (x > fLayers[fN-1]->GetX()) return fN; + Int_t b=0, e=fN-1, m=(b+e)/2; + for (; b fLayers[m]->GetX()) b=m+1; + else e=m; } return m; @@ -2997,18 +2735,17 @@ Int_t AliTRDtracker::AliTRDtrackingSector //_____________________________________________________________________________ void AliTRDtracker::AliTRDpropagationLayer - ::SetZ(Double_t *center, Double_t *w, Double_t *wsensitive ) + ::SetZ(Double_t* center, Double_t *w, Double_t *wsensitive ) { // - // Set centers and the width of sectors + // set centers and the width of sectors // - for (Int_t icham = 0; icham < AliTRDgeometry::kNcham; icham++) { - - fZc[icham] = center[icham]; - fZmax[icham] = w[icham]; + for (Int_t icham=0;icham< AliTRDgeometry::kNcham;icham++){ + fZc[icham] = center[icham]; + fZmax[icham] = w[icham]; fZmaxSensitive[icham] = wsensitive[icham]; - + // printf("chamber\t%d\tzc\t%f\tzmax\t%f\tzsens\t%f\n",icham,fZc[icham],fZmax[icham],fZmaxSensitive[icham]); } } @@ -3017,53 +2754,40 @@ void AliTRDtracker::AliTRDpropagationLayer void AliTRDtracker::AliTRDpropagationLayer::SetHoles(Bool_t *holes) { // - // Set centers and the width of sectors + // set centers and the width of sectors // fHole = kFALSE; - - for (Int_t icham = 0; icham < AliTRDgeometry::kNcham; icham++) { + for (Int_t icham=0;icham< AliTRDgeometry::kNcham;icham++){ fIsHole[icham] = holes[icham]; - if (holes[icham]) { - fHole = kTRUE; - } + if (holes[icham]) fHole = kTRUE; } } //_____________________________________________________________________________ void AliTRDtracker::AliTRDpropagationLayer - ::InsertCluster(AliTRDcluster *c, UInt_t index) + ::InsertCluster(AliTRDcluster* c, UInt_t index) { // // Insert cluster in cluster array. // Clusters are sorted according to Y coordinate. // - if (fTimeBinIndex < 0) { - AliErrorGeneral("AliTRDpropagationLayer::InsertCluster" - ,"Attempt to insert cluster into non-sensitive time bin!\n"); - return; - } - - if (fN == (Int_t) kMaxClusterPerTimeBin) { - AliErrorGeneral("AliTRDpropagationLayer::InsertCluster" - ,"Too many clusters !\n"); + if(fTimeBinIndex < 0) { + printf("*** attempt to insert cluster into non-sensitive time bin!\n"); return; } - if (fN == 0) { - fIndex[0] = index; - fClusters[fN++] = c; + if (fN== (Int_t) kMaxClusterPerTimeBin) { + printf("AliTRDpropagationLayer::InsertCluster(): Too many clusters !\n"); return; } - - Int_t i = Find(c->GetY()); - memmove(fClusters+i+1,fClusters+i,(fN-i)*sizeof(AliTRDcluster*)); - memmove(fIndex +i+1,fIndex +i,(fN-i)*sizeof(UInt_t)); - fIndex[i] = index; - fClusters[i] = c; - fN++; + if (fN==0) {fIndex[0]=index; fClusters[fN++]=c; return;} + Int_t i=Find(c->GetY()); + memmove(fClusters+i+1 ,fClusters+i,(fN-i)*sizeof(AliTRDcluster*)); + memmove(fIndex +i+1 ,fIndex +i,(fN-i)*sizeof(UInt_t)); + fIndex[i]=index; fClusters[i]=c; fN++; } @@ -3074,21 +2798,13 @@ Int_t AliTRDtracker::AliTRDpropagationLayer::Find(Float_t y) const // Returns index of the cluster nearest in Y // - if (fN <= 0) return 0; - if (y <= fClusters[0]->GetY()) return 0; - if (y > fClusters[fN-1]->GetY()) return fN; - - Int_t b = 0; - Int_t e = fN - 1; - Int_t m = (b + e) / 2; - - for (; b < e; m = (b + e) / 2) { - if (y > fClusters[m]->GetY()) { - b = m + 1; - } - else { - e = m; - } + if (fN<=0) return 0; + if (y <= fClusters[0]->GetY()) return 0; + if (y > fClusters[fN-1]->GetY()) return fN; + Int_t b=0, e=fN-1, m=(b+e)/2; + for (; b fClusters[m]->GetY()) b=m+1; + else e=m; } return m; @@ -3104,20 +2820,21 @@ Int_t AliTRDtracker::AliTRDpropagationLayer // Returns index of the cluster nearest to the given y,z // - Int_t index = -1; - Int_t maxn = fN; + Int_t index = -1; + Int_t maxn = fN; Float_t mindist = maxroad; - - for (Int_t i = Find(y - maxroad); i < maxn; i++) { - AliTRDcluster *c = (AliTRDcluster *) (fClusters[i]); + // + for (Int_t i=Find(y-maxroad); iGetY(); - if (ycl > y + maxroad) break; - if (TMath::Abs(c->GetZ() - z) > maxroadz) continue; - if (TMath::Abs(ycl - y) < mindist) { - mindist = TMath::Abs(ycl - y); - index = fIndex[i]; - } - } + // + if (ycl > y+maxroad) break; + if (TMath::Abs(c->GetZ()-z) > maxroadz) continue; + if (TMath::Abs(ycl-y)GetDetector(); + Int_t det = c->GetDetector(); Int_t plane = fGeom->GetPlane(det); - AliTRDpadPlane *padPlane = AliTRDCommonParam::Instance()->GetPadPlane(plane,0); + Double_t h01 = TMath::Tan(-TMath::Pi() / 180.0 * padPlane->GetTiltingAngle()); - Double_t h01 = TMath::Tan(-TMath::Pi()/180.0 * padPlane->GetTiltingAngle()); - - if (fNoTilt) h01 = 0.0; + if(fNoTilt) h01 = 0; return h01; @@ -3147,6 +2862,7 @@ Double_t AliTRDtracker::GetTiltFactor(const AliTRDcluster* c) void AliTRDtracker::CookdEdxTimBin(AliTRDtrack& TRDtrack) { // + // *** ADDED TO GET MORE INFORMATION FOR TRD PID ---- PS // This is setting fdEdxPlane and fTimBinPlane // Sums up the charge in each plane for track TRDtrack and also get the // Time bin for Max. Cluster @@ -3158,17 +2874,17 @@ void AliTRDtracker::CookdEdxTimBin(AliTRDtrack& TRDtrack) Int_t nCluster[AliESDtrack::kNPlane][AliESDtrack::kNSlice]; Int_t timebin[AliESDtrack::kNPlane]; - // Initialization of cluster charge per plane. + //Initialization of cluster charge per plane. for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) { for (Int_t iSlice = 0; iSlice < AliESDtrack::kNSlice; iSlice++) { clscharge[iPlane][iSlice] = 0.0; - nCluster[iPlane][iSlice] = 0; + nCluster[iPlane][iSlice] = 0; } } - // Initialization of cluster charge per plane. + //Initialization of cluster charge per plane. for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) { - timebin[iPlane] = -1; + timebin[iPlane] = -1; maxclscharge[iPlane] = 0.0; } @@ -3176,36 +2892,34 @@ void AliTRDtracker::CookdEdxTimBin(AliTRDtrack& TRDtrack) Int_t nClus = TRDtrack.GetNumberOfClusters(); // from Kalmantrack for (Int_t iClus = 0; iClus < nClus; iClus++) { Double_t charge = TRDtrack.GetClusterdQdl(iClus); - Int_t index = TRDtrack.GetClusterIndex(iClus); + Int_t index = TRDtrack.GetClusterIndex(iClus); AliTRDcluster *pTRDcluster = (AliTRDcluster *) GetCluster(index); if (!pTRDcluster) continue; Int_t tb = pTRDcluster->GetLocalTimeBin(); - if (!tb) continue; + if (!tb) continue; Int_t detector = pTRDcluster->GetDetector(); Int_t iPlane = fGeom->GetPlane(detector); - Int_t iSlice = tb * AliESDtrack::kNSlice / AliTRDtrack::kNtimeBins; - clscharge[iPlane][iSlice] = clscharge[iPlane][iSlice] + charge; + Int_t iSlice = tb*AliESDtrack::kNSlice/AliTRDtrack::kNtimeBins; + clscharge[iPlane][iSlice] = clscharge[iPlane][iSlice]+charge; if(charge > maxclscharge[iPlane]) { maxclscharge[iPlane] = charge; - timebin[iPlane] = tb; + timebin[iPlane] = tb; } nCluster[iPlane][iSlice]++; - } + } // end of loop over cluster // Setting the fdEdxPlane and fTimBinPlane variabales Double_t totalCharge = 0; + for (Int_t iPlane = 0; iPlane < AliESDtrack::kNPlane; iPlane++) { for (Int_t iSlice = 0; iSlice < AliESDtrack::kNSlice; iSlice++) { - if (nCluster[iPlane][iSlice]) { - clscharge[iPlane][iSlice] /= nCluster[iPlane][iSlice]; - } - TRDtrack.SetPIDsignals(clscharge[iPlane][iSlice],iPlane,iSlice); - totalCharge = totalCharge + clscharge[iPlane][iSlice]; + if (nCluster[iPlane][iSlice]) clscharge[iPlane][iSlice] /= nCluster[iPlane][iSlice]; + TRDtrack.SetPIDsignals(clscharge[iPlane][iSlice], iPlane, iSlice); + totalCharge= totalCharge+clscharge[iPlane][iSlice]; } - TRDtrack.SetPIDTimBin(timebin[iPlane],iPlane); + TRDtrack.SetPIDTimBin(timebin[iPlane], iPlane); } - // Still needed ???? // Int_t i; // Int_t nc=TRDtrack.GetNumberOfClusters(); // Float_t dedx=0; @@ -3220,139 +2934,120 @@ void AliTRDtracker::CookdEdxTimBin(AliTRDtrack& TRDtrack) //_____________________________________________________________________________ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1 - , AliTRDtrack *track - , Int_t *clusters - , AliTRDtracklet &tracklet) + , AliTRDtrack * track + , Int_t *clusters,AliTRDtracklet&tracklet) { + // // // Try to find nearest clusters to the track in timebins from t0 to t1 // - // correction coefficients - // - depend on TRD parameters - // - to be changed according it - // - - Double_t x[100]; - Double_t yt[100]; - Double_t zt[100]; - Double_t xmean = 0.0; // Reference x - Double_t dz[10][100]; - Double_t dy[10][100]; - Float_t zmean[100]; - Float_t nmean[100]; - Int_t clfound = 0; - Int_t indexes[10][100]; // Indexes of the clusters in the road - Int_t best[10][100]; // Index of best matching cluster - - AliTRDcluster *cl[10][100]; // Pointers to the clusters in the road - - for (Int_t it = 0; it < 100; it++) { - - x[it] = 0.0; - yt[it] = 0.0; - zt[it] = 0.0; - clusters[it] = -2; - zmean[it] = 0.0; - nmean[it] = 0.0; - - for (Int_t ih = 0; ih < 10; ih++) { - indexes[ih][it] = -2; // Reset indexes1 - cl[ih][it] = 0; - dz[ih][it] = -100.0; - dy[ih][it] = -100.0; - best[ih][it] = 0; - } + // + // + // correction coeficients - depends on TRD parameters - to be changed according it + // - } + Double_t x[100],yt[100],zt[100]; + Double_t xmean=0; //reference x + Double_t dz[10][100],dy[10][100]; + Float_t zmean[100], nmean[100]; + Int_t clfound=0; + Int_t indexes[10][100]; // indexes of the clusters in the road + AliTRDcluster *cl[10][100]; // pointers to the clusters in the road + Int_t best[10][100]; // index of best matching cluster + // + // + for (Int_t it=0;it<100; it++){ + x[it]=0; + yt[it]=0; + zt[it]=0; + clusters[it]=-2; + zmean[it]=0; + nmean[it]=0; + // + for (Int_t ih=0;ih<10;ih++){ + indexes[ih][it]=-2; //reset indexes1 + cl[ih][it]=0; + dz[ih][it]=-100; + dy[ih][it]=-100; + best[ih][it]=0; + } + } + // + Double_t x0 = track->GetX(); + Double_t sigmaz = TMath::Sqrt(TMath::Abs(track->GetSigmaZ2())); + Int_t nall=0; + Int_t nfound=0; + Double_t h01 =0; + Int_t plane =-1; + Int_t detector =-1; + Float_t padlength=0; AliTRDtrack track2(*track); - Double_t x0 = track->GetX(); - Double_t sigmaz = TMath::Sqrt(TMath::Abs(track->GetSigmaZ2())); - Int_t nall = 0; - Int_t nfound = 0; - Double_t h01 = 0.0; - Int_t plane = -1; - Int_t detector = -1; - Float_t padlength = 0.0; - Float_t snpy = track->GetSnp(); - Float_t tany = TMath::Sqrt(snpy*snpy / (1.0 - snpy*snpy)); - - if (snpy < 0.0) { - tany *= -1.0; - } - - Double_t sy2 = ExpectedSigmaY2(x0,track->GetTgl(),track->GetPt()); - Double_t sz2 = ExpectedSigmaZ2(x0,track->GetTgl()); - Double_t road = 15.0 * TMath::Sqrt(track->GetSigmaY2() + sy2); - if (road > 6.0) { - road = 6.0; - } - - for (Int_t it = 0; it < t1-t0; it++) { - - Double_t maxChi2[2] = { fgkMaxChi2, fgkMaxChi2 }; - AliTRDpropagationLayer &timeBin= *(fTrSec[sector]->GetLayer(it+t0)); - if (timeBin == 0) continue; // No indexes1 + Float_t snpy = track->GetSnp(); + Float_t tany = TMath::Sqrt(snpy*snpy/(1.-snpy*snpy)); + if (snpy<0) tany*=-1; + // + Double_t sy2=ExpectedSigmaY2(x0,track->GetTgl(),track->GetPt()); + Double_t sz2=ExpectedSigmaZ2(x0,track->GetTgl()); + Double_t road = 15.*sqrt(track->GetSigmaY2() + sy2); + if (road>6.) road=6.; + // + for (Int_t it=0;itGetLayer(it+t0)); + if (timeBin==0) continue; // no indexes1 Int_t maxn = timeBin; - x[it] = timeBin.GetX(); + x[it] = timeBin.GetX(); track2.PropagateTo(x[it]); - yt[it] = track2.GetY(); - zt[it] = track2.GetZ(); + yt[it] = track2.GetY(); + zt[it] = track2.GetZ(); - Double_t y = yt[it]; - Double_t z = zt[it]; - Double_t chi2 = 1000000.0; + Double_t y=yt[it],z=zt[it]; + Double_t chi2 =1000000; nall++; - // - // Find 2 nearest cluster at given time bin + // find 2 nearest cluster at given time bin // - for (Int_t i = timeBin.Find(y-road); i < maxn; i++) { - - AliTRDcluster *c= (AliTRDcluster *) (timeBin[i]); + // + for (Int_t i=timeBin.Find(y-road); iGetDetector(); - plane = fGeom->GetPlane(det); - padlength = TMath::Sqrt(c->GetSigmaZ2() * 12.0); + plane = fGeom->GetPlane(det); + padlength = TMath::Sqrt(c->GetSigmaZ2()*12.); } - + // if (c->GetLocalTimeBin()==0) continue; if (c->GetY() > y+road) break; - if (((c->GetZ() - z) * (c->GetZ() - z)) > (12.0 * sz2)) continue; - - Double_t dist = TMath::Abs(c->GetZ() - z); - if (dist > (0.5 * padlength + 6.0 * sigmaz)) continue; // 6 sigma boundary cut - Double_t cost = 0.0; - // Sigma boundary cost function - if (dist > (0.5 * padlength - sigmaz)) { - cost = (dist - 0.5 * padlength) / (2.0 * sigmaz); - if (cost > -1.0) { - cost = (cost + 1.0) * (cost + 1.0); - } - else { - cost = 0.0; - } - } - // Still needed ???? - //Int_t label = TMath::Abs(track->GetLabel()); - //if (c->GetLabel(0)!=label && c->GetLabel(1)!=label&&c->GetLabel(2)!=label) continue; - chi2 = track2.GetPredictedChi2(c,h01) + cost; + if((c->GetZ()-z)*(c->GetZ()-z) > 12. * sz2) continue; + Double_t dist = TMath::Abs(c->GetZ()-z); + if (dist> (0.5*padlength+6.*sigmaz)) continue; // 6 sigma boundary cut + Double_t cost = 0; + // + if (dist> (0.5*padlength-sigmaz)){ // sigma boundary cost function + cost = (dist-0.5*padlength)/(2.*sigmaz); + if (cost>-1) cost= (cost+1.)*(cost+1.); + else cost=0; + } + // Int_t label = TMath::Abs(track->GetLabel()); + // if (c->GetLabel(0)!=label && c->GetLabel(1)!=label&&c->GetLabel(2)!=label) continue; + chi2=track2.GetPredictedChi2(c,h01)+cost; + // clfound++; + if (chi2 > maxChi2[1]) continue; - detector = c->GetDetector(); - - // Store the clusters in the road - for (Int_t ih = 2; ih < 9; ih++) { - if (cl[ih][it] == 0) { - cl[ih][it] = c; - indexes[ih][it] = timeBin.GetIndex(i); // Index - 9 - reserved for outliers + detector = c->GetDetector(); + for (Int_t ih=2;ih<9; ih++){ //store the clusters in the road + if (cl[ih][it]==0){ + cl[ih][it] = c; + indexes[ih][it] =timeBin.GetIndex(i); // index - 9 - reserved for outliers break; } } - - if (chi2 < maxChi2[0]) { + // + if (chi2 t1-t0) continue; + for (Int_t dt=-3;dt<=3;dt++){ + if (it+dt<0) continue; + if (it+dt>t1-t0) continue; if (!cl[0][it+dt]) continue; - zmean[it] += cl[0][it+dt]->GetZ(); - nmean[it] += 1.0; + zmean[it]+=cl[0][it+dt]->GetZ(); + nmean[it]+=1.; } - zmean[it] /= nmean[it]; - + zmean[it]/=nmean[it]; } - - for (Int_t it = 0; it < t1-t0; it++) { - - best[0][it] = 0; - for (Int_t ih = 0; ih < 10; ih++) { - - dz[ih][it] = -100.0; - dy[ih][it] = -100.0; + // + for (Int_t it=0; itGetX(); - Double_t ytrack; - Double_t ztrack; - track2.GetProlongation(xcluster,ytrack,ztrack); - dz[ih][it] = cl[ih][it]->GetZ() - ztrack; // Calculate z-distance from track - dy[ih][it] = cl[ih][it]->GetY() + dz[ih][it]*h01 - ytrack; // Calculate y-distance from track - + Double_t xcluster = cl[ih][it]->GetX(); + Double_t ytrack,ztrack; + track2.GetProlongation(xcluster, ytrack, ztrack ); + dz[ih][it] = cl[ih][it]->GetZ()- ztrack; // calculate distance from track in z + dy[ih][it] = cl[ih][it]->GetY()+ dz[ih][it]*h01 -ytrack; // in y } - - // Minimize changes + // minimize changes if (!cl[0][it]) continue; - if ((TMath::Abs(cl[0][it]->GetZ() - zmean[it]) > padlength * 0.8) && - (cl[1][it])) { - if (TMath::Abs(cl[1][it]->GetZ() - zmean[it]) < padlength * 0.5) { - best[0][it] = 1; + if (TMath::Abs(cl[0][it]->GetZ()-zmean[it])> padlength*0.8 &&cl[1][it]) + if (TMath::Abs(cl[1][it]->GetZ()-zmean[it])< padlength*0.5){ + best[0][it]=1; } - } } - // - // Iterative choice of "best path" + // iterative choosing of "best path" // - Int_t label = TMath::Abs(track->GetLabel()); - Int_t bestiter = 0; - - for (Int_t iter = 0; iter < 9; iter++) { - - changes[iter] = 0; - sumz = 0; - sum = 0; - sumdy = 0; - sumdy2 = 0; - sumx = 0; - sumx2 = 0; - sumxy = 0; - mpads = 0; - ngood[iter] = 0; - nbad[iter] = 0; - - // Linear fit - for (Int_t it = 0; it < t1-t0; it++) { - + // + Int_t label = TMath::Abs(track->GetLabel()); + Int_t bestiter=0; + // + for (Int_t iter=0;iter<9;iter++){ + // + changes[iter]= 0; + sumz = 0; sum=0; sumdy=0;sumdy2=0;sumx=0;sumx2=0;sumxy=0;mpads=0; ngood[iter]=0; nbad[iter]=0; + // linear fit + for (Int_t it=0;itGetZ(); - Double_t zafter = cl[best[iter][it]][it]->GetZ(); - for (Int_t itd = it-1; itd >= 0; itd--) { + //calculates pad-row changes + Double_t zbefore= cl[best[iter][it]][it]->GetZ(); + Double_t zafter = cl[best[iter][it]][it]->GetZ(); + for (Int_t itd = it-1; itd>=0;itd--) { if (cl[best[iter][itd]][itd]) { - zbefore = cl[best[iter][itd]][itd]->GetZ(); + zbefore= cl[best[iter][itd]][itd]->GetZ(); break; } } - for (Int_t itd = it+1; itd < t1-t0; itd++) { + for (Int_t itd = it+1; itdGetZ(); + zafter= cl[best[iter][itd]][itd]->GetZ(); break; } } - if ((TMath::Abs(cl[best[iter][it]][it]->GetZ() - zbefore) > 0.1) && - (TMath::Abs(cl[best[iter][it]][it]->GetZ() - zafter) > 0.1)) { - changes[iter]++; - } - - // Distance to reference x - Double_t dx = x[it]-xmean; - sumz += cl[best[iter][it]][it]->GetZ(); + if (TMath::Abs(cl[best[iter][it]][it]->GetZ()-zbefore)>0.1&&TMath::Abs(cl[best[iter][it]][it]->GetZ()-zafter)>0.1) changes[iter]++; + // + Double_t dx = x[it]-xmean; // distance to reference x + sumz += cl[best[iter][it]][it]->GetZ(); sum++; - sumdy += dy[best[iter][it]][it]; - sumdy2 += dy[best[iter][it]][it]*dy[best[iter][it]][it]; - sumx += dx; - sumx2 += dx*dx; + sumdy += dy[best[iter][it]][it]; + sumdy2+= dy[best[iter][it]][it]*dy[best[iter][it]][it]; + sumx += dx; + sumx2 += dx*dx; sumxy += dx*dy[best[iter][it]][it]; - mpads += cl[best[iter][it]][it]->GetNPads(); - if ((cl[best[iter][it]][it]->GetLabel(0) == label) || - (cl[best[iter][it]][it]->GetLabel(1) == label) || - (cl[best[iter][it]][it]->GetLabel(2) == label)) { + mpads += cl[best[iter][it]][it]->GetNPads(); + if (cl[best[iter][it]][it]->GetLabel(0)==label || cl[best[iter][it]][it]->GetLabel(1)==label||cl[best[iter][it]][it]->GetLabel(2)==label){ ngood[iter]++; } - else { + else{ nbad[iter]++; } - } - // - // Calculates line parameters + // calculates line parameters // - Double_t det = sum * sumx2 - sumx * sumx; - angle[iter] = (sum * sumxy - sumx * sumdy) / det; - mean[iter] = (sumx2 * sumdy - sumx * sumxy) / det; - meanz[iter] = sumz / sum; - moffset[iter] = sumdy / sum; - mpads /= sum; // Mean number of pads - - Double_t sigma2 = 0.0; // Normalized residuals - for line fit - Double_t sigma1 = 0.0; // Normalized residuals - constant fit - - for (Int_t it = 0; it < t1-t0; it++) { + Double_t det = sum*sumx2-sumx*sumx; + angle[iter] = (sum*sumxy-sumx*sumdy)/det; + mean[iter] = (sumx2*sumdy-sumx*sumxy)/det; + meanz[iter] = sumz/sum; + moffset[iter] = sumdy/sum; + mpads /= sum; // mean number of pads + // + // + Double_t sigma2 = 0; // normalized residuals - for line fit + Double_t sigma1 = 0; // normalized residuals - constant fit + // + for (Int_t it=0;itGetSigmaY2(); - Double_t weighty = (moffset[iter] / sigmatr2) / sweight; // Weighted mean - Double_t sigmacl = TMath::Sqrt(sigma1*sigma1 + track->GetSigmaY2()); - Double_t mindist = 100000.0; - Int_t ihbest = 0; - for (Int_t ih = 0; ih < 10; ih++) { + // + Double_t sigmatr2 = smoffset[iter]+0.5*tany*tany; //add unisochronity + angular effect contribution + Double_t sweight = 1./sigmatr2+1./track->GetSigmaY2(); + Double_t weighty = (moffset[iter]/sigmatr2)/sweight; // weighted mean + Double_t sigmacl = TMath::Sqrt(sigma1*sigma1+track->GetSigmaY2()); // + Double_t mindist=100000; + Int_t ihbest=0; + for (Int_t ih=0;ih<10;ih++){ if (!cl[ih][it]) break; - Double_t dist2 = (dy[ih][it] - weighty) / sigmacl; - dist2 *= dist2; // Chi2 distance - if (dist2 < mindist) { + Double_t dist2 = (dy[ih][it]-weighty)/sigmacl; + dist2*=dist2; //chi2 distance + if (dist2GetSigmaY2(); - Double_t sa2 = sangle[iter] + track->fCee; - Double_t say = track->fCey; - //Double_t chi20 = mean[bestiter]*mean[bestiter]/sy2+angle[bestiter]*angle[bestiter]/sa2; - //Double_t chi21 = mean[iter]*mean[iter]/sy2+angle[iter]*angle[iter]/sa2; - - Double_t detchi = sy2*sa2 - say*say; - // Inverse value of covariance matrix - Double_t invers[3] = { sa2/detchi, sy2/detchi, -say/detchi}; + Double_t sa2 = sangle[iter] + track->GetSigmaSnp2();//track->fCee; + Double_t say = track->GetSigmaSnpY();//track->fCey; + // Double_t chi20 = mean[bestiter]*mean[bestiter]/sy2+angle[bestiter]*angle[bestiter]/sa2; + // Double_t chi21 = mean[iter]*mean[iter]/sy2+angle[iter]*angle[iter]/sa2; + + Double_t detchi = sy2*sa2-say*say; + Double_t invers[3] = {sa2/detchi, sy2/detchi, -say/detchi}; //inverse value of covariance matrix - Double_t chi20 = mean[bestiter]*mean[bestiter] * invers[0] - + angle[bestiter]*angle[bestiter] * invers[1] - + 2.0 * mean[bestiter]*angle[bestiter] * invers[2]; - Double_t chi21 = mean[iter]*mean[iter] * invers[0] - + angle[iter]*angle[iter] * invers[1] - + 2.0 * mean[iter]*angle[iter] * invers[2]; - tchi2s[iter] = chi21; - - if ((changes[iter] <= changes[bestiter]) && - (chi21 < chi20)) { - bestiter = iter; + Double_t chi20 = mean[bestiter]*mean[bestiter]*invers[0]+angle[bestiter]*angle[bestiter]*invers[1]+ + 2.*mean[bestiter]*angle[bestiter]*invers[2]; + Double_t chi21 = mean[iter]*mean[iter]*invers[0]+angle[iter]*angle[iter]*invers[1]+ + 2*mean[iter]*angle[iter]*invers[2]; + tchi2s[iter] =chi21; + // + if (changes[iter]<=changes[bestiter] && chi2125.) sigma2*=tchi2s[bestiter]/25.; //if (tchi2s[bestiter]>25.) sigma2=1000.; // dont'accept - Double_t vD = AliTRDcalibDB::Instance()->GetVdrift(0,0,0); - Double_t exB = AliTRDcalibDB::Instance()->GetOmegaTau(vD); - Double_t expectederr = sigma2*sigma2 + 0.01*0.01; - if (mpads > 3.5) { - expectederr += (mpads - 3.5) * 0.04; - } - if (changes[bestiter] > 1) { - expectederr += changes[bestiter] * 0.01; - } - expectederr += (0.03 * (tany-exB)*(tany-exB)) * 15.0; - //if (tchi2s[bestiter]>18.) expectederr*= tchi2s[bestiter]/18.; + Double_t exB = AliTRDcalibDB::Instance()->GetOmegaTau(AliTRDcalibDB::Instance()->GetVdrift(0,0,0)); + Double_t expectederr = sigma2*sigma2+0.01*0.01; + if (mpads>3.5) expectederr += (mpads-3.5)*0.04; + if (changes[bestiter]>1) expectederr+= changes[bestiter]*0.01; + expectederr+=(0.03*(tany-exB)*(tany-exB))*15; + // if (tchi2s[bestiter]>18.) expectederr*= tchi2s[bestiter]/18.; //expectederr+=10000; - - for (Int_t it = 0; it < t1-t0; it++) { - + for (Int_t it=0;itSetSigmaY2(expectederr); - if (!cl[best[bestiter][it]][it]->IsUsed()) { - cl[best[bestiter][it]][it]->SetY(cl[best[bestiter][it]][it]->GetY()); - //cl[best[bestiter][it]][it]->Use(); + cl[best[bestiter][it]][it]->SetSigmaY2(expectederr); // set cluster error + if (!cl[best[bestiter][it]][it]->IsUsed()){ + cl[best[bestiter][it]][it]->SetY( cl[best[bestiter][it]][it]->GetY()); + // cl[best[bestiter][it]][it]->Use(); } - - // Time bins with maximal charge - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge ) { + // + // time bins with maximal charge + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge){ maxcharge = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge4) { - if (cl[best[bestiter][it]][it]->GetLocalTimeBin() >= 4) { + + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge4){ + if (cl[best[bestiter][it]][it]->GetLocalTimeBin()>=4){ maxcharge4 = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos4 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos4 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } } - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge5) { - if (cl[best[bestiter][it]][it]->GetLocalTimeBin() >= 5) { + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge5){ + if (cl[best[bestiter][it]][it]->GetLocalTimeBin()>=5){ maxcharge5 = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos5 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos5 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } } - - // Time bins with maximal charge - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge ) { + // + // time bins with maximal charge + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge){ maxcharge = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge4) { - if (cl[best[bestiter][it]][it]->GetLocalTimeBin() >= 4) { + + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge4){ + if (cl[best[bestiter][it]][it]->GetLocalTimeBin()>=4){ maxcharge4 = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos4 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos4 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } } - if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ()) > maxcharge5) { - if (cl[best[bestiter][it]][it]->GetLocalTimeBin() >= 5) { + if (TMath::Abs(cl[best[bestiter][it]][it]->GetQ())> maxcharge5){ + if (cl[best[bestiter][it]][it]->GetLocalTimeBin()>=5){ maxcharge5 = TMath::Abs(cl[best[bestiter][it]][it]->GetQ()); - maxpos5 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); + maxpos5 = cl[best[bestiter][it]][it]->GetLocalTimeBin(); } } - clusters[it+t0] = indexes[best[bestiter][it]][it]; - + //if (cl[best[bestiter][it]][it]->GetLocalTimeBin()>4 && cl[best[bestiter][it]][it]->GetLocalTimeBin()<18) clusters[it+t0] = indexes[best[bestiter][it]][it]; //Test } - // - // Set tracklet parameters + // set tracklet parameters // - Double_t trackleterr2 = smoffset[bestiter] + 0.01*0.01; - if (mpads > 3.5) { - trackleterr2 += (mpads - 3.5) * 0.04; - } - trackleterr2 += changes[bestiter] * 0.01; - trackleterr2 *= TMath::Max(14.0 - nfound,1.0); - trackleterr2 += 0.2 * (tany-exB)*(tany-exB); - - tracklet.Set(xmean - ,track2.GetY()+moffset[bestiter] - ,meanz[bestiter] - ,track2.GetAlpha() - ,trackleterr2); + Double_t trackleterr2 = smoffset[bestiter]+0.01*0.01; + if (mpads>3.5) trackleterr2 += (mpads-3.5)*0.04; + trackleterr2+= changes[bestiter]*0.01; + trackleterr2*= TMath::Max(14.-nfound,1.); + trackleterr2+= 0.2*(tany-exB)*(tany-exB); + // + tracklet.Set(xmean, track2.GetY()+moffset[bestiter], meanz[bestiter], track2.GetAlpha(), trackleterr2); //set tracklet parameters tracklet.SetTilt(h01); tracklet.SetP0(mean[bestiter]); tracklet.SetP1(angle[bestiter]); @@ -3729,23 +3364,21 @@ Int_t AliTRDtracker::FindClusters(Int_t sector, Int_t t0, Int_t t1 tracklet.SetSigma2(expectederr); tracklet.SetChi2(tchi2s[bestiter]); tracklet.SetMaxPos(maxpos,maxpos4,maxpos5); - track->fTracklets[plane] = tracklet; - track->fNWrong += nbad[0]; - + track->fTracklets[plane] = tracklet; + track->fNWrong+=nbad[0]; // // Debuging part // TClonesArray array0("AliTRDcluster"); TClonesArray array1("AliTRDcluster"); - array0.ExpandCreateFast(t1 - t0 + 1); - array1.ExpandCreateFast(t1 - t0 + 1); - TTreeSRedirector &cstream = *fDebugStreamer; + array0.ExpandCreateFast(t1-t0+1); + array1.ExpandCreateFast(t1-t0+1); + TTreeSRedirector& cstream = *fDebugStreamer; AliTRDcluster dummy; Double_t dy0[100]; Double_t dyb[100]; - for (Int_t it = 0; it < t1-t0; it++) { - + for (Int_t it=0;it 0) { - cstream << "tracklet" - << "track.=" << track // Track parameters - << "tany=" << tany // Tangent of the local track angle - << "xmean=" << xmean // xmean - reference x of tracklet - << "tilt=" << h01 // Tilt angle - << "nall=" << nall // Number of foundable clusters - << "nfound=" << nfound // Number of found clusters - << "clfound=" << clfound // Total number of found clusters in road - << "mpads=" << mpads // Mean number of pads per cluster - << "plane=" << plane // Plane number - << "detector=" << detector // Detector number - << "road=" << road // The width of the used road - << "graph0.=" << &graph0 // x - y = dy for closest cluster - << "graph1.=" << &graph1 // x - y = dy for second closest cluster - << "graphy.=" << &graphy // y position of the track - << "graphz.=" << &graphz // z position of the track - //<< "fCl.=" << &array0 // Closest cluster - //<< "fCl2.=" << &array1 // Second closest cluster - << "maxpos=" << maxpos // Maximal charge postion - << "maxcharge=" << maxcharge // Maximal charge - << "maxpos4=" << maxpos4 // Maximal charge postion - after bin 4 - << "maxcharge4=" << maxcharge4 // Maximal charge - after bin 4 - << "maxpos5=" << maxpos5 // Maximal charge postion - after bin 5 - << "maxcharge5=" << maxcharge5 // Maximal charge - after bin 5 - << "bestiter=" << bestiter // Best iteration number - << "tracklet.=" << &tracklet // Corrspond to the best iteration - << "tchi20=" << tchi2s[0] // Chi2 of cluster in the 0 iteration - << "tchi2b=" << tchi2s[bestiter] // Chi2 of cluster in the best iteration - << "sigmas0=" << sigmas[0] // Residuals sigma - << "sigmasb=" << sigmas[bestiter] // Residulas sigma - << "ngood0=" << ngood[0] // Number of good clusters in 0 iteration - << "nbad0=" << nbad[0] // Number of bad clusters in 0 iteration - << "ngoodb=" << ngood[bestiter] // Number of bad clusters in best iteration - << "nbadb=" << nbad[bestiter] // Number of good clusters in best iteration - << "changes0=" << changes[0] // Changes of pardrows in iteration number 0 - << "changesb=" << changes[bestiter] // Changes of pardrows in best iteration - << "moffset0=" << moffset[0] // Offset fixing angle in iter=0 - << "smoffset0=" << smoffset[0] // Sigma of offset fixing angle in iter=0 - << "moffsetb=" << moffset[bestiter] // Offset fixing angle in iter=best - << "smoffsetb=" << smoffset[bestiter] // Sigma of offset fixing angle in iter=best - << "mean0=" << mean[0] // Mean dy in iter=0; - << "smean0=" << smean[0] // Sigma of mean dy in iter=0 - << "meanb=" << mean[bestiter] // Mean dy in iter=best - << "smeanb=" << smean[bestiter] // Sigma of mean dy in iter=best - << "angle0=" << angle[0] // Angle deviation in the iteration number 0 - << "sangle0=" << sangle[0] // Sigma of angular deviation in iter=0 - << "angleb=" << angle[bestiter] // Angle deviation in the best iteration - << "sangleb=" << sangle[bestiter] // Sigma of angle deviation in the best iteration - << "expectederr=" << expectederr // Expected error of cluster position - << "\n"; - } - + // + // + if (AliTRDReconstructor::StreamLevel()>0) + cstream<<"tracklet"<< + "track.="< 0; itime--) { - if (seeds[ilayer].fIndexes[itime] > 0) { + c[0] = 0.2; + c[1] = 0 ; c[2] = 2; + c[3] = 0 ; c[4] = 0; c[5] = 0.02; + c[6] = 0 ; c[7] = 0; c[8] = 0; c[9] = 0.1; + c[10] = 0 ; c[11] = 0; c[12] = 0; c[13] = 0.0; c[14] = params[5]*params[5]*0.01; + // + Int_t index =0; + AliTRDcluster *cl =0; + for (Int_t ilayer=0;ilayer<6;ilayer++){ + if (seeds[ilayer].IsOK()){ + for (Int_t itime=22;itime>0;itime--){ + if (seeds[ilayer].fIndexes[itime]>0){ index = seeds[ilayer].fIndexes[itime]; - cl = seeds[ilayer].fClusters[itime]; + cl = seeds[ilayer].fClusters[itime]; break; } } } - if (index > 0) break; + if (index>0) break; } - if (cl == 0) return 0; - - AliTRDtrack *track = new AliTRDtrack(cl - ,index - ,¶ms[1] - ,c - ,params[0] - ,params[6]*alpha+shift); - track->PropagateTo(params[0]-5.0); + if (cl==0) return 0; + AliTRDtrack * track = new AliTRDtrack(cl,index,¶ms[1],c, params[0],params[6]*alpha+shift); + track->PropagateTo(params[0]-5.); track->ResetCovariance(1); - - Int_t rc = FollowBackProlongation(*track); - if (rc < 30) { + // + Int_t rc=FollowBackProlongation(*track); + if (rc<30) { delete track; - track = 0; - } - else { + track =0; + }else{ track->CookdEdx(); CookdEdxTimBin(*track); - CookLabel(track,0.9); + CookLabel(track, 0.9); } return track; -- 2.43.0