18#include "BDSElectronOccupancy.hh"
19#include "BDSElectronQuantumLevel.hh"
20#include "BDSUtilities.hh"
28BDSElectronOccupancy::BDSElectronOccupancy(G4int maxn):
31 G4double spinUp = 0.5;
32 G4double spinDown = -0.5;
33 for (G4int i = 1; i <= maxn; i++)
35 for (G4int j = 0; j < i; j++)
37 G4double jSpinOrbit1 = std::abs(j+spinUp);
38 G4double jSpinOrbit2 = std::abs(j+spinDown);
39 if (jSpinOrbit1 == jSpinOrbit2)
48 std::sort(stateList.begin(),stateList.end(),CompareEnergy);
51BDSElectronOccupancy::~BDSElectronOccupancy()
53 for (
auto* eql : stateList)
58void BDSElectronOccupancy::CreateNewLevel(G4int n, G4int l, G4int j)
65 return (level1->GetLevelEnergy() > level2->GetLevelEnergy());
68void BDSElectronOccupancy::PopulateLevels()
70 AddElectrons(totalElectrons);
73void BDSElectronOccupancy::AddElectrons(G4int number)
75 G4int currentElectrons = number;
76 for (
auto* eql : stateList)
78 if (currentElectrons > 0)
80 G4int max = eql->GetMaxOccupancy();
81 G4int current = eql->GetCurrentOccupancy();
84 if ((max - current) < currentElectrons)
86 eql->AddElectrons(max - current);
87 currentElectrons = currentElectrons - (max - current);
91 eql->AddElectrons(currentElectrons);
99void BDSElectronOccupancy::AddElectrons(G4int n, G4int l, G4double j, G4int number)
101 G4int currentNumber = number;
102 for (
auto* eql : stateList)
104 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
106 if (currentNumber > 0)
108 G4int currentAvailable = eql->GetMaxOccupancy() - eql->GetCurrentOccupancy();
109 if (currentAvailable > currentNumber)
111 eql->AddElectrons(currentNumber);
120void BDSElectronOccupancy::RemoveElectrons(G4int n, G4int l, G4double j, G4int number)
122 G4int currentNumber = number;
123 for (
auto* eql : stateList)
125 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
129 if (eql->GetCurrentOccupancy() > 0)
131 eql->RemoveElectrons(number);
132 currentNumber=currentNumber-number;
139void BDSElectronOccupancy::SetStateLifetime(G4int n, G4int l, G4double lifetime)
141 for (
auto* eql : stateList)
143 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l)
145 if (eql->GetCurrentOccupancy() > 0)
146 {eql->SetExcitedLifetime(lifetime);}
151void BDSElectronOccupancy::SetTimeOfExciation(G4double timeOfExcitationIn, G4int n, G4int l, G4double j)
153 for (
auto* eql : stateList)
155 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
156 {eql->SetTimeOfExcitement(timeOfExcitationIn);}
160G4bool BDSElectronOccupancy::StatePopulated(G4int n, G4int l, G4double j)
const
162 for (
const auto* eql : stateList)
164 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
166 if (eql->GetCurrentOccupancy() > 0)
174G4double BDSElectronOccupancy::GetStateLifetime(G4int n, G4int l, G4double j)
const
176 for (
const auto* eql : stateList)
178 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
179 {
return eql->GetExcitedLifetime();}
184G4double BDSElectronOccupancy::GetTimeOfExcitation(G4int n, G4int l, G4double j)
const
186 for (
const auto* eql : stateList)
188 if (eql->GetnPrincipleNumnber() == n && eql->GetlAngularNumber() == l && eql->GetjSpinOrbitCoupling() == j)
189 {
return eql->GetTimeOfExcitement();}
Electron Quantum levels for more than just n quantum number.