2020-12-11 16:56:27 -05:00
|
|
|
/*
|
|
|
|
Class which represents a 4-momentum vector. Can perform vector addition, subtraction, dot product
|
|
|
|
and generate a boost vector to its rest frame as well as apply a boost to itself.
|
|
|
|
|
|
|
|
--GWM Dec 2020.
|
|
|
|
*/
|
|
|
|
#ifndef VEC4_H
|
|
|
|
#define VEC4_H
|
2020-11-16 13:38:39 -05:00
|
|
|
|
|
|
|
#include <cmath>
|
|
|
|
|
2020-12-11 16:56:27 -05:00
|
|
|
namespace Mask {
|
|
|
|
|
2021-09-06 16:18:49 -04:00
|
|
|
class Vec4 {
|
|
|
|
public:
|
|
|
|
Vec4();
|
|
|
|
Vec4(double px, double py, double pz, double E);
|
|
|
|
virtual ~Vec4();
|
|
|
|
void SetVectorCartesian(double px, double py, double pz, double E);
|
|
|
|
void SetVectorSpherical(double theta, double phi, double p, double E);
|
|
|
|
|
|
|
|
inline double GetE() const { return m_data[3]; }
|
|
|
|
inline double GetPx() const { return m_data[0]; }
|
|
|
|
inline double GetPy() const { return m_data[1]; }
|
|
|
|
inline double GetPz() const { return m_data[2]; }
|
|
|
|
inline double GetP() const { return std::sqrt(m_data[0]*m_data[0] + m_data[1]*m_data[1] + m_data[2]*m_data[2]); }
|
|
|
|
inline double GetPxy() const { return std::sqrt(m_data[0]*m_data[0] + m_data[1]*m_data[1]); }
|
|
|
|
inline double GetTheta() const { return GetPxy() == 0.0 && GetPz() == 0.0 ? 0.0 : Atan2(GetPxy(), GetPz()); }
|
|
|
|
inline double GetPhi() const {
|
|
|
|
double phi = Atan2(GetPy(), GetPx());
|
|
|
|
if(phi<0) phi += 2.0*M_PI;
|
|
|
|
return GetPx() == 0.0 && GetPy() == 0.0 ? 0.0 : phi;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline double GetInvMass() const { return std::sqrt(GetE()*GetE() - GetP()*GetP()); }
|
|
|
|
inline double GetKE() const { return GetE() - GetInvMass(); }
|
|
|
|
inline const double* GetBoost() const { return &m_boost[0]; }
|
|
|
|
|
|
|
|
void ApplyBoost(const double* boost);
|
|
|
|
|
|
|
|
//Only intended for use in looping access!
|
|
|
|
inline const double operator[] (int index) const { return index>3 || index < 0 ? 0.0 : m_data[index]; }
|
|
|
|
|
|
|
|
inline Vec4& operator=(const Vec4& rhs) { SetVectorCartesian(rhs.GetPx(), rhs.GetPy(), rhs.GetPz(), rhs.GetE()); return *this; }
|
|
|
|
inline Vec4 operator+(const Vec4& rhs) const { return Vec4(rhs.GetPx()+GetPx(), rhs.GetPy()+GetPy(), rhs.GetPz()+GetPz(), rhs.GetE()+GetE()); }
|
|
|
|
inline Vec4 operator-(const Vec4& rhs) const { return Vec4(rhs.GetPx()-GetPx(), rhs.GetPy()-GetPy(), rhs.GetPz()-GetPz(), rhs.GetE()-GetE()); }
|
|
|
|
|
|
|
|
double Dot(const Vec4& rhs) const;
|
|
|
|
Vec4 Cross(const Vec4& rhs) const;
|
|
|
|
|
|
|
|
private:
|
|
|
|
void CalcBoostToCM();
|
|
|
|
|
|
|
|
//use instead of std::atan2. Better controll over x=0
|
|
|
|
inline double Atan2(double y, double x) const {
|
|
|
|
if(x != 0) return std::atan2(y, x);
|
|
|
|
else if( y > 0 ) return M_PI/2.0;
|
|
|
|
else if( y < 0 ) return -M_PI/2.0;
|
|
|
|
else return 0.0;
|
|
|
|
}
|
|
|
|
|
|
|
|
double m_data[4];
|
|
|
|
double m_boost[3];
|
2020-12-11 16:56:27 -05:00
|
|
|
|
2020-12-09 17:07:58 -05:00
|
|
|
};
|
2020-12-11 16:56:27 -05:00
|
|
|
|
2021-09-06 16:18:49 -04:00
|
|
|
}
|
2020-12-11 16:56:27 -05:00
|
|
|
|
2020-11-16 13:38:39 -05:00
|
|
|
#endif
|