/** Unique identifier for a particle type. From @cite Beringer:1900zz :
* _The Monte Carlo particle numbering scheme [...] is intended to facilitate interfacing between event generators, detector simulators, and analysis packages used in particle physics._
* \brief PDG ids of all known particles
*/
enum ParticleCode {
invalidParticle = 0,
dQuark = 1,
uQuark = 2,
Electron = 11,
ElectronNeutrino = 12,
Muon = 13,
MuonNeutrino = 14,
Tau = 15,
TauNeutrino = 16,
Gluon = 21,
Photon = 22,
Z = 23,
WPlus = 24,
PiPlus = 211,
PiZero = 111,
Rho770_0 = 113,
Rho1450_0 = 100113,
Rho1700_0 = 30113,
Omega782 = 223,
h1380_1 = 10333,
JPsi= 443,
Phi1680 = 100333,
Upsilon1S = 553,
Upsilon2S = 100553,
Upsilon3S = 200553,
ud0Diquark = 2101,
ud1Diquark = 2103,
uu1Diquark = 2203,
Proton = 2212,
Neutron = 2112,
Pomeron = 990,
Reggeon = 110
};
/// Internal status code for a particle
enum Status {
PrimordialIncoming = -9,
Incoming = -1,
Undecayed = -3,
sPropagator = -2,
Undefined = 0,
FinalState = 1,
Resonance = 2,
DebugResonance = 3,
PythiaHIncoming = 21,
HerwigFragment = 193 //FIXME
};
/// Role of the particle in the process
enum Role {
UnknownRole = -1,
IncomingBeam1 = 1,
IncomingBeam2 = 2,
Parton1 = 41,
Parton2 = 42,
Parton3 = 43,
CentralSystem = 4,
OutgoingBeam1 = 3,
OutgoingBeam2 = 5,
CentralParticle1 = 6,
CentralParticle2 = 7
};
/**
* Container for a particle's 4-momentum, along with useful methods to ease the development of any matrix element level generator
/// Electric charge (given as a float number, for the quarks and bound states)
float charge;
/// Human-readable name
std::string name;
/// Role in the considered process
Role role;
/**
* Codes 1-10 correspond to currently existing partons/particles, and larger codes contain partons/particles which no longer exist, or other kinds of event information
* @brief Particle status
*/
Status status;
/// Set the PDG identifier (along with the particle's electric charge)
/// \param[in] pdg ParticleCode (PDG ID)
/// \param[in] ch Electric charge (in units of \f$e\f$)
/// Retrieve the integer value of the PDG identifier
inline int GetIntPDGId() const {
const int pdg = static_cast<int>( fPDGid );
if ( pdg>10 and pdg<16 and pdg%2!=0 ) return static_cast<int>( -charge )*pdg;
else return pdg;
}
/// Particle's helicity
/// \note FIXME Float??
float helicity;
/**
* Gets the particle's mass in \f$\text{GeV}/c^{2}\f$.
* @brief Gets the particle's mass
* @return The particle's mass
*/
inline double M() const { return fMass; };
/**
* Set the mass of the particle in \f$\text{GeV}/c^{2}\f$ according to a value given as an argument. This method ensures that the kinematics is properly set (the mass is set according to the energy and the momentum in priority)
* @param m_ The mass in \f$\text{GeV}/c^{2}\f$ to set
* @brief Set the particle's mass in \f$\text{GeV}/c^{2}\f$
* @return A boolean stating whether or not the mass was correctly set
*/
bool SetM( double m_=-1. );
/// Get the particle's squared mass (in \f$\text{GeV}^\text{2}\f$)
inline double M2() const { return fMass*fMass; };
/// Retrieve the momentum object associated with this particle