Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
LorentzRotationD.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 those parts of the HepLorentzRotation class
7// which involve decomposition into Boost*Rotation.
8
9#ifdef GNUPRAGMA
10#pragma implementation
11#endif
12
14
15namespace CLHEP {
16
17// ---------- Decomposition:
18
20 (HepBoost & bboost, HepRotation & rotation) const {
21
22 // The boost will be the pure boost based on column 4 of the transformation
23 // matrix. Since the constructor takes the beta vector, and not beta*gamma,
24 // we first divide through by gamma = the tt element. This of course can
25 // never be zero since the last row has t**2 - v**2 = +1.
26
27 Hep3Vector betaVec ( xt(), yt(), zt() );
28 betaVec *= 1.0 / tt();
29 bboost.set( betaVec );
30
31 // The rotation will be inverse of B times T.
32
33 HepBoost B( -betaVec );
34 HepLorentzRotation R( B * *this );
35
36 HepRep3x3 m1 ( R.xx(), R.xy(), R.xz(),
37 R.yx(), R.yy(), R.yz(),
38 R.zx(), R.zy(), R.zz() );
39 rotation.set( m1 );
40 rotation.rectify();
41
42 return;
43
44}
45
47 (Hep3Vector & bboost, HepAxisAngle & rotation) const {
49 HepBoost b;
50 decompose(b,r);
51 bboost = b.boostVector();
52 rotation = r.axisAngle();
53 return;
54}
55
57 (HepRotation & rotation, HepBoost & bboost) const {
58
59 // In this case the pure boost is based on row 4 of the matrix.
60
61 Hep3Vector betaVec( tx(), ty(), tz() );
62 betaVec *= 1.0 / tt();
63 bboost.set( betaVec );
64
65 // The rotation will be T times the inverse of B.
66
67 HepBoost B( -betaVec );
68 HepLorentzRotation R( *this * B );
69
70 HepRep3x3 m1 ( R.xx(), R.xy(), R.xz(),
71 R.yx(), R.yy(), R.yz(),
72 R.zx(), R.zy(), R.zz() );
73 rotation.set( m1 );
74 rotation.rectify();
75 return;
76
77}
78
80 (HepAxisAngle & rotation, Hep3Vector & bboost) const {
82 HepBoost b;
83 decompose(r,b);
84 rotation = r.axisAngle();
85 bboost = b.boostVector();
86 return;
87}
88
89double HepLorentzRotation::distance2( const HepBoost & b ) const {
90 HepBoost b1;
91 HepRotation r1;
92 decompose( b1, r1 );
93 double db2 = b1.distance2( b );
94 double dr2 = r1.norm2();
95 return ( db2 + dr2 );
96}
97
98double HepLorentzRotation::distance2( const HepRotation & r ) const {
99 HepBoost b1;
100 HepRotation r1;
101 decompose( b1, r1 );
102 double db2 = b1.norm2( );
103 double dr2 = r1.distance2( r );
104 return ( db2 + dr2 );
105}
106
108 const HepLorentzRotation & lt ) const {
109 HepBoost b1;
110 HepRotation r1;
111 decompose( b1, r1 );
112 HepBoost b2;
113 HepRotation r2;
114 lt.decompose (b2, r2);
115 double db2 = b1.distance2( b2 );
116 double dr2 = r1.distance2( r2 );
117 return ( db2 + dr2 );
118}
119
120double HepLorentzRotation::howNear( const HepBoost & b ) const {
121 return std::sqrt( distance2( b ) );
122}
123double HepLorentzRotation::howNear( const HepRotation & r ) const {
124 return std::sqrt( distance2( r ) );
125}
127 return std::sqrt( distance2( lt ) );
128}
129
131 const HepBoost & b, double epsilon ) const {
132 HepBoost b1;
133 HepRotation r1;
134 decompose( b1, r1 );
135 double db2 = b1.distance2(b);
136 if ( db2 > epsilon*epsilon ) {
137 return false; // Saves the time-consuming Rotation::norm2
138 }
139 double dr2 = r1.norm2();
140 return ( (db2 + dr2) <= epsilon*epsilon );
141}
142
144 const HepRotation & r, double epsilon ) const {
145 HepBoost b1;
146 HepRotation r1;
147 decompose( b1, r1 );
148 double db2 = b1.norm2();
149 if ( db2 > epsilon*epsilon ) {
150 return false; // Saves the time-consuming Rotation::distance2
151 }
152 double dr2 = r1.distance2(r);
153 return ( (db2 + dr2) <= epsilon*epsilon );
154}
155
157 const HepLorentzRotation & lt, double epsilon ) const {
158 HepBoost b1;
159 HepRotation r1;
160 decompose( b1, r1 );
161 HepBoost b2;
162 HepRotation r2;
163 lt.decompose (b2, r2);
164 double db2 = b1.distance2(b2);
165 if ( db2 > epsilon*epsilon ) {
166 return false; // Saves the time-consuming Rotation::distance2
167 }
168 double dr2 = r1.distance2(r2);
169 return ( (db2 + dr2) <= epsilon*epsilon );
170}
171
173 HepBoost b;
174 HepRotation r;
175 decompose( b, r );
176 return b.norm2() + r.norm2();
177}
178
180
181 // Assuming the representation of this is close to a true LT,
182 // but may have drifted due to round-off error from many operations,
183 // this forms an "exact" orthosymplectic matrix for the LT again.
184
185 // There are several ways to do this, all equivalent to lowest order in
186 // the corrected error. We choose to form an LT based on the inverse boost
187 // extracted from row 4, and left-multiply by LT to form what would be
188 // a rotation if the LT were kosher. We drop the possibly non-zero t
189 // components of that, rectify that rotation and multiply back by the boost.
190
191 Hep3Vector beta (tx(), ty(), tz());
192 double gam = tt(); // NaN-proofing
193 if ( gam <= 0 ) {
194 std::cerr << "HepLorentzRotation::rectify() - "
195 << "rectify() on a transformation with tt() <= 0 - will not help!"
196 << std::endl;
197 gam = 1;
198 }
199 beta *= 1.0/gam;
200 HepLorentzRotation R = (*this) * HepBoost(-beta);
201
202 HepRep3x3 m1 ( R.xx(), R.xy(), R.xz(),
203 R.yx(), R.yy(), R.yz(),
204 R.zx(), R.zy(), R.zz() );
205
206 HepRotation Rgood (m1);
207 Rgood.rectify();
208
209 set ( Rgood, HepBoost(beta) );
210}
211
212} // namespace CLHEP
double norm2() const
Definition: Boost.cc:138
HepBoost & set(double betaX, double betaY, double betaZ)
Definition: Boost.cc:21
double distance2(const HepBoost &b) const
Hep3Vector boostVector() const
double howNear(const HepBoost &b) const
void decompose(Hep3Vector &boost, HepAxisAngle &rotation) const
bool isNear(const HepBoost &b, double epsilon=Hep4RotationInterface::tolerance) const
HepLorentzRotation & set(double bx, double by, double bz)
double distance2(const HepBoost &b) const
HepAxisAngle axisAngle() const
Definition: RotationA.cc:102
double distance2(const HepRotation &r) const
Definition: RotationP.cc:33
double norm2() const
Definition: RotationP.cc:50
HepRotation & set(const Hep3Vector &axis, double delta)
Definition: RotationA.cc:27
Definition: DoubConv.h:17