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