128 double pi = 3.1415926;
129 _ry = _Yaxis.d3mag();
130 _rz = _Zaxis.d3mag();
132 if ( _ry == 0 || _rz == 0 )
134 report(
ERROR,
"" ) <<
"Euler angle calculation specified by zero modules of the axis!"
136 report(
ERROR,
"EvtGen" ) <<
"Will terminate execution!" << endl;
139 double tolerance = 1e-10;
140 bool Y1is0 = fabs( _Yaxis.get( 0 ) ) < tolerance;
141 bool Y2is0 = fabs( _Yaxis.get( 1 ) ) < tolerance;
142 bool Y3is0 = fabs( _Yaxis.get( 2 ) ) < tolerance;
143 bool Z1is0 = fabs( _Zaxis.get( 0 ) ) < tolerance;
144 bool Z2is0 = fabs( _Zaxis.get( 1 ) ) < tolerance;
145 bool Z3is0 = fabs( _Zaxis.get( 2 ) ) < tolerance;
147 if ( Y1is0 && Y3is0 && Z1is0 && Z2is0 )
155 if ( Z1is0 && Z2is0 && !Y2is0 )
159 _gamma = acos( _Yaxis.get( 0 ) / _ry );
160 if ( _Yaxis.get( 1 ) < 0 ) _gamma = 2 *
pi - _gamma;
167 if ( Z1is0 && Z2is0 ) { _beta = 0; }
168 else { _beta = acos( _Zaxis.get( 2 ) / _rz ); }
172 if ( _beta == 0 ) { _alpha = 0.0; }
175 double cosalpha = _Zaxis.get( 0 ) / _rz /
sin( _beta );
176 if ( fabs( cosalpha ) > 1.0 ) cosalpha = cosalpha / fabs( cosalpha );
177 _alpha = acos( cosalpha );
178 if ( _Zaxis.get( 1 ) < 0.0 ) _alpha = 2 *
pi - _alpha;
184 double singamma = _Yaxis.get( 2 ) / _ry /
sin( _beta );
186 ( -_Yaxis.get( 0 ) / _ry -
cos( _alpha ) *
cos( _beta ) * singamma ) /
sin( _alpha );
187 if ( fabs( singamma ) > 1.0 ) singamma = singamma / fabs( singamma );
188 _gamma = asin( singamma );
189 if ( singamma > 0 && cosgamma < 0 ) _gamma =
pi - _gamma;
190 if ( singamma < 0 && cosgamma < 0 ) _gamma =
pi - _gamma;
191 if ( singamma < 0 && cosgamma > 0 ) _gamma = 2 *
pi + _gamma;