ATLAS Offline Software
Loading...
Searching...
No Matches
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 *=======================================================================*/
34StatusCode
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 *=======================================================================*/
91G4ParticleDefinition*
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 *=======================================================================*/
122std::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 *=======================================================================*/
144void
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 *=======================================================================*/
193std::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}
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
Gaudi::Property< std::vector< int > > m_useParticles
G4ParticleDefinition * getParticleDefinition(int pdgCode) const
Returns the G4ParticleDefinition of particle with PDG ID pdgCode, 0 otherwise.
void printListOfParticles(bool withDecayTableOnly=false) const
prints list of particles to stdout
std::map< int, G4ParticleDefinition * > predefinedParticles()
fills default particles in map
std::vector< std::pair< int, std::string > > listOfParticles() const
returns a vector of pdgid / particlename pairs containing all particles
virtual StatusCode initialize() override
AlgTool initailize method.
Gaudi::Property< bool > m_printList
PDGG4ParticleMap m_pdgG4ParticleMap
map from pdg codes to defined Geant4 particles