Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
BasicVector3D.cc
Go to the documentation of this file.
1// -*- C++ -*-
2// $Id:$
3// ---------------------------------------------------------------------------
4
5#include <cmath>
6#include <float.h>
7#include <iostream>
9
10namespace HepGeom {
11 //--------------------------------------------------------------------------
12 template<>
14 float ma = mag(), dz = z();
15 if (ma == 0) return 0;
16 if (ma == dz) return FLT_MAX;
17 if (ma == -dz) return -FLT_MAX;
18 return 0.5*std::log((ma+dz)/(ma-dz));
19 }
20
21 //--------------------------------------------------------------------------
22 template<>
24 double ma = mag();
25 if (ma == 0) return;
26 double tanHalfTheta = std::exp(-a);
27 double tanHalfTheta2 = tanHalfTheta * tanHalfTheta;
28 double cosTheta1 = (1 - tanHalfTheta2) / (1 + tanHalfTheta2);
29 double rh = ma * std::sqrt(1 - cosTheta1*cosTheta1);
30 double ph = phi();
31 set(rh*std::cos(ph), rh*std::sin(ph), ma*cosTheta1);
32 }
33
34 //--------------------------------------------------------------------------
35 template<>
37 double cosa = 0;
38 double ptot = mag()*v.mag();
39 if(ptot > 0) {
40 cosa = dot(v)/ptot;
41 if(cosa > 1) cosa = 1;
42 if(cosa < -1) cosa = -1;
43 }
44 return std::acos(cosa);
45 }
46
47 //--------------------------------------------------------------------------
48 template<>
50 double sina = std::sin(a), cosa = std::cos(a), dy = y(), dz = z();
51 setY(dy*cosa-dz*sina);
52 setZ(dz*cosa+dy*sina);
53 return *this;
54 }
55
56 //--------------------------------------------------------------------------
57 template<>
59 double sina = std::sin(a), cosa = std::cos(a), dz = z(), dx = x();
60 setZ(dz*cosa-dx*sina);
61 setX(dx*cosa+dz*sina);
62 return *this;
63 }
64
65 //--------------------------------------------------------------------------
66 template<>
68 double sina = std::sin(a), cosa = std::cos(a), dx = x(), dy = y();
69 setX(dx*cosa-dy*sina);
70 setY(dy*cosa+dx*sina);
71 return *this;
72 }
73
74 //--------------------------------------------------------------------------
75 template<>
78 if (a == 0) return *this;
79 double cx = v.x(), cy = v.y(), cz = v.z();
80 double ll = std::sqrt(cx*cx + cy*cy + cz*cz);
81 if (ll == 0) {
82 std::cerr << "BasicVector<float>::rotate() : zero axis" << std::endl;
83 return *this;
84 }
85 double cosa = std::cos(a), sina = std::sin(a);
86 cx /= ll; cy /= ll; cz /= ll;
87
88 double xx = cosa + (1-cosa)*cx*cx;
89 double xy = (1-cosa)*cx*cy - sina*cz;
90 double xz = (1-cosa)*cx*cz + sina*cy;
91
92 double yx = (1-cosa)*cy*cx + sina*cz;
93 double yy = cosa + (1-cosa)*cy*cy;
94 double yz = (1-cosa)*cy*cz - sina*cx;
95
96 double zx = (1-cosa)*cz*cx - sina*cy;
97 double zy = (1-cosa)*cz*cy + sina*cx;
98 double zz = cosa + (1-cosa)*cz*cz;
99
100 cx = x(); cy = y(); cz = z();
101 set(xx*cx+xy*cy+xz*cz, yx*cx+yy*cy+yz*cz, zx*cx+zy*cy+zz*cz);
102 return *this;
103 }
104
105 //--------------------------------------------------------------------------
106 std::ostream &
107 operator<<(std::ostream & os, const BasicVector3D<float> & a)
108 {
109 return os << "(" << a.x() << "," << a.y() << "," << a.z() << ")";
110 }
111
112 //--------------------------------------------------------------------------
113 std::istream &
114 operator>> (std::istream & is, BasicVector3D<float> & a)
115 {
116 // Required format is ( a, b, c ) that is, three numbers, preceded by
117 // (, followed by ), and separated by commas. The three numbers are
118 // taken as x, y, z.
119
120 float x, y, z;
121 char c;
122
123 is >> std::ws >> c;
124 // ws is defined to invoke eatwhite(istream & )
125 // see (Stroustrup gray book) page 333 and 345.
126 if (is.fail() || c != '(' ) {
127 std::cerr
128 << "Could not find required opening parenthesis "
129 << "in input of a BasicVector3D<float>"
130 << std::endl;
131 return is;
132 }
133
134 is >> x >> std::ws >> c;
135 if (is.fail() || c != ',' ) {
136 std::cerr
137 << "Could not find x value and required trailing comma "
138 << "in input of a BasicVector3D<float>"
139 << std::endl;
140 return is;
141 }
142
143 is >> y >> std::ws >> c;
144 if (is.fail() || c != ',' ) {
145 std::cerr
146 << "Could not find y value and required trailing comma "
147 << "in input of a BasicVector3D<float>"
148 << std::endl;
149 return is;
150 }
151
152 is >> z >> std::ws >> c;
153 if (is.fail() || c != ')' ) {
154 std::cerr
155 << "Could not find z value and required close parenthesis "
156 << "in input of a BasicVector3D<float>"
157 << std::endl;
158 return is;
159 }
160
161 a.setX(x);
162 a.setY(y);
163 a.setZ(z);
164 return is;
165 }
166
167 //--------------------------------------------------------------------------
168 template<>
170 double ma = mag(), dz = z();
171 if (ma == 0) return 0;
172 if (ma == dz) return DBL_MAX;
173 if (ma == -dz) return -DBL_MAX;
174 return 0.5*std::log((ma+dz)/(ma-dz));
175 }
176
177 //--------------------------------------------------------------------------
178 template<>
180 double ma = mag();
181 if (ma == 0) return;
182 double tanHalfTheta = std::exp(-a);
183 double tanHalfTheta2 = tanHalfTheta * tanHalfTheta;
184 double cosTheta1 = (1 - tanHalfTheta2) / (1 + tanHalfTheta2);
185 double rh = ma * std::sqrt(1 - cosTheta1*cosTheta1);
186 double ph = phi();
187 set(rh*std::cos(ph), rh*std::sin(ph), ma*cosTheta1);
188 }
189
190 //--------------------------------------------------------------------------
191 template<>
193 double cosa = 0;
194 double ptot = mag()*v.mag();
195 if(ptot > 0) {
196 cosa = dot(v)/ptot;
197 if(cosa > 1) cosa = 1;
198 if(cosa < -1) cosa = -1;
199 }
200 return std::acos(cosa);
201 }
202
203 //--------------------------------------------------------------------------
204 template<>
206 double sina = std::sin(a), cosa = std::cos(a), dy = y(), dz = z();
207 setY(dy*cosa-dz*sina);
208 setZ(dz*cosa+dy*sina);
209 return *this;
210 }
211
212 //--------------------------------------------------------------------------
213 template<>
215 double sina = std::sin(a), cosa = std::cos(a), dz = z(), dx = x();
216 setZ(dz*cosa-dx*sina);
217 setX(dx*cosa+dz*sina);
218 return *this;
219 }
220
221 //--------------------------------------------------------------------------
222 template<>
224 double sina = std::sin(a), cosa = std::cos(a), dx = x(), dy = y();
225 setX(dx*cosa-dy*sina);
226 setY(dy*cosa+dx*sina);
227 return *this;
228 }
229
230 //--------------------------------------------------------------------------
231 template<>
234 if (a == 0) return *this;
235 double cx = v.x(), cy = v.y(), cz = v.z();
236 double ll = std::sqrt(cx*cx + cy*cy + cz*cz);
237 if (ll == 0) {
238 std::cerr << "BasicVector<double>::rotate() : zero axis" << std::endl;
239 return *this;
240 }
241 double cosa = std::cos(a), sina = std::sin(a);
242 cx /= ll; cy /= ll; cz /= ll;
243
244 double xx = cosa + (1-cosa)*cx*cx;
245 double xy = (1-cosa)*cx*cy - sina*cz;
246 double xz = (1-cosa)*cx*cz + sina*cy;
247
248 double yx = (1-cosa)*cy*cx + sina*cz;
249 double yy = cosa + (1-cosa)*cy*cy;
250 double yz = (1-cosa)*cy*cz - sina*cx;
251
252 double zx = (1-cosa)*cz*cx - sina*cy;
253 double zy = (1-cosa)*cz*cy + sina*cx;
254 double zz = cosa + (1-cosa)*cz*cz;
255
256 cx = x(); cy = y(); cz = z();
257 set(xx*cx+xy*cy+xz*cz, yx*cx+yy*cy+yz*cz, zx*cx+zy*cy+zz*cz);
258 return *this;
259 }
260
261 //--------------------------------------------------------------------------
262 std::ostream &
263 operator<< (std::ostream & os, const BasicVector3D<double> & a)
264 {
265 return os << "(" << a.x() << "," << a.y() << "," << a.z() << ")";
266 }
267
268 //--------------------------------------------------------------------------
269 std::istream &
270 operator>> (std::istream & is, BasicVector3D<double> & a)
271 {
272 // Required format is ( a, b, c ) that is, three numbers, preceded by
273 // (, followed by ), and separated by commas. The three numbers are
274 // taken as x, y, z.
275
276 double x, y, z;
277 char c;
278
279 is >> std::ws >> c;
280 // ws is defined to invoke eatwhite(istream & )
281 // see (Stroustrup gray book) page 333 and 345.
282 if (is.fail() || c != '(' ) {
283 std::cerr
284 << "Could not find required opening parenthesis "
285 << "in input of a BasicVector3D<double>"
286 << std::endl;
287 return is;
288 }
289
290 is >> x >> std::ws >> c;
291 if (is.fail() || c != ',' ) {
292 std::cerr
293 << "Could not find x value and required trailing comma "
294 << "in input of a BasicVector3D<double>"
295 << std::endl;
296 return is;
297 }
298
299 is >> y >> std::ws >> c;
300 if (is.fail() || c != ',' ) {
301 std::cerr
302 << "Could not find y value and required trailing comma "
303 << "in input of a BasicVector3D<double>"
304 << std::endl;
305 return is;
306 }
307
308 is >> z >> std::ws >> c;
309 if (is.fail() || c != ')' ) {
310 std::cerr
311 << "Could not find z value and required close parenthesis "
312 << "in input of a BasicVector3D<double>"
313 << std::endl;
314 return is;
315 }
316
317 a.setX(x);
318 a.setY(y);
319 a.setZ(z);
320 return is;
321 }
322} /* namespace HepGeom */
BasicVector3D< T > & rotateZ(T a)
BasicVector3D< T > & rotateX(T a)
BasicVector3D< T > & rotate(T a, const BasicVector3D< T > &v)
T angle(const BasicVector3D< T > &v) const
BasicVector3D< T > & rotateY(T a)
std::istream & operator>>(std::istream &is, BasicVector3D< float > &a)
std::ostream & operator<<(std::ostream &os, const BasicVector3D< float > &a)
#define FLT_MAX
Definition: templates.hh:99
#define DBL_MAX
Definition: templates.hh:83