Geant4 10.7.0
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 *)
 

Detailed Description

Definition at line 80 of file G4ScreeningMottCrossSection.hh.

Constructor & Destructor Documentation

◆ G4ScreeningMottCrossSection()

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 ( )

Definition at line 116 of file G4ScreeningMottCrossSection.cc.

117{}

Member Function Documentation

◆ GetScatteringAngle()

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

Definition at line 402 of file G4ScreeningMottCrossSection.cc.

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

Referenced by G4eSingleCoulombScatteringModel::SampleSecondaries().

◆ Initialise()

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

Definition at line 121 of file G4ScreeningMottCrossSection.cc.

123{
124 SetupParticle(p);
125 tkin = mom2 = 0.0;
126 ecut = etag = DBL_MAX;
127 particle = p;
128 cosThetaMin = cosThetaLim;
129}
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 256 of file G4ScreeningMottCrossSection.cc.

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

◆ NuclearCrossSection()

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

Definition at line 355 of file G4ScreeningMottCrossSection.cc.

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

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

◆ RatioMottRutherford()

G4double G4ScreeningMottCrossSection::RatioMottRutherford ( G4double  tet)

Definition at line 264 of file G4ScreeningMottCrossSection.cc.

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

◆ RatioMottRutherfordCosT()

G4double G4ScreeningMottCrossSection::RatioMottRutherfordCosT ( G4double  sin2t2)

Definition at line 271 of file G4ScreeningMottCrossSection.cc.

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

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

◆ SetupKinematic()

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

Definition at line 133 of file G4ScreeningMottCrossSection.cc.

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