00061 {
00062
00063 double pi=3.1415926;
00064 _ry=_Yaxis.d3mag();
00065 _rz=_Zaxis.d3mag();
00066
00067 if(_ry==0 ||_rz==0) {
00068 report(ERROR,"") << "Euler angle calculation specified by zero modules of the axis!"<<endl;
00069 report(ERROR,"EvtGen") << "Will terminate execution!"<<endl;
00070 ::abort();
00071 }
00072 double tolerance=1e-10;
00073 bool Y1is0=fabs(_Yaxis.get(0))<tolerance;
00074 bool Y2is0=fabs(_Yaxis.get(1))<tolerance;
00075 bool Y3is0=fabs(_Yaxis.get(2))<tolerance;
00076 bool Z1is0=fabs(_Zaxis.get(0))<tolerance;
00077 bool Z2is0=fabs(_Zaxis.get(1))<tolerance;
00078 bool Z3is0=fabs(_Zaxis.get(2))<tolerance;
00079
00080 if(Y1is0 && Y3is0 && Z1is0 && Z2is0 ){
00081 _alpha=0; _beta=0; _gamma=0;
00082 return;
00083 }
00084
00085 if( Z1is0 && Z2is0 && !Y2is0){
00086 _alpha=0; _beta=0;
00087 _gamma=acos(_Yaxis.get(0)/_ry);
00088 if(_Yaxis.get(1)<0) _gamma=2*pi - _gamma;
00089 return;
00090 }
00091
00092
00093
00094
00095 if(Z1is0 && Z2is0) {
00096 _beta=0;
00097 } else{ _beta =acos(_Zaxis.get(2)/_rz);}
00098
00099
00100
00101 if(_beta==0){
00102 _alpha=0.0;
00103 }else {
00104 double cosalpha=_Zaxis.get(0)/_rz/sin(_beta);
00105 if(fabs(cosalpha)>1.0) cosalpha=cosalpha/fabs(cosalpha);
00106 _alpha=acos(cosalpha);
00107 if(_Zaxis.get(1)<0.0) _alpha=2*pi - _alpha;
00108 }
00109
00110
00111
00112 double singamma=_Yaxis.get(2)/_ry/sin(_beta);
00113 double cosgamma=(-_Yaxis.get(0)/_ry-cos(_alpha)*cos(_beta)*singamma)/sin(_alpha);
00114 if(fabs(singamma)>1.0) singamma=singamma/fabs(singamma);
00115 _gamma=asin(singamma);
00116 if(singamma>0 && cosgamma<0 ) _gamma=pi - _gamma;
00117 if(singamma<0 && cosgamma<0 ) _gamma=pi - _gamma;
00118 if(singamma<0 && cosgamma>0 ) _gamma=2*pi + _gamma;
00119
00120
00121 }