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
Rotation.cc
Go to the documentation of this file.
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 the parts of the the HepRotation class which
7// were present in the original CLHEP before the merge with ZOOM PhysicsVectors.
8//
9
12
13#include <iostream>
14#include <cmath>
15
16namespace CLHEP {
17
18static inline double safe_acos (double x) {
19 if (std::abs(x) <= 1.0) return std::acos(x);
20 return ( (x>0) ? 0 : CLHEP::pi );
21}
22
23double HepRotation::operator() (int i, int j) const {
24 if (i == 0) {
25 if (j == 0) { return xx(); }
26 if (j == 1) { return xy(); }
27 if (j == 2) { return xz(); }
28 } else if (i == 1) {
29 if (j == 0) { return yx(); }
30 if (j == 1) { return yy(); }
31 if (j == 2) { return yz(); }
32 } else if (i == 2) {
33 if (j == 0) { return zx(); }
34 if (j == 1) { return zy(); }
35 if (j == 2) { return zz(); }
36 }
37 std::cerr << "HepRotation subscripting: bad indices "
38 << "(" << i << "," << j << ")" << std::endl;
39 return 0.0;
40}
41
42HepRotation & HepRotation::rotate(double a, const Hep3Vector& aaxis) {
43 if (a != 0.0) {
44 double ll = aaxis.mag();
45 if (ll == 0.0) {
46 std::cerr << "HepRotation::rotate() - "
47 << "HepRotation: zero axis" << std::endl;
48 }else{
49 double sa = std::sin(a), ca = std::cos(a);
50 double dx = aaxis.x()/ll, dy = aaxis.y()/ll, dz = aaxis.z()/ll;
51 HepRotation m1(
52 ca+(1-ca)*dx*dx, (1-ca)*dx*dy-sa*dz, (1-ca)*dx*dz+sa*dy,
53 (1-ca)*dy*dx+sa*dz, ca+(1-ca)*dy*dy, (1-ca)*dy*dz-sa*dx,
54 (1-ca)*dz*dx-sa*dy, (1-ca)*dz*dy+sa*dx, ca+(1-ca)*dz*dz );
55 transform(m1);
56 }
57 }
58 return *this;
59}
60
62 double c1 = std::cos(a);
63 double s1 = std::sin(a);
64 double x1 = ryx, y1 = ryy, z1 = ryz;
65 ryx = c1*x1 - s1*rzx;
66 ryy = c1*y1 - s1*rzy;
67 ryz = c1*z1 - s1*rzz;
68 rzx = s1*x1 + c1*rzx;
69 rzy = s1*y1 + c1*rzy;
70 rzz = s1*z1 + c1*rzz;
71 return *this;
72}
73
75 double c1 = std::cos(a);
76 double s1 = std::sin(a);
77 double x1 = rzx, y1 = rzy, z1 = rzz;
78 rzx = c1*x1 - s1*rxx;
79 rzy = c1*y1 - s1*rxy;
80 rzz = c1*z1 - s1*rxz;
81 rxx = s1*x1 + c1*rxx;
82 rxy = s1*y1 + c1*rxy;
83 rxz = s1*z1 + c1*rxz;
84 return *this;
85}
86
88 double c1 = std::cos(a);
89 double s1 = std::sin(a);
90 double x1 = rxx, y1 = rxy, z1 = rxz;
91 rxx = c1*x1 - s1*ryx;
92 rxy = c1*y1 - s1*ryy;
93 rxz = c1*z1 - s1*ryz;
94 ryx = s1*x1 + c1*ryx;
95 ryy = s1*y1 + c1*ryy;
96 ryz = s1*z1 + c1*ryz;
97 return *this;
98}
99
101 const Hep3Vector &newY,
102 const Hep3Vector &newZ) {
103 double del = 0.001;
104 Hep3Vector w = newX.cross(newY);
105
106 if (std::abs(newZ.x()-w.x()) > del ||
107 std::abs(newZ.y()-w.y()) > del ||
108 std::abs(newZ.z()-w.z()) > del ||
109 std::abs(newX.mag2()-1.) > del ||
110 std::abs(newY.mag2()-1.) > del ||
111 std::abs(newZ.mag2()-1.) > del ||
112 std::abs(newX.dot(newY)) > del ||
113 std::abs(newY.dot(newZ)) > del ||
114 std::abs(newZ.dot(newX)) > del) {
115 std::cerr << "HepRotation::rotateAxes: bad axis vectors" << std::endl;
116 return *this;
117 }else{
118 return transform(HepRotation(newX.x(), newY.x(), newZ.x(),
119 newX.y(), newY.y(), newZ.y(),
120 newX.z(), newY.z(), newZ.z()));
121 }
122}
123
124double HepRotation::phiX() const {
125 return (yx() == 0.0 && xx() == 0.0) ? 0.0 : std::atan2(yx(),xx());
126}
127
128double HepRotation::phiY() const {
129 return (yy() == 0.0 && xy() == 0.0) ? 0.0 : std::atan2(yy(),xy());
130}
131
132double HepRotation::phiZ() const {
133 return (yz() == 0.0 && xz() == 0.0) ? 0.0 : std::atan2(yz(),xz());
134}
135
136double HepRotation::thetaX() const {
137 return safe_acos(zx());
138}
139
140double HepRotation::thetaY() const {
141 return safe_acos(zy());
142}
143
144double HepRotation::thetaZ() const {
145 return safe_acos(zz());
146}
147
148void HepRotation::getAngleAxis(double &angle, Hep3Vector &aaxis) const {
149 double cosa = 0.5*(xx()+yy()+zz()-1);
150 double cosa1 = 1-cosa;
151 if (cosa1 <= 0) {
152 angle = 0;
153 aaxis = Hep3Vector(0,0,1);
154 }else{
155 double x=0, y=0, z=0;
156 if (xx() > cosa) x = std::sqrt((xx()-cosa)/cosa1);
157 if (yy() > cosa) y = std::sqrt((yy()-cosa)/cosa1);
158 if (zz() > cosa) z = std::sqrt((zz()-cosa)/cosa1);
159 if (zy() < yz()) x = -x;
160 if (xz() < zx()) y = -y;
161 if (yx() < xy()) z = -z;
162 angle = (cosa < -1.) ? std::acos(-1.) : std::acos(cosa);
163 aaxis = Hep3Vector(x,y,z);
164 }
165}
166
168 return (rxx == 1.0 && rxy == 0.0 && rxz == 0.0 &&
169 ryx == 0.0 && ryy == 1.0 && ryz == 0.0 &&
170 rzx == 0.0 && rzy == 0.0 && rzz == 1.0) ? true : false;
171}
172
173int HepRotation::compare ( const HepRotation & r ) const {
174 if (rzz<r.rzz) return -1; else if (rzz>r.rzz) return 1;
175 else if (rzy<r.rzy) return -1; else if (rzy>r.rzy) return 1;
176 else if (rzx<r.rzx) return -1; else if (rzx>r.rzx) return 1;
177 else if (ryz<r.ryz) return -1; else if (ryz>r.ryz) return 1;
178 else if (ryy<r.ryy) return -1; else if (ryy>r.ryy) return 1;
179 else if (ryx<r.ryx) return -1; else if (ryx>r.ryx) return 1;
180 else if (rxz<r.rxz) return -1; else if (rxz>r.rxz) return 1;
181 else if (rxy<r.rxy) return -1; else if (rxy>r.rxy) return 1;
182 else if (rxx<r.rxx) return -1; else if (rxx>r.rxx) return 1;
183 else return 0;
184}
185
186
188
189} // namespace CLHEP
190
191
double z() const
double x() const
double mag2() const
double y() const
Hep3Vector cross(const Hep3Vector &) const
double dot(const Hep3Vector &) const
double mag() const
double operator()(int, int) const
Definition: Rotation.cc:23
double zz() const
double yz() const
HepRotation & rotateAxes(const Hep3Vector &newX, const Hep3Vector &newY, const Hep3Vector &newZ)
Definition: Rotation.cc:100
double zx() const
double thetaY() const
Definition: Rotation.cc:140
HepRotation & rotate(double delta, const Hep3Vector &axis)
Definition: Rotation.cc:42
bool isIdentity() const
Definition: Rotation.cc:167
HepRotation & transform(const HepRotation &r)
double phiY() const
Definition: Rotation.cc:128
double yx() const
static DLL_API const HepRotation IDENTITY
Definition: Rotation.h:366
double zy() const
double thetaX() const
Definition: Rotation.cc:136
void getAngleAxis(double &delta, Hep3Vector &axis) const
Definition: Rotation.cc:148
double xx() const
HepRotation & rotateX(double delta)
Definition: Rotation.cc:61
double phiX() const
Definition: Rotation.cc:124
HepRotation & rotateZ(double delta)
Definition: Rotation.cc:87
double yy() const
double xz() const
HepRotation & rotateY(double delta)
Definition: Rotation.cc:74
double thetaZ() const
Definition: Rotation.cc:144
int compare(const HepRotation &r) const
Definition: Rotation.cc:173
double xy() const
double phiZ() const
Definition: Rotation.cc:132
Definition: DoubConv.h:17