17 #ifndef ROOT_Math_GenVector_EulerAngles
18 #define ROOT_Math_GenVector_EulerAngles 1
47 typedef double Scalar;
52 EulerAngles() : fPhi(0.0), fTheta(0.0), fPsi(0.0) { }
57 EulerAngles( Scalar phi, Scalar theta, Scalar psi ) :
58 fPhi(phi), fTheta(theta), fPsi(psi)
67 EulerAngles(IT begin, IT end) { SetComponents(begin,end); }
82 template <
class OtherRotation>
83 explicit EulerAngles(
const OtherRotation & r) {gv_detail::convert(r,*
this);}
88 template <
class OtherRotation>
89 EulerAngles & operator=( OtherRotation
const & r ) {
90 gv_detail::convert(r,*
this);
95 explicit EulerAngles(
const Rotation3D & r) {gv_detail::convert(r,*
this);}
100 explicit EulerAngles(
const Rotation3D & r) {gv_detail::convert(r,*
this);}
105 explicit EulerAngles(
const Quaternion & q) {gv_detail::convert(q,*
this);}
110 explicit EulerAngles(
const AxisAngle & a ) { gv_detail::convert(a, *
this); }
115 explicit EulerAngles( RotationZ
const & r ) { gv_detail::convert(r, *
this); }
116 explicit EulerAngles( RotationY
const & r ) { gv_detail::convert(r, *
this); }
117 explicit EulerAngles( RotationX
const & r ) { gv_detail::convert(r, *
this); }
124 operator=( AxisAngle
const & a ) {
return operator=(EulerAngles(a)); }
130 operator=( Quaternion
const & q ) {
return operator=(EulerAngles(q)); }
136 operator=( RotationZ
const & r ) {
return operator=(EulerAngles(r)); }
138 operator=( RotationY
const & r ) {
return operator=(EulerAngles(r)); }
140 operator=( RotationX
const & r ) {
return operator=(EulerAngles(r)); }
152 void SetComponents(IT begin, IT end) {
154 void SetComponents(IT begin, IT ) {
159 assert(begin == end);
169 void GetComponents(IT begin, IT end)
const {
171 void GetComponents(IT begin, IT )
const {
176 assert(begin == end);
183 void GetComponents(IT begin)
const {
192 void SetComponents(Scalar phi, Scalar theta, Scalar psi) {
193 fPhi=phi; fTheta=theta; fPsi=psi;
200 void GetComponents(Scalar & phi, Scalar & theta, Scalar & psi)
const {
201 phi=fPhi; theta=fTheta; psi=fPsi;
207 void SetPhi(Scalar phi) { fPhi=phi; Rectify(); }
212 Scalar Phi()
const {
return fPhi; }
217 void SetTheta(Scalar theta) { fTheta=theta; Rectify(); }
222 Scalar Theta()
const {
return fTheta; }
227 void SetPsi(Scalar psi) { fPsi=psi; Rectify(); }
232 Scalar Psi()
const {
return fPsi; }
240 template <
class CoordSystem,
class U>
241 DisplacementVector3D<CoordSystem,U>
242 operator() (
const DisplacementVector3D<CoordSystem,U> & v)
const {
243 return Rotation3D(*
this) ( v );
249 template <
class CoordSystem,
class U>
250 PositionVector3D<CoordSystem, U>
251 operator() (
const PositionVector3D<CoordSystem,U> & v)
const {
252 DisplacementVector3D< Cartesian3D<double>,U > xyz(v);
253 DisplacementVector3D< Cartesian3D<double>,U > rxyz = operator()(xyz);
254 return PositionVector3D<CoordSystem,U> ( rxyz );
260 template <
class CoordSystem>
261 LorentzVector<CoordSystem>
262 operator() (
const LorentzVector<CoordSystem> & v)
const {
263 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
264 xyz = operator()(xyz);
265 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
266 return LorentzVector<CoordSystem> ( xyzt );
274 template <
class ForeignVector>
276 operator() (
const ForeignVector & v)
const {
277 DisplacementVector3D< Cartesian3D<double> > xyz(v);
278 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
279 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
285 template <
class AVector>
287 AVector operator* (
const AVector & v)
const
289 return operator()(v);
306 EulerAngles Inverse()
const {
return EulerAngles(-fPsi + Pi(), fTheta, -fPhi + Pi()); }
313 EulerAngles operator * (
const Rotation3D & r)
const;
314 EulerAngles operator * (
const AxisAngle & a)
const;
315 EulerAngles operator * (
const EulerAngles & e)
const;
316 EulerAngles operator * (
const Quaternion & q)
const;
317 EulerAngles operator * (
const RotationX & rx)
const;
318 EulerAngles operator * (
const RotationY & ry)
const;
319 EulerAngles operator * (
const RotationZ & rz)
const;
325 EulerAngles & operator *= (
const R & r) {
return *
this = (*this)*r; }
331 Scalar Distance (
const R & r )
const {
return gv_detail::dist(*
this,r);}
336 bool operator == (
const EulerAngles & rhs)
const {
337 if( fPhi != rhs.fPhi )
return false;
338 if( fTheta != rhs.fTheta )
return false;
339 if( fPsi != rhs.fPsi )
return false;
342 bool operator != (
const EulerAngles & rhs)
const {
343 return ! operator==(rhs);
352 static double Pi() {
return M_PI; }
361 typename EulerAngles::Scalar
362 Distance (
const EulerAngles& r1,
const R & r2) {
return gv_detail::dist(r1,r2);}
367 EulerAngles operator* (RotationX
const & r1, EulerAngles
const & r2);
368 EulerAngles operator* (RotationY
const & r1, EulerAngles
const & r2);
369 EulerAngles operator* (RotationZ
const & r1, EulerAngles
const & r2);
376 std::ostream & operator<< (std::ostream & os,
const EulerAngles & e);