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

#include <G4ScreeningMottCrossSection.hh>

Public Member Functions

 G4ScreeningMottCrossSection ()
 
 ~G4ScreeningMottCrossSection ()
 
void Initialise (const G4ParticleDefinition *, G4double cosThetaLim)
 
void SetupKinematic (G4double kinEnergy, G4int Z)
 
G4double NuclearCrossSection (G4int form, G4int fast)
 
G4double GetScatteringAngle (G4int form, G4int fast)
 
G4double RatioMottRutherford (G4double tet)
 
G4double RatioMottRutherfordCosT (G4double sin2t2)
 
G4double McFcorrection (G4double sin2t2)
 
void SetupParticle (const G4ParticleDefinition *)
 
G4ScreeningMottCrossSectionoperator= (const G4ScreeningMottCrossSection &right)=delete
 
 G4ScreeningMottCrossSection (const G4ScreeningMottCrossSection &)=delete
 

Detailed Description

Definition at line 80 of file G4ScreeningMottCrossSection.hh.

Constructor & Destructor Documentation

◆ G4ScreeningMottCrossSection() [1/2]

G4ScreeningMottCrossSection::G4ScreeningMottCrossSection ( )
explicit

Definition at line 90 of file G4ScreeningMottCrossSection.cc.

90 :
91 cosThetaMin(1.0),
92 cosThetaMax(-1.0),
93 alpha(fine_structure_const),
94 htc2(hbarc_squared),
95 e2(electron_mass_c2*classic_electr_radius)
96{
97 fTotalCross=0;
98
99 fNistManager = G4NistManager::Instance();
100 fG4pow = G4Pow::GetInstance();
101 particle=nullptr;
102
103 spin = mass = mu_rel = 0.0;
104 tkinLab = momLab2 = invbetaLab2 = 0.0;
105 tkin = mom2 = invbeta2 = beta = gamma = 0.0;
106
107 targetMass = As = etag = ecut = 0.0;
108
109 targetZ = targetA = 0;
110
111 cosTetMinNuc = cosTetMaxNuc = 0.0;
112}
static G4NistManager * Instance()
static G4Pow * GetInstance()
Definition G4Pow.cc:41

◆ ~G4ScreeningMottCrossSection()

G4ScreeningMottCrossSection::~G4ScreeningMottCrossSection ( )
default

◆ G4ScreeningMottCrossSection() [2/2]

G4ScreeningMottCrossSection::G4ScreeningMottCrossSection ( const G4ScreeningMottCrossSection & )
delete

Member Function Documentation

◆ GetScatteringAngle()

G4double G4ScreeningMottCrossSection::GetScatteringAngle ( G4int form,
G4int fast )

Definition at line 401 of file G4ScreeningMottCrossSection.cc.

402{
403 G4double scattangle = 0.0;
405 //************ PRECISE COMPUTATION
406 if(fast == 0){
407 //G4cout << "r= " << r << " tot= " << fTotalCross << G4endl;
408 r *= fTotalCross;
409 for(G4int i=0; i<DIMMOTT; ++i){
410 //G4cout << i << ". r= " << r << " xs= " << cross[i] << G4endl;
411 if(r <= cross[i]) {
412 scattangle = ComputeAngle(i, r);
413 break;
414 }
415 }
416
417 //**************** FAST COMPUTATION
418 } else if(fast == 1) {
419
420 G4double limit = GetTransitionRandom();
421 if(limit > 0.0) {
422 G4double Sz = 2*As;
423 G4double x = Sz-((Sz*(2+Sz))/(Sz+2*limit))+1.0;
424 //G4cout << "limit= " << limit << " Sz= " << Sz << " x= " << x << G4endl;
425 G4double angle_limit = (std::abs(x) < 1.0) ? std::acos(x) : 0.0;
426 //G4cout<<"ANGLE LIMIT: "<<angle_limit<<" x= " << x << G4endl;
427
428 if(r > limit && angle_limit != 0.0) {
429 x = Sz-((Sz*(2+Sz))/(Sz+2*r))+1.0;
430 scattangle = (x >= 1.0) ? 0.0 : ((x <= -1.0) ? pi : std::acos(x));
431 //G4cout<<"FAST: scattangle= "<< scattangle <<G4endl;
432 }
433 } else {
434 //G4cout<<"SLOW: total= "<<fTotalCross<< G4endl;
435 r *= fTotalCross;
436 G4double tot = 0.0;
437 for(G4int i=0; i<DIMMOTT; ++i) {
438 G4double xs = DifferentialXSection(i, form);
439 tot += xs;
440 cross[i] = tot;
441 if(r <= tot) {
442 scattangle = ComputeAngle(i, r);
443 break;
444 }
445 }
446 }
447 }
448 //************************************************
449 //G4cout<<"Energy(MeV): "<<tkinLab/MeV<<" SCATTANGLE: "<<scattangle<<G4endl;
450 return scattangle;
451}
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
#define G4UniformRand()
Definition Randomize.hh:52

Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().

◆ Initialise()

void G4ScreeningMottCrossSection::Initialise ( const G4ParticleDefinition * p,
G4double cosThetaLim )

Definition at line 120 of file G4ScreeningMottCrossSection.cc.

122{
123 SetupParticle(p);
124 tkin = mom2 = 0.0;
125 ecut = etag = DBL_MAX;
126 particle = p;
127 cosThetaMin = cosThetaLim;
128}
void SetupParticle(const G4ParticleDefinition *)
#define DBL_MAX
Definition templates.hh:62

Referenced by G4eSingleCoulombScatteringModel::Initialise(), and G4WentzelOKandVIxSection::Initialise().

◆ McFcorrection()

G4double G4ScreeningMottCrossSection::McFcorrection ( G4double sin2t2)

Definition at line 255 of file G4ScreeningMottCrossSection.cc.

256{
257 const G4double sint = std::sqrt(sin2t2);
258 return 1.-beta*beta*sin2t2 + targetZ*alpha*beta*pi*sint*(1.-sint);
259}

◆ NuclearCrossSection()

G4double G4ScreeningMottCrossSection::NuclearCrossSection ( G4int form,
G4int fast )

Definition at line 354 of file G4ScreeningMottCrossSection.cc.

355{
356 fTotalCross=0.;
357 if(cosTetMaxNuc >= cosTetMinNuc) return fTotalCross;
358 if(0 == cross.size()) { cross.resize(DIMMOTT, 0.0); }
359
360 //G4cout<<"MODEL: "<<fast<<G4endl;
361 //************ PRECISE COMPUTATION
362 if(fast == 0){
363
364 for(G4int i=0; i<DIMMOTT; ++i){
365 G4double y = DifferentialXSection(i, form);
366 fTotalCross += y;
367 cross[i] = fTotalCross;
368 if(fTotalCross*1.e-9 > y) {
369 for(G4int j=i+1; j<DIMMOTT; ++j) {
370 cross[j] = fTotalCross;
371 }
372 break;
373 }
374 }
375 //**************** FAST COMPUTATION
376 } else if(fast == 1) {
377
378 G4double p0 = electron_mass_c2*classic_electr_radius;
379 G4double coeff = twopi*p0*p0;
380
381 G4double fac = coeff*targetZ*targetZ*invbeta2/mom2;
382
383 G4double x = 1.0 - cosTetMinNuc;
384 G4double x1 = x + 2*As;
385
386 // scattering with nucleus
387 fTotalCross = fac*(cosTetMinNuc - cosTetMaxNuc)/
388 (x1*(1.0 - cosTetMaxNuc + 2*As));
389 }
390 /*
391 G4cout << "Energy(MeV): " << tkinLab/CLHEP::MeV
392 << " Total Cross(mb): " << fTotalCross
393 << " form= " << form << " fast= " << fast << G4endl;
394 */
395 return fTotalCross;
396}

Referenced by G4eSingleCoulombScatteringModel::ComputeCrossSectionPerAtom(), and G4eSingleCoulombScatteringModel::SampleSecondaries().

◆ operator=()

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

◆ RatioMottRutherford()

G4double G4ScreeningMottCrossSection::RatioMottRutherford ( G4double tet)

Definition at line 263 of file G4ScreeningMottCrossSection.cc.

264{
265 return RatioMottRutherfordCosT(std::sqrt(1. - std::cos(angles)));
266}
G4double RatioMottRutherfordCosT(G4double sin2t2)

◆ RatioMottRutherfordCosT()

G4double G4ScreeningMottCrossSection::RatioMottRutherfordCosT ( G4double sin2t2)

Definition at line 270 of file G4ScreeningMottCrossSection.cc.

271{
272 G4double R(0.);
273 const G4double shift = 0.7181228;
274 G4double beta0 = beta - shift;
275
276 G4double b0 = 1.0;
277 G4double b[6];
278 for(G4int i=0; i<6; ++i) {
279 b[i] = b0;
280 b0 *= beta0;
281 }
282
283 b0 = 1.0;
284 for(G4int j=0; j<=4; ++j) {
285 G4double a = 0.0;
286 for(G4int k=0; k<=5; ++k){
287 a += fMottCoef[targetZ][j][k]*b[k];
288 }
289 R += a*b0;
290 b0 *= fcost;
291 }
292 return R;
293}

Referenced by RatioMottRutherford(), and G4WentzelOKandVIxSection::SampleSingleScattering().

◆ SetupKinematic()

void G4ScreeningMottCrossSection::SetupKinematic ( G4double kinEnergy,
G4int Z )

Definition at line 132 of file G4ScreeningMottCrossSection.cc.

133{
134 //...Target
135 const G4int iz = std::min(92, Z);
136 const G4int ia = G4lrint(fNistManager->GetAtomicMassAmu(iz));
137
138 targetZ = iz;
139 targetA = ia;
140 targetMass = G4NucleiProperties::GetNuclearMass(ia, iz);
141
142 //G4cout<<"......... targetA "<< targetA <<G4endl;
143 //G4cout<<"......... targetMass "<< targetMass/MeV <<G4endl;
144
145 // incident particle lab
146 tkinLab = ekin;
147 momLab2 = tkinLab*(tkinLab + 2.0*mass);
148 invbetaLab2 = 1.0 + mass*mass/momLab2;
149
150 const G4double etot = tkinLab + mass;
151 const G4double ptot = std::sqrt(momLab2);
152 const G4double m12 = mass*mass;
153
154 // relativistic reduced mass from publucation
155 // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
156
157 //incident particle & target nucleus
158 const G4double Ecm = std::sqrt(m12 + targetMass*targetMass + 2.0*etot*targetMass);
159 mu_rel = mass*targetMass/Ecm;
160 const G4double momCM= ptot*targetMass/Ecm;
161 // relative system
162 mom2 = momCM*momCM;
163 const G4double x = mu_rel*mu_rel/mom2;
164 invbeta2 = 1.0 + x;
165 tkin = momCM*std::sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
166 const G4double beta2 = 1./invbeta2;
167 beta = std::sqrt(beta2) ;
168 const G4double gamma2= invbeta2/x;
169 gamma = std::sqrt(gamma2);
170
171 //Thomas-Fermi screening length
172 const G4double alpha2 = alpha*alpha;
173 const G4double aU = 0.88534*CLHEP::Bohr_radius/fG4pow->Z13(targetZ);
174 const G4double twoR2 = aU*aU;
175 As = 0.25*htc2*(1.13 + 3.76*targetZ*targetZ*invbeta2*alpha2)/(twoR2*mom2);
176
177 //Integration Angles definition
178 cosTetMinNuc = cosThetaMin;
179 cosTetMaxNuc = cosThetaMax;
180}
const G4double alpha2
G4double GetAtomicMassAmu(const G4String &symb) const
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4double Z13(G4int Z) const
Definition G4Pow.hh:123
int G4lrint(double ad)
Definition templates.hh:134

Referenced by G4eSingleCoulombScatteringModel::ComputeCrossSectionPerAtom(), G4eSingleCoulombScatteringModel::SampleSecondaries(), and G4WentzelOKandVIxSection::SampleSingleScattering().

◆ SetupParticle()

void G4ScreeningMottCrossSection::SetupParticle ( const G4ParticleDefinition * p)
inline

Definition at line 169 of file G4ScreeningMottCrossSection.hh.

170{
171 particle = p;
172 mass = particle->GetPDGMass();
173 spin = particle->GetPDGSpin();
174 if(0.0 != spin) { spin = 0.5; }
175 tkin = 0.0;
176}

Referenced by Initialise().


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