42 double& d,
double& za,
double& zb,
int fgZcal ) {
48 double seca[3], secb[3];
52 for ( i = 0; i < 3; i++ ) vst[i] = sta[i] - stb[i];
56 m2 = vp[0] * vp[0] + vp[1] * vp[1] + vp[2] * vp[2];
58 for ( i = 0; i < 3; i++ ) vp[i] /= modvp;
61 for ( i = 0; i < 3; i++ ) d += vst[i] * vp[i];
63 if ( 0 == fgZcal )
return 1;
65 double veca00 = veca[0] * veca[0];
66 double veca11 = veca[1] * veca[1];
67 double veca22 = veca[2] * veca[2];
69 double veca01 = veca[0] * veca[1];
70 double veca02 = veca[0] * veca[2];
71 double veca12 = veca[1] * veca[2];
73 double vecb00 = vecb[0] * vecb[0];
74 double vecb11 = vecb[1] * vecb[1];
75 double vecb22 = vecb[2] * vecb[2];
76 double vecb01 = vecb[0] * vecb[1];
77 double vecb02 = vecb[0] * vecb[2];
78 double vecb12 = vecb[1] * vecb[2];
80 seca[0] = veca[1] * vecb01 + veca[2] * vecb02 - veca[0] * ( vecb11 + vecb22 );
81 seca[1] = veca[0] * vecb01 + veca[2] * vecb12 - veca[1] * ( vecb00 + vecb22 );
82 seca[2] = veca[0] * vecb02 + veca[1] * vecb12 - veca[2] * ( vecb00 + vecb11 );
84 secb[0] = vecb[1] * veca01 + vecb[2] * veca02 - vecb[0] * ( veca11 + veca22 );
85 secb[1] = vecb[0] * veca01 + vecb[2] * veca12 - vecb[1] * ( veca00 + veca22 );
86 secb[2] = vecb[0] * veca02 + vecb[1] * veca12 - vecb[2] * ( veca00 + veca11 );
88 for ( i = 0; i < 3; i++ )
90 tpa += seca[i] * ( sta[i] - stb[i] );
91 twb += secb[i] * ( stb[i] - sta[i] );
95 za = veca[2] * tpa + sta[2];
96 zb = vecb[2] * twb + stb[2];
123 double& zwire,
double zini ) {
125 double x0 = trkpar[0] *
cos( trkpar[1] );
126 double y0 = trkpar[0] *
sin( trkpar[1] );
127 double z0 = trkpar[3];
128 double phi0 = trkpar[1] +
HFPI;
129 double g = 1000 / ( 0.3 *
BFIELD * trkpar[2] );
130 double tanl = trkpar[4];
132 double wx = wirev[0];
133 double wy = wirev[1];
134 double wz = wirev[2];
139 CLHEP::HepVector c( 2, 0 );
140 c[0] = phi0 + ( zini - z0 ) / ( g * tanl );
141 c[1] = ( zini - wirest[2] ) / wz;
145 double xh = x0 + g * (
sin( phi ) -
sin( phi0 ) );
146 double yh = y0 + g * ( -
cos( phi ) +
cos( phi0 ) );
147 double zh = z0 + g * tanl * ( phi - phi0 );
148 double xw = wirest[0] + wx *
t;
149 double yw = wirest[1] + wy *
t;
150 double zw = wirest[2] + wz *
t;
151 double doca = sqrt( ( xh - xw ) * ( xh - xw ) + ( yh - yw ) * ( yh - yw ) +
152 ( zh - zw ) * ( zh - zw ) );
159 CLHEP::HepVector a( 2, 0 );
160 CLHEP::HepSymMatrix omega( 2, 0 );
164 a[0] = ( x0 - g *
sin( phi0 ) - wirest[0] - wx *
t ) *
cos( phi ) +
165 ( y0 + g *
cos( phi0 ) - wirest[1] - wy *
t ) *
sin( phi ) +
166 ( z0 + g * tanl * phi - g * tanl * phi0 - wirest[2] - wz *
t ) * tanl;
167 a[1] = ( x0 + g *
sin( phi ) - g *
sin( phi0 ) - wirest[0] - wx *
t ) * wx +
168 ( y0 - g *
cos( phi ) + g *
cos( phi0 ) - wirest[1] - wy *
t ) * wy +
169 ( z0 + g * tanl * phi - g * tanl * phi0 - wirest[2] - wz *
t ) * wz;
170 omega[0][0] = 0 - ( x0 - g *
sin( phi0 ) - wirest[0] - wx *
t ) *
sin( phi ) +
171 ( y0 + g *
cos( phi0 ) - wirest[1] - wy *
t ) *
cos( phi ) + g * tanl * tanl;
172 omega[0][1] = -wx *
cos( phi ) - wy *
sin( phi ) - wz * tanl;
173 omega[1][0] = g * ( wx *
cos( phi ) + wy *
sin( phi ) + wz * tanl );
174 omega[1][1] = -wx * wx - wy * wy - wz * wz;
176 HepVector cc( 2, 0 );
177 cc = c - omega.inverse( ifail ) * a;
181 xh = x0 + g * (
sin( phi ) -
sin( phi0 ) );
182 yh = y0 + g * ( -
cos( phi ) +
cos( phi0 ) );
183 zh = z0 + g * tanl * ( phi - phi0 );
184 xw = wirest[0] + wx *
t;
185 yw = wirest[1] + wy *
t;
186 zw = wirest[2] + wz *
t;
187 doca = sqrt( ( xh - xw ) * ( xh - xw ) + ( yh - yw ) * ( yh - yw ) +
188 ( zh - zw ) * ( zh - zw ) );
196 a[0] = ( x0 - g *
sin( phi0 ) - wirest[0] - wx *
t ) *
cos( phi ) +
197 ( y0 + g *
cos( phi0 ) - wirest[1] - wy *
t ) *
sin( phi ) +
198 ( z0 + g * tanl * phi - g * tanl * phi0 - wirest[2] - wz *
t ) * tanl;
199 a[1] = ( x0 + g *
sin( phi ) - g *
sin( phi0 ) - wirest[0] - wx *
t ) * wx +
200 ( y0 - g *
cos( phi ) + g *
cos( phi0 ) - wirest[1] - wy *
t ) * wy +
201 ( z0 + g * tanl * phi - g * tanl * phi0 - wirest[2] - wz *
t ) * wz;
202 if ( ( fabs( a[0] ) < 0.001 ) && ( fabs( a[1] ) < 0.001 ) )
break;
213 xh = x0 + g * (
sin( phi ) -
sin( phi0 ) );
214 yh = y0 + g * ( -
cos( phi ) +
cos( phi0 ) );
215 zh = z0 + g * tanl * ( phi - phi0 );
216 xw = wirest[0] + wx *
t;
217 yw = wirest[1] + wy *
t;
218 zw = wirest[2] + wz *
t;
219 doca = sqrt( ( xh - xw ) * ( xh - xw ) + ( yh - yw ) * ( yh - yw ) +
220 ( zh - zw ) * ( zh - zw ) );
250 double& zwire,
double phiIni ) {
251 double x0 = trkpar[0] *
cos( trkpar[1] );
252 double y0 = trkpar[0] *
sin( trkpar[1] );
253 double z0 = trkpar[3];
254 double phi0 = trkpar[1] +
HFPI;
255 if ( phi0 >
PI2 ) phi0 -=
PI2;
256 double g = 1000 / ( 0.3 *
BFIELD * trkpar[2] );
257 double tanl = trkpar[4];
287 if ( dphi >
PI ) dphi -=
PI2;
288 if ( dphi < -
PI ) dphi +=
PI2;
290 trkst[0] = x0 + g * (
sin( phi ) -
sin( phi0 ) );
291 trkst[1] = y0 + g * ( -
cos( phi ) +
cos( phi0 ) );
293 trkst[2] = z0 + g * tanl * dphi;
295 trkv[0] =
cos( phi );
296 trkv[1] =
sin( phi );
299 dist2Line( trkst, wirest, trkv, wirev, doca, ztrk, zwire );
301 phiNew = phi0 + ( ztrk - z0 ) / ( g * tanl );
302 if ( fabs( phiNew - phi ) < 1.0E-8 )
break;
376 double ten = wpos[6];
377 double a = 9.47e-06 / ( 2 * ten );
378 double dx = wpos[0] - wpos[3];
379 double dz = wpos[2] - wpos[5];
380 double length = sqrt( dx * dx + dz * dz );
383 if ( whitPos[2] < 0.5 * length ) ztan = whitPos[2];
389 double sinalf = dx / sqrt( dx * dx + dz * dz );
390 double cosalf = dz / sqrt( dx * dx + dz * dz );
391 double tanalf = dx / dz;
394 double rLayer = sqrt( ( wpos[3] * wpos[3] ) + ( wpos[4] * wpos[4] ) );
395 double phiIni =
getPhiIni( trkpar, rLayer, posIni );
399 std::cout <<
"ERROR: wire position error in getdocaLine() !!!" << std::endl;
406 if ( i > 5 ) {
return false; }
409 xyz[0] = ( zc - wpos[5] ) * tanalf + wpos[3];
410 xyz[1] = a * zp * zp + ( wpos[1] - wpos[4] ) * zp / length + 0.5 * ( wpos[1] + wpos[4] ) -
411 a * length * length / 4.0;
415 dxyz[1] = 2.0 * a * zp + ( wpos[1] - wpos[4] ) / length;
421 if ( fabs( zc - ztan ) < 0.5 )
break;
422 else if ( fabs( ztan ) > ( 0.5 * length ) )
431 whitPos[1] = a * zp * zp + ( wpos[1] - wpos[4] ) * zp / length +
432 0.5 * ( wpos[1] + wpos[4] ) - a * length * length / 4.0;
433 whitPos[0] = ( ztan - wpos[5] ) * tanalf + wpos[3];
438 double dr = trkpar[0];
439 double fi0 = trkpar[1];
440 double kap = trkpar[2];
443 double phi0 = fi0 +
HFPI;
444 if ( phi0 >
PI2 ) phi0 -=
PI2;
445 double g = 1000 / ( 0.3 * 1.0 * kap );
447 double aa = rw * rw - ( dr - g ) * ( dr - g ) - g * g;
448 double bb = 2 * g * ( dr - g );
450 double dd = acos( cc );
453 if ( kap > 0 ) phi = phi0 + dd;
454 else phi = phi0 - dd;
456 if ( phi >
PI2 ) phi -=
PI2;
457 if ( phi < 0 ) phi +=
PI2;
459 double x0 = dr *
cos( fi0 );
460 double y0 = dr *
sin( fi0 );
461 pos[0] = x0 + g * (
sin( phi ) -
sin( phi0 ) );
462 pos[1] = y0 + g * ( -
cos( phi ) +
cos( phi0 ) );
464 if ( kap > 0 ) pos[2] = trkpar[3] + g * trkpar[4] * dd;
465 else pos[2] = trkpar[3] - g * trkpar[4] * dd;
int dist2Line(double sta[3], double stb[3], double veca[3], double vecb[3], double &d, double &za, double &zb, int fgZcal=1)