Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PhotonEvaporation.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// GEANT4 class file
29//
30// CERN, Geneva, Switzerland
31//
32// File name: G4PhotonEvaporation
33//
34// Author: Vladimir Ivantchenko
35//
36// Creation date: 20 December 2011
37//
38// -------------------------------------------------------------------
39//
40
42
44#include "Randomize.hh"
45#include "G4Gamma.hh"
46#include "G4LorentzVector.hh"
47#include "G4FragmentVector.hh"
48#include "G4GammaTransition.hh"
49#include "G4Pow.hh"
50#include "G4SystemOfUnits.hh"
53
54G4float G4PhotonEvaporation::GREnergy[] = {0.0f};
55G4float G4PhotonEvaporation::GRWidth[] = {0.0f};
56
57namespace
58{
59 constexpr G4double timeLimit = 10*CLHEP::ns;
60 constexpr G4double eLimit = 200*CLHEP::keV;
61}
62
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 fCummProbability[0] = 0.0;
72 if(nullptr == fTransition) { fTransition = new G4GammaTransition(); }
73
74 fSecID = G4PhysicsModelCatalog::GetModelID("model_G4PhotonEvaporation");
75
76 if(0.0f == GREnergy[2]) { InitialiseGRData(); }
77}
78
80{
81 delete fTransition;
82}
83
85{
86 if (isInitialised) { return; }
87 isInitialised = true;
88
89 G4DeexPrecoParameters* param = fNuclearLevelData->GetParameters();
90 fTolerance = param->GetMinExcitation();
91 fMaxLifeTime = param->GetMaxLifeTime();
92 fLocalTimeLimit = fRDM ? fMaxLifeTime : std::max(fMaxLifeTime, timeLimit);
93 fCorrelatedGamma = param->CorrelatedGamma();
94 fICM = param->GetInternalConversionFlag();
95 fVerbose = param->GetVerbose();
96
97 fTransition->SetPolarizationFlag(fCorrelatedGamma);
98 fTransition->SetTwoJMAX(param->GetTwoJMAX());
99 fTransition->SetVerbose(fVerbose);
100 if (fVerbose > 1) {
101 G4cout << "### G4PhotonEvaporation is initialized " << this << G4endl;
102 }
103}
104
105void G4PhotonEvaporation::InitialiseGRData()
106{
107 if(0.0f == GREnergy[2]) {
108 G4Pow* g4calc = G4Pow::GetInstance();
109 const G4float GRWfactor = 0.3f;
110 for (G4int A=1; A<MAXGRDATA; ++A) {
111 GREnergy[A] = (G4float)(40.3*CLHEP::MeV/g4calc->powZ(A,0.2));
112 GRWidth[A] = GRWfactor*GREnergy[A];
113 }
114 }
115}
116
119{
120 if(!isInitialised) { Initialise(); }
121 fSampleTime = !fRDM;
122 if (fRDM) {
123 nucleus->SetNumberOfElectrons(nucleus->GetZ_asInt());
124 }
125
126 // potentially external code may set initial polarization
127 // but only for radioactive decay nuclear polarization is considered
128 G4NuclearPolarizationStore* fNucPStore = nullptr;
129 if(fCorrelatedGamma && fRDM) {
131 auto nucp = nucleus->GetNuclearPolarization();
132 if(nullptr != nucp) {
133 fNucPStore->RemoveMe(nucp);
134 }
135 fPolarization = fNucPStore->FindOrBuild(nucleus->GetZ_asInt(),
136 nucleus->GetA_asInt(),
137 nucleus->GetExcitationEnergy());
138 nucleus->SetNuclearPolarization(fPolarization);
139 }
140 if(fVerbose > 2) {
141 G4cout << "G4PhotonEvaporation::EmittedFragment: "
142 << *nucleus << G4endl;
143 if (nullptr != fPolarization) { G4cout << "NucPolar: " << fPolarization << G4endl; }
144 G4cout << " CorrGamma: " << fCorrelatedGamma << " RDM: " << fRDM
145 << " fPolarization: " << fPolarization << G4endl;
146 }
147 G4Fragment* gamma = GenerateGamma(nucleus);
148
149 if(gamma != nullptr) { gamma->SetCreatorModelID(fSecID); }
150
151 // remove G4NuclearPolarizaton when reach ground state
152 if (nullptr != fNucPStore && nullptr != fPolarization && 0 == fIndex) {
153 if(fVerbose > 3) {
154 G4cout << "G4PhotonEvaporation::EmittedFragment: remove "
155 << fPolarization << G4endl;
156 }
157 fNucPStore->RemoveMe(fPolarization);
158 fPolarization = nullptr;
159 nucleus->SetNuclearPolarization(fPolarization);
160 }
161
162 if(fVerbose > 2) {
163 G4cout << "G4PhotonEvaporation::EmittedFragment: RDM= "
164 << fRDM << " done:" << G4endl;
165 if(gamma) { G4cout << *gamma << G4endl; }
166 G4cout << " Residual: " << *nucleus << G4endl;
167 }
168 return gamma;
169}
170
173{
174 if(fVerbose > 1) {
175 G4cout << "G4PhotonEvaporation::BreakItUp" << G4endl;
176 }
177 G4Fragment* aNucleus = new G4Fragment(nucleus);
178 G4FragmentVector* products = new G4FragmentVector();
179 BreakUpChain(products, aNucleus);
180 aNucleus->SetCreatorModelID(fSecID);
181 products->push_back(aNucleus);
182 return products;
183}
184
186 G4Fragment* nucleus)
187{
188 if(!isInitialised) { Initialise(); }
189 if(fVerbose > 1) {
190 G4cout << "G4PhotonEvaporation::BreakUpChain RDM= " << fRDM << " "
191 << *nucleus << G4endl;
192 }
193 G4Fragment* gamma = nullptr;
194 fSampleTime = !fRDM;
195
196 // start decay chain from unpolarized state
197 if(fCorrelatedGamma) {
198 fPolarization = new G4NuclearPolarization(nucleus->GetZ_asInt(),
199 nucleus->GetA_asInt(),
200 nucleus->GetExcitationEnergy());
201 nucleus->SetNuclearPolarization(fPolarization);
202 }
203
204 do {
205 gamma = GenerateGamma(nucleus);
206 if (nullptr != gamma) {
207 gamma->SetCreatorModelID(fSecID);
208 products->push_back(gamma);
209 }
210 // for next decays in the chain always sample time
211 fSampleTime = true;
212 if (fVerbose > 2) {
213 G4cout << "G4PhotonEvaporation::BreakUpChain: next decay" << G4endl;
214 if (nullptr != gamma) { G4cout << " " << *gamma << G4endl; }
215 else { G4cout << " not possible" << G4endl; }
216 G4cout << " Residual: " << *nucleus << G4endl;
217 }
218 // Loop checking, 22-Dec-2024, Vladimir Ivanchenko
219 } while (!(nucleus->IsLongLived() || nucleus->GetExcitationEnergy() <= fTolerance));
220
221 // clear nuclear polarization end of chain
222 if(nullptr != fPolarization) {
223 delete fPolarization;
224 fPolarization = nullptr;
225 nucleus->SetNuclearPolarization(fPolarization);
226 }
227 return false;
228}
229
232{
233 if(!isInitialised) { Initialise(); }
234 fProbability = 0.0;
235 fExcEnergy = nucleus->GetExcitationEnergy();
236 G4int Z = nucleus->GetZ_asInt();
237 G4int A = nucleus->GetA_asInt();
238 if(fVerbose > 2) {
239 G4cout << "G4PhotonEvaporation::GetEmissionProbability: Z="
240 << Z << " A=" << A << " Eexc(MeV)= " << fExcEnergy << G4endl;
241 }
242 // ignore gamma de-excitation for exotic fragments
243 // and for very low excitations
244 if(0 >= Z || 1 >= A || Z == A || fTolerance >= fExcEnergy)
245 { return fProbability; }
246
247 // ignore gamma de-excitation for highly excited levels
248 if(A >= MAXGRDATA) { A = MAXGRDATA-1; }
249
250 static const G4double GREfactor = 5.0;
251 G4double edelta = GREfactor*(G4double)GRWidth[A] + (G4double)GREnergy[A];
252 if (fVerbose > 2)
253 G4cout << " GREnergy=" << GREnergy[A] << " GRWidth="<<GRWidth[A]
254 << " Edelta=" << edelta <<G4endl;
255 if (fExcEnergy >= edelta) {
256 return fProbability;
257 }
258
259 // probability computed assuming continium transitions in the frame of the nucleus
260 fStep = fExcEnergy;
261 const G4double MaxDeltaEnergy = CLHEP::MeV;
262 fPoints = std::min((G4int)(fStep/MaxDeltaEnergy) + 2, MAXDEPOINT);
263 fStep /= ((G4double)(fPoints - 1));
264
265 if(fVerbose > 2) {
266 G4cout << " Npoints= " << fPoints
267 << " Eex=" << fExcEnergy << " Estep=" << fStep << G4endl;
268 }
269
270 // integrate probabilities
271 G4double eres = (G4double)GREnergy[A];
272 G4double wres = (G4double)GRWidth[A];
273 G4double eres2= eres*eres;
274 G4double wres2= wres*wres;
275
276 // initial state
277 G4double levelDensity = fNuclearLevelData->GetLevelDensity(Z,A,fExcEnergy);
278 G4double xdrt = G4Exp(2*std::sqrt(levelDensity*fExcEnergy));
279
280 // the loop over excitation energy of the residual nucleus
281 // from 0 to fExcEnergy
282 // gamma energy is defined via non-relativistic formula
283 G4double egam = fExcEnergy;
284 G4double gammaE2 = egam*egam;
285 G4double gammaR2 = gammaE2*wres2;
286 G4double egdp2 = gammaE2 - eres2;
287
288 G4double p0 = egam*gammaR2*gammaE2/(egdp2*egdp2 + gammaR2);
289 G4double p1, e;
290
291 for(G4int i=1; i<fPoints; ++i) {
292 egam -= fStep;
293 if (i + 1 == fPoints) {
294 p1 = 0.0;
295 } else {
296 gammaE2 = egam*egam;
297 gammaR2 = gammaE2*wres2;
298 egdp2 = gammaE2 - eres2;
299 e = fExcEnergy - egam;
300 levelDensity = fNuclearLevelData->GetLevelDensity(Z, A, e);
301 p1 = egam*G4Exp(2.0*(std::sqrt(levelDensity*e)))*gammaR2*gammaE2/(egdp2*egdp2 + gammaR2);
302 }
303 fProbability += (p1 + p0);
304 fCummProbability[i] = fProbability;
305 if(fVerbose > 3) {
306 G4cout << "Egamma= " << egam << " Eex= " << fExcEnergy
307 << " p0= " << p0 << " p1= " << p1 << " sum= "
308 << fCummProbability[i] <<G4endl;
309 }
310 p0 = p1;
311 }
312
313 static const G4double NormC = 1.25*CLHEP::millibarn
314 /(CLHEP::pi2*CLHEP::hbarc*CLHEP::hbarc);
315 fProbability *= fStep*NormC*A/xdrt;
316 if(fVerbose > 1) { G4cout << "prob= " << fProbability << G4endl; }
317 return fProbability;
318}
319
325
331
334{
335 G4double E = energy;
336 InitialiseLevelManager(Z, A);
337 if (nullptr != fLevelManager) {
338 E = fLevelManager->NearestLevelEnergy(energy, fIndex);
339 if(E > fLevelEnergyMax + fTolerance) { E = energy; }
340 }
341 return E;
342}
343
345{
346 InitialiseLevelManager(Z, A);
347 return fLevelEnergyMax;
348}
349
351G4PhotonEvaporation::GenerateGamma(G4Fragment* nucleus)
352{
353 if(!isInitialised) { Initialise(); }
354 G4Fragment* result = nullptr;
355
356 // initial level
357 G4double eexc = nucleus->GetExcitationEnergy();
358 InitialiseLevelManager(nucleus->GetZ_asInt(), nucleus->GetA_asInt());
359 // long life time flag - "true" for a fragment, which will be tracked
360 G4bool isLL = false;
361 // lifetime of the fragment
362 G4double ltime = 0.0;
363 fExcEnergy = eexc;
364 // index is unknown - default is the ground state
365 fIndex = 0;
366
367 G4double time = nucleus->GetCreationTime();
368 G4double elevel = eexc;
369 G4double efinal = 0.0;
370 G4double ratio = 0.0;
371 vShellNumber = -1;
372 G4int JP1 = 0;
373 G4int JP2 = 0;
374 G4int multiP = 0;
375 G4bool isGamma = true;
376 G4bool isDiscrete = false;
377 G4bool finalDiscrete = false;
378
379 const G4NucLevel* level = nullptr;
380 std::size_t ntrans = 0;
381
382 if(fVerbose > 2) {
383 G4cout << "## GenerateGamma: Z=" << theZ << " A=" << theA << " Eex= " << eexc
384 << " Eexmax= " << fLevelEnergyMax << G4endl;
385 }
386 // initial discrete state is ground level
387 if (eexc <= fTolerance) {
388 isDiscrete = true;
389
390 // initial state may be a discrete level
391 } else if (nullptr != fLevelManager && eexc <= fLevelEnergyMax + fTolerance) {
392 fIndex = fLevelManager->NearestLevelIndex(eexc);
393 elevel = fLevelManager->LevelEnergy(fIndex);
394 isDiscrete = (std::abs(elevel - eexc) < fTolerance);
395 if(fVerbose > 2) {
396 G4cout << " Level index=" << fIndex
397 << " lTime=" << fLevelManager->LifeTime(fIndex)
398 << " Elevel=" << elevel
399 << " isDiscrete:" << isDiscrete << G4endl;
400 }
401 if(isDiscrete && 0 < fIndex) {
402 // for discrete transition
403 level = fLevelManager->GetLevel(fIndex);
404 if(nullptr != level) {
405 ntrans = level->NumberOfTransitions();
406 G4int idxfl = fLevelManager->FloatingLevel(fIndex);
407 // for floating level check levels with the same energy
408 if (idxfl > 0) {
409 auto newlevel = fLevelManager->GetLevel(fIndex-1);
410 G4double newenergy = fLevelManager->LevelEnergy(fIndex-1);
411 if (nullptr != newlevel && std::abs(elevel - newenergy) < fTolerance) {
412 std::size_t newntrans = newlevel->NumberOfTransitions();
413 if (newntrans > 0) {
414 --fIndex;
415 level = newlevel;
416 elevel = newenergy;
417 ntrans = newntrans;
418 }
419 }
420 }
421 JP1 = std::abs(fLevelManager->TwoSpinParity(fIndex));
422 if(fVerbose > 2) {
423 G4cout << " ntrans= " << ntrans << " JP= " << JP1
424 << " RDM: " << fRDM << G4endl;
425 }
426 }
427 // if a level has no defined transitions
428 if (0 == ntrans) {
429 isDiscrete = false;
430 }
431 // transition from continues spectrum to the ground state
432 } else if (0 == fIndex) {
433 isDiscrete = true;
434 }
435 }
436
437 if(fVerbose > 2) {
438 G4long prec = G4cout.precision(4);
439 G4cout << " Z=" << nucleus->GetZ_asInt()
440 << " A=" << nucleus->GetA_asInt()
441 << " Exc=" << eexc << " Emax="
442 << fLevelEnergyMax << " idx=" << fIndex
443 << " fPoints= " << fPoints
444 << " Ntr=" << ntrans << " discrete:" << isDiscrete
445 << G4endl;
446 G4cout.precision(prec);
447 }
448
449 if(!isDiscrete) {
450 // primary fragment is in continium
451 GetEmissionProbability(nucleus);
452
453 if(fProbability == 0.0) {
454 fPoints = 1;
455 efinal = 0.0;
456 } else {
457 G4double y = fCummProbability[fPoints-1]*G4UniformRand();
458 for(G4int i=1; i<fPoints; ++i) {
459 if(fVerbose > 3) {
460 G4cout << "y= " << y << " cummProb= " << fCummProbability[i]
461 << " fPoints= " << fPoints << " fStep= " << fStep << G4endl;
462 }
463 if(y <= fCummProbability[i]) {
464 efinal = fStep*((i - 1) + (y - fCummProbability[i-1])
465 /(fCummProbability[i] - fCummProbability[i-1]));
466 break;
467 }
468 }
469 }
470 // final discrete level or continues exitation energy
471 if(fVerbose > 2) {
472 G4cout << "Continues proposes Efinal=" << efinal
473 << " Initial Idx=" << fIndex << G4endl;
474 }
475
476 if(nullptr != fLevelManager) {
477 // final discrete level
478 if (efinal < fLevelEnergyMax + fTolerance) {
479 fIndex = fLevelManager->NearestLevelIndex(efinal, fIndex);
480 G4double el = fLevelManager->LevelEnergy(fIndex);
481 // protection - take level below
482 if (el >= eexc + fTolerance && 0 < fIndex) {
483 --fIndex;
484 el = fLevelManager->LevelEnergy(fIndex);
485 }
486 // further decays will be discrete
487 ltime = fLevelManager->LifeTime(fIndex);
488 if (fIndex <= 1 || std::abs(efinal - el) <= eLimit || ltime >= fLocalTimeLimit) {
489 efinal = el;
490 finalDiscrete = true;
491 } else {
492 fIndex = 0;
493 }
494 }
495 }
496 if (fVerbose > 2) {
497 G4cout << "Continues emission efinal(MeV)= " << efinal
498 << " idxFinal=" << fIndex << " isdiscrete:" << isDiscrete << G4endl;
499 }
500
501 // initial continues and final ground state
502 } else if (0 == fIndex) {
503 efinal = 0.0;
504 isDiscrete = false;
505 if (nullptr != fLevelManager) { finalDiscrete = true; }
506
507 // discrete part for excited nucleus
508 } else {
509
510 if (fVerbose > 2) {
511 G4cout << "Discrete emission from level Index=" << fIndex
512 << " Elevel=" << fLevelManager->LevelEnergy(fIndex)
513 << " Ltime=" << fLevelManager->LifeTime(fIndex)
514 << " LtimeMax=" << fLocalTimeLimit
515 << " RDM=" << fRDM << " ICM=" << fICM << G4endl;
516 }
517
518 // stable fragment has life time DBL_MAX
519 ltime = fLevelManager->LifeTime(fIndex);
520
521 // stable isomer - no sampling of transition
522 if (ltime == DBL_MAX) {
523 nucleus->SetFloatingLevelNumber(0);
524 nucleus->SetLongLived(true);
525 return result;
526 }
527
528 // sampling index of a final level
529 std::size_t idx = 0;
530 if(1 < ntrans) {
531 idx = level->SampleGammaTransition(G4UniformRand());
532 }
533 if(fVerbose > 2) {
534 G4cout << "Ntrans= " << ntrans << " idx= " << idx
535 << " ICM= " << fICM << " abs(JP1)= " << JP1 << G4endl;
536 }
537
538 // sampling IC or gamma transition
539 G4double prob = (G4double)level->GammaProbability(idx);
540
541 // prob = 0 means that there is only internal conversion
542 if (prob < 1.0) {
543 G4double rndm = G4UniformRand();
544 if (rndm > prob) {
545 isGamma = false;
546 if (fICM) {
547 rndm = (rndm - prob)/(1.0 - prob);
548 vShellNumber = level->SampleShell(idx, rndm);
549 }
550 }
551 }
552 // it is a discrete transition with possible gamma correlation
553 ratio = level->MultipolarityRatio(idx);
554 multiP = level->TransitionType(idx);
555 fIndex = level->FinalExcitationIndex(idx);
556 finalDiscrete = true;
557
558 // final level parameters
559 efinal = fLevelManager->LevelEnergy(fIndex);
560 // time is sampled if decay not prompt and this class called not
561 // from radioactive decay and isomer production is enabled
562 if(fSampleTime && ltime > 0.0) {
563 time -= ltime*G4Log(G4UniformRand());
564 }
565 }
566 ltime = 0.0;
567 if (finalDiscrete) {
568 ltime = fLevelManager->LifeTime(fIndex);
569 JP2 = fLevelManager->TwoSpinParity(fIndex);
570 }
571 // sample continues or discrete transition if transition
572 // is above distance between floating level
573 if (std::abs(efinal - eexc) > fTolerance) {
574 result = fTransition->SampleTransition(nucleus, efinal, ratio, JP1,
575 std::abs(JP2), multiP, vShellNumber,
576 isDiscrete, isGamma);
577 if (nullptr != result) { result->SetCreationTime(time); }
578 }
579 // update parameters of the fragment
580 nucleus->SetCreationTime(time);
581 nucleus->SetSpin(0.5*JP2);
582 if (nullptr != fPolarization) { fPolarization->SetExcitationEnergy(efinal); }
583
584 if (finalDiscrete) {
585 G4int idxfl = fLevelManager->FloatingLevel(fIndex);
586 nucleus->SetFloatingLevelNumber(idxfl);
587
588 if (ltime > fLocalTimeLimit) { isLL = true; }
589 }
590 nucleus->SetLongLived(isLL);
591
592 if (fVerbose > 2) {
593 G4String ss = "## ";
594 if (isLL && efinal > 0.0 && efinal < MeV) { ss += "=I="; }
595 if (isLL && efinal >= MeV) { ss += "=J="; }
596 if (efinal >= 6*MeV) { ss += "=K="; }
597 G4cout << " " << ss << " Efinal=" << efinal
598 << " Efrag=" << nucleus->GetExcitationEnergy()
599 << " lt=" << ltime
600 << " idxFin=" << fIndex << " isDiscrete:" << isDiscrete
601 << " isGamma:" << isGamma << " isStable:" << isLL
602 << " multiP=" << multiP << " shell=" << vShellNumber
603 << " abs(JP1)= " << JP1 << " abs(JP2)= " << JP2 << G4endl;
604 }
605 return result;
606}
607
609{
610 if(p != fTransition) {
611 delete fTransition;
612 fTransition = p;
613 }
614}
615
617{
618 fICM = val;
619}
620
622{
623 fRDM = val;
624}
625
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132
std::vector< G4Fragment * > G4FragmentVector
Definition G4Fragment.hh:65
G4double G4Log(G4double x)
Definition G4Log.hh:169
float G4float
Definition G4Types.hh:84
double G4double
Definition G4Types.hh:83
long G4long
Definition G4Types.hh:87
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
G4bool GetInternalConversionFlag() const
void SetCreatorModelID(G4int value)
void SetCreationTime(G4double time)
std::size_t NumberOfTransitions() const
G4int SampleShell(const std::size_t idx, const G4double rndm) const
G4float MultipolarityRatio(const std::size_t idx) const
G4int TransitionType(const std::size_t idx) const
G4float GammaProbability(std::size_t idx) const
std::size_t FinalExcitationIndex(const std::size_t idx) const
std::size_t SampleGammaTransition(const G4double rndm) const
static G4NuclearLevelData * GetInstance()
static G4NuclearPolarizationStore * GetInstance()
void RemoveMe(G4NuclearPolarization *ptr)
G4NuclearPolarization * FindOrBuild(G4int Z, G4int A, G4double Eexc)
void RDMForced(G4bool) override
G4double GetEmissionProbability(G4Fragment *theNucleus) override
G4double GetUpperLevelEnergy(G4int Z, G4int A)
void SetICM(G4bool) override
G4double ComputeProbability(G4Fragment *theNucleus, G4double kinEnergy) override
G4double ComputeInverseXSection(G4Fragment *theNucleus, G4double kinEnergy) override
G4double GetFinalLevelEnergy(G4int Z, G4int A, G4double energy)
G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus) override
void SetGammaTransition(G4GammaTransition *)
G4PhotonEvaporation(G4GammaTransition *ptr=nullptr)
G4FragmentVector * BreakItUp(const G4Fragment &theNucleus)
G4Fragment * EmittedFragment(G4Fragment *theNucleus) override
static G4int GetModelID(const G4int modelIndex)
Definition G4Pow.hh:49
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double powZ(G4int Z, G4double y) const
Definition G4Pow.hh:225
#define DBL_MAX
Definition templates.hh:62