Geant4-11
Public Member Functions | Protected Attributes | Private Member Functions | Private Attributes | Static Private Attributes
G4PhotonEvaporation Class Reference

#include <G4PhotonEvaporation.hh>

Inheritance diagram for G4PhotonEvaporation:
G4VEvaporationChannel

Public Member Functions

G4FragmentVectorBreakItUp (const G4Fragment &theNucleus)
 
virtual G4bool BreakUpChain (G4FragmentVector *theResult, G4Fragment *theNucleus) final
 
G4FragmentVectorBreakUpFragment (G4Fragment *theNucleus)
 
virtual void Dump () const
 
virtual G4FragmentEmittedFragment (G4Fragment *theNucleus) final
 
 G4PhotonEvaporation (const G4PhotonEvaporation &right)=delete
 
 G4PhotonEvaporation (G4GammaTransition *ptr=nullptr)
 
virtual G4double GetEmissionProbability (G4Fragment *theNucleus) final
 
virtual G4double GetFinalLevelEnergy (G4int Z, G4int A, G4double energy) final
 
virtual G4double GetLifeTime (G4Fragment *theNucleus)
 
virtual G4double GetUpperLevelEnergy (G4int Z, G4int A) final
 
G4int GetVacantShellNumber () const
 
virtual void Initialise () final
 
const G4PhotonEvaporationoperator= (const G4PhotonEvaporation &right)=delete
 
virtual void RDMForced (G4bool)
 
void SetGammaTransition (G4GammaTransition *)
 
virtual void SetICM (G4bool)
 
void SetOPTxs (G4int opt)
 
void SetVerboseLevel (G4int verbose)
 
void UseSICB (G4bool use)
 
virtual ~G4PhotonEvaporation ()
 

Protected Attributes

G4int OPTxs
 
G4bool useSICB
 

Private Member Functions

G4FragmentGenerateGamma (G4Fragment *nucleus)
 
void InitialiseGRData ()
 
void InitialiseLevelManager (G4int Z, G4int A)
 
G4bool operator!= (const G4VEvaporationChannel &right) const
 
G4bool operator== (const G4VEvaporationChannel &right) const
 

Private Attributes

G4int fCode
 
G4bool fCorrelatedGamma
 
G4double fCummProbability [MAXDEPOINT]
 
G4double fExcEnergy
 
G4bool fICM
 
size_t fIndex
 
G4bool fIsomerFlag
 
G4double fLevelEnergyMax
 
const G4LevelManagerfLevelManager
 
G4double fMaxLifeTime
 
G4NuclearLevelDatafNuclearLevelData
 
G4int fPoints
 
G4NuclearPolarizationfPolarization
 
G4double fProbability
 
G4bool fRDM
 
G4bool fSampleTime
 
G4int fSecID
 
G4double fStep
 
G4GammaTransitionfTransition
 
G4int fVerbose
 
G4bool isInitialised
 
G4int theA
 
G4int theZ
 
G4double Tolerance
 
G4int vShellNumber
 

Static Private Attributes

static G4float GREnergy [MAXGRDATA] = {0.0f}
 
static G4float GRWidth [MAXGRDATA] = {0.0f}
 

Detailed Description

Definition at line 63 of file G4PhotonEvaporation.hh.

Constructor & Destructor Documentation

◆ G4PhotonEvaporation() [1/2]

G4PhotonEvaporation::G4PhotonEvaporation ( G4GammaTransition ptr = nullptr)
explicit

Definition at line 64 of file G4PhotonEvaporation.cc.

65 : fLevelManager(nullptr), fTransition(p), fPolarization(nullptr),
66 fVerbose(1), fPoints(0), vShellNumber(-1), fIndex(0), fSecID(-1),
68 fICM(true), fRDM(false), fSampleTime(true),
69 fCorrelatedGamma(false), fIsomerFlag(false), isInitialised(false)
70{
71 //G4cout << "### New G4PhotonEvaporation() " << this << G4endl;
74
76
77 theA = theZ = fCode = 0;
78 fSecID = G4PhysicsModelCatalog::GetModelID("model_G4PhotonEvaporation");
80
81 for(G4int i=0; i<MAXDEPOINT; ++i) { fCummProbability[i] = 0.0; }
82 if(0.0f == GREnergy[1]) { InitialiseGRData(); }
83}
const G4int MAXDEPOINT
int G4int
Definition: G4Types.hh:85
static G4NuclearLevelData * GetInstance()
static G4float GREnergy[MAXGRDATA]
G4NuclearLevelData * fNuclearLevelData
G4NuclearPolarization * fPolarization
G4double fCummProbability[MAXDEPOINT]
const G4LevelManager * fLevelManager
G4GammaTransition * fTransition
static G4int GetModelID(const G4int modelIndex)
static constexpr double eV
#define DBL_MAX
Definition: templates.hh:62

References CLHEP::eV, fCode, fCummProbability, fExcEnergy, fLevelEnergyMax, fNuclearLevelData, fProbability, fSecID, fStep, fTransition, G4NuclearLevelData::GetInstance(), G4PhysicsModelCatalog::GetModelID(), GREnergy, InitialiseGRData(), MAXDEPOINT, theA, theZ, and Tolerance.

◆ ~G4PhotonEvaporation()

G4PhotonEvaporation::~G4PhotonEvaporation ( )
virtual

Definition at line 85 of file G4PhotonEvaporation.cc.

86{
87 delete fTransition;
88}

References fTransition.

◆ G4PhotonEvaporation() [2/2]

G4PhotonEvaporation::G4PhotonEvaporation ( const G4PhotonEvaporation right)
delete

Member Function Documentation

◆ BreakItUp()

G4FragmentVector * G4PhotonEvaporation::BreakItUp ( const G4Fragment theNucleus)

Definition at line 182 of file G4PhotonEvaporation.cc.

183{
184 if(fVerbose > 1) {
185 G4cout << "G4PhotonEvaporation::BreakItUp" << G4endl;
186 }
187 G4Fragment* aNucleus = new G4Fragment(nucleus);
188 G4FragmentVector* products = new G4FragmentVector();
189 BreakUpChain(products, aNucleus);
190 aNucleus->SetCreatorModelID(fSecID);
191 products->push_back(aNucleus);
192 return products;
193}
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:64
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
void SetCreatorModelID(G4int value)
Definition: G4Fragment.hh:428
virtual G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus) final

References BreakUpChain(), fSecID, fVerbose, G4cout, G4endl, and G4Fragment::SetCreatorModelID().

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

◆ BreakUpChain()

G4bool G4PhotonEvaporation::BreakUpChain ( G4FragmentVector theResult,
G4Fragment theNucleus 
)
finalvirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 195 of file G4PhotonEvaporation.cc.

197{
198 if(!isInitialised) { Initialise(); }
199 if(fVerbose > 1) {
200 G4cout << "G4PhotonEvaporation::BreakUpChain RDM= " << fRDM << " "
201 << *nucleus << G4endl;
202 }
203 G4Fragment* gamma = nullptr;
204 fSampleTime = !fRDM;
205
206 // start decay chain from unpolarized state
207 if(fCorrelatedGamma) {
208 fPolarization = new G4NuclearPolarization(nucleus->GetZ_asInt(),
209 nucleus->GetA_asInt(),
210 nucleus->GetExcitationEnergy());
211 nucleus->SetNuclearPolarization(fPolarization);
212 }
213
214 do {
215 gamma = GenerateGamma(nucleus);
216 if(gamma) {
218 products->push_back(gamma);
219 if(fVerbose > 2) {
220 G4cout << "G4PhotonEvaporation::BreakUpChain: "
221 << *gamma << G4endl;
222 G4cout << " Residual: " << *nucleus << G4endl;
223 }
224 // for next decays in the chain always sample time
225 fSampleTime = true;
226 }
227 // Loop checking, 05-Aug-2015, Vladimir Ivanchenko
228 } while(gamma);
229
230 // clear nuclear polarization end of chain
231 if(fPolarization) {
232 delete fPolarization;
233 fPolarization = nullptr;
234 nucleus->SetNuclearPolarization(fPolarization);
235 }
236 return false;
237}
virtual void Initialise() final
G4Fragment * GenerateGamma(G4Fragment *nucleus)

References fCorrelatedGamma, fPolarization, fRDM, fSampleTime, fSecID, fVerbose, G4cout, G4endl, GenerateGamma(), G4Fragment::GetA_asInt(), G4Fragment::GetExcitationEnergy(), G4Fragment::GetZ_asInt(), Initialise(), isInitialised, G4Fragment::SetCreatorModelID(), and G4Fragment::SetNuclearPolarization().

Referenced by BreakItUp().

◆ BreakUpFragment()

G4FragmentVector * G4VEvaporationChannel::BreakUpFragment ( G4Fragment theNucleus)
inlineinherited

Definition at line 106 of file G4VEvaporationChannel.hh.

107{
108 G4FragmentVector* results = new G4FragmentVector();
109 BreakUpChain(results, theNucleus);
110 return results;
111}
virtual G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus)

References G4VEvaporationChannel::BreakUpChain().

Referenced by G4NeutronRadCapture::ApplyYourself().

◆ Dump()

void G4VEvaporationChannel::Dump ( ) const
virtualinherited

Reimplemented in G4GEMChannel, and G4GEMChannelVI.

Definition at line 71 of file G4VEvaporationChannel.cc.

72{}

◆ EmittedFragment()

G4Fragment * G4PhotonEvaporation::EmittedFragment ( G4Fragment theNucleus)
finalvirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 131 of file G4PhotonEvaporation.cc.

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

References fCorrelatedGamma, fIndex, G4NuclearPolarizationStore::FindOrBuild(), fPolarization, fRDM, fSampleTime, fSecID, fVerbose, G4cout, G4endl, GenerateGamma(), G4Fragment::GetA_asInt(), G4Fragment::GetExcitationEnergy(), G4NuclearPolarizationStore::GetInstance(), G4Fragment::GetNuclearPolarization(), G4Fragment::GetZ_asInt(), Initialise(), isInitialised, G4NuclearPolarizationStore::RemoveMe(), G4Fragment::SetCreatorModelID(), and G4Fragment::SetNuclearPolarization().

Referenced by G4ITDecay::DecayIt().

◆ GenerateGamma()

G4Fragment * G4PhotonEvaporation::GenerateGamma ( G4Fragment nucleus)
private

Definition at line 343 of file G4PhotonEvaporation.cc.

344{
345 if(!isInitialised) { Initialise(); }
346 G4Fragment* result = nullptr;
347 G4double eexc = nucleus->GetExcitationEnergy();
348 if(eexc <= Tolerance) { return result; }
349
350 InitialiseLevelManager(nucleus->GetZ_asInt(), nucleus->GetA_asInt());
351
352 G4double time = nucleus->GetCreationTime();
353
354 G4double efinal = 0.0;
355 G4double ratio = 0.0;
356 vShellNumber = -1;
357 G4int JP1 = 0;
358 G4int JP2 = 0;
359 G4int multiP = 0;
360 G4bool isGamma = true;
361 G4bool isDiscrete = false;
362
363 const G4NucLevel* level = nullptr;
364 size_t ntrans = 0;
365
366 if(fVerbose > 2) {
367 G4cout << "GenerateGamma: " << " Eex= " << eexc
368 << " Eexmax= " << fLevelEnergyMax << G4endl;
369 }
370 // initial discrete state
371 if(fLevelManager && eexc <= fLevelEnergyMax + Tolerance) {
373 // initial state below 1st level
374 if(0 == fIndex && eexc >= Tolerance
375 && fLevelManager->NumberOfTransitions() > 0) { fIndex = 1; }
376 isDiscrete = true;
377 if(fVerbose > 2) {
378 G4cout << " index= " << fIndex
379 << " lTime= " << fLevelManager->LifeTime(fIndex) << G4endl;
380 }
381 if(0 < fIndex) {
382 // for discrete transition
383 level = fLevelManager->GetLevel(fIndex);
384 if(level) {
385 ntrans = level->NumberOfTransitions();
387 if(fVerbose > 2) {
388 G4cout << " ntrans= " << ntrans << " JP= " << JP1
389 << " RDM: " << fRDM << G4endl;
390 }
391 if(0 == ntrans && fLevelManager->FloatingLevel(fIndex) > 0) {
392 --fIndex;
393 level = fLevelManager->GetLevel(fIndex);
394 ntrans = level->NumberOfTransitions();
396 }
397 }
398 }
399 }
400 // if a level has no defined transitions
401 if(0 == ntrans) { isDiscrete = false; }
402 if(fVerbose > 2) {
403 G4int prec = G4cout.precision(4);
404 G4cout << "GenerateGamma: Z= " << nucleus->GetZ_asInt()
405 << " A= " << nucleus->GetA_asInt()
406 << " Exc= " << eexc << " Emax= "
407 << fLevelEnergyMax << " idx= " << fIndex
408 << " fCode= " << fCode << " fPoints= " << fPoints
409 << " Ntr= " << ntrans << " discrete: " << isDiscrete
410 << " fProb= " << fProbability << G4endl;
411 G4cout.precision(prec);
412 }
413
414 // continues part
415 if(!isDiscrete) {
416 // we compare current excitation versus value used for probability
417 // computation and also Z and A used for probability computation
418 if(fCode != 1000*theZ + theA || eexc != fExcEnergy) {
419 GetEmissionProbability(nucleus);
420 }
421 if(fProbability == 0.0) {
422 fPoints = 1;
423 efinal = 0.0;
424 } else {
426 for(G4int i=1; i<fPoints; ++i) {
427 if(fVerbose > 3) {
428 G4cout << "y= " << y << " cummProb= " << fCummProbability[i]
429 << " fPoints= " << fPoints << " fStep= " << fStep << G4endl;
430 }
431 if(y <= fCummProbability[i]) {
432 efinal = fStep*((i - 1) + (y - fCummProbability[i-1])
434 break;
435 }
436 }
437 }
438 // final discrete level
439 if(fVerbose > 2) {
440 G4cout << "Continues proposes Efinal= " << efinal << G4endl;
441 }
442 if(fLevelManager) {
443 if(efinal < fLevelEnergyMax) {
446 // protection - take level below
447 if(efinal >= eexc && 0 < fIndex) {
448 --fIndex;
450 }
452
453 // not allowed to have final energy above max energy
454 // if G4LevelManager exist
455 } else {
456 efinal = fLevelEnergyMax;
458 }
459 }
460 if(fVerbose > 2) {
461 G4cout << "Continues emission efinal(MeV)= " << efinal << G4endl;
462 }
463 //discrete part ground state
464 } else if(0 == fIndex) {
465 return result;
466
467 //discrete part
468 } else {
469
470 if(fVerbose > 2) {
471 G4cout << "Discrete emission from level Index= " << fIndex
472 << " Elevel= " << fLevelManager->LevelEnergy(fIndex)
473 << " Ltime= " << fLevelManager->LifeTime(fIndex)
474 << " LtimeMax= " << fMaxLifeTime
475 << " RDM= " << fRDM << " ICM= " << fICM << G4endl;
476 }
477
478 // stable fragment has life time -1 or above the limit
479 // if is called from the radioactive decay the life time is not checked
481 if(ltime < 0.0 || (!fRDM && ltime > fMaxLifeTime)) { return result; }
482
483 size_t idx = 0;
484 if(1 < ntrans) {
485 idx = level->SampleGammaTransition(G4UniformRand());
486 }
487 if(fVerbose > 2) {
488 G4cout << "Ntrans= " << ntrans << " idx= " << idx
489 << " ICM= " << fICM << " JP1= " << JP1 << G4endl;
490 }
491 G4double prob = (G4double)level->GammaProbability(idx);
492 // prob = 0 means that there is only internal conversion
493 if(fICM && prob < 1.0) {
494 G4double rndm = G4UniformRand();
495 if(rndm > prob) {
496 isGamma = false;
497 rndm = (rndm - prob)/(1.0 - prob);
498 vShellNumber = level->SampleShell(idx, rndm);
499 }
500 }
501 // it is discrete transition with possible gamma correlation
502 ratio = level->MultipolarityRatio(idx);
503 multiP = level->TransitionType(idx);
504 fIndex = level->FinalExcitationIndex(idx);
506
507 // final energy and time
509 // time is sampled if decay not prompt and this class called not
510 // from radioactive decay and isomer production is enabled
511 if(fSampleTime && fIsomerFlag && ltime > 0.0) {
512 time -= ltime*G4Log(G4UniformRand());
513 }
515 }
516 // protection for floating levels
517 if(std::abs(efinal - eexc) <= Tolerance) { return result; }
518
519 result = fTransition->SampleTransition(nucleus, efinal, ratio, JP1,
520 JP2, multiP, vShellNumber,
521 isDiscrete, isGamma);
522 if(result) { result->SetCreationTime(time); }
523
524 // updated residual nucleus
525 nucleus->SetCreationTime(time);
526 nucleus->SetSpin(0.5*JP2);
528
529 // ignore the floating levels with zero energy and create ground state
530 if(efinal == 0.0 && fIndex > 0) {
531 fIndex = 0;
533 }
534
535 if(fVerbose > 2) {
536 G4cout << "Final level E= " << efinal << " time= " << time
537 << " idxFinal= " << fIndex << " isDiscrete: " << isDiscrete
538 << " isGamma: " << isGamma << " multiP= " << multiP
539 << " shell= " << vShellNumber
540 << " JP1= " << JP1 << " JP2= " << JP2 << G4endl;
541 }
542 return result;
543}
G4double G4Log(G4double x)
Definition: G4Log.hh:226
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
#define G4UniformRand()
Definition: Randomize.hh:52
void SetFloatingLevelNumber(G4int value)
Definition: G4Fragment.hh:448
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:299
G4double GetCreationTime() const
Definition: G4Fragment.hh:464
G4int GetZ_asInt() const
Definition: G4Fragment.hh:276
void SetCreationTime(G4double time)
Definition: G4Fragment.hh:469
void SetSpin(G4double value)
Definition: G4Fragment.hh:438
G4int GetA_asInt() const
Definition: G4Fragment.hh:271
virtual G4Fragment * SampleTransition(G4Fragment *nucleus, G4double newExcEnergy, G4double mpRatio, G4int JP1, G4int JP2, G4int MP, G4int shell, G4bool isDiscrete, G4bool isGamma)
G4double LifeTime(size_t i) const
const G4NucLevel * GetLevel(size_t i) const
size_t NearestLevelIndex(G4double energy, size_t index=0) const
G4int FloatingLevel(size_t i) const
G4int SpinTwo(size_t i) const
size_t NumberOfTransitions() const
G4double LevelEnergy(size_t i) const
G4int TransitionType(size_t idx) const
Definition: G4NucLevel.hh:121
G4float MultipolarityRatio(size_t idx) const
Definition: G4NucLevel.hh:150
G4float GammaProbability(size_t idx) const
Definition: G4NucLevel.hh:134
size_t NumberOfTransitions() const
Definition: G4NucLevel.hh:108
size_t FinalExcitationIndex(size_t idx) const
Definition: G4NucLevel.hh:113
size_t SampleGammaTransition(G4double rndm) const
Definition: G4NucLevel.hh:158
G4int SampleShell(size_t idx, G4double rndm) const
Definition: G4NucLevel.hh:168
void SetExcitationEnergy(G4double val)
void InitialiseLevelManager(G4int Z, G4int A)
virtual G4double GetEmissionProbability(G4Fragment *theNucleus) final
static const double prec
Definition: RanecuEngine.cc:61

References fCode, fCummProbability, fExcEnergy, fICM, G4NucLevel::FinalExcitationIndex(), fIndex, fIsomerFlag, fLevelEnergyMax, fLevelManager, G4LevelManager::FloatingLevel(), fMaxLifeTime, fPoints, fPolarization, fProbability, fRDM, fSampleTime, fStep, fTransition, fVerbose, G4cout, G4endl, G4Log(), G4UniformRand, G4NucLevel::GammaProbability(), G4Fragment::GetA_asInt(), G4Fragment::GetCreationTime(), GetEmissionProbability(), G4Fragment::GetExcitationEnergy(), G4LevelManager::GetLevel(), G4Fragment::GetZ_asInt(), Initialise(), InitialiseLevelManager(), isInitialised, G4LevelManager::LevelEnergy(), G4LevelManager::LifeTime(), G4NucLevel::MultipolarityRatio(), G4LevelManager::NearestLevelIndex(), G4LevelManager::NumberOfTransitions(), G4NucLevel::NumberOfTransitions(), CLHEP::prec, G4NucLevel::SampleGammaTransition(), G4NucLevel::SampleShell(), G4GammaTransition::SampleTransition(), G4Fragment::SetCreationTime(), G4NuclearPolarization::SetExcitationEnergy(), G4Fragment::SetFloatingLevelNumber(), G4Fragment::SetSpin(), G4LevelManager::SpinTwo(), theA, theZ, Tolerance, G4NucLevel::TransitionType(), and vShellNumber.

Referenced by BreakUpChain(), and EmittedFragment().

◆ GetEmissionProbability()

G4double G4PhotonEvaporation::GetEmissionProbability ( G4Fragment theNucleus)
finalvirtual

Implements G4VEvaporationChannel.

Definition at line 240 of file G4PhotonEvaporation.cc.

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

References A, G4Fragment::ComputeGroundStateMass(), emax, fCode, fCummProbability, fExcEnergy, fNuclearLevelData, fPoints, fProbability, fStep, fVerbose, G4cout, G4endl, G4Exp(), G4Fragment::GetA_asInt(), G4Fragment::GetExcitationEnergy(), G4Fragment::GetGroundStateMass(), G4NuclearLevelData::GetLevelDensity(), G4Fragment::GetZ_asInt(), GREnergy, GRWidth, CLHEP::hbarc, Initialise(), isInitialised, G4INCL::Math::max(), MAXDEPOINT, MAXGRDATA, CLHEP::MeV, CLHEP::millibarn, G4INCL::Math::min(), CLHEP::neutron_mass_c2, CLHEP::pi2, Tolerance, and Z.

Referenced by GenerateGamma().

◆ GetFinalLevelEnergy()

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

Definition at line 325 of file G4PhotonEvaporation.cc.

326{
327 G4double E = energy;
329 if(fLevelManager) {
331 if(E > fLevelEnergyMax + Tolerance) { E = energy; }
332 }
333 return E;
334}
G4double NearestLevelEnergy(G4double energy, size_t index=0) const
G4double energy(const ThreeVector &p, const G4double m)

References A, G4INCL::KinematicsUtils::energy(), fIndex, fLevelEnergyMax, fLevelManager, InitialiseLevelManager(), G4LevelManager::NearestLevelEnergy(), Tolerance, and Z.

◆ GetLifeTime()

G4double G4VEvaporationChannel::GetLifeTime ( G4Fragment theNucleus)
virtualinherited

Definition at line 50 of file G4VEvaporationChannel.cc.

51{
52 return 0.0;
53}

◆ GetUpperLevelEnergy()

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

Definition at line 336 of file G4PhotonEvaporation.cc.

337{
339 return fLevelEnergyMax;
340}

References A, fLevelEnergyMax, InitialiseLevelManager(), and Z.

◆ GetVacantShellNumber()

G4int G4PhotonEvaporation::GetVacantShellNumber ( ) const
inline

Definition at line 173 of file G4PhotonEvaporation.hh.

174{
175 return vShellNumber;
176}

References vShellNumber.

Referenced by G4ITDecay::DecayIt().

◆ Initialise()

void G4PhotonEvaporation::Initialise ( )
finalvirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 90 of file G4PhotonEvaporation.cc.

91{
92 if(isInitialised) { return; }
93 isInitialised = true;
94
96 Tolerance = param->GetMinExcitation();
100 fIsomerFlag = param->IsomerProduction();
101 if(fRDM) { fIsomerFlag = true; }
102 fVerbose = param->GetVerbose();
103
107 if(fVerbose > 1) {
108 G4cout << "### G4PhotonEvaporation is initialized " << this << G4endl;
109 }
110}
G4double GetMinExcitation() const
G4bool GetInternalConversionFlag() const
void SetPolarizationFlag(G4bool val)
void SetTwoJMAX(G4int val)
void SetVerbose(G4int val)
G4DeexPrecoParameters * GetParameters()

References G4DeexPrecoParameters::CorrelatedGamma(), fCorrelatedGamma, fICM, fIsomerFlag, fMaxLifeTime, fNuclearLevelData, fRDM, fTransition, fVerbose, G4cout, G4endl, G4DeexPrecoParameters::GetInternalConversionFlag(), G4DeexPrecoParameters::GetMaxLifeTime(), G4DeexPrecoParameters::GetMinExcitation(), G4NuclearLevelData::GetParameters(), G4DeexPrecoParameters::GetTwoJMAX(), G4DeexPrecoParameters::GetVerbose(), isInitialised, G4DeexPrecoParameters::IsomerProduction(), G4GammaTransition::SetPolarizationFlag(), G4GammaTransition::SetTwoJMAX(), G4GammaTransition::SetVerbose(), and Tolerance.

Referenced by BreakUpChain(), EmittedFragment(), GenerateGamma(), and GetEmissionProbability().

◆ InitialiseGRData()

void G4PhotonEvaporation::InitialiseGRData ( )
private

Definition at line 112 of file G4PhotonEvaporation.cc.

113{
114#ifdef G4MULTITHREADED
115 G4MUTEXLOCK(&G4PhotonEvaporation::PhotonEvaporationMutex);
116#endif
117 if(0.0f == GREnergy[1]) {
118 G4Pow* g4calc = G4Pow::GetInstance();
119 const G4float GRWfactor = 0.3f;
120 for (G4int A=1; A<MAXGRDATA; ++A) {
121 GREnergy[A] = (G4float)(40.3*CLHEP::MeV/g4calc->powZ(A,0.2));
122 GRWidth[A] = GRWfactor*GREnergy[A];
123 }
124 }
125#ifdef G4MULTITHREADED
126 G4MUTEXUNLOCK(&G4PhotonEvaporation::PhotonEvaporationMutex);
127#endif
128}
#define G4MUTEXLOCK(mutex)
Definition: G4Threading.hh:251
#define G4MUTEXUNLOCK(mutex)
Definition: G4Threading.hh:254
Definition: G4Pow.hh:49
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double powZ(G4int Z, G4double y) const
Definition: G4Pow.hh:225

References A, G4MUTEXLOCK, G4MUTEXUNLOCK, G4Pow::GetInstance(), GREnergy, GRWidth, MAXGRDATA, CLHEP::MeV, and G4Pow::powZ().

Referenced by G4PhotonEvaporation().

◆ InitialiseLevelManager()

void G4PhotonEvaporation::InitialiseLevelManager ( G4int  Z,
G4int  A 
)
inlineprivate

Definition at line 162 of file G4PhotonEvaporation.hh.

163{
164 if(Z != theZ || A != theA) {
165 theZ = Z;
166 theA = A;
167 fIndex = 0;
170 }
171}
G4double MaxLevelEnergy() const
const G4LevelManager * GetLevelManager(G4int Z, G4int A)

References A, fIndex, fLevelEnergyMax, fLevelManager, fNuclearLevelData, G4NuclearLevelData::GetLevelManager(), G4LevelManager::MaxLevelEnergy(), theA, theZ, and Z.

Referenced by GenerateGamma(), GetFinalLevelEnergy(), and GetUpperLevelEnergy().

◆ operator!=()

G4bool G4VEvaporationChannel::operator!= ( const G4VEvaporationChannel right) const
privateinherited

◆ operator=()

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

◆ operator==()

G4bool G4VEvaporationChannel::operator== ( const G4VEvaporationChannel right) const
privateinherited

◆ RDMForced()

void G4PhotonEvaporation::RDMForced ( G4bool  val)
virtual

Reimplemented from G4VEvaporationChannel.

Definition at line 558 of file G4PhotonEvaporation.cc.

559{
560 fRDM = val;
561}

References fRDM.

Referenced by G4RadioactiveDecay::G4RadioactiveDecay().

◆ SetGammaTransition()

void G4PhotonEvaporation::SetGammaTransition ( G4GammaTransition p)

Definition at line 545 of file G4PhotonEvaporation.cc.

546{
547 if(p != fTransition) {
548 delete fTransition;
549 fTransition = p;
550 }
551}

References fTransition.

◆ SetICM()

void G4PhotonEvaporation::SetICM ( G4bool  val)
virtual

Reimplemented from G4VEvaporationChannel.

Definition at line 553 of file G4PhotonEvaporation.cc.

554{
555 fICM = val;
556}

References fICM.

Referenced by G4LENDCapture::ApplyYourself(), G4ParticleHPCaptureFS::ApplyYourself(), and G4RadioactiveDecay::G4RadioactiveDecay().

◆ SetOPTxs()

void G4VEvaporationChannel::SetOPTxs ( G4int  opt)
inlineinherited

Definition at line 113 of file G4VEvaporationChannel.hh.

114{}

◆ SetVerboseLevel()

void G4PhotonEvaporation::SetVerboseLevel ( G4int  verbose)
inline

Definition at line 156 of file G4PhotonEvaporation.hh.

157{
158 fVerbose = verbose;
159}

References fVerbose.

◆ UseSICB()

void G4VEvaporationChannel::UseSICB ( G4bool  use)
inlineinherited

Definition at line 116 of file G4VEvaporationChannel.hh.

117{}

Field Documentation

◆ fCode

G4int G4PhotonEvaporation::fCode
private

◆ fCorrelatedGamma

G4bool G4PhotonEvaporation::fCorrelatedGamma
private

Definition at line 147 of file G4PhotonEvaporation.hh.

Referenced by BreakUpChain(), EmittedFragment(), and Initialise().

◆ fCummProbability

G4double G4PhotonEvaporation::fCummProbability[MAXDEPOINT]
private

◆ fExcEnergy

G4double G4PhotonEvaporation::fExcEnergy
private

◆ fICM

G4bool G4PhotonEvaporation::fICM
private

Definition at line 144 of file G4PhotonEvaporation.hh.

Referenced by GenerateGamma(), Initialise(), and SetICM().

◆ fIndex

size_t G4PhotonEvaporation::fIndex
private

◆ fIsomerFlag

G4bool G4PhotonEvaporation::fIsomerFlag
private

Definition at line 148 of file G4PhotonEvaporation.hh.

Referenced by GenerateGamma(), and Initialise().

◆ fLevelEnergyMax

G4double G4PhotonEvaporation::fLevelEnergyMax
private

◆ fLevelManager

const G4LevelManager* G4PhotonEvaporation::fLevelManager
private

◆ fMaxLifeTime

G4double G4PhotonEvaporation::fMaxLifeTime
private

Definition at line 140 of file G4PhotonEvaporation.hh.

Referenced by GenerateGamma(), and Initialise().

◆ fNuclearLevelData

G4NuclearLevelData* G4PhotonEvaporation::fNuclearLevelData
private

◆ fPoints

G4int G4PhotonEvaporation::fPoints
private

Definition at line 124 of file G4PhotonEvaporation.hh.

Referenced by GenerateGamma(), and GetEmissionProbability().

◆ fPolarization

G4NuclearPolarization* G4PhotonEvaporation::fPolarization
private

Definition at line 119 of file G4PhotonEvaporation.hh.

Referenced by BreakUpChain(), EmittedFragment(), and GenerateGamma().

◆ fProbability

G4double G4PhotonEvaporation::fProbability
private

◆ fRDM

G4bool G4PhotonEvaporation::fRDM
private

◆ fSampleTime

G4bool G4PhotonEvaporation::fSampleTime
private

Definition at line 146 of file G4PhotonEvaporation.hh.

Referenced by BreakUpChain(), EmittedFragment(), and GenerateGamma().

◆ fSecID

G4int G4PhotonEvaporation::fSecID
private

◆ fStep

G4double G4PhotonEvaporation::fStep
private

◆ fTransition

G4GammaTransition* G4PhotonEvaporation::fTransition
private

◆ fVerbose

G4int G4PhotonEvaporation::fVerbose
private

◆ GREnergy

G4float G4PhotonEvaporation::GREnergy = {0.0f}
staticprivate

◆ GRWidth

G4float G4PhotonEvaporation::GRWidth = {0.0f}
staticprivate

Definition at line 132 of file G4PhotonEvaporation.hh.

Referenced by GetEmissionProbability(), and InitialiseGRData().

◆ isInitialised

G4bool G4PhotonEvaporation::isInitialised
private

◆ OPTxs

G4int G4VEvaporationChannel::OPTxs
protectedinherited

◆ theA

G4int G4PhotonEvaporation::theA
private

◆ theZ

G4int G4PhotonEvaporation::theZ
private

◆ Tolerance

G4double G4PhotonEvaporation::Tolerance
private

◆ useSICB

G4bool G4VEvaporationChannel::useSICB
protectedinherited

Definition at line 94 of file G4VEvaporationChannel.hh.

◆ vShellNumber

G4int G4PhotonEvaporation::vShellNumber
private

Definition at line 126 of file G4PhotonEvaporation.hh.

Referenced by GenerateGamma(), and GetVacantShellNumber().


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