53 const G4int countmax = 4;
54 const G4int nfloting = 13;
55 const G4double eTolarence = 2*CLHEP::eV;
56 const G4String fFloatingLevels[13] = {
57 "-",
"+X",
"+Y",
"+Z",
"+U",
"+V",
"+W",
"+R",
"+S",
"+T",
"+A",
"+B",
"+C"};
66 if (fDirectory.empty()) {
68 "G4LEVELGAMMADATA environment variable not set");
71 vTrans.resize(fTransMax,0);
72 vRatio.resize(fTransMax,0.0f);
73 vGammaCumProbability.resize(fTransMax,0.0f);
74 vGammaProbability.resize(fTransMax,0.0f);
75 vShellProbability.resize(fTransMax,
nullptr);
77 vEnergy.resize(fLevelMax,0.0);
78 vSpin.resize(fLevelMax,0);
79 vLevel.resize(fLevelMax,
nullptr);
82G4bool G4LevelReader::ReadData(std::istringstream& stream,
G4double& x)
85 return !stream.fail();
88G4bool G4LevelReader::ReadDataItem(std::istream& dataFile,
G4double& x)
91 for(
G4int i=0; i<nbufmax; ++i) { buffer[i] =
' '; }
94 if(dataFile.fail()) { okay =
false; }
95 else { x = std::strtod(buffer, 0); }
99G4bool G4LevelReader::ReadDataItem(std::istream& dataFile,
G4float& x)
102 for(
G4int i=0; i<nbuf1; ++i) { buff1[i] =
' '; }
105 if(dataFile.fail()) { okay =
false; }
106 else { x = std::atof(buff1); }
111G4bool G4LevelReader::ReadDataItem(std::istream& dataFile,
G4int& ix)
114 for(
G4int i=0; i<nbuf2; ++i) { buff2[i] =
' '; }
117 if(dataFile.fail()) { okay =
false; }
118 else { ix = std::atoi(buff2); }
123const std::vector<G4float>* G4LevelReader::NormalizedICCProbability(
G4int Z)
125 std::vector<G4float>* vec =
nullptr;
156 if(LL < 3) {
for(
G4int i=LL+1; i<=4; ++i) { fICC[i] = 0.0f; } }
157 if(
M < 5) {
for(
G4int i=
M+4; i<=8; ++i) { fICC[i] = 0.0f; } }
158 if(
N < 1) { fICC[9] = 0.0f; }
161 for (
G4int i = 0; i <= Kmax; ++i) {
168 vec =
new std::vector<G4float>(Kmax + 1, 0.0f);
169 for (
G4int i = 0; i < Kmax; ++i) {
170 (*vec)[i] = fICC[i]*norm;
175 G4cout <<
"# InternalConv: ";
176 for (
G4int i = 0; i <= Kmax; ++i) {
G4cout <<
" " << (*vec)[i]; }
186 std::ostringstream ss;
187 ss << fDirectory <<
"/z" << Z <<
".a" <<
A;
188 std::ifstream infile(ss.str(), std::ios::in);
191 if (!infile.is_open()) {
194 ed <<
"Regular file " << ss.str() <<
" is not opened! Z="
196 G4Exception(
"G4LevelReader::LevelManager(..)",
"had014",
203 G4cout <<
"G4LevelReader: open file " << ss.str() <<
" for Z= "
206 return LevelManager(Z,
A, infile);
212 std::ifstream infile(filename, std::ios::in);
215 if (!infile.is_open()) {
218 ed <<
"External file " << filename <<
" is not opened! Z="
220 G4Exception(
"G4LevelReader::LevelManager(..)",
"had014",
227 G4cout <<
"G4LevelReader: open external file " << filename
228 <<
" for Z= " << Z <<
" A= " <<
A <<
G4endl;
230 return LevelManager(Z,
A, infile);
234G4LevelReader::LevelManager(
G4int Z,
G4int A, std::ifstream& infile)
240 infile >> i1 >> fPol;
244 G4cout <<
"### End of file Z= " << Z <<
" A= " <<
A
245 <<
" Nlevels= " << i <<
G4endl;
252 G4cout <<
"New line: i1= " << i1 <<
" fPol= <" << fPol <<
"> " <<
G4endl;
256 if (!(ReadDataItem(infile, fEnergy) &&
257 ReadDataItem(infile, fTime) &&
258 ReadDataItem(infile, fSpin) &&
259 ReadDataItem(infile, ntrans))) {
261 G4cout <<
"### Incomplete end of file Z= " << Z <<
" A= " <<
A
262 <<
" Nlevels= " << i <<
G4endl;
266 fEnergy *= CLHEP::keV;
267 for (k=0; k<nfloting; ++k) {
268 if (fPol == fFloatingLevels[k]) {
275 if (fEnergy < vEnergy[i-1]) {
278 if (count1 < countmax && fVerbose > 0) {
279 G4cout <<
"### G4LevelReader: broken level " << i
280 <<
" E(MeV)= " << fEnergy <<
" < " << vEnergy[i-1]
281 <<
" for isotope Z= " << Z <<
" A= "
282 <<
A <<
" level energy increased" <<
G4endl;
286 fEnergy = vEnergy[i-1] + eTolarence;
289 vEnergy[i] = fEnergy;
290 if (fTime > 0.0) { fTime *= fTimeFactor; }
291 else if (fTime < 0.0) { fTime =
DBL_MAX; }
294 twos = std::max(twos, -100);
295 vSpin[i] = 100 + twos + k*100000;
298 G4cout <<
" Level #" << i1 <<
" E(MeV)=" << fEnergy/CLHEP::MeV
299 <<
" LTime(s)=" << fTime <<
" 2S=" << vSpin[i]
300 <<
" meta=" << vSpin[i]/100000 <<
" idx=" << i
301 <<
" ntr=" << ntrans <<
G4endl;
306 vLevel[i] =
new G4NucLevel(0, fTime, vTrans,
307 vGammaCumProbability,
311 }
else if (ntrans > 0) {
314 if (ntrans > fTransMax) {
316 vTrans.resize(fTransMax);
317 vRatio.resize(fTransMax);
318 vGammaCumProbability.resize(fTransMax);
319 vGammaProbability.resize(fTransMax);
320 vShellProbability.resize(fTransMax);
323 for (
G4int j=0; j<ntrans; ++j) {
325 if (!(ReadDataItem(infile, i2) &&
326 ReadDataItem(infile, fTransEnergy) &&
327 ReadDataItem(infile, fProb) &&
328 ReadDataItem(infile, tnum) &&
329 ReadDataItem(infile, vRatio[j]) &&
330 ReadDataItem(infile, fAlpha))) {
333 if (count2 < countmax && fVerbose > 0) {
334 G4cout <<
"### Fail to read transition j=" << j
335 <<
" j=" << j <<
" i2=" << i2
336 <<
" Z=" << Z <<
" A=" <<
A <<
G4endl;
344 if (count2 < countmax) {
345 G4cout <<
"### G4LevelReader: broken transition " << j
346 <<
" from level " << i <<
" to " << i2
347 <<
" for isotope Z= " << Z <<
" A= "
348 <<
A <<
"; the transition probability set to zero" <<
G4endl;
354 vTrans[j] = i2*10000 + tnum;
355 fAlpha = std::min(std::max(fAlpha,0.f), fAlphaMax);
358 vGammaCumProbability[j] = fNorm1;
359 vGammaProbability[j] = 1.0f/x;
360 vShellProbability[j] =
nullptr;
363 G4cout <<
"### Transition #" << j <<
" to level " << i2
364 <<
" i2= " << i2 <<
" Etrans(MeV)= " << fTransEnergy*CLHEP::keV
365 <<
" fProb= " << fProb <<
" MultiP= " << tnum
366 <<
" fMpRatio= " << fRatio <<
" fAlpha= " << fAlpha
371 for (k=0; k<10; ++k) {
372 if (!ReadDataItem(infile,fICC[k])) {
376 if (count2 < countmax) {
377 G4cout <<
"### G4LevelReader: fail to read conversion coeff k= " << k
378 <<
" for transition j= " << j
379 <<
" Z= " << Z <<
" A= " <<
A <<
G4endl;
382 for(kk=k; kk<10; ++kk) { fICC[kk] = 0.f; }
386 vShellProbability[j] = NormalizedICCProbability(Z);
391 G4int nt = ntrans - 1;
393 G4cout <<
"=== New G4NucLevel: Ntrans=" << ntrans
394 <<
" Time(ns)=" << fTime
395 <<
" IdxTrans=" << vTrans[nt]/10000
396 <<
" isOK=" << isTransOK
399 fNorm1 = (
FLT_MIN < fNorm1) ? 1.0f/fNorm1 : 0.0f;
400 for (k=0; k<nt; ++k) {
401 vGammaCumProbability[k] *= fNorm1;
404 G4cout <<
"Probabilities[" << k
405 <<
"]= " << vGammaCumProbability[k]
406 <<
" " << vGammaProbability[k]
407 <<
" idxTrans= " << vTrans[k]/10000
412 vGammaCumProbability[nt] = 1.0f;
413 vLevel[i] =
new G4NucLevel((std::size_t)ntrans, fTime, vTrans,
414 vGammaCumProbability,
421 if (i == fLevelMax) {
423 vEnergy.resize(fLevelMax, 0.0);
424 vSpin.resize(fLevelMax, 0);
425 vLevel.resize(fLevelMax,
nullptr);
428 G4LevelManager* lman =
nullptr;
430 lman =
new G4LevelManager(Z,
A, (std::size_t)i, vEnergy, vSpin, vLevel);
432 G4cout <<
"=== Reader: new manager for Z=" << Z <<
" A=" <<
A
433 <<
" Nlevels=" << i <<
" E[0]="
434 << vEnergy[0]/CLHEP::MeV <<
" MeV E1="
435 << vEnergy[i-1]/CLHEP::MeV <<
" MeV"
436 <<
" count1,2=" << count1 <<
", " << count2 <<
G4endl;
const char * G4FindDataDir(const char *)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4GLOB_DLL std::ostream G4cout
G4bool StoreICLevelData() const
const G4LevelManager * MakeLevelManager(G4int Z, G4int A, const G4String &filename)
const G4LevelManager * CreateLevelManager(G4int Z, G4int A)
G4LevelReader(G4NuclearLevelData *)
G4DeexPrecoParameters * GetParameters()
static G4Pow * GetInstance()
G4double logZ(G4int Z) const