32 double xeast = _rechit->getEastPoint().x();
33 double xwest = _rechit->getWestPoint().x();
34 double yeast = _rechit->getEastPoint().y();
35 double ywest = _rechit->getWestPoint().y();
36 double zeast = _rechit->getEastPoint().z();
37 double zwest = _rechit->getWestPoint().z();
39 double k = ( ywest - yeast ) / ( xwest - xeast );
40 double b = -k * xeast + yeast;
42 double xc = _circle->getCirX();
43 double yc = _circle->getCirY();
44 double rc = _circle->getCirR();
46 double drift = _rechit->getDriftDist();
50 double x1( 999 ), y1( 999 );
51 double x2( 999 ), y2( 999 );
53 double b1 = -2 * ( xc + k * yc - k * b );
54 double c1 = xc * xc + ( yc - b ) * ( yc - b ) - ( rc + drift ) * ( rc + drift );
55 double c2 = xc * xc + ( yc - b ) * ( yc - b ) - ( rc - drift ) * ( rc - drift );
56 double delta1 = ( b1 * b1 - 4 * a * c1 );
57 double delta2 = ( b1 * b1 - 4 * a * c2 );
58 if ( delta1 < 0 ) ok_ambig[0] =
false;
59 if ( delta2 < 0 ) ok_ambig[1] =
false;
64 double x1_0 = ( -b1 + sqrt( delta1 ) ) / ( 2 * a );
65 double x1_1 = ( -b1 - sqrt( delta1 ) ) / ( 2 * a );
67 if ( ( xeast >= x1_0 && xwest <= x1_0 ) or ( xeast <= x1_0 && xwest >= x1_0 ) )
69 if ( ( xeast >= x1_1 && xwest <= x1_1 ) or ( xeast <= x1_1 && xwest >= x1_1 ) )
71 if ( ok[0][0] ==
true && ok[0][1] ==
false ) x1 = x1_0;
72 if ( ok[0][0] ==
false && ok[0][1] ==
true ) x1 = x1_1;
73 if ( ok[0][0] ==
true && ok[0][1] ==
true )
78 if ( ok[0][0] ==
false && ok[0][1] ==
false ) ok_ambig[0] =
false;
83 if ( ok_ambig[0] ==
true )
85 calcu( x1, y1, xc, yc, rc, xeast, yeast, zeast, xwest, ywest, zwest,
theta1, l1, z1 );
86 if (
m_debug > 0 ) cout <<
" theta1 l1 z1 " <<
theta1 <<
" " << l1 <<
" " << z1 << endl;
94 double x2_0 = ( -b1 + sqrt( delta2 ) ) / ( 2 * a );
95 double x2_1 = ( -b1 - sqrt( delta2 ) ) / ( 2 * a );
97 if ( ( xeast >= x2_0 && xwest <= x2_0 ) or ( xeast <= x2_0 && xwest >= x2_0 ) )
99 if ( ( xeast >= x2_1 && xwest <= x2_1 ) or ( xeast <= x2_1 && xwest >= x2_1 ) )
101 if ( ok[1][0] ==
true && ok[1][1] ==
false ) x2 = x2_0;
102 if ( ok[1][0] ==
false && ok[1][1] ==
true ) x2 = x2_1;
103 if ( ok[1][0] ==
true && ok[1][1] ==
true )
108 if ( ok[1][0] ==
false && ok[1][1] ==
false ) ok_ambig[1] =
false;
113 if ( ok_ambig[1] ==
true )
115 calcu( x2, y2, xc, yc, rc, xeast, yeast, zeast, xwest, ywest, zwest,
theta2, l2, z2 );
116 if (
m_debug > 0 ) cout <<
" theta2 l2 z2 " <<
theta2 <<
" " << l2 <<
" " << z2 << endl;
121 if ( ok_ambig[0] ==
true && ok_ambig[1] ==
false )
return -1;
122 if ( ok_ambig[0] ==
false && ok_ambig[1] ==
true )
return 1;
123 if ( ok_ambig[0] ==
true && ok_ambig[1] ==
true )
return 2;
124 if ( ok_ambig[0] ==
false && ok_ambig[1] ==
false )
return 0;
126 std::cerr << __FILE__ <<
":" << __LINE__ <<
": should not reach here" << std::endl;
131 double y_east,
double z_east,
double x_west,
double y_west,
132 double z_west,
double& theta,
double& l,
double& z ) {
134 if ( xc == 0 || x1 - xc == 0 ) { theta = 0; }
137 theta =
M_PI - atan2( y1 - yc, x1 - xc ) + atan2( yc, xc );
138 if ( theta > 2 *
M_PI ) { theta = theta - 2 *
M_PI; }
139 if ( theta < 0 ) { theta = theta + 2 *
M_PI; }
141 if ( _charge == 1 ) theta = 2 *
M_PI - theta;
143 double d1 = sqrt( ( x1 - x_west ) * ( x1 - x_west ) + ( y1 - y_west ) * ( y1 - y_west ) );
144 double d2 = sqrt( ( x_east - x_west ) * ( x_east - x_west ) +
145 ( y_east - y_west ) * ( y_east - y_west ) );
148 z = z_west - ( z_west - z_east ) * d1 / d2;
278 _rechit->setzAmb( 0, _zleft );
279 _rechit->setsAmb( 0, _lleft );
280 _rechit->setzAmb( 1, _zright );
281 _rechit->setsAmb( 1, _lright );
void calcu(double x1, double y1, double xc, double yc, double rc, double x_east, double y_east, double z_east, double x_west, double y_west, double z_west, double &theta, double &l, double &z)