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
LorentzVectorK.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 part of the implementation of the HepLorentzVector class:
7// Those methods which originated from ZOOM and which deal with relativistic
8// kinematic properties.
9//
10
11#ifdef GNUPRAGMA
12#pragma implementation
13#endif
14
16
17#include <cmath>
18
19namespace CLHEP {
20
21//-******************
22// Metric flexibility
23//-******************
24
26 ZMpvMetric_t oldMetric = (metric > 0) ? TimePositive : TimeNegative;
27 if ( met == TimeNegative ) {
28 metric = -1.0;
29 } else {
30 metric = 1.0;
31 }
32 return oldMetric;
33}
34
36 return ( (metric > 0) ? TimePositive : TimeNegative );
37}
38
39//-********
40// plus
41// minus
42//-********
43
44double HepLorentzVector::plus (const Hep3Vector & ref) const {
45 double r = ref.mag();
46 if (r == 0) {
47 std::cerr << "HepLorentzVector::plus() - "
48 << "A zero vector used as reference to LorentzVector plus-part"
49 << std::endl;
50 return ee;
51 }
52 return ee + pp.dot(ref)/r;
53} /* plus */
54
55double HepLorentzVector::minus (const Hep3Vector & ref) const {
56 double r = ref.mag();
57 if (r == 0) {
58 std::cerr << "HepLorentzVector::minus() - "
59 << "A zero vector used as reference to LorentzVector minus-part"
60 << std::endl;
61 return ee;
62 }
63 return ee - pp.dot(ref)/r;
64} /* plus */
65
67 return HepLorentzVector (0, 0, 0, (t() < 0.0 ? -m() : m()));
68}
69
70//-********
71// beta
72// gamma
73//-********
74
75double HepLorentzVector::beta() const {
76 if (ee == 0) {
77 if (pp.mag2() == 0) {
78 return 0;
79 } else {
80 std::cerr << "HepLorentzVector::beta() - "
81 << "beta computed for HepLorentzVector with t=0 -- infinite result"
82 << std::endl;
83 return 1./ee;
84 }
85 }
86// if (restMass2() <= 0) {
87// std::cerr << "HepLorentzVector::beta() - "
88// << "beta computed for a non-timelike HepLorentzVector" << std::endl;
89// // result will make analytic sense but is physically meaningless
90// }
91 return std::sqrt (pp.mag2() / (ee*ee)) ;
92} /* beta */
93
95 double v2 = pp.mag2();
96 double t2 = ee*ee;
97 if (ee == 0) {
98 if (pp.mag2() == 0) {
99 return 1;
100 } else {
101 std::cerr << "HepLorentzVector::gamma() - "
102 << "gamma computed for HepLorentzVector with t=0 -- zero result"
103 << std::endl;
104 return 0;
105 }
106 }
107 if (t2 < v2) {
108 std::cerr << "HepLorentzVector::gamma() - "
109 << "gamma computed for a spacelike HepLorentzVector -- imaginary result"
110 << std::endl;
111 // analytic result would be imaginary.
112 return 0;
113// } else if ( t2 == v2 ) {
114// std::cerr << "HepLorentzVector::gamma() - "
115// << "gamma computed for a lightlike HepLorentzVector -- infinite result"
116// << std::endl;
117 }
118 return 1./std::sqrt(1. - v2/t2 );
119} /* gamma */
120
121
122//-***************
123// rapidity
124// pseudorapidity
125// eta
126//-***************
127
129 register double z1 = pp.getZ();
130// if (std::fabs(ee) == std::fabs(z1)) {
131// std::cerr << "HepLorentzVector::rapidity() - "
132// << "rapidity for 4-vector with |E| = |Pz| -- infinite result"
133// << std::endl;
134// }
135 if (std::fabs(ee) < std::fabs(z1)) {
136 std::cerr << "HepLorentzVector::rapidity() - "
137 << "rapidity for spacelike 4-vector with |E| < |Pz| -- undefined"
138 << std::endl;
139 return 0;
140 }
141 double q = (ee + z1) / (ee - z1);
142 //-| This cannot be negative now, since both numerator
143 //-| and denominator have the same sign as ee.
144 return .5 * std::log(q);
145} /* rapidity */
146
147double HepLorentzVector::rapidity(const Hep3Vector & ref) const {
148 register double r = ref.mag2();
149 if (r == 0) {
150 std::cerr << "HepLorentzVector::rapidity() - "
151 << "A zero vector used as reference to LorentzVector rapidity"
152 << std::endl;
153 return 0;
154 }
155 register double vdotu = pp.dot(ref)/std::sqrt(r);
156// if (std::fabs(ee) == std::fabs(vdotu)) {
157// std::cerr << "HepLorentzVector::rapidity() - "
158// << "rapidity for 4-vector with |E| = |Pu| -- infinite result"
159// << std::endl;
160// }
161 if (std::fabs(ee) < std::fabs(vdotu)) {
162 std::cerr << "HepLorentzVector::rapidity() - "
163 << "rapidity for spacelike 4-vector with |E| < |P*ref| -- undefined "
164 << std::endl;
165 return 0;
166 }
167 double q = (ee + vdotu) / (ee - vdotu);
168 return .5 * std::log(q);
169} /* rapidity(ref) */
170
172 register double v1 = pp.mag();
173// if (std::fabs(ee) == std::fabs(v1)) {
174// std::cerr << "HepLorentzVector::coLinearRapidity() - "
175// << "co-Linear rapidity for 4-vector with |E| = |P| -- infinite result"
176// << std::endl;
177// }
178 if (std::fabs(ee) < std::fabs(v1)) {
179 std::cerr << "HepLorentzVector::coLinearRapidity() - "
180 << "co-linear rapidity for spacelike 4-vector -- undefined"
181 << std::endl;
182 return 0;
183 }
184 double q = (ee + v1) / (ee - v1);
185 return .5 * std::log(q);
186} /* rapidity */
187
188//-*************
189// invariantMass
190//-*************
191
193 double m1 = invariantMass2(w);
194 if (m1 < 0) {
195 // We should find out why:
196 if ( ee * w.ee < 0 ) {
197 std::cerr << "HepLorentzVector::invariantMass() - "
198 << "invariant mass meaningless: \n"
199 << "a negative-mass input led to spacelike 4-vector sum" << std::endl;
200 return 0;
201 } else if ( (isSpacelike() && !isLightlike()) ||
202 (w.isSpacelike() && !w.isLightlike()) ) {
203 std::cerr << "HepLorentzVector::invariantMass() - "
204 << "invariant mass meaningless because of spacelike input"
205 << std::endl;
206 return 0;
207 } else {
208 // Invariant mass squared for a pair of timelike or lightlike vectors
209 // mathematically cannot be negative. If the vectors are within the
210 // tolerance of being lightlike or timelike, we can assume that prior
211 // or current roundoffs have caused the negative result, and return 0
212 // without comment.
213 return 0;
214 }
215 }
216 return (ee+w.ee >=0 ) ? std::sqrt(m1) : - std::sqrt(m1);
217} /* invariantMass */
218
219//-***************
220// findBoostToCM
221//-***************
222
224 return -boostVector();
225} /* boostToCM() */
226
228 double t1 = ee + w.ee;
229 Hep3Vector v1 = pp + w.pp;
230 if (t1 == 0) {
231 if (v1.mag2() == 0) {
232 return Hep3Vector(0,0,0);
233 } else {
234 std::cerr << "HepLorentzVector::findBoostToCM() - "
235 << "boostToCM computed for two 4-vectors with combined t=0 -- "
236 << "infinite result" << std::endl;
237 return Hep3Vector(v1*(1./t1)); // Yup, 1/0 -- that is how we return infinity
238 }
239 }
240// if (t1*t1 - v1.mag2() <= 0) {
241// std::cerr << "HepLorentzVector::findBoostToCM() - "
242// << "boostToCM computed for pair of HepLorentzVectors with non-timelike sum"
243// << std::endl;
244// // result will make analytic sense but is physically meaningless
245// }
246 return Hep3Vector(v1 * (-1./t1));
247} /* boostToCM(w) */
248
249} // namespace CLHEP
250
double getZ() const
double mag2() const
double dot(const Hep3Vector &) const
double mag() const
double invariantMass() const
Hep3Vector boostVector() const
HepLorentzVector rest4Vector() const
static ZMpvMetric_t getMetric()
double minus() const
bool isLightlike(double epsilon=tolerance) const
double invariantMass2() const
double coLinearRapidity() const
Hep3Vector findBoostToCM() const
static ZMpvMetric_t setMetric(ZMpvMetric_t met)
bool isSpacelike() const
Definition: DoubConv.h:17
@ TimePositive
Definition: LorentzVector.h:64
@ TimeNegative
Definition: LorentzVector.h:64