ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4IsotopeMagneticMomentTable.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4IsotopeMagneticMomentTable.cc
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 
50 // 0.1% torelance for excitation energy
51 
53 // Nuclear Magneton
54 
57  :G4VIsotopeTable("MagneticMoment")
58 {
59  if ( !std::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 = std::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) {
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) {
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) {
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 }