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
EulerAngles.cc
Go to the documentation of this file.
1// ----------------------------------------------------------------------
2//
3// EulerAngles.cc
4//
5// Methods for classes, and instances of globals, declared in EulerAngles.h
6//
7// History:
8//
9// 04-Dec-1997 MF Stub with just PI
10// 12-Jan-1998 WEB PI now found in ZMutility; used ZMutility headers
11// where available
12// 16-Mar-1998 WEB Corrected ZMpvEulerAnglesRep
13// 15-Jun-1998 WEB Added namespace support
14// 26-Jul-2000 MF CLHEP version
15// 12-Apr-2001 MF NaN-proofing
16// 19-Nov-2001 MF Correction to ZMpvEulerAnglesRep, which was affecting
17// .isNear(). array[3] had been incorrect.
18// Note - the correct form was used in all other places
19// including Rotation.set(phi, theta, psi).
20//
21// ----------------------------------------------------------------------
22
23
25
27
28#include <cmath>
29#include <iostream>
30
31namespace CLHEP {
32
33//-*************
34// static consts
35//-*************
36
38
39//-*******************
40// measure of distance
41//-*******************
42
43
44static void ZMpvEulerAnglesRep ( const HepEulerAngles & ex, double array[] ) {
45
46 double sinPhi = std::sin( ex.phi() ) , cosPhi = std::cos( ex.phi() );
47 double sinTheta = std::sin( ex.theta() ), cosTheta = std::cos( ex.theta() );
48 double sinPsi = std::sin( ex.psi() ) , cosPsi = std::cos( ex.psi() );
49
50 array[0] = cosPsi * cosPhi - sinPsi * cosTheta * sinPhi;
51 array[1] = cosPsi * sinPhi + sinPsi * cosTheta * cosPhi;
52 array[2] = sinPsi * sinTheta;
53
54 array[3] = - sinPsi * cosPhi - cosPsi * cosTheta * sinPhi;
55 array[4] = - sinPsi * sinPhi + cosPsi * cosTheta * cosPhi;
56 array[5] = cosPsi * sinTheta;
57
58 array[6] = sinTheta * sinPhi;
59 array[7] = - sinTheta * cosPhi;
60 array[8] = cosTheta;
61
62} // ZMpvEulerAnglesRep
63
64
65double HepEulerAngles::distance( const EA & ex ) const {
66
67 double thisRep[9];
68 double exRep[9];
69
70 ZMpvEulerAnglesRep ( *this, thisRep );
71 ZMpvEulerAnglesRep ( ex, exRep );
72
73 double sum = 0.0;
74 for (int i = 0; i < 9; i++) {
75 sum += thisRep[i] * exRep[i];
76 }
77
78 double d = 3.0 - sum; // NaN-proofing:
79 return (d >= 0) ? d : 0; // sqrt(distance) is used in howNear()
80
81} // HepEulerAngles::distance()
82
83
84bool HepEulerAngles::isNear( const EA & ex, double epsilon ) const {
85
86 return distance( ex ) <= epsilon*epsilon ;
87
88} // HepEulerAngles::isNear()
89
90
91double HepEulerAngles::howNear( const EA & ex ) const {
92
93 return std::sqrt( distance( ex ) );
94
95} // HepEulerAngles::howNear()
96
97//-**************
98// Global Methods
99//-**************
100
101std::ostream & operator<<(std::ostream & os, const HepEulerAngles & ea)
102{
103 os << "(" << ea.phi() << ", " << ea.theta() << ", " << ea.psi() << ")";
104 return os;
105} // operator<<()
106
107void ZMinput3doubles ( std::istream & is, const char * type,
108 double & x, double & y, double & z );
109
110std::istream & operator>>(std::istream & is, HepEulerAngles & ea) {
111 double thePhi;
112 double theTheta;
113 double thePsi;
114 ZMinput3doubles ( is, "HepEulerAngle", thePhi , theTheta , thePsi );
115 ea.set ( thePhi , theTheta , thePsi );
116 return is;
117} // operator>>()
118
119} // namespace CLHEP
120
121
G4double epsilon(G4double density, G4double temperature)
double phi() const
double theta() const
double distance(const HepEulerAngles &ex) const
Definition: EulerAngles.cc:65
double psi() const
EA & set(double phi, double theta, double psi)
static double tolerance
Definition: EulerAngles.h:42
double howNear(const EA &ea) const
Definition: EulerAngles.cc:91
bool isNear(const EA &ea, double epsilon=tolerance) const
Definition: EulerAngles.cc:84
Definition: DoubConv.h:17
std::istream & operator>>(std::istream &is, HepRandom &dist)
Definition: Random.cc:223
void ZMinput3doubles(std::istream &is, const char *type, double &x, double &y, double &z)
Definition: ZMinput.cc:42
std::ostream & operator<<(std::ostream &os, const HepRandom &dist)
Definition: Random.cc:219