X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=STEER%2FAliTrackFitterRieman.cxx;h=3406252e1b7d728718ff3badbd03dc1d7a641208;hb=951a6a05a7c1ca1341aca9074dfc920d1313c97f;hp=583cd06446928bb9bc5411ef7801ea888f763ad6;hpb=75e3794b7dc1d57df57450c120a9f8b50eef6121;p=u%2Fmrichter%2FAliRoot.git diff --git a/STEER/AliTrackFitterRieman.cxx b/STEER/AliTrackFitterRieman.cxx index 583cd064469..3406252e1b7 100644 --- a/STEER/AliTrackFitterRieman.cxx +++ b/STEER/AliTrackFitterRieman.cxx @@ -29,25 +29,32 @@ // ////////////////////////////////////////////////////////////////////////////// -#include "TMatrixDSym.h" -#include "TMatrixD.h" -#include "TArrayI.h" -#include "AliTrackFitterRieman.h" +#include +#include +#include +#include +#include +#include +#include + #include "AliLog.h" -#include "TTreeStream.h" -#include "AliRieman.h" #include "AliLog.h" +#include "AliRieman.h" +#include "AliTrackFitterRieman.h" ClassImp(AliTrackFitterRieman) AliTrackFitterRieman::AliTrackFitterRieman(): AliTrackFitter(), + fBCorrection(kFALSE), fAlpha(0.), fNUsed(0), fConv(kFALSE), fMaxDelta(3), fRieman(new AliRieman(10000)), // allocate rieman + fMinPointRadius(2.), + fMaxPointRadius(500.), fDebugStream(new TTreeSRedirector("RiemanAlignDebug.root")) { // @@ -58,11 +65,14 @@ AliTrackFitterRieman::AliTrackFitterRieman(): AliTrackFitterRieman::AliTrackFitterRieman(AliTrackPointArray *array, Bool_t owner): AliTrackFitter(array,owner), + fBCorrection(kFALSE), fAlpha(0.), fNUsed(0), fConv(kFALSE), fMaxDelta(3), fRieman(new AliRieman(10000)), //allocate rieman + fMinPointRadius(2.), + fMaxPointRadius(500.), fDebugStream(0) { // @@ -73,11 +83,14 @@ AliTrackFitterRieman::AliTrackFitterRieman(AliTrackPointArray *array, Bool_t own AliTrackFitterRieman::AliTrackFitterRieman(const AliTrackFitterRieman &rieman): AliTrackFitter(rieman), + fBCorrection(rieman.fBCorrection), fAlpha(rieman.fAlpha), fNUsed(rieman.fNUsed), fConv(rieman.fConv), fMaxDelta(rieman.fMaxDelta), fRieman(new AliRieman(*(rieman.fRieman))), + fMinPointRadius(rieman.fMinPointRadius), + fMaxPointRadius(rieman.fMaxPointRadius), fDebugStream(0) { // @@ -95,11 +108,14 @@ AliTrackFitterRieman &AliTrackFitterRieman::operator =(const AliTrackFitterRiema if(this==&rieman) return *this; ((AliTrackFitter *)this)->operator=(rieman); + fBCorrection = rieman.fBCorrection; fAlpha = rieman.fAlpha; fNUsed = rieman.fNUsed; fConv = rieman.fConv; fMaxDelta = rieman.fMaxDelta; fRieman = new AliRieman(*(rieman.fRieman)); + fMinPointRadius = rieman.fMinPointRadius; + fMaxPointRadius = rieman.fMaxPointRadius; fDebugStream = 0; if (AliLog::GetDebugLevel("","AliTrackFitterRieman")) fDebugStream = new TTreeSRedirector("RiemanAlignDebug.root"); return *this; @@ -127,8 +143,8 @@ void AliTrackFitterRieman::Reset() } Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit, - AliAlignObj::ELayerID layerRangeMin, - AliAlignObj::ELayerID layerRangeMax) + AliGeomManager::ELayerID layerRangeMin, + AliGeomManager::ELayerID layerRangeMax) { // Fit the track points. The method takes as an input // the set of id's (volids) of the volumes in which @@ -146,10 +162,34 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit, // at the space-point reference plane. The reference plane is // found using the covariance matrix of the point // (assuming sigma(x)=0 at the reference coordinate system. + Int_t debugLevel = AliLog::GetDebugLevel("","AliTrackFitterRieman"); + + // Float_t debugRatio = 1./(1.+debugLevel); + Float_t debugRatio = debugLevel? 1.0/debugLevel : 1.0; - Reset(); Int_t npoints = fPoints->GetNPoints(); - if (fPoints && AliLog::GetDebugLevel("","AliTrackFitterRieman")>1){ + if ( npointsGetVolumeID()[ipoint])) + countPoint++; + if (volIdsFit != 0x0) { + if (FindVolId(volIdsFit,fPoints->GetVolumeID()[ipoint])) + countFit++; + } + } + if (countPoint==0) return kFALSE; + if ((countFit1&& gRandom->Rndm()GetSize(); Int_t nVolFit = volIdsFit->GetSize(); Int_t volId = volIds->At(0); @@ -161,7 +201,6 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit, "fPoints.="< AliAlignObj::LayerToVolUID(layerRangeMax, - AliAlignObj::LayerSize(layerRangeMax))) continue; + if (iVolId < AliGeomManager::LayerToVolUID(layerRangeMin,0) || + iVolId > AliGeomManager::LayerToVolUID(layerRangeMax, + AliGeomManager::LayerSize(layerRangeMax))) continue; } if (!isAlphaCalc) { fAlpha = p.GetAngle(); isAlphaCalc = kTRUE; } plocal = p.Rotate(fAlpha); - if (TMath::Abs(plocal.GetX())>500 || TMath::Abs(plocal.GetX())<2 || plocal.GetCov()[3]<=0 ||plocal.GetCov()[5]<=0 ){ + if (TMath::Abs(plocal.GetX())>fMaxPointRadius || TMath::Abs(plocal.GetX())0){ + if (AliLog::GetDebugLevel("","AliTrackFitterRieman")>0 && gRandom->Rndm()MakeResiduals(); - AliTrackPoint p2local; for (Int_t ipoint = 0; ipoint < npVolId; ipoint++){ - Int_t index = pindex[ipoint]; - fPoints->GetPoint(p,index); - if (GetPCA(p,p2)) { - plocal = p.Rotate(fAlpha); - // plocal.Rotate(fAlpha); - Float_t xyz[3],xyz2[3]; - p2local = plocal; - plocal.GetXYZ(xyz); - xyz2[0] = xyz[0]; - xyz2[1] = GetYat(xyz[0]); - xyz2[2] = GetZat(xyz[0]); - p2local.SetXYZ(xyz2); - lPVolId->AddPoint(ipoint,&plocal); - lPTrack->AddPoint(ipoint,&p2local); - } + AliTrackPoint p0, p0local; + AliTrackPoint pFit, pFitlocal, pFitLocalE; + fPVolId->GetPoint(p0,ipoint); + Float_t lAngle = p0.GetAngle(); + p0local= p0.MasterToLocal(); + fPTrack->GetPoint(pFit,ipoint); + pFitlocal= pFit.Rotate(lAngle); + // + Float_t xyz[3], cov[6]; + xyz[0] = pFitlocal.GetX(); + xyz[1] = pFitlocal.GetY(); + xyz[2] = pFitlocal.GetZ(); + for (Int_t icov=0; icov<6; icov++) cov[icov]=0; + cov[3] = GetErrY2at(xyz[0]); + cov[5] = GetErrZ2at(xyz[0]); + pFitLocalE.SetXYZ(xyz,cov); + // + lPVolId->AddPoint(ipoint,&p0local); + lPTrack->AddPoint(ipoint,&pFitlocal); + lPTrackE->AddPoint(ipoint,&pFitLocalE); } // // debug info @@ -289,18 +333,24 @@ Bool_t AliTrackFitterRieman::Fit(const TArrayI *volIds,const TArrayI *volIdsFit, Int_t nVolFit = volIdsFit->GetSize(); Int_t volId = volIds->At(0); Int_t modId =0; - Int_t layer = AliAlignObj::VolUIDToLayer(volId,modId); + Int_t layer = AliGeomManager::VolUIDToLayer(volId,modId); + Int_t volIdFit = volIdsFit->At(0); + Int_t modIdFit =0; + Int_t layerFit = AliGeomManager::VolUIDToLayer(volIdFit,modIdFit); (*fDebugStream)<<"Fit"<< "VolId="<GetN(); fConv = kTRUE; } + // + // + // + TLinearFitter fitY(3,"pol2"); + TLinearFitter fitZ(3,"pol2"); + for (Int_t ip=0; ipGetN();ip++){ + Double_t x = fRieman->GetX()[ip]; + fitY.AddPoint(&x,fRieman->GetY()[ip]-fRieman->GetYat(x),1); + fitZ.AddPoint(&x,fRieman->GetZ()[ip]-fRieman->GetZat(x),1); + } + fitY.Eval(); + fitZ.Eval(); + for (Int_t iparam=0; iparam<3; iparam++){ + fCorrY[iparam]=fitY.GetParameter(iparam); + fCorrZ[iparam]=fitZ.GetParameter(iparam); + } + fCorrY[3]=fitY.GetChisquare()/Float_t(fRieman->GetN()-3); + fCorrZ[3]=fitZ.GetChisquare()/Float_t(fRieman->GetN()-3); + + return kTRUE; } + + //_____________________________________________________________________________ Bool_t AliTrackFitterRieman::GetPCA(const AliTrackPoint &p, AliTrackPoint &p2) const { @@ -400,6 +472,12 @@ Bool_t AliTrackFitterRieman::GetPCA(const AliTrackPoint &p, AliTrackPoint &p2) c cov[3] = sigmax*dydx*dydx; cov[4] = sigmax*dydx*dzdx; cov[5] = sigmax*dzdx*dzdx; + Double_t sigmay2 = GetErrY2at(x2); + Double_t sigmaz2 = GetErrZ2at(x2); + cov[3] += sigmay2; + cov[5] += sigmaz2; + + Float_t newcov[6]; newcov[0] = cov[0]*cos*cos- 2*cov[1]*sin*cos+ @@ -416,13 +494,79 @@ Bool_t AliTrackFitterRieman::GetPCA(const AliTrackPoint &p, AliTrackPoint &p2) c newcov[5] = cov[5]; p2.SetXYZ(xsecond,ysecond,zsecond,newcov); - if (AliLog::GetDebugLevel("","AliTrackFitterRieman")>1){ + Int_t debugLevel = AliLog::GetDebugLevel("","AliTrackFitterRieman"); + Float_t debugRatio = 1./(1.+debugLevel); + if (AliLog::GetDebugLevel("","AliTrackFitterRieman")>0 && gRandom->Rndm()GetYat(x)+correction; +} + +Double_t AliTrackFitterRieman::GetZat(Double_t x) const { + // + // get z position at given point + // + Double_t correction=0; + if (fBCorrection){ // systematic effect correction + correction = fCorrZ[0]+fCorrZ[1]*x +fCorrZ[2]*x*x; + } + return fRieman->GetZat(x)+correction; +} + +Double_t AliTrackFitterRieman::GetErrY2at(Double_t x) const { + // + // get estimate of extrapolation error + // + Double_t error = fRieman->GetErrY(x); + Double_t correction=0; + if (fBCorrection){ // everestimate error due systematic effect + error *=fCorrY[3]; + correction = fCorrY[0]+fCorrY[1]*x +fCorrY[2]*x*x; + correction *=correction; + } + return TMath::Sqrt(error+correction); +} + +Double_t AliTrackFitterRieman::GetErrZ2at(Double_t x) const { + // + // get estimate of extrapolation error + // + Double_t error = fRieman->GetErrZ(x)*fCorrZ[3]; + Double_t correction=0; + if (fBCorrection){ + error *= fCorrZ[3]; + correction = fCorrZ[0]+fCorrZ[1]*x +fCorrZ[2]*x*x; + correction*= correction; + } + return TMath::Sqrt(error+correction); +} + +void AliTrackFitterRieman::SetParam(Int_t i, Double_t par) { + if (i<0 || i>5) return; + fParams[i]=par; + fRieman->GetParam()[i]=par; +}