35 10., 5., 5., 10., 10., 5., 5., 10.,
36 10., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 10.,
37 10., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 5., 10.,
38 10., 5., 5., 5., 5., 5., 10.
99 bool permitFlips = _allowFlips;
100 bool lPickHits = _allowDrops;
107 register double chisqold;
108 double chisqnew, chichange;
109 double chitest = 0.01;
143 int nhits = hitlist.
nHit();
144 std::vector<double> delChi( nhits, 0 );
145 std::vector<std::vector<double>> deriv( nhits );
149 int npar = theTraj.
nPar();
154 bool l3d = ( npar > 3 );
155 const int minZ = l3d ? 2 : 0;
156 const int minXY = npar - minZ;
157 const int minAct = minZ + minXY;
159 HepSymMatrix vparam( npar, 0 );
160 HepVector diffsum( npar );
161 HepVector delpar( npar );
163 std::vector<std::vector<double>>::iterator ideriv = deriv.begin();
164 std::vector<double>::iterator idelChi = delChi.begin();
165 assert( ( (
int)deriv.size() ) == ( hitlist.
end() - hitlist.
begin() ) );
167 ++ihit, ++ideriv, ++idelChi )
169 ideriv->resize( npar );
170 if ( ihit->isActive() )
187 if ( nXY < minXY ||
nZ < minZ || nActive < minAct )
189 status.
setFailure( 11,
"Not enough hits in TrkHelixFitter! " );
205 HepVector derivs( npar );
212 bool mustIterate(
false );
214 for ( i = 0; i < npar; i++ ) diffsum[i] = 0.0;
218 std::vector<std::vector<double>>::iterator ideriv = deriv.begin();
219 std::vector<double>::iterator idelChi = delChi.begin();
220 assert( ( (
int)deriv.size() ) == ( hitlist.
end() - hitlist.
begin() ) );
222 ++ihit, ++ideriv, ++idelChi )
232 calcResult = ihit->getFitStuff( derivs, deltaChiNew );
233 for ( i = 0; i < npar; ++i ) ( *ideriv )[i] = derivs[i];
241 else { calcResult = ihit->getFitStuff( deltaChiNew ); }
247 cout <<
"ErrMsg(warning) TrkHelixFitter:"
248 <<
"unable to getFitStuff for hit " << *ihit << endl;
250 ihit->setUsability(
false );
253 mustIterate = ( mustIterate || ( calcResult.
success() != 1 ) );
254 *idelChi = deltaChiNew;
257 cout << ( ihit - hitlist.
begin() );
258 ihit->print( std::cout );
259 cout <<
" dChi " << *idelChi <<
" amb " << ihit->ambig() <<
" resid " << ihit->resid()
260 <<
" rms " << ihit->hitRms() <<
" hitlen " << ihit->hitLen() <<
" fltlen "
261 << ihit->fltLen() << endl;
263 if ( ihit->isActive() ==
false )
265 if (
m_debug ) std::cout <<
"SKIP not active hit" << std::endl;
268 chisqold += deltaChiNew * deltaChiNew;
270 for ( i = 0; i < npar; ++i )
272 diffsum[i] += ( *ideriv )[i] * deltaChiNew;
273 for (
int j = 0; j < i + 1; ++j )
274 { vparam.fast( i + 1, j + 1 ) += ( *ideriv )[i] * ( *ideriv )[j]; }
280 vparam.invert( ierr );
285 cout <<
"ErrMsg(warning) TrkHelixFitter:"
286 <<
"Matrix inversion failed " << endl;
288 status.
setFailure( 12,
"Matrix inversion failed in TrkHelixFitter" );
291 delpar = vparam * ( -diffsum );
292 if (
m_debug ) { cout <<
" delpar = " << delpar << endl; }
295 if ( fabs( delpar[1] ) > 1. )
299 cout <<
"ErrMsg(warning) TrkHelixFitter:"
300 <<
"Pathological fit " << endl;
302 status.
setFailure( 13,
"Pathological fit in TrkHelixFitter." );
306 for ( i = 0; i < npar; ++i ) params.
parameter()[i] += delpar[i];
315 double bigDelChi = 0.0;
319 ( mustIterate || (
iter <= 2 && lPickHits ) );
320 ideriv = deriv.begin();
321 idelChi = delChi.begin();
323 ++ihit, ++ideriv, ++idelChi )
325 if (
m_debug ) { ihit->print( std::cout ); }
326 if ( !ihit->isUsable() )
328 if (
m_debug ) { std::cout <<
"hit NOT usable " << std::endl; }
332 for ( i = 0; i < npar; i++ ) { *idelChi += ( *ideriv )[i] * delpar[i]; }
333 if ( ihit->isActive() ) chisqnew += *idelChi * *idelChi;
336 if ( !mustIterate && lPickHits )
338 double abDelChi = fabs( *idelChi );
340 if ( abDelChi <=
nSigmaCut[ihit->layerNumber()] )
344 std::cout <<
"abDelChi " << abDelChi <<
"<?" <<
nSigmaCut[ihit->layerNumber()]
347 if ( ihit->isActive() == 0 )
349 ihit->setActivity( 1 );
350 if (
m_debug ) { cout <<
"set ACTIVE, Added " << endl; }
364 if ( ihit->isActive() )
366 if ( abDelChi > bigDelChi )
370 std::cout <<
"bigest set INACTIVE, abDelChi = " << abDelChi <<
">"
371 <<
nSigmaCut[ihit->layerNumber()] <<
" bigDelChi=" << bigDelChi
374 bigDelChi = abDelChi;
386 if ( bigHit != hitlist.
end() && ( nActive > minAct ) )
411 std::cout <<
"---deactivate hit!! delChi2=" << bigDelChi << std::endl;
413 bigHit->
print( std::cout );
414 std::cout <<
"--------------------!! " << std::endl;
421 chichange = chisqold - chisqnew;
422 if (
m_debug ) { cout <<
"chisq from " << chisqold <<
" -> " << chisqnew << endl; }
423 if ( chichange < -0.5 && !mustIterate && lPicked == 0 )
427 cout <<
"ErrMsg(warning)"
428 <<
" blowing up: " << chichange << endl;
431 setLastChisq( chisqnew );
434 if (
m_debug ) std::cout <<
"failure 1 " << std::endl;
437 else if ( chichange < chitest && !mustIterate && lPicked == 0 )
441 setLastChisq( chisqnew );
442 if (
m_debug ) std::cout <<
"success 1 " << std::endl;
446 if (
iter == itermax )
448 setLastChisq( chisqnew );
450 if (
m_debug ) std::cout <<
"success 2 " << std::endl;