33 const int maxnOscillStep = 5;
34 const int maxnDivergingStep = 5;
42 double delta( 0 ), prevdelta( 0 );
44 int nDivergingStep( 0 );
45 bool finished =
false;
48 for ( istep = 0; istep <
_maxTry && !finished; ++istep )
50 double prevflt1 =
flt1();
51 double prevflt2 =
flt2();
52 double prevprevdelta = prevdelta;
65 delta = ( newPos1 - newPos2 ).mag();
66 double step1 =
flt1() - prevflt1;
67 double step2 =
flt2() - prevflt2;
68 int pathDir1 = ( step1 > 0. ) ? 1 : -1;
69 int pathDir2 = ( step2 > 0. ) ? 1 : -1;
76 finished = ( fabs( step1 ) < distToErr1 && fabs( step2 ) < distToErr2 ) ||
77 (
status().success() == 3 );
80 if ( !finished && istep > 2 && delta > prevdelta )
82 if ( prevdelta > prevprevdelta )
85 if ( ++nDivergingStep > maxnDivergingStep )
95 if ( ++nOscillStep > maxnOscillStep )
101 _status.setSuccess( 21,
"Oscillating poca." );
109 _flt1 = prevflt1 + 0.5 * step1;
110 _flt2 = prevflt2 + 0.5 * step2;
113 delta = ( newPos1 - newPos2 ).mag();
119 if ( !finished )
_status.setSuccess( 2 );
132 double fltLast = 0., fltBeforeLast = 0.;
133 for (
int i = 0; i <
_maxTry; i++ )
137 if (
status().failure() )
return;
138 double step =
flt1() - fltLast;
139 pathDir = ( step > 0. ) ? 1 : -1;
142 bool mustStep = ( fabs( step ) > distToErr && step != 0. );
144 if ( fabs( step ) < 0.5 *
precision() ) { nTinyStep++; }
150 if ( fabs( step ) >= fabs( fltBeforeLast - fltLast ) &&
151 fabs( fltBeforeLast -
flt1() ) <= fabs( step ) )
154 double halfway = ( fltBeforeLast + fltLast ) / 2.;
156 ( traj.
position( halfway ) - pt ).mag() )
161 if ( nTinyStep > 3 ) mustStep =
false;
165#ifdef MDCPATREC_WARNING
166 std::cout <<
" ErrMsg(warning) "
167 <<
"Alleged oscillation detected. " << step <<
" " << fltLast - fltBeforeLast
168 <<
" " << i <<
" " << std::endl;
171 if ( !mustStep )
return;
172 fltBeforeLast = fltLast;
184 static Hep3Vector dir1, dir2;
185 static Hep3Vector delDir1, delDir2;
190 Hep3Vector delta = ( (CLHEP::Hep3Vector)pos1 ) - ( (CLHEP::Hep3Vector)pos2 );
191 double ua = -delta.dot( dir1 );
192 double ub = delta.dot( dir2 );
193 double caa = dir1.mag2() + delta.dot( delDir1 );
194 double cbb = dir2.mag2() - delta.dot( delDir2 );
195 double cab = -dir1.dot( dir2 );
196 double det = caa * cbb - cab * cab;
203 det = caa * cbb - cab * cab;
213 double df1 = ( ua * cbb - ub * cab ) / det;
214 int pathDir1 = ( df1 > 0 ) ? 1 : -1;
215 double df2 = ( ub * caa - ua * cab ) / det;
216 int pathDir2 = ( df2 > 0 ) ? 1 : -1;
227 const double smudge = 1.01;
228 if ( fabs( df1 ) > smudge * distToErr1 )
231 df1 = smudge * distToErr1 * pathDir1;
233 df2 = ( ub - df1 * cab ) / cbb;
236 if ( fabs( df2 ) > smudge * distToErr2 )
239 df2 = smudge * distToErr2 * pathDir2;
241 df1 = ( ua - df2 * cab ) / cbb;
243 if ( fabs( df1 ) > smudge * distToErr1 ) { df1 = smudge * distToErr1 * pathDir1; }
255 static Hep3Vector dir, delDir;
259 Hep3Vector delta = ( (CLHEP::Hep3Vector)trajPos ) - ( (CLHEP::Hep3Vector)pt );
260 double denom = 1. + delta.dot( delDir );
261 if ( fabs( denom ) *
_maxDist < 1. )
263 _status.setFailure( 11,
"TrkPoca::ambiguous tight looper." );
266 double df = -delta.dot( dir ) / fabs( denom );
267 int pathDir = ( df > 0. ) ? 1 : -1;
271 if ( fabs( df ) > distToErr ) df = ( df > 0 ? distToErr : -distToErr );