Geant4-11
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
static void ZMpvEulerAnglesRep(const HepEulerAngles &ex, double array[])
Definition: EulerAngles.cc:44
std::ostream & operator<<(std::ostream &os, const HepRandom &dist)
Definition: Random.cc:219