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