Geant4  10.02.p03
G4LevelReader Class Reference

#include <G4LevelReader.hh>

Collaboration diagram for G4LevelReader:

Public Member Functions

 G4LevelReader ()
 
 ~G4LevelReader ()
 
const G4LevelManager * CreateLevelManager (G4int Z, G4int A)
 
const G4LevelManager * MakeLevelManager (G4int Z, G4int A, const G4String &filename)
 
void SetVerbose (G4int val)
 

Private Member Functions

G4bool ReadDataItem (std::istream &dataFile, G4double &x)
 
G4bool ReadDataItem (std::istream &dataFile, G4String &x)
 
const std::vector< G4float > * NormalizedICCProbability (G4int Z)
 
 G4LevelReader (const G4LevelReader &right)
 
const G4LevelReaderoperator= (const G4LevelReader &right)
 
G4bool operator== (const G4LevelReader &right) const
 
G4bool operator!= (const G4LevelReader &right) const
 

Private Attributes

G4double fMinProbability
 
G4double fTimeFactor
 
G4double fEnergy
 
G4double fCurrEnergy
 
G4double fTrEnergy
 
G4double fProb
 
G4double fTime
 
G4double fSpin
 
G4double fAlpha
 
G4double fICC [10]
 
G4String fDirectory
 
G4String fFile
 
G4String fPol
 
char buffer [20]
 
char bufp [2]
 
G4int fVerbose
 
G4float fNorm1
 
G4float fNorm2
 
std::vector< G4floatvEnergy
 
std::vector< G4floatvTime
 
std::vector< G4floatvTimeg
 
std::vector< G4intvSpin
 
std::vector< const G4NucLevel * > vLevel
 
std::vector< G4floatvTransEnergy
 
std::vector< G4floatvGammaCumProbability
 
std::vector< G4floatvGammaECumProbability
 
std::vector< G4floatvGammaProbability
 
std::vector< G4intvTrans
 
std::vector< const std::vector< G4float > * > vShellProbability
 

Static Private Attributes

static G4String fTrans [10]
 

Detailed Description

Definition at line 52 of file G4LevelReader.hh.

Constructor & Destructor Documentation

◆ G4LevelReader() [1/2]

G4LevelReader::G4LevelReader ( )

Definition at line 56 of file G4LevelReader.cc.

57  : fMinProbability(1.e-8),fVerbose(0)
58 {
60  char* directory = getenv("G4LEVELGAMMADATA");
61  if(directory) {
62  fDirectory = directory;
63  } else {
64  G4Exception("G4LevelReader()","had0707",FatalException,
65  "Environment variable G4LEVELGAMMADATA is not defined");
66  fDirectory = "";
67  }
68  fFile = fDirectory + "/z100.a200";
69  fPol = " ";
70  for(G4int i=0; i<10; ++i) { fICC[i] = 0.0; }
71  for(G4int i=0; i<20; ++i) { buffer[i] = ' '; }
72  bufp[0] = bufp[1] = ' ';
73 
75  fNorm1 = fNorm2 = 0.0f;
76 
77  size_t nn = 10;
78  vTransEnergy.reserve(nn);
79  vGammaCumProbability.reserve(nn);
80  vGammaECumProbability.reserve(nn);
81  vGammaProbability.reserve(nn);
82  vShellProbability.reserve(nn);
83  vTrans.reserve(nn);
84 
85  nn = 100;
86  vEnergy.reserve(nn);
87  vTime.reserve(nn);
88  vTimeg.reserve(nn);
89  vSpin.reserve(nn);
90  vLevel.reserve(nn);
91 }
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
std::vector< G4int > vSpin
G4double fCurrEnergy
G4double fICC[10]
G4double logZ(G4int Z) const
Definition: G4Pow.hh:166
std::vector< const G4NucLevel * > vLevel
std::vector< G4float > vTransEnergy
G4double fEnergy
int G4int
Definition: G4Types.hh:78
G4String fFile
std::vector< G4float > vTime
std::vector< G4float > vTimeg
G4double fAlpha
static const double second
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
std::vector< const std::vector< G4float > * > vShellProbability
G4double fTime
std::vector< G4int > vTrans
std::vector< G4float > vGammaCumProbability
G4double fSpin
G4double fTrEnergy
G4String fDirectory
std::vector< G4float > vGammaECumProbability
G4double fTimeFactor
std::vector< G4float > vEnergy
std::vector< G4float > vGammaProbability
G4double fMinProbability
G4double fProb
Here is the call graph for this function:

◆ ~G4LevelReader()

G4LevelReader::~G4LevelReader ( )

Definition at line 93 of file G4LevelReader.cc.

94 {}

◆ G4LevelReader() [2/2]

G4LevelReader::G4LevelReader ( const G4LevelReader right)
private

Member Function Documentation

◆ CreateLevelManager()

const G4LevelManager * G4LevelReader::CreateLevelManager ( G4int  Z,
G4int  A 
)

Definition at line 97 of file G4LevelReader.cc.

98 {
99  std::ostringstream ss;
100  ss << "/z" << Z << ".a" << A;
101  G4String st = G4String(ss.str());
102  fFile = fDirectory + st;
103  return MakeLevelManager(Z, A, fFile);
104 }
const G4LevelManager * MakeLevelManager(G4int Z, G4int A, const G4String &filename)
G4String fFile
double A(double temperature)
Float_t Z
G4String fDirectory
Here is the call graph for this function:

◆ MakeLevelManager()

const G4LevelManager * G4LevelReader::MakeLevelManager ( G4int  Z,
G4int  A,
const G4String filename 
)

Definition at line 107 of file G4LevelReader.cc.

108 {
109  vEnergy.clear();
110  vTime.clear();
111  vTimeg.clear();
112  vSpin.clear();
113  vLevel.clear();
114 
115  vEnergy.push_back(0.0f);
116  vTime.push_back(FLT_MAX);
117  vTimeg.push_back(FLT_MAX);
118  vSpin.push_back(0);
119  vLevel.push_back(nullptr);
120 
121  std::ifstream infile(filename, std::ios::in);
122 
123  // file is not opened
124  if (!infile.is_open()) {
125  if (fVerbose > 0) {
126  G4cout << " G4LevelReader: fail open file for Z= "
127  << Z << " A= " << A
128  << " <" << filename << ">" << G4endl;
129  }
130 
131  } else {
132 
133  if (fVerbose > 0) {
134  G4cout << "G4LevelReader: open file for Z= "
135  << Z << " A= " << A
136  << " <" << filename << ">" << G4endl;
137  }
138  // read line by line
139  G4bool end = false;
140  G4bool next = true;
141  G4int nline = -1;
143  do {
144  fPol = " ";
145  ++nline;
146  G4bool isOK = (ReadDataItem(infile,fEnergy) &&
147  ReadDataItem(infile,fTrEnergy) &&
148  ReadDataItem(infile,fProb) &&
149  ReadDataItem(infile,fPol) &&
150  ReadDataItem(infile,fTime) &&
151  ReadDataItem(infile,fSpin) &&
152  ReadDataItem(infile,fAlpha));
153 
154  fEnergy *= CLHEP::keV;
156 
157  if(isOK) {
158  for(G4int i=0; i<10; ++i) {
159  isOK = (isOK && (ReadDataItem(infile,fICC[i])));
160  }
161  }
162  if(!isOK) {
163  end = true;
164  next = false;
165  }
166  if(fVerbose > 1) {
167  G4cout << "#Line " << nline << " " << fEnergy << " " << fTrEnergy
168  << " " << fProb << " " << fPol << " " << fTime << " "
169  << fSpin << " " << fAlpha << G4endl;
170  G4cout << " ";
171  for(G4int i=0; i<10; ++i) { G4cout << fICC[i] << " "; }
172  G4cout << G4endl;
173  }
174  // end of nuclear level data
175  if(end || fEnergy > fCurrEnergy) {
176  size_t nn = vTransEnergy.size();
177  if(nn > 0) {
178  if(fVerbose > 1) {
179  G4cout << "Reader: new level E= " << fCurrEnergy
180  << " Ntransitions= " << nn << " fNorm1= " << fNorm1
181  << " fNorm2= " << fNorm2 << G4endl;
182  }
183  if(fNorm1 > 0.0f) {
184  --nn;
185  fNorm1 = 1.0f/fNorm1;
186  vTimeg.push_back(((G4float)(fTime*fTimeFactor))*fNorm2*fNorm1);
187  fNorm2 = 1.0f/fNorm2;
188  for(size_t i=0; i<nn; ++i) {
191  if(fVerbose > 2) {
192  G4cout << "Probabilities[" << i << "]= " << vGammaCumProbability[i]
193  << " " << vGammaECumProbability[i]
194  << " Etran= " << vTransEnergy[i]
195  << G4endl;
196  }
197  }
198  vGammaCumProbability[nn] = 1.0f;
199  vGammaECumProbability[nn] = 1.0f;
200  if(fVerbose > 2) {
201  G4cout << "Probabilities[" << nn << "]= " << vGammaCumProbability[nn]
202  << " " << vGammaECumProbability[nn]
203  << " Etran= " << vTransEnergy[nn]
204  << G4endl;
205  }
206  //case of X-level
207  } else {
208  vTimeg.push_back(0.0f);
209  vGammaCumProbability[0] = 0.0f;
210  vGammaECumProbability[0] = 0.0f;
211  }
212 
213  vLevel.push_back(new G4NucLevel(vTransEnergy,
217  vTrans,
219  vTransEnergy.clear();
220  vGammaCumProbability.clear();
221  vGammaECumProbability.clear();
222  vGammaProbability.clear();
223  vShellProbability.clear();
224  vTrans.clear();
225  }
226  if(!end) { next = true; }
227  }
229  // begin nuclear level data
230  if(next) {
231  if(fVerbose > 2) {
232  G4cout << "== Reader: begin of new level E= " << fEnergy << G4endl;
233  }
234  vEnergy.push_back((G4float)fEnergy);
235  vTime.push_back((G4float)(fTime*fTimeFactor));
236  if(fSpin > 20.0) { fSpin = 0.0; }
238  vSpin.push_back(G4lrint(2*fSpin));
239  fNorm1 = 0.0f;
240  fNorm2 = 0.0f;
241  next = false;
242  }
243  // continue filling level data
244  if(!end) {
245  if(fProb > 0.0) {
246  // by default transition to a ground state
247  G4float efinal = (G4float)(fEnergy - fTrEnergy);
248  G4float elevel = 0.0f;
249  // do not check initial energy
250  G4int nn = vEnergy.size() - 1;
251  if(0 < nn) {
252  G4float ediffMin = std::abs(efinal);
253  for(G4int i=0; i<nn; ++i) {
254  G4float ediff = std::abs(efinal - vEnergy[i]);
255  /*
256  G4cout << "Elevel[" << i << "]= " << vEnergy[i]
257  << " Efinal= " << efinal
258  << " Ediff= " << ediff
259  << " EdiffMin= " << ediffMin << G4endl;
260  */
261  if(ediff < ediffMin) {
262  ediffMin = ediff;
263  elevel = vEnergy[i];
264  }
265  }
266  }
267  G4double x = 1.0 + fAlpha;
268  fNorm1 += (G4float)fProb;
269  fNorm2 += (G4float)(fProb*x);
270  vTransEnergy.push_back(elevel);
271  vGammaCumProbability.push_back(fNorm1);
272  vGammaECumProbability.push_back(fNorm2);
273  vGammaProbability.push_back((G4float)(1.0/x));
274  G4int tnum = 0;
275  if(std::abs(vEnergy[nn] - elevel) < x_energy) { tnum = 1; }
276  //for(; tnum<10; ++tnum) { if(fTrans[tnum] == fPol) { break; } }
277  vTrans.push_back(tnum);
278  if(fAlpha > 0.0) {
280  } else {
281  vShellProbability.push_back(nullptr);
282  }
283  }
284  }
285  if(nline > 10000) {
286  G4cout << "G4LevelReader: Line #" << nline << " Z= " << Z << " A= "
287  << " this file is too long - stop loading" << G4endl;
288  end = true;
289  }
290  // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
291  } while (!end);
292  infile.close();
293  }
294 
295  G4LevelManager* man = nullptr;
296  if(vEnergy.size() >= 2) {
297  man = new G4LevelManager(vEnergy,vTime,vTimeg,vSpin,vLevel);
298  if(fVerbose > 0) {
299  G4cout << "=== Reader: new manager for Z= " << Z << " A= " << A
300  << " Nlevels= " << vEnergy.size() << " E[0]= "
301  << vEnergy[0]/CLHEP::MeV << " MeV Emax= "
302  << man->MaxLevelEnergy()/CLHEP::MeV << " MeV "
303  << " S: " << vEnergy.size() << " " << vTime.size()
304  << " " << vTimeg.size() << " " << vSpin.size() << " " << vLevel.size()
305  << G4endl;
306  }
307  }
308  return man;
309 }
std::vector< G4int > vSpin
G4double fCurrEnergy
G4double fICC[10]
ifstream in
Definition: comparison.C:7
std::vector< const G4NucLevel * > vLevel
float G4float
Definition: G4Types.hh:77
const std::vector< G4float > * NormalizedICCProbability(G4int Z)
std::vector< G4float > vTransEnergy
G4double fEnergy
int G4int
Definition: G4Types.hh:78
std::vector< G4float > vTime
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
Float_t Z
bool G4bool
Definition: G4Types.hh:79
G4bool ReadDataItem(std::istream &dataFile, G4double &x)
std::vector< G4float > vTimeg
G4double fAlpha
std::vector< const std::vector< G4float > * > vShellProbability
G4double fTime
int G4lrint(double ad)
Definition: templates.hh:163
std::vector< G4int > vTrans
std::vector< G4float > vGammaCumProbability
G4double fSpin
#define G4endl
Definition: G4ios.hh:61
G4double fTrEnergy
std::vector< G4float > vGammaECumProbability
double G4double
Definition: G4Types.hh:76
static const G4float x_energy
G4double fTimeFactor
#define FLT_MAX
Definition: templates.hh:99
#define DBL_MAX
Definition: templates.hh:83
static const double keV
std::vector< G4float > vEnergy
std::vector< G4float > vGammaProbability
static const double MeV
G4double fMinProbability
G4double fProb
Here is the call graph for this function:
Here is the caller graph for this function:

◆ NormalizedICCProbability()

const std::vector< G4float > * G4LevelReader::NormalizedICCProbability ( G4int  Z)
private

Definition at line 332 of file G4LevelReader.cc.

333 {
334  std::vector<G4float>* vec = nullptr;
335  G4int LL = 3;
336  G4int M = 5;
337  G4int N = 1;
338  if(Z <= 4) {
339  LL = 1;
340  M = N = 0;
341  } else if(Z <= 6) {
342  LL = 2;
343  M = N = 0;
344  } else if(Z <= 10) {
345  M = N = 0;
346  } else if(Z <= 12) {
347  M = 1;
348  N = 0;
349  } else if(Z <= 17) {
350  M = 2;
351  N = 0;
352  } else if(Z == 18) {
353  M = 3;
354  N = 0;
355  } else if(Z <= 20) {
356  M = 3;
357  } else if(Z <= 27) {
358  M = 4;
359  }
360  G4double norm = 0.0;
361  if(LL < 3) { for(G4int i=LL+1; i<=4; ++i) { fICC[i] = 0.0; } }
362  if(M < 5) { for(G4int i=M+4; i<=8; ++i) { fICC[i] = 0.0; } }
363  if(N < 1) { fICC[9] = 0.0; }
364  for(G4int i=0; i<10; ++i) {
365  norm += fICC[i];
366  fICC[i] = norm;
367  }
368  if(norm > 0.0) {
369  norm = 1.0/norm;
370  vec = new std::vector<G4float>;
371  vec->reserve(10);
372  for(G4int i=0; i<9; ++i) {
373  vec->push_back((G4float)(fICC[i]*norm));
374  }
375  vec->push_back(1.0f);
376  }
377  return vec;
378 }
G4double fICC[10]
float G4float
Definition: G4Types.hh:77
Float_t norm
int G4int
Definition: G4Types.hh:78
Float_t Z
static const G4int LL[nN]
**D E S C R I P T I O N
double G4double
Definition: G4Types.hh:76
Here is the caller graph for this function:

◆ operator!=()

G4bool G4LevelReader::operator!= ( const G4LevelReader right) const
private

◆ operator=()

const G4LevelReader& G4LevelReader::operator= ( const G4LevelReader right)
private

◆ operator==()

G4bool G4LevelReader::operator== ( const G4LevelReader right) const
private

◆ ReadDataItem() [1/2]

G4bool G4LevelReader::ReadDataItem ( std::istream &  dataFile,
G4double x 
)
private

Definition at line 311 of file G4LevelReader.cc.

312 {
313  x = 0.0;
314  for(G4int i=0; i<20; ++i) { buffer[i] = ' '; }
315  G4bool okay = true;
316  dataFile >> buffer;
317  if(dataFile.fail()) { okay = false; }
318  else { x = strtod(buffer, 0); }
319 
320  return okay;
321 }
int G4int
Definition: G4Types.hh:78
bool G4bool
Definition: G4Types.hh:79
Here is the caller graph for this function:

◆ ReadDataItem() [2/2]

G4bool G4LevelReader::ReadDataItem ( std::istream &  dataFile,
G4String x 
)
private

Definition at line 323 of file G4LevelReader.cc.

324 {
325  G4bool okay = true;
326  dataFile >> bufp;
327  if(dataFile.fail()) { okay = false; }
328  else { x = G4String(bufp, 2); }
329  return okay;
330 }
bool G4bool
Definition: G4Types.hh:79

◆ SetVerbose()

void G4LevelReader::SetVerbose ( G4int  val)
inline

Definition at line 122 of file G4LevelReader.hh.

123 {
124  fVerbose = val;
125 }

Member Data Documentation

◆ buffer

char G4LevelReader::buffer[20]
private

Definition at line 100 of file G4LevelReader.hh.

◆ bufp

char G4LevelReader::bufp[2]
private

Definition at line 101 of file G4LevelReader.hh.

◆ fAlpha

G4double G4LevelReader::fAlpha
private

Definition at line 92 of file G4LevelReader.hh.

◆ fCurrEnergy

G4double G4LevelReader::fCurrEnergy
private

Definition at line 87 of file G4LevelReader.hh.

◆ fDirectory

G4String G4LevelReader::fDirectory
private

Definition at line 96 of file G4LevelReader.hh.

◆ fEnergy

G4double G4LevelReader::fEnergy
private

Definition at line 86 of file G4LevelReader.hh.

◆ fFile

G4String G4LevelReader::fFile
private

Definition at line 97 of file G4LevelReader.hh.

◆ fICC

G4double G4LevelReader::fICC[10]
private

Definition at line 93 of file G4LevelReader.hh.

◆ fMinProbability

G4double G4LevelReader::fMinProbability
private

Definition at line 83 of file G4LevelReader.hh.

◆ fNorm1

G4float G4LevelReader::fNorm1
private

Definition at line 105 of file G4LevelReader.hh.

◆ fNorm2

G4float G4LevelReader::fNorm2
private

Definition at line 106 of file G4LevelReader.hh.

◆ fPol

G4String G4LevelReader::fPol
private

Definition at line 98 of file G4LevelReader.hh.

◆ fProb

G4double G4LevelReader::fProb
private

Definition at line 89 of file G4LevelReader.hh.

◆ fSpin

G4double G4LevelReader::fSpin
private

Definition at line 91 of file G4LevelReader.hh.

◆ fTime

G4double G4LevelReader::fTime
private

Definition at line 90 of file G4LevelReader.hh.

◆ fTimeFactor

G4double G4LevelReader::fTimeFactor
private

Definition at line 84 of file G4LevelReader.hh.

◆ fTrans

G4String G4LevelReader::fTrans
staticprivate
Initial value:
= {
"1-", "1+", "2-", "2+", "3-", "3+", "4-", "4+", "5-", "5+"}

Definition at line 95 of file G4LevelReader.hh.

◆ fTrEnergy

G4double G4LevelReader::fTrEnergy
private

Definition at line 88 of file G4LevelReader.hh.

◆ fVerbose

G4int G4LevelReader::fVerbose
private

Definition at line 103 of file G4LevelReader.hh.

◆ vEnergy

std::vector<G4float> G4LevelReader::vEnergy
private

Definition at line 108 of file G4LevelReader.hh.

◆ vGammaCumProbability

std::vector<G4float> G4LevelReader::vGammaCumProbability
private

Definition at line 115 of file G4LevelReader.hh.

◆ vGammaECumProbability

std::vector<G4float> G4LevelReader::vGammaECumProbability
private

Definition at line 116 of file G4LevelReader.hh.

◆ vGammaProbability

std::vector<G4float> G4LevelReader::vGammaProbability
private

Definition at line 117 of file G4LevelReader.hh.

◆ vLevel

std::vector<const G4NucLevel*> G4LevelReader::vLevel
private

Definition at line 112 of file G4LevelReader.hh.

◆ vShellProbability

std::vector<const std::vector<G4float>*> G4LevelReader::vShellProbability
private

Definition at line 119 of file G4LevelReader.hh.

◆ vSpin

std::vector<G4int> G4LevelReader::vSpin
private

Definition at line 111 of file G4LevelReader.hh.

◆ vTime

std::vector<G4float> G4LevelReader::vTime
private

Definition at line 109 of file G4LevelReader.hh.

◆ vTimeg

std::vector<G4float> G4LevelReader::vTimeg
private

Definition at line 110 of file G4LevelReader.hh.

◆ vTrans

std::vector<G4int> G4LevelReader::vTrans
private

Definition at line 118 of file G4LevelReader.hh.

◆ vTransEnergy

std::vector<G4float> G4LevelReader::vTransEnergy
private

Definition at line 114 of file G4LevelReader.hh.


The documentation for this class was generated from the following files: