60G4double G4WentzelVIRelXSection::ScreenRSquare[] = {0.0};
61G4double G4WentzelVIRelXSection::FormFactor[] = {0.0};
69 alpha2(fine_structure_const*fine_structure_const)
76 lowEnergyLimit = 1.0*eV;
77 G4double p0 = electron_mass_c2*classic_electr_radius;
84 if(0.0 == ScreenRSquare[0]) {
85 G4double a0 = electron_mass_c2/0.88534;
86 G4double constn = 6.937e-6/(MeV*MeV);
88 ScreenRSquare[0] = alpha2*a0*a0;
89 for(
G4int j=1; j<100; ++j) {
92 ScreenRSquare[j] = 0.5*alpha2*x*x;
93 x = fNistManager->
GetA27(j);
94 FormFactor[j] = constn*x*x;
98 elecXSRatio = factB = factD = formfactA = screenZ = 0.0;
99 cosTetMaxElec = cosTetMaxNuc = invbeta2 = kinFactor = gam0pcmp = pcmp2 = 1.0;
101 factB1= 0.5*CLHEP::pi*fine_structure_const;
104 targetMass = proton_mass_c2;
118 tkin = mom2 = momCM2 = 0.0;
121 cosThetaMax = CosThetaLim;
135 if(0.0 != spin) { spin = 0.5; }
138 charge3 = chargeSquare*q;
149 G4double cosTetMaxNuc2 = cosTetMaxNuc;
150 if(Z != targetZ || tkin != etag) {
153 if(targetZ > 99) { targetZ = 99; }
162 kinFactor = coeff*targetZ*chargeSquare*invbeta2/mom2;
164 screenZ = ScreenRSquare[targetZ]/mom2;
166 screenZ *= std::min(Z*1.13,1.13 +3.76*Z*Z*invbeta2*alpha2*chargeSquare);
178 if(targetZ == 1 && cosTetMaxNuc2 < 0.0 && particle == theProton) {
181 formfactA = FormFactor[targetZ]*mom2;
184 ComputeMaxElectronScattering(cut);
186 return cosTetMaxNuc2;
195 if(cosTMax >= 1.0) {
return xsec; }
204 G4double costm = std::max(cosTMax,cosTetMaxElec);
209 x = (1.0 - costm)/screenZ;
212 y = x2*(1.0 - 1.3333333*x + 3*x2);
213 if(0.0 < factB) { y -= fb*x2*x*(0.6666667 - x); }
218 if(0.0 < factB) { y -= fb*(x + x1 - 2*xlog); }
223 if(nwarnings < nwarnlimit) {
224 G4cout <<
"G4WentzelVIRelXSection::ComputeTransportCrossSectionPerAtom scattering on e- <0"
227 <<
" e(MeV)= " << tkin <<
" p(MeV/c)= " << sqrt(mom2)
228 <<
" Z= " << targetZ <<
" "
230 G4cout <<
" 1-costm= " << 1.0-costm <<
" screenZ= " << screenZ
247 x = (1.0 - cosTMax)/screenZ;
250 y = x2*(1.0 - 1.3333333*x + 3*x2);
251 if(0.0 < factB) { y -= fb*x2*x*(0.6666667 - x); }
256 if(0.0 < factB) { y -= fb*(x + x1 - 2*xlog); }
261 if(nwarnings < nwarnlimit) {
262 G4cout <<
"G4WentzelVIRelXSection::ComputeTransportCrossSectionPerAtom scattering on e- <0"
265 <<
" e(MeV)= " << tkin <<
" Z= " << targetZ <<
" "
267 G4cout <<
" formfactA= " << formfactA <<
" screenZ= " << screenZ
268 <<
" x= " <<
" x1= " << x1 <<
G4endl;
272 xSection += y*targetZ;
274 xSection *= kinFactor;
298 if(elecRatio > 0.0) {
301 cost1 = std::max(cost1,cosTetMaxElec);
302 cost2 = std::max(cost2,cosTetMaxElec);
305 if(cost1 < cost2) {
return v; }
314 G4double grej = (1. - z1*factB + factB1*targetZ*sqrt(z1*factB)*(2 - z1))/( (1.0 + z1*factD)*fm*fm );
320 if(cost > 1.0) { cost = 1.0; }
321 else if(cost < -1.0) { cost =-1.0; }
322 G4double sint = sqrt((1.0 - cost)*(1.0 + cost));
336G4WentzelVIRelXSection::ComputeMaxElectronScattering(
G4double cutEnergy)
339 G4double ratio = electron_mass_c2/mass;
341 G4double tmax = 2.0*electron_mass_c2*tau*(tau + 2.)/
342 (1.0 + 2.0*ratio*(tau + 1.0) + ratio*ratio);
344 cosTetMaxElec = 1.0 - std::min(cutEnergy, tmax)*electron_mass_c2/mom2;
348 if(particle == theElectron) { tmax *= 0.5; }
350 G4double t = std::min(cutEnergy, tmax);
351 G4double mom21 = t*(t + 2.0*electron_mass_c2);
356 G4double mom22 = t1*(t1 + 2.0*mass);
357 G4double ctm = (mom2 + mom22 - mom21)*0.5/sqrt(mom2*mom22);
358 if(ctm < 1.0) { cosTetMaxElec = ctm; }
359 if(particle == theElectron && cosTetMaxElec < 0.0) { cosTetMaxElec = 0.0; }
G4DLLIMPORT std::ostream G4cout
void set(double x, double y, double z)
static G4Electron * Electron()
static G4LossTableManager * Instance()
G4double FactorForAngleLimit() const
static G4NistManager * Instance()
G4double GetAtomicMassAmu(const G4String &symb) const
G4double GetPDGMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4double GetPDGSpin() const
static G4Positron * Positron()
static G4Pow * GetInstance()
static G4Proton * Proton()
void SetTargetMass(G4double value)
G4double ComputeTransportCrossSectionPerAtom(G4double CosThetaMax)
G4double SetupTarget(G4int Z, G4double cut=DBL_MAX)
void SetupParticle(const G4ParticleDefinition *)
G4ThreeVector SampleSingleScattering(G4double CosThetaMin, G4double CosThetaMax, G4double elecRatio=0.0)
void Initialise(const G4ParticleDefinition *, G4double CosThetaLim)
virtual ~G4WentzelVIRelXSection()