6#ifndef HEPMC3_FOURVECTOR_H
7#define HEPMC3_FOURVECTOR_H
16#define M_PI 3.14159265358979323846264338327950288
41 : m_v1(0.0), m_v2(0.0), m_v3(0.0), m_v4(0.0) {}
44 : m_v1(xx), m_v2(yy), m_v3(zz), m_v4(ee) {}
58 void set(
double x1,
double x2,
double x3,
double x4) {
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; }
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;
85 double x()
const {
return m_v1; }
87 void set_x(
double xx) { m_v1 = xx; }
92 double y()
const {
return m_v2; }
94 void set_y(
double yy) { m_v2 = yy; }
99 double z()
const {
return m_v3; }
101 void set_z(
double zz) { m_v3 = zz; }
106 double t()
const {
return m_v4; }
108 void set_t(
double tt) { m_v4 = tt; }
114 double px()
const {
return x(); }
121 double py()
const {
return y(); }
128 double pz()
const {
return z(); }
135 double e()
const {
return t(); }
171 double m()
const {
return (
m2() > 0.0) ? std::sqrt(
m2()) : -std::sqrt(-
m2()); }
174 double phi()
const {
return std::atan2(
y(),
x() ); }
179 if (
p3mod() == 0.0 )
return 0.0;
180 if (
p3mod() == fabs(
pz()) )
return std::copysign(HUGE_VAL,
pz());
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()) );
206 bool is_zero()
const {
return x() == 0 &&
y() == 0 &&
z() == 0 &&
t() == 0; }
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;
251 return x() == rhs.
x() &&
y() == rhs.
y() &&
z() == rhs.
z() &&
t() == rhs.
t();
326inline double delta_phi(
const FourVector &a,
const FourVector &b) {
return b.delta_phi(a); }
335inline double delta_r2_eta(
const FourVector &a,
const FourVector &b) {
return b.delta_r2_eta(a); }
341inline double delta_r2_rap(
const FourVector &a,
const FourVector &b) {
return b.delta_r2_rap(a); }
void set_py(double pyy)
Set y-component of momentum.
double abs_eta() const
Absolute pseudorapidity.
double perp2() const
Squared magnitude of (x, y) vector.
double delta_r_rap(const FourVector &v) const
R-rap-distance separation dR = sqrt(dphi^2 + drap^2)
void set_px(double pxx)
Set x-component of momentum.
double z() const
z-component of position/displacement
double perp() const
Magnitude of (x, y) vector.
void set_t(double tt)
Set time component of position/displacement.
double delta_r2_rap(const FourVector &v) const
R_rap^2-distance separation dR^2 = dphi^2 + drap^2.
double abs_rap() const
Absolute rapidity.
static const FourVector & ZERO_VECTOR()
Static null FourVector = (0,0,0,0)
double pt2() const
Squared transverse momentum px^2 + py^2.
void operator-=(const FourVector &rhs)
Arithmetic operator -=.
double eta() const
Pseudorapidity.
double t() const
Time component of position/displacement.
double p3mod2() const
Squared magnitude of p3 = (px, py, pz) vector.
double rap() const
Rapidity.
double delta_eta(const FourVector &v) const
Pseudorapidity separation.
bool is_zero() const
Check if the length of this vertex is zero.
double x() const
x-component of position/displacement
FourVector()
Default constructor.
double delta_rap(const FourVector &v) const
Rapidity separation.
double px() const
x-component of momentum
double pseudoRapidity() const
FourVector operator/(const double rhs) const
Arithmetic operator / by scalar.
FourVector & operator=(FourVector &&)=default
=
double delta_r_eta(const FourVector &v) const
R_eta-distance separation dR = sqrt(dphi^2 + deta^2)
FourVector operator+(const FourVector &rhs) const
Arithmetic operator +.
double theta() const
Polar angle w.r.t. z direction.
FourVector(const FourVector &)=default
Copy constructor.
double py() const
y-component of momentum
double delta_r2_eta(const FourVector &v) const
R_eta^2-distance separation dR^2 = dphi^2 + deta^2.
double phi() const
Azimuthal angle.
bool operator!=(const FourVector &rhs) const
Inequality.
double p3mod() const
Magnitude of p3 = (px, py, pz) vector.
void set_x(double xx)
Set x-component of position/displacement.
bool operator==(const FourVector &rhs) const
Equality.
void set_y(double yy)
Set y-component of position/displacement.
void operator*=(const double rhs)
Arithmetic operator *= by scalar.
double y() const
y-component of position/displacement
double pz() const
z-component of momentum
double pt() const
Transverse momentum.
double delta_phi(const FourVector &v) const
Signed azimuthal angle separation in [-pi, pi].
void set_pz(double pzz)
Set z-component of momentum.
double get_component(const int i) const
get component of position/displacement
double e() const
Energy component of momentum.
double length() const
Magnitude of spatial (x, y, z) 3-vector.
void set_e(double ee)
Set energy component of momentum.
double rho() const
Magnitude of spatial (x, y, z) 3-vector, for HepMC2 compatibility.
FourVector(double xx, double yy, double zz, double ee)
Sets all FourVector fields.
void set(double x1, double x2, double x3, double x4)
Set all FourVector fields, in order x,y,z,t.
double length2() const
Squared magnitude of (x, y, z) 3-vector.
FourVector operator-(const FourVector &rhs) const
Arithmetic operator -.
double interval() const
Spacetime invariant interval s^2 = t^2 - x^2 - y^2 - z^2.
FourVector(FourVector &&)=default
Move constructor.
void set_z(double zz)
Set z-component of position/displacement.
FourVector operator*(const double rhs) const
Arithmetic operator * by scalar.
void operator/=(const double rhs)
Arithmetic operator /= by scalar.
void set_component(const int i, const double x)
set component of position/displacement
double m2() const
Squared invariant mass m^2 = E^2 - px^2 - py^2 - pz^2.
double m() const
Invariant mass. Returns -sqrt(-m) if e^2 - P^2 is negative.
void operator+=(const FourVector &rhs)
Arithmetic operator +=.
FourVector & operator=(const FourVector &)=default
=