ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4LevelManager.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4LevelManager.cc
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"
45 #include "G4HadronicException.hh"
46 #include "G4Pow.hh"
47 #include <iomanip>
48 
50  "-", "+X", "+Y", "+Z", "+U", "+V", "+W", "+R", "+S", "+T", "+A", "+B", "+C"};
51 
53  const std::vector<G4double>& energies,
54  const std::vector<G4int>& spin,
55  const std::vector<const G4NucLevel*>& levels)
56  : nTransitions(0)
57 {
58  if(0 < ntrans) {
59  nTransitions = ntrans - 1;
60  fLevelEnergy.reserve(ntrans);
61  fSpin.reserve(ntrans);
62  fLevels.reserve(ntrans);
63  for(size_t i=0; i<ntrans; ++i) {
64  fLevelEnergy.push_back(energies[i]);
65  fSpin.push_back(spin[i]);
66  fLevels.push_back(levels[i]);
67  }
68  //G4cout << "New G4LevelManager N= " << nTransitions << " "
69  //<< fLevelEnergy.size() << " <" << this << ">" << G4endl;
70  }
71  // J. Nucl. Sci. Tech. 31(2): 151-162 (1994)
73  GetShellCorrection()->GetShellCorrection(A,Z);
74  G4int N = A - Z;
75  G4int In = N - (N/2)*2;
76  G4int Iz = Z - (Z/2)*2;
77  G4double a13 = 1.0/G4Pow::GetInstance()->Z13(A);
78  if(In == 0 && Iz == 0) {
79  fLevelDensity = 0.067946*A*(1.0 + 4.1277*a13);
80  } else if(In == 0 && Iz == 1) {
81  fLevelDensity = 0.053061*A*(1.0 + 7.1862*a13);
82  } else if(In == 1 && Iz == 0) {
83  fLevelDensity = 0.060920*A*(1.0 + 3.8767*a13);
84  } else {
85  fLevelDensity = 0.065291*A*(1.0 + 4.4505*a13);
86  }
87 }
88 
90 {
91  for(size_t i=0; i<=nTransitions; ++i) { delete fLevels[i]; }
92 }
93 
94 size_t
96 {
97  //G4cout<< "index= " << index << " max= " << nTransitions << " exc= " << ener
98  // << " Emax= " << fLevelEnergy[nTransitions] << G4endl;
99  size_t idx = std::min(index, nTransitions);
100  static const G4double tolerance = 1.0f-6;
101  if(0 == nTransitions || std::abs(energy - fLevelEnergy[idx]) <= tolerance) {
102  return idx;
103  }
104  // ground state
105  if(energy <= fLevelEnergy[1]*0.5)
106  { idx = 0; }
107  // take top level
108  else if((fLevelEnergy[nTransitions] + fLevelEnergy[nTransitions-1])*0.5 <= energy)
109  { idx = nTransitions; }
110 
111  // if shortcuts are not working, make binary search
112  else {
113  idx = std::lower_bound(fLevelEnergy.begin(), fLevelEnergy.end(), energy)
114  - fLevelEnergy.begin() - 1;
115  if(energy - fLevelEnergy[idx] > fLevelEnergy[idx+1] - energy) { ++idx; }
116  //G4cout << "E= " << energy << " " << fLevelEnergy[idx-1]
117  //<< " " << fLevelEnergy[idx] << G4endl;
118  }
119  return idx;
120 }
121 
123 {
124 #ifdef G4VERBOSE
125  if(i > nTransitions) { PrintError(i, "FloatingType(idx)"); }
126 #endif
127  return fFloatingLevels[fSpin[i]/100000];
128 }
129 
130 #ifdef G4VERBOSE
131 void G4LevelManager::PrintError(size_t idx, const G4String& ss) const
132 {
133  G4String sss = "G4LevelManager::"+ss+"()";
135  ed << "Index of a level " << idx << " >= "
136  << nTransitions+1 << " (Nlevels) ";
137  G4Exception(sss,"had061",JustWarning,ed,"");
138 }
139 #endif
140 
141 void G4LevelManager::StreamInfo(std::ostream& out) const
142 {
143  for(size_t i=0; i<=nTransitions; ++i) {
144  G4int prec = out.precision(6);
145  out << std::setw(6) << i << ". "
146  << std::setw(8) << fLevelEnergy[i];
147  if(fLevels[i]) {
148  out << std::setw(8) << fLevels[i]->GetTimeGamma()
149  << std::setw(4) << fLevels[i]->NumberOfTransitions()
150  << std::setw(4) << SpinTwo(i)
151  << std::setw(4) << Parity(i)
152  << std::setw(4) << FloatingLevel(i);
153  }
154  out << "\n";
155  out.precision(prec);
156  if(fLevels[i]) { fLevels[i]->StreamInfo(out); }
157  }
158 }