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