Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4LevelManager.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//
27// -------------------------------------------------------------------
28//
29// GEANT4 source file
30//
31// File name: G4LevelManager
32//
33// Author: V.Ivanchenko
34//
35// Creation date: 4 January 2012
36//
37// Modifications:
38// 13.02.2015 Design change for gamma de-excitation
39//
40// -------------------------------------------------------------------
41
42#include "G4LevelManager.hh"
43#include "G4NuclearLevelData.hh"
44#include "G4ShellCorrection.hh"
46#include "G4Pow.hh"
47#include <iomanip>
49
50G4String G4LevelManager::fFloatingLevels[] = {
51 "-", "+X", "+Y", "+Z", "+U", "+V", "+W", "+R", "+S", "+T", "+A", "+B", "+C"};
52
54 const std::vector<G4double>& energies,
55 const std::vector<G4int>& spin,
56 const std::vector<const G4NucLevel*>& levels)
57 : nTransitions(0)
58{
59 if(0 < ntrans) {
60 nTransitions = ntrans - 1;
61 fLevelEnergy.reserve(ntrans);
62 fSpin.reserve(ntrans);
63 fLevels.reserve(ntrans);
64 for(std::size_t i=0; i<ntrans; ++i) {
65 fLevelEnergy.push_back(energies[i]);
66 fSpin.push_back(spin[i]);
67 fLevels.push_back(levels[i]);
68 }
69 //G4cout << "New G4LevelManager N= " << nTransitions << " "
70 //<< fLevelEnergy.size() << " <" << this << ">" << G4endl;
71 }
73 fLevelDensity = ndata->GetLevelDensity(Z, A, 0.0);
74
75 // J. Nucl. Sci. Tech. 31(2): 151-162 (1994)
76 fShellCorrection = ndata->GetShellCorrection()->GetShellCorrection(A,Z);
77 if(A > 20) {
78 G4int N = A - Z;
79 G4int In = N - (N/2)*2;
80 G4int Iz = Z - (Z/2)*2;
81 G4double a13 = 1.0/G4Pow::GetInstance()->Z13(A);
82 if(In == 0 && Iz == 0) {
83 fLevelDensity = 0.067946*A*(1.0 + 4.1277*a13);
84 } else if(In == 0 && Iz == 1) {
85 fLevelDensity = 0.053061*A*(1.0 + 7.1862*a13);
86 } else if(In == 1 && Iz == 0) {
87 fLevelDensity = 0.060920*A*(1.0 + 3.8767*a13);
88 } else {
89 fLevelDensity = 0.065291*A*(1.0 + 4.4505*a13);
90 }
91 }
92}
93
95{
96 for(std::size_t i=0; i<=nTransitions; ++i) { delete fLevels[i]; }
97}
98
100 const std::size_t index) const
101{
102 std::size_t idx = std::min(index, nTransitions);
103 static const G4double tolerance = 10*CLHEP::eV;
104 if(0 == nTransitions || std::abs(energy - fLevelEnergy[idx]) <= tolerance) {
105 return idx;
106 }
107 idx = NearestLowEdgeLevelIndex(energy);
108 if(idx < nTransitions &&
109 (fLevelEnergy[idx] + fLevelEnergy[idx+1])*0.5 <= energy) { ++idx; }
110
111 return idx;
112}
113
114const G4String& G4LevelManager::FloatingType(const std::size_t i) const
115{
116 return fFloatingLevels[fSpin[i]/100000];
117}
118
119void G4LevelManager::StreamInfo(std::ostream& out) const
120{
121 for(std::size_t i=0; i<=nTransitions; ++i) {
122 G4long prec = out.precision(6);
123 out << std::setw(6) << i << ". "
124 << std::setw(8) << fLevelEnergy[i];
125 if(fLevels[i]) {
126 out << std::setw(8) << fLevels[i]->GetTimeGamma()
127 << std::setw(4) << fLevels[i]->NumberOfTransitions()
128 << std::setw(4) << SpinTwo(i)
129 << std::setw(4) << Parity(i)
130 << std::setw(4) << FloatingLevel(i);
131 }
132 out << "\n";
133 out.precision(prec);
134 if(fLevels[i]) { fLevels[i]->StreamInfo(out); }
135 }
136}
double G4double
Definition: G4Types.hh:83
long G4long
Definition: G4Types.hh:87
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
void StreamInfo(std::ostream &os) const
std::size_t NearestLevelIndex(const G4double energy, const std::size_t index=0) const
G4int FloatingLevel(const std::size_t i) const
G4int SpinTwo(const std::size_t i) const
const G4String & FloatingType(const std::size_t i) const
G4LevelManager(G4int Z, G4int A, std::size_t nlev, const std::vector< G4double > &energies, const std::vector< G4int > &spin, const std::vector< const G4NucLevel * > &levels)
std::size_t NearestLowEdgeLevelIndex(const G4double energy) const
G4int Parity(const std::size_t i) const
static G4NuclearLevelData * GetInstance()
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123
#define N
Definition: crc32.c:56