Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4IonTable.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4IonTable
27//
28// Class description:
29//
30// G4IonTable stores all pointers to G4ParticleDefinition.
31
32// Author: H.Kurashige, 27 June 1998
33// --------------------------------------------------------------------
34#ifndef G4IonTable_hh
35#define G4IonTable_hh 1
36
37#include "G4Ions.hh"
39#include "G4ParticleTable.hh"
40#include "G4ios.hh"
41#include "globals.hh"
42
43#include <cmath>
44#include <map>
45#include <vector>
46
47class G4ParticleTable;
48class G4VIsotopeTable;
50class G4NuclideTable;
51
53{
54 public:
55 using G4IonList = std::multimap<G4int, const G4ParticleDefinition*>;
56 using G4IonListIterator = std::multimap<G4int, const G4ParticleDefinition*>::iterator;
57
58 // Constructor, destructor
59 G4IonTable();
61
62 // Forbidden copy constructor and assignment operator
63 G4IonTable(const G4IonTable&) = delete;
64 G4IonTable& operator=(const G4IonTable&) = delete;
65
66 static G4IonTable* GetIonTable();
67
68 // Method is used by each worker thread to copy the content
69 // from the master thread.
70 void WorkerG4IonTable();
71
72 // Destructor for worker
74
75 // Get number of elements defined in the IonTable
77
78 // Register Isotope table
80
81 // G4IonTable asks properties of isotopes to G4VIsotopeTable
82 // by using FindIsotope(G4IsotopeProperty* property) method
83 G4VIsotopeTable* GetIsotopeTable(std::size_t idx = 0) const;
84
85 // All ground state ions are created.
86 // Stable ground states are defined in G4NuclearProperty
87 void CreateAllIon();
88
89 // All excited ions with long life time (>1.0*ns) are created.
90 // Isomers are defined in G4VIsotopeTable
91 void CreateAllIsomer();
92
93 // All nuclide with a life time longer than certain value are created
94 // prior to the event loop
96 void PreloadNuclide();
97
98 // --------------------------------------------------------------
99 // FindIon/GetIon
100 // FindIon() methods return pointer of ion if it exists.
101 // GetIon() methods also return pointer of ion; the designated
102 // ion is created if it does not exist.
103 //
104 // !! PDGCharge in G4ParticleDefinition of ions is !!
105 // !! electric charge of nucleus (i.e. fully ionized ions) !!
106 // --------------------------------------------------------------
107
108 // Find/Get "ground state" and "excited state"
109 //
114 G4int J = 0);
115 G4ParticleDefinition* GetIon(G4int Z, G4int A, G4double E, char flbChar, G4int J = 0);
119 G4ParticleDefinition* GetIon(G4int Z, G4int A, G4int nL, G4double E, char flbChar, G4int J = 0);
120 // Z: Atomic Number
121 // A: Atomic Mass (nn + np +nlambda)
122 // nL: Number of Lambda
123 // E: Excitation energy
124 // lvl: Isomer Level 0: ground state)
125 // flb: Floating level base (enum defined in G4Ions.hh)
126 // flbChar: Floating level base denoted by a character
127 // (<null>,X,Y,Z,U,V,W,R,S,T,A,B,C,D,E)
128 // J: Total Angular momentum (in unit of 1/2) : not used
129
130 // The ion can be retrieved by using PDG encoding
131 // !! Only ground state can be obtained .i.e. Isomer = 0
133
134 // Find/Get "excited state"
135 //
140 G4int J = 0);
141 G4ParticleDefinition* FindIon(G4int Z, G4int A, G4double E, char flbChar, G4int J = 0);
145 G4ParticleDefinition* FindIon(G4int Z, G4int A, G4int nL, G4double E, char flbChar,
146 G4int J = 0);
147 // Z: Atomic Number
148 // A: Atomic Mass (nn + np +nlambda)
149 // nL: Number of Lambda
150 // E: Excitaion energy
151 // lvl: Isomer Level 0: ground state)
152 // flb: Floating level base (enum defined in G4Ions.hh)
153 // flbChar: Floating level base denoted by a character
154 // (<null>,X,Y,Z,U,V,W,R,S,T,A,B,C,D,E)
155 // J: Total Angular momentum (in unit of 1/2) : not used
156
157 // Return true if the particle is ion
158 static G4bool IsIon(const G4ParticleDefinition*);
159
160 // Return true if the particle is anti_ion
162
163 // Get ion name
164 G4String GetIonName(G4int Z, G4int A, G4int lvl = 0) const;
169 G4String GetIonName(G4int Z, G4int A, G4int nL, G4int lvl) const;
170
171 // Get PDG code for Ions.
172 // Nuclear codes are given as 10-digit numbers +-100ZZZAAAI.
173 // For a nucleus consisting of np protons and nn neutrons
174 // A = np + nn and Z = np.
175 // I gives the isomer level, with I = 0 corresponding
176 // to the ground state and I >0 to excitations
177 static G4int GetNucleusEncoding(G4int Z, G4int A, G4double E = 0.0, G4int lvl = 0);
178
179 // Get PDG code for Hyper-Nucleus Ions.
180 // Nuclear codes are given as 10-digit numbers +-10LZZZAAAI.
181 // For a nucleus consisting of np protons and nn neutrons
182 // A = np + nn +nlambda and Z = np.
183 // nL = nlambda
184 // I gives the isomer level, with I = 0 corresponding
185 // to the ground state and I >0 to excitations
186 static G4int GetNucleusEncoding(G4int Z, G4int A, G4int nL, G4double E = 0.0, G4int lvl = 0);
187
190 G4int& lvl);
191 // Energy will not be given even for excited state!!
192
193 // These methods returns Nucleus (i.e. full ionized atom) mass, where
194 // Z is Atomic Number (number of protons) and
195 // A is Atomic Number (number of nucleons and hyperons)
196 // nL is number of lambda (A= nn + np + nlambda)
197 // lvl is isomer level
198 G4double GetIonMass(G4int Z, G4int A, G4int nL = 0, G4int lvl = 0) const;
199 G4double GetNucleusMass(G4int Z, G4int A, G4int nL = 0, G4int lvl = 0) const;
200 G4double GetIsomerMass(G4int Z, G4int A, G4int lvl = 0) const;
201
202 // Returns a life time of an ion. -1 for stable ion, and -1001 for ion
203 // that is not listed in G4NuclideTable
207 G4double GetLifeTime(G4int Z, G4int A, G4double E, char flbChar) const;
208
211
212 // Return number of ions in the table
213 G4int Entries() const;
214
215 // Return the pointer of index-th ion in the table
217
218 // Return 'true' if the ion exists
219 G4bool Contains(const G4ParticleDefinition* particle) const;
220
221 // Insert/Remove an ion in the table
222 void Insert(const G4ParticleDefinition* particle);
223 void Remove(const G4ParticleDefinition* particle);
224
225 // Erase all contents in the list (not delete just remove)
226 void clear();
227
228 // Return number of ions in the table
229 G4int size() const;
230
231 // Dump information of particles specified by name
232 void DumpTable(const G4String& particle_name = "ALL") const;
233
234 public:
235 // Needed for MT
236 void InitializeLightIons();
237
238 // It is very important for multithreaded Geant4 to keep only one copy of
239 // the particle table pointer and the ion table pointer. However, we try
240 // to let each worker thread hold its own copy of the particle dictionary
241 // and the ion list. This implementation is equivalent to make the ion
242 // table thread private. The two shadow ponters are used by each worker
243 // thread to copy the content from the master thread
245 static G4ThreadLocal std::vector<G4VIsotopeTable*>* fIsotopeTableList;
247 static std::vector<G4VIsotopeTable*>* fIsotopeTableListShadow;
248
249 enum
250 {
251 numberOfElements = 118
252 };
254
255#ifdef G4MULTITHREADED
256 static G4Mutex ionTableMutex;
257#endif
258
259 protected:
266
272
273 void InsertWorker(const G4ParticleDefinition* particle);
274
275 // Create Ion
276
278 G4Ions::G4FloatLevelBase flb) const;
280 // Ask properties of isotopes
281
284
285 // Return true if the particle is pre-defined ion
288
289 // Add process manager to ions with name of 'ionName'
291
292 // Get Verbose Level defined in G4ParticleTable
293 G4int GetVerboseLevel() const;
294
295 private:
296 G4NuclideTable* pNuclideTable = nullptr;
297
298 // Isomer table and flag of creation
299 G4bool isIsomerCreated = false;
300};
301
302// ------------------------
303// Inline methods
304// ------------------------
305
307{
308 return numberOfElements;
309}
310
311#endif
std::mutex G4Mutex
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
void PreloadNuclide()
G4bool Contains(const G4ParticleDefinition *particle) const
void Remove(const G4ParticleDefinition *particle)
static G4ThreadLocal std::vector< G4VIsotopeTable * > * fIsotopeTableList
void PrepareNuclideTable()
static G4IonList * fIonListShadow
G4IonTable(const G4IonTable &)=delete
G4bool IsLightAntiIon(const G4ParticleDefinition *) const
void CreateAllIsomer()
G4double GetNucleusMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
static G4bool GetNucleusByEncoding(G4int encoding, G4int &Z, G4int &A, G4double &E, G4int &lvl)
G4ParticleDefinition * GetMuonicAtom(G4Ions const *)
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
G4ParticleDefinition * GetParticle(G4int index) const
G4bool IsLightIon(const G4ParticleDefinition *) const
std::multimap< G4int, const G4ParticleDefinition * > G4IonList
Definition G4IonTable.hh:55
void DestroyWorkerG4IonTable()
static std::vector< G4VIsotopeTable * > * fIsotopeTableListShadow
void DumpTable(const G4String &particle_name="ALL") const
G4String GetIonName(G4int Z, G4int A, G4int lvl=0) const
void WorkerG4IonTable()
static G4ThreadLocal G4IonList * fIonList
G4ParticleDefinition * GetLightIon(G4int Z, G4int A) const
static G4IonTable * GetIonTable()
G4double GetLifeTime(const G4ParticleDefinition *) const
void RegisterIsotopeTable(G4VIsotopeTable *table)
static G4bool IsIon(const G4ParticleDefinition *)
G4ParticleDefinition * FindIon(G4int Z, G4int A, G4int lvl=0)
static G4int GetNucleusEncoding(G4int Z, G4int A, G4double E=0.0, G4int lvl=0)
G4int Entries() const
void InsertWorker(const G4ParticleDefinition *particle)
std::multimap< G4int, const G4ParticleDefinition * >::iterator G4IonListIterator
Definition G4IonTable.hh:56
G4IonTable & operator=(const G4IonTable &)=delete
G4int GetNumberOfElements() const
void AddProcessManager(G4ParticleDefinition *)
void Insert(const G4ParticleDefinition *particle)
G4double GetIonMass(G4int Z, G4int A, G4int nL=0, G4int lvl=0) const
G4int GetVerboseLevel() const
static const G4String elementName[numberOfElements]
G4double GetIsomerMass(G4int Z, G4int A, G4int lvl=0) const
static G4bool IsAntiIon(const G4ParticleDefinition *)
G4IsotopeProperty * FindIsotope(G4int Z, G4int A, G4double E, G4Ions::G4FloatLevelBase flb) const
G4VIsotopeTable * GetIsotopeTable(std::size_t idx=0) const
void CreateAllIon()
void InitializeLightIons()
G4int size() const
G4ParticleDefinition * GetLightAntiIon(G4int Z, G4int A) const
G4ParticleDefinition * FindIonInMaster(G4int Z, G4int A, G4int lvl=0)
G4ParticleDefinition * CreateIon(G4int Z, G4int A, G4double E, G4Ions::G4FloatLevelBase flb)
G4FloatLevelBase
Definition G4Ions.hh:80
#define G4ThreadLocal
Definition tls.hh:77