diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h b/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h index b32f54e8e58c51aa05d702f1b85629f2ea980015..dd484b54b2a0e53092a15a5cb029bbc36a5dd26c 100755 --- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h +++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/TrkVKalVrtCore/CommonPars.h @@ -21,7 +21,8 @@ #define NTrkM 300 #define vkalMagCnvCst 0.29979246 -#define vkalInternalStepLimit 200. -#define vkalAllowedPtChange 7. +#define vkalInternalStepLimit 20. +#define vkalAllowedPtChange 3. +#define vkalShiftToTrigExtrapolation 20. #endif diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx index 4fab96fcc89fd947b8f0d24f7dd1b78acb1d8e6f..c42d966811d0ad999b555f1cb8f0d15eeabaf2fa 100755 --- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx +++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/CFit.cxx @@ -276,7 +276,7 @@ long int fitVertex(VKVertex * vk, long int iflag) /* Also set up localBMAG in dXYZST if nonuniform field is used */ /* ---------------------------------------------------------------- */ extrapolationDone=false; - if( vShift>20. || it==1 || forcedExtrapolation){ + if( vShift>vkalShiftToTrigExtrapolation || it==1 || forcedExtrapolation){ extrapolationDone=true; forcedExtrapolation=false; double oldX=0., oldY=0., oldZ=0.; @@ -365,7 +365,7 @@ long int fitVertex(VKVertex * vk, long int iflag) double ddz=savedExtrapVertices[it-1].Z-savedExtrapVertices[it-2].Z; double ddstep=sqrt(ddx*ddx+ddy*ddy+ddz*ddz); //std::cout<<" Huge degradation due to extrapolation. Limit step! it="<<it<<" step="<<ddstep<<'\n'; - if( ddstep > 20.) { + if( ddstep > 10.*vkalShiftToTrigExtrapolation) { dxyzst[0]=(savedExtrapVertices[it-1].X + 2.*savedExtrapVertices[it-2].X)/3.; dxyzst[1]=(savedExtrapVertices[it-1].Y + 2.*savedExtrapVertices[it-2].Y)/3.; dxyzst[2]=(savedExtrapVertices[it-1].Z + 2.*savedExtrapVertices[it-2].Z)/3.; @@ -375,7 +375,7 @@ long int fitVertex(VKVertex * vk, long int iflag) } chi21s = vk->Chi2; chi22s = chi21s * 1.01 + 10.; //for safety - if ( vShift < 20.) { // REASONABLE DISPLACEMENT (<14mm) - RECALCULATE + if ( vShift < 10.*vkalShiftToTrigExtrapolation) { // REASONABLE DISPLACEMENT - RECALCULATE /* ROBUSTIFICATION */ if (forcft_1.irob != 0) {robtest(vk, 1);} // ROBUSTIFICATION new data structure //Reset mag.field @@ -422,12 +422,12 @@ long int fitVertex(VKVertex * vk, long int iflag) //std::cout<<"-----------------------------------------------"<<'\n'; /* Test of convergence */ chi2df = fabs(chi21s - chi22s); - //std::cout<<"Convergence="<< chi2df <<" cnst="<<cnstRemnants<<'\n'; /*---------------------Normal convergence--------------------*/ double PrecLimit = min(chi22s*1.e-4, forcft_1.IterationPrecision); + //std::cout<<"Convergence="<< chi2df <<"<"<<PrecLimit<<" cnst="<<cnstRemnants<<"<"<<ConstraintAccuracy<<'\n'; if ((chi2df < PrecLimit) && (vShift < 0.001) && it>1 && (cnstRemnants<ConstraintAccuracy)){ double dstFromExtrapPnt=sqrt(vk->fitV[0]*vk->fitV[0] + vk->fitV[1]*vk->fitV[1]+ vk->fitV[2]*vk->fitV[2]); - if( dstFromExtrapPnt>2. && it < forcft_1.IterationNumber){ + if( dstFromExtrapPnt>vkalShiftToTrigExtrapolation/2. && it < forcft_1.IterationNumber-15){ forcedExtrapolation=true; continue; // Make another extrapolation exactly to found vertex position } diff --git a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx index a8b3f783305be30e0a9cd6c3b20e23a00d0b1aa2..1e2e350675de1c580f67e0a89270436a3d31700b 100755 --- a/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx +++ b/Tracking/TrkVertexFitter/TrkVKalVrtCore/src/VtCFit.cxx @@ -688,8 +688,14 @@ extern DerivT derivt_; for (it = 0; it < NTRK; ++it) { //Check if curvature sign is changed or change in Pt is too big if(vk->TrackList[it]->Id >= 0){ - double Ratio=vk->TrackList[it]->fitP[2]/vk->TrackList[it]->iniP[2]; if(fabs(Ratio)<1.)Ratio=1./Ratio; - if(Ratio<0. || Ratio > vkalAllowedPtChange ) return -21; + double Ratio=vk->TrackList[it]->fitP[2]/vk->TrackList[it]->Perig[4]; if(fabs(Ratio)<1.)Ratio=1./Ratio; + if(Ratio<0. || Ratio > vkalAllowedPtChange ){ + if(fabs(vk->TrackList[it]->fitP[2])<fabs(vk->TrackList[it]->Perig[4]) || Ratio<0 ){ + vk->TrackList[it]->fitP[2]=vk->TrackList[it]->Perig[4]/vkalAllowedPtChange; + }else{ + vk->TrackList[it]->fitP[2]=vk->TrackList[it]->Perig[4]*vkalAllowedPtChange; + } + } } } @@ -779,6 +785,8 @@ extern DerivT derivt_; alf = alfLowLim; PostFitIteration=4; //Something is wrong. Don't make second optimisation } + if(NCNST && alf>vkalInternalStepLimit/totalShift) + { alf=vkalInternalStepLimit/totalShift; PostFitIteration=4; icadd=2; limitationMade=true; } } //Having 3 points (0,-0.02,0.02) find a pabolic minimum