Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
G4PreCompoundTransitions.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// $Id$
27//
28// -------------------------------------------------------------------
29//
30// GEANT4 Class file
31//
32//
33// File name: G4PreCompoundTransitions
34//
35// Author: V.Lara
36//
37// Modified:
38// 16.02.2008 J.M.Quesada fixed bugs
39// 06.09.2008 J.M.Quesada added external choices for:
40// - "never go back" hipothesis (useNGB=true)
41// - CEM transition probabilities (useCEMtr=true)
42// 30.10.2009 J.M.Quesada: CEM transition probabilities have been renormalized
43// (IAEA benchmark)
44// 20.08.2010 V.Ivanchenko move constructor and destructor to the source and
45// optimise the code
46// 30.08.2011 M.Kelsey - Skip CalculateProbability if no excitons
47
50#include "G4SystemOfUnits.hh"
51#include "Randomize.hh"
52#include "G4Pow.hh"
55#include "G4Proton.hh"
56
58{
59 proton = G4Proton::Proton();
63 g4pow = G4Pow::GetInstance();
64}
65
67{}
68
69// Calculates transition probabilities with
70// DeltaN = +2 (Trans1) -2 (Trans2) and 0 (Trans3)
72CalculateProbability(const G4Fragment & aFragment)
73{
74 // Number of holes
75 G4int H = aFragment.GetNumberOfHoles();
76 // Number of Particles
77 G4int P = aFragment.GetNumberOfParticles();
78 // Number of Excitons
79 G4int N = P+H;
80 // Nucleus
81 G4int A = aFragment.GetA_asInt();
82 G4int Z = aFragment.GetZ_asInt();
83 G4double U = aFragment.GetExcitationEnergy();
84
85 //G4cout << aFragment << G4endl;
86
87 if(U < 10*eV || 0==N) { return 0.0; }
88
89 //J. M. Quesada (Feb. 08) new physics
90 // OPT=1 Transitions are calculated according to Gudima's paper
91 // (original in G4PreCompound from VL)
92 // OPT=2 Transitions are calculated according to Gupta's formulae
93 //
94 if (useCEMtr){
95
96 // Relative Energy (T_{rel})
97 G4double RelativeEnergy = 1.6*FermiEnergy + U/G4double(N);
98
99 // Sample kind of nucleon-projectile
100 G4bool ChargedNucleon(false);
101 G4double chtest = 0.5;
102 if (P > 0) {
103 chtest = G4double(aFragment.GetNumberOfCharged())/G4double(P);
104 }
105 if (G4UniformRand() < chtest) { ChargedNucleon = true; }
106
107 // Relative Velocity:
108 // <V_{rel}>^2
109 G4double RelativeVelocitySqr(0.0);
110 if (ChargedNucleon) {
111 RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::proton_mass_c2;
112 } else {
113 RelativeVelocitySqr = 2.0*RelativeEnergy/CLHEP::neutron_mass_c2;
114 }
115
116 // <V_{rel}>
117 G4double RelativeVelocity = std::sqrt(RelativeVelocitySqr);
118
119 // Proton-Proton Cross Section
120 G4double ppXSection =
121 (10.63/RelativeVelocitySqr - 29.92/RelativeVelocity + 42.9)
122 * CLHEP::millibarn;
123 // Proton-Neutron Cross Section
124 G4double npXSection =
125 (34.10/RelativeVelocitySqr - 82.20/RelativeVelocity + 82.2)
126 * CLHEP::millibarn;
127
128 // Averaged Cross Section: \sigma(V_{rel})
129 // G4double AveragedXSection = (ppXSection+npXSection)/2.0;
130 G4double AveragedXSection(0.0);
131 if (ChargedNucleon)
132 {
133 //JMQ: small bug fixed
134 //AveragedXSection=((Z-1.0) * ppXSection + (A-Z-1.0) * npXSection)/(A-1.0);
135 AveragedXSection = ((Z-1)*ppXSection + (A-Z)*npXSection)/G4double(A-1);
136 }
137 else
138 {
139 AveragedXSection = ((A-Z-1)*ppXSection + Z*npXSection)/G4double(A-1);
140 //AveragedXSection = ((A-Z-1)*npXSection + Z*ppXSection)/G4double(A-1);
141 }
142
143 // Fermi relative energy ratio
144 G4double FermiRelRatio = FermiEnergy/RelativeEnergy;
145
146 // This factor is introduced to take into account the Pauli principle
147 G4double PauliFactor = 1.0 - 1.4*FermiRelRatio;
148 if (FermiRelRatio > 0.5) {
149 G4double x = 2.0 - 1.0/FermiRelRatio;
150 PauliFactor += 0.4*FermiRelRatio*x*x*std::sqrt(x);
151 //PauliFactor +=
152 //(2.0/5.0)*FermiRelRatio*std::pow(2.0 - (1.0/FermiRelRatio), 5.0/2.0);
153 }
154 // Interaction volume
155 // G4double Vint = (4.0/3.0)
156 //*pi*std::pow(2.0*r0 + hbarc/(proton_mass_c2*RelativeVelocity) , 3.0);
157 G4double xx = 2.0*r0 + hbarc/(CLHEP::proton_mass_c2*RelativeVelocity);
158 // G4double Vint = (4.0/3.0)*CLHEP::pi*xx*xx*xx;
159 G4double Vint = CLHEP::pi*xx*xx*xx/0.75;
160
161 // Transition probability for \Delta n = +2
162
163 TransitionProb1 = AveragedXSection*PauliFactor
164 *std::sqrt(2.0*RelativeEnergy/CLHEP::proton_mass_c2)/Vint;
165
166 //JMQ 281009 phenomenological factor in order to increase
167 // equilibrium contribution
168 // G4double factor=5.0;
169 // TransitionProb1 *= factor;
170 //
171 if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; }
172
173 // GE = g*E where E is Excitation Energy
174 G4double GE = (6.0/pi2)*aLDP*A*U;
175
176 //G4double Fph = ((P*P+H*H+P-H)/4.0 - H/2.0);
177 G4double Fph = G4double(P*P+H*H+P-3*H)/4.0;
178
179 G4bool NeverGoBack(false);
180 if(useNGB) { NeverGoBack=true; }
181
182 //JMQ/AH bug fixed: if (U-Fph < 0.0) NeverGoBack = true;
183 if (GE-Fph < 0.0) { NeverGoBack = true; }
184
185 // F(p+1,h+1)
186 G4double Fph1 = Fph + N/2.0;
187
188 G4double ProbFactor = g4pow->powN((GE-Fph)/(GE-Fph1),N+1);
189
190 if (NeverGoBack)
191 {
192 TransitionProb2 = 0.0;
193 TransitionProb3 = 0.0;
194 }
195 else
196 {
197 // Transition probability for \Delta n = -2 (at F(p,h) = 0)
199 TransitionProb1 * ProbFactor * (P*H*(N+1)*(N-2))/((GE-Fph)*(GE-Fph));
200 if (TransitionProb2 < 0.0) { TransitionProb2 = 0.0; }
201
202 // Transition probability for \Delta n = 0 (at F(p,h) = 0)
203 TransitionProb3 = TransitionProb1*(N+1)* ProbFactor
204 * (P*(P-1) + 4.0*P*H + H*(H-1))/(N*(GE-Fph));
205 if (TransitionProb3 < 0.0) { TransitionProb3 = 0.0; }
206 }
207 } else {
208 //JMQ: Transition probabilities from Gupta's work
209 // GE = g*E where E is Excitation Energy
210 G4double GE = (6.0/pi2)*aLDP*A*U;
211
212 G4double Kmfp=2.;
213
214 //TransitionProb1=1./Kmfp*3./8.*1./c_light*1.0e-9*(1.4e+21*U-2./(N+1)*6.0e+18*U*U);
215 TransitionProb1 = 3.0e-9*(1.4e+21*U - 1.2e+19*U*U/G4double(N+1))
216 /(8*Kmfp*CLHEP::c_light);
217 if (TransitionProb1 < 0.0) { TransitionProb1 = 0.0; }
218
221
222 if (!useNGB && N > 1) {
223 // TransitionProb2=1./Kmfp*3./8.*1./c_light*1.0e-9*(N-1.)*(N-2.)*P*H/(GE*GE)*(1.4e+21*U - 2./(N-1)*6.0e+18*U*U);
225 3.0e-9*(N-2)*P*H*(1.4e+21*U*(N-1) - 1.2e+19*U*U)/(8*Kmfp*c_light*GE*GE);
226 if (TransitionProb2 < 0.0) TransitionProb2 = 0.0;
227 }
228 }
229 // G4cout<<"U = "<<U<<G4endl;
230 // G4cout<<"N="<<N<<" P="<<P<<" H="<<H<<G4endl;
231 // G4cout<<"l+ ="<<TransitionProb1<<" l- ="<< TransitionProb2
232 // <<" l0 ="<< TransitionProb3<<G4endl;
234}
235
237{
238 G4double ChosenTransition =
240 G4int deltaN = 0;
241 // G4int Nexcitons = result.GetNumberOfExcitons();
242 G4int Npart = result.GetNumberOfParticles();
243 G4int Ncharged = result.GetNumberOfCharged();
244 G4int Nholes = result.GetNumberOfHoles();
245 if (ChosenTransition <= TransitionProb1)
246 {
247 // Number of excitons is increased on \Delta n = +2
248 deltaN = 2;
249 }
250 else if (ChosenTransition <= TransitionProb1+TransitionProb2)
251 {
252 // Number of excitons is increased on \Delta n = -2
253 deltaN = -2;
254 }
255
256 // AH/JMQ: Randomly decrease the number of charges if deltaN is -2 and
257 // in proportion to the number charges w.r.t. number of particles,
258 // PROVIDED that there are charged particles
259 deltaN /= 2;
260
261 //G4cout << "deltaN= " << deltaN << G4endl;
262
263 // JMQ the following lines have to be before SetNumberOfCharged, otherwise the check on
264 // number of charged vs. number of particles fails
265 result.SetNumberOfParticles(Npart+deltaN);
266 result.SetNumberOfHoles(Nholes+deltaN);
267
268 if(deltaN < 0) {
269 if( Ncharged >= 1 && G4int(Npart*G4UniformRand()) <= Ncharged)
270 {
271 result.SetNumberOfCharged(Ncharged+deltaN); // deltaN is negative!
272 }
273
274 } else if ( deltaN > 0 ) {
275 // With weight Z/A, number of charged particles is increased with +1
276 G4int A = result.GetA_asInt();
277 G4int Z = result.GetZ_asInt();
278 if( G4int(std::max(1, A - Npart)*G4UniformRand()) <= Z)
279 {
280 result.SetNumberOfCharged(Ncharged+deltaN);
281 }
282 }
283
284 // Number of charged can not be greater that number of particles
285 if ( Npart < Ncharged )
286 {
287 result.SetNumberOfCharged(Npart);
288 }
289 //G4cout << "### After transition" << G4endl;
290 //G4cout << result << G4endl;
291}
292
@ GE
Definition: Evaluator.cc:66
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
#define G4UniformRand()
Definition: Randomize.hh:53
G4int GetNumberOfParticles() const
Definition: G4Fragment.hh:305
G4int GetNumberOfHoles() const
Definition: G4Fragment.hh:325
void SetNumberOfCharged(G4int value)
Definition: G4Fragment.hh:349
G4double GetExcitationEnergy() const
Definition: G4Fragment.hh:235
G4int GetZ_asInt() const
Definition: G4Fragment.hh:223
void SetNumberOfHoles(G4int valueTot, G4int valueP=0)
Definition: G4Fragment.hh:335
void SetNumberOfParticles(G4int value)
Definition: G4Fragment.hh:344
G4int GetNumberOfCharged() const
Definition: G4Fragment.hh:310
G4int GetA_asInt() const
Definition: G4Fragment.hh:218
static G4Pow * GetInstance()
Definition: G4Pow.cc:50
G4double powN(G4double x, G4int n)
Definition: G4Pow.cc:98
static G4PreCompoundParameters * GetAddress()
virtual void PerformTransition(G4Fragment &aFragment)
virtual G4double CalculateProbability(const G4Fragment &aFragment)
static G4Proton * Proton()
Definition: G4Proton.cc:93