Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
Boost.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 HepBoost class.
7//
8
9#ifdef GNUPRAGMA
10#pragma implementation
11#endif
12
13#include "CLHEP/Vector/Boost.h"
16
17namespace CLHEP {
18
19// ---------- Constructors and Assignment:
20
21HepBoost & HepBoost::set (double bx, double by, double bz) {
22 double bp2 = bx*bx + by*by + bz*bz;
23// if (bp2 >= 1) {
24// std::cerr << "HepBoost::set() - "
25// << "Boost Vector supplied to set HepBoost represents speed >= c." << std::endl;
26// }
27 double ggamma = 1.0 / std::sqrt(1.0 - bp2);
28 double bgamma = ggamma * ggamma / (1.0 + ggamma);
29 rep_.xx_ = 1.0 + bgamma * bx * bx;
30 rep_.yy_ = 1.0 + bgamma * by * by;
31 rep_.zz_ = 1.0 + bgamma * bz * bz;
32 rep_.xy_ = bgamma * bx * by;
33 rep_.xz_ = bgamma * bx * bz;
34 rep_.yz_ = bgamma * by * bz;
35 rep_.xt_ = ggamma * bx;
36 rep_.yt_ = ggamma * by;
37 rep_.zt_ = ggamma * bz;
38 rep_.tt_ = ggamma;
39 return *this;
40}
41
43 rep_ = m1;
44 return *this;
45}
46
47HepBoost & HepBoost::set (Hep3Vector ddirection, double bbeta) {
48 double length = ddirection.mag();
49 if (length <= 0) { // Nan-proofing
50 std::cerr << "HepBoost::set() - "
51 << "Direction supplied to set HepBoost is zero." << std::endl;
52 set (0,0,0);
53 return *this;
54 }
55 set(bbeta*ddirection.x()/length,
56 bbeta*ddirection.y()/length,
57 bbeta*ddirection.z()/length);
58 return *this;
59}
60
61HepBoost & HepBoost::set (const Hep3Vector & bboost) {
62 return set (bboost.x(), bboost.y(), bboost.z());
63}
64
65// ---------- Accessors:
66
67// ---------- Decomposition:
68
69void HepBoost::decompose (HepRotation & rotation, HepBoost & boost) const {
70 HepAxisAngle vdelta = HepAxisAngle();
71 rotation = HepRotation(vdelta);
72 Hep3Vector bbeta = boostVector();
73 boost = HepBoost(bbeta);
74}
75
76void HepBoost::decompose (HepAxisAngle & rotation, Hep3Vector & boost) const {
77 rotation = HepAxisAngle();
78 boost = boostVector();
79}
80
81void HepBoost::decompose (HepBoost & boost, HepRotation & rotation) const {
82 HepAxisAngle vdelta = HepAxisAngle();
83 rotation = HepRotation(vdelta);
84 Hep3Vector bbeta = boostVector();
85 boost = HepBoost(bbeta);
86}
87
88void HepBoost::decompose (Hep3Vector & boost, HepAxisAngle & rotation) const {
89 rotation = HepAxisAngle();
90 boost = boostVector();
91}
92
93// ---------- Comparisons:
94
95double HepBoost::distance2( const HepRotation & r ) const {
96 double db2 = norm2();
97 double dr2 = r.norm2();
98 return (db2 + dr2);
99}
100
101double HepBoost::distance2( const HepLorentzRotation & lt ) const {
102 HepBoost b1;
103 HepRotation r1;
104 lt.decompose(b1,r1);
105 double db2 = distance2(b1);
106 double dr2 = r1.norm2();
107 return (db2 + dr2);
108}
109
110double HepBoost::howNear ( const HepRotation & r ) const {
111 return std::sqrt(distance2(r));
112}
113
114double HepBoost::howNear ( const HepLorentzRotation & lt ) const {
115 return std::sqrt(distance2(lt));
116}
117
118bool HepBoost::isNear (const HepRotation & r, double epsilon) const {
119 double db2 = norm2();
120 if (db2 > epsilon*epsilon) return false;
121 double dr2 = r.norm2();
122 return (db2+dr2 <= epsilon*epsilon);
123}
124
126 double epsilon) const {
127 HepBoost b1;
128 HepRotation r1;
129 double db2 = distance2(b1);
130 lt.decompose(b1,r1);
131 if (db2 > epsilon*epsilon) return false;
132 double dr2 = r1.norm2();
133 return (db2 + dr2);
134}
135
136// ---------- Properties:
137
138double HepBoost::norm2() const {
139 register double bgx = rep_.xt_;
140 register double bgy = rep_.yt_;
141 register double bgz = rep_.zt_;
142 return bgx*bgx+bgy*bgy+bgz*bgz;
143}
144
146 // Assuming the representation of this is close to a true pure boost,
147 // but may have drifted due to round-off error from many operations,
148 // this forms an "exact" pure boost matrix for the LT again.
149
150 // The natural way to do this is to use the t column as a boost and set
151 // based on that boost vector.
152
153 // There is perhaps danger that this boost vector will appear equal to or
154 // greater than a unit vector; the best we can do for such a case is use
155 // a boost in that direction but rescaled to just less than one.
156
157 // There is in principle no way that gamma could have become negative,
158 // but if that happens, we ZMthrow and (if continuing) just rescale, which
159 // will change the sign of the last column when computing the boost.
160
161 double gam = tt();
162 if (gam <= 0) { // 4/12/01 mf
163 std::cerr << "HepBoost::rectify() - "
164 << "Attempt to rectify a boost with non-positive gamma." << std::endl;
165 if (gam==0) return; // NaN-proofing
166 }
167 Hep3Vector boost (xt(), yt(), zt());
168 boost /= tt();
169 if ( boost.mag2() >= 1 ) { // NaN-proofing:
170 boost /= ( boost.mag() * ( 1.0 + 1.0e-16 ) ); // used to just check > 1
171 }
172 set ( boost );
173}
174
175// ---------- Application is all in .icc
176
177// ---------- Operations in the group of 4-Rotations
178
183 r.xx_*m1.xx_ + r.xy_*m1.yx_ + r.xz_*m1.zx_ + r.xt_*m1.tx_,
184 r.xx_*m1.xy_ + r.xy_*m1.yy_ + r.xz_*m1.zy_ + r.xt_*m1.ty_,
185 r.xx_*m1.xz_ + r.xy_*m1.yz_ + r.xz_*m1.zz_ + r.xt_*m1.tz_,
186 r.xx_*m1.xt_ + r.xy_*m1.yt_ + r.xz_*m1.zt_ + r.xt_*m1.tt_,
187
188 r.xy_*m1.xx_ + r.yy_*m1.yx_ + r.yz_*m1.zx_ + r.yt_*m1.tx_,
189 r.xy_*m1.xy_ + r.yy_*m1.yy_ + r.yz_*m1.zy_ + r.yt_*m1.ty_,
190 r.xy_*m1.xz_ + r.yy_*m1.yz_ + r.yz_*m1.zz_ + r.yt_*m1.tz_,
191 r.xy_*m1.xt_ + r.yy_*m1.yt_ + r.yz_*m1.zt_ + r.yt_*m1.tt_,
192
193 r.xz_*m1.xx_ + r.yz_*m1.yx_ + r.zz_*m1.zx_ + r.zt_*m1.tx_,
194 r.xz_*m1.xy_ + r.yz_*m1.yy_ + r.zz_*m1.zy_ + r.zt_*m1.ty_,
195 r.xz_*m1.xz_ + r.yz_*m1.yz_ + r.zz_*m1.zz_ + r.zt_*m1.tz_,
196 r.xz_*m1.xt_ + r.yz_*m1.yt_ + r.zz_*m1.zt_ + r.zt_*m1.tt_,
197
198 r.xt_*m1.xx_ + r.yt_*m1.yx_ + r.zt_*m1.zx_ + r.tt_*m1.tx_,
199 r.xt_*m1.xy_ + r.yt_*m1.yy_ + r.zt_*m1.zy_ + r.tt_*m1.ty_,
200 r.xt_*m1.xz_ + r.yt_*m1.yz_ + r.zt_*m1.zz_ + r.tt_*m1.tz_,
201 r.xt_*m1.xt_ + r.yt_*m1.yt_ + r.zt_*m1.zt_ + r.tt_*m1.tt_) );
202}
203
208 r.xx_*m1.xx_ + r.xy_*m1.xy_ + r.xz_*m1.xz_ + r.xt_*m1.xt_,
209 r.xx_*m1.xy_ + r.xy_*m1.yy_ + r.xz_*m1.yz_ + r.xt_*m1.yt_,
210 r.xx_*m1.xz_ + r.xy_*m1.yz_ + r.xz_*m1.zz_ + r.xt_*m1.zt_,
211 r.xx_*m1.xt_ + r.xy_*m1.yt_ + r.xz_*m1.zt_ + r.xt_*m1.tt_,
212
213 r.xy_*m1.xx_ + r.yy_*m1.xy_ + r.yz_*m1.xz_ + r.yt_*m1.xt_,
214 r.xy_*m1.xy_ + r.yy_*m1.yy_ + r.yz_*m1.yz_ + r.yt_*m1.yt_,
215 r.xy_*m1.xz_ + r.yy_*m1.yz_ + r.yz_*m1.zz_ + r.yt_*m1.zt_,
216 r.xy_*m1.xt_ + r.yy_*m1.yt_ + r.yz_*m1.zt_ + r.yt_*m1.tt_,
217
218 r.xz_*m1.xx_ + r.yz_*m1.xy_ + r.zz_*m1.xz_ + r.zt_*m1.xt_,
219 r.xz_*m1.xy_ + r.yz_*m1.yy_ + r.zz_*m1.yz_ + r.zt_*m1.yt_,
220 r.xz_*m1.xz_ + r.yz_*m1.yz_ + r.zz_*m1.zz_ + r.zt_*m1.zt_,
221 r.xz_*m1.xt_ + r.yz_*m1.yt_ + r.zz_*m1.zt_ + r.zt_*m1.tt_,
222
223 r.xt_*m1.xx_ + r.yt_*m1.xy_ + r.zt_*m1.xz_ + r.tt_*m1.xt_,
224 r.xt_*m1.xy_ + r.yt_*m1.yy_ + r.zt_*m1.yz_ + r.tt_*m1.yt_,
225 r.xt_*m1.xz_ + r.yt_*m1.yz_ + r.zt_*m1.zz_ + r.tt_*m1.zt_,
226 r.xt_*m1.xt_ + r.yt_*m1.yt_ + r.zt_*m1.zt_ + r.tt_*m1.tt_) );
227}
228
231 return matrixMultiplication(lt.rep4x4());
232}
233
236 return matrixMultiplication(b.rep_);
237}
238
241 return matrixMultiplication(r.rep4x4());
242}
243
244// ---------- I/O:
245
246std::ostream & HepBoost::print( std::ostream & os ) const {
247 if ( rep_.tt_ <= 1 ) {
248 os << "Lorentz Boost( IDENTITY )";
249 } else {
250 double norm = boostVector().mag();
251 os << "\nLorentz Boost " << boostVector()/norm <<
252 "\n{beta = " << beta() << " gamma = " << gamma() << "}\n";
253 }
254 return os;
255}
256
257} // namespace CLHEP
double z() const
double x() const
double mag2() const
double y() const
double mag() const
double norm2() const
Definition: Boost.cc:138
HepBoost & set(double betaX, double betaY, double betaZ)
Definition: Boost.cc:21
HepRep4x4Symmetric rep4x4Symmetric() const
void decompose(HepRotation &rotation, HepBoost &boost) const
Definition: Boost.cc:69
double beta() const
HepLorentzRotation matrixMultiplication(const HepRep4x4 &m) const
Definition: Boost.cc:180
bool isNear(const HepBoost &b, double epsilon=Hep4RotationInterface::tolerance) const
void rectify()
Definition: Boost.cc:145
HepLorentzVector operator*(const HepLorentzVector &p) const
double yt() const
double xt() const
double howNear(const HepBoost &b) const
double distance2(const HepBoost &b) const
double tt() const
Hep3Vector boostVector() const
double gamma() const
HepRep4x4Symmetric rep_
Definition: Boost.h:235
std::ostream & print(std::ostream &os) const
Definition: Boost.cc:246
double zt() const
HepRep4x4 rep4x4() const
void decompose(Hep3Vector &boost, HepAxisAngle &rotation) const
double norm2() const
Definition: RotationP.cc:50
HepRep4x4 rep4x4() const
Definition: DoubConv.h:17