24 if( hits.empty() )
return {};
27 if (log.level()<=MSG::VERBOSE) log << MSG::VERBOSE <<
"Performing fit, hits " << hits.size() <<
endmsg;
34 for( HitVec::iterator it=hits.begin(); it!=hits.end(); ++it ){
36 float invBeta = it->time/
a;
37 float invBetaError = it->error/
a;
38 if (log.level()<=MSG::VERBOSE) {
39 const char* text = it->useInFit ?
" hit " :
" outlier ";
41 float dbeta = it->distance*
invSpeedOfLight/(it->time*it->time)*it->error;
42 log << MSG::VERBOSE << text <<
", d " << it->distance <<
" tof " << it->distance*
invSpeedOfLight <<
" time " << it->time
43 <<
" error " << it->error <<
" beta " << beta <<
" error " << dbeta
44 <<
" 1./beta " << invBeta <<
" error " << invBetaError <<
" use " << it->useInFit <<
endmsg;
46 if( it->useInFit && (invBeta - pullCut*invBetaError > maxInvBeta || invBeta + pullCut*invBetaError < 1) ) {
47 if (log.level()<=MSG::VERBOSE) log <<
"Removing hit outside beta range " <<
endmsg;
50 if( !it->useInFit )
continue;
52 sum2 += it->distance*it->time*it->weight2;
55 if( sum2 == 0 )
return {};
58 float beta = sum1/sum2;
59 float invBeta = 1./beta;
60 if (log.level()<=MSG::VERBOSE) log <<
"beta " << beta <<
" sum1 " << sum1 <<
" sum2 " << sum2 <<
endmsg;
64 for( HitVec::iterator it=hits.begin(); it!=hits.end(); ++it ){
67 if (log.level()<=MSG::VERBOSE) {
68 const char* text = it->useInFit ?
" hit " :
" outlier ";
69 log << text <<
"residual " <<
res <<
" pull " <<
res/it->error <<
" chi2 " <<
res*
res*it->weight2 <<
endmsg;
71 if( !it->useInFit )
continue;
75 if( ndof == 0 )
return {};
78 if (log.level()<=MSG::VERBOSE) log <<
"beta " << beta <<
" chi2 " <<
chi2 <<
" ndof " << ndof <<
" chi2/ndof " <<
result.chi2PerDOF() <<
endmsg;
85 if (log.level()<=MSG::VERBOSE) log <<
"Performing fit with outlier logic, hits " << hits.size() <<
endmsg;
91 if(
result.status == 0 || hits.size() < 3 ||
result.chi2PerDOF() < 5 ) {
92 if (log.level()<=MSG::VERBOSE) log <<
"no outlier logic applied: hits " << hits.size()
100 float bestChi2Ndof =
result.chi2PerDOF();
101 for(
unsigned int i=0;i<hits.size();++i ){
104 if( !hits[i].useInFit )
continue;
107 hits[i].useInFit =
false;
110 if( resultNew.
status != 0 ){
112 if( chi2Ndof < bestChi2Ndof ){
113 bestChi2Ndof = chi2Ndof;
118 hits[i].useInFit =
true;
122 if( worstHit == -1 ) {
123 if (log.level()<=MSG::VERBOSE) log <<
"unable to improve result, keep initial result " <<
endmsg;
127 hits[worstHit].useInFit =
false;
128 if (log.level()<=MSG::VERBOSE) log <<
"removed hit " << worstHit <<
" new chi2 " << bestChi2Ndof <<
endmsg;