Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4Isotope.cc
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// 26.06.96: Code uses operators (+=, *=, ++, -> etc.) correctly, P. Urban
27// 29.01.97: Forbidden to create Isotope with Z<1 or N<Z, M.Maire
28// 03.05.01: flux.precision(prec) at begin/end of operator<<
29// 17.07.01: migration to STL. M. Verderi.
30// 13.09.01: suppression of the data member fIndexInTable
31// 14.09.01: fCountUse: nb of elements which use this isotope
32// 26.02.02: fIndexInTable renewed
33// 17.10.06: if fA is not defined in the constructor, it is computed from
34// NistManager v.Ivanchenko
35// 25.10.11: new scheme for G4Exception (mma)
36
37#include "G4Isotope.hh"
38
39#include "G4NistManager.hh"
41#include "G4SystemOfUnits.hh"
42
43#include <iomanip>
44
45//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
46
47G4IsotopeTable G4Isotope::theIsotopeTable;
48
49//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
50
51// Create an isotope
52//
54 : fName(Name), fZ(Z), fN(N), fA(A), fm(il)
55{
56 if (Z < 1) {
58 ed << "Wrong Isotope " << Name << " Z= " << Z << G4endl;
59 G4Exception("G4Isotope::G4Isotope()", "mat001", FatalException, ed);
60 }
61 if (N < Z) {
63 ed << "Wrong Isotope " << Name << " Z= " << Z << " > N= " << N << G4endl;
64 G4Exception("G4Isotope::G4Isotope()", "mat002", FatalException, ed);
65 }
66 if (A <= 0.0) {
67 fA =
68 (G4NistManager::Instance()->GetAtomicMass(Z, N)) * CLHEP::g / (CLHEP::mole * CLHEP::amu_c2);
69 }
70 theIsotopeTable.push_back(this);
71 fIndexInTable = theIsotopeTable.size() - 1;
72}
73
74//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
75
76G4Isotope::~G4Isotope() { theIsotopeTable[fIndexInTable] = nullptr; }
77
78//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
79
80G4bool G4Isotope::operator==(const G4Isotope& right) const { return (this == (G4Isotope*)&right); }
81
82//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
83
84G4bool G4Isotope::operator!=(const G4Isotope& right) const { return (this != (G4Isotope*)&right); }
85
86//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
87
88std::ostream& operator<<(std::ostream& flux, const G4Isotope* isotope)
89{
90 std::ios::fmtflags mode = flux.flags();
91 flux.setf(std::ios::fixed, std::ios::floatfield);
92 G4long prec = flux.precision(3);
93
94 // clang-format off
95 flux
96 << " Isotope: " << std::setw(5) << isotope->fName
97 << " Z = " << std::setw(2) << isotope->fZ
98 << " N = " << std::setw(3) << isotope->fN
99 << " A = " << std::setw(6) << std::setprecision(2)
100 << (isotope->fA)/(g/mole) << " g/mole";
101 // clang-format on
102
103 flux.precision(prec);
104 flux.setf(mode, std::ios::floatfield);
105 return flux;
106}
107
108//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
109
110std::ostream& operator<<(std::ostream& flux, const G4Isotope& isotope)
111{
112 flux << &isotope;
113 return flux;
114}
115
116//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
117
118std::ostream& operator<<(std::ostream& flux, const G4IsotopeTable& IsotopeTable)
119{
120 // Dump info for all known isotopes
121 flux << "\n***** Table : Nb of isotopes = " << IsotopeTable.size() << " *****\n" << G4endl;
122
123 for (auto& i : IsotopeTable) {
124 flux << i << G4endl;
125 }
126
127 return flux;
128}
129
130//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
131
132const G4IsotopeTable* G4Isotope::GetIsotopeTable() { return &theIsotopeTable; }
133
134//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
135
136size_t G4Isotope::GetNumberOfIsotopes() { return theIsotopeTable.size(); }
137
138//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
139
140G4Isotope* G4Isotope::GetIsotope(const G4String& isotopeName, G4bool warning)
141{
142 // search the isotope by its name
143 for (auto& J : theIsotopeTable) {
144 if (J->GetName() == isotopeName) {
145 return J;
146 }
147 }
148
149 // the isotope does not exist in the table
150 if (warning) {
151 G4cout << "\n---> warning from G4Isotope::GetIsotope(). The isotope: " << isotopeName
152 << " does not exist in the table. Return NULL pointer." << G4endl;
153 }
154 return nullptr;
155}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
std::ostream & operator<<(std::ostream &flux, const G4Isotope *isotope)
Definition G4Isotope.cc:88
std::vector< G4Isotope * > G4IsotopeTable
Definition G4Isotope.hh:59
double G4double
Definition G4Types.hh:83
long G4long
Definition G4Types.hh:87
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static const G4IsotopeTable * GetIsotopeTable()
Definition G4Isotope.cc:132
G4bool operator!=(const G4Isotope &) const
Definition G4Isotope.cc:84
static size_t GetNumberOfIsotopes()
Definition G4Isotope.cc:136
static G4Isotope * GetIsotope(const G4String &name, G4bool warning=false)
Definition G4Isotope.cc:140
G4Isotope(const G4String &name, G4int z, G4int n, G4double a=0., G4int mlevel=0)
Definition G4Isotope.cc:53
G4bool operator==(const G4Isotope &) const
Definition G4Isotope.cc:80
G4double GetAtomicMass(G4int Z, G4int N) const
static G4NistManager * Instance()
#define N
Definition crc32.c:57