Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4LevelReader.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// $Id$
27//
28// -------------------------------------------------------------------
29//
30// GEANT4 header file
31//
32// File name: G4NucLevel
33//
34// Author: V.Ivanchenko (M.Kelsey reading method is used)
35//
36// Creation date: 4 January 2012
37//
38// Modifications:
39//
40// -------------------------------------------------------------------
41
42#include "G4LevelReader.hh"
43#include "G4NucLevel.hh"
44#include "G4SystemOfUnits.hh"
45
47 : nLevels(0),nLevelMax(50),fVerbose(0),fMinProbability(1.e-10)
48{
49 fLevelEnergy = fNewEnergy = fDeltaEnergy = fNewTime
50 = fHalfLifeTime = fProbability = fICC = fx = 0.0;
51 eGamma.resize(nLevelMax,0.0);
52 wGamma.resize(nLevelMax,0.0);
53 kICC.resize(nLevelMax,0.0);
54 for(G4int i=0; i<30; ++i) { buffer[i] = 0; }
55}
56
58{}
59
61 std::vector<G4NucLevel*>* levels,
62 const G4String& filename)
63{
64 std::ifstream inFile(filename);
65 if (!inFile.is_open()) {
66 if (fVerbose > 0) {
67 G4cout << " G4LevelReader: nuclide ("
68 << Z << "," << A
69 << ") does not have a gamma levels file" << G4endl;
70 }
71 return;
72 }
73
74 // Read file with gamma data and fill levels
75 fLevelEnergy = 0.0;
76 nLevels = 0;
77
78 // read next line
79 while(Read(inFile)) {
80
81 // create new level and start fill the next
82 if(fNewEnergy != fLevelEnergy) {
83 if(0 < nLevels) { MakeNewLevel(levels); }
84 fLevelEnergy = fNewEnergy;
85 fHalfLifeTime = fNewTime;
86 nLevels = 0;
87 }
88
89 // fill data on a new daughter level
90 eGamma[nLevels] = fDeltaEnergy*keV;
91 wGamma[nLevels] = std::max(fProbability*0.01,fMinProbability);
92 kICC[nLevels] = fICC;
93 ++nLevels;
94
95 // check buffer size - should never happen
96 if(nLevels > nLevelMax) {
97 nLevelMax += 10;
98 eGamma.resize(nLevelMax);
99 wGamma.resize(nLevelMax);
100 kICC.resize(nLevelMax);
101 }
102 }
103 // end of reading
104 if(0 < nLevels) {
105 MakeNewLevel(levels);
106 inFile.close();
107 }
108}
109
110G4bool G4LevelReader::Read(std::ifstream& dataFile)
111{
112 // Each item will return iostream status
113 return (ReadDataItem(dataFile, fNewEnergy) &&
114 ReadDataItem(dataFile, fDeltaEnergy) &&
115 ReadDataItem(dataFile, fProbability) &&
116 ReadDataItem(dataFile, fx) &&
117 ReadDataItem(dataFile, fNewTime) &&
118 ReadDataItem(dataFile, fx) &&
119 ReadDataItem(dataFile, fICC) &&
120 ReadDataItem(dataFile, fx) &&
121 ReadDataItem(dataFile, fx) &&
122 ReadDataItem(dataFile, fx) &&
123 ReadDataItem(dataFile, fx) &&
124 ReadDataItem(dataFile, fx) &&
125 ReadDataItem(dataFile, fx) &&
126 ReadDataItem(dataFile, fx) &&
127 ReadDataItem(dataFile, fx) &&
128 ReadDataItem(dataFile, fx) &&
129 ReadDataItem(dataFile, fx) );
130}
131
132G4bool
133G4LevelReader::ReadDataItem(std::istream& dataFile, G4double& x)
134{
135 G4bool okay = (dataFile >> buffer); // Get next token
136 if (okay) x = strtod(buffer, NULL);
137
138 return okay;
139}
140
141void G4LevelReader::MakeNewLevel(std::vector<G4NucLevel*>* levels)
142{
143 // first normalize probabilities
144 G4double norm = 0.0;
145 for(size_t i=0; i<nLevels; ++i) { norm += wGamma[i]; }
146
147 // should never happen
148 if(norm <= 0.0) { return; }
149
150 norm = 1.0/norm;
151 for(size_t i=0; i<nLevels; ++i) { wGamma[i] *= norm; }
152
153 // correct probabilities on ICC factor
154 norm = 0.0;
155 for(size_t i=0; i<nLevels; ++i) {
156 wGamma[i] /= (1.0 + kICC[i]);
157 norm += wGamma[i];
158 }
159 norm = 1.0/norm;
160 fHalfLifeTime *= norm*second;
161
162 // cumulative sum
163 if(1 == nLevels) {
164 wGamma[0] = 1.0;
165 } else if(2 == nLevels) {
166 wGamma[0] *= norm;
167 wGamma[1] = 1.0;
168 } else {
169 wGamma[0] *= norm;
170 for(size_t i=1; i<nLevels-1; ++i) {
171 wGamma[i] = wGamma[i]*norm + wGamma[i-1];
172 }
173 wGamma[nLevels-1] = 1.0;
174 }
175 G4NucLevel* p = new G4NucLevel(fLevelEnergy, fHalfLifeTime,
176 eGamma, wGamma);
177 levels->push_back(p);
178 return;
179}
180
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4endl
Definition: G4ios.hh:52
G4DLLIMPORT std::ostream G4cout
void FillLevels(G4int Z, G4int A, std::vector< G4NucLevel * > *levels, const G4String &filename)