Geant4 10.7.0
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)
 
virtual ~G4PhotonEvaporation ()
 
virtual void Initialise () final
 
virtual G4FragmentEmittedFragment (G4Fragment *theNucleus) final
 
virtual G4bool BreakUpChain (G4FragmentVector *theResult, G4Fragment *theNucleus) final
 
G4FragmentVectorBreakItUp (const G4Fragment &theNucleus)
 
virtual G4double GetEmissionProbability (G4Fragment *theNucleus) final
 
virtual G4double GetFinalLevelEnergy (G4int Z, G4int A, G4double energy) final
 
virtual G4double GetUpperLevelEnergy (G4int Z, G4int A) final
 
void SetGammaTransition (G4GammaTransition *)
 
virtual void SetICM (G4bool)
 
virtual void RDMForced (G4bool)
 
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 ()
 
virtual G4double GetEmissionProbability (G4Fragment *theNucleus)=0
 
virtual void Initialise ()
 
virtual G4double GetLifeTime (G4Fragment *theNucleus)
 
virtual G4FragmentEmittedFragment (G4Fragment *theNucleus)
 
virtual G4bool BreakUpChain (G4FragmentVector *theResult, G4Fragment *theNucleus)
 
G4FragmentVectorBreakUpFragment (G4Fragment *theNucleus)
 
virtual void Dump () const
 
virtual void SetICM (G4bool)
 
virtual void RDMForced (G4bool)
 
void SetOPTxs (G4int opt)
 
void UseSICB (G4bool use)
 

Additional Inherited Members

- Protected Attributes inherited from G4VEvaporationChannel
G4int OPTxs
 
G4bool useSICB
 

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 63 of file G4PhotonEvaporation.cc.

64 : fLevelManager(nullptr), fTransition(p), fPolarization(nullptr),
65 fVerbose(1), fPoints(0), vShellNumber(-1), fIndex(0),
66 fMaxLifeTime(DBL_MAX),
67 fICM(true), fRDM(false), fSampleTime(true),
68 fCorrelatedGamma(false), fIsomerFlag(false), isInitialised(false)
69{
70 //G4cout << "### New G4PhotonEvaporation() " << this << G4endl;
71 fNuclearLevelData = G4NuclearLevelData::GetInstance();
72 Tolerance = 20*CLHEP::eV;
73
74 if(!fTransition) { fTransition = new G4GammaTransition(); }
75
76 theA = theZ = fCode = 0;
77 fLevelEnergyMax = fStep = fExcEnergy = fProbability = 0.0;
78
79 for(G4int i=0; i<MAXDEPOINT; ++i) { fCummProbability[i] = 0.0; }
80 if(0.0f == GREnergy[1]) { InitialiseGRData(); }
81}
const G4int MAXDEPOINT
int G4int
Definition: G4Types.hh:85
static G4NuclearLevelData * GetInstance()
#define DBL_MAX
Definition: templates.hh:62

◆ ~G4PhotonEvaporation()

G4PhotonEvaporation::~G4PhotonEvaporation ( )
virtual

Definition at line 83 of file G4PhotonEvaporation.cc.

84{
85 delete fTransition;
86}

◆ G4PhotonEvaporation() [2/2]

G4PhotonEvaporation::G4PhotonEvaporation ( const G4PhotonEvaporation right)
delete

Member Function Documentation

◆ BreakItUp()

G4FragmentVector * G4PhotonEvaporation::BreakItUp ( const G4Fragment theNucleus)

Definition at line 178 of file G4PhotonEvaporation.cc.

179{
180 if(fVerbose > 1) {
181 G4cout << "G4PhotonEvaporation::BreakItUp" << G4endl;
182 }
183 G4Fragment* aNucleus = new G4Fragment(nucleus);
184 G4FragmentVector* products = new G4FragmentVector();
185 BreakUpChain(products, aNucleus);
186 products->push_back(aNucleus);
187 return products;
188}
std::vector< G4Fragment * > G4FragmentVector
Definition: G4Fragment.hh:63
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
virtual G4bool BreakUpChain(G4FragmentVector *theResult, G4Fragment *theNucleus) final

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

◆ BreakUpChain()

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

Reimplemented from G4VEvaporationChannel.

Definition at line 190 of file G4PhotonEvaporation.cc.

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

Referenced by BreakItUp().

◆ EmittedFragment()

G4Fragment * G4PhotonEvaporation::EmittedFragment ( G4Fragment theNucleus)
finalvirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 129 of file G4PhotonEvaporation.cc.

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

Implements G4VEvaporationChannel.

Definition at line 234 of file G4PhotonEvaporation.cc.

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

◆ GetFinalLevelEnergy()

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

Definition at line 319 of file G4PhotonEvaporation.cc.

320{
321 G4double E = energy;
322 InitialiseLevelManager(Z, A);
323 if(fLevelManager) {
324 E = fLevelManager->NearestLevelEnergy(energy, fIndex);
325 if(E > fLevelEnergyMax + Tolerance) { E = energy; }
326 }
327 return E;
328}
G4double NearestLevelEnergy(G4double energy, size_t index=0) const
G4double energy(const ThreeVector &p, const G4double m)

◆ GetUpperLevelEnergy()

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

Definition at line 330 of file G4PhotonEvaporation.cc.

331{
332 InitialiseLevelManager(Z, A);
333 return fLevelEnergyMax;
334}

◆ GetVacantShellNumber()

G4int G4PhotonEvaporation::GetVacantShellNumber ( ) const
inline

Definition at line 171 of file G4PhotonEvaporation.hh.

172{
173 return vShellNumber;
174}

Referenced by G4ITDecay::DecayIt().

◆ Initialise()

void G4PhotonEvaporation::Initialise ( )
finalvirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 88 of file G4PhotonEvaporation.cc.

89{
90 if(isInitialised) { return; }
91 isInitialised = true;
92
93 G4DeexPrecoParameters* param = fNuclearLevelData->GetParameters();
94 Tolerance = param->GetMinExcitation();
95 fMaxLifeTime = param->GetMaxLifeTime();
96 fCorrelatedGamma = param->CorrelatedGamma();
97 fICM = param->GetInternalConversionFlag();
98 fIsomerFlag = param->IsomerProduction();
99 if(fRDM) { fIsomerFlag = true; }
100 fVerbose = param->GetVerbose();
101
102 fTransition->SetPolarizationFlag(fCorrelatedGamma);
103 fTransition->SetTwoJMAX(param->GetTwoJMAX());
104 fTransition->SetVerbose(fVerbose);
105 if(fVerbose > 1) {
106 G4cout << "### G4PhotonEvaporation is initialized " << this << G4endl;
107 }
108}
G4double GetMinExcitation() const
G4bool GetInternalConversionFlag() const
void SetPolarizationFlag(G4bool val)
void SetTwoJMAX(G4int val)
void SetVerbose(G4int val)
G4DeexPrecoParameters * GetParameters()

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

◆ operator=()

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

◆ RDMForced()

void G4PhotonEvaporation::RDMForced ( G4bool  val)
virtual

Reimplemented from G4VEvaporationChannel.

Definition at line 560 of file G4PhotonEvaporation.cc.

561{
562 fRDM = val;
563}

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

◆ SetGammaTransition()

void G4PhotonEvaporation::SetGammaTransition ( G4GammaTransition p)

Definition at line 547 of file G4PhotonEvaporation.cc.

548{
549 if(p != fTransition) {
550 delete fTransition;
551 fTransition = p;
552 }
553}

◆ SetICM()

void G4PhotonEvaporation::SetICM ( G4bool  val)
virtual

◆ SetVerboseLevel()

void G4PhotonEvaporation::SetVerboseLevel ( G4int  verbose)
inline

Definition at line 154 of file G4PhotonEvaporation.hh.

155{
156 fVerbose = verbose;
157}

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