![]() |
HepMC Reference DocumentationHepMC |
00001 //-------------------------------------------------------------------------- 00002 #ifndef HEPMC_PARTICLE_DATA_TABLE_H 00003 #define HEPMC_PARTICLE_DATA_TABLE_H 00004 00006 // Matt.Dobbs@Cern.CH, Jan 2000, refer to: 00007 // M. Dobbs and J.B. Hansen, "The HepMC C++ Monte Carlo Event Record for 00008 // High Energy Physics", Computer Physics Communications (to be published). 00009 // 00010 // Container for GenParticle Data Instances --- basically just an interface 00011 // to STL map -- the same naming conventions are used 00012 // A GenParticle may belong to any number of ParticleDataTables. 00013 // The ParticleDataTable does not own the ParticleData objects and will NOT 00014 // delete them unless explicity told to do so with the delete_all method. 00015 // Each ParticleData entry in the table MUST have a unique pdg_id (otherwise 00016 // an attempt to insert it as a new entry will fail). 00017 // Updated 2000.02.08 M.Dobbs added merge_table and 00018 // make_antiparticles_from_particles 00020 00021 #include <iostream> 00022 #include <map> 00023 #include <cstdio> // needed for formatted output using sprintf 00024 #include "HepMC/ParticleData.h" 00025 00026 namespace HepMC { 00027 00029 00035 class ParticleDataTable { 00036 00037 public: 00039 ParticleDataTable( std::string description = std::string() ); 00041 ParticleDataTable( const char description ); 00043 ParticleDataTable( const ParticleDataTable& ); 00045 virtual ~ParticleDataTable(); 00047 ParticleDataTable& operator=( const ParticleDataTable& ); 00048 00050 void make_antiparticles_from_particles(); 00052 int merge_table( const ParticleDataTable& ); 00053 00055 void print( std::ostream& ostr = std::cout ) const; 00056 00057 void delete_all(); 00058 void clear(); 00059 00061 ParticleData* operator[]( int id ) const; 00063 ParticleData* find( int id ) const; 00065 int size() const; 00067 bool empty() const; 00069 bool insert( ParticleData* ); 00071 bool erase( ParticleData* ); 00073 bool erase( int id ); 00075 typedef std::map<int,HepMC::ParticleData*>::iterator iterator; 00077 typedef std::map<int,HepMC::ParticleData*>::const_iterator const_iterator; 00079 iterator begin(); 00081 iterator end(); 00083 const_iterator begin() const; 00085 const_iterator end() const; 00086 00088 // access methods // 00090 00092 std::string description() const; 00094 void set_description( std::string ); 00096 void set_description( const char ); 00097 00098 private: 00099 std::string m_description; 00100 std::map<int,HepMC::ParticleData*> m_data_table; 00101 }; 00102 00104 // INLINES // 00106 00107 inline ParticleDataTable::ParticleDataTable( std::string description ) 00108 : m_description(description) { 00109 std::cout << "-------------------------------------------------------" << std::endl; 00110 std::cout << "Use of HepMC/ParticleDataTable is deprecated" << std::endl; 00111 std::cout << "-------------------------------------------------------" << std::endl; 00112 } 00113 00114 inline ParticleDataTable::ParticleDataTable( const char description ) { 00115 m_description = description; 00116 00117 std::cout << "-------------------------------------------------------" << std::endl; 00118 std::cout << "Use of HepMC/ParticleDataTable is deprecated" << std::endl; 00119 std::cout << "-------------------------------------------------------" << std::endl; 00120 } 00121 00122 inline ParticleDataTable::ParticleDataTable( const ParticleDataTable& pdt){ 00123 *this = pdt; 00124 } 00125 00126 inline ParticleDataTable::~ParticleDataTable(){} 00127 00128 inline ParticleDataTable& ParticleDataTable::operator=( const 00129 ParticleDataTable& 00130 pdt) { 00131 m_description = pdt.m_description; 00132 m_data_table = pdt.m_data_table; 00133 return *this; 00134 } 00135 00136 inline void ParticleDataTable::make_antiparticles_from_particles() { 00138 ParticleDataTable new_data; 00139 for ( ParticleDataTable::iterator p = begin(); p != end(); ++p ) { 00140 ParticleData* pdata = p->second; 00141 if ( pdata->charge() ) { 00142 new_data.insert( new ParticleData( pdata->name()+"~", 00143 -1*pdata->pdg_id(), 00144 -1.*pdata->charge(), 00145 pdata->mass(), 00146 pdata->clifetime(), 00147 pdata->spin() )); 00148 } 00149 } 00150 merge_table( new_data ); 00151 } 00152 00153 inline void ParticleDataTable::print( std::ostream& ostr ) const { 00155 // 00156 ostr << "________________________________________" 00157 << "________________________________________\n"; 00158 ostr << "ParticleData: ***** ParticleDataTable" 00159 << " ***** ( " << size() 00160 << " entries )\n"; 00161 ostr << " Description: " << m_description << "\n"; 00162 ostr << " PDG ID " << " PARTICLE NAME " 00163 << "CHARGE" << " MASS " 00164 << " C*LIFETIME (CM) " << " SPIN\n"; 00165 for ( std::map< int,ParticleData* >::const_iterator pd 00166 = m_data_table.begin(); pd != m_data_table.end(); pd++ ) { 00167 ostr << *(pd->second) << "\n"; 00168 } 00169 ostr << "________________________________________" 00170 << "________________________________________" << std::endl; 00171 } 00172 00173 inline ParticleData* ParticleDataTable::find( int id ) const { 00176 std::map<int,ParticleData*>::const_iterator iter 00177 = m_data_table.find(id); 00178 return ( iter == m_data_table.end() ) ? 0 : iter->second; 00179 } 00180 00181 inline ParticleData* ParticleDataTable::operator[]( int id ) const { 00182 return find(id); 00183 } 00184 00185 inline int ParticleDataTable::size() const { 00186 return (int)m_data_table.size(); 00187 } 00188 00189 inline bool ParticleDataTable::empty() const { 00190 return (bool)m_data_table.empty(); 00191 } 00192 00193 inline bool ParticleDataTable::insert( ParticleData* pdata ) { 00197 if ( m_data_table.count(pdata->pdg_id()) ) return 0; 00198 return ( m_data_table[pdata->pdg_id()] = pdata ); // true is success 00199 } 00200 00201 inline bool ParticleDataTable::erase( ParticleData* pdata ) { 00204 return (bool)m_data_table.erase( pdata->pdg_id() ); 00205 } 00206 00207 00208 inline bool ParticleDataTable::erase( int id ) { 00211 return (bool)m_data_table.erase( id ); 00212 } 00213 00214 inline ParticleDataTable::iterator ParticleDataTable::begin() { 00215 return m_data_table.begin(); 00216 } 00217 00218 inline ParticleDataTable::iterator ParticleDataTable::end() { 00219 return m_data_table.end(); 00220 } 00221 00222 inline ParticleDataTable::const_iterator ParticleDataTable::begin() const { 00223 return m_data_table.begin(); 00224 } 00225 00226 inline ParticleDataTable::const_iterator ParticleDataTable::end() const { 00227 return m_data_table.end(); 00228 } 00229 00230 inline std::string ParticleDataTable::description() const { 00231 return m_description; 00232 } 00233 00234 inline void ParticleDataTable::set_description( std::string description ) { 00235 m_description = description; 00236 } 00237 00238 inline void ParticleDataTable::set_description( const char description ) { 00239 m_description = description; 00240 } 00241 00242 inline void ParticleDataTable::delete_all() { 00244 for ( std::map<int,ParticleData*>::iterator pd = m_data_table.begin(); 00245 pd != m_data_table.end(); pd++) delete pd->second; 00246 clear(); 00247 } 00248 00249 inline void ParticleDataTable::clear() { m_data_table.clear(); } 00250 00251 inline int ParticleDataTable::merge_table( const ParticleDataTable& pdt ) { 00256 int count_number_insertions =0; 00257 for ( ParticleDataTable::const_iterator p = pdt.begin(); 00258 p != pdt.end(); ++p ) { 00259 if ( insert(p->second) ) ++count_number_insertions; 00260 } 00261 return count_number_insertions; 00262 } 00263 00264 } // HepMC 00265 00266 #endif // HEPMC_PARTICLE_DATA_TABLE_H 00267 //-------------------------------------------------------------------------- 00268 00269 00270