Geant4  10.00.p01
LorentzVector.icc
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 definitions of the inline member functions of the
8 // HepLorentzVector class.
9 //
10 
11 #include <cmath>
12 
13 namespace CLHEP {
14 
15 inline double HepLorentzVector::x() const { return pp.x(); }
16 inline double HepLorentzVector::y() const { return pp.y(); }
17 inline double HepLorentzVector::z() const { return pp.z(); }
18 inline double HepLorentzVector::t() const { return ee; }
19 
20 inline HepLorentzVector::
21 HepLorentzVector(double x1, double y1, double z1, double t1)
22  : pp(x1, y1, z1), ee(t1) {}
23 
24 inline HepLorentzVector:: HepLorentzVector(double x1, double y1, double z1)
25  : pp(x1, y1, z1), ee(0) {}
26 
27 inline HepLorentzVector:: HepLorentzVector(double t1)
28  : pp(0, 0, 0), ee(t1) {}
29 
30 inline HepLorentzVector:: HepLorentzVector()
31  : pp(0, 0, 0), ee(0) {}
32 
33 inline HepLorentzVector::HepLorentzVector(const Hep3Vector & p, double e1)
34  : pp(p), ee(e1) {}
35 
36 inline HepLorentzVector::HepLorentzVector(double e1, const Hep3Vector & p)
37  : pp(p), ee(e1) {}
38 
39 inline HepLorentzVector::HepLorentzVector(const HepLorentzVector & p)
40  : pp(p.x(), p.y(), p.z()), ee(p.t()) {}
41 
42 inline HepLorentzVector::~HepLorentzVector() {}
43 
44 inline HepLorentzVector::operator const Hep3Vector & () const {return pp;}
45 inline HepLorentzVector::operator Hep3Vector & () { return pp; }
46 
47 inline void HepLorentzVector::setX(double a) { pp.setX(a); }
48 inline void HepLorentzVector::setY(double a) { pp.setY(a); }
49 inline void HepLorentzVector::setZ(double a) { pp.setZ(a); }
50 inline void HepLorentzVector::setT(double a) { ee = a;}
51 
52 inline double HepLorentzVector::px() const { return pp.x(); }
53 inline double HepLorentzVector::py() const { return pp.y(); }
54 inline double HepLorentzVector::pz() const { return pp.z(); }
55 inline double HepLorentzVector::e() const { return ee; }
56 
57 inline void HepLorentzVector::setPx(double a) { pp.setX(a); }
58 inline void HepLorentzVector::setPy(double a) { pp.setY(a); }
59 inline void HepLorentzVector::setPz(double a) { pp.setZ(a); }
60 inline void HepLorentzVector::setE(double a) { ee = a;}
61 
62 inline Hep3Vector HepLorentzVector::vect() const { return pp; }
63 inline void HepLorentzVector::setVect(const Hep3Vector &p) { pp = p; }
64 
65 inline double HepLorentzVector::theta() const { return pp.theta(); }
66 inline double HepLorentzVector::cosTheta() const { return pp.cosTheta(); }
67 inline double HepLorentzVector::phi() const { return pp.phi(); }
68 inline double HepLorentzVector::rho() const { return pp.mag(); }
69 
70 inline void HepLorentzVector::setTheta(double a) { pp.setTheta(a); }
71 inline void HepLorentzVector::setPhi(double a) { pp.setPhi(a); }
72 inline void HepLorentzVector::setRho(double a) { pp.setMag(a); }
73 
74 double & HepLorentzVector::operator [] (int i) { return (*this)(i); }
75 double HepLorentzVector::operator [] (int i) const { return (*this)(i); }
76 
77 inline HepLorentzVector &
78 HepLorentzVector::operator = (const HepLorentzVector & q) {
79  pp = q.vect();
80  ee = q.t();
81  return *this;
82 }
83 
84 inline HepLorentzVector
85 HepLorentzVector::operator + (const HepLorentzVector & q) const {
86  return HepLorentzVector(x()+q.x(), y()+q.y(), z()+q.z(), t()+q.t());
87 }
88 
89 inline HepLorentzVector &
90 HepLorentzVector::operator += (const HepLorentzVector & q) {
91  pp += q.vect();
92  ee += q.t();
93  return *this;
94 }
95 
96 inline HepLorentzVector
97 HepLorentzVector::operator - (const HepLorentzVector & q) const {
98  return HepLorentzVector(x()-q.x(), y()-q.y(), z()-q.z(), t()-q.t());
99 }
100 
101 inline HepLorentzVector &
102 HepLorentzVector::operator -= (const HepLorentzVector & q) {
103  pp -= q.vect();
104  ee -= q.t();
105  return *this;
106 }
107 
108 inline HepLorentzVector HepLorentzVector::operator - () const {
109  return HepLorentzVector(-x(), -y(), -z(), -t());
110 }
111 
112 inline HepLorentzVector& HepLorentzVector::operator *= (double a) {
113  pp *= a;
114  ee *= a;
115  return *this;
116 }
117 
118 inline bool
119 HepLorentzVector::operator == (const HepLorentzVector & q) const {
120  return (vect()==q.vect() && t()==q.t());
121 }
122 
123 inline bool
124 HepLorentzVector::operator != (const HepLorentzVector & q) const {
125  return (vect()!=q.vect() || t()!=q.t());
126 }
127 
128 inline double HepLorentzVector::perp2() const { return pp.perp2(); }
129 inline double HepLorentzVector::perp() const { return pp.perp(); }
130 inline void HepLorentzVector::setPerp(double a) { pp.setPerp(a); }
131 
132 inline double HepLorentzVector::perp2(const Hep3Vector &v1) const {
133  return pp.perp2(v1);
134 }
135 
136 inline double HepLorentzVector::perp(const Hep3Vector &v1) const {
137  return pp.perp(v1);
138 }
139 
140 inline double HepLorentzVector::angle(const Hep3Vector &v1) const {
141  return pp.angle(v1);
142 }
143 
144 inline double HepLorentzVector::mag2() const {
145  return metric*(t()*t() - pp.mag2());
146 }
147 
148 inline double HepLorentzVector::mag() const {
149  double mmm = m2();
150  return mmm < 0.0 ? -std::sqrt(-mmm) : std::sqrt(mmm);
151 }
152 
153 inline double HepLorentzVector::m2() const {
154  return t()*t() - pp.mag2();
155 }
156 
157 inline double HepLorentzVector::m() const { return mag(); }
158 
159 inline double HepLorentzVector::mt2() const {
160  return e()*e() - pz()*pz();
161 }
162 
163 inline double HepLorentzVector::mt() const {
164  double mmm = mt2();
165  return mmm < 0.0 ? -std::sqrt(-mmm) : std::sqrt(mmm);
166 }
167 
168 inline double HepLorentzVector::et2() const {
169  double pt2 = pp.perp2();
170  return pt2 == 0 ? 0 : e()*e() * pt2/(pt2+z()*z());
171 }
172 
173 inline double HepLorentzVector::et() const {
174  double etet = et2();
175  return e() < 0.0 ? -std::sqrt(etet) : std::sqrt(etet);
176 }
177 
178 inline double HepLorentzVector::et2(const Hep3Vector & v1) const {
179  double pt2 = pp.perp2(v1);
180  double pv = pp.dot(v1.unit());
181  return pt2 == 0 ? 0 : e()*e() * pt2/(pt2+pv*pv);
182 }
183 
184 inline double HepLorentzVector::et(const Hep3Vector & v1) const {
185  double etet = et2(v1);
186  return e() < 0.0 ? -std::sqrt(etet) : std::sqrt(etet);
187 }
188 
189 inline void
190 HepLorentzVector::setVectMag(const Hep3Vector & spatial, double magnitude) {
191  setVect(spatial);
192  setT(std::sqrt(magnitude * magnitude + spatial * spatial));
193 }
194 
195 inline void
196 HepLorentzVector::setVectM(const Hep3Vector & spatial, double mass) {
197  setVectMag(spatial, mass);
198 }
199 
200 inline double HepLorentzVector::dot(const HepLorentzVector & q) const {
201  return metric*(t()*q.t() - z()*q.z() - y()*q.y() - x()*q.x());
202 }
203 
204 inline double
205 HepLorentzVector::operator * (const HepLorentzVector & q) const {
206  return dot(q);
207 }
208 
209 inline double HepLorentzVector::plus() const {
210  return t() + z();
211 }
212 
213 inline double HepLorentzVector::minus() const {
214  return t() - z();
215 }
216 
217 inline HepLorentzVector & HepLorentzVector::boost(const Hep3Vector & b) {
218  return boost(b.x(), b.y(), b.z());
219 }
220 
221 inline double HepLorentzVector::pseudoRapidity() const {
222  return pp.pseudoRapidity();
223 }
224 
225 inline double HepLorentzVector::eta() const {
226  return pp.pseudoRapidity();
227 }
228 
229 inline double HepLorentzVector::eta( const Hep3Vector & ref ) const {
230  return pp.eta( ref );
231 }
232 
233 inline HepLorentzVector &
234 HepLorentzVector::operator *= (const HepRotation & m1) {
235  pp.transform(m1);
236  return *this;
237 }
238 
239 inline HepLorentzVector &
240 HepLorentzVector::transform(const HepRotation & m1) {
241  pp.transform(m1);
242  return *this;
243 }
244 
245 inline HepLorentzVector operator * (const HepLorentzVector & p, double a) {
246  return HepLorentzVector(a*p.x(), a*p.y(), a*p.z(), a*p.t());
247 }
248 
249 inline HepLorentzVector operator * (double a, const HepLorentzVector & p) {
250  return HepLorentzVector(a*p.x(), a*p.y(), a*p.z(), a*p.t());
251 }
252 
253 // The following were added when ZOOM PhysicsVectors was merged in:
254 
255 inline HepLorentzVector::HepLorentzVector(
256  double x1, double y1, double z1, Tcomponent t1 ) :
257  pp(x1, y1, z1), ee(t1) {}
258 
259 inline void HepLorentzVector::set(
260  double x1, double y1, double z1, Tcomponent t1 ) {
261  pp.set(x1,y1,z1);
262  ee = t1;
263 }
264 
265 inline void HepLorentzVector::set(
266  double x1, double y1, double z1, double t1 ) {
267  set (x1,y1,z1,Tcomponent(t1));
268 }
269 
270 inline HepLorentzVector::HepLorentzVector(
271  Tcomponent t1, double x1, double y1, double z1 ) :
272  pp(x1, y1, z1), ee(t1) {}
273 
274 inline void HepLorentzVector::set(
275  Tcomponent t1, double x1, double y1, double z1 ) {
276  pp.set(x1,y1,z1);
277  ee = t1;
278 }
279 
280 inline void HepLorentzVector::set( Tcomponent t1 ) {
281  pp.set(0, 0, 0);
282  ee = t1;
283 }
284 
285 inline void HepLorentzVector::set( double t1 ) {
286  pp.set(0, 0, 0);
287  ee = t1;
288 }
289 
290 inline HepLorentzVector::HepLorentzVector( Tcomponent t1 ) :
291  pp(0, 0, 0), ee(t1) {}
292 
293 inline void HepLorentzVector::set( const Hep3Vector & v1 ) {
294  pp = v1;
295  ee = 0;
296 }
297 
298 inline HepLorentzVector::HepLorentzVector( const Hep3Vector & v1 ) :
299  pp(v1), ee(0) {}
300 
301 inline void HepLorentzVector::setV(const Hep3Vector & v1) {
302  pp = v1;
303 }
304 
305 inline HepLorentzVector & HepLorentzVector::operator=(const Hep3Vector & v1) {
306  pp = v1;
307  ee = 0;
308  return *this;
309 }
310 
311 inline double HepLorentzVector::getX() const { return pp.x(); }
312 inline double HepLorentzVector::getY() const { return pp.y(); }
313 inline double HepLorentzVector::getZ() const { return pp.z(); }
314 inline double HepLorentzVector::getT() const { return ee; }
315 
316 inline Hep3Vector HepLorentzVector::getV() const { return pp; }
317 inline Hep3Vector HepLorentzVector::v() const { return pp; }
318 
319 inline void HepLorentzVector::set(double t1, const Hep3Vector & v1) {
320  pp = v1;
321  ee = t1;
322 }
323 
324 inline void HepLorentzVector::set(const Hep3Vector & v1, double t1) {
325  pp = v1;
326  ee = t1;
327 }
328 
329 inline void HepLorentzVector::setV( double x1,
330  double y1,
331  double z1 ) { pp.set(x1, y1, z1); }
332 
333 inline void HepLorentzVector::setRThetaPhi
334  ( double r1, double theta1, double phi1 )
335  { pp.setRThetaPhi( r1, theta1, phi1 ); }
336 
337 inline void HepLorentzVector::setREtaPhi
338  ( double r1, double eta1, double phi1 )
339  { pp.setREtaPhi( r1, eta1, phi1 ); }
340 
341 inline void HepLorentzVector::setRhoPhiZ
342  ( double rho1, double phi1, double z1 )
343  { pp.setRhoPhiZ ( rho1, phi1, z1 ); }
344 
345 inline bool HepLorentzVector::isTimelike() const {
346  return restMass2() > 0;
347 }
348 
349 inline bool HepLorentzVector::isSpacelike() const {
350  return restMass2() < 0;
351 }
352 
353 inline bool HepLorentzVector::isLightlike(double epsilon) const {
354  return std::fabs(restMass2()) < 2.0 * epsilon * ee * ee;
355 }
356 
357 inline double HepLorentzVector::diff2( const HepLorentzVector & w ) const {
358  return metric*( (ee-w.ee)*(ee-w.ee) - (pp-w.pp).mag2() );
359 }
360 
361 inline double HepLorentzVector::delta2Euclidean
362  ( const HepLorentzVector & w ) const {
363  return (ee-w.ee)*(ee-w.ee) + (pp-w.pp).mag2();
364 }
365 
366 inline double HepLorentzVector::euclideanNorm2() const {
367  return ee*ee + pp.mag2();
368 }
369 
370 inline double HepLorentzVector::euclideanNorm() const {
371  return std::sqrt(euclideanNorm2());
372 }
373 
374 inline double HepLorentzVector::restMass2() const { return m2(); }
375 inline double HepLorentzVector::invariantMass2() const { return m2(); }
376 
377 inline double HepLorentzVector::restMass() const {
378 // if( t() < 0.0 )
379 // std::cerr << "HepLorentzVector::restMass() - "
380 // << "E^2-p^2 < 0 for this particle. Magnitude returned."
381 // << std::endl;
382  return t() < 0.0 ? -m() : m();
383 }
384 
385 inline double HepLorentzVector::invariantMass() const {
386 // if( t() < 0.0 )
387 // std::cerr << "HepLorentzVector::invariantMass() - "
388 // << "E^2-p^2 < 0 for this particle. Magnitude returned."
389 // << std::endl;
390  return t() < 0.0 ? -m() : m();
391 }
392 
393 inline double HepLorentzVector::invariantMass2
394  (const HepLorentzVector & w) const {
395  return (*this + w).m2();
396 } /* invariantMass2 */
397 
398 //-*********
399 // boostOf()
400 //-*********
401 
402 // Each of these is a shell over a boost method.
403 
404 inline HepLorentzVector boostXOf
405  (const HepLorentzVector & vec, double bbeta) {
406  HepLorentzVector vv (vec);
407  return vv.boostX (bbeta);
408 }
409 
410 inline HepLorentzVector boostYOf
411  (const HepLorentzVector & vec, double bbeta) {
412  HepLorentzVector vv (vec);
413  return vv.boostY (bbeta);
414 }
415 
416 inline HepLorentzVector boostZOf
417  (const HepLorentzVector & vec, double bbeta) {
418  HepLorentzVector vv (vec);
419  return vv.boostZ (bbeta);
420 }
421 
422 inline HepLorentzVector boostOf
423  (const HepLorentzVector & vec, const Hep3Vector & betaVector ) {
424  HepLorentzVector vv (vec);
425  return vv.boost (betaVector);
426 }
427 
428 inline HepLorentzVector boostOf
429  (const HepLorentzVector & vec, const Hep3Vector & aaxis, double bbeta) {
430  HepLorentzVector vv (vec);
431  return vv.boost (aaxis, bbeta);
432 }
433 
434 } // namespace CLHEP