Geant4  10.03.p01
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4ScreeningMottCrossSection Class Reference

#include <G4ScreeningMottCrossSection.hh>

Public Member Functions

 G4ScreeningMottCrossSection ()
 
virtual ~G4ScreeningMottCrossSection ()
 
void Initialise (const G4ParticleDefinition *, G4double cosThetaLim)
 
G4double GetScreeningAngle ()
 
void SetScreeningCoefficient ()
 
void SetupParticle (const G4ParticleDefinition *)
 
void SetupKinematic (G4double kinEnergy, G4double Z)
 
G4double NuclearCrossSection (G4int form)
 
G4ThreeVector GetNewDirection ()
 
G4double GetMom2CM () const
 
G4double GetMom2Lab () const
 
G4double GetTrec () const
 
G4double GetScreeningCoefficient () const
 
G4double GetTotalCross () const
 
G4double McFcorrection (G4double)
 
G4double RatioMottRutherford (G4double)
 
G4double FormFactor2ExpHof (G4double)
 
G4double FormFactor2Gauss (G4double)
 
G4double FormFactor2UniformHelm (G4double)
 
G4double GetScatteringAngle ()
 
G4double AngleDistribution (G4double)
 

Detailed Description

Definition at line 88 of file G4ScreeningMottCrossSection.hh.

Constructor & Destructor Documentation

G4ScreeningMottCrossSection::G4ScreeningMottCrossSection ( )
explicit

Definition at line 86 of file G4ScreeningMottCrossSection.cc.

86  :
87  cosThetaMin(1.0),
88  cosThetaMax(-1.0),
89  alpha(fine_structure_const),
90  htc2(hbarc_squared),
92 {
93  TotalCross=0;
94 
95  fNistManager = G4NistManager::Instance();
96  fG4pow = G4Pow::GetInstance();
97  particle=nullptr;
98 
99  spin = mass = mu_rel=0.0;
100  tkinLab = momLab2 = invbetaLab2=0.0;
101  tkin = mom2 = invbeta2=beta=gamma=0.0;
102 
103  Trec=targetZ = targetMass = As =0.0;
104  etag = ecut = 0.0;
105 
106  targetA = 0;
107 
108  cosTetMinNuc=0;
109  cosTetMaxNuc=0;
110 
111  for(G4int i=0 ; i<5; ++i){
112  for(G4int j=0; j< 6; ++j){
113  coeffb[i][j]=0;
114  }
115  }
116  if(dangle[0] == 0.0) {
117  for(G4int i=0; i<DIM; ++i){
118  cross[i]=0;
119  }
120  }
121 
122  mottcoeff = new G4MottCoefficients();
123 }
static const G4int DIM
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
static constexpr double hbarc_squared
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
static constexpr double electron_mass_c2
static constexpr double classic_electr_radius
static G4double dangle[DIM]
static constexpr double fine_structure_const

Here is the call graph for this function:

G4ScreeningMottCrossSection::~G4ScreeningMottCrossSection ( )
virtual

Definition at line 127 of file G4ScreeningMottCrossSection.cc.

128 {
129  delete mottcoeff;
130 }

Member Function Documentation

G4double G4ScreeningMottCrossSection::AngleDistribution ( G4double  )
G4double G4ScreeningMottCrossSection::FormFactor2ExpHof ( G4double  angles)

Definition at line 231 of file G4ScreeningMottCrossSection.cc.

232 {
233  G4double M=targetMass;
234  G4double E=tkinLab;
235  G4double Etot=E+mass;
236  G4double Tmax=2.*M*E*(E+2.*mass)/(mass*mass+M*M+2.*M*Etot);
237  G4double T=Tmax*fG4pow->powN(sin(angles*0.5), 2);
238  G4double q2=T*(T+2.*M);
239  q2/=htc2;//1/cm2
240  G4double RN=1.27e-13*G4Exp(G4Log(targetA)*0.27)*cm;
241  G4double xN= (RN*RN*q2);
242  G4double den=(1.+xN/12.);
243  G4double FN=1./(den*den);
244  G4double form2=(FN*FN);
245 
246  return form2;
247 
248  //cout<<"..................... form2 "<< form2<<endl;
249 }
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
static constexpr double cm
Definition: G4SIunits.hh:119
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::FormFactor2Gauss ( G4double  angles)

Definition at line 253 of file G4ScreeningMottCrossSection.cc.

254 {
255  G4double M=targetMass;
256  G4double E=tkinLab;
257  G4double Etot=E+mass;
258  G4double Tmax=2.*M*E*(E+2.*mass)/(mass*mass+M*M+2.*M*Etot);
259  G4double T=Tmax*fG4pow->powN(sin(angles*0.5), 2);
260  G4double q2=T*(T+2.*M);
261  q2/=htc2;//1/cm2
262  G4double RN=1.27e-13*G4Exp(G4Log(targetA)*0.27)*cm;
263  G4double xN= (RN*RN*q2);
264 
265  G4double expo=(-xN/6.);
266  G4double FN=G4Exp(expo);
267 
268  G4double form2=(FN*FN);
269 
270  return form2;
271 
272  //cout<<"..................... form2 "<< form2<<endl;
273 }
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
static constexpr double cm
Definition: G4SIunits.hh:119
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::FormFactor2UniformHelm ( G4double  angles)

Definition at line 277 of file G4ScreeningMottCrossSection.cc.

278 {
279  G4double M=targetMass;
280  G4double E=tkinLab;
281  G4double Etot=E+mass;
282  G4double Tmax=2.*M*E*(E+2.*mass)/(mass*mass+M*M+2.*M*Etot);
283  G4double T=Tmax*fG4pow->powN(sin(angles*0.5), 2);
284  G4double q2=T*(T+2.*M);
285  q2=q2/(htc2*0.01);//1/cm2
286 
287  G4double q=G4Exp(G4Log(q2)*0.5);;
288  G4double R0=1.2E-13*G4Exp(G4Log(targetA)/3.);
289  G4double R1=2.0E-13;
290 
291  G4double x0=q*R0;
292  G4double F0=(3./fG4pow->powN(x0,3))*(sin(x0)-x0*cos(x0));
293 
294  G4double x1=q*R1;
295  G4double F1=(3./fG4pow->powN(x1,3))*(sin(x1)-x1*cos(x1));
296 
297  G4double F=F0*F1;
298 
299  G4double form2=(F*F);
300 
301  //cout<<"htc: "<<sqrt(htc2)<<" R0: "<<R0<<" F0: "<<F0<<" F1: "<<F1<<" Targer Mass: "<<targetMass<<" Energy: "<<tkinLab<<" ANGLE: "<<angles<<" FORM: "<<form2<<endl;
302 
303  return form2;
304 
305  //cout<<"..................... form2 "<< form2<<endl;
306 }
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::GetMom2CM ( ) const
inline

Definition at line 194 of file G4ScreeningMottCrossSection.hh.

195 {
196  return mom2;
197 }
G4double G4ScreeningMottCrossSection::GetMom2Lab ( ) const
inline

Definition at line 201 of file G4ScreeningMottCrossSection.hh.

202 {
203  return momLab2;
204 }
G4ThreeVector G4ScreeningMottCrossSection::GetNewDirection ( )
G4double G4ScreeningMottCrossSection::GetScatteringAngle ( )

Definition at line 391 of file G4ScreeningMottCrossSection.cc.

392 {
393 
394  //cout<<"Z: "<<targetZ<<" Energy: "<<tkinLab/MeV<<endl;
395 
396  // cout<<"................ tkinLab "<< G4BestUnit(tkinLab,"Energy") << " anglemin= "<<anglemin<<endl;
397  //cout<<"anglemax= "<<anglemax<<endl;
398  //G4double r =3e-6*G4UniformRand();
399  //G4double r=1e-12*G4UniformRand();
401 
402  G4double scattangle=0;
403  G4double y=0;
404  G4double step=0;
405 
406  for(G4int i=DIM-1; i>=0; --i){
407  step=(1./TotalCross)*cross[i];
408  y+=step;
409  if(r >=y-step && r<y ){
410  scattangle= angle[i] +G4UniformRand()*dangle[i];
411  break;
412  }
413  }
414  //cout<<"Energy: "<<tkinLab/MeV<<" SCATTANGLE: "<<scattangle<<endl;
415  return scattangle;
416 }
static const G4int DIM
static G4double angle[DIM]
int G4int
Definition: G4Types.hh:78
#define G4UniformRand()
Definition: Randomize.hh:97
static G4double dangle[DIM]
double G4double
Definition: G4Types.hh:76

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::GetScreeningAngle ( )

Definition at line 160 of file G4ScreeningMottCrossSection.cc.

161 {
163 
164  G4double screenangle=2.*asin(sqrt(As));
165  // cout<<" screenangle "<< screenangle <<endl;
166  if(screenangle>=pi) screenangle=pi;
167 
168  return screenangle;
169 }
static constexpr double pi
Definition: G4SIunits.hh:75
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

G4double G4ScreeningMottCrossSection::GetScreeningCoefficient ( ) const
inline

Definition at line 216 of file G4ScreeningMottCrossSection.hh.

217 {
218  return As;
219 }
G4double G4ScreeningMottCrossSection::GetTotalCross ( ) const
inline

Definition at line 224 of file G4ScreeningMottCrossSection.hh.

225 {
226  return TotalCross;
227 }
G4double G4ScreeningMottCrossSection::GetTrec ( ) const
inline

Definition at line 209 of file G4ScreeningMottCrossSection.hh.

210 {
211  return Trec;
212 }
void G4ScreeningMottCrossSection::Initialise ( const G4ParticleDefinition p,
G4double  cosThetaLim 
)

Definition at line 133 of file G4ScreeningMottCrossSection.cc.

135 {
136  SetupParticle(p);
137  tkin = targetZ = mom2 = 0.0;
138  ecut = etag = DBL_MAX;
139  particle = p;
140  cosThetaMin = CosThetaLim;
141 
142 }
const char * p
Definition: xmltok.h:285
void SetupParticle(const G4ParticleDefinition *)
#define DBL_MAX
Definition: templates.hh:83

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::McFcorrection ( G4double  angles)

Definition at line 310 of file G4ScreeningMottCrossSection.cc.

311 {
312  G4double beta2=1./invbeta2;
313  G4double sintmezzi=std::sin(angles/2.);
314  G4double sin2tmezzi = sintmezzi*sintmezzi;
315  G4double R=1.-beta2*sin2tmezzi + targetZ*alpha*beta*pi*sintmezzi*(1.-sintmezzi);
316  return R;
317 }
static constexpr double pi
Definition: G4SIunits.hh:75
double G4double
Definition: G4Types.hh:76

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::NuclearCrossSection ( G4int  form)

Definition at line 345 of file G4ScreeningMottCrossSection.cc.

346 {
347  if(cosTetMaxNuc >= cosTetMinNuc) return 0.0;
348 
349  TotalCross=0;
350 
351  for(G4int i=0; i<DIM; ++i){
352  G4double R=0;
353 
354  G4double F2=0;
355 
356  if(form==0){F2=1;}
357  if(form==1){F2=FormFactor2ExpHof(tet[i]);}
358  if(form==2){F2=FormFactor2Gauss(tet[i]);}
359  if(form==3){F2=FormFactor2UniformHelm(tet[i]);}
360 
361  if (coeffb[0][0]!=0){
362  //cout<<" Mott....targetZ "<< targetZ<<endl;
363  R=RatioMottRutherford(tet[i]);
364  } else if (coeffb[0][0]==0){
365  // cout<<" McF.... targetZ "<< targetZ<<endl;
366  R=McFcorrection(tet[i]);
367  }
368 
369  //cout<<"----------------- R "<<R<<" F2 "<<F2<<endl;
370  // cout<<"angle "<<tet[i] << " F2 "<<F2<<endl;
371 
372  G4double den=2.*As+2.*fG4pow->powN(sin(tet[i]*0.5),2);
373  G4double func=1./(den*den);
374 
375  G4double fatt= targetZ/(mu_rel*gamma*beta*beta);
376  G4double sigma=e2*e2*fatt*fatt*func;
377  G4double pi2sintet=twopi*sin(tet[i]);
378 
379  cross[i]=pi2sintet*F2*R*sigma*dangle[i];
380  //cout<<i<<" Angle: "<<angle[i]<<" tet: "<<tet[i]<<" Cross: "<<cross[i]<<endl;
381  if(cross[i]<0){cross[i]=0;};
382  TotalCross+=cross[i];
383  }//end integral
384 
385  //cout<< "ok ......... TotalCross "<<TotalCross<<endl;
386  return TotalCross;
387 }
static const G4int DIM
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
int G4int
Definition: G4Types.hh:78
static constexpr double twopi
Definition: G4SIunits.hh:76
static G4double tet[DIM]
static G4double dangle[DIM]
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4ScreeningMottCrossSection::RatioMottRutherford ( G4double  angles)

Definition at line 319 of file G4ScreeningMottCrossSection.cc.

320 {
321  G4double R=0;
322  G4double fcost=std::sqrt((1. -cos(angles)));
323  G4double a[5];
324  static const G4double shift=0.7181228;
325  G4double beta0= beta -shift;
326 
327  for(G4int j=0 ;j<=4;j++){
328  a[j]=0;
329  }
330 
331  for(G4int j=0 ;j<=4;j++){
332  for(G4int k=0;k<=5;k++ ){
333  a[j]+=coeffb[j][k]*fG4pow->powN(beta0,k);
334  }
335  }
336 
337  for(G4int j=0; j<=4; ++j){
338  R+=a[j]*fG4pow->powN(fcost,j);
339  }
340  return R;
341 }
G4double powN(G4double x, G4int n) const
Definition: G4Pow.cc:128
int G4int
Definition: G4Types.hh:78
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

void G4ScreeningMottCrossSection::SetScreeningCoefficient ( )

Definition at line 144 of file G4ScreeningMottCrossSection.cc.

145 {
146  G4double alpha2=alpha*alpha;
147  //Bohr radius
148  G4double a0= Bohr_radius ;//0.529e-8*cm;
149  //Thomas-Fermi screening length
150  G4double aU=0.88534*a0/fG4pow->Z13(targetZ);
151  G4double twoR2=aU*aU;
152 
153  G4double factor= 1.13 + 3.76*targetZ*targetZ*invbeta2*alpha2;
154  As=0.25*(htc2)/(twoR2*mom2)*factor;
155  //cout<<"0k .........................As "<<As<<endl;
156 }
const G4double a0
static constexpr double Bohr_radius
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

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

Definition at line 172 of file G4ScreeningMottCrossSection.cc.

173 {
174  //...Target
175  G4int iz = G4lrint(Z);
176  G4double A = fNistManager->GetAtomicMassAmu(iz);
177  G4int ia = G4lrint(A);
179 
180  targetZ = Z;
181  targetA = fNistManager->GetAtomicMassAmu(iz);
182  targetMass= mass2;
183 
184  mottcoeff->SetMottCoeff(targetZ, coeffb);
185 
186  //cout<<"......... targetA "<< targetA <<endl;
187  //cout<<"......... targetMass "<< targetMass/MeV <<endl;
188 
189  // incident particle lab
190  tkinLab = ekin;
191  momLab2 = tkinLab*(tkinLab + 2.0*mass);
192  invbetaLab2 = 1.0 + mass*mass/momLab2;
193 
194  G4double etot = tkinLab + mass;
195  G4double ptot = sqrt(momLab2);
196  G4double m12 = mass*mass;
197 
198  // relativistic reduced mass from publucation
199  // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
200 
201  //incident particle & target nucleus
202  G4double Ecm=sqrt(m12 + mass2*mass2 + 2.0*etot*mass2);
203  mu_rel=mass*mass2/Ecm;
204  G4double momCM= ptot*mass2/Ecm;
205  // relative system
206  mom2 = momCM*momCM;
207  G4double x = mu_rel*mu_rel/mom2;
208  invbeta2 = 1.0 + x;
209  tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
210  G4double beta2=1./invbeta2;
211  beta=std::sqrt(beta2) ;
212  G4double gamma2= invbeta2/x;
213  gamma=std::sqrt(gamma2);
214 
215  //.........................................................
216 
218 
219  //Integration Angles definition
220 
221  cosTetMinNuc =cosThetaMin;
222  cosTetMaxNuc =cosThetaMax;
223 
224  for(G4int i=0; i<DIM; ++i ){
225  cross[i]=0;
226  }
227 }
static const G4int DIM
static G4double GetNuclearMass(const G4double A, const G4double Z)
int G4int
Definition: G4Types.hh:78
double A(double temperature)
int G4lrint(double ad)
Definition: templates.hh:163
G4double GetAtomicMassAmu(const G4String &symb) const
void SetMottCoeff(G4double targetZ, G4double coeff[5][6])
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

void G4ScreeningMottCrossSection::SetupParticle ( const G4ParticleDefinition p)
inline

Definition at line 183 of file G4ScreeningMottCrossSection.hh.

184 {
185  particle = p;
186  mass = particle->GetPDGMass();
187  spin = particle->GetPDGSpin();
188  if(0.0 != spin) { spin = 0.5; }
189  tkin = 0.0;
190 }
const char * p
Definition: xmltok.h:285
G4double GetPDGMass() const
G4double GetPDGSpin() const

Here is the call graph for this function:

Here is the caller graph for this function:


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