Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PhotonEvaporation Class Reference

#include <G4PhotonEvaporation.hh>

+ Inheritance diagram for G4PhotonEvaporation:

Public Member Functions

 G4PhotonEvaporation (G4GammaTransition *ptr=nullptr)
 
 ~G4PhotonEvaporation () override
 
void Initialise () override
 
G4FragmentEmittedFragment (G4Fragment *theNucleus) override
 
G4bool BreakUpChain (G4FragmentVector *theResult, G4Fragment *theNucleus) override
 
G4FragmentVectorBreakItUp (const G4Fragment &theNucleus)
 
G4double GetEmissionProbability (G4Fragment *theNucleus) override
 
G4double ComputeInverseXSection (G4Fragment *theNucleus, G4double kinEnergy) override
 
G4double ComputeProbability (G4Fragment *theNucleus, G4double kinEnergy) override
 
G4double GetFinalLevelEnergy (G4int Z, G4int A, G4double energy)
 
G4double GetUpperLevelEnergy (G4int Z, G4int A)
 
void SetGammaTransition (G4GammaTransition *)
 
void SetICM (G4bool) override
 
void RDMForced (G4bool) override
 
void SetVerboseLevel (G4int verbose)
 
G4int GetVacantShellNumber () const
 
 G4PhotonEvaporation (const G4PhotonEvaporation &right)=delete
 
const G4PhotonEvaporationoperator= (const G4PhotonEvaporation &right)=delete
 
- Public Member Functions inherited from G4VEvaporationChannel
 G4VEvaporationChannel (const G4String &aName="")
 
virtual ~G4VEvaporationChannel ()=default
 
virtual G4double GetLifeTime (G4Fragment *theNucleus)
 
G4FragmentVectorBreakUpFragment (G4Fragment *theNucleus)
 
virtual void Dump () const
 
void SetOPTxs (G4int)
 
void UseSICB (G4bool)
 
 G4VEvaporationChannel (const G4VEvaporationChannel &right)=delete
 
const G4VEvaporationChanneloperator= (const G4VEvaporationChannel &right)=delete
 
G4bool operator== (const G4VEvaporationChannel &right) const =delete
 
G4bool operator!= (const G4VEvaporationChannel &right) const =delete
 

Additional Inherited Members

- Protected Attributes inherited from G4VEvaporationChannel
G4int OPTxs {3}
 
G4bool useSICB {true}
 

Detailed Description

Definition at line 55 of file G4PhotonEvaporation.hh.

Constructor & Destructor Documentation

◆ G4PhotonEvaporation() [1/2]

G4PhotonEvaporation::G4PhotonEvaporation ( G4GammaTransition * ptr = nullptr)
explicit

Definition at line 63 of file G4PhotonEvaporation.cc.

64 : fTransition(p), fPolarization(nullptr), fVerbose(1)
65{
66 if (fVerbose > 1) {
67 G4cout << "### New G4PhotonEvaporation() " << this << G4endl;
68 }
69 fNuclearLevelData = G4NuclearLevelData::GetInstance();
70 fTolerance = 20*CLHEP::eV;
71
72 if(nullptr == fTransition) { fTransition = new G4GammaTransition(); }
73
74 fSecID = G4PhysicsModelCatalog::GetModelID("model_G4PhotonEvaporation");
75
76 if(0.0f == GREnergy[2]) { InitialiseGRData(); }
77}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4NuclearLevelData * GetInstance()
static G4int GetModelID(const G4int modelIndex)

◆ ~G4PhotonEvaporation()

G4PhotonEvaporation::~G4PhotonEvaporation ( )
override

Definition at line 79 of file G4PhotonEvaporation.cc.

80{
81 delete fTransition;
82}

◆ G4PhotonEvaporation() [2/2]

G4PhotonEvaporation::G4PhotonEvaporation ( const G4PhotonEvaporation & right)
delete

Member Function Documentation

◆ BreakItUp()

G4FragmentVector * G4PhotonEvaporation::BreakItUp ( const G4Fragment & theNucleus)

Definition at line 170 of file G4PhotonEvaporation.cc.

171{
172 if(fVerbose > 1) {
173 G4cout << "G4PhotonEvaporation::BreakItUp" << G4endl;
174 }
175 G4Fragment* aNucleus = new G4Fragment(nucleus);
176 G4FragmentVector* products = new G4FragmentVector();
177 BreakUpChain(products, aNucleus);
178 aNucleus->SetCreatorModelID(fSecID);
179 products->push_back(aNucleus);
180 return products;
181}
std::vector< G4Fragment * > G4FragmentVector
Definition G4Fragment.hh:65
void SetCreatorModelID(G4int value)
G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus) override

Referenced by G4LENDCapture::ApplyYourself(), and G4NeutronHPCaptureFS::ApplyYourself().

◆ BreakUpChain()

G4bool G4PhotonEvaporation::BreakUpChain ( G4FragmentVector * theResult,
G4Fragment * theNucleus )
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 183 of file G4PhotonEvaporation.cc.

185{
186 if(!isInitialised) { Initialise(); }
187 if(fVerbose > 1) {
188 G4cout << "G4PhotonEvaporation::BreakUpChain RDM= " << fRDM << " "
189 << *nucleus << G4endl;
190 }
191 G4Fragment* gamma = nullptr;
192 fSampleTime = !fRDM;
193
194 // start decay chain from unpolarized state
195 if(fCorrelatedGamma) {
196 fPolarization = new G4NuclearPolarization(nucleus->GetZ_asInt(),
197 nucleus->GetA_asInt(),
198 nucleus->GetExcitationEnergy());
199 nucleus->SetNuclearPolarization(fPolarization);
200 }
201
202 do {
203 gamma = GenerateGamma(nucleus);
204 if(gamma) {
205 gamma->SetCreatorModelID(fSecID);
206 products->push_back(gamma);
207 if(fVerbose > 2) {
208 G4cout << "G4PhotonEvaporation::BreakUpChain: "
209 << *gamma << G4endl;
210 G4cout << " Residual: " << *nucleus << G4endl;
211 }
212 // for next decays in the chain always sample time
213 fSampleTime = true;
214 }
215 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
216 } while(gamma);
217
218 // clear nuclear polarization end of chain
219 if(nullptr != fPolarization) {
220 delete fPolarization;
221 fPolarization = nullptr;
222 nucleus->SetNuclearPolarization(fPolarization);
223 }
224 return false;
225}

Referenced by BreakItUp().

◆ ComputeInverseXSection()

G4double G4PhotonEvaporation::ComputeInverseXSection ( G4Fragment * theNucleus,
G4double kinEnergy )
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 313 of file G4PhotonEvaporation.cc.

314{
315 return 0.0;
316}

◆ ComputeProbability()

G4double G4PhotonEvaporation::ComputeProbability ( G4Fragment * theNucleus,
G4double kinEnergy )
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 319 of file G4PhotonEvaporation.cc.

320{
321 return GetEmissionProbability(theNucleus);
322}
G4double GetEmissionProbability(G4Fragment *theNucleus) override

◆ EmittedFragment()

G4Fragment * G4PhotonEvaporation::EmittedFragment ( G4Fragment * theNucleus)
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 119 of file G4PhotonEvaporation.cc.

120{
121 if(!isInitialised) { Initialise(); }
122 fSampleTime = !fRDM;
123
124 // potentially external code may set initial polarization
125 // but only for radioactive decay nuclear polarization is considered
126 G4NuclearPolarizationStore* fNucPStore = nullptr;
127 if(fCorrelatedGamma && fRDM) {
129 auto nucp = nucleus->GetNuclearPolarization();
130 if(nullptr != nucp) {
131 fNucPStore->RemoveMe(nucp);
132 }
133 fPolarization = fNucPStore->FindOrBuild(nucleus->GetZ_asInt(),
134 nucleus->GetA_asInt(),
135 nucleus->GetExcitationEnergy());
136 nucleus->SetNuclearPolarization(fPolarization);
137 }
138 if(fVerbose > 2) {
139 G4cout << "G4PhotonEvaporation::EmittedFragment: "
140 << *nucleus << G4endl;
141 if(fPolarization) { G4cout << "NucPolar: " << fPolarization << G4endl; }
142 G4cout << " CorrGamma: " << fCorrelatedGamma << " RDM: " << fRDM
143 << " fPolarization: " << fPolarization << G4endl;
144 }
145 G4Fragment* gamma = GenerateGamma(nucleus);
146
147 if(gamma != nullptr) { gamma->SetCreatorModelID(fSecID); }
148
149 // remove G4NuclearPolarizaton when reach ground state
150 if(fNucPStore && fPolarization && 0 == fIndex) {
151 if(fVerbose > 3) {
152 G4cout << "G4PhotonEvaporation::EmittedFragment: remove "
153 << fPolarization << G4endl;
154 }
155 fNucPStore->RemoveMe(fPolarization);
156 fPolarization = nullptr;
157 nucleus->SetNuclearPolarization(fPolarization);
158 }
159
160 if(fVerbose > 2) {
161 G4cout << "G4PhotonEvaporation::EmittedFragment: RDM= "
162 << fRDM << " done:" << G4endl;
163 if(gamma) { G4cout << *gamma << G4endl; }
164 G4cout << " Residual: " << *nucleus << G4endl;
165 }
166 return gamma;
167}
static G4NuclearPolarizationStore * GetInstance()
void RemoveMe(G4NuclearPolarization *ptr)
G4NuclearPolarization * FindOrBuild(G4int Z, G4int A, G4double Eexc)

Referenced by G4ITDecay::DecayIt().

◆ GetEmissionProbability()

G4double G4PhotonEvaporation::GetEmissionProbability ( G4Fragment * theNucleus)
overridevirtual

Implements G4VEvaporationChannel.

Definition at line 228 of file G4PhotonEvaporation.cc.

229{
230 if(!isInitialised) { Initialise(); }
231 fProbability = 0.0;
232 fExcEnergy = nucleus->GetExcitationEnergy();
233 G4int Z = nucleus->GetZ_asInt();
234 G4int A = nucleus->GetA_asInt();
235 fCode = 1000*Z + A;
236 if(fVerbose > 2) {
237 G4cout << "G4PhotonEvaporation::GetEmissionProbability: Z="
238 << Z << " A=" << A << " Eexc(MeV)= " << fExcEnergy << G4endl;
239 }
240 // ignore gamma de-excitation for exotic fragments
241 // and for very low excitations
242 if(0 >= Z || 1 >= A || Z == A || fTolerance >= fExcEnergy)
243 { return fProbability; }
244
245 // ignore gamma de-excitation for highly excited levels
246 if(A >= MAXGRDATA) { A = MAXGRDATA-1; }
247 //G4cout<<" GREnergy= "<< GREnergy[A]<<" GRWidth= "<<GRWidth[A]<<G4endl;
248
249 static const G4float GREfactor = 5.0f;
250 if(fExcEnergy >= (G4double)(GREfactor*GRWidth[A] + GREnergy[A])) {
251 return fProbability;
252 }
253 // probability computed assuming continium transitions
254 // VI: continium transition are limited only to final states
255 // below Fermi energy (this approach needs further evaluation)
256 G4double emax = std::max(0.0, nucleus->ComputeGroundStateMass(Z, A-1)
257 + CLHEP::neutron_mass_c2 - nucleus->GetGroundStateMass());
258
259 // max energy level for continues transition
260 emax = std::min(emax, fExcEnergy);
261 const G4double eexcfac = 0.99;
262 if(0.0 == emax || fExcEnergy*eexcfac <= emax) { emax = fExcEnergy*eexcfac; }
263
264 fStep = emax;
265 const G4double MaxDeltaEnergy = CLHEP::MeV;
266 fPoints = std::min((G4int)(fStep/MaxDeltaEnergy) + 2, MAXDEPOINT);
267 fStep /= ((G4double)(fPoints - 1));
268 if(fVerbose > 2) {
269 G4cout << "Emax= " << emax << " Npoints= " << fPoints
270 << " Eex= " << fExcEnergy << G4endl;
271 }
272 // integrate probabilities
273 G4double eres = (G4double)GREnergy[A];
274 G4double wres = (G4double)GRWidth[A];
275 G4double eres2= eres*eres;
276 G4double wres2= wres*wres;
277 G4double levelDensity = fNuclearLevelData->GetLevelDensity(Z,A,fExcEnergy);
278 G4double xsqr = std::sqrt(levelDensity*fExcEnergy);
279
280 G4double egam = fExcEnergy;
281 G4double gammaE2 = egam*egam;
282 G4double gammaR2 = gammaE2*wres2;
283 G4double egdp2 = gammaE2 - eres2;
284
285 G4double p0 = G4Exp(-2.0*xsqr)*gammaR2*gammaE2/(egdp2*egdp2 + gammaR2);
286 G4double p1(0.0);
287
288 for(G4int i=1; i<fPoints; ++i) {
289 egam -= fStep;
290 gammaE2 = egam*egam;
291 gammaR2 = gammaE2*wres2;
292 egdp2 = gammaE2 - eres2;
293 p1 = G4Exp(2.0*(std::sqrt(levelDensity*std::abs(fExcEnergy - egam)) - xsqr))
294 *gammaR2*gammaE2/(egdp2*egdp2 + gammaR2);
295 fProbability += (p1 + p0);
296 fCummProbability[i] = fProbability;
297 if(fVerbose > 3) {
298 G4cout << "Egamma= " << egam << " Eex= " << fExcEnergy
299 << " p0= " << p0 << " p1= " << p1 << " sum= "
300 << fCummProbability[i] <<G4endl;
301 }
302 p0 = p1;
303 }
304
305 static const G4double NormC = 1.25*CLHEP::millibarn
306 /(CLHEP::pi2*CLHEP::hbarc*CLHEP::hbarc);
307 fProbability *= fStep*NormC*A;
308 if(fVerbose > 1) { G4cout << "prob= " << fProbability << G4endl; }
309 return fProbability;
310}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
float G4float
Definition G4Types.hh:84
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4double A[17]
G4double GetLevelDensity(G4int Z, G4int A, G4double U)

Referenced by ComputeProbability().

◆ GetFinalLevelEnergy()

G4double G4PhotonEvaporation::GetFinalLevelEnergy ( G4int Z,
G4int A,
G4double energy )

Definition at line 325 of file G4PhotonEvaporation.cc.

326{
327 G4double E = energy;
328 InitialiseLevelManager(Z, A);
329 if(fLevelManager) {
330 E = fLevelManager->NearestLevelEnergy(energy, fIndex);
331 if(E > fLevelEnergyMax + fTolerance) { E = energy; }
332 }
333 return E;
334}
G4double NearestLevelEnergy(const G4double energy, const std::size_t index=0) const
G4double energy(const ThreeVector &p, const G4double m)

◆ GetUpperLevelEnergy()

G4double G4PhotonEvaporation::GetUpperLevelEnergy ( G4int Z,
G4int A )

Definition at line 336 of file G4PhotonEvaporation.cc.

337{
338 InitialiseLevelManager(Z, A);
339 return fLevelEnergyMax;
340}

◆ GetVacantShellNumber()

G4int G4PhotonEvaporation::GetVacantShellNumber ( ) const
inline

Definition at line 168 of file G4PhotonEvaporation.hh.

169{
170 return vShellNumber;
171}

Referenced by G4ITDecay::DecayIt().

◆ Initialise()

void G4PhotonEvaporation::Initialise ( )
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 84 of file G4PhotonEvaporation.cc.

85{
86 if (isInitialised) { return; }
87 isInitialised = true;
88
89 G4DeexPrecoParameters* param = fNuclearLevelData->GetParameters();
90 fTolerance = param->GetMinExcitation();
91 fMaxLifeTime = param->GetMaxLifeTime();
92 fCorrelatedGamma = param->CorrelatedGamma();
93 fICM = param->GetInternalConversionFlag();
94 fVerbose = param->GetVerbose();
95
96 fTransition->SetPolarizationFlag(fCorrelatedGamma);
97 fTransition->SetTwoJMAX(param->GetTwoJMAX());
98 fTransition->SetVerbose(fVerbose);
99 if (fVerbose > 1) {
100 G4cout << "### G4PhotonEvaporation is initialized " << this << G4endl;
101 }
102}
G4bool GetInternalConversionFlag() const
void SetPolarizationFlag(G4bool val)
void SetTwoJMAX(G4int val)
void SetVerbose(G4int val)
G4DeexPrecoParameters * GetParameters()

Referenced by BreakUpChain(), G4RadioactiveDecay::BuildPhysicsTable(), EmittedFragment(), and GetEmissionProbability().

◆ operator=()

const G4PhotonEvaporation & G4PhotonEvaporation::operator= ( const G4PhotonEvaporation & right)
delete

◆ RDMForced()

void G4PhotonEvaporation::RDMForced ( G4bool val)
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 582 of file G4PhotonEvaporation.cc.

583{
584 fRDM = val;
585}

Referenced by G4RadioactiveDecay::BuildPhysicsTable(), and G4RadioactiveDecay::G4RadioactiveDecay().

◆ SetGammaTransition()

void G4PhotonEvaporation::SetGammaTransition ( G4GammaTransition * p)

Definition at line 569 of file G4PhotonEvaporation.cc.

570{
571 if(p != fTransition) {
572 delete fTransition;
573 fTransition = p;
574 }
575}

◆ SetICM()

void G4PhotonEvaporation::SetICM ( G4bool val)
overridevirtual

◆ SetVerboseLevel()

void G4PhotonEvaporation::SetVerboseLevel ( G4int verbose)
inline

Definition at line 151 of file G4PhotonEvaporation.hh.

152{
153 fVerbose = verbose;
154}

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