Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4IsotopeMagneticMomentTable.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 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
27 //
28 // MODULE: G4IsotopeMagneticMomentTable.cc
29 //
30 // Date: 16/03/07
31 // Author: H.Kurashige
32 //
33 // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34 //
35 // HISTORY
37 
38 //
40 
41 #include "G4ios.hh"
42 #include "globals.hh"
43 #include "G4PhysicalConstants.hh"
44 #include "G4SystemOfUnits.hh"
45 #include <iomanip>
46 #include <fstream>
47 #include <sstream>
48 
49 const G4double G4IsotopeMagneticMomentTable::levelTolerance = 2.0*keV;
50 // 0.1% torelance for excitation energy
51 
52 const G4double G4IsotopeMagneticMomentTable::nuclearMagneton = eplus*hbar_Planck/2./(proton_mass_c2 /c_squared);
53 // Nuclear Magneton
54 
57  :G4VIsotopeTable("MagneticMoment")
58 {
59  if ( !getenv("G4IONMAGNETICMOMENT")) {
60 #ifdef G4VERBOSE
61  if (GetVerboseLevel()>1) {
62  G4cout << "G4IsotopeMagneticMomentTable::G4IsotopeMagneticMomentTable(): "
63  << "Please setenv G4IONMAGNETICMOMENT for the magnetic moment data."
64  << G4endl;
65  G4Exception( "G4IsotopeMagneticMomentTable",
66  "File Not Found",
67  JustWarning,
68  "Please setenv G4IONMAGNETICMOMENT");
69  }
70 #endif
71  G4Exception( "G4IsotopeMagneticMomentTable",
72  "File Not Found",
73  JustWarning,
74  "Please setenv G4IONMAGNETICMOMENT");
75  return;
76  }
77 
78  G4String file = getenv("G4IONMAGNETICMOMENT");
79  std::ifstream DataFile(file);
80 
81  if (!DataFile ) {
82 #ifdef G4VERBOSE
83  if (GetVerboseLevel()>0) {
84  G4cout << "G4IsotopeMagneticMomentTable::G4IsotopeMagneticMomentTable(): "
85  << file << " is not found " << G4endl;
86  }
87 #endif
88  G4Exception( "G4IsotopeMagneticMomentTable",
89  "File Not Found",
90  JustWarning,
91  "Can not open G4IONMAGNETICMOMENT file");
92  return;
93  }
94 
95  char inputChars[80]={' '};
96 
97  while ( !DataFile.eof() ) { // Loop checking, 09.08.2015, K.Kurashige
98  DataFile.getline(inputChars, 80);
99  G4String inputLine = inputChars;
100  G4int ionA, ionZ, ionJ, isomer;
101  G4double ionE, ionMu, ionLife;
102  G4String ionName, ionLifeUnit;
103 
104  if (inputChars[0] != '#' && inputLine.length() != 0) {
105  std::istringstream tmpstream(inputLine);
106  tmpstream >> ionZ >> ionName >> ionA
107  >> isomer >> ionE
108  >> ionLife >> ionLifeUnit
109  >> ionJ >> ionMu;
110 
111  G4IsotopeProperty* fProperty = new G4IsotopeProperty();
112  // Set Isotope Property
113  fProperty->SetAtomicNumber(ionZ);
114  fProperty->SetAtomicMass(ionA);
115  fProperty->SetIsomerLevel(isomer);
116  fProperty->SetEnergy(ionE * MeV);
117  fProperty->SetiSpin(ionJ);
118  fProperty->SetMagneticMoment(ionMu*nuclearMagneton);
119 
120  fIsotopeList.push_back(fProperty);
121 
122  //if (GetVerboseLevel()>2) {
123  // fProperty->DumpInfo();
124  //}
125 
126  }
127  }
128 
129  DataFile.close();
130 }
131 
134 {
135  for (size_t i = 0 ; i< fIsotopeList.size(); i++) {
136  delete fIsotopeList[i];
137  }
138  fIsotopeList.clear();
139 }
140 
143  :G4VIsotopeTable(right),
144  fIsotopeList(0)
145 {
146 }
147 
150 {
151  return *this;
152 }
153 
156 {
157  for (size_t i = 0 ; i< fIsotopeList.size(); ++i) {
158  G4IsotopeProperty* fP = fIsotopeList[i];
159 
160  // check Z
161  if ( fP->GetAtomicNumber() > pP->GetAtomicNumber()) {
162  // Not Found
163  break;
164  }
165  if ( fP->GetAtomicNumber() < pP->GetAtomicNumber()) {
166  // next
167  continue;
168  }
169 
170  // check A
171  if ( fP->GetAtomicMass() != pP->GetAtomicMass()) {
172  // next
173  continue;
174  }
175 
176  //check isomerLevel
177  if (fP->GetIsomerLevel() != pP->GetIsomerLevel()) {
178  // next
179  continue;
180  }
181 
182  //check E
183  if (std::fabs(fP->GetEnergy() - pP->GetEnergy()) < levelTolerance) {
184  // Found
185  return true;
186  }
187 
188  }
189  return false;
190 }
192 //
195  G4Ions::G4FloatLevelBase /*flb*/)
196 {
197  G4IsotopeProperty* fProperty = 0;
198  for (size_t i = 0 ; i< fIsotopeList.size(); ++i) {
199  G4IsotopeProperty* fP = fIsotopeList[i];
200 
201  // check Z
202  if ( fP->GetAtomicNumber() > Z) {
203  // Not Found
204  break;
205  }
206  if ( fP->GetAtomicNumber() < Z) {
207  // next
208  continue;
209  }
210 
211  // check A
212  if ( fP->GetAtomicMass() != A ) {
213  // next
214  continue;
215  }
216 
217  //check E
218  if (std::fabs(fP->GetEnergy() - E) < levelTolerance) {
219  // Found
220  fProperty = fP;
221  // fP->DumpInfo();
222  break;
223  }
224 
225  }
226 
227  return fProperty;
228 
229 }
230 
234 {
235  G4IsotopeProperty* fProperty = 0;
236  for (size_t i = 0 ; i< fIsotopeList.size(); ++i) {
237  G4IsotopeProperty* fP = fIsotopeList[i];
238 
239  // check Z
240  if ( fP->GetAtomicNumber() > Z) {
241  // Not Found
242  break;
243  }
244  if ( fP->GetAtomicNumber() < Z) {
245  // next
246  continue;
247  }
248  // check A
249  if ( fP->GetAtomicMass() != A ) {
250  // next
251  continue;
252  }
253 
254 
255  //check isomerLevel
256  if (fP->GetIsomerLevel() == lvl) {
257  // Found
258  fProperty = fP;
259  //fP->DumpInfo();
260  break;
261  }
262 
263  }
264 
265  return fProperty;
266 
267 }
void SetAtomicMass(G4int A)
virtual G4IsotopeProperty * GetIsotopeByIsoLvl(G4int Z, G4int A, G4int lvl=0)
static constexpr double proton_mass_c2
G4int GetAtomicNumber() const
G4IsotopeMagneticMomentTable & operator=(const G4IsotopeMagneticMomentTable &right)
G4int GetIsomerLevel() const
int G4int
Definition: G4Types.hh:78
void SetiSpin(G4int J)
void SetMagneticMoment(G4double M)
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
G4double GetEnergy() const
bool G4bool
Definition: G4Types.hh:79
static constexpr double eplus
Definition: G4SIunits.hh:199
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
static constexpr double c_squared
void SetEnergy(G4double E)
virtual G4bool FindIsotope(G4IsotopeProperty *property)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
static constexpr double hbar_Planck
static constexpr double keV
Definition: G4SIunits.hh:216
void SetAtomicNumber(G4int Z)
G4int GetAtomicMass() const
G4FloatLevelBase
Definition: G4Ions.hh:95
void SetIsomerLevel(G4int level)
virtual G4IsotopeProperty * GetIsotope(G4int Z, G4int A, G4double E, G4Ions::G4FloatLevelBase flb=G4Ions::G4FloatLevelBase::no_Float)