Geant4 11.4.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)
 ~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 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}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4NuclearLevelData * GetInstance()
static G4int GetModelID(const G4int modelIndex)

Referenced by G4PhotonEvaporation(), and operator=().

◆ ~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 172 of file G4PhotonEvaporation.cc.

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

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}

Referenced by BreakItUp().

◆ ComputeInverseXSection()

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

Reimplemented from G4VEvaporationChannel.

Definition at line 321 of file G4PhotonEvaporation.cc.

322{
323 return 0.0;
324}

◆ ComputeProbability()

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

Reimplemented from G4VEvaporationChannel.

Definition at line 327 of file G4PhotonEvaporation.cc.

328{
329 return GetEmissionProbability(theNucleus);
330}
G4double GetEmissionProbability(G4Fragment *theNucleus) override

◆ EmittedFragment()

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

Reimplemented from G4VEvaporationChannel.

Definition at line 118 of file G4PhotonEvaporation.cc.

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}
static G4NuclearPolarizationStore * GetInstance()
void RemoveMe(G4NuclearPolarization *ptr)
G4NuclearPolarization * FindOrBuild(G4int Z, G4int A, G4double Eexc)

◆ GetEmissionProbability()

G4double G4PhotonEvaporation::GetEmissionProbability ( G4Fragment * theNucleus)
overridevirtual

Implements G4VEvaporationChannel.

Definition at line 231 of file G4PhotonEvaporation.cc.

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}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4double A[17]

Referenced by ComputeProbability().

◆ GetFinalLevelEnergy()

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

Definition at line 333 of file G4PhotonEvaporation.cc.

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}
G4double energy(const ThreeVector &p, const G4double m)

◆ GetUpperLevelEnergy()

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

Definition at line 344 of file G4PhotonEvaporation.cc.

345{
346 InitialiseLevelManager(Z, A);
347 return fLevelEnergyMax;
348}

◆ GetVacantShellNumber()

G4int G4PhotonEvaporation::GetVacantShellNumber ( ) const
inline

Definition at line 168 of file G4PhotonEvaporation.hh.

169{
170 return vShellNumber;
171}

◆ 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 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}
G4bool GetInternalConversionFlag() const

Referenced by BreakUpChain(), EmittedFragment(), GetEmissionProbability(), and G4NuDEXNeutronCaptureModel::InitialiseModel().

◆ operator=()

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

◆ RDMForced()

void G4PhotonEvaporation::RDMForced ( G4bool val)
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 621 of file G4PhotonEvaporation.cc.

622{
623 fRDM = val;
624}

◆ SetGammaTransition()

void G4PhotonEvaporation::SetGammaTransition ( G4GammaTransition * p)

Definition at line 608 of file G4PhotonEvaporation.cc.

609{
610 if(p != fTransition) {
611 delete fTransition;
612 fTransition = p;
613 }
614}

◆ SetICM()

void G4PhotonEvaporation::SetICM ( G4bool val)
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 616 of file G4PhotonEvaporation.cc.

617{
618 fICM = val;
619}

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

◆ 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: