Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed
| Rev | Author | Line No. | Line |
|---|---|---|---|
| 2 | garren | 1 | ////////////////////////////////////////////////////////////////////////// |
| 2 | // Matt.Dobbs@Cern.CH, September 1999 |
||
| 3 | // |
||
| 4 | // particle properties common to all particles of a given PDG id |
||
| 5 | ////////////////////////////////////////////////////////////////////////// |
||
| 6 | |||
| 7 | #include "HepMC/ParticleData.h" |
||
| 8 | #include <cstdio> // needed for formatted output using sprintf |
||
| 9 | |||
| 10 | namespace HepMC { |
||
| 11 | |||
| 12 | ParticleData::ParticleData( std::string name, int id, double charge, |
||
| 13 | double mass, double clifetime, double spin ) : |
||
| 14 | m_name(name), m_pdg_id(id), m_mass(mass), m_clifetime(clifetime) |
||
| 15 | { |
||
| 65 | garren | 16 | /// Units ID: defined by PDG group (particles are +ve, antipart are -ve) |
| 17 | /// also consistent with the Pythia definitions |
||
| 18 | /// charge: fraction of proton charge |
||
| 19 | /// mass |
||
| 20 | /// cLifetime: c*time |
||
| 21 | /// Default mass=0 and cLifetime is -1 which means stable (width= 0.) |
||
| 22 | /// These defaults exist because many very basic MC generators |
||
| 23 | /// may produce only massless stable particles in the event record. |
||
| 2 | garren | 24 | // |
| 25 | set_charge(charge); |
||
| 26 | set_spin(spin); |
||
| 27 | s_counter++; |
||
| 28 | } |
||
| 29 | |||
| 30 | ParticleData::ParticleData( const char* name, int id, double charge, |
||
| 31 | double mass, double clifetime, double spin ): |
||
| 32 | m_name(name), m_pdg_id(id), m_mass(mass), m_clifetime(clifetime) |
||
| 33 | { |
||
| 65 | garren | 34 | /// note, this constructor is redundant to the one above, |
| 35 | /// i.e. one could use: |
||
| 36 | /// new HepMC::ParticleData(string("electron"),11,-1,0.000511,-1,.5); |
||
| 37 | /// but we keep it because it is convenient. |
||
| 2 | garren | 38 | // |
| 39 | set_charge(charge); |
||
| 40 | set_spin(spin); |
||
| 41 | s_counter++; |
||
| 42 | } |
||
| 43 | |||
| 44 | ParticleData::~ParticleData() { |
||
| 45 | s_counter--; |
||
| 46 | } |
||
| 47 | |||
| 48 | void ParticleData::print( std::ostream& ostr ) const { |
||
| 49 | ostr << "ParticleData: " << name() << "\t" |
||
| 50 | << " ID[pdg]:" << pdg_id() |
||
| 51 | << " Charge[e+]:" << charge() |
||
| 52 | << " Mass:" << mass() |
||
| 53 | << " Tau:" << clifetime() |
||
| 54 | << " J:" << spin() << std::endl; |
||
| 55 | } |
||
| 56 | |||
| 57 | //////////////////// |
||
| 58 | // access methods // |
||
| 59 | //////////////////// |
||
| 60 | |||
| 61 | int ParticleData::model_independent_pdg_id_() const { |
||
| 65 | garren | 62 | /// returns the particle id with the seventh |
| 63 | /// digit removed for susy/excited/technicolor particles. |
||
| 64 | /// Thus en excited electron (40000011) would be returned as 11 |
||
| 65 | /// Useful only internally for sorting particles! |
||
| 2 | garren | 66 | int id = m_pdg_id; |
| 67 | if ( id/1000000 >=1 && id/1000000 <= 4 ) id %= 1000000; |
||
| 68 | return id; |
||
| 69 | } |
||
| 70 | |||
| 71 | double ParticleData::width() const { |
||
| 72 | double width; |
||
| 73 | if ( m_clifetime > 0 ) { |
||
| 74 | width = HepMC_hbarc/m_clifetime; |
||
| 75 | } else if ( m_clifetime == 0 ) { |
||
| 76 | width = -1; |
||
| 77 | } else { |
||
| 78 | width = 0; |
||
| 79 | } |
||
| 80 | return width; |
||
| 81 | } |
||
| 82 | |||
| 83 | ///////////// |
||
| 84 | // Static // |
||
| 85 | ///////////// |
||
| 86 | unsigned int ParticleData::counter() { return s_counter; } |
||
| 87 | unsigned int ParticleData::s_counter = 0; |
||
| 88 | |||
| 89 | ///////////// |
||
| 90 | // Friends // |
||
| 91 | ///////////// |
||
| 92 | |||
| 93 | std::ostream& operator<<( std::ostream& ostr, const ParticleData& pdata ) { |
||
| 65 | garren | 94 | /// write to ostr |
| 2 | garren | 95 | char outline[80]; |
| 96 | sprintf( outline,"%+9d%21s%+6.2f%19.11e%19.11e%5.1f", |
||
| 97 | pdata.pdg_id(), |
||
| 98 | pdata.name().substr(0,21).c_str(), |
||
| 99 | pdata.charge(), |
||
| 100 | pdata.mass(), |
||
| 101 | pdata.clifetime(), |
||
| 102 | pdata.spin() ); |
||
| 103 | return ostr << outline; |
||
| 104 | } |
||
| 105 | |||
| 106 | ////////////////////// |
||
| 107 | // Related Methods // |
||
| 108 | ////////////////////// |
||
| 109 | |||
| 110 | double clifetime_from_width( double width ) { |
||
| 65 | garren | 111 | /// if you want to instantiate the particle lifetime from its width, |
| 112 | /// use this static method inside the constructor: |
||
| 2 | garren | 113 | // i.e. new ParticleData( |
| 114 | if ( width > 0 ) return HepMC_hbarc/width; |
||
| 115 | if ( width == 0. ) return -1.; |
||
| 116 | return 0.; |
||
| 117 | } |
||
| 118 | |||
| 119 | } // HepMC |
||
| 120 | |||
| 121 | |||
| 122 | |||
| 123 | |||
| 124 | |||
| 125 | |||
| 126 |