source: trunk/source/processes/hadronic/models/radioactive_decay/src/G4RIsotopeTable.cc@ 1337

Last change on this file since 1337 was 962, checked in by garnier, 17 years ago

update processes

File size: 8.8 KB
Line 
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: G4RIsotopeTable.cc
29//
30// Version: 0.b.4
31// Date: 14/04/00
32// Author: F Lei & P R Truscott
33// Organisation: DERA UK
34// Customer: ESA/ESTEC, NOORDWIJK
35// Contract: 12115/96/JG/NL Work Order No. 3
36//
37// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
38//
39// CHANGE HISTORY
40// --------------
41//
42// 29 February 2000, P R Truscott, DERA UK
43// 0.b.3 release.
44//
45// 14 April 2000, F Lei, DERA UK
46// 0.b.4 release. Minor changes to
47// 1) levelTolerance = 2.0 keV
48// 2) changes to verbose control
49//
50// 18,July 2001 F.Lei
51// tidy up the print out at run level
52//
53// %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
54///////////////////////////////////////////////////////////////////////////////
55//
56#include "G4DecayTable.hh"
57#include "G4ParticleTable.hh"
58#include "G4IsotopeProperty.hh"
59#include "G4RIsotopeTable.hh"
60
61#include "G4HadronicException.hh"
62
63/*
64#include "G4RadioactiveDecayMode.hh"
65#include "G4ITDecayChannel.hh"
66#include "G4BetaMinusDecayChannel.hh"
67#include "G4BetaPlusDecayChannel.hh"
68#include "G4KshellECDecayChannel.hh"
69#include "G4LshellECDecayChannel.hh"
70#include "G4AlphaDecayChannel.hh"
71*/
72#include "G4ios.hh"
73#include "globals.hh"
74#include <iomanip>
75#include <fstream>
76#include <sstream>
77
78const G4double G4RIsotopeTable::levelTolerance = 2.0*keV;
79
80///////////////////////////////////////////////////////////////////////////////
81//
82G4RIsotopeTable::G4RIsotopeTable()
83{
84 ;
85}
86
87///////////////////////////////////////////////////////////////////////////////
88//
89G4RIsotopeTable::~G4RIsotopeTable()
90{
91 fIsotopeList.clear();
92 fIsotopeNameList.clear();
93}
94///////////////////////////////////////////////////////////////////////////////
95//
96G4int G4RIsotopeTable::GetVerboseLevel() const
97{
98 return G4ParticleTable::GetParticleTable()->GetVerboseLevel();
99}
100///////////////////////////////////////////////////////////////////////////////
101//
102G4bool G4RIsotopeTable::FindIsotope(G4IsotopeProperty* )
103{
104 // do nothing, it is here just for the compiler
105 // it is required by the base class
106 return true;
107}
108///////////////////////////////////////////////////////////////////////////////
109//
110G4IsotopeProperty* G4RIsotopeTable::GetIsotope(G4int Z, G4int A, G4double E)
111{
112 G4String fname = GetIsotopeName(Z, A, E);
113 G4int j = -1;
114 for (G4int i = 0 ; i< Entries(); i++) {
115 if(fIsotopeNameList[i] == fname) j = i;}
116 if (j >=0) {
117 if (GetVerboseLevel()>1) {
118 G4cout <<"G4RIsotopeTable::GetIsotope No. : ";
119 G4cout <<j<<G4endl;
120 }
121 return GetIsotope(j);}
122 // isotope property data has been loaded already and just return the pointer
123 else{
124 G4double meanlife = GetMeanLifeTime(Z, A, E);
125 // E is pass as a refence hence on entry E is supplied by the user and it
126 // could be slightly different from the returned value which is the one
127 // defined in the database.
128 // this call is to ensure the code uses a consistane E value through out.
129 //
130
131 G4IsotopeProperty* fProperty = new G4IsotopeProperty();
132 // Set Isotope Property
133 fProperty->SetLifeTime(meanlife);
134 fProperty->SetAtomicNumber(Z);
135 fProperty->SetAtomicMass(A);
136 // Notic that the value of E may have been changed
137 fProperty->SetEnergy(E);
138 // The spin is not being used in the current implementation
139 fProperty->SetiSpin(0);
140 // the decaytable will be loaded later in G4RadioactiveDecay when it is needed
141 fProperty->SetDecayTable(0);
142
143 fIsotopeList.push_back(fProperty);
144 fname = GetIsotopeName(Z, A, E);
145 fIsotopeNameList.push_back(fname);
146 if (GetVerboseLevel()>1) {
147 G4cout <<"G4RIsotopeTable::GetIsotope create: ";
148 G4cout <<fname <<G4endl;
149 }
150 return fProperty;
151
152 }
153}
154///////////////////////////////////////////////////////////////////////////////
155//
156G4String G4RIsotopeTable::GetIsotopeName(G4int Z, G4int A, G4double E)
157{
158 std::ostringstream os;
159 os.setf(std::ios::fixed);
160 os <<"A"<< A << "Z" << Z <<'[' << std::setprecision(1) << E/keV << ']';
161 G4String name = os.str();
162 if (GetVerboseLevel()>1) {
163 G4cout <<"G4RIsotopeTable::GetIsotope Name: ";
164 G4cout <<name <<G4endl;
165 }
166 return name;
167}
168///////////////////////////////////////////////////////////////////////////////
169//
170G4double G4RIsotopeTable::GetMeanLifeTime (G4int Z, G4int A, G4double& aE)
171{
172 G4double lifetime = -1.0;
173 // G4double levelTolerance = 1.0 * keV ;
174 if ( !getenv("G4RADIOACTIVEDATA")) {
175 G4cout << "Please setenv G4RADIOACTIVEDATA to point to the radioactive decay data files." << G4endl;
176 throw G4HadronicException(__FILE__, __LINE__,
177 "Please setenv G4RADIOACTIVEDATA to point to the radioactive decay data files.");
178 }
179 G4String dirName = getenv("G4RADIOACTIVEDATA");
180
181 std::ostringstream os;
182 os <<dirName <<"/z" <<Z <<".a" <<A ;
183 G4String file = os.str();
184 std::ifstream DecaySchemeFile(file);
185
186 if (!DecaySchemeFile )
187 {
188 if (GetVerboseLevel()>1) {
189 G4cout <<"G4RIsotopeTable::GetMeanLife() : "
190 <<"cannot find ion radioactive decay file: "
191 <<file <<G4endl;
192 G4cout <<"The nucleus is assumed to be stable " <<G4endl;
193 }
194 }
195 else
196 {
197 G4bool found(false);
198 char inputChars[80]={' '};
199 G4String inputLine;
200 G4String recordType("");
201 G4double a(0.0);
202 G4double b(0.0);
203
204// while (!found && -DecaySchemeFile.getline(inputChars, 80).eof() != EOF)
205 while (!found && !DecaySchemeFile.getline(inputChars, 80).eof())
206 {
207 inputLine = inputChars;
208 //G4String::stripType stripend(1);
209 //G4String::stripType stripend =trailing;
210 inputLine = inputLine.strip(1);
211
212 if (inputChars[0] != '#' && inputLine.length() != 0)
213 {
214 std::istringstream tmpstream(inputLine);
215 // tmpstream = inputLine;
216 tmpstream >>recordType >>a >>b;
217 if (recordType == "P")
218 {
219 if (std::abs(a*keV-aE) < levelTolerance)
220 {
221 found = true;
222 lifetime = b/0.693147*s ;
223 // in the database was half-life!
224 // aE = a*keV;
225 // pass back the correct energy
226 }
227 }
228 }
229 }
230 if (!found && aE )
231 {
232 if (GetVerboseLevel()>1) {
233 G4cout <<"G4RIsotopeTable::GetMeanLife() : ";
234 G4cout <<"cannot find ion of required excitation E = " << aE << G4endl;
235 G4cout <<"state in radioactive data file " <<G4endl;
236 G4cout <<"The nucleus is assumed to be IT decayed with life = 1E-20 s" <<G4endl;
237 G4cout <<" -----------* THIS MAY CAUSE PROBLEM IN ITS DECAY-----------" <<G4endl;
238 lifetime = 1.0E-20*s;
239 }
240 }
241 if (!found && !aE )
242 {
243 if (GetVerboseLevel()>1) {
244 G4cout <<"G4RIsotopeTable::GetMeanLife() : ";
245 G4cout <<"cannot find ion of required excitation E = " << aE << G4endl;
246 G4cout <<"state in radioactive data file " <<G4endl;
247 G4cout <<"The nucleus is assumed to be stable" <<G4endl;
248 lifetime = -1.0;
249 }
250 }
251 DecaySchemeFile.close();
252 }
253 if (GetVerboseLevel()>1) {
254 G4cout <<"G4RIsotopeTable::GetMeanLifeTime: ";
255 G4cout <<lifetime << " for " << GetIsotopeName(Z, A, aE) <<G4endl;
256 }
257 return lifetime;
258}
259///////////////////////////////////////////////////////////////////////////////
260//
261
262
263
264
265
266
267
268
269
270
271
272
273
274
Note: See TracBrowser for help on using the repository browser.