133 static const G4double kMC2 = CLHEP::electron_mass_c2;
135 if (Z < 0.9 || gammaEnergy <= 2.0*kMC2) {
return xSection; }
139 return fXSection->GetXS(iZ, gammaEnergy);
143 static const G4double gammaEnergyLimit = 1.5*CLHEP::MeV;
145 static const G4double a0 = 8.7842e+2*CLHEP::microbarn;
146 static const G4double a1 = -1.9625e+3*CLHEP::microbarn;
147 static const G4double a2 = 1.2949e+3*CLHEP::microbarn;
148 static const G4double a3 = -2.0028e+2*CLHEP::microbarn;
149 static const G4double a4 = 1.2575e+1*CLHEP::microbarn;
150 static const G4double a5 = -2.8333e-1*CLHEP::microbarn;
152 static const G4double b0 = -1.0342e+1*CLHEP::microbarn;
153 static const G4double b1 = 1.7692e+1*CLHEP::microbarn;
154 static const G4double b2 = -8.2381 *CLHEP::microbarn;
155 static const G4double b3 = 1.3063 *CLHEP::microbarn;
156 static const G4double b4 = -9.0815e-2*CLHEP::microbarn;
157 static const G4double b5 = 2.3586e-3*CLHEP::microbarn;
159 static const G4double c0 = -4.5263e+2*CLHEP::microbarn;
160 static const G4double c1 = 1.1161e+3*CLHEP::microbarn;
161 static const G4double c2 = -8.6749e+2*CLHEP::microbarn;
162 static const G4double c3 = 2.1773e+2*CLHEP::microbarn;
163 static const G4double c4 = -2.0467e+1*CLHEP::microbarn;
164 static const G4double c5 = 6.5372e-1*CLHEP::microbarn;
166 G4double gammaEnergyOrg = gammaEnergy;
167 if (gammaEnergy < gammaEnergyLimit) { gammaEnergy = gammaEnergyLimit; }
175 const G4double F1 =
a0 + a1*x + a2*x2 + a3*x3 + a4*x4 + a5*x5;
176 const G4double F2 = b0 + b1*x + b2*x2 + b3*x3 + b4*x4 + b5*x5;
177 const G4double F3 = c0 + c1*x + c2*x2 + c3*x3 + c4*x4 + c5*x5;
179 xSection = (Z + 1.)*(F1*Z + F2*Z*Z + F3);
181 if (gammaEnergyOrg < gammaEnergyLimit) {
182 const G4double dum = (gammaEnergyOrg-2.*kMC2)/(gammaEnergyLimit-2.*kMC2);
186 xSection = std::max(xSection, 0.);
209 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
212 if (eps0 > 0.5) {
return; }
229 static const G4double Egsmall = 2.*CLHEP::MeV;
230 if (gammaEnergy < Egsmall) {
231 eps = eps0 + (0.5-eps0)*rndmEngine->
flat();
249 static const G4double midEnergy = 50.*CLHEP::MeV;
254 if (gammaEnergy > midEnergy) {
258 const G4double deltaMin = 4.*deltaFactor;
261 const G4double epsp = 0.5 - 0.5*std::sqrt(1. - deltaMin/deltaMax) ;
262 const G4double epsMin = std::max(eps0,epsp);
263 const G4double epsRange = 0.5 - epsMin;
270 const G4double NormF1 = std::max(
F10 * epsRange * epsRange, 0.);
272 const G4double NormCond = NormF1/(NormF1 + NormF2);
278 if (NormCond > rndmv[0]) {
279 eps = 0.5 - epsRange *
fG4Calc->A13(rndmv[1]);
280 const G4double delta = deltaFactor/(eps*(1.-eps));
283 eps = epsMin + epsRange*rndmv[1];
284 const G4double delta = deltaFactor/(eps*(1.-eps));
288 }
while (greject < rndmv[2]);
293 if (rndmEngine->
flat() > 0.5) {
294 eTotEnergy = (1.-eps)*gammaEnergy;
295 pTotEnergy = eps*gammaEnergy;
297 pTotEnergy = (1.-eps)*gammaEnergy;
298 eTotEnergy = eps*gammaEnergy;
302 const G4double eKinEnergy = std::max(0.,eTotEnergy - CLHEP::electron_mass_c2);
303 const G4double pKinEnergy = std::max(0.,pTotEnergy - CLHEP::electron_mass_c2);
308 eKinEnergy, pKinEnergy,
309 eDirection, pDirection);
315 fvect->push_back(aParticle1);
316 fvect->push_back(aParticle2);
327 for (
auto const &
elem : *elemTable) {
334 elD->fDeltaMaxLow =
G4Exp((42.038 - FZLow )/8.29) - 0.958;
335 elD->fDeltaMaxHigh =
G4Exp((42.038 - FZHigh)/8.29) - 0.958;
G4TemplateAutoLock< G4Mutex > G4AutoLock
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double G4Log(G4double x)
#define G4MUTEX_INITIALIZER
CLHEP::Hep3Vector G4ThreeVector
virtual void flatArray(const int size, double *vect)=0
void InitialiseElementData()
G4ParticleChangeForGamma * fParticleChange
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4BetheHeitlerModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="BetheHeitler")
const G4ParticleDefinition * fTheElectron
void ScreenFunction12(const G4double delta, G4double &f1, G4double &f2)
G4double ScreenFunction1(const G4double delta)
static const G4int gMaxZet
static std::vector< ElementData * > gElementData
const G4ParticleDefinition * fTheGamma
G4EmElementXS * fXSection
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
const G4ParticleDefinition * fThePositron
G4double ScreenFunction2(const G4double delta)
~G4BetheHeitlerModel() override
void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static const G4ElementTable * GetElementTable()
G4double GetfCoulomb() const
G4IonisParamElm * GetIonisation() const
G4bool UseEPICS2017XS() const
static G4EmParameters * Instance()
G4double GetlogZ3() const
virtual void SamplePairDirections(const G4DynamicParticle *dp, G4double elecKinEnergy, G4double posiKinEnergy, G4ThreeVector &dirElectron, G4ThreeVector &dirPositron, G4int Z=0, const G4Material *mat=nullptr)
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
G4VEmAngularDistribution * GetAngularDistribution()
G4ParticleChangeForGamma * GetParticleChangeForGamma()
std::vector< G4EmElementSelector * > * GetElementSelectors()
G4VEmModel(const G4String &nam)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)