X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCTracklet.cxx;h=b8fc5d5fa21cb0bb11cafd14eb78ad71de5c281a;hb=12f69174e52679cd1fcdd21bfb98d7250af50883;hp=51a2b059ff7f5213cdeb2524ef893d962b27034a;hpb=967eae0d923f4e1e3ea85b4ffc02252733e0e9e2;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCTracklet.cxx b/TPC/AliTPCTracklet.cxx index 51a2b059ff7..b8fc5d5fa21 100755 --- a/TPC/AliTPCTracklet.cxx +++ b/TPC/AliTPCTracklet.cxx @@ -182,82 +182,121 @@ AliTPCTracklet::~AliTPCTracklet() { delete fPrimary; } -void AliTPCTracklet::FitKalman(const AliTPCseed *track,Int_t sector) { + + + + +void AliTPCTracklet::FitKalman(const AliTPCseed *seed,Int_t sector) { // // Fit using Kalman filter // - AliTPCseed *t=new AliTPCseed(*track); - if (!t->Rotate(TMath::DegToRad()*(sector%18*20.+10.)-t->GetAlpha())) { - delete t; + AliTPCseed *track=new AliTPCseed(*seed); + if (!track->Rotate(TMath::DegToRad()*(sector%18*20.+10.)-track->GetAlpha())) { + delete track; return; } // fit from inner to outer row - AliTPCseed *outerSeed=new AliTPCseed(*t); - Int_t n=0; - for (Int_t i=0;i<160;++i) { - AliTPCclusterMI *c=t->GetClusterPointer(i); - if (c && RejectCluster(c,outerSeed)) continue; - if (c&&c->GetDetector()==sector) { - if (n==1) { - outerSeed->ResetCovariance(100.); - } - ++n; - Double_t r[3]={c->GetX(),c->GetY(),c->GetZ()}; - Double_t cov[3]={0.1,0.,0.1}; //TODO: correct error parametrisation - if (!outerSeed->PropagateTo(r[0]) || - !static_cast(outerSeed)->Update(&r[1],cov)) { - delete outerSeed; - outerSeed=0; - break; - } + Double_t covar[15]; + for (Int_t i=0;i<15;i++) covar[i]=0; + covar[0]=1.*1.; + covar[2]=1.*1.; + covar[5]=1.*1./(64.*64.); + covar[9]=1.*1./(64.*64.); + covar[14]=0; // keep pt + Float_t xmin=1000, xmax=-10000; + Int_t imin=158, imax=0; + for (Int_t i=0;i<160;i++) { + AliTPCclusterMI *c=track->GetClusterPointer(i); + if (!c) continue; + if (c->GetDetector()!=sector) continue; + if (c->GetX()GetX(); + if (c->GetX()>xmax) xmax=c->GetX(); + if (iimax) imax=i; + } + if(imax-imin<10) { + delete track; + return; + } + + for (Float_t x=track->GetX(); xPropagateTo(x); + track->AddCovariance(covar); + // + AliExternalTrackParam paramIn; + AliExternalTrackParam paramOut; + Bool_t isOK=kTRUE; + // + // + // + for (Int_t i=imin; i<=imax; i++){ + AliTPCclusterMI *c=track->GetClusterPointer(i); + if (!c) continue; + Double_t r[3]={c->GetX(),c->GetY(),c->GetZ()}; + Double_t cov[3]={0.01,0.,0.01}; //TODO: correct error parametrisation + AliTPCseed::GetError(c, track,cov[0],cov[2]); + cov[0]*=cov[0]; + cov[2]*=cov[2]; + if (!track->PropagateTo(r[0])) { + isOK=kFALSE; + break; } + if (RejectCluster(c,track)) continue; + if ( !((static_cast(track)->Update(&r[1],cov)))) isOK=kFALSE; } - if (outerSeed) - fOuter=new AliExternalTrackParam(*outerSeed); - delete outerSeed; - // fit from outer to inner rows - AliTPCseed *innerSeed=new AliTPCseed(*t); - n=0; - for (Int_t i=159;i>=0;--i) { - AliTPCclusterMI *c=t->GetClusterPointer(i); - if (c && RejectCluster(c, innerSeed)) continue; - if (c&&c->GetDetector()==sector) { - if (n==1) { - innerSeed->ResetCovariance(100.); - } - ++n; - Double_t r[3]={c->GetX(),c->GetY(),c->GetZ()}; - Double_t cov[3]={0.1,0.,0.1}; - if (!innerSeed->PropagateTo(r[0]) || - !static_cast(innerSeed)->Update(&r[1],cov)) { - delete innerSeed; - innerSeed=0; - break; - } + if (!isOK) { delete track; return;} + track->AddCovariance(covar); + // + // + // + for (Int_t i=imax; i>=imin; i--){ + AliTPCclusterMI *c=track->GetClusterPointer(i); + if (!c) continue; + Double_t r[3]={c->GetX(),c->GetY(),c->GetZ()}; + Double_t cov[3]={0.01,0.,0.01}; + AliTPCseed::GetError(c, track,cov[0],cov[2]); + cov[0]*=cov[0]; + cov[2]*=cov[2]; + if (!track->PropagateTo(r[0])) { + isOK=kFALSE; + break; } + if (RejectCluster(c,track)) continue; + if ( !((static_cast(track)->Update(&r[1],cov)))) isOK=kFALSE; } - if (innerSeed) - fInner=new AliExternalTrackParam(*innerSeed); - // propagate to the primary vertex - if (innerSeed) { - AliTPCseed *primarySeed=new AliTPCseed(*innerSeed); - Double_t pos[]={0.,0.,0.}; - Double_t sigma[]={.1,.1,.1}; //TODO: is this correct? - AliESDVertex vertex(pos,sigma); - if (primarySeed->PropagateToVertex(&vertex)) - fPrimary=new AliExternalTrackParam(*primarySeed); - delete primarySeed; - // for better comparison one does not want to have alpha changed... - if (fPrimary) if (!fPrimary->Rotate(fInner->GetAlpha())) { - delete fPrimary; - fPrimary=0; + if (!isOK) { delete track; return;} + paramIn = *track; + track->AddCovariance(covar); + // + // + for (Int_t i=imin; i<=imax; i++){ + AliTPCclusterMI *c=track->GetClusterPointer(i); + if (!c) continue; + Double_t r[3]={c->GetX(),c->GetY(),c->GetZ()}; + Double_t cov[3]={0.01,0.,0.01}; + AliTPCseed::GetError(c, track,cov[0],cov[2]); + cov[0]*=cov[0]; + cov[2]*=cov[2]; + if (!track->PropagateTo(r[0])) { + isOK=kFALSE; + break; } + if (RejectCluster(c,track)) continue; + if ( !((static_cast(track)->Update(&r[1],cov)))) isOK=kFALSE; } - delete innerSeed; - - delete t; + if (!isOK) { delete track; return;} + paramOut=*track; + // + // + // + fOuter=new AliExternalTrackParam(paramOut); + fInner=new AliExternalTrackParam(paramIn); + // + delete track; } + + + void AliTPCTracklet::FitLinear(const AliTPCseed *track,Int_t sector, TrackType type) { TLinearFitter fy(1); @@ -467,7 +506,7 @@ Bool_t AliTPCTracklet::Riemann2Helix(Double_t *a,Double_t */*ca*/, Double_t R=.5*TMath::Sqrt(4.*a[0]+a[1]*a[1]+a[2]*a[2]); Double_t dx=x0-xr0; if (dx*dx>=R*R) return kFALSE; - Double_t dy=TMath::Sqrt(R*R-dx*dx); //sign!! + Double_t dy=TMath::Sqrt((R-dx)*(R+dx)); //sign!! if (TMath::Abs(yr0+dy)>TMath::Abs(yr0-dy)) dy=-dy; Double_t y0=yr0+dy; @@ -569,19 +608,25 @@ Bool_t AliTPCTracklet::PropagateToMeanX(const AliTPCTracklet &t1, t2m=new AliExternalTrackParam(*t2.GetOuter()); } Double_t mx=.5*(t1m->GetX()+t2m->GetX()); - Double_t b1,b2; + //Double_t b1,b2; Double_t xyz[3]; t1m->GetXYZ(xyz); - b1=GetBz(xyz); + //b1=GetBz(xyz); + Double_t b1[3]; AliTracker::GetBxByBz(xyz,b1); t2m->GetXYZ(xyz); - b2=GetBz(xyz); + //b2=GetBz(xyz); + Double_t b2[3]; AliTracker::GetBxByBz(xyz,b2); if (t1m->Rotate(t2m->GetAlpha()) - && t1m->PropagateTo(mx,b1) - && t2m->PropagateTo(mx,b2)); + //&& t1m->PropagateTo(mx,b1) + //&& t2m->PropagateTo(mx,b2)); + && t1m->PropagateToBxByBz(mx,b1) + && t2m->PropagateToBxByBz(mx,b2)); else if (t2m->Rotate(t1m->GetAlpha()) - && t1m->PropagateTo(mx,b1) - && t2m->PropagateTo(mx,b2)); + //&& t1m->PropagateTo(mx,b1) + //&& t2m->PropagateTo(mx,b2)); + && t1m->PropagateToBxByBz(mx,b1) + && t2m->PropagateToBxByBz(mx,b2)); else { delete t1m; delete t2m; @@ -594,11 +639,9 @@ Bool_t AliTPCTracklet::PropagateToMeanX(const AliTPCTracklet &t1, return t1m&&t2m; } -double AliTPCTracklet::GetBz(Double_t *xyz) { - if (AliTracker::UniformField()) - return AliTracker::GetBz(); - else - return AliTracker::GetBz(xyz); +double AliTPCTracklet::GetBz(Double_t *xyz) +{ + return AliTracker::GetBz(xyz); } void AliTPCTracklet::RandomND(Int_t ndim,const Double_t *p,const Double_t *c,