Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
LorentzVector.cc
Go to the documentation of this file.
1// -*- C++ -*-
2// $Id:$
3// ---------------------------------------------------------------------------
4//
5// This file is a part of the CLHEP - a Class Library for High Energy Physics.
6//
7// This is the implementation of that portion of the HepLorentzVector class
8// which was in the original CLHEP and which does not force loading of either
9// Rotation.cc or LorentzRotation.cc
10//
11
12#ifdef GNUPRAGMA
13#pragma implementation
14#endif
15
17
18#include <iostream>
19
20namespace CLHEP {
21
22double HepLorentzVector::tolerance =
23 Hep3Vector::ToleranceTicks * 2.22045e-16;
24double HepLorentzVector::metric = 1.0;
25
26double HepLorentzVector::operator () (int i) const {
27 switch(i) {
28 case X:
29 case Y:
30 case Z:
31 return pp(i);
32 case T:
33 return e();
34 default:
35 std::cerr << "HepLorentzVector subscripting: bad index (" << i << ")"
36 << std::endl;
37 }
38 return 0.;
39}
40
42 static double dummy;
43 switch(i) {
44 case X:
45 case Y:
46 case Z:
47 return pp(i);
48 case T:
49 return ee;
50 default:
51 std::cerr
52 << "HepLorentzVector subscripting: bad index (" << i << ")"
53 << std::endl;
54 return dummy;
55 }
56}
57
59 (double bx, double by, double bz){
60 double b2 = bx*bx + by*by + bz*bz;
61 register double ggamma = 1.0 / std::sqrt(1.0 - b2);
62 register double bp = bx*x() + by*y() + bz*z();
63 register double gamma2 = b2 > 0 ? (ggamma - 1.0)/b2 : 0.0;
64
65 setX(x() + gamma2*bp*bx + ggamma*bx*t());
66 setY(y() + gamma2*bp*by + ggamma*by*t());
67 setZ(z() + gamma2*bp*bz + ggamma*bz*t());
68 setT(ggamma*(t() + bp));
69 return *this;
70}
71
73 pp.rotateX(a);
74 return *this;
75}
77 pp.rotateY(a);
78 return *this;
79}
81 pp.rotateZ(a);
82 return *this;
83}
84
86 pp.rotateUz(v1);
87 return *this;
88}
89
90std::ostream & operator<< (std::ostream & os, const HepLorentzVector & v1)
91{
92 return os << "(" << v1.x() << "," << v1.y() << "," << v1.z()
93 << ";" << v1.t() << ")";
94}
95
96std::istream & operator>> (std::istream & is, HepLorentzVector & v1) {
97
98// Required format is ( a, b, c; d ) that is, four numbers, preceded by
99// (, followed by ), components of the spatial vector separated by commas,
100// time component separated by semicolon. The four numbers are taken
101// as x, y, z, t.
102
103 double x, y, z, t;
104 char c;
105
106 is >> std::ws >> c;
107 // ws is defined to invoke eatwhite(istream & )
108 // see (Stroustrup gray book) page 333 and 345.
109 if (is.fail() || c != '(' ) {
110 std::cerr << "Could not find required opening parenthesis "
111 << "in input of a HepLorentzVector" << std::endl;
112 return is;
113 }
114
115 is >> x >> std::ws >> c;
116 if (is.fail() || c != ',' ) {
117 std::cerr << "Could not find x value and required trailing comma "
118 << "in input of a HepLorentzVector" << std::endl;
119 return is;
120 }
121
122 is >> y >> std::ws >> c;
123 if (is.fail() || c != ',' ) {
124 std::cerr << "Could not find y value and required trailing comma "
125 << "in input of a HepLorentzVector" << std::endl;
126 return is;
127 }
128
129 is >> z >> std::ws >> c;
130 if (is.fail() || c != ';' ) {
131 std::cerr << "Could not find z value and required trailing semicolon "
132 << "in input of a HepLorentzVector" << std::endl;
133 return is;
134 }
135
136 is >> t >> std::ws >> c;
137 if (is.fail() || c != ')' ) {
138 std::cerr << "Could not find t value and required close parenthesis "
139 << "in input of a HepLorentzVector" << std::endl;
140 return is;
141 }
142
143 v1.setX(x);
144 v1.setY(y);
145 v1.setZ(z);
146 v1.setT(t);
147 return is;
148}
149
150// The following were added when ZOOM classes were merged in:
151
153// if (c == 0) {
154// std::cerr << "HepLorentzVector::operator /=() - "
155// << "Attempt to do LorentzVector /= 0 -- \n"
156// << "division by zero would produce infinite or NAN components"
157// << std::endl;
158// }
159 double oneOverC = 1.0/c;
160 pp *= oneOverC;
161 ee *= oneOverC;
162 return *this;
163} /* w /= c */
164
166// if (c == 0) {
167// std::cerr << "HepLorentzVector::operator /() - "
168// << "Attempt to do LorentzVector / 0 -- \n"
169// << "division by zero would produce infinite or NAN components"
170// << std::endl;
171// }
172 double oneOverC = 1.0/c;
173 return HepLorentzVector (w.getV() * oneOverC,
174 w.getT() * oneOverC);
175} /* LV = w / c */
176
178 if (ee == 0) {
179 if (pp.mag2() == 0) {
180 return Hep3Vector(0,0,0);
181 } else {
182 std::cerr << "HepLorentzVector::boostVector() - "
183 << "boostVector computed for LorentzVector with t=0 -- infinite result"
184 << std::endl;
185 return pp/ee;
186 }
187 }
188 if (restMass2() <= 0) {
189 std::cerr << "HepLorentzVector::boostVector() - "
190 << "boostVector computed for a non-timelike LorentzVector " << std::endl;
191 // result will make analytic sense but is physically meaningless
192 }
193 return pp * (1./ee);
194} /* boostVector */
195
196
198 register double b2 = bbeta*bbeta;
199 if (b2 >= 1) {
200 std::cerr << "HepLorentzVector::boostX() - "
201 << "boost along X with beta >= 1 (speed of light) -- \n"
202 << "no boost done" << std::endl;
203 } else {
204 register double ggamma = std::sqrt(1./(1-b2));
205 register double tt = ee;
206 ee = ggamma*(ee + bbeta*pp.getX());
207 pp.setX(ggamma*(pp.getX() + bbeta*tt));
208 }
209 return *this;
210} /* boostX */
211
213 register double b2 = bbeta*bbeta;
214 if (b2 >= 1) {
215 std::cerr << "HepLorentzVector::boostY() - "
216 << "boost along Y with beta >= 1 (speed of light) -- \n"
217 << "no boost done" << std::endl;
218 } else {
219 register double ggamma = std::sqrt(1./(1-b2));
220 register double tt = ee;
221 ee = ggamma*(ee + bbeta*pp.getY());
222 pp.setY(ggamma*(pp.getY() + bbeta*tt));
223 }
224 return *this;
225} /* boostY */
226
228 register double b2 = bbeta*bbeta;
229 if (b2 >= 1) {
230 std::cerr << "HepLorentzVector::boostZ() - "
231 << "boost along Z with beta >= 1 (speed of light) -- \n"
232 << "no boost done" << std::endl;
233 } else {
234 register double ggamma = std::sqrt(1./(1-b2));
235 register double tt = ee;
236 ee = ggamma*(ee + bbeta*pp.getZ());
237 pp.setZ(ggamma*(pp.getZ() + bbeta*tt));
238 }
239 return *this;
240} /* boostZ */
241
242double HepLorentzVector::setTolerance ( double tol ) {
243// Set the tolerance for two LorentzVectors to be considered near each other
244 double oldTolerance (tolerance);
245 tolerance = tol;
246 return oldTolerance;
247}
248
250// Get the tolerance for two LorentzVectors to be considered near each other
251 return tolerance;
252}
253
254} // namespace CLHEP
Hep3Vector & rotateY(double)
Definition: ThreeVector.cc:134
Hep3Vector & rotateX(double)
Definition: ThreeVector.cc:124
double getZ() const
void setY(double)
double mag2() const
Hep3Vector & rotateZ(double)
Definition: ThreeVector.cc:144
void setZ(double)
double getX() const
void setX(double)
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:72
double getY() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
HepLorentzVector & boostZ(double beta)
Hep3Vector getV() const
static double setTolerance(double tol)
double restMass2() const
HepLorentzVector & boostX(double beta)
HepLorentzVector & rotateZ(double)
HepLorentzVector & boostY(double beta)
HepLorentzVector & rotateX(double)
HepLorentzVector & operator/=(double)
HepLorentzVector & rotateUz(const Hep3Vector &)
static double getTolerance()
HepLorentzVector & rotateY(double)
double operator()(int) const
Definition: DoubConv.h:17
std::istream & operator>>(std::istream &is, HepRandom &dist)
Definition: Random.cc:120
std::ostream & operator<<(std::ostream &os, const HepRandom &dist)
Definition: Random.cc:116
HepLorentzVector operator/(const HepLorentzVector &, double a)