23 {
24 bool ok_ambig[2];
25 bool ok[2][2];
26 ok_ambig[0] = true;
27 ok_ambig[1] = true;
28 ok[0][0] = false;
29 ok[0][1] = false;
30 ok[1][0] = false;
31 ok[1][1] = false;
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();
38
39 double k = ( ywest - yeast ) / ( xwest - xeast );
40 double b = -k * xeast + yeast;
41
42 double xc = _circle->getCirX();
43 double yc = _circle->getCirY();
44 double rc = _circle->getCirR();
45
46 double drift = _rechit->getDriftDist();
47
48
49
50 double x1( 999 ), y1( 999 );
51 double x2( 999 ), y2( 999 );
52 double a = k * k + 1;
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;
60
61
62 if ( delta1 >= 0 )
63 {
64 double x1_0 = ( -b1 + sqrt( delta1 ) ) / ( 2 * a );
65 double x1_1 = ( -b1 - sqrt( delta1 ) ) / ( 2 * a );
66
67 if ( ( xeast >= x1_0 && xwest <= x1_0 ) or ( xeast <= x1_0 && xwest >= x1_0 ) )
68 ok[0][0] = true;
69 if ( ( xeast >= x1_1 && xwest <= x1_1 ) or ( xeast <= x1_1 && xwest >= x1_1 ) )
70 ok[0][1] = true;
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 )
74 {
75 x1 = x1_0;
76
77 }
78 if ( ok[0][0] == false && ok[0][1] == false ) ok_ambig[0] = false;
79 y1 = k * x1 + b;
81 double l1 = 0;
82 double z1 = 0;
83 if ( ok_ambig[0] == true )
84 {
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;
87 _zleft = z1;
88 _lleft = l1;
89 }
90 }
91
92 if ( delta2 >= 0 )
93 {
94 double x2_0 = ( -b1 + sqrt( delta2 ) ) / ( 2 * a );
95 double x2_1 = ( -b1 - sqrt( delta2 ) ) / ( 2 * a );
96
97 if ( ( xeast >= x2_0 && xwest <= x2_0 ) or ( xeast <= x2_0 && xwest >= x2_0 ) )
98 ok[1][0] = true;
99 if ( ( xeast >= x2_1 && xwest <= x2_1 ) or ( xeast <= x2_1 && xwest >= x2_1 ) )
100 ok[1][1] = true;
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 )
104 {
105 x2 = x2_0;
106
107 }
108 if ( ok[1][0] == false && ok[1][1] == false ) ok_ambig[1] = false;
109 y2 = k * x2 + b;
111 double l2 = 0;
112 double z2 = 0;
113 if ( ok_ambig[1] == true )
114 {
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;
117 _zright = z2;
118 _lright = l2;
119 }
120 }
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;
125
126 std::cerr << __FILE__ << ":" << __LINE__ << ": should not reach here" << std::endl;
127 exit( 1 );
128}
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)