72 double kap = 0.5 *
par.omega();
76 double radius = slayer->
rEnd();
81 std::cout <<
"delPhi " << slayer->
delPhi() <<
" delPhiInv " << slayer->
delPhiinv()
82 <<
" dPhiZ " << dPhiZ <<
" zEnd() " << slayer->
zEnd() <<
" phiAx "
83 << segStuff.
phiAx <<
" phiSeg " << phiSeg <<
" phiDiff "
84 << phiSeg - segStuff.
phiAx << std::endl;
86 bool lStraight =
false;
87 if ( fabs( kap ) < 1.e-9 ) lStraight =
true;
90 double zApprox = phiDiff.
rad() * -dPhiZ;
93 std::cout <<
"zApp " << zApprox << std::endl;
95 double delRad = slayer->
stDip() * ( 1. - zApprox * zApprox * segStuff.
wirLen2inv );
98 if ( lStraight ) { delPhiArg = delRad * d0 / ( radius * radius ); }
99 else { delPhiArg = -delRad * kap; }
104 bool szFaild =
false;
107 for (
int ihit = 0; ihit < parentSeg->
nHit(); ihit++ )
112 int szCode =
zPosition( *( parentSeg->
hit( ihit ) ),
par, &span, hitFit,
119 span.
sigma[hitFit] = 1;
120 arcTemp += span.
x[hitFit];
129 std::cout <<
"MdcSegInfoSterO hit " << ihit <<
" z calc faild"
134 if ( hitFit > 0 ) span.
fit( hitFit );
138 segStuff.
phiAx += delPhiArg + 0.5 * delPhiArg * segStuff.
phiArg * segStuff.
phiArg;
139 phiDiff = phiSeg - segStuff.
phiAx;
140 double z = phiDiff.
rad() * -dPhiZ;
143 std::cout <<
"z " << z << std::endl;
149 double arg = radius * radius - d0 * d0;
150 if (
arg <= 0.0 )
return 1;
151 double rD0Root = sqrt(
arg );
152 double rD0Rinv = 1. / rD0Root;
153 double rinv = 1. / radius;
155 double slope = parentSeg->
slope();
156 ct = dPhiZ * ( rD0Root * slope + d0 * rinv ) * rinv;
159 if (
arc == 0.0 )
return 1;
164 std::cout <<
"in MdcSegInfoSterO : z0 " <<
z0 <<
" " <<
_errmat[0] <<
" ct " <<
ct <<
" "
168 double dctdm = dPhiZ * rD0Root * rinv;
169 double dctdD = -dPhiZ * rinv * ( slope * d0 * rD0Rinv - rinv );
170 double dzdm = -
arc * dPhiZ * rD0Root * rinv;
171 double dzdphi = dPhiZ;
172 double dzdphi0 = -dPhiZ;
173 double dzdD = -dPhiZ +
ct * d0 * rD0Rinv -
arc * dctdD;
175 const double* inErr = parentSeg->
errmat();
177 const HepMatrix trackErr =
par.covariance();
178 _errmat[0] = dzdm * dzdm * inErr[2] + 2 * dzdm * dzdphi * inErr[1] +
179 dzdphi * dzdphi * inErr[0] + dzdD * dzdD * trackErr( 1, 1 ) +
180 dzdphi0 * dzdphi0 * trackErr( 2, 2 ) + 2 * dzdD * dzdphi0 * trackErr( 1, 2 );
184 _errmat[2] = dctdm * dctdm * inErr[2] + dctdD * dctdD * trackErr( 1, 1 );
188 _errmat[1] = dzdm * dctdm * inErr[2] + dzdphi * dctdm * inErr[1] +
189 dzdD * dctdD * trackErr( 1, 1 ) + dzdphi0 * dctdD * trackErr( 1, 2 );
195 double arg = 1. - kap * kap * radius * radius;
196 if (
arg < 0.0 )
return 1;
197 double rKapRoot = sqrt(
arg );
198 double rKapRinv = 1. / rKapRoot;
199 double ctFactor = -rKapRoot * -dPhiZ;
200 double slopeAx = kap * rKapRinv;
201 double slope = parentSeg->
slope();
212 ct = ( slopeAx - slope ) * ctFactor;
214 if (
arc == 0.0 )
return 1;
222 arc = arcTemp / hitFit;
235 std::cout <<
"--slayer NO. " << slayer->
index() << std::endl;
236 std::cout <<
"ori ct " << ( slopeAx - slope ) * ctFactor <<
" z0 "
239 std::cout <<
"fix ct " << span.
slope <<
" z0 " << span.
intercept <<
" arc "
240 << arcTemp / hitFit << std::endl;
241 std::cout <<
"-------- " << std::endl;
244 double dctdm = dPhiZ * rKapRoot;
245 double dctdkap = -dPhiZ * ( 1 + radius * radius * kap * rKapRinv * slope );
246 double dzdm =
arc * -dPhiZ * rKapRoot;
247 double dzdphi = dPhiZ;
248 double dzdkap = dPhiZ * radius * rKapRinv -
arc * dctdkap -
249 ct * ( radius * rKapRinv / kap -
arc / kap );
250 double dzdphi0 = -dPhiZ;
252 const double* inErr = parentSeg->
errmat();
254 const HepMatrix trackErr =
par.covariance();
255 _errmat[0] = dzdm * dzdm * inErr[2] + 2 * dzdm * dzdphi * inErr[1] +
256 dzdphi * dzdphi * inErr[0] + dzdkap * dzdkap * trackErr( 3, 3 ) +
257 dzdphi0 * dzdphi0 * trackErr( 2, 2 ) +
258 2 * dzdkap * dzdphi0 * trackErr( 2, 3 );
275 _errmat[2] = dctdm * dctdm * inErr[2] + dctdkap * dctdkap * trackErr( 3, 3 );
279 _errmat[1] = dzdm * dctdm * inErr[2] + dzdphi * dctdm * inErr[1] +
280 dzdkap * dctdkap * trackErr( 3, 3 ) + dzdphi0 * dctdkap * trackErr( 2, 3 );
292 std::cout <<
" ErrMsg(warning)"
293 <<
"Failed to invert matrix -- MdcSegInfo::calcStereo" << endl
300 int hitFit,
double t0,
double Bz )
const {
314 std::cout <<
"---------- " << std::endl;
315 h.
print( std::cout );
317 std::cout <<
"fp rp " << fp <<
" " << rp << std::endl;
318 std::cout <<
"Xmid " << X << std::endl;
324 double d0 = -
par.d0();
325 double phi0 = (
par.phi0() -
pi / 2 );
327 if ( ( -1 ) *
par.omega() / Bz > 0 ) _charge = 1;
331 else r = 1 /
par.omega();
333 double xc =
sin(
par.phi0() ) * ( -d0 + r ) * -1.;
334 double yc = -1. *
cos(
par.phi0() ) * ( -d0 + r ) * -1;
339 double wwmag2 = ww.mag2();
340 double wwmag = sqrt( wwmag2 );
341 int ambig = hitUse.
ambig();
343 double driftdist = fabs( h.
driftDist( t0, ambig ) );
344 HepVector3D lr( driftdist / wwmag * ww.x(), driftdist / wwmag * ww.y(), 0. );
347 std::cout <<
"xc " << xc <<
" yc " << yc <<
" drfitdist " << driftdist << std::endl;
348 std::cout <<
"r1 " << r <<
" d0 " << d0 <<
" phi0 " << phi0 << std::endl;
349 std::cout <<
"lr " << lr <<
" hit ambig " << hitUse.
ambig() <<
" ambig " << ambig
359 if ( ambig == 0 ) lr =
ORIGIN;
360 if ( _charge * Bz < 0 )
384 double vmag2 =
v.mag2();
388 double wv =
w.dot(
v );
390 double d2 = wv * wv - vmag2 * (
w.mag2() - r * r );
393 std::cout <<
"X_fix " << X <<
" center " << center << std::endl;
394 std::cout <<
"V " << V << std::endl;
395 std::cout <<
"w " <<
w <<
" v " <<
v << std::endl;
404 std::cout <<
"in MdcSegInfoSterO !!! stereo: 0. > d2 = " << d2 <<
" " << hitUse.
ambig()
409 double d = sqrt( d2 );
415 std::cout <<
"wv " << wv <<
" d " << d <<
" vmag2 " << vmag2 << std::endl;
417 l[0] = ( -wv + d ) / vmag2;
418 l[1] = ( -wv - d ) / vmag2;
425 z[0] = X.z() + l[0] * V.z();
426 z[1] = X.z() + l[1] * V.z();
429 std::cout <<
"X.z " << X.z() <<
" V.z " << V.z() << std::endl;
430 std::cout <<
"l0, l1 = " << l[0] <<
", " << l[1] << std::endl;
431 std::cout <<
"rpz " << rp.z() <<
" fpz " << fp.z() << std::endl;
432 std::cout <<
"z0 " << z[0] <<
" z1 " << z[1] << std::endl;
435 if ( hitUse.
ambig() == 0 )
437 if ( debug > 0 ) std::cout <<
" ambig = 0 " << std::endl;
438 if ( z[0] > rp.z() + 20. || z[0] < fp.z() - 20. ) { ok[0] =
false; }
439 if ( z[1] > rp.z() + 20. || z[1] < fp.z() - 20. ) { ok[1] =
false; }
443 if ( debug > 0 ) std::cout <<
" ambig != 0 " << std::endl;
445 if ( fabs( z[0] / rp.z() ) > 1.05 ) { ok[0] =
false; }
447 if ( fabs( z[1] / rp.z() ) > 1.05 ) { ok[1] =
false; }
449 if ( ( !ok[0] ) && ( !ok[1] ) )
451 if ( debug > 0 && ( hitUse.
ambig() != 0 ) && fabs( z[1] / rp.z() ) > 1.05 )
452 std::cout <<
" z[1] bad " << std::endl;
453 if ( debug > 0 && ( hitUse.
ambig() != 0 ) && fabs( z[0] / rp.z() ) > 1.05 )
454 std::cout <<
" z[0] bad " << std::endl;
458 std::cout <<
" z[1] bad "
459 <<
"rpz " << rp.z() <<
" fpz " << fp.z() <<
"z0 " << z[0] <<
" z1 " << z[1]
461 std::cout <<
" !ok[0] && !ok[1] return -2" << std::endl;
473 std::cout << __FILE__ <<
" " << __LINE__ <<
" p0 " << p[0].x() <<
" " << p[0].y()
475 std::cout << __FILE__ <<
" " << __LINE__ <<
" p1 " << p[1].x() <<
" " << p[1].y()
477 std::cout << __FILE__ <<
" " << __LINE__ <<
" c " << center.x() <<
" " << center.y() <<
" "
478 << _charge << std::endl;
479 std::cout << __FILE__ <<
" " << __LINE__ <<
" p0 centerx*y " << center.x() * p[0].y()
480 <<
" centery*x" << center.y() * p[0].x() << std::endl;
481 std::cout << __FILE__ <<
" " << __LINE__ <<
" p1 centerx*y " << center.x() * p[1].y()
482 <<
" centery*x" << center.y() * p[1].x() << std::endl;
499 if ( ok[1] ) best = 1;
503 double cosdPhi = -center.dot( ( p[best] - center ).
unit() ) / center.mag();
505 if ( fabs( cosdPhi ) <= 1.0 ) { dPhi = acos( cosdPhi ); }
506 else if ( cosdPhi > 1.0 ) { dPhi = 0.0; }
510 tmp.setX(
abs( r * dPhi ) );
515 span->
y[hitFit] = z[best];
519 span->
x[hitFit] =
abs( r * dPhi );
520 if ( hitUse.
ambig() < 0 ) driftdist *= -1.;
526 <<
" z " << span->
y[hitFit] << std::endl;