MARLEY (Model of Argon Reaction Low Energy Yields) v2.0.0
A Monte Carlo event generator for tens-of-MeV neutrino interactions
Loading...
Searching...
No Matches
FourVector.h
1// -*- C++ -*-
2//
3// This file is part of HepMC
4// Copyright (C) 2014-2023 The HepMC collaboration (see AUTHORS for details)
5//
6#ifndef HEPMC3_FOURVECTOR_H
7#define HEPMC3_FOURVECTOR_H
12#include <cmath>
13#include <limits>
14#ifndef M_PI
16#define M_PI 3.14159265358979323846264338327950288
17#endif
18namespace HepMC3 {
19
20
37public:
38
41 : m_v1(0.0), m_v2(0.0), m_v3(0.0), m_v4(0.0) {}
42
43 FourVector(double xx, double yy, double zz, double ee)
44 : m_v1(xx), m_v2(yy), m_v3(zz), m_v4(ee) {}
45
46 FourVector(const FourVector &) = default;
48 FourVector(FourVector && ) = default;
50 FourVector& operator=(const FourVector&) = default;
53
56
58 void set(double x1, double x2, double x3, double x4) {
59 m_v1 = x1;
60 m_v2 = x2;
61 m_v3 = x3;
62 m_v4 = x4;
63 }
64
66 void set_component(const int i, const double x)
67 {
68 if (i==0) {m_v1=x; return; }
69 if (i==1) {m_v2=x; return; }
70 if (i==2) {m_v3=x; return; }
71 if (i==3) {m_v4=x; return; }
72 }
73
74 double get_component(const int i) const
75 {
76 if (i==0) return m_v1;
77 if (i==1) return m_v2;
78 if (i==2) return m_v3;
79 if (i==3) return m_v4;
80 return 0.0;
81 }
82
83
85 double x() const { return m_v1; }
87 void set_x(double xx) { m_v1 = xx; }
89 void setX(double xx) { set_x(xx); }
90
92 double y() const { return m_v2; }
94 void set_y(double yy) { m_v2 = yy; }
96 void setY(double yy) { set_y(yy); }
97
99 double z() const { return m_v3; }
101 void set_z(double zz) { m_v3 = zz; }
103 void setZ(double zz) { set_z(zz); }
104
106 double t() const { return m_v4; }
108 void set_t(double tt) { m_v4 = tt; }
110 void setT(double tt) { set_t(tt); }
111
112
114 double px() const { return x(); }
116 void set_px(double pxx) { set_x(pxx); }
118 void setPx(double pxx) { set_px(pxx); }
119
121 double py() const { return y(); }
123 void set_py(double pyy) { set_y(pyy); }
125 void setPy(double pyy) { set_py(pyy); }
126
128 double pz() const { return z(); }
130 void set_pz(double pzz) { set_z(pzz); }
132 void setPz(double pzz) { set_pz(pzz); }
133
135 double e() const { return t(); }
137 void set_e(double ee ) { this->set_t(ee); }
139 void setE(double ee) { set_e(ee); }
140
142
143
146
148 double length2() const { return x()*x() + y()*y() + z()*z(); }
150 double length() const { return std::sqrt(length2()); }
152 double rho() const { return length(); }
154 double perp2() const { return x()*x() + y()*y(); }
156 double perp() const { return std::sqrt(perp2()); }
158 double interval() const { return t()*t() - length2(); }
159
161 double p3mod2() const { return length2(); }
163 double p3mod() const { return length(); }
165 double pt2() const { return perp2(); }
167 double pt() const { return perp(); }
169 double m2() const { return interval(); }
171 double m() const { return (m2() > 0.0) ? std::sqrt(m2()) : -std::sqrt(-m2()); }
172
174 double phi() const { return std::atan2( y(), x() ); }
176 double theta() const { return std::atan2( perp(), z() ); }
178 double eta() const {
179 if ( p3mod() == 0.0 ) return 0.0;
180 if ( p3mod() == fabs(pz()) ) return std::copysign(HUGE_VAL, pz());
181 return 0.5*std::log( (p3mod() + pz()) / (p3mod() - pz()) );
182 }
183
184 double rap() const {
185 if ( e() == 0.0 ) return 0.0;
186 if ( e() == fabs(pz()) ) return std::copysign(HUGE_VAL, pz());
187 return 0.5*std::log( (e() + pz()) / (e() - pz()) );
188 }
189
190 double abs_eta() const { return std::abs( eta() ); }
192 double abs_rap() const { return std::abs( rap() ); }
193
197 double pseudoRapidity() const { return eta(); }
198
200
201
204
206 bool is_zero() const { return x() == 0 && y() == 0 && z() == 0 && t() == 0; }
207
209 double delta_phi(const FourVector &v) const {
210 double dphi = phi() - v.phi();
211 if (dphi != dphi) return dphi;
212 while (dphi >= M_PI) dphi -= 2.*M_PI;
213 while (dphi < -M_PI) dphi += 2.*M_PI;
214 return dphi;
215 }
216
218 double delta_eta(const FourVector &v) const { return eta() - v.eta(); }
219
221 double delta_rap(const FourVector &v) const { return rap() - v.rap(); }
222
224 double delta_r2_eta(const FourVector &v) const {
225 return delta_phi(v)*delta_phi(v) + delta_eta(v)*delta_eta(v);
226 }
227
229 double delta_r_eta(const FourVector &v) const {
230 return std::sqrt( delta_r2_eta(v) );
231 }
232
234 double delta_r2_rap(const FourVector &v) const {
235 return delta_phi(v)*delta_phi(v) + delta_rap(v)*delta_rap(v);
236 }
237
239 double delta_r_rap(const FourVector &v) const {
240 return std::sqrt( delta_r2_rap(v) );
241 }
242
244
245
248
250 bool operator==(const FourVector& rhs) const {
251 return x() == rhs.x() && y() == rhs.y() && z() == rhs.z() && t() == rhs.t();
252 }
253
254 bool operator!=(const FourVector& rhs) const { return !(*this == rhs); }
255
257 FourVector operator+ (const FourVector& rhs) const {
258 return FourVector( x() + rhs.x(), y() + rhs.y(), z() + rhs.z(), t() + rhs.t() );
259 }
260
261 FourVector operator- (const FourVector& rhs) const {
262 return FourVector( x() - rhs.x(), y() - rhs.y(), z() - rhs.z(), t() - rhs.t() );
263 }
264
265 FourVector operator* (const double rhs) const {
266 return FourVector( x()*rhs, y()*rhs, z()*rhs, t()*rhs );
267 }
268
269 FourVector operator/ (const double rhs) const {
270 return FourVector( x()/rhs, y()/rhs, z()/rhs, t()/rhs );
271 }
272
274 void operator += (const FourVector& rhs) {
275 setX(x() + rhs.x());
276 setY(y() + rhs.y());
277 setZ(z() + rhs.z());
278 setT(t() + rhs.t());
279 }
280
281 void operator -= (const FourVector& rhs) {
282 setX(x() - rhs.x());
283 setY(y() - rhs.y());
284 setZ(z() - rhs.z());
285 setT(t() - rhs.t());
286 }
287
288 void operator *= (const double rhs) {
289 setX(x()*rhs);
290 setY(y()*rhs);
291 setZ(z()*rhs);
292 setT(t()*rhs);
293 }
294
295 void operator /= (const double rhs) {
296 setX(x()/rhs);
297 setY(y()/rhs);
298 setZ(z()/rhs);
299 setT(t()/rhs);
300 }
301
303
304
306 static const FourVector& ZERO_VECTOR() {
307 static const FourVector v;
308 return v;
309 }
310
311
312private:
313
314 double m_v1;
315 double m_v2;
316 double m_v3;
317 double m_v4;
318
319};
320
321
324
326inline double delta_phi(const FourVector &a, const FourVector &b) { return b.delta_phi(a); }
327
329inline double delta_eta(const FourVector &a, const FourVector &b) { return b.delta_eta(a); }
330
332inline double delta_rap(const FourVector &a, const FourVector &b) { return b.delta_rap(a); }
333
335inline double delta_r2_eta(const FourVector &a, const FourVector &b) { return b.delta_r2_eta(a); }
336
338inline double delta_r_eta(const FourVector &a, const FourVector &b) { return b.delta_r_eta(a); }
339
341inline double delta_r2_rap(const FourVector &a, const FourVector &b) { return b.delta_r2_rap(a); }
342
344inline double delta_r_rap(const FourVector &a, const FourVector &b) { return b.delta_r_rap(a); }
345
347
348
349} // namespace HepMC3
350#endif
Generic 4-vector.
Definition FourVector.h:36
void set_py(double pyy)
Set y-component of momentum.
Definition FourVector.h:123
double abs_eta() const
Absolute pseudorapidity.
Definition FourVector.h:190
double perp2() const
Squared magnitude of (x, y) vector.
Definition FourVector.h:154
double delta_r_rap(const FourVector &v) const
R-rap-distance separation dR = sqrt(dphi^2 + drap^2)
Definition FourVector.h:239
void set_px(double pxx)
Set x-component of momentum.
Definition FourVector.h:116
double z() const
z-component of position/displacement
Definition FourVector.h:99
double perp() const
Magnitude of (x, y) vector.
Definition FourVector.h:156
void set_t(double tt)
Set time component of position/displacement.
Definition FourVector.h:108
double delta_r2_rap(const FourVector &v) const
R_rap^2-distance separation dR^2 = dphi^2 + drap^2.
Definition FourVector.h:234
double abs_rap() const
Absolute rapidity.
Definition FourVector.h:192
static const FourVector & ZERO_VECTOR()
Static null FourVector = (0,0,0,0)
Definition FourVector.h:306
void setE(double ee)
Definition FourVector.h:139
double pt2() const
Squared transverse momentum px^2 + py^2.
Definition FourVector.h:165
void operator-=(const FourVector &rhs)
Arithmetic operator -=.
Definition FourVector.h:281
double eta() const
Pseudorapidity.
Definition FourVector.h:178
double t() const
Time component of position/displacement.
Definition FourVector.h:106
double p3mod2() const
Squared magnitude of p3 = (px, py, pz) vector.
Definition FourVector.h:161
double rap() const
Rapidity.
Definition FourVector.h:184
double delta_eta(const FourVector &v) const
Pseudorapidity separation.
Definition FourVector.h:218
bool is_zero() const
Check if the length of this vertex is zero.
Definition FourVector.h:206
double x() const
x-component of position/displacement
Definition FourVector.h:85
FourVector()
Default constructor.
Definition FourVector.h:40
double delta_rap(const FourVector &v) const
Rapidity separation.
Definition FourVector.h:221
double px() const
x-component of momentum
Definition FourVector.h:114
double pseudoRapidity() const
Definition FourVector.h:197
FourVector operator/(const double rhs) const
Arithmetic operator / by scalar.
Definition FourVector.h:269
FourVector & operator=(FourVector &&)=default
=
double delta_r_eta(const FourVector &v) const
R_eta-distance separation dR = sqrt(dphi^2 + deta^2)
Definition FourVector.h:229
FourVector operator+(const FourVector &rhs) const
Arithmetic operator +.
Definition FourVector.h:257
double theta() const
Polar angle w.r.t. z direction.
Definition FourVector.h:176
FourVector(const FourVector &)=default
Copy constructor.
double py() const
y-component of momentum
Definition FourVector.h:121
double delta_r2_eta(const FourVector &v) const
R_eta^2-distance separation dR^2 = dphi^2 + deta^2.
Definition FourVector.h:224
double phi() const
Azimuthal angle.
Definition FourVector.h:174
bool operator!=(const FourVector &rhs) const
Inequality.
Definition FourVector.h:254
double p3mod() const
Magnitude of p3 = (px, py, pz) vector.
Definition FourVector.h:163
void set_x(double xx)
Set x-component of position/displacement.
Definition FourVector.h:87
bool operator==(const FourVector &rhs) const
Equality.
Definition FourVector.h:250
void set_y(double yy)
Set y-component of position/displacement.
Definition FourVector.h:94
void operator*=(const double rhs)
Arithmetic operator *= by scalar.
Definition FourVector.h:288
double y() const
y-component of position/displacement
Definition FourVector.h:92
double pz() const
z-component of momentum
Definition FourVector.h:128
double pt() const
Transverse momentum.
Definition FourVector.h:167
double delta_phi(const FourVector &v) const
Signed azimuthal angle separation in [-pi, pi].
Definition FourVector.h:209
void set_pz(double pzz)
Set z-component of momentum.
Definition FourVector.h:130
void setPz(double pzz)
Definition FourVector.h:132
double get_component(const int i) const
get component of position/displacement
Definition FourVector.h:74
void setT(double tt)
Definition FourVector.h:110
double e() const
Energy component of momentum.
Definition FourVector.h:135
void setPx(double pxx)
Definition FourVector.h:118
double length() const
Magnitude of spatial (x, y, z) 3-vector.
Definition FourVector.h:150
void set_e(double ee)
Set energy component of momentum.
Definition FourVector.h:137
double rho() const
Magnitude of spatial (x, y, z) 3-vector, for HepMC2 compatibility.
Definition FourVector.h:152
FourVector(double xx, double yy, double zz, double ee)
Sets all FourVector fields.
Definition FourVector.h:43
void setPy(double pyy)
Definition FourVector.h:125
void set(double x1, double x2, double x3, double x4)
Set all FourVector fields, in order x,y,z,t.
Definition FourVector.h:58
double length2() const
Squared magnitude of (x, y, z) 3-vector.
Definition FourVector.h:148
FourVector operator-(const FourVector &rhs) const
Arithmetic operator -.
Definition FourVector.h:261
double interval() const
Spacetime invariant interval s^2 = t^2 - x^2 - y^2 - z^2.
Definition FourVector.h:158
void setZ(double zz)
Definition FourVector.h:103
FourVector(FourVector &&)=default
Move constructor.
void setX(double xx)
Definition FourVector.h:89
void set_z(double zz)
Set z-component of position/displacement.
Definition FourVector.h:101
FourVector operator*(const double rhs) const
Arithmetic operator * by scalar.
Definition FourVector.h:265
void operator/=(const double rhs)
Arithmetic operator /= by scalar.
Definition FourVector.h:295
void set_component(const int i, const double x)
set component of position/displacement
Definition FourVector.h:66
double m2() const
Squared invariant mass m^2 = E^2 - px^2 - py^2 - pz^2.
Definition FourVector.h:169
double m() const
Invariant mass. Returns -sqrt(-m) if e^2 - P^2 is negative.
Definition FourVector.h:171
void setY(double yy)
Definition FourVector.h:96
void operator+=(const FourVector &rhs)
Arithmetic operator +=.
Definition FourVector.h:274
FourVector & operator=(const FourVector &)=default
=