Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4GEMChannel.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27// Hadronic Process: Nuclear De-excitations
28// by V. Lara (Oct 1998)
29//
30// J. M. Quesada (September 2009) bugs fixed in probability distribution for kinetic
31// energy sampling:
32// -hbarc instead of hbar_Planck (BIG BUG)
33// -quantities for initial nucleus and residual are calculated separately
34// V.Ivanchenko (September 2009) Added proper protection for unphysical final state
35// J. M. Quesada (October 2009) fixed bug in CoulombBarrier calculation
36
37#include "G4GEMChannel.hh"
38#include "G4VCoulombBarrier.hh"
42#include "G4SystemOfUnits.hh"
43#include "G4Pow.hh"
44#include "G4Log.hh"
45#include "G4Exp.hh"
46#include "G4RandomDirection.hh"
47
49 G4GEMProbability * aEmissionStrategy) :
51 A(theA),
52 Z(theZ),
53 EmissionProbability(0.0),
54 MaximalKineticEnergy(-CLHEP::GeV),
55 theEvaporationProbabilityPtr(aEmissionStrategy)
56{
57 theCoulombBarrierPtr = new G4GEMCoulombBarrier(theA, theZ);
58 theEvaporationProbabilityPtr->SetCoulomBarrier(theCoulombBarrierPtr);
59 theLevelDensityPtr = new G4EvaporationLevelDensityParameter;
60 MyOwnLevelDensity = true;
61 EvaporatedMass = G4NucleiProperties::GetNuclearMass(A, Z);
62 ResidualMass = CoulombBarrier = 0.0;
63 fG4pow = G4Pow::GetInstance();
64 ResidualZ = ResidualA = 0;
66}
67
69{
70 if (MyOwnLevelDensity) { delete theLevelDensityPtr; }
71 delete theCoulombBarrierPtr;
72}
73
75{
76 G4int anA = fragment->GetA_asInt();
77 G4int aZ = fragment->GetZ_asInt();
78 ResidualA = anA - A;
79 ResidualZ = aZ - Z;
80 /*
81 G4cout << "G4GEMChannel: Z= " << Z << " A= " << A
82 << " FragmentZ= " << aZ << " FragmentA= " << anA
83 << " Zres= " << ResidualZ << " Ares= " << ResidualA
84 << G4endl;
85 */
86 // We only take into account channels which are physically allowed
87 EmissionProbability = 0.0;
88
89 // Only channels which are physically allowed are taken into account
90 if (ResidualA >= ResidualZ && ResidualZ >= 0 && ResidualA >= A) {
91
92 //Effective excitation energy
93 G4double ExEnergy = fragment->GetExcitationEnergy()
94 - fNucData->GetPairingCorrection(aZ, anA);
95 if(ExEnergy > 0.0) {
96 ResidualMass = G4NucleiProperties::GetNuclearMass(ResidualA, ResidualZ);
97 G4double FragmentMass = fragment->GetGroundStateMass();
98 G4double Etot = FragmentMass + ExEnergy;
99 // Coulomb Barrier calculation
100 CoulombBarrier =
101 theCoulombBarrierPtr->GetCoulombBarrier(ResidualA,ResidualZ,ExEnergy);
102 /*
103 G4cout << "Eexc(MeV)= " << ExEnergy/MeV
104 << " CoulBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
105 */
106 if(Etot > ResidualMass + EvaporatedMass + CoulombBarrier) {
107
108 // Maximal Kinetic Energy
109 MaximalKineticEnergy = ((Etot-ResidualMass)*(Etot+ResidualMass)
110 + EvaporatedMass*EvaporatedMass)/(2.0*Etot)
111 - EvaporatedMass - CoulombBarrier;
112
113 //G4cout << "CBarrier(MeV)= " << CoulombBarrier/MeV << G4endl;
114
115 if (MaximalKineticEnergy > 0.0) {
116 // Total emission probability for this channel
117 EmissionProbability = theEvaporationProbabilityPtr->
118 EmissionProbability(*fragment, MaximalKineticEnergy);
119 }
120 }
121 }
122 }
123 //G4cout << "Prob= " << EmissionProbability << G4endl;
124 return EmissionProbability;
125}
126
128{
129 G4Fragment* evFragment = 0;
130 G4double evEnergy = SampleKineticEnergy(*theNucleus) + EvaporatedMass;
131
132 G4ThreeVector momentum = G4RandomDirection()*
133 std::sqrt((evEnergy - EvaporatedMass)*(evEnergy + EvaporatedMass));
134
135 G4LorentzVector EvaporatedMomentum(momentum, evEnergy);
136 G4LorentzVector ResidualMomentum = theNucleus->GetMomentum();
137 EvaporatedMomentum.boost(ResidualMomentum.boostVector());
138
139 evFragment = new G4Fragment(A, Z, EvaporatedMomentum);
140 ResidualMomentum -= EvaporatedMomentum;
141 theNucleus->SetZandA_asInt(ResidualZ, ResidualA);
142 theNucleus->SetMomentum(ResidualMomentum);
143
144 return evFragment;
145}
146
147G4double G4GEMChannel::SampleKineticEnergy(const G4Fragment & fragment)
148// Samples fragment kinetic energy.
149{
150 G4double U = fragment.GetExcitationEnergy();
151
152 G4double Alpha = theEvaporationProbabilityPtr->CalcAlphaParam(fragment);
153 G4double Beta = theEvaporationProbabilityPtr->CalcBetaParam(fragment);
154
155 // ***RESIDUAL***
156 //JMQ (September 2009) the following quantities refer to the RESIDUAL:
157 G4double delta0 = fNucData->GetPairingCorrection(ResidualZ,ResidualA);
158 G4double Ux = (2.5 + 150.0/ResidualA)*MeV;
159 G4double Ex = Ux + delta0;
160 G4double InitialLevelDensity;
161 // ***end RESIDUAL ***
162
163 // ***PARENT***
164 //JMQ (September 2009) the following quantities refer to the PARENT:
165
166 G4double deltaCN = fNucData->GetPairingCorrection(fragment.GetZ_asInt(),
167 fragment.GetA_asInt());
168 G4double aCN = theLevelDensityPtr->LevelDensityParameter(fragment.GetA_asInt(),
169 fragment.GetZ_asInt(),
170 U-deltaCN);
171 G4double UxCN = (2.5 + 150.0/G4double(fragment.GetA_asInt()))*MeV;
172 G4double ExCN = UxCN + deltaCN;
173 G4double TCN = 1.0/(std::sqrt(aCN/UxCN) - 1.5/UxCN);
174 // ***end PARENT***
175
176 //JMQ quantities calculated for CN in InitialLevelDensity
177 if ( U < ExCN )
178 {
179 G4double E0CN = ExCN - TCN*(G4Log(TCN/MeV) - G4Log(aCN*MeV)/4.0
180 - 1.25*G4Log(UxCN/MeV) + 2.0*std::sqrt(aCN*UxCN));
181 InitialLevelDensity = (pi/12.0)*G4Exp((U-E0CN)/TCN)/TCN;
182 }
183 else
184 {
185 G4double x = U-deltaCN;
186 G4double x1 = std::sqrt(aCN*x);
187 InitialLevelDensity = (pi/12.0)*G4Exp(2*x1)/(x*std::sqrt(x1));
188 }
189
190 G4double Spin = theEvaporationProbabilityPtr->GetSpin();
191 //JMQ BIG BUG fixed: hbarc instead of hbar_Planck !!!!
192 // it was also fixed in total probability
193 G4double gg = (2.0*Spin+1.0)*EvaporatedMass/(pi2* hbarc*hbarc);
194 //
195 //JMQ fix on Rb and geometrical cross sections according to Furihata's paper
196 // (JAERI-Data/Code 2001-105, p6)
197 G4double Rb = 0.0;
198 if (A > 4)
199 {
200 G4double Ad = fG4pow->Z13(ResidualA);
201 G4double Aj = fG4pow->Z13(A);
202 Rb = (1.12*(Aj + Ad) - 0.86*((Aj+Ad)/(Aj*Ad))+2.85)*fermi;
203 }
204 else if (A>1)
205 {
206 G4double Ad = fG4pow->Z13(ResidualA);
207 G4double Aj = fG4pow->Z13(A);
208 Rb=1.5*(Aj+Ad)*fermi;
209 }
210 else
211 {
212 G4double Ad = fG4pow->Z13(ResidualA);
213 Rb = 1.5*Ad*fermi;
214 }
215 G4double GeometricalXS = pi*Rb*Rb;
216
217 G4double ConstantFactor = gg*GeometricalXS*Alpha*pi/(InitialLevelDensity*12);
218 //JMQ : this is the assimptotic maximal kinetic energy of the ejectile
219 // (obtained by energy-momentum conservation).
220 // In general smaller than U-theSeparationEnergy
221 G4double theEnergy = MaximalKineticEnergy + CoulombBarrier;
223 G4double Probability;
224
225 for(G4int i=0; i<100; ++i) {
226 KineticEnergy = CoulombBarrier + G4UniformRand()*(MaximalKineticEnergy);
227 G4double edelta = theEnergy-KineticEnergy-delta0;
228 Probability = ConstantFactor*(KineticEnergy + Beta);
229 G4double a =
230 theLevelDensityPtr->LevelDensityParameter(ResidualA,ResidualZ,edelta);
231 G4double T = 1.0/(std::sqrt(a/Ux) - 1.5/Ux);
232 //JMQ fix in units
233
234 if (theEnergy - KineticEnergy < Ex) {
235 G4double E0 = Ex - T*(G4Log(T) - G4Log(a)*0.25
236 - 1.25*G4Log(Ux) + 2.0*std::sqrt(a*Ux));
237 Probability *= G4Exp((theEnergy-KineticEnergy-E0)/T)/T;
238 } else {
239 G4double e2 = edelta*edelta;
240 Probability *=
241 G4Exp(2*std::sqrt(a*edelta) - 0.25*G4Log(a*edelta*e2*e2));
242 }
243 if(EmissionProbability*G4UniformRand() <= Probability) { break; }
244 }
245
246 return KineticEnergy;
247}
248
250{
251 theEvaporationProbabilityPtr->Dump();
252}
253
254
255
double A(double temperature)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:179
G4double G4Log(G4double x)
Definition: G4Log.hh:226
G4ThreeVector G4RandomDirection()
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
#define G4UniformRand()
Definition: Randomize.hh:52
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
G4double GetGroundStateMass() const
Definition: G4Fragment.hh:280
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:275
const G4LorentzVector & GetMomentum() const
Definition: G4Fragment.hh:299
G4int GetZ_asInt() const
Definition: G4Fragment.hh:263
void SetMomentum(const G4LorentzVector &value)
Definition: G4Fragment.hh:304
void SetZandA_asInt(G4int Znew, G4int Anew)
Definition: G4Fragment.hh:268
G4int GetA_asInt() const
Definition: G4Fragment.hh:258
virtual void Dump() const
virtual G4Fragment * EmittedFragment(G4Fragment *theNucleus)
virtual ~G4GEMChannel()
Definition: G4GEMChannel.cc:68
G4GEMChannel(G4int theA, G4int theZ, const G4String &aName, G4GEMProbability *aEmissionStrategy)
Definition: G4GEMChannel.cc:48
virtual G4double GetEmissionProbability(G4Fragment *theNucleus)
Definition: G4GEMChannel.cc:74
G4double CalcAlphaParam(const G4Fragment &) const
G4double CalcBetaParam(const G4Fragment &) const
G4double GetSpin(void) const
void SetCoulomBarrier(const G4VCoulombBarrier *aCoulombBarrierStrategy)
G4PairingCorrection * GetPairingCorrection()
static G4NuclearLevelData * GetInstance()
static G4double GetNuclearMass(const G4double A, const G4double Z)
static G4Pow * GetInstance()
Definition: G4Pow.cc:41
G4double Z13(G4int Z) const
Definition: G4Pow.hh:123
virtual G4double GetCoulombBarrier(G4int ARes, G4int ZRes, G4double U) const =0
virtual G4double LevelDensityParameter(G4int A, G4int Z, G4double U) const =0
Definition: DoubConv.h:17
const G4double pi