118 if ( Z < 0.9 || GammaEnergy <= 2.0*electron_mass_c2 ) {
return xSection; }
133 G4double GammaEnergySave = GammaEnergy;
134 if (GammaEnergy < GammaEnergyLimit) { GammaEnergy = GammaEnergyLimit; }
136 G4double X=
G4Log(GammaEnergy/electron_mass_c2), X2=X*X, X3=X2*X, X4=X3*X, X5=X4*X;
138 G4double F1 = a0 + a1*X + a2*X2 + a3*X3 + a4*X4 + a5*X5,
139 F2 = b0 + b1*X + b2*X2 + b3*X3 + b4*X4 + b5*X5,
140 F3 = c0 + c1*X + c2*X2 + c3*X3 + c4*X4 + c5*X5;
142 xSection = (Z + 1.)*(F1*Z + F2*Z*Z + F3);
144 if (GammaEnergySave < GammaEnergyLimit) {
146 X = (GammaEnergySave - 2.*electron_mass_c2)
147 / (GammaEnergyLimit - 2.*electron_mass_c2);
181 G4double epsil0 = electron_mass_c2/GammaEnergy ;
182 if(epsil0 > 1.0) {
return; }
189 CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
192 if (GammaEnergy < Egsmall) {
194 epsil = epsil0 + (0.5-epsil0)*rndmEngine->flat();
201 if (GammaEnergy > 50.*
MeV) { FZ += 8.*(anElement->
GetfCoulomb()); }
205 G4double screenmax = exp ((42.24 - FZ)/8.368) - 0.952 ;
209 G4double epsil1 = 0.5 - 0.5*sqrt(1. - screenmin/screenmax) ;
210 G4double epsilmin =
max(epsil0,epsil1) , epsilrange = 0.5 - epsilmin;
220 G4double NormF1 =
max(F10*epsilrange*epsilrange,0.);
224 if ( NormF1/(NormF1+NormF2) > rndmEngine->flat()) {
225 epsil = 0.5 - epsilrange*
g4calc->
A13(rndmEngine->flat());
226 screenvar = screenfac/(epsil*(1-epsil));
230 epsil = epsilmin + epsilrange*rndmEngine->flat();
231 screenvar = screenfac/(epsil*(1-epsil));
236 }
while( greject < rndmEngine->
flat());
244 G4double ElectTotEnergy, PositTotEnergy;
245 if (rndmEngine->flat() > 0.5) {
247 ElectTotEnergy = (1.-epsil)*GammaEnergy;
248 PositTotEnergy = epsil*GammaEnergy;
252 PositTotEnergy = (1.-epsil)*GammaEnergy;
253 ElectTotEnergy = epsil*GammaEnergy;
265 if (9. > 36.*rndmEngine->flat()) { u *= 1.6; }
266 else { u *= 0.53333; }
268 G4double TetEl = u*electron_mass_c2/ElectTotEnergy;
269 G4double TetPo = u*electron_mass_c2/PositTotEnergy;
271 G4double dxEl= sin(TetEl)*cos(Phi),dyEl= sin(TetEl)*sin(Phi),dzEl=cos(TetEl);
272 G4double dxPo=-sin(TetPo)*cos(Phi),dyPo=-sin(TetPo)*sin(Phi),dzPo=cos(TetPo);
280 G4double ElectKineEnergy =
max(0.,ElectTotEnergy - electron_mass_c2);
283 ElectDirection.rotateUz(GammaDirection);
291 G4double PositKineEnergy =
max(0.,PositTotEnergy - electron_mass_c2);
294 PositDirection.rotateUz(GammaDirection);
301 fvect->push_back(aParticle1);
302 fvect->push_back(aParticle2);
static G4Pow * GetInstance()
static c2_factory< G4double > c2
G4ParticleChangeForGamma * fParticleChange
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
G4ParticleDefinition * thePositron
G4double GetfCoulomb() const
G4double ScreenFunction2(G4double ScreenVariable)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
static constexpr double twopi
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX) override
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
G4double ScreenFunction1(G4double ScreenVariable)
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * theGamma
std::vector< G4EmElementSelector * > * GetElementSelectors()
G4BetheHeitlerModel(const G4ParticleDefinition *p=0, const G4String &nam="BetheHeitler")
G4double GetlogZ3() const
G4double G4Log(G4double x)
static G4Positron * Positron()
G4ParticleDefinition * theElectron
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
virtual ~G4BetheHeitlerModel()
G4double A13(G4double A) const
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4IonisParamElm * GetIonisation() const
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
static G4Electron * Electron()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
static constexpr double MeV
void ProposeTrackStatus(G4TrackStatus status)
G4ThreeVector G4ParticleMomentum
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
static constexpr double microbarn
G4ParticleChangeForGamma * GetParticleChangeForGamma()
const G4Material * GetMaterial() const