File indexing completed on 2025-01-18 10:10:12
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017 #ifndef ROOT_Math_GenVector_RotationX
0018 #define ROOT_Math_GenVector_RotationX 1
0019
0020
0021 #include "Math/GenVector/Cartesian3D.h"
0022 #include "Math/GenVector/DisplacementVector3D.h"
0023 #include "Math/GenVector/PositionVector3D.h"
0024 #include "Math/GenVector/LorentzVector.h"
0025 #include "Math/GenVector/3DDistances.h"
0026
0027 #include "Math/GenVector/RotationXfwd.h"
0028
0029 #include <cmath>
0030
0031 namespace ROOT {
0032 namespace Math {
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045 class RotationX {
0046
0047 public:
0048
0049 typedef double Scalar;
0050
0051
0052
0053
0054
0055
0056
0057 RotationX() : fAngle(0), fSin(0), fCos(1) { }
0058
0059
0060
0061
0062 explicit RotationX( Scalar angle ) : fAngle(angle),
0063 fSin(std::sin(angle)),
0064 fCos(std::cos(angle))
0065 {
0066 Rectify();
0067 }
0068
0069
0070
0071
0072
0073
0074 void Rectify() {
0075 if ( std::fabs(fAngle) >= M_PI ) {
0076 double x = fAngle / (2.0 * M_PI);
0077 fAngle = (2.0 * M_PI) * ( x + std::floor(.5-x) );
0078 fSin = std::sin(fAngle);
0079 fCos = std::cos(fAngle);
0080 }
0081 }
0082
0083
0084
0085
0086
0087
0088 void SetAngle (Scalar angle) {
0089 fSin=std::sin(angle);
0090 fCos=std::cos(angle);
0091 fAngle= angle;
0092 Rectify();
0093 }
0094 void SetComponents (Scalar angle) { SetAngle(angle); }
0095
0096
0097
0098
0099 void GetAngle(Scalar &angle) const { using std::atan2; angle = atan2(fSin, fCos); }
0100 void GetComponents ( Scalar & angle ) const { GetAngle(angle); }
0101
0102
0103
0104
0105 Scalar Angle() const { using std::atan2; return atan2(fSin, fCos); }
0106
0107
0108
0109
0110 Scalar SinAngle () const { return fSin; }
0111 Scalar CosAngle () const { return fCos; }
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 template <class CoordSystem, class U>
0128 DisplacementVector3D<CoordSystem,U>
0129 operator() (const DisplacementVector3D<CoordSystem,U> & v) const {
0130 DisplacementVector3D< Cartesian3D<double>,U > xyz;
0131 xyz.SetXYZ( v.X(), fCos*v.Y()-fSin*v.Z(), fCos*v.Z()+fSin*v.Y() );
0132 return DisplacementVector3D<CoordSystem,U>(xyz);
0133 }
0134
0135
0136
0137
0138 template <class CoordSystem, class U>
0139 PositionVector3D<CoordSystem, U>
0140 operator() (const PositionVector3D<CoordSystem,U> & v) const {
0141 DisplacementVector3D< Cartesian3D<double>,U > xyz(v);
0142 DisplacementVector3D< Cartesian3D<double>,U > rxyz = operator()(xyz);
0143 return PositionVector3D<CoordSystem,U> ( rxyz );
0144 }
0145
0146
0147
0148
0149 template <class CoordSystem>
0150 LorentzVector<CoordSystem>
0151 operator() (const LorentzVector<CoordSystem> & v) const {
0152 DisplacementVector3D< Cartesian3D<double> > xyz(v.Vect());
0153 xyz = operator()(xyz);
0154 LorentzVector< PxPyPzE4D<double> > xyzt (xyz.X(), xyz.Y(), xyz.Z(), v.E());
0155 return LorentzVector<CoordSystem> ( xyzt );
0156 }
0157
0158
0159
0160
0161
0162
0163 template <class ForeignVector>
0164 ForeignVector
0165 operator() (const ForeignVector & v) const {
0166 DisplacementVector3D< Cartesian3D<double> > xyz(v);
0167 DisplacementVector3D< Cartesian3D<double> > rxyz = operator()(xyz);
0168 return ForeignVector ( rxyz.X(), rxyz.Y(), rxyz.Z() );
0169 }
0170
0171
0172
0173
0174 template <class AVector>
0175 inline
0176 AVector operator* (const AVector & v) const
0177 {
0178 return operator()(v);
0179 }
0180
0181
0182
0183
0184 void Invert() { fAngle = -fAngle; fSin = -fSin; }
0185
0186
0187
0188
0189 RotationX Inverse() const { RotationX t(*this); t.Invert(); return t; }
0190
0191
0192
0193
0194
0195
0196 RotationX operator * (const RotationX & r) const {
0197 RotationX ans;
0198 double x = (fAngle + r.fAngle) / (2.0 * M_PI);
0199 ans.fAngle = (2.0 * M_PI) * ( x + std::floor(.5-x) );
0200 ans.fSin = fSin*r.fCos + fCos*r.fSin;
0201 ans.fCos = fCos*r.fCos - fSin*r.fSin;
0202 return ans;
0203 }
0204
0205
0206
0207
0208 RotationX & operator *= (const RotationX & r) { return *this = (*this)*r; }
0209
0210
0211
0212
0213 bool operator == (const RotationX & rhs) const {
0214 if( fAngle != rhs.fAngle ) return false;
0215 return true;
0216 }
0217 bool operator != (const RotationX & rhs) const {
0218 return ! operator==(rhs);
0219 }
0220
0221 private:
0222
0223 Scalar fAngle;
0224 Scalar fSin;
0225 Scalar fCos;
0226
0227 };
0228
0229
0230
0231
0232
0233
0234 template <class R>
0235 inline
0236 typename RotationX::Scalar
0237 Distance ( const RotationX& r1, const R & r2) {return gv_detail::dist(r1,r2);}
0238
0239
0240
0241
0242
0243
0244 inline
0245 std::ostream & operator<< (std::ostream & os, const RotationX & r) {
0246 os << " RotationX(" << r.Angle() << ") ";
0247 return os;
0248 }
0249
0250
0251 }
0252 }
0253
0254 #endif