74const G4double G4eBremsstrahlungRelModel::xgi[]={ 0.0199, 0.1017, 0.2372, 0.4083,
75 0.5917, 0.7628, 0.8983, 0.9801 };
76const G4double G4eBremsstrahlungRelModel::wgi[]={ 0.0506, 0.1112, 0.1569, 0.1813,
77 0.1813, 0.1569, 0.1112, 0.0506 };
78const G4double G4eBremsstrahlungRelModel::Fel_light[] = {0., 5.31 , 4.79 , 4.74 , 4.71} ;
79const G4double G4eBremsstrahlungRelModel::Finel_light[] = {0., 6.144 , 5.621 , 5.805 , 5.924} ;
87 bremFactor(fine_structure_const*classic_electr_radius*classic_electr_radius*16./3.),
89 fMigdalConstant(classic_electr_radius*electron_Compton_length*electron_Compton_length*4.0*pi),
90 fLPMconstant(fine_structure_const*electron_mass_c2*electron_mass_c2/(4.*pi*hbarc)*0.5),
91 fXiLPM(0), fPhiLPM(0), fGLPM(0),
92 use_completescreening(false),isInitialised(false)
97 lowKinEnergy = 0.1*GeV;
108 = xiLPM = phiLPM = gLPM = klpm = kp = 0.0;
110 energyThresholdLPM = 1.e39;
112 InitialiseConstants();
113 if(p) { SetParticle(p); }
118void G4eBremsstrahlungRelModel::InitialiseConstants()
120 facFel = log(184.15);
121 facFinel = log(1194.);
123 preS1 = 1./(184.15*184.15);
150 lpmEnergy = mat->
GetRadlen()*fLPMconstant;
156 energyThresholdLPM=1.e39;
175 if(p) { SetParticle(p); }
183 if(isInitialised) {
return; }
185 isInitialised =
true;
197 if(kineticEnergy < lowKinEnergy) {
return 0.0; }
198 G4double cut = std::min(cutEnergy, kineticEnergy);
199 if(cut == 0.0) {
return 0.0; }
214 dedx += theAtomicNumDensityVector[i]*
currentZ*
currentZ*ComputeBremLoss(cut);
237 for(
G4int l=0; l<n; l++) {
239 for(
G4int i=0; i<8; i++) {
244 xs = ComputeRelDXSectionPerAtom(eg);
268 if(kineticEnergy < lowKinEnergy) {
return 0.0; }
269 G4double cut = std::min(cutEnergy, kineticEnergy);
270 G4double tmax = std::min(maxEnergy, kineticEnergy);
272 if(cut >= tmax) {
return 0.0; }
276 G4double cross = ComputeXSectionPerAtom(cut);
279 if(tmax <
kinEnergy) { cross -= ComputeXSectionPerAtom(tmax); }
304 for(
G4int l=0; l<n; l++) {
306 for(
G4int i=0; i<8; i++) {
311 xs = ComputeRelDXSectionPerAtom(eg);
326void G4eBremsstrahlungRelModel::CalcLPMFunctions(
G4double k)
333 G4double logS1 = 2./3.*lnZ-2.*facFel;
340 else if (sprime>sqrt(2.)*s1) {
342 xiLPM = 1+h-0.08*(1-h)*(1-
sqr(1-h))/logTS1;
355 if (s0<=s1) xiLPM = 2.;
356 else if ( (s1<s0) && (
s0<=1) ) xiLPM = 1. + log(s0)/logS1;
367 phiLPM = 6.*
s0 - 18.84955592153876*s2 + 39.47841760435743*s3
368 - 57.69873135166053*s4;
369 gLPM = 37.69911184307752*s2 - 236.8705056261446*s3 + 807.7822389*s4;
371 else if (s0<1.9516) {
374 phiLPM = 1.-exp(-6.*s0*(1.+(3.-pi)*s0)
375 +s3/(0.623+0.795*s0+0.658*s2));
376 if (s0<0.415827397755) {
378 G4double psiLPM = 1-exp(-4*s0-8*s2/(1+3.936*s0+4.97*s2-0.05*s3+7.50*s4));
379 gLPM = 3*psiLPM-2*phiLPM;
383 G4double pre = -0.16072300849123999 +
s0*3.7550300067531581 + s2*-1.7981383069010097
384 + s3*0.67282686077812381 + s4*-0.1207722909879257;
390 phiLPM = 1. - 0.0119048/s4;
391 gLPM = 1. - 0.0230655/s4;
396 if (xiLPM*phiLPM>1. || s0>0.57) { xiLPM=1./phiLPM; }
402G4double G4eBremsstrahlungRelModel::ComputeRelDXSectionPerAtom(
G4double gammaEnergy)
407 if(gammaEnergy < 0.0) {
return 0.0; }
417 CalcLPMFunctions(gammaEnergy);
419 G4double mainLPM = xiLPM*(y2 * gLPM + yone2*phiLPM) * ( (Fel-fCoulomb) + Finel/
currentZ );
422 G4double cross = mainLPM+secondTerm;
435 if(gammaEnergy < 0.0) {
return 0.0; }
441 if (use_completescreening||
currentZ<5) {
443 main = (3./4.*y*y - y + 1.) * ( (Fel-fCoulomb) + Finel/
currentZ );
444 secondTerm = (1.-y)/12.*(1.+1./
currentZ);
454 main = (3./4.*y*y - y + 1.) * ( (0.25*phi1-1./3.*lnZ-fCoulomb) + (0.25*psi1-2./3.*lnZ)/
currentZ );
455 secondTerm = (1.-y)/8.*(phi1m2+psi1m2/
currentZ);
464 std::vector<G4DynamicParticle*>* vdp,
471 if(kineticEnergy < lowKinEnergy) {
return; }
472 G4double cut = std::min(cutEnergy, kineticEnergy);
473 G4double emax = std::min(maxEnergy, kineticEnergy);
474 if(cut >= emax) {
return; }
488 if(
totalEnergy < energyThresholdLPM) { highe =
false; }
496 if(x < 0.0) { x = 0.0; }
497 gammaEnergy = sqrt(x);
498 if(highe) { f = ComputeRelDXSectionPerAtom(gammaEnergy); }
502 G4cout <<
"### G4eBremsstrahlungRelModel Warning: Majoranta exceeded! "
503 << f <<
" > " << fMax
504 <<
" Egamma(MeV)= " << gammaEnergy
505 <<
" Ee(MeV)= " << kineticEnergy
525 vdp->push_back(gamma);
529 - gammaEnergy*gammaDirection).unit();
532 G4double finalE = kineticEnergy - gammaEnergy;
std::vector< G4Element * > G4ElementVector
G4DLLIMPORT std::ostream G4cout
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
static G4Electron * Electron()
const G4Material * GetMaterial() const
const G4ElementVector * GetElementVector() const
size_t GetNumberOfElements() const
const G4double * GetAtomicNumDensityVector() const
G4double GetElectronDensity() const
G4double GetRadlen() const
static G4NistManager * Instance()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
G4double GetPDGMass() const
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
G4VEmAngularDistribution * GetAngularDistribution()
G4double LowEnergyLimit() const
void SetLPMFlag(G4bool val)
void SetCurrentElement(const G4Element *)
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void SetLowEnergyLimit(G4double)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4String & GetName() const
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
G4double SecondaryThreshold() const
G4ParticleChangeForLoss * GetParticleChangeForLoss()
void ProposeTrackStatus(G4TrackStatus status)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double tkin, G4double Z, G4double, G4double cutEnergy, G4double maxEnergy=DBL_MAX)
virtual ~G4eBremsstrahlungRelModel()
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
const G4ParticleDefinition * particle
G4eBremsstrahlungRelModel(const G4ParticleDefinition *p=0, const G4String &nam="eBremLPM")
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy)
virtual G4double ComputeDXSectionPerAtom(G4double gammaEnergy)
G4ParticleDefinition * theGamma
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double cutEnergy, G4double maxEnergy)
void SetCurrentElement(const G4double)
G4ParticleChangeForLoss * fParticleChange