| [4] | 1 | // -*- C++ -*- | 
|---|
|  | 2 | // --------------------------------------------------------------------------- | 
|---|
|  | 3 | // | 
|---|
|  | 4 | // This file is a part of the CLHEP - a Class Library for High Energy Physics. | 
|---|
|  | 5 | // | 
|---|
|  | 6 | // This is the implementation of methods of the HepRotationY class which | 
|---|
|  | 7 | // were introduced when ZOOM PhysicsVectors was merged in. | 
|---|
|  | 8 | // | 
|---|
|  | 9 |  | 
|---|
|  | 10 | #ifdef GNUPRAGMA | 
|---|
|  | 11 | #pragma implementation | 
|---|
|  | 12 | #endif | 
|---|
|  | 13 |  | 
|---|
|  | 14 | #include "CLHEP/Vector/defs.h" | 
|---|
|  | 15 | #include "CLHEP/Vector/RotationY.h" | 
|---|
|  | 16 | #include "CLHEP/Vector/AxisAngle.h" | 
|---|
|  | 17 | #include "CLHEP/Vector/EulerAngles.h" | 
|---|
|  | 18 | #include "CLHEP/Vector/LorentzRotation.h" | 
|---|
|  | 19 | #include "CLHEP/Units/PhysicalConstants.h" | 
|---|
|  | 20 |  | 
|---|
|  | 21 | #include <cmath> | 
|---|
|  | 22 | #include <stdlib.h> | 
|---|
|  | 23 | #include <iostream> | 
|---|
|  | 24 |  | 
|---|
|  | 25 | using std::abs; | 
|---|
|  | 26 |  | 
|---|
|  | 27 | namespace CLHEP  { | 
|---|
|  | 28 |  | 
|---|
|  | 29 | static inline double safe_acos (double x) { | 
|---|
|  | 30 | if (abs(x) <= 1.0) return acos(x); | 
|---|
|  | 31 | return ( (x>0) ? 0 : CLHEP::pi ); | 
|---|
|  | 32 | } | 
|---|
|  | 33 |  | 
|---|
|  | 34 | HepRotationY::HepRotationY(double delta) : | 
|---|
|  | 35 | d(proper(delta)), s(sin(delta)), c(cos(delta)) | 
|---|
|  | 36 | {} | 
|---|
|  | 37 |  | 
|---|
|  | 38 | HepRotationY & HepRotationY::set ( double delta ) { | 
|---|
|  | 39 | d = proper(delta); | 
|---|
|  | 40 | s = sin(d); | 
|---|
|  | 41 | c = cos(d); | 
|---|
|  | 42 | return *this; | 
|---|
|  | 43 | } | 
|---|
|  | 44 |  | 
|---|
|  | 45 | double  HepRotationY::phi() const { | 
|---|
|  | 46 | if ( d == 0 ) { | 
|---|
|  | 47 | return 0; | 
|---|
|  | 48 | } else if ( (d < 0) || (d == CLHEP::pi) )  { | 
|---|
|  | 49 | return +CLHEP::halfpi; | 
|---|
|  | 50 | } else { | 
|---|
|  | 51 | return -CLHEP::halfpi; | 
|---|
|  | 52 | } | 
|---|
|  | 53 | }  // HepRotationY::phi() | 
|---|
|  | 54 |  | 
|---|
|  | 55 | double  HepRotationY::theta() const { | 
|---|
|  | 56 | return  fabs( d ); | 
|---|
|  | 57 | }  // HepRotationY::theta() | 
|---|
|  | 58 |  | 
|---|
|  | 59 | double  HepRotationY::psi() const { | 
|---|
|  | 60 | if ( d == 0 ) { | 
|---|
|  | 61 | return 0; | 
|---|
|  | 62 | } else if ( (d < 0) || (d == CLHEP::pi) )  { | 
|---|
|  | 63 | return -CLHEP::halfpi; | 
|---|
|  | 64 | } else { | 
|---|
|  | 65 | return +CLHEP::halfpi; | 
|---|
|  | 66 | } | 
|---|
|  | 67 | }  // HepRotationY::psi() | 
|---|
|  | 68 |  | 
|---|
|  | 69 | HepEulerAngles HepRotationY::eulerAngles() const { | 
|---|
|  | 70 | return HepEulerAngles(  phi(),  theta(),  psi() ); | 
|---|
|  | 71 | }  // HepRotationY::eulerAngles() | 
|---|
|  | 72 |  | 
|---|
|  | 73 |  | 
|---|
|  | 74 | // From the defining code in the implementation of CLHEP (in Rotation.cc) | 
|---|
|  | 75 | // it is clear that thetaX, phiX form the polar angles in the original | 
|---|
|  | 76 | // coordinate system of the new X axis (and similarly for phiY and phiZ). | 
|---|
|  | 77 | // | 
|---|
|  | 78 | // This code is taken directly from the original CLHEP. However, there are as | 
|---|
|  | 79 | // shown opportunities for significant speed improvement. | 
|---|
|  | 80 |  | 
|---|
|  | 81 | double HepRotationY::phiX() const { | 
|---|
|  | 82 | return (yx() == 0.0 && xx() == 0.0) ? 0.0 : atan2(yx(),xx()); | 
|---|
|  | 83 | // or ---- return 0; | 
|---|
|  | 84 | } | 
|---|
|  | 85 |  | 
|---|
|  | 86 | double HepRotationY::phiY() const { | 
|---|
|  | 87 | return (yy() == 0.0 && xy() == 0.0) ? 0.0 : atan2(yy(),xy()); | 
|---|
|  | 88 | // or ----  return CLHEP::halfpi; | 
|---|
|  | 89 | } | 
|---|
|  | 90 |  | 
|---|
|  | 91 | double HepRotationY::phiZ() const { | 
|---|
|  | 92 | return (yz() == 0.0 && xz() == 0.0) ? 0.0 : atan2(yz(),xz()); | 
|---|
|  | 93 | // or ----  return 0; | 
|---|
|  | 94 | } | 
|---|
|  | 95 |  | 
|---|
|  | 96 | double HepRotationY::thetaX() const { | 
|---|
|  | 97 | return safe_acos(zx()); | 
|---|
|  | 98 | } | 
|---|
|  | 99 |  | 
|---|
|  | 100 | double HepRotationY::thetaY() const { | 
|---|
|  | 101 | return safe_acos(zy()); | 
|---|
|  | 102 | // or ----  return CLHEP::halfpi; | 
|---|
|  | 103 | } | 
|---|
|  | 104 |  | 
|---|
|  | 105 | double HepRotationY::thetaZ() const { | 
|---|
|  | 106 | return safe_acos(zz()); | 
|---|
|  | 107 | // or ---- return d; | 
|---|
|  | 108 | } | 
|---|
|  | 109 |  | 
|---|
|  | 110 | void HepRotationY::setDelta ( double delta ) { | 
|---|
|  | 111 | set(delta); | 
|---|
|  | 112 | } | 
|---|
|  | 113 |  | 
|---|
|  | 114 | void HepRotationY::decompose | 
|---|
|  | 115 | (HepAxisAngle & rotation, Hep3Vector & boost) const { | 
|---|
|  | 116 | boost.set(0,0,0); | 
|---|
|  | 117 | rotation = axisAngle(); | 
|---|
|  | 118 | } | 
|---|
|  | 119 |  | 
|---|
|  | 120 | void HepRotationY::decompose | 
|---|
|  | 121 | (Hep3Vector & boost, HepAxisAngle & rotation) const { | 
|---|
|  | 122 | boost.set(0,0,0); | 
|---|
|  | 123 | rotation = axisAngle(); | 
|---|
|  | 124 | } | 
|---|
|  | 125 |  | 
|---|
|  | 126 | void HepRotationY::decompose | 
|---|
|  | 127 | (HepRotation & rotation, HepBoost & boost) const { | 
|---|
|  | 128 | boost.set(0,0,0); | 
|---|
|  | 129 | rotation = HepRotation(*this); | 
|---|
|  | 130 | } | 
|---|
|  | 131 |  | 
|---|
|  | 132 | void HepRotationY::decompose | 
|---|
|  | 133 | (HepBoost & boost, HepRotation & rotation) const { | 
|---|
|  | 134 | boost.set(0,0,0); | 
|---|
|  | 135 | rotation = HepRotation(*this); | 
|---|
|  | 136 | } | 
|---|
|  | 137 |  | 
|---|
|  | 138 | double HepRotationY::distance2( const HepRotationY & r  ) const { | 
|---|
|  | 139 | double answer = 2.0 * ( 1.0 - ( s * r.s + c * r.c ) ) ; | 
|---|
|  | 140 | return (answer >= 0) ? answer : 0; | 
|---|
|  | 141 | } | 
|---|
|  | 142 |  | 
|---|
|  | 143 | double HepRotationY::distance2( const HepRotation & r  ) const { | 
|---|
|  | 144 | double sum =        xx() * r.xx()          +  xz() * r.xz() | 
|---|
|  | 145 | + r.yy() | 
|---|
|  | 146 | + zx() * r.zx()          + zz() * r.zz(); | 
|---|
|  | 147 | double answer = 3.0 - sum; | 
|---|
|  | 148 | return (answer >= 0 ) ? answer : 0; | 
|---|
|  | 149 | } | 
|---|
|  | 150 |  | 
|---|
|  | 151 | double HepRotationY::distance2( const HepLorentzRotation & lt  ) const { | 
|---|
|  | 152 | HepAxisAngle a; | 
|---|
|  | 153 | Hep3Vector   b; | 
|---|
|  | 154 | lt.decompose(b, a); | 
|---|
|  | 155 | double bet = b.beta(); | 
|---|
|  | 156 | double bet2 = bet*bet; | 
|---|
|  | 157 | HepRotation r(a); | 
|---|
|  | 158 | return bet2/(1-bet2) + distance2(r); | 
|---|
|  | 159 | } | 
|---|
|  | 160 |  | 
|---|
|  | 161 | double HepRotationY::distance2( const HepBoost & lt ) const { | 
|---|
|  | 162 | return distance2( HepLorentzRotation(lt)); | 
|---|
|  | 163 | } | 
|---|
|  | 164 |  | 
|---|
|  | 165 | double HepRotationY::howNear( const HepRotationY & r ) const { | 
|---|
|  | 166 | return sqrt(distance2(r)); | 
|---|
|  | 167 | } | 
|---|
|  | 168 | double HepRotationY::howNear( const HepRotation & r ) const { | 
|---|
|  | 169 | return sqrt(distance2(r)); | 
|---|
|  | 170 | } | 
|---|
|  | 171 | double HepRotationY::howNear( const HepBoost & lt ) const { | 
|---|
|  | 172 | return sqrt(distance2(lt)); | 
|---|
|  | 173 | } | 
|---|
|  | 174 | double HepRotationY::howNear( const HepLorentzRotation & lt ) const { | 
|---|
|  | 175 | return sqrt(distance2(lt)); | 
|---|
|  | 176 | } | 
|---|
|  | 177 | bool HepRotationY::isNear(const HepRotationY & r,double epsilon)const{ | 
|---|
|  | 178 | return (distance2(r) <= epsilon*epsilon); | 
|---|
|  | 179 | } | 
|---|
|  | 180 | bool HepRotationY::isNear(const HepRotation & r,double epsilon)const { | 
|---|
|  | 181 | return (distance2(r) <= epsilon*epsilon); | 
|---|
|  | 182 | } | 
|---|
|  | 183 | bool HepRotationY::isNear( const HepBoost & lt,double epsilon) const { | 
|---|
|  | 184 | return (distance2(lt) <= epsilon*epsilon); | 
|---|
|  | 185 | } | 
|---|
|  | 186 | bool HepRotationY::isNear( const HepLorentzRotation & lt, | 
|---|
|  | 187 | double epsilon) const { | 
|---|
|  | 188 | return (distance2(lt) <= epsilon*epsilon); | 
|---|
|  | 189 | } | 
|---|
|  | 190 |  | 
|---|
|  | 191 | double HepRotationY::norm2() const { | 
|---|
|  | 192 | return 2.0 - 2.0 * c; | 
|---|
|  | 193 | } | 
|---|
|  | 194 |  | 
|---|
|  | 195 | std::ostream & HepRotationY::print( std::ostream & os ) const { | 
|---|
|  | 196 | os << "\nRotation about Y (" << d << | 
|---|
|  | 197 | ") [cos d = " << c << " sin d = " << s << "]\n"; | 
|---|
|  | 198 | return os; | 
|---|
|  | 199 | } | 
|---|
|  | 200 |  | 
|---|
|  | 201 | }  // namespace CLHEP | 
|---|