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
ThreeVector.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// Hep3Vector is a general 3-vector class defining vectors in three
9// dimension using double components. Rotations of these vectors are
10// performed by multiplying with an object of the HepRotation class.
11//
12// .SS See Also
13// LorentzVector.h, Rotation.h, LorentzRotation.h
14//
15// .SS Authors
16// Leif Lonnblad and Anders Nilsson; Modified by Evgueni Tcherniaev;
17// ZOOM additions by Mark Fischler
18//
19
20#ifndef HEP_THREEVECTOR_H
21#define HEP_THREEVECTOR_H
22
23#include <iostream>
24#include "CLHEP/Utility/defs.h"
25
26namespace CLHEP {
27
28class HepRotation;
29class HepEulerAngles;
30class HepAxisAngle;
31
32/**
33 * @author
34 * @ingroup vector
35 */
37
38public:
39
40// Basic properties and operations on 3-vectors:
41
42 enum { X=0, Y=1, Z=2, NUM_COORDINATES=3, SIZE=NUM_COORDINATES };
43 // Safe indexing of the coordinates when using with matrices, arrays, etc.
44 // (BaBar)
45
47 explicit Hep3Vector(double x);
48 Hep3Vector(double x, double y);
49 Hep3Vector(double x, double y, double z);
50 // The constructor.
51
52 inline Hep3Vector(const Hep3Vector &);
53 inline Hep3Vector(Hep3Vector &&) = default;
54 // The copy and move constructors.
55
56 inline ~Hep3Vector();
57 // The destructor. Not virtual - inheritance from this class is dangerous.
58
59 inline double operator () (int) const;
60 // Get components by index -- 0-based (Geant4)
61
62 inline double operator [] (int) const;
63 // Get components by index -- 0-based (Geant4)
64
65 inline double & operator () (int);
66 // Set components by index. 0-based.
67
68 inline double & operator [] (int);
69 // Set components by index. 0-based.
70
71 inline double x() const;
72 inline double y() const;
73 inline double z() const;
74 // The components in cartesian coordinate system. Same as getX() etc.
75
76 inline void setX(double);
77 inline void setY(double);
78 inline void setZ(double);
79 // Set the components in cartesian coordinate system.
80
81 inline void set( double x, double y, double z);
82 // Set all three components in cartesian coordinate system.
83
84 inline double phi() const;
85 // The azimuth angle.
86
87 inline double theta() const;
88 // The polar angle.
89
90 inline double cosTheta() const;
91 // Cosine of the polar angle.
92
93 inline double cos2Theta() const;
94 // Cosine squared of the polar angle - faster than cosTheta(). (ZOOM)
95
96 inline double mag2() const;
97 // The magnitude squared (r^2 in spherical coordinate system).
98
99 inline double mag() const;
100 // The magnitude (r in spherical coordinate system).
101
102 inline void setPhi(double);
103 // Set phi keeping mag and theta constant (BaBar).
104
105 inline void setTheta(double);
106 // Set theta keeping mag and phi constant (BaBar).
107
108 void setMag(double);
109 // Set magnitude keeping theta and phi constant (BaBar).
110
111 inline double perp2() const;
112 // The transverse component squared (rho^2 in cylindrical coordinate system).
113
114 inline double perp() const;
115 // The transverse component (rho in cylindrical coordinate system).
116
117 inline void setPerp(double);
118 // Set the transverse component keeping phi and z constant.
119
120 void setCylTheta(double);
121 // Set theta while keeping transvers component and phi fixed
122
123 inline double perp2(const Hep3Vector &) const;
124 // The transverse component w.r.t. given axis squared.
125
126 inline double perp(const Hep3Vector &) const;
127 // The transverse component w.r.t. given axis.
128
130 inline Hep3Vector & operator = (Hep3Vector &&) = default;
131 // The copy and move assignment operators.
132
133 inline bool operator == (const Hep3Vector &) const;
134 inline bool operator != (const Hep3Vector &) const;
135 // Comparisons (Geant4).
136
137 bool isNear (const Hep3Vector &, double epsilon=tolerance) const;
138 // Check for equality within RELATIVE tolerance (default 2.2E-14). (ZOOM)
139 // |v1 - v2|**2 <= epsilon**2 * |v1.dot(v2)|
140
141 double howNear(const Hep3Vector & v ) const;
142 // sqrt ( |v1-v2|**2 / v1.dot(v2) ) with a maximum of 1.
143 // If v1.dot(v2) is negative, will return 1.
144
145 double deltaR(const Hep3Vector & v) const;
146 // sqrt( pseudorapity_difference**2 + deltaPhi **2 )
147
149 // Addition.
150
152 // Subtraction.
153
154 inline Hep3Vector operator - () const;
155 // Unary minus.
156
157 inline Hep3Vector & operator *= (double);
158 // Scaling with real numbers.
159
160 Hep3Vector & operator /= (double);
161 // Division by (non-zero) real number.
162
163 inline Hep3Vector unit() const;
164 // Vector parallel to this, but of length 1.
165
166 inline Hep3Vector orthogonal() const;
167 // Vector orthogonal to this (Geant4).
168
169 inline double dot(const Hep3Vector &) const;
170 // double product.
171
172 inline Hep3Vector cross(const Hep3Vector &) const;
173 // Cross product.
174
175 double angle(const Hep3Vector &) const;
176 // The angle w.r.t. another 3-vector.
177
178 double pseudoRapidity() const;
179 // Returns the pseudo-rapidity, i.e. -ln(tan(theta/2))
180
181 void setEta ( double p );
182 // Set pseudo-rapidity, keeping magnitude and phi fixed. (ZOOM)
183
184 void setCylEta ( double p );
185 // Set pseudo-rapidity, keeping transverse component and phi fixed. (ZOOM)
186
187 Hep3Vector & rotateX(double);
188 // Rotates the Hep3Vector around the x-axis.
189
190 Hep3Vector & rotateY(double);
191 // Rotates the Hep3Vector around the y-axis.
192
193 Hep3Vector & rotateZ(double);
194 // Rotates the Hep3Vector around the z-axis.
195
197 // Rotates reference frame from Uz to newUz (unit vector) (Geant4).
198
199 Hep3Vector & rotate(double, const Hep3Vector &);
200 // Rotates around the axis specified by another Hep3Vector.
201 // (Uses methods of HepRotation, forcing linking in of Rotation.cc.)
202
205 // Transformation with a Rotation matrix.
206
207// = = = = = = = = = = = = = = = = = = = = = = = =
208//
209// Esoteric properties and operations on 3-vectors:
210//
211// 1 - Set vectors in various coordinate systems
212// 2 - Synonyms for accessing coordinates and properties
213// 3 - Comparisions (dictionary, near-ness, and geometric)
214// 4 - Intrinsic properties
215// 5 - Properties releative to z axis and arbitrary directions
216// 6 - Polar and azimuthal angle decomposition and deltaPhi
217// 7 - Rotations
218//
219// = = = = = = = = = = = = = = = = = = = = = = = =
220
221// 1 - Set vectors in various coordinate systems
222
223 inline void setRThetaPhi (double r, double theta, double phi);
224 // Set in spherical coordinates: Angles are measured in RADIANS
225
226 inline void setREtaPhi ( double r, double eta, double phi );
227 // Set in spherical coordinates, but specify peudorapidiy to determine theta.
228
229 inline void setRhoPhiZ (double rho, double phi, double z);
230 // Set in cylindrical coordinates: Phi angle is measured in RADIANS
231
232 void setRhoPhiTheta ( double rho, double phi, double theta);
233 // Set in cylindrical coordinates, but specify theta to determine z.
234
235 void setRhoPhiEta ( double rho, double phi, double eta);
236 // Set in cylindrical coordinates, but specify pseudorapidity to determine z.
237
238// 2 - Synonyms for accessing coordinates and properties
239
240 inline double getX() const;
241 inline double getY() const;
242 inline double getZ() const;
243 // x(), y(), and z()
244
245 inline double getR () const;
246 inline double getTheta() const;
247 inline double getPhi () const;
248 // mag(), theta(), and phi()
249
250 inline double r () const;
251 // mag()
252
253 inline double rho () const;
254 inline double getRho () const;
255 // perp()
256
257 double eta () const;
258 double getEta () const;
259 // pseudoRapidity()
260
261 inline void setR ( double s );
262 // setMag()
263
264 inline void setRho ( double s );
265 // setPerp()
266
267// 3 - Comparisions (dictionary, near-ness, and geometric)
268
269 int compare (const Hep3Vector & v) const;
270 bool operator > (const Hep3Vector & v) const;
271 bool operator < (const Hep3Vector & v) const;
272 bool operator>= (const Hep3Vector & v) const;
273 bool operator<= (const Hep3Vector & v) const;
274 // dictionary ordering according to z, then y, then x component
275
276 inline double diff2 (const Hep3Vector & v) const;
277 // |v1-v2|**2
278
279 static double setTolerance (double tol);
280 static inline double getTolerance ();
281 // Set the tolerance used in isNear() for Hep3Vectors
282
283 bool isParallel (const Hep3Vector & v, double epsilon=tolerance) const;
284 // Are the vectors parallel, within the given tolerance?
285
286 bool isOrthogonal (const Hep3Vector & v, double epsilon=tolerance) const;
287 // Are the vectors orthogonal, within the given tolerance?
288
289 double howParallel (const Hep3Vector & v) const;
290 // | v1.cross(v2) / v1.dot(v2) |, to a maximum of 1.
291
292 double howOrthogonal (const Hep3Vector & v) const;
293 // | v1.dot(v2) / v1.cross(v2) |, to a maximum of 1.
294
295 enum { ToleranceTicks = 100 };
296
297// 4 - Intrinsic properties
298
299 double beta () const;
300 // relativistic beta (considering v as a velocity vector with c=1)
301 // Same as mag() but will object if >= 1
302
303 double gamma() const;
304 // relativistic gamma (considering v as a velocity vector with c=1)
305
306 double coLinearRapidity() const;
307 // inverse tanh (beta)
308
309// 5 - Properties relative to Z axis and to an arbitrary direction
310
311 // Note that the non-esoteric CLHEP provides
312 // theta(), cosTheta(), cos2Theta, and angle(const Hep3Vector&)
313
314 inline double angle() const;
315 // angle against the Z axis -- synonym for theta()
316
317 inline double theta(const Hep3Vector & v2) const;
318 // synonym for angle(v2)
319
320 double cosTheta (const Hep3Vector & v2) const;
321 double cos2Theta(const Hep3Vector & v2) const;
322 // cos and cos^2 of the angle between two vectors
323
324 inline Hep3Vector project () const;
325 Hep3Vector project (const Hep3Vector & v2) const;
326 // projection of a vector along a direction.
327
328 inline Hep3Vector perpPart() const;
329 inline Hep3Vector perpPart (const Hep3Vector & v2) const;
330 // vector minus its projection along a direction.
331
332 double rapidity () const;
333 // inverse tanh(v.z())
334
335 double rapidity (const Hep3Vector & v2) const;
336 // rapidity with respect to specified direction:
337 // inverse tanh (v.dot(u)) where u is a unit in the direction of v2
338
339 double eta(const Hep3Vector & v2) const;
340 // - ln tan of the angle beween the vector and the ref direction.
341
342// 6 - Polar and azimuthal angle decomposition and deltaPhi
343
344 // Decomposition of an angle within reference defined by a direction:
345
346 double polarAngle (const Hep3Vector & v2) const;
347 // The reference direction is Z: the polarAngle is abs(v.theta()-v2.theta()).
348
349 double deltaPhi (const Hep3Vector & v2) const;
350 // v.phi()-v2.phi(), brought into the range (-PI,PI]
351
352 double azimAngle (const Hep3Vector & v2) const;
353 // The reference direction is Z: the azimAngle is the same as deltaPhi
354
355 double polarAngle (const Hep3Vector & v2,
356 const Hep3Vector & ref) const;
357 // For arbitrary reference direction,
358 // polarAngle is abs(v.angle(ref) - v2.angle(ref)).
359
360 double azimAngle (const Hep3Vector & v2,
361 const Hep3Vector & ref) const;
362 // To compute azimangle, project v and v2 into the plane normal to
363 // the reference direction. Then in that plane take the angle going
364 // clockwise around the direction from projection of v to that of v2.
365
366// 7 - Rotations
367
368// These mehtods **DO NOT** use anything in the HepRotation class.
369// Thus, use of v.rotate(axis,delta) does not force linking in Rotation.cc.
370
371 Hep3Vector & rotate (const Hep3Vector & axis, double delta);
372 // Synonym for rotate (delta, axis)
373
374 Hep3Vector & rotate (const HepAxisAngle & ax);
375 // HepAxisAngle is a struct holding an axis direction and an angle.
376
377 Hep3Vector & rotate (const HepEulerAngles & e);
378 Hep3Vector & rotate (double phi,
379 double theta,
380 double psi);
381 // Rotate via Euler Angles. Our Euler Angles conventions are
382 // those of Goldstein Classical Mechanics page 107.
383
384protected:
385 void setSpherical (double r, double theta, double phi);
386 void setCylindrical (double r, double phi, double z);
387 double negativeInfinity() const;
388
389protected:
390
391 double data[3];
392 // The components.
393
394 DLL_API static double tolerance;
395 // default tolerance criterion for isNear() to return true.
396}; // Hep3Vector
397
398// Global Methods
399
400Hep3Vector rotationXOf (const Hep3Vector & vec, double delta);
401Hep3Vector rotationYOf (const Hep3Vector & vec, double delta);
402Hep3Vector rotationZOf (const Hep3Vector & vec, double delta);
403
404Hep3Vector rotationOf (const Hep3Vector & vec,
405 const Hep3Vector & axis, double delta);
406Hep3Vector rotationOf (const Hep3Vector & vec, const HepAxisAngle & ax);
407
408Hep3Vector rotationOf (const Hep3Vector & vec,
409 double phi, double theta, double psi);
410Hep3Vector rotationOf (const Hep3Vector & vec, const HepEulerAngles & e);
411// Return a new vector based on a rotation of the supplied vector
412
413std::ostream & operator << (std::ostream &, const Hep3Vector &);
414// Output to a stream.
415
416std::istream & operator >> (std::istream &, Hep3Vector &);
417// Input from a stream.
418
420
423
424Hep3Vector operator / (const Hep3Vector &, double a);
425// Division of 3-vectors by non-zero real number
426
428// Addition of 3-vectors.
429
431// Subtraction of 3-vectors.
432
433inline double operator * (const Hep3Vector &, const Hep3Vector &);
434// double product of 3-vectors.
435
436inline Hep3Vector operator * (const Hep3Vector &, double a);
437inline Hep3Vector operator * (double a, const Hep3Vector &);
438// Scaling of 3-vectors with a real number
439
440} // namespace CLHEP
441
442#include "CLHEP/Vector/ThreeVector.icc"
443
444#endif /* HEP_THREEVECTOR_H */
G4double epsilon(G4double density, G4double temperature)
Hep3Vector & operator-=(const Hep3Vector &)
Hep3Vector & rotateY(double)
Definition: ThreeVector.cc:97
double beta() const
Definition: SpaceVectorP.cc:26
double z() const
void setEta(double p)
Definition: ThreeVector.cc:180
double azimAngle(const Hep3Vector &v2) const
Hep3Vector & rotateX(double)
Definition: ThreeVector.cc:87
Hep3Vector unit() const
double eta() const
double phi() const
Hep3Vector orthogonal() const
void setPerp(double)
void setRhoPhiEta(double rho, double phi, double eta)
Definition: SpaceVector.cc:94
bool operator>=(const Hep3Vector &v) const
Definition: SpaceVector.cc:143
double getZ() const
Hep3Vector(const Hep3Vector &)
double cos2Theta() const
double operator()(int) const
static DLL_API double tolerance
Definition: ThreeVector.h:394
double theta() const
double x() const
void setY(double)
double mag2() const
double getR() const
Hep3Vector & rotateZ(double)
Definition: ThreeVector.cc:107
double diff2(const Hep3Vector &v) const
Hep3Vector & operator/=(double)
Definition: ThreeVector.cc:307
double y() const
double getTheta() const
void setCylEta(double p)
Definition: ThreeVector.cc:256
void setRhoPhiZ(double rho, double phi, double z)
void setSpherical(double r, double theta, double phi)
Definition: SpaceVector.cc:31
Hep3Vector cross(const Hep3Vector &) const
double operator[](int) const
void setRThetaPhi(double r, double theta, double phi)
double angle(const Hep3Vector &) const
Hep3Vector & operator=(const Hep3Vector &)
void setR(double s)
double howNear(const Hep3Vector &v) const
Definition: ThreeVector.cc:122
double dot(const Hep3Vector &) const
Hep3Vector perpPart(const Hep3Vector &v2) const
double perp2() const
void setTheta(double)
void setZ(double)
double perp(const Hep3Vector &) const
bool operator>(const Hep3Vector &v) const
Definition: SpaceVector.cc:137
bool isOrthogonal(const Hep3Vector &v, double epsilon=tolerance) const
Definition: SpaceVector.cc:233
double negativeInfinity() const
Definition: SpaceVector.cc:279
Hep3Vector perpPart() const
static double setTolerance(double tol)
Definition: SpaceVector.cc:267
static double getTolerance()
bool operator!=(const Hep3Vector &) const
double mag() const
Hep3Vector(double x, double y, double z)
Hep3Vector & operator*=(double)
bool isNear(const Hep3Vector &, double epsilon=tolerance) const
Definition: ThreeVector.cc:117
double pseudoRapidity() const
Definition: ThreeVector.cc:55
Hep3Vector & transform(const HepRotation &)
Definition: ThreeVectorR.cc:20
double getEta() const
bool operator<=(const Hep3Vector &v) const
Definition: SpaceVector.cc:146
double rapidity() const
Definition: SpaceVectorP.cc:50
double getRho() const
double deltaPhi(const Hep3Vector &v2) const
Definition: ThreeVector.cc:135
double theta(const Hep3Vector &v2) const
void setCylindrical(double r, double phi, double z)
Definition: SpaceVector.cc:52
Hep3Vector(Hep3Vector &&)=default
void set(double x, double y, double z)
double coLinearRapidity() const
Definition: SpaceVectorP.cc:65
int compare(const Hep3Vector &v) const
Definition: SpaceVector.cc:118
void setMag(double)
Definition: ThreeVector.cc:20
double getX() const
double howParallel(const Hep3Vector &v) const
Definition: SpaceVector.cc:164
double getPhi() const
double howOrthogonal(const Hep3Vector &v) const
Definition: SpaceVector.cc:215
double angle() const
Hep3Vector operator-() const
bool operator==(const Hep3Vector &) const
double deltaR(const Hep3Vector &v) const
Definition: ThreeVector.cc:145
void setX(double)
void setREtaPhi(double r, double eta, double phi)
void setRhoPhiTheta(double rho, double phi, double theta)
Definition: SpaceVector.cc:67
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:33
double cosTheta() const
Hep3Vector & rotate(double, const Hep3Vector &)
Definition: ThreeVectorR.cc:24
void setPhi(double)
double gamma() const
Definition: SpaceVectorP.cc:35
double perp() const
void setCylTheta(double)
Definition: ThreeVector.cc:208
bool operator<(const Hep3Vector &v) const
Definition: SpaceVector.cc:140
double polarAngle(const Hep3Vector &v2) const
Definition: SpaceVectorD.cc:24
void setRho(double s)
Hep3Vector(double x, double y)
Hep3Vector & operator+=(const Hep3Vector &)
Hep3Vector(double x)
bool isParallel(const Hep3Vector &v, double epsilon=tolerance) const
Definition: SpaceVector.cc:180
Hep3Vector project() const
double rho() const
double getY() const
double perp2(const Hep3Vector &) const
double r() const
#define DLL_API
Definition: defs.h:19
Definition: DoubConv.h:17
HepLorentzVector rotationYOf(const HepLorentzVector &vec, double delta)
Hep3Vector operator-(const Hep3Vector &, const Hep3Vector &)
Hep3Vector operator+(const Hep3Vector &, const Hep3Vector &)
HepLorentzVector rotationXOf(const HepLorentzVector &vec, double delta)
HepLorentzRotation operator*(const HepRotation &r, const HepLorentzRotation &lt)
DLL_API const Hep3Vector HepZHat
Definition: ThreeVector.h:419
std::istream & operator>>(std::istream &is, HepRandom &dist)
Definition: Random.cc:223
HepLorentzVector rotationZOf(const HepLorentzVector &vec, double delta)
HepLorentzVector rotationOf(const HepLorentzVector &vec, const Hep3Vector &axis, double delta)
DLL_API const Hep3Vector HepXHat
Hep3Vector HepThreeVectorF
Definition: ThreeVector.h:422
Hep3Vector HepThreeVectorD
Definition: ThreeVector.h:421
DLL_API const Hep3Vector HepYHat
Definition: ThreeVector.h:419
std::ostream & operator<<(std::ostream &os, const HepRandom &dist)
Definition: Random.cc:219
HepLorentzVector operator/(const HepLorentzVector &, double a)