/* Nucleus.h Nucleus is a derived class of Vec4. A nucleus is the kinematics is essentially a 4 vector with the additional properties of the number of total nucleons (A), the number of protons (Z), a ground state mass, an exctitation energy, and an isotopic symbol. --GWM Jan 2021 */ #ifndef NUCLEUS_H #define NUCLEUS_H #include "Vec4.h" #include namespace Mask { class Nucleus : public Vec4 { public: Nucleus(); Nucleus(int Z, int A); Nucleus(int Z, int A, double px, double py, double pz, double E); ~Nucleus(); bool SetIsotope(int Z, int A); inline void SetThetaCM(double tcm) { m_theta_cm = tcm; }; //save theta in rxn CM frame inline int GetZ() const { return m_z; }; inline int GetA() const { return m_a; }; inline double GetExcitationEnergy() const { return GetInvMass() - m_gs_mass; }; inline double GetGroundStateMass() const { return m_gs_mass; }; inline const char* GetIsotopicSymbol() const { return m_symbol.c_str(); }; inline double GetThetaCM() const { return m_theta_cm; }; inline void SetDetected() { m_detectFlag = true; }; inline void SetNotDetected() { m_detectFlag = false; }; inline bool IsDetected() const { return m_detectFlag; }; inline Nucleus& operator=(const Nucleus& rhs) { SetIsotope(rhs.GetZ(), rhs.GetA()); SetVectorCartesian(rhs.GetPx(), rhs.GetPy(), rhs.GetPz(), rhs.GetE()); SetThetaCM(rhs.GetThetaCM()); return *this; }; //Conservation of nucleons and momentum inline Nucleus operator+(const Nucleus& daughter) { return Nucleus(GetZ()+daughter.GetZ(), GetA()+daughter.GetA(), GetPx()+daughter.GetPx(), GetPy()+daughter.GetPy(), GetPz()+daughter.GetPz(), GetE()+daughter.GetE()); }; inline Nucleus operator-(const Nucleus& daughter) { return (GetZ() - daughter.GetZ()) <= 0 || (GetA() - daughter.GetA()) <= 0 ? Nucleus() : Nucleus(GetZ()-daughter.GetZ(), GetA() - daughter.GetA(), GetPx()-daughter.GetPx(), GetPy()-daughter.GetPy(), GetPz()-daughter.GetPz(), GetE()-daughter.GetE()); }; private: int m_z, m_a; double m_gs_mass; double m_theta_cm; std::string m_symbol; bool m_detectFlag; }; }; #endif