source: trunk/CLHEP/src/EulerAngles.cc

Last change on this file was 4, checked in by Pavel Demin, 16 years ago

first commit

File size: 3.2 KB
RevLine 
[4]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
24#include "CLHEP/Vector/defs.h"
25#include "CLHEP/Vector/EulerAngles.h"
26
27#include "CLHEP/Vector/ThreeVector.h"
28
29#include <iostream>
30
31namespace CLHEP {
32
33//-*************
34// static consts
35//-*************
36
37double HepEulerAngles::tolerance = Hep3Vector::ToleranceTicks * 1.0e-8;
38
39//-*******************
40// measure of distance
41//-*******************
42
43
44static void ZMpvEulerAnglesRep ( const HepEulerAngles & ex, double array[] ) {
45
46 register double sinPhi = sin( ex.phi() ) , cosPhi = cos( ex.phi() );
47 register double sinTheta = sin( ex.theta() ), cosTheta = cos( ex.theta() );
48 register double sinPsi = sin( ex.psi() ) , cosPsi = 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 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
Note: See TracBrowser for help on using the repository browser.