Geant4  10.02
G4ScreeningMottCrossSection.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 // G4ScreeningMottCrossSection.cc
27 //-------------------------------------------------------------------
28 //
29 // GEANT4 Class header file
30 //
31 // File name: G4ScreeningMottCrossSection
32 //
33 // Author: Cristina Consolandi
34 //
35 // Creation date: 20.10.2011
36 //
37 // Modifications:
38 // 27-05-2012 Added Analytic Fitting to the Mott Cross Section by means of G4MottCoefficients class.
39 //
40 //
41 // Class Description:
42 // Computation of electron Coulomb Scattering Cross Section.
43 // Suitable for high energy electrons and light target materials.
44 //
45 // Reference:
46 // M.J. Boschini et al.
47 // "Non Ionizing Energy Loss induced by Electrons in the Space Environment"
48 // Proc. of the 13th International Conference on Particle Physics and Advanced Technology
49 // (13th ICPPAT, Como 3-7/10/2011), World Scientific (Singapore).
50 // Available at: http://arxiv.org/abs/1111.4042v4
51 //
52 // 1) Mott Differential Cross Section Approximation:
53 // For Target material up to Z=92 (U):
54 // As described in http://arxiv.org/abs/1111.4042v4
55 // par. 2.1 , eq. (16)-(17)
56 // Else (Z>92):
57 // W. A. McKinley and H. Fashbach, Phys. Rev. 74, (1948) 1759.
58 // 2) Screening coefficient:
59 // vomn G. Moliere, Z. Naturforsh A2 (1947), 133-145; A3 (1948), 78.
60 // 3) Nuclear Form Factor:
61 // A.V. Butkevich et al. Nucl. Instr. and Meth. in Phys. Res. A 488 (2002), 282-294.
62 //
63 // -------------------------------------------------------------------------------------
64 //
65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
66 
68 #include "G4PhysicalConstants.hh"
69 #include "G4SystemOfUnits.hh"
70 #include "G4MottCoefficients.hh"
71 #include "Randomize.hh"
72 #include "G4Proton.hh"
73 #include "G4LossTableManager.hh"
74 #include "G4NucleiProperties.hh"
75 #include "G4Element.hh"
76 #include "G4UnitsTable.hh"
77 
78 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
79 
80 
81 using namespace std;
82 
84  cosThetaMin(1.0),
85  cosThetaMax(-1.0),
86  alpha(fine_structure_const),
87  htc2(hbarc_squared),
88  e2(electron_mass_c2*classic_electr_radius)
89 {
90  TotalCross=0;
91 
94  particle=0;
95 
96  spin = mass = mu_rel=0;
98  tkin = mom2 = invbeta2=beta=gamma=0;
99 
100  Trec=targetZ = targetMass = As =0;
101  etag = ecut = 0.0;
102 
103  targetA = 0;
104 
105  cosTetMinNuc=0;
106  cosTetMaxNuc=0;
107 
108  for(G4int i=0 ; i<5; ++i){
109  for(G4int j=0; j< 6; j++){
110  coeffb[i][j]=0;
111  }
112  }
113 
115 }
116 
117 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
118 
120 {
121  delete mottcoeff;
122 }
123 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
124 
126  G4double CosThetaLim)
127 {
128  SetupParticle(p);
129  tkin = targetZ = mom2 = DBL_MIN;
130  ecut = etag = DBL_MAX;
131  particle = p;
132  cosThetaMin = CosThetaLim;
133 
134 }
135 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
137 {
138  G4double alpha2=alpha*alpha;
139  //Bohr radius
140  G4double a0= Bohr_radius ;//0.529e-8*cm;
141  //Thomas-Fermi screening length
142  G4double aU=0.88534*a0/fG4pow->Z13(targetZ);
143  G4double twoR2=aU*aU;
144 
145  G4double factor= 1.13 + 3.76*targetZ*targetZ*invbeta2*alpha2;
146  As=0.25*(htc2)/(twoR2*mom2)*factor;
147  //cout<<"0k .........................As "<<As<<endl;
148 }
149 
150 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
151 
153 {
155 
156  G4double screenangle=2.*asin(sqrt(As));
157  // cout<<" screenangle "<< screenangle <<endl;
158  if(screenangle>=pi) screenangle=pi;
159 
160  return screenangle;
161 }
162 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
163 
165 {
166  //...Target
167  G4int iz = G4int(Z);
169  G4int ia = G4int(A);
171 
172  targetZ = Z;
174  targetMass= mass2;
175 
177 
178  //cout<<"......... targetA "<< targetA <<endl;
179  //cout<<"......... targetMass "<< targetMass/MeV <<endl;
180 
181  // incident particle lab
182  tkinLab = ekin;
183  momLab2 = tkinLab*(tkinLab + 2.0*mass);
184  invbetaLab2 = 1.0 + mass*mass/momLab2;
185 
186  G4double etot = tkinLab + mass;
187  G4double ptot = sqrt(momLab2);
188  G4double m12 = mass*mass;
189 
190  // relativistic reduced mass from publucation
191  // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
192 
193  //incident particle & target nucleus
194  G4double Ecm=sqrt(m12 + mass2*mass2 + 2.0*etot*mass2);
195  mu_rel=mass*mass2/Ecm;
196  G4double momCM= ptot*mass2/Ecm;
197  // relative system
198  mom2 = momCM*momCM;
199  invbeta2 = 1.0 + mu_rel*mu_rel/mom2;
200  tkin = momCM*sqrt(invbeta2) - mu_rel;//Ekin of mu_rel
201  G4double beta2=1./invbeta2;
202  beta=std::sqrt(beta2) ;
203  G4double gamma2= 1./(1.-beta2);
204  gamma=std::sqrt(gamma2);
205 
206  //.........................................................
207 
208 
210 
211  //Integration Angles definition
212 
215 
216 
217  G4double anglemin = 1.e-9;
218  //G4double anglemax =std::acos(-1.);
219  G4double loganglemin=log10(anglemin);
220  //G4double loganglemax=log10(anglemax);
221  G4double logdangle=0.01;
222  //G4int bins=(G4int)((loganglemax-loganglemin)/logdangle);
223 
224  for(G4int i=0; i<DIM; ++i ){
225  tet[i]=0;
226  dangle[i]=0;
227  angle[i]=G4Exp(G4Log(10.)*(loganglemin+logdangle*i));
228  cross[i]=0;
229  }
230 
231 
232  for(G4int i=0; i<DIM; ++i){
233 
234  if(i!=DIM-1){
235  dangle[i]=(angle[i+1]-angle[i]);
236  tet[i]=(angle[i+1]+angle[i])/2.;
237  }else if(i==DIM-1){
238  break;
239  }
240  }
241 
242 }
243 
244 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
245 
247 {
248  G4double M=targetMass;
249  G4double E=tkinLab;
250  G4double Etot=E+mass;
251  G4double Tmax=2.*M*E*(E+2.*mass)/(mass*mass+M*M+2.*M*Etot);
252  G4double T=Tmax*G4Exp(G4Log(sin(angles/2.))*2.);
253  G4double q2=T*(T+2.*M);
254  q2/=htc2;//1/cm2
255  G4double RN=1.27e-13*G4Exp(G4Log(targetA)*0.27)*cm;
256  G4double xN= (RN*RN*q2);
257  G4double den=(1.+xN/12.);
258  G4double FN=1./(den*den);
259  G4double form2=(FN*FN);
260 
261  return form2;
262 
263  //cout<<"..................... form2 "<< form2<<endl;
264 }
265 
266 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
267 
269 {
270  G4double beta2=1./invbeta2;
271  G4double sintmezzi=std::sin(angles/2.);
272  G4double sin2tmezzi = sintmezzi*sintmezzi;
273  G4double R=1.-beta2*sin2tmezzi + targetZ*alpha*beta*pi*sintmezzi*(1.-sintmezzi);
274  return R;
275 }
276 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
278 {
279  G4double R=0;
280  G4double fcost=std::sqrt((1. -cos(angles)));
281  G4double a[5];
282  const G4double shift=0.7181228;
283  G4double beta0= beta -shift;
284 
285  for(G4int j=0 ;j<=4;j++){
286  a[j]=0;
287  }
288 
289  for(G4int j=0 ;j<=4;j++){
290  for(G4int k=0;k<=5;k++ ){
291  a[j]+=coeffb[j][k]*G4Exp(G4Log(beta0)*k);
292  }
293  }
294 
295  for(G4int j=0; j<=4; ++j){
296  R+=a[j]*G4Exp(G4Log(fcost)*j);
297  }
298  return R;
299 }
300 
301 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
302 
304 {
305  if(cosTetMaxNuc >= cosTetMinNuc) return 0.0;
306 
307  TotalCross=0;
308 
309  for(G4int i=0; i<DIM; ++i){
310  G4double R=0;
312 
313  if (coeffb[0][0]!=0){
314  //cout<<" Mott....targetZ "<< targetZ<<endl;
315  R=RatioMottRutherford(tet[i]);
316  } else if (coeffb[0][0]==0){
317  // cout<<" McF.... targetZ "<< targetZ<<endl;
318  R=McFcorrection(tet[i]);
319  }
320 
321  //cout<<"----------------- R "<<R<<" F2 "<<F2<<endl;
322  // cout<<"angle "<<tet[i] << " F2 "<<F2<<endl;
323 
324  G4double e4=e2*e2;
325  G4double den=2.*As+2.*G4Exp(G4Log(sin(tet[i]/2.))*2.);
326  G4double func=1./(den*den);
327 
329  G4double sigma=e4*fatt*fatt*func;
330  cross[i]=F2*R*sigma;
331  G4double pi2sintet=twopi*sin(tet[i]);
332 
333  TotalCross+=pi2sintet*cross[i]*dangle[i];
334  }//end integral
335 
336  //cout<< "ok ......... TotalCross "<<TotalCross<<endl;
337  return TotalCross;
338 }
339 
340 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
341 
343 {
346  G4double fatt2=fatt*fatt;
347  total/=fatt2;
348 
349  G4double R=0;
350  if (coeffb[0][0]!=0){
351  // cout<<" Mott....targetZ "<< targetZ<<endl;
352  R=RatioMottRutherford(anglein);
353  } else if (coeffb[0][0]==0){
354  // cout<<" McF.... targetZ "<< targetZ<<endl;
355  R=McFcorrection(anglein);
356  }
357 
358  G4double y=twopi*sin(anglein)*R*FormFactor2ExpHof(anglein)/
359  ( (2*As+2.*G4Exp(G4Log(sin(anglein*0.5))*2.))*(2.*As+2.*G4Exp(G4Log(sin(anglein*0.5))*2.)) );
360 
361  return y/total;
362 }
363 
364 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
365 
367 {
368  // cout<<"................ tkinLab "<< G4BestUnit(tkinLab,"Energy") << " anglemin= "<<anglemin<<endl;
369  //cout<<"anglemax= "<<anglemax<<endl;
370  G4double r =G4UniformRand();
371 
372  G4double scattangle=0;
373  G4double y=0;
374  G4double dy=0;
375  G4double area=0;
376 
377  for(G4int i=0; i<DIM; ++i){
378 
379  y+=AngleDistribution(tet[i])*dangle[i];
380  dy= y-area ;
381  area=y;
382 
383  if(r >=y-dy && r<=y+dy ){
384  scattangle= angle[i] +G4UniformRand()*dangle[i];
385  //cout<<"y "<<y <<" r "<< r << " y/r "<<y/r << endl;
386  break;
387  }
388  }
389  return scattangle;
390 }
391 
392 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
393 
395 
396  G4ThreeVector dir(0.0,0.0,1.0);
397 
399 
400  G4double sint = sin(z1);
401  G4double cost = sqrt(1.0 - sint*sint);
402  G4double phi = twopi* G4UniformRand();
403  G4double dirx = sint*cos(phi);
404  G4double diry = sint*sin(phi);
405  G4double dirz = cost;
406 
407  //.......set Trc
408  G4double etot=tkinLab+mass;
409  G4double mass2=targetMass;
410  Trec=(1.0 - cost)* mass2*(etot*etot - mass*mass )/
411  (mass*mass + mass2*mass2+ 2.*mass2*etot);
412 
413  dir.set(dirx,diry,dirz);
414 
415  return dir;
416 }
417 
418 
static const double cm
Definition: G4SIunits.hh:118
const G4double a0
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
static G4double GetNuclearMass(const G4double A, const G4double Z)
const G4ParticleDefinition * particle
CLHEP::Hep3Vector G4ThreeVector
void Initialise(const G4ParticleDefinition *, G4double cosThetaLim)
void SetupParticle(const G4ParticleDefinition *)
static const G4double e2
G4double a
Definition: TRTMaterials.hh:39
static const G4double e4
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
#define G4UniformRand()
Definition: Randomize.hh:97
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
double A(double temperature)
G4double iz
Definition: TRTMaterials.hh:39
static const double twopi
Definition: G4SIunits.hh:75
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
static const G4double factor
G4double total(Particle const *const p1, Particle const *const p2)
static const double pi
Definition: G4SIunits.hh:74
#define DBL_MIN
Definition: templates.hh:75
G4double GetAtomicMassAmu(const G4String &symb) const
void SetMottCoeff(G4double targetZ, G4double coeff[5][6])
double G4double
Definition: G4Types.hh:76
void SetupKinematic(G4double kinEnergy, G4double Z)
static const G4double alpha
#define DBL_MAX
Definition: templates.hh:83