65 fParticleChange =
nullptr;
78 if(fParticleChange) {
return; }
88 G4double ekin = std::max(eV,kinEnergy);
89 G4double tau = ekin/electron_mass_c2;
96 - (gam+3.)/(sqrt(gam*gam - 1.)) + 1.;
100 border = 1. - (electron_mass_c2)/(2*(ekin + electron_mass_c2));
102 border = 1. - (100*electron_mass_c2)/(2*(ekin + electron_mass_c2));
105 border = std::min(border, 0.9999);
107 if (fr1>border) { fr1 = border; }
108 if (fr2>border) { fr2 = border; }
109 if (fr3>border) { fr3 = border; }
116 G4double ab = fr3s + (fr1-fr2)*(fr1-fr2);
117 G4double add= ((1.-fr1)*(1.-fr1) + (1.-fr2)*(1.-fr2))/(fr3s*aa);
119 G4double fres = -rho*(1./fr1s + 1./fr2s)
120 + (ab/(2.*(fr1*fr2*aa)))*(
G4Log(2.*gam*aa/(fr1*fr2)))
121 + (ab/(2.*fr1*fr2*(1-fr3)))*
G4Log(2.*gam*(1.-fr3)/(fr1*fr2)) - add;
139 - (gam+3.)/(sqrt(gam*gam - 1.)) + 1.;
142 if (fr1>border) { fr1 = border; }
143 if (fr2>border) { fr2 = border; }
144 if (fr3>border) { fr3 = border; }
151 G4double ab = fr3s + (fr1-fr2)*(fr1-fr2);
152 G4double add= ((1.-fr1)*(1.-fr1) + (1.-fr2)*(1.-fr2))/(fr3s*aa);
154 G4double fres = -rho*(1./fr1s + 1./fr2s)
155 + (ab/(2.*(fr1*fr2*aa)))*(
G4Log(2.*gam*aa/(fr1*fr2)))
156 + (ab/(2.*fr1*fr2*(1-fr3)))*
G4Log(2.*gam*(1.-fr3)/(fr1*fr2)) - add;
165 G4double ekin = std::max(eV,kinEnergy);
166 G4double tau = ekin/electron_mass_c2;
173 G4double dcross = fsum/((3*fr1*fr1*(gam+1.)));
186 G4double ekin = std::max(eV,kinEnergy);
187 G4double tau = ekin/electron_mass_c2;
194 - (gam+3.)/(sqrt(gam*gam - 1.));
196 G4double cross = alpha_rcl2*(4.2 - (2.*
G4Log(fDelta)+1.)*rho*rho)/(gam+1.);
247 if(posiKinEnergy < 500*MeV) {
248 border = 1. - (electron_mass_c2)/(2*(posiKinEnergy + electron_mass_c2));
250 border = 1. - (100*electron_mass_c2)/(2*(posiKinEnergy + electron_mass_c2));
252 border = std::min(border, 0.9999);
257 if(posiKinEnergy == 0.0) {
259 G4double sint = sqrt((1. - cost)*(1. + cost));
262 phi = twopi * rndmEngine->
flat();
270 pol.
set(-sinphi, cosphi, 0.0);
282 G4double d1, d0, x1, x2, dmax, x2min;
286 x1 = 1/((1/xmin) - ((1/xmin)-(1/xmax))*rndmEngine->
flat());
287 dmax =
ComputeFS(posiKinEnergy, x1,1.-x1,border);
289 x2 = 1 - rndmEngine->
flat()*(1-x2min);
290 d1 = dmax*rndmEngine->
flat();
291 d0 =
ComputeFS(posiKinEnergy,x1,x2,2-x1-x2);
301 G4double psi13 = 2*asin(sqrt(std::abs((x1+x3-1)/(x1*x3))));
302 G4double psi12 = 2*asin(sqrt(std::abs((x1+x2-1)/(x1*x2))));
313 G4double TotalAvailableEnergy = posiKinEnergy + 2.0*electron_mass_c2;
315 G4double phot1Energy = 0.5*x1*TotalAvailableEnergy;
316 G4double phot2Energy = 0.5*x2*TotalAvailableEnergy;
317 G4double phot3Energy = 0.5*x3*TotalAvailableEnergy;
329 phot1Direction.
rotateUz(posiDirection);
330 phot2Direction.
rotateUz(posiDirection);
331 phot3Direction.
rotateUz(posiDirection);
358 pol.set(-sinphi, cosphi, 0.0);
359 pol.rotateUz(phot1Direction);
360 cost = pol*phot2Direction;
361 pol -= cost*phot2Direction;
363 aGamma2->SetPolarization(pol.x(),pol.y(),pol.z());
377 vdp->push_back(aGamma1);
378 vdp->push_back(aGamma2);
379 if(aGamma3 !=
nullptr) { vdp->push_back(aGamma3); }
G4double G4Log(G4double x)
void set(double x, double y, double z)
Hep3Vector & rotateUz(const Hep3Vector &)
void SetPolarization(const G4ThreeVector &)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
G4double GetElectronDensity() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
void ProposeTrackStatus(G4TrackStatus status)
G4double ComputeF0(G4double fr1, G4double fr2, G4double fr3)
G4double ComputeCrossSectionPerElectron(G4double kinEnergy)
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0., G4double maxEnergy=DBL_MAX) final
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double maxEnergy=DBL_MAX) final
G4double ComputeF(G4double fr1, G4double fr2, G4double fr3, G4double kinEnergy)
G4eplusTo3GammaOKVIModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="eplus3ggOKVI")
void Initialise(const G4ParticleDefinition *, const G4DataVector &) final
G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX) final
G4double ComputeFS(G4double fr1, G4double fr2, G4double fr3, G4double kinEnergy)
~G4eplusTo3GammaOKVIModel() override