Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GEMChannelVI Class Reference

#include <G4GEMChannelVI.hh>

Inheritance diagram for G4GEMChannelVI:

Public Member Functions

 G4GEMChannelVI (G4int theA, G4int theZ)
 ~G4GEMChannelVI () override
void Initialise () override
G4double ProbabilityDensityFunction (G4double ekin) override
G4double GetEmissionProbability (G4Fragment *theNucleus) override
G4FragmentEmittedFragment (G4Fragment *theNucleus) override
const G4StringModelName () const override
G4double GetCurrentXS ()
void Dump () const override
 G4GEMChannelVI (const G4GEMChannelVI &right)=delete
const G4GEMChannelVIoperator= (const G4GEMChannelVI &right)=delete
G4bool operator== (const G4GEMChannelVI &right) const =delete
G4bool operator!= (const G4GEMChannelVI &right) const =delete
Public Member Functions inherited from G4VEvaporationChannel
 G4VEvaporationChannel (const G4String &aName="")
virtual ~G4VEvaporationChannel ()=default
virtual G4double GetLifeTime (G4Fragment *theNucleus)
virtual G4bool BreakUpChain (G4FragmentVector *theResult, G4Fragment *theNucleus)
G4FragmentVectorBreakUpFragment (G4Fragment *theNucleus)
virtual G4double ComputeInverseXSection (G4Fragment *theNucleus, G4double kinEnergy)
virtual G4double ComputeProbability (G4Fragment *theNucleus, G4double kinEnergy)
virtual void SetICM (G4bool)
virtual void RDMForced (G4bool)
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
Public Member Functions inherited from G4VSIntegration
 G4VSIntegration ()=default
virtual ~G4VSIntegration ()=default
void InitialiseIntegrator (G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)
G4double ComputeIntegral (const G4double emin, const G4double emax)
G4double SampleValue ()
 G4VSIntegration (const G4VSIntegration &)=delete
G4VSIntegrationoperator= (const G4VSIntegration &)=delete
G4bool operator== (const G4VSIntegration &right) const =delete
G4bool operator!= (const G4VSIntegration &right) const =delete
void SetVerbose (G4int verb)

Additional Inherited Members

Protected Attributes inherited from G4VEvaporationChannel
G4int OPTxs {3}
G4bool useSICB {true}

Detailed Description

Definition at line 44 of file G4GEMChannelVI.hh.

Constructor & Destructor Documentation

◆ G4GEMChannelVI() [1/2]

G4GEMChannelVI::G4GEMChannelVI ( G4int theA,
G4int theZ )
explicit

Definition at line 65 of file G4GEMChannelVI.cc.

66 : evapA(theA), evapZ(theZ)
67{
69 pairingCorrection = nData->GetPairingCorrection();
70 if (evapZ > 2) { lManagerEvap = nData->GetLevelManager(evapZ, evapA); }
71 fEvapMass = G4NucleiProperties::GetNuclearMass(evapA, evapZ);
72 fEvapMass2 = fEvapMass*fEvapMass;
73
74 cBarrier = new G4CoulombBarrier(evapA, evapZ);
75
76 fTolerance = 10*CLHEP::keV;
77 fCoeff = fEvapMass/((CLHEP::pi*CLHEP::hbarc)*(CLHEP::pi*CLHEP::hbarc));
78
79 std::ostringstream ss;
80 ss << "GEMVI_" << "Z" << evapZ << "_A" << evapA;
81 fModelName = ss.str();
82
83 fNeutron = G4Neutron::Neutron();
84 fProton = G4Proton::Proton();
85
86 secID = G4PhysicsModelCatalog::GetModelID("model_G4GEMChannelVI");
87 const G4ParticleDefinition* part = nullptr;
88 if (evapZ == 0 && evapA == 1) {
89 indexC = 0;
90 fCoeff *= 2.0;
91 part = fNeutron;
92 } else if (evapZ == 1 && evapA == 1) {
93 indexC = 1;
94 fCoeff *= 2.0;
95 part = fProton;
96 } else if (evapZ == 1 && evapA == 2) {
97 indexC = 2;
98 fCoeff *= 3.0;
99 part = G4Deuteron::Deuteron();
100 } else if (evapZ == 1 && evapA == 3) {
101 indexC = 3;
102 fCoeff *= 2.0;
103 part = G4Triton::Triton();
104 } else if (evapZ == 2 && evapA == 3) {
105 indexC = 4;
106 fCoeff *= 2.0;
107 part = G4He3::He3();
108 } else if (evapZ == 2 && evapA == 4) {
109 indexC = 5;
110 part = G4Alpha::Alpha();
111 } else {
112 G4int N = evapA - evapZ;
113 fCoeff *= (1 + (evapZ - 2*(evapZ/2)))*(1 + (N - 2*(N/2)));
114 }
115 g4pow = G4Pow::GetInstance();
116
117 G4double de = (0 == indexC) ? 0.15*CLHEP::MeV : 0.25*CLHEP::MeV;
118 InitialiseIntegrator(0.01, 0.25, 1.3, de, 0.1*CLHEP::MeV, 2*CLHEP::MeV);
119
120 if (indexC <= 6) { fXSection = new G4InterfaceToXS(part, indexC); }
121}
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
static G4Alpha * Alpha()
Definition G4Alpha.cc:83
static G4Deuteron * Deuteron()
Definition G4Deuteron.cc:90
static G4He3 * He3()
Definition G4He3.cc:90
static G4Neutron * Neutron()
Definition G4Neutron.cc:101
static G4NuclearLevelData * GetInstance()
static G4double GetNuclearMass(const G4double A, const G4double Z)
static G4int GetModelID(const G4int modelIndex)
static G4Pow * GetInstance()
Definition G4Pow.cc:41
static G4Proton * Proton()
Definition G4Proton.cc:90
static G4Triton * Triton()
Definition G4Triton.cc:90
void InitialiseIntegrator(G4double accuracy, G4double fact1, G4double fact2, G4double de, G4double dmin, G4double dmax)
#define N
Definition crc32.c:57

Referenced by G4GEMChannelVI(), operator!=(), operator=(), and operator==().

◆ ~G4GEMChannelVI()

G4GEMChannelVI::~G4GEMChannelVI ( )
override

Definition at line 123 of file G4GEMChannelVI.cc.

124{
125 delete cBarrier;
126 delete fXSection;
127}

◆ G4GEMChannelVI() [2/2]

G4GEMChannelVI::G4GEMChannelVI ( const G4GEMChannelVI & right)
delete

Member Function Documentation

◆ Dump()

void G4GEMChannelVI::Dump ( ) const
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 350 of file G4GEMChannelVI.cc.

351{}

◆ EmittedFragment()

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

Reimplemented from G4VEvaporationChannel.

Definition at line 257 of file G4GEMChannelVI.cc.

258{
259 // assumed, that TotalProbability(...) was already called
260 // if value iz zero no possiblity to sample final state
261 G4Fragment* evFragment = nullptr;
262 lManagerRes = nData->GetLevelManager(resZ, resA);
263 G4double e2 = fMass - fEvapMass - fResMass;
264 fEvapExc = 0.0;
265
266 // sample excitation of the evaporation fragment
267 if (nProbEvap > 1) {
268 G4double q = prob[nProbEvap - 1];
269 if (q > 0.0) {
270 q *= G4UniformRand();
271 for (G4int i=0; i < nProbEvap; ++i) {
272 if (q <= prob[i]) {
273 if (0 == i) { break; }
274 G4double e1 = fDeltaEvap*((i - 1) + (q - prob[i - 1])/(prob[i] - prob[i - 1]));
275 fEvapExc = CorrectExcitation(e1, lManagerEvap);
276 e2 -= fEvapExc;
277 e2 = std::max(e2, 0.0);
278 }
279 }
280 }
281 }
282 if (ComputeIntegral(0.5*bCoulomb, e2) <= 0.0) { return evFragment; }
283
284 // sample free energy
285 G4double e = SampleValue();
286 // compute excitation of the residual fragment
287 fResExc = CorrectExcitation(e2 - e, lManagerRes);
288
289 // final kinematics
290 G4double m1 = fEvapMass + fEvapExc;
291 G4double m2 = fResMass + fResExc;
292
293 G4double ekin = 0.5*e*(e + 2*m2)/(e + m1 + m2);
294 G4LorentzVector lv(std::sqrt(ekin*(ekin + 2.0*m1))
295 *G4RandomDirection(), ekin + m1);
296 G4LorentzVector lv0 = theNucleus->GetMomentum();
297 lv.boost(lv0.boostVector());
298 evFragment = new G4Fragment(evapA, evapZ, lv);
299 evFragment->SetCreatorModelID(secID);
300
301 // residual
302 lv0 -= lv;
303 theNucleus->SetZandA_asInt(resZ, resA);
304 theNucleus->SetMomentum(lv0);
305 theNucleus->SetCreatorModelID(secID);
306
307 return evFragment;
308}
CLHEP::HepLorentzVector G4LorentzVector
G4ThreeVector G4RandomDirection()
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void SetZandA_asInt(G4int Znew, G4int Anew, G4int Lnew=0)
const G4LorentzVector & GetMomentum() const
void SetCreatorModelID(G4int value)
void SetMomentum(const G4LorentzVector &value)
G4double ComputeIntegral(const G4double emin, const G4double emax)

◆ GetCurrentXS()

G4double G4GEMChannelVI::GetCurrentXS ( )
inline

Definition at line 62 of file G4GEMChannelVI.hh.

62{ return recentXS; };

◆ GetEmissionProbability()

G4double G4GEMChannelVI::GetEmissionProbability ( G4Fragment * theNucleus)
overridevirtual

Implements G4VEvaporationChannel.

Definition at line 134 of file G4GEMChannelVI.cc.

135{
136 fragZ = fragment->GetZ_asInt();
137 fragA = fragment->GetA_asInt();
138 resZ = fragZ - evapZ;
139 resA = fragA - evapA;
140 // G4cout << "G4GEMChannelVI::GetEmissionProbability Z=" << evapZ << " A=" << evapA << " resZ=" << resZ << " resA=" << resA << G4endl;
141 // to avoid double counting
142 if (resA < evapA || resA < resZ || resZ < 1 ||
143 (resA == evapA && resZ < evapZ)) { return 0.0; }
144
145 fFragExc = fragment->GetExcitationEnergy();
146 fMass = fragment->GetGroundStateMass() + fFragExc;
147 fResMass = G4NucleiProperties::GetNuclearMass(resA, resZ);
148 fResA13 = g4pow->Z13(resA);
149 xsfactor = g4pow->Z23(fragA)/g4pow->Z23(resA);
150
151 // limit for the case when both evaporation and residual
152 // fragments are in ground states
153 if (fMass <= fEvapMass + fResMass) { return 0.0; }
154
155 a0 = G4DeexPrecoUtility::LevelDensity(fragZ, fragA, indexC);
156 delta0 = nData->GetPairingCorrection(fragZ, fragA);
157 delta1 = nData->GetPairingCorrection(resZ, resA);
158 fE0 = std::max(fFragExc - delta0, 0.0);
159
160 if (indexC > 0) {
161 bCoulomb = cBarrier->GetCoulombBarrier(resA, resZ, fFragExc);
162 }
163 G4double elim = 0.5*bCoulomb;
164 G4double de = fMass - fEvapMass - fResMass - elim;
165 if (de < fTolerance) { return 0.0; }
166 nProbEvap = 1;
167 fDeltaEvap = de;
168 if (7 == indexC) {
169 G4int n = (G4int)(de/dExc) + 1;
170 nProbEvap = std::min(n, nProbMax);
171 if (nProbEvap > 1) { fDeltaEvap /= (G4double)(nProbEvap - 1); }
172 }
173
174 if (2 < fVerbose) {
175 G4cout << "## G4GEMChannelVI::GetEmissionProbability fragZ="
176 << fragZ << " fragA=" << fragA << " Z=" << evapZ << " A=" << evapA
177 << " Eex(MeV)=" << fFragExc << " nProbEvap=" << nProbEvap
178 << " nProbRes=" << nProbRes << " CB=" << bCoulomb
179 << " Elim=" << fEnergyLimitXS << " XSfac=" << xsfactor << G4endl;
180 }
181
182 // m1 is the mass of emitted excited fragment
183 // e2 - free energy in the 2-body decay
184 G4double sump = 0.0;
185 for (G4int i = 0; i < nProbEvap; ++i) {
186 fEvapExc = fDeltaEvap*i;
187 G4double m1 = fEvapMass + fEvapExc;
188 G4double e2 = fMass - m1 - fResMass;
189 e2 = std::max(e2, 0.0);
190 if (e2 <= elim + fTolerance) {
191 nProbEvap = i + 1;
192 prob[i] = sump;
193 break;
194 }
195 G4double p = ComputeIntegral(elim, e2);
196 sump += p;
197 prob[i] = sump;
198 if (2 < fVerbose) {
199 G4cout << i << ". e1=" << elim << " e2=" << e2 << " e2-e1="
200 << e2 - elim << " fEvapExc=" << fEvapExc
201 << " Probability=" << p << G4endl;
202 }
203 }
204 if (nProbEvap > 1) { sump /= (G4double)nProbEvap; }
205 return sump;
206}
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
static G4double LevelDensity(const G4int Z, const G4int A, const G4int index)

◆ Initialise()

void G4GEMChannelVI::Initialise ( )
overridevirtual

Reimplemented from G4VEvaporationChannel.

Definition at line 129 of file G4GEMChannelVI.cc.

◆ ModelName()

const G4String & G4GEMChannelVI::ModelName ( ) const
overridevirtual

Reimplemented from G4VSIntegration.

Definition at line 345 of file G4GEMChannelVI.cc.

346{
347 return fModelName;
348}

◆ operator!=()

G4bool G4GEMChannelVI::operator!= ( const G4GEMChannelVI & right) const
delete

◆ operator=()

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

◆ operator==()

G4bool G4GEMChannelVI::operator== ( const G4GEMChannelVI & right) const
delete

◆ ProbabilityDensityFunction()

G4double G4GEMChannelVI::ProbabilityDensityFunction ( G4double ekin)
overridevirtual

Implements G4VSIntegration.

Definition at line 208 of file G4GEMChannelVI.cc.

209{
210 // e is free energy
211 G4double m1 = fEvapMass + fEvapExc;
212 fResExc = fMass - m1 - fResMass - e;
213 if (fResExc < 0.0 || 0.0 == e) { return 0.0; }
214 fE1 = std::max(fResExc - delta1, 0.0);
215 a1 = G4DeexPrecoUtility::LevelDensity(resZ, resA, indexC);
216 G4double m2 = fResMass + fResExc;
217 G4double elab = 0.5*(fMass + m1 + m2)*(fMass - m1 - m2)/m2;
218 G4double xs = CrossSection(elab);
219 G4double res =
220 fCoeff*G4Exp(2.0*(std::sqrt(a1*fE1) - std::sqrt(a0*fE0)))*e*xs;
221
222 //G4cout << "e=" << e << " elab=" << elab << " xs(mb)="
223 // << xs/CLHEP::millibarn << " prob=" << res << G4endl;
224 return res;
225}
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:132

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