Geant4 10.7.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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