File indexing completed on 2025-12-14 10:30:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef ROOT_Math_GenVector_EulerAngles
0018 #define ROOT_Math_GenVector_EulerAngles 1
0019
0020 #include "Math/GenVector/Rotation3D.h"
0021 #include "Math/GenVector/DisplacementVector3D.h"
0022 #include "Math/GenVector/PositionVector3D.h"
0023 #include "Math/GenVector/LorentzVector.h"
0024 #include "Math/GenVector/3DConversions.h"
0025 #include "TMath.h"
0026 #include <algorithm>
0027 #include <cassert>
0028
0029 namespace ROOT {
0030 namespace Math {
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046 class EulerAngles {
0047
0048 public:
0049
0050 typedef double Scalar;
0051
0052
0053
0054
0055 constexpr EulerAngles() : fPhi(0.0), fTheta(0.0), fPsi(0.0) { }
0056
0057
0058
0059
0060 EulerAngles( Scalar phi, Scalar theta, Scalar psi ) :
0061 fPhi(phi), fTheta(theta), fPsi(psi)
0062 {Rectify();}
0063
0064
0065
0066
0067
0068
0069 template<class IT>
0070 constexpr EulerAngles(IT begin, IT end) { SetComponents(begin,end); }
0071
0072
0073
0074
0075
0076
0077 void Rectify();
0078
0079
0080
0081
0082
0083
0084
0085 template <class OtherRotation>
0086 explicit constexpr EulerAngles(const OtherRotation & r) {gv_detail::convert(r,*this);}
0087
0088
0089
0090
0091 template <class OtherRotation>
0092 EulerAngles & operator=( OtherRotation const & r ) {
0093 gv_detail::convert(r,*this);
0094 return *this;
0095 }
0096
0097 #ifdef OLD
0098 explicit EulerAngles(const Rotation3D & r) {gv_detail::convert(r,*this);}
0099
0100
0101
0102
0103 explicit EulerAngles(const Rotation3D & r) {gv_detail::convert(r,*this);}
0104
0105
0106
0107
0108 explicit EulerAngles(const Quaternion & q) {gv_detail::convert(q,*this);}
0109
0110
0111
0112
0113 explicit EulerAngles(const AxisAngle & a ) { gv_detail::convert(a, *this); }
0114
0115
0116
0117
0118 explicit EulerAngles( RotationZ const & r ) { gv_detail::convert(r, *this); }
0119 explicit EulerAngles( RotationY const & r ) { gv_detail::convert(r, *this); }
0120 explicit EulerAngles( RotationX const & r ) { gv_detail::convert(r, *this); }
0121
0122
0123
0124
0125
0126 EulerAngles &
0127 operator=( AxisAngle const & a ) { return operator=(EulerAngles(a)); }
0128
0129
0130
0131
0132 EulerAngles &
0133 operator=( Quaternion const & q ) {return operator=(EulerAngles(q)); }
0134
0135
0136
0137
0138 EulerAngles &
0139 operator=( RotationZ const & r ) { return operator=(EulerAngles(r)); }
0140 EulerAngles &
0141 operator=( RotationY const & r ) { return operator=(EulerAngles(r)); }
0142 EulerAngles &
0143 operator=( RotationX const & r ) { return operator=(EulerAngles(r)); }
0144
0145 #endif
0146
0147
0148
0149
0150
0151
0152
0153 template<class IT>
0154 void SetComponents(IT begin, IT end) {
0155 fPhi = *begin++;
0156 fTheta = *begin++;
0157 fPsi = *begin++;
0158 (void)end;
0159 assert(begin == end);
0160 Rectify();
0161 }
0162
0163
0164
0165
0166
0167 template<class IT>
0168 void GetComponents(IT begin, IT end) const {
0169 *begin++ = fPhi;
0170 *begin++ = fTheta;
0171 *begin++ = fPsi;
0172 (void)end;
0173 assert(begin == end);
0174 }
0175
0176
0177
0178
0179 template<class IT>
0180 void GetComponents(IT begin) const {
0181 *begin++ = fPhi;
0182 *begin++ = fTheta;
0183 *begin = fPsi;
0184 }
0185
0186
0187
0188
0189 void SetComponents(Scalar phi, Scalar theta, Scalar psi) {
0190 fPhi=phi; fTheta=theta; fPsi=psi;
0191 Rectify();
0192 }
0193
0194
0195
0196
0197 void GetComponents(Scalar & phi, Scalar & theta, Scalar & psi) const {
0198 phi=fPhi; theta=fTheta; psi=fPsi;
0199 }
0200
0201
0202
0203
0204 void SetPhi(Scalar phi) { fPhi=phi; Rectify(); }
0205
0206
0207
0208
0209 Scalar Phi() const { return fPhi; }
0210
0211
0212
0213
0214 void SetTheta(Scalar theta) { fTheta=theta; Rectify(); }
0215
0216
0217
0218
0219 Scalar Theta() const { return fTheta; }
0220
0221
0222
0223
0224 void SetPsi(Scalar psi) { fPsi=psi; Rectify(); }
0225
0226
0227
0228
0229 Scalar Psi() const { return fPsi; }
0230
0231
0232
0233
0234
0235
0236
0237 template <class CoordSystem, class U>
0238 DisplacementVector3D<CoordSystem,U>
0239 operator() (const DisplacementVector3D<CoordSystem,U> & v) const {
0240 return Rotation3D(*this) ( v );
0241 }
0242
0243
0244
0245
0246 template <class CoordSystem, class U>
0247 PositionVector3D<CoordSystem, U>
0248 operator() (const PositionVector3D<CoordSystem,U> & v) const {
0249 DisplacementVector3D< Cartesian3D<double>,U > xyz(v);
0250 DisplacementVector3D< Cartesian3D<double>,U > rxyz = operator()(xyz);
0251 return PositionVector3D<CoordSystem,U> ( rxyz );
0252 }
0253
0254
0255
0256
0257 template <class CoordSystem>
0258 LorentzVector<CoordSystem>
0259 operator() (const LorentzVector<CoordSystem> & v) const {
0260 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
0261 xyz = operator()(xyz);
0262 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
0263 return LorentzVector<CoordSystem> ( xyzt );
0264 }
0265
0266
0267
0268
0269
0270
0271 template <class ForeignVector>
0272 ForeignVector
0273 operator() (const ForeignVector & v) const {
0274 DisplacementVector3D< Cartesian3D<double> > xyz(v);
0275 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
0276 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
0277 }
0278
0279
0280
0281
0282 template <class AVector>
0283 inline
0284 AVector operator* (const AVector & v) const
0285 {
0286 return operator()(v);
0287 }
0288
0289
0290
0291
0292
0293
0294 void Invert() {
0295 Scalar tmp = -fPhi;
0296 fPhi = -fPsi + Pi();
0297 fPsi=tmp + Pi();
0298 }
0299
0300
0301
0302
0303 EulerAngles Inverse() const { return EulerAngles(-fPsi + Pi(), fTheta, -fPhi + Pi()); }
0304
0305
0306
0307
0308
0309
0310 EulerAngles operator * (const Rotation3D & r) const;
0311 EulerAngles operator * (const AxisAngle & a) const;
0312 EulerAngles operator * (const EulerAngles & e) const;
0313 EulerAngles operator * (const Quaternion & q) const;
0314 EulerAngles operator * (const RotationX & rx) const;
0315 EulerAngles operator * (const RotationY & ry) const;
0316 EulerAngles operator * (const RotationZ & rz) const;
0317
0318
0319
0320
0321 template <class R>
0322 EulerAngles & operator *= (const R & r) { return *this = (*this)*r; }
0323
0324
0325
0326
0327 template <class R>
0328 Scalar Distance ( const R & r ) const {return gv_detail::dist(*this,r);}
0329
0330
0331
0332
0333 bool operator == (const EulerAngles & rhs) const {
0334 if( fPhi != rhs.fPhi ) return false;
0335 if( fTheta != rhs.fTheta ) return false;
0336 if( fPsi != rhs.fPsi ) return false;
0337 return true;
0338 }
0339 bool operator != (const EulerAngles & rhs) const {
0340 return ! operator==(rhs);
0341 }
0342
0343 private:
0344
0345 double fPhi;
0346 double fTheta;
0347 double fPsi;
0348
0349 static double Pi() { return TMath::Pi(); }
0350
0351 };
0352
0353
0354
0355
0356 template <class R>
0357 inline
0358 typename EulerAngles::Scalar
0359 Distance ( const EulerAngles& r1, const R & r2) {return gv_detail::dist(r1,r2);}
0360
0361
0362
0363
0364 EulerAngles operator* (RotationX const & r1, EulerAngles const & r2);
0365 EulerAngles operator* (RotationY const & r1, EulerAngles const & r2);
0366 EulerAngles operator* (RotationZ const & r1, EulerAngles const & r2);
0367
0368
0369
0370
0371
0372
0373 std::ostream & operator<< (std::ostream & os, const EulerAngles & e);
0374
0375 }
0376 }
0377
0378
0379 #endif