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

#include <G4WentzelVIRelXSection.hh>

Public Member Functions

 G4WentzelVIRelXSection (G4bool combined=true)
 
virtual ~G4WentzelVIRelXSection ()
 
void Initialise (const G4ParticleDefinition *, G4double CosThetaLim)
 
void SetupParticle (const G4ParticleDefinition *)
 
G4double SetupTarget (G4int Z, G4double cut)
 
G4double ComputeTransportCrossSectionPerAtom (G4double CosThetaMax)
 
G4ThreeVector & SampleSingleScattering (G4double CosThetaMin, G4double CosThetaMax, G4double elecRatio)
 
G4double ComputeNuclearCrossSection (G4double CosThetaMin, G4double CosThetaMax)
 
G4double ComputeElectronCrossSection (G4double CosThetaMin, G4double CosThetaMax)
 
G4double SetupKinematic (G4double kinEnergy, const G4Material *mat, G4double cut, G4double tmass)
 
G4double GetMomentumSquare () const
 
G4double GetCosThetaNuc () const
 
G4double GetCosThetaElec () const
 

Detailed Description

Definition at line 71 of file G4WentzelVIRelXSection.hh.

Constructor & Destructor Documentation

G4WentzelVIRelXSection::G4WentzelVIRelXSection ( G4bool  combined = true)
explicit

Definition at line 67 of file G4WentzelVIRelXSection.cc.

67  :
68  temp(0.,0.,0.),
69  numlimit(0.1),
70  nwarnings(0),
71  nwarnlimit(50),
72  isCombined(combined),
74 {
75  fNistManager = G4NistManager::Instance();
76  fG4pow = G4Pow::GetInstance();
77  theElectron = G4Electron::Electron();
78  thePositron = G4Positron::Positron();
79  theProton = G4Proton::Proton();
80  lowEnergyLimit = 1.0*eV;
82  coeff = twopi*p0*p0;
83  particle = nullptr;
84 
85  // Thomas-Fermi screening radii
86  // Formfactors from A.V. Butkevich et al., NIM A 488 (2002) 282
87 
88  if(0.0 == ScreenRSquare[0]) {
89  G4double a0 = electron_mass_c2/0.88534;
90  G4double constn = 6.937e-6/(MeV*MeV);
91 
92  ScreenRSquare[0] = alpha2*a0*a0;
93  for(G4int j=1; j<100; ++j) {
94  G4double x = a0*fG4pow->Z13(j);
95  //ScreenRSquare[j] = 0.5*(1 + exp(-j*j*0.001))*alpha2*x*x;
96  ScreenRSquare[j] = 0.5*alpha2*x*x;
97  x = fNistManager->GetA27(j);
98  FormFactor[j] = constn*x*x;
99  }
100  }
101  currentMaterial = 0;
102  factB = factD = formfactA = screenZ = 0.0;
103  cosTetMaxElec = cosTetMaxNuc = invbeta2 = kinFactor = gam0pcmp = pcmp2 = 1.0;
104  cosThetaMax = 1.0;
105 
106  factB1= 0.5*CLHEP::pi*fine_structure_const;
107 
108  tkin = mom2 = momCM2 = factorA2 = mass = spin = chargeSquare = charge3 = 0.0;
109  ecut = etag = DBL_MAX;
110  targetZ = 0;
111  targetMass = proton_mass_c2;
112 }
const G4double a0
static G4Pow * GetInstance()
Definition: G4Pow.cc:55
static constexpr double proton_mass_c2
G4double GetA27(G4int Z) const
int G4int
Definition: G4Types.hh:78
static G4NistManager * Instance()
static constexpr double twopi
Definition: G4SIunits.hh:76
static constexpr double electron_mass_c2
G4double Z13(G4int Z) const
Definition: G4Pow.hh:127
static constexpr double classic_electr_radius
static G4Proton * Proton()
Definition: G4Proton.cc:93
static constexpr double eV
Definition: G4SIunits.hh:215
static G4Positron * Positron()
Definition: G4Positron.cc:94
static G4Electron * Electron()
Definition: G4Electron.cc:94
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
static constexpr double fine_structure_const
#define DBL_MAX
Definition: templates.hh:83
static constexpr double pi
Definition: SystemOfUnits.h:54

Here is the call graph for this function:

G4WentzelVIRelXSection::~G4WentzelVIRelXSection ( )
virtual

Definition at line 116 of file G4WentzelVIRelXSection.cc.

117 {}

Member Function Documentation

G4double G4WentzelVIRelXSection::ComputeElectronCrossSection ( G4double  CosThetaMin,
G4double  CosThetaMax 
)
inline

Definition at line 259 of file G4WentzelVIRelXSection.hh.

261 {
262  G4double xsec = 0.0;
263  G4double cost1 = std::max(cosTMin,cosTetMaxElec);
264  G4double cost2 = std::max(cosTMax,cosTetMaxElec);
265  if(cost1 > cost2) {
266  xsec = kinFactor*(cost1 - cost2)/
267  ((1.0 - cost1 + screenZ)*(1.0 - cost2 + screenZ));
268  }
269  return xsec;
270 }
T max(const T t1, const T t2)
brief Return the largest of the two arguments
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4WentzelVIRelXSection::ComputeNuclearCrossSection ( G4double  CosThetaMin,
G4double  CosThetaMax 
)
inline

Definition at line 245 of file G4WentzelVIRelXSection.hh.

247 {
248  G4double xsec = 0.0;
249  if(cosTMax < cosTMin) {
250  xsec = targetZ*kinFactor*(cosTMin - cosTMax)/
251  ((1.0 - cosTMin + screenZ)*(1.0 - cosTMax + screenZ));
252  }
253  return xsec;
254 }
double G4double
Definition: G4Types.hh:76

Here is the caller graph for this function:

G4double G4WentzelVIRelXSection::ComputeTransportCrossSectionPerAtom ( G4double  CosThetaMax)

Definition at line 184 of file G4WentzelVIRelXSection.cc.

185 {
186  G4double xsec = 0.0;
187  if(cosTMax >= 1.0) { return xsec; }
188 
189  G4double xSection = 0.0;
190  G4double x = 0;
191  G4double y = 0;
192  G4double x1= 0;
193  G4double x2= 0;
194  G4double xlog = 0.0;
195 
196  G4double costm = std::max(cosTMax,cosTetMaxElec);
197  G4double fb = screenZ*factB;
198 
199  // scattering off electrons
200  if(costm < 1.0) {
201  x = (1.0 - costm)/screenZ;
202  if(x < numlimit) {
203  x2 = 0.5*x*x;
204  y = x2*(1.0 - 1.3333333*x + 3*x2);
205  if(0.0 < factB) { y -= fb*x2*x*(0.6666667 - x); }
206  } else {
207  x1= x/(1 + x);
208  xlog = G4Log(1.0 + x);
209  y = xlog - x1;
210  if(0.0 < factB) { y -= fb*(x + x1 - 2*xlog); }
211  }
212 
213  if(y < 0.0) {
214  ++nwarnings;
215  if(nwarnings < nwarnlimit) {
216  G4cout << "G4WentzelVIRelXSection::ComputeTransportCrossSectionPerAtom scattering on e- <0"
217  << G4endl;
218  G4cout << "y= " << y
219  << " e(MeV)= " << tkin << " p(MeV/c)= " << sqrt(mom2)
220  << " Z= " << targetZ << " "
221  << particle->GetParticleName() << G4endl;
222  G4cout << " 1-costm= " << 1.0-costm << " screenZ= " << screenZ
223  << " x= " << x << G4endl;
224  }
225  y = 0.0;
226  }
227  xSection = y;
228  }
229  /*
230  G4cout << "G4WentzelVI:XS per A " << " Z= " << targetZ
231  << " e(MeV)= " << tkin/MeV << " XSel= " << xSection
232  << " cut(MeV)= " << ecut/MeV
233  << " zmaxE= " << (1.0 - cosTetMaxElec)/screenZ
234  << " zmaxN= " << (1.0 - cosThetaMax)/screenZ
235  << " 1-costm= " << 1.0 - cosThetaMax << G4endl;
236  */
237  // scattering off nucleus
238  if(cosTMax < 1.0) {
239  x = (1.0 - cosTMax)/screenZ;
240  if(x < numlimit) {
241  x2 = 0.5*x*x;
242  y = x2*(1.0 - 1.3333333*x + 3*x2);
243  if(0.0 < factB) { y -= fb*x2*x*(0.6666667 - x); }
244  } else {
245  x1= x/(1 + x);
246  xlog = G4Log(1.0 + x);
247  y = xlog - x1;
248  if(0.0 < factB) { y -= fb*(x + x1 - 2*xlog); }
249  }
250 
251  if(y < 0.0) {
252  ++nwarnings;
253  if(nwarnings < nwarnlimit) {
254  G4cout << "G4WentzelVIRelXSection::ComputeTransportCrossSectionPerAtom scattering on e- <0"
255  << G4endl;
256  G4cout << "y= " << y
257  << " e(MeV)= " << tkin << " Z= " << targetZ << " "
258  << particle->GetParticleName() << G4endl;
259  G4cout << " formfactA= " << formfactA << " screenZ= " << screenZ
260  << " x= " << " x1= " << x1 <<G4endl;
261  }
262  y = 0.0;
263  }
264  xSection += y*targetZ;
265  }
266  xSection *= kinFactor;
267  /*
268  G4cout << "Z= " << targetZ << " XStot= " << xSection/barn
269  << " screenZ= " << screenZ << " formF= " << formfactA
270  << " for " << particle->GetParticleName()
271  << " m= " << mass << " 1/v= " << sqrt(invbeta2) << " p= " << sqrt(mom2)
272  << " x= " << x
273  << G4endl;
274  */
275  return xSection;
276 }
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4double G4Log(G4double x)
Definition: G4Log.hh:230
T max(const T t1, const T t2)
brief Return the largest of the two arguments
#define G4endl
Definition: G4ios.hh:61
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4WentzelVIRelXSection::GetCosThetaElec ( ) const
inline

Definition at line 237 of file G4WentzelVIRelXSection.hh.

238 {
239  return cosTetMaxElec;
240 }
G4double G4WentzelVIRelXSection::GetCosThetaNuc ( ) const
inline

Definition at line 230 of file G4WentzelVIRelXSection.hh.

231 {
232  return cosTetMaxNuc;
233 }
G4double G4WentzelVIRelXSection::GetMomentumSquare ( ) const
inline

Definition at line 223 of file G4WentzelVIRelXSection.hh.

224 {
225  return mom2;
226 }
void G4WentzelVIRelXSection::Initialise ( const G4ParticleDefinition *  p,
G4double  CosThetaLim 
)

Definition at line 121 of file G4WentzelVIRelXSection.cc.

123 {
124  SetupParticle(p);
125  tkin = mom2 = momCM2 = 0.0;
126  ecut = etag = DBL_MAX;
127  targetZ = 0;
128 
129  // cosThetaMax is below 1.0 only when MSC is combined with SS
130  if(isCombined) { cosThetaMax = cosThetaLim; }
131 
134  factorA2 = 0.5*a*a;
135  currentMaterial = nullptr;
136 }
static constexpr double hbarc
void SetupParticle(const G4ParticleDefinition *)
static G4EmParameters * Instance()
static constexpr double fermi
Definition: SystemOfUnits.h:83
double G4double
Definition: G4Types.hh:76
#define DBL_MAX
Definition: templates.hh:83
G4double FactorForAngleLimit() const

Here is the call graph for this function:

Here is the caller graph for this function:

G4ThreeVector & G4WentzelVIRelXSection::SampleSingleScattering ( G4double  CosThetaMin,
G4double  CosThetaMax,
G4double  elecRatio 
)

Definition at line 281 of file G4WentzelVIRelXSection.cc.

284 {
285  temp.set(0.0,0.0,1.0);
286 
287  CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
288 
289  G4double formf = formfactA;
290  G4double cost1 = cosTMin;
291  G4double cost2 = cosTMax;
292  if(elecRatio > 0.0) {
293  if(rndmEngine->flat() <= elecRatio) {
294  formf = 0.0;
295  cost1 = std::max(cost1,cosTetMaxElec);
296  cost2 = std::max(cost2,cosTetMaxElec);
297  }
298  }
299  if(cost1 < cost2) { return temp; }
300 
301  G4double w1 = 1. - cost1 + screenZ;
302  G4double w2 = 1. - cost2 + screenZ;
303  G4double z1 = w1*w2/(w1 + rndmEngine->flat()*(w2 - w1)) - screenZ;
304 
305  G4double fm = 1.0 + formf*z1;
306  G4double grej = (1. - z1*factB + factB1*targetZ*sqrt(z1*factB)*(2 - z1))
307  /( (1.0 + z1*factD)*fm*fm );
308  // "false" scattering
309  if(rndmEngine->flat() > grej ) { return temp; }
310  // }
311  G4double cost = 1.0 - z1;
312 
313  if(cost > 1.0) { cost = 1.0; }
314  else if(cost < -1.0) { cost =-1.0; }
315  G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
316  //G4cout << "sint= " << sint << G4endl;
317  G4double phi = twopi*rndmEngine->flat();
318  G4double vx1 = sint*cos(phi);
319  G4double vy1 = sint*sin(phi);
320 
321  // only direction is changed
322  temp.set(vx1,vy1,cost);
323  return temp;
324 }
void set(double x, double y, double z)
virtual double flat()=0
static constexpr double twopi
Definition: G4SIunits.hh:76
T max(const T t1, const T t2)
brief Return the largest of the two arguments
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4WentzelVIRelXSection::SetupKinematic ( G4double  kinEnergy,
const G4Material *  mat,
G4double  cut,
G4double  tmass 
)
inline

Definition at line 180 of file G4WentzelVIRelXSection.hh.

184 {
185  if(kinEnergy != tkin || mat != currentMaterial ||
186  ecut != cut || tmass != targetMass) {
187 
188  currentMaterial = mat;
189  ecut = cut;
190  tkin = kinEnergy;
191  G4double momLab2 = tkin*(tkin + 2.0*mass);
192 
193  G4double etot = tkin + mass;
194  G4double ptot = std::sqrt(momLab2);
195  G4double m12 = mass*mass;
196 
197  targetMass = tmass;
198 
199  // relativistic reduced mass from publucation
200  // A.P. Martynenko, R.N. Faustov, Teoret. mat. Fiz. 64 (1985) 179
201 
202  //incident particle & target nucleus
203  G4double Ecm = std::sqrt(m12 + targetMass*targetMass + 2.0*etot*targetMass);
204  G4double mu_rel = mass*targetMass/Ecm;
205  G4double momCM = ptot*targetMass/Ecm;
206  // relative system
207  mom2 = momCM*momCM;
208  invbeta2 = 1.0 + mu_rel*mu_rel/mom2;
209 
210  factB = spin/invbeta2;
211  factD = std::sqrt(mom2)/tmass;
212  if(isCombined) {
213  G4double cost = 1.-factorA2*mat->GetIonisation()->GetInvA23()/mom2;
214  if(cost > cosTetMaxNuc) { cosTetMaxNuc = cost; }
215  }
216  }
217  return cosTetMaxNuc;
218 
219 }
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:226
G4double GetInvA23() const
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

void G4WentzelVIRelXSection::SetupParticle ( const G4ParticleDefinition *  p)

Definition at line 140 of file G4WentzelVIRelXSection.cc.

141 {
142  particle = p;
143  mass = particle->GetPDGMass();
144  spin = particle->GetPDGSpin();
145  if(0.0 != spin) { spin = 0.5; }
146  G4double q = std::fabs(particle->GetPDGCharge()/eplus);
147  chargeSquare = q*q;
148  charge3 = chargeSquare*q;
149  tkin = 0.0;
150  currentMaterial = nullptr;
151  targetZ = 0;
152 }
const char * p
Definition: xmltok.h:285
static constexpr double eplus
Definition: G4SIunits.hh:199
G4double GetPDGMass() const
G4double GetPDGSpin() const
double G4double
Definition: G4Types.hh:76
G4double GetPDGCharge() const

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4WentzelVIRelXSection::SetupTarget ( G4int  Z,
G4double  cut 
)

Definition at line 157 of file G4WentzelVIRelXSection.cc.

158 {
159  G4double cosTetMaxNuc2 = cosTetMaxNuc;
160  if(Z != targetZ || tkin != etag) {
161  etag = tkin;
162  targetZ = Z;
163 
164  kinFactor = coeff*targetZ*chargeSquare*invbeta2/mom2;
165 
166  screenZ = ScreenRSquare[targetZ]/mom2;
167  if(Z > 1) {
168  screenZ *= std::min(Z*1.13,1.13 +3.76*Z*Z*invbeta2*alpha2*chargeSquare);
169  }
170  if(targetZ == 1 && cosTetMaxNuc2 < 0.0 && particle == theProton) {
171  cosTetMaxNuc2 = 0.0;
172  }
173  formfactA = FormFactor[targetZ]*mom2;
174 
175  cosTetMaxElec = 1.0;
176  ComputeMaxElectronScattering(cut);
177  }
178  return cosTetMaxNuc2;
179 }
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
double G4double
Definition: G4Types.hh:76

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: