Skip to content
Snippets Groups Projects
Commit ee934536 authored by Andre Gunther's avatar Andre Gunther :island:
Browse files

PrimaryVertices abort fit when invChol fails

parent 8915f061
No related branches found
No related tags found
1 merge request!4468MatVec invChol check for failure
Pipeline #7172860 passed
......@@ -96,7 +96,7 @@ namespace LHCb::Event::PV {
pv.setHalfDChi2DX( LinAlg::initialize_with_zeros<LHCb::LinAlg::Vec<double, 3>>() );
pv.setCovMatrix( convertToSMatrix<double>( cov ) );
pv.setSumOfWeights( accumulator.sumw );
bool converged = std::abs( delta( 2 ) ) < maxDeltaZConverged && abs( deltachi2 ) < maxDeltaChi2Converged;
bool converged = std::abs( delta.z() ) < maxDeltaZConverged && abs( deltachi2 ) < maxDeltaChi2Converged;
return converged ? PVFitStatus::Converged : PVFitStatus::NotConverged;
};
......@@ -258,24 +258,26 @@ namespace LHCb::Event::PV {
auto status = PVFitStatus::NotConverged;
auto zcache = pv.position().z();
unsigned iter{0};
for ( ; iter < fitconfig.maxFitIter && status == PVFitStatus::NotConverged; ++iter ) {
for ( ;
iter < fitconfig.maxFitIter && ( status == PVFitStatus::NotConverged || iter < fitconfig.numAnnealingSteps );
++iter ) {
// dumb 1-step annealing scheme. don't use for refits.
const auto chi2maxmultiplier = std::max( int( fitconfig.numAnnealingSteps ) - int( iter ) + 1, 1 );
const auto thischi2max = chi2maxmultiplier * fitconfig.maxDeltaChi2;
// Update the 2nd derivative cache only when vtx moved significantly, or on the first iteration
const auto maxDeltaZForCache = 0.2;
const auto vtxz = pv.position().z();
if ( iter == 0 || std::abs( vtxz - zcache ) > maxDeltaZForCache ) {
status = fitSingleStep<true>( pv, pvtracks, thischi2max, fitconfig.maxDeltaZConverged,
fitconfig.maxDeltaChi2Converged );
zcache = vtxz;
} else {
status = fitSingleStep<false>( pv, pvtracks, thischi2max, fitconfig.maxDeltaZConverged,
fitconfig.maxDeltaChi2Converged );
constexpr auto maxDeltaZForCache = 0.2 * Gaudi::Units::mm;
const auto vtxz = pv.position().z();
const auto updateWeightMatrix = ( iter == 0 ) || ( std::abs( vtxz - zcache ) > maxDeltaZForCache );
status = updateWeightMatrix ? fitSingleStep<true>( pv, pvtracks, thischi2max, fitconfig.maxDeltaZConverged,
fitconfig.maxDeltaChi2Converged )
: fitSingleStep<false>( pv, pvtracks, thischi2max, fitconfig.maxDeltaZConverged,
fitconfig.maxDeltaChi2Converged );
if ( status == PVFitStatus::Failed ) {
pv.setStatus( status );
return status;
}
// make sure to continue if still annealing
if ( status == PVFitStatus::Converged && iter < fitconfig.numAnnealingSteps ) status = PVFitStatus::NotConverged;
if ( updateWeightMatrix ) zcache = vtxz;
}
// To make sure that we can read back the same vertices from the persistency without storing everything,
// we update once more the derivatives and weights
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment