ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
PDGToG4Particle.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 // class header
7 
8 // Geant4
9 #include "G4ParticleDefinition.hh"
10 #include "G4ParticleTypes.hh"
11 #include "G4DecayTable.hh"
12 
13 //#define PDGTOG4PARTICLE_USE_SUSY
14 
15 #ifdef PDGTOG4PARTICLE_USE_SUSY
16 
17 #include "Sleptons/G4SElectronMinus.hh"
18 #include "Sleptons/G4SElectronPlus.hh"
19 #include "Sleptons/G4SMuonMinus.hh"
20 #include "Sleptons/G4SMuonPlus.hh"
21 #include "Sleptons/G4STauMinus.hh"
22 #include "Sleptons/G4STauPlus.hh"
23 
24 #include "Gauginos/G4Gravitino.hh"
25 #include "Gauginos/G4Neutralino.hh"
26 
27 #endif
28 
29 
30 /*=========================================================================
31  * DESCRIPTION OF FUNCTION:
32  * ==> see headerfile
33  *=======================================================================*/
36 {
37  // Update output level
38  ATH_MSG_VERBOSE( "initialize()" );
39 
40  /*-----------------------------------------------------------------------
41  * Fill map of particles
42  *-----------------------------------------------------------------------*/
43  static const auto s_predefinedParticles = predefinedParticles();
44 
45  if( m_useParticles.size() == 0)
46  {
47  ATH_MSG_INFO( "using all predefined particles" );
48  m_pdgG4ParticleMap.insert( s_predefinedParticles.begin(),
49  s_predefinedParticles.end());
50  ATH_MSG_INFO( "loaded " << m_pdgG4ParticleMap.size() << " particles" );
51  }
52  else
53  {
54  std::vector<int>::const_iterator pdgIt = m_useParticles.begin();
55  for( ; pdgIt != m_useParticles.end(); ++pdgIt)
56  {
57  PDGG4ParticleMap::const_iterator mapIt =
58  s_predefinedParticles.find( *pdgIt);
59  if( mapIt == s_predefinedParticles.end())
60  {
61  ATH_MSG_WARNING( "particle with pdg code " << *pdgIt
62  << " not found in list of predefined particles, ignoring" );
63  continue;
64  }
65 
66  if( m_pdgG4ParticleMap.find( *pdgIt) != m_pdgG4ParticleMap.end())
67  {
68  ATH_MSG_WARNING( "particle with pdg code " << *pdgIt
69  << " already loaded, ignoring" );
70  continue;
71  }
72 
73  m_pdgG4ParticleMap[*pdgIt] = mapIt->second;
74  }
75  }
76 
77  if( m_printList)
78  {
79  ATH_MSG_INFO( "List of loaded particles:" );
81  }
82 
83  return StatusCode::SUCCESS;
84 }
85 
86 
87 /*=========================================================================
88  * DESCRIPTION OF FUNCTION:
89  * ==> see headerfile
90  *=======================================================================*/
91 G4ParticleDefinition*
93 {
94  G4ParticleDefinition* ret = 0;
95 
96  PDGG4ParticleMap::const_iterator it =
97  m_pdgG4ParticleMap.find( pdgCode);
98 
99  if( it != m_pdgG4ParticleMap.end()) ret = it->second;
100  else
101  {
102  it = m_pdgG4ParticleMap.find( std::abs( pdgCode));
103  if( it != m_pdgG4ParticleMap.end())
104  {
105  if( std::abs( it->second->GetPDGCharge()) < 0.1)
106  ret = it->second;
107  else
108  {
109  ATH_MSG_WARNING( "PDG Code " << pdgCode << " not found,"
110  << " " << -pdgCode << " exists but is charged!" );
111  }
112  }
113  }
114 
115  return ret;
116 }
117 
118 /*=========================================================================
119  * DESCRIPTION OF FUNCTION:
120  * ==> see headerfile
121  *=======================================================================*/
122 std::vector<std::pair<int,std::string> >
124 {
125  std::vector<std::pair<int,std::string> > ret;
126 
127  for( PDGG4ParticleMap::const_iterator it = m_pdgG4ParticleMap.begin();
128  it != m_pdgG4ParticleMap.end(); ++it)
129  {
130  // Only return matter particles (for consistency with HepPDT)
131  if( it->first > 0)
132  {
133  ret.push_back( std::make_pair( it->first, it->second->GetParticleName()));
134  }
135  }
136 
137  return ret;
138 }
139 
140 /*=========================================================================
141  * DESCRIPTION OF FUNCTION:
142  * ==> see headerfile
143  *=======================================================================*/
144 void
145 iFatras::PDGToG4Particle::printListOfParticles( bool withDecayTableOnly) const
146 {
147  std::cout << "****************************************"
148  << "****************************************"
149  << std::endl;
150 
151  std::cout << "* "
152  << std::setw( 8) << "PDG Code" << " "
153  << std::setw(16) << "Particle Name" << " "
154  << std::setw( 8) << "G4 PDGID" << " "
155  << std::setw( 8) << "Mass" << " "
156  << std::setw(16) << "Width" << " "
157  << std::setw( 6) << "Charge" << " "
158  << std::setw( 7) << "#DecChn" << " "
159  << std::endl;
160 
161  std::cout << "****************************************"
162  << "****************************************"
163  << std::endl;
164 
165  for( PDGG4ParticleMap::const_iterator it = m_pdgG4ParticleMap.begin();
166  it != m_pdgG4ParticleMap.end(); ++it)
167  {
168  G4DecayTable* dt = it->second->GetDecayTable();
169  int nDecayChannels = 0;
170  if( dt) nDecayChannels = dt->entries();
171  else if( withDecayTableOnly) continue;
172 
173  std::cout << "* "
174  << std::setw( 8) << it->first << " "
175  << std::setw(16) << it->second->GetParticleName() << " "
176  << std::setw( 8) << it->second->GetPDGEncoding() << " "
177  << std::setw( 8) << it->second->GetPDGMass() << " "
178  << std::setw(16) << it->second->GetPDGWidth() << " "
179  << std::setw( 6) << it->second->GetPDGCharge() << " "
180  << std::setw( 7) << nDecayChannels << " "
181  << std::endl;
182  }
183 
184  std::cout << "****************************************"
185  << "****************************************"
186  << std::endl;
187 }
188 
189 /*=========================================================================
190  * DESCRIPTION OF FUNCTION:
191  * ==> see headerfile
192  *=======================================================================*/
193 std::map<int,G4ParticleDefinition*>
195 {
197  std::map<int,G4ParticleDefinition*> predefinedParticles;
198 
200  auto addParticle = [&](G4ParticleDefinition* pDef) {
201  if (pDef) predefinedParticles[pDef->GetPDGEncoding()] = pDef;
202  };
203 
204  // Gauge and Higgs Bosons
205  addParticle( G4Gamma::GammaDefinition());
206 
207  // Leptons
208  addParticle( G4Electron::ElectronDefinition());
209  addParticle( G4NeutrinoE::NeutrinoEDefinition());
210  addParticle( G4MuonMinus::MuonMinusDefinition());
211  addParticle( G4NeutrinoMu::NeutrinoMuDefinition());
212  addParticle( G4TauMinus::TauMinusDefinition());
213  addParticle( G4NeutrinoTau::NeutrinoTauDefinition());
214  addParticle( G4Positron::PositronDefinition());
215  addParticle( G4AntiNeutrinoE::AntiNeutrinoEDefinition());
216  addParticle( G4MuonPlus::MuonPlusDefinition());
217  addParticle( G4AntiNeutrinoMu::AntiNeutrinoMuDefinition());
218  addParticle( G4TauPlus::TauPlusDefinition());
219  addParticle( G4AntiNeutrinoTau::AntiNeutrinoTauDefinition());
220 
221  // Light I=1 Mesons
222  addParticle( G4PionZero::PionZeroDefinition());
223  addParticle( G4PionPlus::PionPlusDefinition());
224  addParticle( G4PionMinus::PionMinusDefinition());
225 
226  // Light I=0 Mesons
227  addParticle( G4Eta::EtaDefinition());
228  addParticle( G4EtaPrime::EtaPrimeDefinition());
229 
230  // Strange Mesons
231  addParticle( G4KaonZeroLong::KaonZeroLongDefinition());
232  addParticle( G4KaonZeroShort::KaonZeroShortDefinition());
233  addParticle( G4KaonZero::KaonZeroDefinition());
234  addParticle( G4KaonPlus::KaonPlusDefinition());
235  addParticle( G4AntiKaonZero::AntiKaonZeroDefinition());
236  addParticle( G4KaonMinus::KaonMinusDefinition());
237 
238  // Charmed Mesons
239  addParticle( G4DMesonPlus::DMesonPlusDefinition());
240  addParticle( G4DMesonZero::DMesonZeroDefinition());
241  addParticle( G4DsMesonPlus::DsMesonPlusDefinition());
242  addParticle( G4DMesonMinus::DMesonMinusDefinition());
243  addParticle( G4AntiDMesonZero::AntiDMesonZeroDefinition());
244  addParticle( G4DsMesonMinus::DsMesonMinusDefinition());
245 
246  // Bottom Mesons
247  addParticle( G4BMesonZero::BMesonZeroDefinition());
248  addParticle( G4BMesonPlus::BMesonPlusDefinition());
249  addParticle( G4BsMesonZero::BsMesonZeroDefinition());
250  addParticle( G4AntiBMesonZero::AntiBMesonZeroDefinition());
251  addParticle( G4BMesonMinus::BMesonMinusDefinition());
252  addParticle( G4AntiBsMesonZero::AntiBsMesonZeroDefinition());
253 
254  // ccbar Mesons
255  addParticle( G4JPsi::JPsiDefinition());
256 
257  // Light Baryons
258  addParticle( G4Proton::ProtonDefinition());
259  addParticle( G4Neutron::NeutronDefinition());
260  addParticle( G4AntiProton::AntiProtonDefinition());
261  addParticle( G4AntiNeutron::AntiNeutronDefinition());
262 
263  // Strange Baryons
264  addParticle( G4Lambda::LambdaDefinition());
265  addParticle( G4SigmaPlus::SigmaPlusDefinition());
266  addParticle( G4SigmaZero::SigmaZeroDefinition());
267  addParticle( G4SigmaMinus::SigmaMinusDefinition());
268  addParticle( G4XiZero::XiZeroDefinition());
269  addParticle( G4XiMinus::XiMinusDefinition());
270  addParticle( G4OmegaMinus::OmegaMinusDefinition());
271  addParticle( G4AntiLambda::AntiLambdaDefinition());
272  addParticle( G4AntiSigmaPlus::AntiSigmaPlusDefinition());
273  addParticle( G4AntiSigmaZero::AntiSigmaZeroDefinition());
274  addParticle( G4AntiSigmaMinus::AntiSigmaMinusDefinition());
275  addParticle( G4AntiXiZero::AntiXiZeroDefinition());
276  addParticle( G4AntiXiMinus::AntiXiMinusDefinition());
277  addParticle( G4AntiOmegaMinus::AntiOmegaMinusDefinition());
278 
279  // Charmed Baryons
280  addParticle( G4LambdacPlus::LambdacPlusDefinition());
281  addParticle( G4SigmacPlusPlus::SigmacPlusPlusDefinition());
282  addParticle( G4SigmacPlus::SigmacPlusDefinition());
283  addParticle( G4SigmacZero::SigmacZeroDefinition());
284  addParticle( G4XicPlus::XicPlusDefinition());
285  addParticle( G4XicZero::XicZeroDefinition());
286  addParticle( G4OmegacZero::OmegacZeroDefinition());
287  addParticle( G4AntiLambdacPlus::AntiLambdacPlusDefinition());
288  addParticle( G4AntiSigmacPlusPlus::AntiSigmacPlusPlusDefinition());
289  addParticle( G4AntiSigmacPlus::AntiSigmacPlusDefinition());
290  addParticle( G4AntiSigmacZero::AntiSigmacZeroDefinition());
291  addParticle( G4AntiXicPlus::AntiXicPlusDefinition());
292  addParticle( G4AntiXicZero::AntiXicZeroDefinition());
293  addParticle( G4AntiOmegacZero::AntiOmegacZeroDefinition());
294 
295 #ifdef PDGTOG4PARTICLE_USE_SUSY
296  // SUSY particles from G4Extensions in ATHENA (incomplete)
297  addParticle( G4SElectronMinus::SElectronMinusDefinition());
298  addParticle( G4SElectronPlus::SElectronPlusDefinition());
299  addParticle( G4SMuonMinus::SMuonMinusDefinition());
300  addParticle( G4SMuonPlus::SMuonPlusDefinition());
301  addParticle( G4STauMinus::STauMinusDefinition());
302  addParticle( G4STauPlus::STauPlusDefinition());
303 #endif
304 
305  return predefinedParticles;
306 }
iFatras::PDGToG4Particle::m_useParticles
Gaudi::Property< std::vector< int > > m_useParticles
Definition: PDGToG4Particle.h:67
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
skel.it
it
Definition: skel.GENtoEVGEN.py:407
iFatras::PDGToG4Particle::initialize
virtual StatusCode initialize() override
AlgTool initailize method.
Definition: PDGToG4Particle.cxx:35
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
iFatras::PDGToG4Particle::getParticleDefinition
G4ParticleDefinition * getParticleDefinition(int pdgCode) const
Returns the G4ParticleDefinition of particle with PDG ID pdgCode, 0 otherwise.
Definition: PDGToG4Particle.cxx:92
iFatras::PDGToG4Particle::predefinedParticles
std::map< int, G4ParticleDefinition * > predefinedParticles()
fills default particles in map
Definition: PDGToG4Particle.cxx:194
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
CaloNoise_fillDB.dt
dt
Definition: CaloNoise_fillDB.py:58
iFatras::PDGToG4Particle::listOfParticles
std::vector< std::pair< int, std::string > > listOfParticles() const
returns a vector of pdgid / particlename pairs containing all particles
Definition: PDGToG4Particle.cxx:123
PDGToG4Particle.h
iFatras::PDGToG4Particle::printListOfParticles
void printListOfParticles(bool withDecayTableOnly=false) const
prints list of particles to stdout
Definition: PDGToG4Particle.cxx:145
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
iFatras::PDGToG4Particle::m_printList
Gaudi::Property< bool > m_printList
Definition: PDGToG4Particle.h:70
iFatras::PDGToG4Particle::m_pdgG4ParticleMap
PDGG4ParticleMap m_pdgG4ParticleMap
map from pdg codes to defined Geant4 particles
Definition: PDGToG4Particle.h:62