65 fParticleChange =
nullptr;
79 if(fParticleChange) {
return; }
89 G4double ekin = std::max(eV,kinEnergy);
90 G4double tau = ekin/electron_mass_c2;
97 - (gam+3.)/(sqrt(gam*gam - 1.)) + 1.;
101 border = 1. - (electron_mass_c2)/(2*(ekin + electron_mass_c2));
103 border = 1. - (100*electron_mass_c2)/(2*(ekin + electron_mass_c2));
106 border = std::min(border, 0.9999);
108 if (fr1>border) { fr1 = border; }
109 if (fr2>border) { fr2 = border; }
110 if (fr3>border) { fr3 = border; }
117 G4double ab = fr3s + (fr1-fr2)*(fr1-fr2);
118 G4double add= ((1.-fr1)*(1.-fr1) + (1.-fr2)*(1.-fr2))/(fr3s*aa);
120 G4double fres = -rho*(1./fr1s + 1./fr2s)
121 + (ab/(2.*(fr1*fr2*aa)))*(
G4Log(2.*gam*aa/(fr1*fr2)))
122 + (ab/(2.*fr1*fr2*(1-fr3)))*
G4Log(2.*gam*(1.-fr3)/(fr1*fr2)) - add;
140 - (gam+3.)/(sqrt(gam*gam - 1.)) + 1.;
143 if (fr1>border) { fr1 = border; }
144 if (fr2>border) { fr2 = border; }
145 if (fr3>border) { fr3 = border; }
152 G4double ab = fr3s + (fr1-fr2)*(fr1-fr2);
153 G4double add= ((1.-fr1)*(1.-fr1) + (1.-fr2)*(1.-fr2))/(fr3s*aa);
155 G4double fres = -rho*(1./fr1s + 1./fr2s)
156 + (ab/(2.*(fr1*fr2*aa)))*(
G4Log(2.*gam*aa/(fr1*fr2)))
157 + (ab/(2.*fr1*fr2*(1-fr3)))*
G4Log(2.*gam*(1.-fr3)/(fr1*fr2)) - add;
166 G4double ekin = std::max(eV,kinEnergy);
167 G4double tau = ekin/electron_mass_c2;
174 G4double dcross = fsum/((3*fr1*fr1*(gam+1.)));
187 G4double ekin = std::max(eV,kinEnergy);
188 G4double tau = ekin/electron_mass_c2;
195 - (gam+3.)/(sqrt(gam*gam - 1.));
197 G4double cross = alpha_rcl2*(4.2 - (2.*
G4Log(fDelta)+1.)*rho*rho)/(gam+1.);
248 if(posiKinEnergy < 500*MeV) {
249 border = 1. - (electron_mass_c2)/(2*(posiKinEnergy + electron_mass_c2));
251 border = 1. - (100*electron_mass_c2)/(2*(posiKinEnergy + electron_mass_c2));
253 border = std::min(border, 0.9999);
258 if(posiKinEnergy == 0.0) {
260 G4double sint = sqrt((1. - cost)*(1. + cost));
263 phi = twopi * rndmEngine->
flat();
271 pol.
set(-sinphi, cosphi, 0.0);
283 G4double d1, d0, x1, x2, dmax, x2min;
287 x1 = 1/((1/xmin) - ((1/xmin)-(1/xmax))*rndmEngine->
flat());
288 dmax =
ComputeFS(posiKinEnergy, x1,1.-x1,border);
290 x2 = 1 - rndmEngine->
flat()*(1-x2min);
291 d1 = dmax*rndmEngine->
flat();
292 d0 =
ComputeFS(posiKinEnergy,x1,x2,2-x1-x2);
302 G4double psi13 = 2*asin(sqrt(std::abs((x1+x3-1)/(x1*x3))));
303 G4double psi12 = 2*asin(sqrt(std::abs((x1+x2-1)/(x1*x2))));
314 G4double TotalAvailableEnergy = posiKinEnergy + 2.0*electron_mass_c2;
316 G4double phot1Energy = 0.5*x1*TotalAvailableEnergy;
317 G4double phot2Energy = 0.5*x2*TotalAvailableEnergy;
318 G4double phot3Energy = 0.5*x3*TotalAvailableEnergy;
330 phot1Direction.
rotateUz(posiDirection);
331 phot2Direction.
rotateUz(posiDirection);
332 phot3Direction.
rotateUz(posiDirection);
359 pol.set(-sinphi, cosphi, 0.0);
360 pol.rotateUz(phot1Direction);
361 cost = pol*phot2Direction;
362 pol -= cost*phot2Direction;
364 aGamma2->SetPolarization(pol.x(),pol.y(),pol.z());
378 vdp->push_back(aGamma1);
379 vdp->push_back(aGamma2);
380 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)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0., G4double maxEnergy=DBL_MAX) final
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double maxEnergy=DBL_MAX) final
virtual ~G4eplusTo3GammaOKVIModel()
G4double ComputeF(G4double fr1, G4double fr2, G4double fr3, G4double kinEnergy)
G4eplusTo3GammaOKVIModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="eplus3ggOKVI")
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) final
virtual 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)