16 HepPoint3D positionOnWire, positionOnTrack;
17 HepPoint3D pv =
pivot();
21 HepSymMatrix Ma =
Ea();
24 Helix _helix( pv, Va, Ma );
27 Hep3Vector Wire =
w.fwd() -
w.bck();
31 wp[0] = 0.5 * (
w.fwd() +
w.bck() ).x();
32 wp[1] = 0.5 * (
w.fwd() +
w.bck() ).y();
40 v[0] = Wire.unit().x();
41 v[1] = Wire.unit().y();
42 v[2] = Wire.unit().z();
66 const HepPoint3D& xc = _helix.
center();
74 double x1 = wp[0] + x0;
75 double y1 = wp[1] + y0;
78 double dPhi = atan2( x0 * y1 - y0 * x1, x0 * x1 + y0 * y1 );
98 double firstdfdphi = 0.;
99 static bool first =
true;
110 double tanLambda = _helix.
tanl();
114 const double convergence = 1.0e-5;
117 while ( nTrial < 100 )
121 positionOnTrack = _helix.
x( dPhi );
122 x = _helix.
x( dPhi );
127 l =
v[0] * t_x[0] +
v[1] * t_x[1] +
v[2] * t_x[2] -
v[0] * wb[0] -
v[1] * wb[1] -
130 double rcosPhi = rho *
cos(
phi0 + dPhi );
131 double rsinPhi = rho *
sin(
phi0 + dPhi );
132 t_dXdPhi[0] = rsinPhi;
133 t_dXdPhi[1] = -rcosPhi;
134 t_dXdPhi[2] = -rho * tanLambda;
137 double t_d2Xd2Phi[2];
138 t_d2Xd2Phi[0] = rcosPhi;
139 t_d2Xd2Phi[1] = rsinPhi;
143 n[0] = t_x[0] - wb[0];
144 n[1] = t_x[1] - wb[1];
145 n[2] = t_x[2] - wb[2];
148 a[0] =
n[0] - l *
v[0];
149 a[1] =
n[1] - l *
v[1];
150 a[2] =
n[2] - l *
v[2];
151 double dfdphi =
a[0] * t_dXdPhi[0] +
a[1] * t_dXdPhi[1] +
a[2] * t_dXdPhi[2];
157 firstdfdphi = dfdphi;
162 { std::cout <<
" bad case, calculate approach ntrial = " << nTrial << std::endl; }
166 if ( fabs( dfdphi ) < convergence )
break;
168 double dv =
v[0] * t_dXdPhi[0] +
v[1] * t_dXdPhi[1] +
v[2] * t_dXdPhi[2];
170 t_dXdPhi[0] * t_dXdPhi[0] + t_dXdPhi[1] * t_dXdPhi[1] + t_dXdPhi[2] * t_dXdPhi[2];
171 double d2fd2phi = t0 - dv * dv +
a[0] * t_d2Xd2Phi[0] +
a[1] * t_d2Xd2Phi[1];
174 dPhi -= dfdphi / d2fd2phi;
182 positionOnWire[0] = wb[0] + l *
v[0];
183 positionOnWire[1] = wb[1] + l *
v[1];
184 positionOnWire[2] = wb[2] + l *
v[2];
188 return ( positionOnTrack - positionOnWire ).mag();
198double Helix::approach( HepPoint3D pfwd, HepPoint3D pbwd,
bool doSagCorrection )
const {
201 HepPoint3D positionOnWire, positionOnTrack;
202 HepPoint3D pv =
pivot();
204 HepSymMatrix Ma =
Ea();
206 Helix _helix( pv, Va, Ma );
208 Wire[0] = ( pfwd - pbwd ).
x();
209 Wire[1] = ( pfwd - pbwd ).y();
210 Wire[2] = ( pfwd - pbwd ).z();
214 wp[0] = 0.5 * ( pfwd + pbwd ).
x();
215 wp[1] = 0.5 * ( pfwd + pbwd ).y();
223 v[0] = Wire.unit().x();
224 v[1] = Wire.unit().y();
225 v[2] = Wire.unit().z();
249 const HepPoint3D& xc = _helix.
center();
254 double x1 = wp[0] + x0;
255 double y1 = wp[1] + y0;
262 double dPhi = atan2( x0 * y1 - y0 * x1, x0 * x1 + y0 * y1 );
282 double firstdfdphi = 0.;
283 static bool first =
true;
294 double tanLambda = _helix.
tanl();
298 const double convergence = 1.0e-5;
301 while ( nTrial < 100 )
305 positionOnTrack = _helix.
x( dPhi );
306 x = _helix.
x( dPhi );
311 l =
v[0] * t_x[0] +
v[1] * t_x[1] +
v[2] * t_x[2] -
v[0] * wb[0] -
v[1] * wb[1] -
314 double rcosPhi = rho *
cos(
phi0 + dPhi );
315 double rsinPhi = rho *
sin(
phi0 + dPhi );
316 t_dXdPhi[0] = rsinPhi;
317 t_dXdPhi[1] = -rcosPhi;
318 t_dXdPhi[2] = -rho * tanLambda;
321 double t_d2Xd2Phi[2];
322 t_d2Xd2Phi[0] = rcosPhi;
323 t_d2Xd2Phi[1] = rsinPhi;
327 n[0] = t_x[0] - wb[0];
328 n[1] = t_x[1] - wb[1];
329 n[2] = t_x[2] - wb[2];
332 a[0] =
n[0] - l *
v[0];
333 a[1] =
n[1] - l *
v[1];
334 a[2] =
n[2] - l *
v[2];
335 double dfdphi =
a[0] * t_dXdPhi[0] +
a[1] * t_dXdPhi[1] +
a[2] * t_dXdPhi[2];
340 firstdfdphi = dfdphi;
349 if ( fabs( dfdphi ) < convergence )
break;
351 double dv =
v[0] * t_dXdPhi[0] +
v[1] * t_dXdPhi[1] +
v[2] * t_dXdPhi[2];
353 t_dXdPhi[0] * t_dXdPhi[0] + t_dXdPhi[1] * t_dXdPhi[1] + t_dXdPhi[2] * t_dXdPhi[2];
354 double d2fd2phi = t0 - dv * dv +
a[0] * t_d2Xd2Phi[0] +
a[1] * t_d2Xd2Phi[1];
357 dPhi -= dfdphi / d2fd2phi;
362 positionOnWire[0] = wb[0] + l *
v[0];
363 positionOnWire[1] = wb[1] + l *
v[1];
364 positionOnWire[2] = wb[2] + l *
v[2];
373 return ( positionOnTrack - positionOnWire ).mag();