Geant4-11
Public Member Functions | Private Member Functions | Private Attributes
G4PreCompoundEmission Class Reference

#include <G4PreCompoundEmission.hh>

Public Member Functions

 G4PreCompoundEmission ()
 
G4double GetTotalProbability (const G4Fragment &aFragment)
 
G4ReactionProductPerformEmission (G4Fragment &aFragment)
 
void SetDefaultModel ()
 
void SetHETCModel ()
 
void SetOPTxs (G4int)
 
void UseSICB (G4bool)
 
 ~G4PreCompoundEmission ()
 

Private Member Functions

void AngularDistribution (G4VPreCompoundFragment *theFragment, const G4Fragment &aFragment, G4double KineticEnergy)
 
 G4PreCompoundEmission (const G4PreCompoundEmission &right)
 
G4bool operator!= (const G4PreCompoundEmission &right) const
 
const G4PreCompoundEmissionoperator= (const G4PreCompoundEmission &right)
 
G4bool operator== (const G4PreCompoundEmission &right) const
 
G4double rho (G4int p, G4int h, G4double gg, G4double E, G4double Ef) const
 

Private Attributes

G4double fFermiEnergy
 
G4int fModelID
 
G4NuclearLevelDatafNuclData
 
G4bool fUseAngularGenerator
 
G4Powg4calc
 
G4ThreeVector theFinalMomentum
 
G4VPreCompoundEmissionFactorytheFragmentsFactory
 
G4PreCompoundFragmentVectortheFragmentsVector
 

Detailed Description

Definition at line 50 of file G4PreCompoundEmission.hh.

Constructor & Destructor Documentation

◆ G4PreCompoundEmission() [1/2]

G4PreCompoundEmission::G4PreCompoundEmission ( )

Definition at line 60 of file G4PreCompoundEmission.cc.

61{
71}
G4DeexPrecoParameters * GetParameters()
static G4NuclearLevelData * GetInstance()
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4NuclearLevelData * fNuclData
G4PreCompoundFragmentVector * theFragmentsVector
G4VPreCompoundEmissionFactory * theFragmentsFactory
std::vector< G4VPreCompoundFragment * > * GetFragmentVector()

References fFermiEnergy, fModelID, fNuclData, fUseAngularGenerator, g4calc, G4DeexPrecoParameters::GetFermiEnergy(), G4VPreCompoundEmissionFactory::GetFragmentVector(), G4Pow::GetInstance(), G4NuclearLevelData::GetInstance(), G4PhysicsModelCatalog::GetModelID(), G4NuclearLevelData::GetParameters(), theFragmentsFactory, theFragmentsVector, and G4DeexPrecoParameters::UseAngularGen().

◆ ~G4PreCompoundEmission()

G4PreCompoundEmission::~G4PreCompoundEmission ( )

Definition at line 73 of file G4PreCompoundEmission.cc.

74{
75 delete theFragmentsFactory;
76 delete theFragmentsVector;
77}

References theFragmentsFactory, and theFragmentsVector.

◆ G4PreCompoundEmission() [2/2]

G4PreCompoundEmission::G4PreCompoundEmission ( const G4PreCompoundEmission right)
private

Member Function Documentation

◆ AngularDistribution()

void G4PreCompoundEmission::AngularDistribution ( G4VPreCompoundFragment theFragment,
const G4Fragment aFragment,
G4double  KineticEnergy 
)
private

Definition at line 180 of file G4PreCompoundEmission.cc.

184{
185 G4int p = aFragment.GetNumberOfParticles();
186 G4int h = aFragment.GetNumberOfHoles();
187 G4double U = aFragment.GetExcitationEnergy();
188
189 // Emission particle separation energy
190 G4double Bemission = thePreFragment->GetBindingEnergy();
191
192 G4double gg = (6.0/pi2)*fNuclData->GetLevelDensity(aFragment.GetZ_asInt(),
193 aFragment.GetA_asInt(),U);
194
195 // Average exciton energy relative to bottom of nuclear well
196 G4double Eav = 2*p*(p+1)/((p+h)*gg);
197
198 // Excitation energy relative to the Fermi Level
199 G4double Uf = std::max(U - (p - h)*fFermiEnergy , 0.0);
200 // G4double Uf = U - KineticEnergyOfEmittedFragment - Bemission;
201
202 G4double w_num = rho(p+1, h, gg, Uf, fFermiEnergy);
203 G4double w_den = rho(p, h, gg, Uf, fFermiEnergy);
204 if (w_num > 0.0 && w_den > 0.0)
205 {
206 Eav *= (w_num/w_den);
207 Eav += - Uf/(p+h) + fFermiEnergy;
208 }
209 else
210 {
211 Eav = fFermiEnergy;
212 }
213
214 // VI + JMQ 19/01/2010 update computation of the parameter an
215 //
216 G4double an = 0.0;
217 G4double Eeff = ekin + Bemission + fFermiEnergy;
218 if(ekin > DBL_MIN && Eeff > DBL_MIN) {
219
220 G4double zeta = std::max(1.0,9.3/std::sqrt(ekin/CLHEP::MeV));
221
222 // This should be the projectile energy. If I would know which is
223 // the projectile (proton, neutron) I could remove the binding energy.
224 // But, what happens if INC precedes precompound? This approximation
225 // seems to work well enough
226 G4double ProjEnergy = aFragment.GetExcitationEnergy();
227
228 an = 3*std::sqrt((ProjEnergy+fFermiEnergy)*Eeff)/(zeta*Eav);
229
230 G4int ne = aFragment.GetNumberOfExcitons() - 1;
231 if ( ne > 1 ) { an /= static_cast<G4double>(ne); }
232
233 // protection of exponent
234 if ( an > 10. ) { an = 10.; }
235 }
236
237 // sample cosine of theta and not theta as in old versions
238 G4double random = G4UniformRand();
239 G4double cost;
240
241 if(an < 0.1) { cost = 1. - 2*random; }
242 else {
243 G4double exp2an = G4Exp(-2*an);
244 cost = 1. + G4Log(1-random*(1-exp2an))/an;
245 if(cost > 1.) { cost = 1.; }
246 else if(cost < -1.) {cost = -1.; }
247 }
248
250
251 // Calculate the momentum magnitude of emitted fragment
252 G4double pmag =
253 std::sqrt(ekin*(ekin + 2.0*thePreFragment->GetNuclearMass()));
254
255 G4double sint = std::sqrt((1.0-cost)*(1.0+cost));
256
257 theFinalMomentum.set(pmag*std::cos(phi)*sint,pmag*std::sin(phi)*sint,
258 pmag*cost);
259
260 // theta is the angle wrt the incident direction
261 G4ThreeVector theIncidentDirection = aFragment.GetMomentum().vect().unit();
262 theFinalMomentum.rotateUz(theIncidentDirection);
263}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
G4double G4Log(G4double x)
Definition: G4Log.hh:226
static constexpr double pi2
Definition: G4SIunits.hh:58
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector unit() const
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
Definition: ThreeVector.cc:33
Hep3Vector vect() const
G4int GetNumberOfParticles() const
Definition: G4Fragment.hh:361
G4int GetNumberOfHoles() const
Definition: G4Fragment.hh:381
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:299
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:323
G4int GetZ_asInt() const
Definition: G4Fragment.hh:276
G4int GetNumberOfExcitons() const
Definition: G4Fragment.hh:356
G4int GetA_asInt() const
Definition: G4Fragment.hh:271
G4double GetLevelDensity(G4int Z, G4int A, G4double U)
G4double rho(G4int p, G4int h, G4double gg, G4double E, G4double Ef) const
static constexpr double twopi
Definition: SystemOfUnits.h:56
static constexpr double MeV
T max(const T t1, const T t2)
brief Return the largest of the two arguments
#define DBL_MIN
Definition: templates.hh:54

References G4InuclParticleNames::an, DBL_MIN, fFermiEnergy, fNuclData, G4Exp(), G4Log(), G4UniformRand, G4Fragment::GetA_asInt(), G4VPreCompoundFragment::GetBindingEnergy(), G4Fragment::GetExcitationEnergy(), G4NuclearLevelData::GetLevelDensity(), G4Fragment::GetMomentum(), G4VPreCompoundFragment::GetNuclearMass(), G4Fragment::GetNumberOfExcitons(), G4Fragment::GetNumberOfHoles(), G4Fragment::GetNumberOfParticles(), G4Fragment::GetZ_asInt(), G4INCL::Math::max(), CLHEP::MeV, pi2, rho(), CLHEP::Hep3Vector::rotateUz(), CLHEP::Hep3Vector::set(), theFinalMomentum, CLHEP::twopi, CLHEP::Hep3Vector::unit(), and CLHEP::HepLorentzVector::vect().

Referenced by PerformEmission().

◆ GetTotalProbability()

G4double G4PreCompoundEmission::GetTotalProbability ( const G4Fragment aFragment)
inline

Definition at line 105 of file G4PreCompoundEmission.hh.

106{
108}
G4double CalculateProbabilities(const G4Fragment &aFragment)

References G4PreCompoundFragmentVector::CalculateProbabilities(), and theFragmentsVector.

Referenced by G4PreCompoundModel::DeExcite().

◆ operator!=()

G4bool G4PreCompoundEmission::operator!= ( const G4PreCompoundEmission right) const
private

◆ operator=()

const G4PreCompoundEmission & G4PreCompoundEmission::operator= ( const G4PreCompoundEmission right)
private

◆ operator==()

G4bool G4PreCompoundEmission::operator== ( const G4PreCompoundEmission right) const
private

◆ PerformEmission()

G4ReactionProduct * G4PreCompoundEmission::PerformEmission ( G4Fragment aFragment)

Definition at line 104 of file G4PreCompoundEmission.cc.

105{
106 // Choose a Fragment for emission
107 G4VPreCompoundFragment * thePreFragment =
109 if (thePreFragment == nullptr)
110 {
111 G4cout << "G4PreCompoundEmission::PerformEmission : "
112 << "I couldn't choose a fragment\n"
113 << "while trying to de-excite\n"
114 << aFragment << G4endl;
115 throw G4HadronicException(__FILE__, __LINE__, "");
116 }
117
118 //G4cout << "Chosen fragment: " << G4endl;
119 //G4cout << *thePreFragment << G4endl;
120
121 // Kinetic Energy of emitted fragment
122 G4double kinEnergy = thePreFragment->SampleKineticEnergy(aFragment);
123 kinEnergy = std::max(kinEnergy, 0.0);
124
125 // Calculate the fragment momentum (three vector)
127 AngularDistribution(thePreFragment,aFragment,kinEnergy);
128 } else {
129 G4double pmag =
130 std::sqrt(kinEnergy*(kinEnergy + 2.0*thePreFragment->GetNuclearMass()));
132 }
133
134 // Mass of emittef fragment
135 G4double EmittedMass = thePreFragment->GetNuclearMass();
136 // Now we can calculate the four momentum
137 // both options are valid and give the same result but 2nd one is faster
138 G4LorentzVector Emitted4Momentum(theFinalMomentum,EmittedMass + kinEnergy);
139
140 // Perform Lorentz boost
141 G4LorentzVector Rest4Momentum = aFragment.GetMomentum();
142 Emitted4Momentum.boost(Rest4Momentum.boostVector());
143
144 // Set emitted fragment momentum
145 thePreFragment->SetMomentum(Emitted4Momentum);
146
147 // NOW THE RESIDUAL NUCLEUS
148 // ------------------------
149
150 Rest4Momentum -= Emitted4Momentum;
151
152 // Update nucleus parameters:
153 // --------------------------
154
155 // Z and A
156 aFragment.SetZandA_asInt(thePreFragment->GetRestZ(),
157 thePreFragment->GetRestA());
158
159 // Number of excitons
160 aFragment.SetNumberOfParticles(aFragment.GetNumberOfParticles()-
161 thePreFragment->GetA());
162 // Number of charges
163 aFragment.SetNumberOfCharged(aFragment.GetNumberOfCharged()-
164 thePreFragment->GetZ());
165
166 // Update nucleus momentum
167 // A check on consistence of Z, A, and mass will be performed
168 aFragment.SetMomentum(Rest4Momentum);
169
170 // Create a G4ReactionProduct
171 G4ReactionProduct * MyRP = thePreFragment->GetReactionProduct();
172
173 // Set the creator model ID
174 aFragment.SetCreatorModelID(fModelID);
175 if (MyRP != nullptr) MyRP->SetCreatorModelID(fModelID);
176
177 return MyRP;
178}
G4ThreeVector G4RandomDirection()
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void SetNumberOfCharged(G4int value)
Definition: G4Fragment.hh:405
void SetCreatorModelID(G4int value)
Definition: G4Fragment.hh:428
void SetMomentum(const G4LorentzVector &value)
Definition: G4Fragment.hh:328
void SetNumberOfParticles(G4int value)
Definition: G4Fragment.hh:400
G4int GetNumberOfCharged() const
Definition: G4Fragment.hh:366
void SetZandA_asInt(G4int Znew, G4int Anew)
Definition: G4Fragment.hh:281
void AngularDistribution(G4VPreCompoundFragment *theFragment, const G4Fragment &aFragment, G4double KineticEnergy)
G4VPreCompoundFragment * ChooseFragment()
void SetCreatorModelID(const G4int mod)
virtual G4double SampleKineticEnergy(const G4Fragment &aFragment)=0
G4double GetNuclearMass() const
G4int GetRestZ() const
G4ReactionProduct * GetReactionProduct() const
void SetMomentum(const G4LorentzVector &value)
G4int GetRestA() const

References AngularDistribution(), CLHEP::HepLorentzVector::boost(), CLHEP::HepLorentzVector::boostVector(), G4PreCompoundFragmentVector::ChooseFragment(), fModelID, fUseAngularGenerator, G4cout, G4endl, G4RandomDirection(), G4VPreCompoundFragment::GetA(), G4Fragment::GetMomentum(), G4VPreCompoundFragment::GetNuclearMass(), G4Fragment::GetNumberOfCharged(), G4Fragment::GetNumberOfParticles(), G4VPreCompoundFragment::GetReactionProduct(), G4VPreCompoundFragment::GetRestA(), G4VPreCompoundFragment::GetRestZ(), G4VPreCompoundFragment::GetZ(), G4INCL::Math::max(), G4VPreCompoundFragment::SampleKineticEnergy(), G4ReactionProduct::SetCreatorModelID(), G4Fragment::SetCreatorModelID(), G4VPreCompoundFragment::SetMomentum(), G4Fragment::SetMomentum(), G4Fragment::SetNumberOfCharged(), G4Fragment::SetNumberOfParticles(), G4Fragment::SetZandA_asInt(), theFinalMomentum, and theFragmentsVector.

Referenced by G4PreCompoundModel::DeExcite().

◆ rho()

G4double G4PreCompoundEmission::rho ( G4int  p,
G4int  h,
G4double  gg,
G4double  E,
G4double  Ef 
) const
private

Definition at line 265 of file G4PreCompoundEmission.cc.

267{
268 // 25.02.2010 V.Ivanchenko added more protections
269 G4double Aph = (p*p + h*h + p - 3.0*h)/(4.0*gg);
270
271 if ( E - Aph < 0.0) { return 0.0; }
272
273 G4double logConst = (p+h)*G4Log(gg)
274 - g4calc->logfactorial(p+h-1) - g4calc->logfactorial(p)
275 - g4calc->logfactorial(h);
276
277 // initialise values using j=0
278
279 G4double t1=1;
280 G4double t2=1;
281 G4double logt3 = (p+h-1) * G4Log(E-Aph) + logConst;
282 const G4double logmax = 200.;
283 if(logt3 > logmax) { logt3 = logmax; }
284 G4double tot = G4Exp( logt3 );
285
286 // and now sum rest of terms
287 // 25.02.2010 V.Ivanchenko change while to for loop and cleanup
288 G4double Eeff = E - Aph;
289 for(G4int j=1; j<=h; ++j)
290 {
291 Eeff -= Ef;
292 if(Eeff < 0.0) { break; }
293 t1 *= -1.;
294 t2 *= static_cast<G4double>(h+1-j)/static_cast<G4double>(j);
295 logt3 = (p+h-1) * G4Log( Eeff) + logConst;
296 if(logt3 > logmax) { logt3 = logmax; }
297 tot += t1*t2*G4Exp(logt3);
298 }
299
300 return tot;
301}
G4double logfactorial(G4int Z) const
Definition: G4Pow.hh:237

References g4calc, G4Exp(), G4Log(), and G4Pow::logfactorial().

Referenced by AngularDistribution().

◆ SetDefaultModel()

void G4PreCompoundEmission::SetDefaultModel ( )

◆ SetHETCModel()

void G4PreCompoundEmission::SetHETCModel ( )

◆ SetOPTxs()

void G4PreCompoundEmission::SetOPTxs ( G4int  opt)
inline

◆ UseSICB()

void G4PreCompoundEmission::UseSICB ( G4bool  use)
inline

Field Documentation

◆ fFermiEnergy

G4double G4PreCompoundEmission::fFermiEnergy
private

Definition at line 91 of file G4PreCompoundEmission.hh.

Referenced by AngularDistribution(), and G4PreCompoundEmission().

◆ fModelID

G4int G4PreCompoundEmission::fModelID
private

Definition at line 101 of file G4PreCompoundEmission.hh.

Referenced by G4PreCompoundEmission(), and PerformEmission().

◆ fNuclData

G4NuclearLevelData* G4PreCompoundEmission::fNuclData
private

Definition at line 89 of file G4PreCompoundEmission.hh.

Referenced by AngularDistribution(), and G4PreCompoundEmission().

◆ fUseAngularGenerator

G4bool G4PreCompoundEmission::fUseAngularGenerator
private

Definition at line 99 of file G4PreCompoundEmission.hh.

Referenced by G4PreCompoundEmission(), and PerformEmission().

◆ g4calc

G4Pow* G4PreCompoundEmission::g4calc
private

Definition at line 88 of file G4PreCompoundEmission.hh.

Referenced by G4PreCompoundEmission(), and rho().

◆ theFinalMomentum

G4ThreeVector G4PreCompoundEmission::theFinalMomentum
private

Definition at line 98 of file G4PreCompoundEmission.hh.

Referenced by AngularDistribution(), and PerformEmission().

◆ theFragmentsFactory

G4VPreCompoundEmissionFactory* G4PreCompoundEmission::theFragmentsFactory
private

◆ theFragmentsVector

G4PreCompoundFragmentVector* G4PreCompoundEmission::theFragmentsVector
private

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