Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
BoostZ.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 HepBoostZ class.
7//
8
9#ifdef GNUPRAGMA
10#pragma implementation
11#endif
12
13#include "CLHEP/Vector/BoostZ.h"
14#include "CLHEP/Vector/Boost.h"
17
18namespace CLHEP {
19
20// ---------- Constructors and Assignment:
21
22HepBoostZ & HepBoostZ::set (double bbeta) {
23 double b2 = bbeta*bbeta;
24 if (b2 >= 1) {
25 std::cerr << "HepBoostZ::set() - "
26 << "Beta supplied to set HepBoostZ represents speed >= c." << std::endl;
27 beta_ = 1.0 - 1.0E-8; // NaN-proofing
28 gamma_ = 1.0 / std::sqrt(1.0 - b2);
29 return *this;
30 }
31 beta_ = bbeta;
32 gamma_ = 1.0 / std::sqrt(1.0 - b2);
33 return *this;
34}
35
36// ---------- Accessors:
37
39 double bg = beta_*gamma_;
40 return HepRep4x4( 1, 0, 0, 0,
41 0, 1, 0, 0,
42 0, 0, gamma_, bg,
43 0, 0, bg, gamma_ );
44}
45
47 double bg = beta_*gamma_;
48 return HepRep4x4Symmetric( 1, 0, 0, 0,
49 1, 0, 0,
50 gamma_, bg,
51 gamma_ );
52}
53
54// ---------- Decomposition:
55
56void HepBoostZ::decompose (HepRotation & rotation, HepBoost & boost) const {
57 HepAxisAngle vdelta = HepAxisAngle();
58 rotation = HepRotation(vdelta);
59 Hep3Vector bbeta = boostVector();
60 boost = HepBoost(bbeta);
61}
62
63void HepBoostZ::decompose (HepAxisAngle & rotation, Hep3Vector & boost) const {
64 rotation = HepAxisAngle();
65 boost = boostVector();
66}
67
68void HepBoostZ::decompose (HepBoost & boost, HepRotation & rotation) const {
69 HepAxisAngle vdelta = HepAxisAngle();
70 rotation = HepRotation(vdelta);
71 Hep3Vector bbeta = boostVector();
72 boost = HepBoost(bbeta);
73}
74
75void HepBoostZ::decompose (Hep3Vector & boost, HepAxisAngle & rotation) const {
76 rotation = HepAxisAngle();
77 boost = boostVector();
78}
79
80// ---------- Comparisons:
81
82double HepBoostZ::distance2( const HepBoost & b ) const {
83 return b.distance2(*this);
84}
85
86double HepBoostZ::distance2( const HepRotation & r ) const {
87 double db2 = norm2();
88 double dr2 = r.norm2();
89 return (db2 + dr2);
90}
91
92double HepBoostZ::distance2( const HepLorentzRotation & lt ) const {
93 HepBoost b1;
94 HepRotation r1;
95 lt.decompose(b1,r1);
96 double db2 = distance2(b1);
97 double dr2 = r1.norm2();
98 return (db2 + dr2);
99}
100
101bool HepBoostZ::isNear (const HepRotation & r, double epsilon) const {
102 double db2 = norm2();
103 if (db2 > epsilon*epsilon) return false;
104 double dr2 = r.norm2();
105 return (db2+dr2 <= epsilon*epsilon);
106}
107
109 double epsilon ) const {
110 HepBoost b1;
111 HepRotation r1;
112 double db2 = distance2(b1);
113 lt.decompose(b1,r1);
114 if (db2 > epsilon*epsilon) return false;
115 double dr2 = r1.norm2();
116 return (db2 + dr2);
117}
118
119// ---------- Properties:
120
122 // Assuming the representation of this is close to a true pure boost,
123 // but may have drifted due to round-off error from many operations,
124 // this forms an "exact" pure BoostZ matrix for again.
125
126 double b2 = beta_*beta_;
127 if (b2 >= 1) {
128 beta_ = 1.0 - 1.0e-8; // NaN-proofing
129 b2 = beta_*beta_;
130 }
131 gamma_ = 1.0 / std::sqrt(1.0 - b2);
132}
133
134// ---------- Application:
135
136// ---------- Operations in the group of 4-Rotations
137
139 return HepBoostZ ( (beta()+b.beta()) / (1+beta()*b.beta()) );
140}
142 HepLorentzRotation me (*this);
143 return me*b;
144}
146 HepLorentzRotation me (*this);
147 return me*r;
148}
150 HepLorentzRotation me (*this);
151 return me*lt;
152}
153
154// ---------- I/O
155
156std::ostream & HepBoostZ::print( std::ostream & os ) const {
157 os << "Boost in Z direction (beta = " << beta_
158 << ", gamma = " << gamma_ << ") ";
159 return os;
160}
161
162} // namespace CLHEP
HepBoostZ & set(double beta)
Definition: BoostZ.cc:22
double norm2() const
double beta() const
bool isNear(const HepBoostZ &b, double epsilon=Hep4RotationInterface::tolerance) const
Hep3Vector boostVector() const
std::ostream & print(std::ostream &os) const
Definition: BoostZ.cc:156
HepRep4x4 rep4x4() const
Definition: BoostZ.cc:38
HepRep4x4Symmetric rep4x4Symmetric() const
Definition: BoostZ.cc:46
double distance2(const HepBoostZ &b) const
double beta_
Definition: BoostZ.h:208
double gamma_
Definition: BoostZ.h:209
void rectify()
Definition: BoostZ.cc:121
void decompose(HepRotation &rotation, HepBoost &boost) const
Definition: BoostZ.cc:56
HepLorentzVector operator*(const HepLorentzVector &w) const
double distance2(const HepBoost &b) const
void decompose(Hep3Vector &boost, HepAxisAngle &rotation) const
double norm2() const
Definition: RotationP.cc:50
Definition: DoubConv.h:17