Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
RotationX.h
Go to the documentation of this file.
1// -*- C++ -*-
2// CLASSDOC OFF
3// ---------------------------------------------------------------------------
4// CLASSDOC ON
5//
6// This file is a part of the CLHEP - a Class Library for High Energy Physics.
7//
8// This is the definition of the HepRotationX class for performing rotations
9// around the X axis on objects of the Hep3Vector (and HepLorentzVector) class.
10//
11// HepRotationX is a concrete implementation of Hep3RotationInterface.
12//
13// .SS See Also
14// RotationInterfaces.h
15// ThreeVector.h, LorentzVector.h, LorentzRotation.h
16//
17// .SS Author
18// Mark Fischler
19
20#ifndef HEP_ROTATIONX_H
21#define HEP_ROTATIONX_H
22
24
25namespace CLHEP {
26
27class HepRotationX;
28
29class HepRotation;
30class HepBoost;
31
33// Returns the inverse of a RotationX.
34
35/**
36 * @author
37 * @ingroup vector
38 */
40
41public:
42
43 // ---------- Constructors and Assignment:
44
45 inline HepRotationX();
46 // Default constructor. Gives an identity rotation.
47
48 HepRotationX(double delta);
49 // supply angle of rotation
50
51 inline HepRotationX(const HepRotationX & orig);
52 inline HepRotationX(HepRotationX && orig) = default;
53 // Copy and move constructors.
54
56 inline HepRotationX & operator = (HepRotationX && r) = default;
57 // Copy and move assignments from a Rotation, which must be RotationX
58
59 HepRotationX & set ( double delta );
60 // set angle of rotation
61
62 inline ~HepRotationX();
63 // Trivial destructor.
64
65 // ---------- Accessors:
66
67 inline Hep3Vector colX() const;
68 inline Hep3Vector colY() const;
69 inline Hep3Vector colZ() const;
70 // orthogonal unit-length column vectors
71
72 inline Hep3Vector rowX() const;
73 inline Hep3Vector rowY() const;
74 inline Hep3Vector rowZ() const;
75 // orthogonal unit-length row vectors
76
77 inline double xx() const;
78 inline double xy() const;
79 inline double xz() const;
80 inline double yx() const;
81 inline double yy() const;
82 inline double yz() const;
83 inline double zx() const;
84 inline double zy() const;
85 inline double zz() const;
86 // Elements of the rotation matrix (Geant4).
87
88 inline HepRep3x3 rep3x3() const;
89 // 3x3 representation:
90
91 // ------------ Euler angles:
92 inline double getPhi () const;
93 inline double getTheta() const;
94 inline double getPsi () const;
95 double phi () const;
96 double theta() const;
97 double psi () const;
99
100 // ------------ axis & angle of rotation:
101 inline double getDelta() const;
102 inline Hep3Vector getAxis () const;
103 inline double delta() const;
104 inline Hep3Vector axis () const;
105 inline HepAxisAngle axisAngle() const;
106 inline void getAngleAxis(double & delta, Hep3Vector & axis) const;
107 // Returns the rotation angle and rotation axis (Geant4).
108
109 // ------------- Angles of rotated axes
110 double phiX() const;
111 double phiY() const;
112 double phiZ() const;
113 double thetaX() const;
114 double thetaY() const;
115 double thetaZ() const;
116 // Return angles (RADS) made by rotated axes against original axes (Geant4).
117
118 // ---------- Other accessors treating pure rotation as a 4-rotation
119
120 inline HepLorentzVector col1() const;
121 inline HepLorentzVector col2() const;
122 inline HepLorentzVector col3() const;
123 // orthosymplectic 4-vector columns - T component will be zero
124
125 inline HepLorentzVector col4() const;
126 // Will be (0,0,0,1) for this pure Rotation.
127
128 inline HepLorentzVector row1() const;
129 inline HepLorentzVector row2() const;
130 inline HepLorentzVector row3() const;
131 // orthosymplectic 4-vector rows - T component will be zero
132
133 inline HepLorentzVector row4() const;
134 // Will be (0,0,0,1) for this pure Rotation.
135
136 inline double xt() const;
137 inline double yt() const;
138 inline double zt() const;
139 inline double tx() const;
140 inline double ty() const;
141 inline double tz() const;
142 // Will be zero for this pure Rotation
143
144 inline double tt() const;
145 // Will be one for this pure Rotation
146
147 inline HepRep4x4 rep4x4() const;
148 // 4x4 representation.
149
150 // --------- Mutators
151
152 void setDelta (double delta);
153 // change angle of rotation, leaving rotation axis unchanged.
154
155 // ---------- Decomposition:
156
157 void decompose (HepAxisAngle & rotation, Hep3Vector & boost) const;
158 void decompose (Hep3Vector & boost, HepAxisAngle & rotation) const;
159 void decompose (HepRotation & rotation, HepBoost & boost) const;
160 void decompose (HepBoost & boost, HepRotation & rotation) const;
161 // These are trivial, as the boost vector is 0.
162
163 // ---------- Comparisons:
164
165 inline bool isIdentity() const;
166 // Returns true if the identity matrix (Geant4).
167
168 inline int compare( const HepRotationX & r ) const;
169 // Dictionary-order comparison, in order of delta
170 // Used in operator<, >, <=, >=
171
172 inline bool operator== ( const HepRotationX & r ) const;
173 inline bool operator!= ( const HepRotationX & r ) const;
174 inline bool operator< ( const HepRotationX & r ) const;
175 inline bool operator> ( const HepRotationX & r ) const;
176 inline bool operator<= ( const HepRotationX & r ) const;
177 inline bool operator>= ( const HepRotationX & r ) const;
178
179 double distance2( const HepRotationX & r ) const;
180 // 3 - Tr ( this/r )
181
182 double distance2( const HepRotation & r ) const;
183 // 3 - Tr ( this/r ) -- This works with RotationY or Z also
184
185 double howNear( const HepRotationX & r ) const;
186 double howNear( const HepRotation & r ) const;
187 bool isNear( const HepRotationX & r,
189 bool isNear( const HepRotation & r,
191
192 double distance2( const HepBoost & lt ) const;
193 // 3 - Tr ( this ) + |b|^2 / (1-|b|^2)
194 double distance2( const HepLorentzRotation & lt ) const;
195 // 3 - Tr ( this/r ) + |b|^2 / (1-|b|^2) where b is the boost vector of lt
196
197 double howNear( const HepBoost & lt ) const;
198 double howNear( const HepLorentzRotation & lt ) const;
199 bool isNear( const HepBoost & lt,
201 bool isNear( const HepLorentzRotation & lt,
203
204 // ---------- Properties:
205
206 double norm2() const;
207 // distance2 (IDENTITY), which is 3 - Tr ( *this )
208
209 inline void rectify();
210 // non-const but logically moot correction for accumulated roundoff errors
211
212 // ---------- Application:
213
214 inline Hep3Vector operator() (const Hep3Vector & p) const;
215 // Rotate a Hep3Vector.
216
217 inline Hep3Vector operator * (const Hep3Vector & p) const;
218 // Multiplication with a Hep3Vector.
219
221 // Rotate (the space part of) a HepLorentzVector.
222
224 // Multiplication with a HepLorentzVector.
225
226 // ---------- Operations in the group of Rotations
227
228 inline HepRotationX operator * (const HepRotationX & rx) const;
229 // Product of two X rotations: (this) * rx is known to be RotationX.
230
232 inline HepRotationX & transform (const HepRotationX & r);
233 // Matrix multiplication.
234 // Note a *= b; <=> a = a * b; while a.transform(b); <=> a = b * a;
235 // However, in this special case, they commute: Both just add deltas.
236
237 inline HepRotationX inverse() const;
238 // Returns the inverse.
239
241 // Returns the inverse of a RotationX.
242
244 // Inverts the Rotation matrix (be negating delta).
245
246 // ---------- I/O:
247
248 std::ostream & print( std::ostream & os ) const;
249 // Output, identifying type of rotation and delta.
250
251 // ---------- Tolerance
252
253 static inline double getTolerance();
254 static inline double setTolerance(double tol);
255
256protected:
257
258 double its_d;
259 // The angle of rotation.
260
261 double its_s;
262 double its_c;
263 // Cache the trig functions, for rapid operations.
264
265 inline HepRotationX ( double dd, double ss, double cc );
266 // Unchecked load-the-data-members
267
268 static inline double proper (double delta);
269 // Put an angle into the range of (-PI, PI]. Useful helper method.
270
271}; // HepRotationX
272// ---------- Free-function operations in the group of Rotations
273
274inline
275std::ostream & operator <<
276 ( std::ostream & os, const HepRotationX & r ) {return r.print(os);}
277
278} // namespace CLHEP
279
280#include "CLHEP/Vector/RotationX.icc"
281
282#endif /* HEP_ROTATIONX_H */
G4double epsilon(G4double density, G4double temperature)
static DLL_API double tolerance
double phiX() const
Definition: RotationX.cc:70
double tt() const
HepRotationX(double dd, double ss, double cc)
HepLorentzVector row4() const
double xy() const
friend HepRotationX inverseOf(const HepRotationX &r)
HepRotationX inverse() const
static double getTolerance()
HepLorentzVector col1() const
HepRotationX(const HepRotationX &orig)
double getPsi() const
double thetaZ() const
Definition: RotationX.cc:94
double xx() const
double phiY() const
Definition: RotationX.cc:75
Hep3Vector rowX() const
double yz() const
HepRotationX & transform(const HepRotationX &r)
HepLorentzVector col3() const
double tx() const
HepRep4x4 rep4x4() const
static double proper(double delta)
HepRotationX(HepRotationX &&orig)=default
bool operator>=(const HepRotationX &r) const
double delta() const
Hep3Vector colZ() const
double zy() const
HepRotationX & set(double delta)
Definition: RotationX.cc:31
HepLorentzVector col2() const
Hep3Vector rowY() const
HepEulerAngles eulerAngles() const
Definition: RotationX.cc:58
int compare(const HepRotationX &r) const
HepRep3x3 rep3x3() const
double getDelta() const
double psi() const
Definition: RotationX.cc:50
double getPhi() const
double howNear(const HepRotationX &r) const
Definition: RotationX.cc:154
bool operator!=(const HepRotationX &r) const
Hep3Vector rowZ() const
void setDelta(double delta)
Definition: RotationX.cc:99
double yy() const
double phi() const
Definition: RotationX.cc:38
double thetaY() const
Definition: RotationX.cc:90
double xz() const
HepRotationX & operator=(const HepRotationX &r)
double phiZ() const
Definition: RotationX.cc:80
void getAngleAxis(double &delta, Hep3Vector &axis) const
double ty() const
double xt() const
double thetaX() const
Definition: RotationX.cc:85
Hep3Vector axis() const
double tz() const
bool operator==(const HepRotationX &r) const
bool operator<=(const HepRotationX &r) const
HepLorentzVector col4() const
HepRotationX & operator*=(const HepRotationX &r)
double yt() const
void decompose(HepAxisAngle &rotation, Hep3Vector &boost) const
Definition: RotationX.cc:104
HepAxisAngle axisAngle() const
std::ostream & print(std::ostream &os) const
Definition: RotationX.cc:185
bool isNear(const HepRotationX &r, double epsilon=Hep4RotationInterface::tolerance) const
Definition: RotationX.cc:166
HepLorentzVector row3() const
HepLorentzVector row2() const
Hep3Vector operator()(const Hep3Vector &p) const
double theta() const
Definition: RotationX.cc:46
double getTheta() const
Hep3Vector colY() const
double zz() const
bool isIdentity() const
HepLorentzVector operator()(const HepLorentzVector &w) const
Hep3Vector getAxis() const
Hep3Vector operator*(const Hep3Vector &p) const
bool operator<(const HepRotationX &r) const
HepLorentzVector row1() const
double distance2(const HepRotationX &r) const
Definition: RotationX.cc:127
Hep3Vector colX() const
double norm2() const
Definition: RotationX.cc:181
double yx() const
HepRotationX & invert()
double zt() const
double zx() const
bool operator>(const HepRotationX &r) const
static double setTolerance(double tol)
Definition: DoubConv.h:17
HepBoost inverseOf(const HepBoost &lt)