Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4PairProductionRelModel Class Reference

#include <G4PairProductionRelModel.hh>

Inheritance diagram for G4PairProductionRelModel:

Public Member Functions

 G4PairProductionRelModel (const G4ParticleDefinition *p=nullptr, const G4String &nam="BetheHeitlerLPM")
 ~G4PairProductionRelModel () override
void Initialise (const G4ParticleDefinition *, const G4DataVector &) override
void InitialiseLocal (const G4ParticleDefinition *, G4VEmModel *masterModel) override
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX) override
void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double) override
void SetLPMflag (G4bool val)
G4bool LPMflag () const
G4PairProductionRelModeloperator= (const G4PairProductionRelModel &right)=delete
 G4PairProductionRelModel (const G4PairProductionRelModel &)=delete
Public Member Functions inherited from G4VEmModel
 G4VEmModel (const G4String &nam)
virtual ~G4VEmModel ()
virtual void InitialiseForMaterial (const G4ParticleDefinition *, const G4Material *)
virtual void InitialiseForElement (const G4ParticleDefinition *, G4int Z)
virtual G4double ComputeDEDXPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
virtual G4double CrossSectionPerVolume (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
virtual G4double GetPartialCrossSection (const G4Material *, G4int level, const G4ParticleDefinition *, G4double kineticEnergy)
virtual G4double ComputeCrossSectionPerShell (const G4ParticleDefinition *, G4int Z, G4int shellIdx, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
virtual G4double ChargeSquareRatio (const G4Track &)
virtual G4double GetChargeSquareRatio (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual G4double GetParticleCharge (const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
virtual void StartTracking (G4Track *)
virtual void CorrectionsAlongStep (const G4Material *, const G4ParticleDefinition *, const G4double kinEnergy, const G4double cutEnergy, const G4double &length, G4double &eloss)
virtual G4double Value (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
virtual G4double MinPrimaryEnergy (const G4Material *, const G4ParticleDefinition *, G4double cut=0.0)
virtual G4double MinEnergyCut (const G4ParticleDefinition *, const G4MaterialCutsCouple *)
virtual void DefineForRegion (const G4Region *)
virtual void FillNumberOfSecondaries (G4int &numberOfTriplets, G4int &numberOfRecoil)
virtual void ModelDescription (std::ostream &outFile) const
void InitialiseElementSelectors (const G4ParticleDefinition *, const G4DataVector &)
std::vector< G4EmElementSelector * > * GetElementSelectors ()
void SetElementSelectors (std::vector< G4EmElementSelector * > *)
G4double ComputeDEDX (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
G4double CrossSection (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double ComputeMeanFreePath (const G4ParticleDefinition *, G4double kineticEnergy, const G4Material *, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, const G4Element *, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectTargetAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
const G4ElementGetCurrentElement (const G4Material *mat=nullptr) const
G4int SelectRandomAtomNumber (const G4Material *) const
const G4IsotopeGetCurrentIsotope (const G4Element *elm=nullptr) const
G4int SelectIsotopeNumber (const G4Element *) const
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=nullptr)
void SetCrossSectionTable (G4PhysicsTable *, G4bool isLocal)
G4ElementDataGetElementData ()
G4PhysicsTableGetCrossSectionTable ()
G4VEmFluctuationModelGetModelOfFluctuations ()
G4VEmAngularDistributionGetAngularDistribution ()
G4VEmModelGetTripletModel ()
void SetTripletModel (G4VEmModel *)
void SetAngularDistribution (G4VEmAngularDistribution *)
G4double HighEnergyLimit () const
G4double LowEnergyLimit () const
G4double HighEnergyActivationLimit () const
G4double LowEnergyActivationLimit () const
G4double PolarAngleLimit () const
G4double SecondaryThreshold () const
G4bool DeexcitationFlag () const
G4bool ForceBuildTableFlag () const
G4bool UseAngularGeneratorFlag () const
void SetAngularGeneratorFlag (G4bool)
void SetHighEnergyLimit (G4double)
void SetLowEnergyLimit (G4double)
void SetActivationHighEnergyLimit (G4double)
void SetActivationLowEnergyLimit (G4double)
G4bool IsActive (G4double kinEnergy) const
void SetPolarAngleLimit (G4double)
void SetSecondaryThreshold (G4double)
void SetDeexcitationFlag (G4bool val)
void SetForceBuildTable (G4bool val)
void SetFluctuationFlag (G4bool val)
G4bool IsMaster () const
void SetUseBaseMaterials (G4bool val)
G4bool UseBaseMaterials () const
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
const G4StringGetName () const
void SetCurrentCouple (const G4MaterialCutsCouple *)
G4bool IsLocked () const
void SetLocked (G4bool)
void SetLPMFlag (G4bool)
void SetMasterThread (G4bool)
G4VEmModeloperator= (const G4VEmModel &right)=delete
 G4VEmModel (const G4VEmModel &)=delete

Protected Member Functions

void ComputePhi12 (const G4double delta, G4double &phi1, G4double &phi2)
G4double ScreenFunction1 (const G4double delta)
G4double ScreenFunction2 (const G4double delta)
void ScreenFunction12 (const G4double delta, G4double &f1, G4double &f2)
G4double ComputeParametrizedXSectionPerAtom (G4double gammaEnergy, G4double Z)
G4double ComputeXSectionPerAtom (G4double gammaEnergy, G4double Z)
G4double ComputeDXSectionPerAtom (G4double eplusEnergy, G4double gammaEnergy, G4double Z)
G4double ComputeRelDXSectionPerAtom (G4double eplusEnergy, G4double gammaEnergy, G4double Z)
Protected Member Functions inherited from G4VEmModel
G4ParticleChangeForLossGetParticleChangeForLoss ()
G4ParticleChangeForGammaGetParticleChangeForGamma ()
virtual G4double MaxSecondaryEnergy (const G4ParticleDefinition *, G4double kineticEnergy)
const G4MaterialCutsCoupleCurrentCouple () const
void SetCurrentElement (const G4Element *)

Protected Attributes

G4bool isFirstInstance {false}
G4bool fIsUseLPMCorrection
G4bool fIsUseCompleteScreening
G4double fLPMEnergy
G4double fParametrizedXSectionThreshold
G4double fCoulombCorrectionThreshold
G4PowfG4Calc
G4ParticleDefinitionfTheGamma
G4ParticleDefinitionfTheElectron
G4ParticleDefinitionfThePositron
G4ParticleChangeForGammafParticleChange
Protected Attributes inherited from G4VEmModel
G4ElementDatafElementData = nullptr
G4VParticleChangepParticleChange = nullptr
G4PhysicsTablexSectionTable = nullptr
const G4MaterialpBaseMaterial = nullptr
const std::vector< G4double > * theDensityFactor = nullptr
const std::vector< G4int > * theDensityIdx = nullptr
G4double inveplus
G4double pFactor = 1.0
std::size_t currentCoupleIndex = 0
std::size_t basedCoupleIndex = 0
G4bool lossFlucFlag = true

Static Protected Attributes

static const G4int gMaxZet = 120
static const G4double gLPMconstant
static const G4double gXGL [8]
static const G4double gWGL [8]
static const G4double gFelLowZet [8]
static const G4double gFinelLowZet [8]
static const G4double gXSecFactor
static const G4double gEgLPMActivation = 100.*CLHEP::GeV
static std::vector< ElementData * > gElementData

Detailed Description

Definition at line 65 of file G4PairProductionRelModel.hh.

Constructor & Destructor Documentation

◆ G4PairProductionRelModel() [1/2]

G4PairProductionRelModel::G4PairProductionRelModel ( const G4ParticleDefinition * p = nullptr,
const G4String & nam = "BetheHeitlerLPM" )
explicit

Definition at line 118 of file G4PairProductionRelModel.cc.

123 fParticleChange(nullptr)
124{
125 // gamma energy below which the parametrized atomic x-section is used (30 GeV)
126 fParametrizedXSectionThreshold = 30.0*CLHEP::GeV;
127 // gamma energy below the Coulomb correction is turned off (50 MeV)
128 fCoulombCorrectionThreshold = 50.0*CLHEP::MeV;
129 // set angular generator used in the final state kinematics computation
130 SetAngularDistribution(new G4ModifiedTsai());
131}
static G4Electron * Electron()
Definition G4Electron.cc:91
static G4Gamma * Gamma()
Definition G4Gamma.cc:81
G4ParticleDefinition * fThePositron
G4ParticleChangeForGamma * fParticleChange
G4ParticleDefinition * fTheElectron
static G4Positron * Positron()
Definition G4Positron.cc:90
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4VEmModel(const G4String &nam)
Definition G4VEmModel.cc:67
void SetAngularDistribution(G4VEmAngularDistribution *)

Referenced by G4BetheHeitler5DModel::G4BetheHeitler5DModel(), G4LivermoreGammaConversionModel::G4LivermoreGammaConversionModel(), G4PairProductionRelModel(), and operator=().

◆ ~G4PairProductionRelModel()

G4PairProductionRelModel::~G4PairProductionRelModel ( )
override

Definition at line 134 of file G4PairProductionRelModel.cc.

135{
136 if (isFirstInstance) {
137 // clear ElementData container
138 for (auto const & ptr : gElementData) { delete ptr; }
139 gElementData.clear();
140 }
141}
static std::vector< ElementData * > gElementData

◆ G4PairProductionRelModel() [2/2]

G4PairProductionRelModel::G4PairProductionRelModel ( const G4PairProductionRelModel & )
delete

Member Function Documentation

◆ ComputeCrossSectionPerAtom()

G4double G4PairProductionRelModel::ComputeCrossSectionPerAtom ( const G4ParticleDefinition * ,
G4double kinEnergy,
G4double Z,
G4double A = 0.,
G4double cut = 0.,
G4double emax = DBL_MAX )
overridevirtual

Reimplemented from G4VEmModel.

Definition at line 309 of file G4PairProductionRelModel.cc.

311{
312 G4double crossSection = 0.0 ;
313 // check kinematical limit
314 if ( gammaEnergy <= 2.0*electron_mass_c2 ) { return crossSection; }
315 // compute the atomic cross section either by using x-section parametrization
316 // or by numerically integrationg the DCS (with or without LPM)
317 if ( gammaEnergy < fParametrizedXSectionThreshold) {
318 // using the parametrized cross sections (max up to 80 GeV)
319 crossSection = ComputeParametrizedXSectionPerAtom(gammaEnergy, Z);
320 } else {
321 // by numerical integration of the DCS:
322 // Computes the cross section with or without LPM suppression depending on
323 // settings (by default with if the gamma energy is above a given threshold)
324 // and using or not using complete sreening approximation (by default not).
325 // Only the dependent part is computed in the numerical integration of the DCS
326 // i.e. the result must be multiplied here with 4 \alpha r_0^2 Z(Z+\eta(Z))
327 crossSection = ComputeXSectionPerAtom(gammaEnergy, Z);
328 // apply the constant factors:
329 // - eta(Z) is a correction to account interaction in the field of e-
330 // - gXSecFactor = 4 \alpha r_0^2
331 const G4int iz = std::min(gMaxZet, G4lrint(Z));
332 const G4double eta = gElementData[iz]->fEtaValue;
333 crossSection *= gXSecFactor*Z*(Z+eta);
334 }
335 // final protection
336 return std::max(crossSection, 0.);
337}
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
G4double ComputeParametrizedXSectionPerAtom(G4double gammaEnergy, G4double Z)
G4double ComputeXSectionPerAtom(G4double gammaEnergy, G4double Z)
int G4lrint(double ad)
Definition templates.hh:134

◆ ComputeDXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeDXSectionPerAtom ( G4double eplusEnergy,
G4double gammaEnergy,
G4double Z )
protected

Definition at line 226 of file G4PairProductionRelModel.cc.

229{
230 G4double xSection = 0.;
231 const G4int iz = std::min(gMaxZet, G4lrint(Z));
232 const G4double eps = pEnergy/gammaEnergy;
233 const G4double epsm = 1.-eps;
234 const G4double dum = eps*epsm;
236 // complete screening:
237 const G4double Lel = gElementData[iz]->fLradEl;
238 const G4double fc = gElementData[iz]->fCoulomb;
239 xSection = (eps*eps + epsm*epsm + 2.*dum/3.)*(Lel-fc) - dum/9.;
240 } else {
241 // normal case:
242 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
243 const G4double fc = gElementData[iz]->fCoulomb;
244 const G4double lnZ13 = gElementData[iz]->fLogZ13;
245 const G4double delta = gElementData[iz]->fDeltaFactor*eps0/dum;
246 G4double phi1, phi2;
247 ComputePhi12(delta, phi1, phi2);
248 xSection = (eps*eps + epsm*epsm)*(0.25*phi1-lnZ13-fc)
249 + 2.*dum*(0.25*phi2-lnZ13-fc)/3.;
250 }
251 // non-const. part of the DCS differential in total energy transfer not in eps
252 // ds/dEt=ds/deps deps/dEt with deps/dEt=1/Eg
253 return std::max(xSection, 0.0)/gammaEnergy;
254}
void ComputePhi12(const G4double delta, G4double &phi1, G4double &phi2)

Referenced by ComputeXSectionPerAtom().

◆ ComputeParametrizedXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeParametrizedXSectionPerAtom ( G4double gammaEnergy,
G4double Z )
protected

Definition at line 572 of file G4PairProductionRelModel.cc.

574{
575 G4double xSection = 0.0 ;
576 // short versions
577 static const G4double kMC2 = CLHEP::electron_mass_c2;
578 // zero cross section below the kinematical limit: Eg<2mc^2
579 if (Z < 0.9 || gammaE <= 2.0*kMC2) { return xSection; }
580 //
581 static const G4double gammaEnergyLimit = 1.5*CLHEP::MeV;
582 // set coefficients a, b c
583 static const G4double a0 = 8.7842e+2*CLHEP::microbarn;
584 static const G4double a1 = -1.9625e+3*CLHEP::microbarn;
585 static const G4double a2 = 1.2949e+3*CLHEP::microbarn;
586 static const G4double a3 = -2.0028e+2*CLHEP::microbarn;
587 static const G4double a4 = 1.2575e+1*CLHEP::microbarn;
588 static const G4double a5 = -2.8333e-1*CLHEP::microbarn;
589
590 static const G4double b0 = -1.0342e+1*CLHEP::microbarn;
591 static const G4double b1 = 1.7692e+1*CLHEP::microbarn;
592 static const G4double b2 = -8.2381 *CLHEP::microbarn;
593 static const G4double b3 = 1.3063 *CLHEP::microbarn;
594 static const G4double b4 = -9.0815e-2*CLHEP::microbarn;
595 static const G4double b5 = 2.3586e-3*CLHEP::microbarn;
596
597 static const G4double c0 = -4.5263e+2*CLHEP::microbarn;
598 static const G4double c1 = 1.1161e+3*CLHEP::microbarn;
599 static const G4double c2 = -8.6749e+2*CLHEP::microbarn;
600 static const G4double c3 = 2.1773e+2*CLHEP::microbarn;
601 static const G4double c4 = -2.0467e+1*CLHEP::microbarn;
602 static const G4double c5 = 6.5372e-1*CLHEP::microbarn;
603 // check low energy limit of the approximation (1.5 MeV)
604 G4double gammaEnergyOrg = gammaE;
605 if (gammaE < gammaEnergyLimit) { gammaE = gammaEnergyLimit; }
606 // compute gamma energy variables
607 const G4double x = G4Log(gammaE/kMC2);
608 const G4double x2 = x *x;
609 const G4double x3 = x2*x;
610 const G4double x4 = x3*x;
611 const G4double x5 = x4*x;
612 //
613 const G4double F1 = a0 + a1*x + a2*x2 + a3*x3 + a4*x4 + a5*x5;
614 const G4double F2 = b0 + b1*x + b2*x2 + b3*x3 + b4*x4 + b5*x5;
615 const G4double F3 = c0 + c1*x + c2*x2 + c3*x3 + c4*x4 + c5*x5;
616 // compute the approximated cross section
617 xSection = (Z + 1.)*(F1*Z + F2*Z*Z + F3);
618 // check if we are below the limit of the approximation and apply correction
619 if (gammaEnergyOrg < gammaEnergyLimit) {
620 const G4double dum = (gammaEnergyOrg-2.*kMC2)/(gammaEnergyLimit-2.*kMC2);
621 xSection *= dum*dum;
622 }
623 return xSection;
624}
const G4double a0
G4double G4Log(G4double x)
Definition G4Log.hh:169

Referenced by ComputeCrossSectionPerAtom().

◆ ComputePhi12()

void G4PairProductionRelModel::ComputePhi12 ( const G4double delta,
G4double & phi1,
G4double & phi2 )
inlineprotected

Definition at line 186 of file G4PairProductionRelModel.hh.

189{
190 if (delta > 1.4) {
191 phi1 = 21.0190 - 4.145*G4Log(delta + 0.958);
192 phi2 = phi1;
193 } else {
194 phi1 = 20.806 - delta*(3.190 - 0.5710*delta);
195 phi2 = 20.234 - delta*(2.126 - 0.0903*delta);
196 }
197}

Referenced by ComputeDXSectionPerAtom(), ComputeRelDXSectionPerAtom(), and SampleSecondaries().

◆ ComputeRelDXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeRelDXSectionPerAtom ( G4double eplusEnergy,
G4double gammaEnergy,
G4double Z )
protected

Definition at line 275 of file G4PairProductionRelModel.cc.

278{
279 G4double xSection = 0.;
280 const G4int iz = std::min(gMaxZet, G4lrint(Z));
281 const G4double eps = pEnergy/gammaEnergy;
282 const G4double epsm = 1.-eps;
283 const G4double dum = eps*epsm;
284 // evaluate LPM suppression functions
285 G4double fXiS, fGS, fPhiS;
286 ComputeLPMfunctions(fXiS, fGS, fPhiS, eps, gammaEnergy, iz);
288 // complete screening:
289 const G4double Lel = gElementData[iz]->fLradEl;
290 const G4double fc = gElementData[iz]->fCoulomb;
291 xSection = (Lel-fc)*((eps*eps+epsm*epsm)*2.*fPhiS + fGS)/3. - dum*fGS/9.;
292 } else {
293 // normal case:
294 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
295 const G4double fc = gElementData[iz]->fCoulomb;
296 const G4double lnZ13 = gElementData[iz]->fLogZ13;
297 const G4double delta = gElementData[iz]->fDeltaFactor*eps0/dum;
298 G4double phi1, phi2;
299 ComputePhi12(delta, phi1, phi2);
300 xSection = (eps*eps + epsm*epsm)*(2.*fPhiS+fGS)*(0.25*phi1-lnZ13-fc)/3.
301 + 2.*dum*fGS*(0.25*phi2-lnZ13-fc)/3.;
302 }
303 // non-const. part of the DCS differential in total energy transfer not in eps
304 // ds/dEt=ds/deps deps/dEt with deps/dEt=1/Eg
305 return std::max(fXiS*xSection, 0.0)/gammaEnergy;
306}

Referenced by ComputeXSectionPerAtom().

◆ ComputeXSectionPerAtom()

G4double G4PairProductionRelModel::ComputeXSectionPerAtom ( G4double gammaEnergy,
G4double Z )
protected

Definition at line 171 of file G4PairProductionRelModel.cc.

173{
174 G4double xSection = 0.0;
175 // check if LPM suppression needs to be used
176 const G4bool isLPM = (fIsUseLPMCorrection && gammaEnergy>gEgLPMActivation);
177 // determine the kinematical limits (taken into account the correction due to
178 // the way in which the Coulomb correction is applied i.e. avoid negative DCS)
179 const G4int iz = std::min(gMaxZet, G4lrint(Z));
180 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy;
181 // Coulomb correction is always included in the DCS even below 50 MeV (note:
182 // that this DCS is only used to get the integrated x-section)
183 const G4double dmax = gElementData[iz]->fDeltaMaxHigh;
184 const G4double dmin = 4.*eps0*gElementData[iz]->fDeltaFactor;
185 const G4double eps1 = 0.5 - 0.5*std::sqrt(1.-dmin/dmax);
186 const G4double epsMin = std::max(eps0, eps1);
187 const G4double epsMax = 0.5; // DCS is symmetric around eps=0.5
188 // let Et be the total energy transferred to the e- or to the e+
189 // the [Et-min, Et-max] interval will be divided into i=1,2,..,n subintervals
190 // with width of dInterv = (Et-max - Et-min)/n and numerical integration will
191 // be done in each sub-inteval using the xi = (Et - Et_i-min)/dInterv variable
192 // that is in [0,1]. The 8-point GL q. is used for the integration on [0,1].
193 const G4int numSub = 2;
194 const G4double dInterv= (epsMax - epsMin)*gammaEnergy/G4double(numSub);
195 G4double minEti = epsMin*gammaEnergy; // Et-min i.e. Et_0-min
196 for (G4int i = 0; i < numSub; ++i) {
197 for (G4int ngl = 0; ngl < 8; ++ngl) {
198 const G4double Et = (minEti + gXGL[ngl]*dInterv);
199 const G4double xs = isLPM ? ComputeRelDXSectionPerAtom(Et, gammaEnergy, Z)
200 : ComputeDXSectionPerAtom(Et, gammaEnergy, Z);
201 xSection += gWGL[ngl]*xs;
202 }
203 // update minimum Et of the sub-inteval
204 minEti += dInterv;
205 }
206 // apply corrections of variable transformation and half interval integration
207 xSection = std::max(2.*xSection*dInterv, 0.);
208 return xSection;
209}
bool G4bool
Definition G4Types.hh:86
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
static const G4double gEgLPMActivation
static const G4double gXGL[8]
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double gammaEnergy, G4double Z)
static const G4double gWGL[8]

Referenced by ComputeCrossSectionPerAtom().

◆ Initialise()

void G4PairProductionRelModel::Initialise ( const G4ParticleDefinition * p,
const G4DataVector & cuts )
overridevirtual

Implements G4VEmModel.

Definition at line 143 of file G4PairProductionRelModel.cc.

145{
147
148 if (isFirstInstance || gElementData.empty()) {
149 // init element data and LPM funcs
150 G4AutoLock l(&thePairProdRelMutex);
151 if (gElementData.empty()) {
152 isFirstInstance = true;
153 gElementData.resize(gMaxZet+1, nullptr);
154 }
155 // static data should be initialised only in the one instance
156 InitialiseElementData();
157 l.unlock();
158 }
159 // element selectors should be initialised in the master thread
160 if (IsMaster()) {
162 }
163}
G4TemplateAutoLock< G4Mutex > G4AutoLock
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4bool IsMaster() const
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)

Referenced by G4BetheHeitler5DModel::Initialise(), and G4LivermoreGammaConversionModel::Initialise().

◆ InitialiseLocal()

void G4PairProductionRelModel::InitialiseLocal ( const G4ParticleDefinition * ,
G4VEmModel * masterModel )
overridevirtual

Reimplemented from G4VEmModel.

Definition at line 165 of file G4PairProductionRelModel.cc.

167{
169}
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
std::vector< G4EmElementSelector * > * GetElementSelectors()

◆ LPMflag()

G4bool G4PairProductionRelModel::LPMflag ( ) const
inline

Definition at line 97 of file G4PairProductionRelModel.hh.

97{ return fIsUseLPMCorrection; }

◆ operator=()

G4PairProductionRelModel & G4PairProductionRelModel::operator= ( const G4PairProductionRelModel & right)
delete

◆ SampleSecondaries()

void G4PairProductionRelModel::SampleSecondaries ( std::vector< G4DynamicParticle * > * fvect,
const G4MaterialCutsCouple * couple,
const G4DynamicParticle * aDynamicGamma,
G4double tmin,
G4double maxEnergy )
overridevirtual

Implements G4VEmModel.

Definition at line 346 of file G4PairProductionRelModel.cc.

363{
364 const G4Material* mat = couple->GetMaterial();
365 const G4double gammaEnergy = aDynamicGamma->GetKineticEnergy();
366 const G4double eps0 = CLHEP::electron_mass_c2/gammaEnergy ;
367 //
368 // check kinematical limit: gamma energy(Eg) must be at least 2 e- rest mass
369 // (but the model should be used at higher energies above 100 MeV)
370 if (eps0 > 0.5) { return; }
371 //
372 // select target atom of the material
373 const G4Element* anElement = SelectTargetAtom(couple, fTheGamma, gammaEnergy,
374 aDynamicGamma->GetLogKineticEnergy());
375 CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
376 //
377 // 'eps' is the total energy transferred to one of the e-/e+ pair in initial
378 // gamma energy units Eg. Since the corresponding DCS is symmetric on eps=0.5,
379 // the kinematical limits for eps0=mc^2/Eg <= eps <= 0.5
380 // 1. 'eps' is sampled uniformly on the [eps0, 0.5] inteval if Eg<Egsmall
381 // 2. otherwise, on the [eps_min, 0.5] interval according to the DCS (case 2.)
382 G4double eps;
383 // case 1.
384 static const G4double Egsmall = 2.*CLHEP::MeV;
385 if (gammaEnergy < Egsmall) {
386 eps = eps0 + (0.5-eps0)*rndmEngine->flat();
387 } else {
388 // case 2.
389 // get the Coulomb factor for the target element (Z) and gamma energy (Eg)
390 // F(Z) = 8*ln(Z)/3 if Eg <= 50 [MeV] => no Coulomb correction
391 // F(Z) = 8*ln(Z)/3 + 8*fc(Z) if Eg > 50 [MeV] => fc(Z) is the Coulomb cor.
392 //
393 // The screening variable 'delta(eps)' = 136*Z^{-1/3}*eps0/[eps(1-eps)]
394 // Due to the Coulomb correction, the DCS can go below zero even at
395 // kinematicaly allowed eps > eps0 values. In order to exclude this eps
396 // range with negative DCS, the minimum eps value will be set to eps_min =
397 // max[eps0, epsp] with epsp is the solution of SF(delta(epsp)) - F(Z)/2 = 0
398 // with SF being the screening function (SF1=SF2 at high value of delta).
399 // The solution is epsp = 0.5 - 0.5*sqrt[ 1 - 4*136*Z^{-1/3}eps0/deltap]
400 // with deltap = Exp[(42.038-F(Z))/8.29]-0.958. So the limits are:
401 // - when eps=eps_max = 0.5 => delta_min = 136*Z^{-1/3}*eps0/4
402 // - epsp = 0.5 - 0.5*sqrt[ 1 - delta_min/deltap]
403 // - and eps_min = max[eps0, epsp]
404 const G4int iZet = std::min(gMaxZet, anElement->GetZasInt());
405 const G4double deltaFactor = gElementData[iZet]->fDeltaFactor*eps0;
406 const G4double deltaMin = 4.*deltaFactor;
407 G4double deltaMax = gElementData[iZet]->fDeltaMaxLow;
408 G4double FZ = 8.*gElementData[iZet]->fLogZ13;
409 if ( gammaEnergy > fCoulombCorrectionThreshold ) { // Eg > 50 MeV ?
410 FZ += 8.*gElementData[iZet]->fCoulomb;
411 deltaMax = gElementData[iZet]->fDeltaMaxHigh;
412 }
413 // compute the limits of eps
414 const G4double epsp = 0.5 - 0.5*std::sqrt(1. - deltaMin/deltaMax) ;
415 const G4double epsMin = std::max(eps0,epsp);
416 const G4double epsRange = 0.5 - epsMin;
417 //
418 // sample the energy rate (eps) of the created electron (or positron)
420 ScreenFunction12(deltaMin, F10, F20);
421 F10 -= FZ;
422 F20 -= FZ;
423 const G4double NormF1 = std::max(F10 * epsRange * epsRange, 0.);
424 const G4double NormF2 = std::max(1.5 * F20 , 0.);
425 const G4double NormCond = NormF1/(NormF1 + NormF2);
426 // check if LPM correction is active
427 const G4bool isLPM = (fIsUseLPMCorrection && gammaEnergy>gEgLPMActivation);
429 // we will need 3 uniform random number for each trial of sampling
430 G4double rndmv[3];
431 G4double greject = 0.;
432 do {
433 rndmEngine->flatArray(3, rndmv);
434 if (NormCond > rndmv[0]) {
435 eps = 0.5 - epsRange * fG4Calc->A13(rndmv[1]);
436 const G4double delta = deltaFactor/(eps*(1.-eps));
437 if (isLPM) {
438 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
439 ComputePhi12(delta, phi1, phi2);
440 ComputeLPMfunctions(lpmXiS, lpmGS, lpmPhiS, eps, gammaEnergy, iZet);
441 greject = lpmXiS*((2.*lpmPhiS+lpmGS)*phi1-lpmGS*phi2-lpmPhiS*FZ)/F10;
442 } else {
443 greject = (ScreenFunction1(delta)-FZ)/F10;
444 }
445 } else {
446 eps = epsMin + epsRange*rndmv[1];
447 const G4double delta = deltaFactor/(eps*(1.-eps));
448 if (isLPM) {
449 G4double lpmXiS, lpmGS, lpmPhiS, phi1, phi2;
450 ComputePhi12(delta, phi1, phi2);
451 ComputeLPMfunctions(lpmXiS, lpmGS, lpmPhiS, eps, gammaEnergy, iZet);
452 greject = lpmXiS*( (lpmPhiS+0.5*lpmGS)*phi1 + 0.5*lpmGS*phi2
453 -0.5*(lpmGS+lpmPhiS)*FZ )/F20;
454 } else {
455 greject = (ScreenFunction2(delta)-FZ)/F20;
456 }
457 }
458 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
459 } while (greject < rndmv[2]);
460 // end of eps sampling
461 }
462 //
463 // select charges randomly
464 G4double eTotEnergy, pTotEnergy;
465 if (rndmEngine->flat() > 0.5) {
466 eTotEnergy = (1.-eps)*gammaEnergy;
467 pTotEnergy = eps*gammaEnergy;
468 } else {
469 pTotEnergy = (1.-eps)*gammaEnergy;
470 eTotEnergy = eps*gammaEnergy;
471 }
472 //
473 // sample pair kinematics
474 //
475 const G4double eKinEnergy = std::max(0.,eTotEnergy - CLHEP::electron_mass_c2);
476 const G4double pKinEnergy = std::max(0.,pTotEnergy - CLHEP::electron_mass_c2);
477 //
478 G4ThreeVector eDirection, pDirection;
479 //
481 eKinEnergy, pKinEnergy, eDirection, pDirection);
482 // create G4DynamicParticle object for the particle1
483 auto aParticle1 = new G4DynamicParticle(fTheElectron,eDirection,eKinEnergy);
484
485 // create G4DynamicParticle object for the particle2
486 auto aParticle2 = new G4DynamicParticle(fThePositron,pDirection,pKinEnergy);
487 // Fill output vector
488 fvect->push_back(aParticle1);
489 fvect->push_back(aParticle2);
490 // kill incident photon
491 fParticleChange->SetProposedKineticEnergy(0.);
492 fParticleChange->ProposeTrackStatus(fStopAndKill);
493}
#define F10
#define F20
CLHEP::Hep3Vector G4ThreeVector
@ fStopAndKill
virtual double flat()=0
virtual void flatArray(const int size, double *vect)=0
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
G4int GetZasInt() const
Definition G4Element.hh:120
const G4Material * GetMaterial() const
G4double GetRadlen() const
void ScreenFunction12(const G4double delta, G4double &f1, G4double &f2)
G4double ScreenFunction1(const G4double delta)
G4double ScreenFunction2(const G4double delta)
virtual void SamplePairDirections(const G4DynamicParticle *dp, G4double elecKinEnergy, G4double posiKinEnergy, G4ThreeVector &dirElectron, G4ThreeVector &dirPositron, G4int Z=0, const G4Material *mat=nullptr)
G4VEmAngularDistribution * GetAngularDistribution()
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)

◆ ScreenFunction1()

G4double G4PairProductionRelModel::ScreenFunction1 ( const G4double delta)
inlineprotected

Definition at line 200 of file G4PairProductionRelModel.hh.

201{
202 return (delta > 1.4) ? 42.038 - 8.29*G4Log(delta + 0.958)
203 : 42.184 - delta*(7.444 - 1.623*delta);
204}

Referenced by SampleSecondaries().

◆ ScreenFunction12()

void G4PairProductionRelModel::ScreenFunction12 ( const G4double delta,
G4double & f1,
G4double & f2 )
inlineprotected

Definition at line 214 of file G4PairProductionRelModel.hh.

216{
217 if (delta > 1.4) {
218 f1 = 42.038 - 8.29*G4Log(delta + 0.958);
219 f2 = f1;
220 } else {
221 f1 = 42.184 - delta*(7.444 - 1.623*delta);
222 f2 = 41.326 - delta*(5.848 - 0.902*delta);
223 }
224}

Referenced by SampleSecondaries().

◆ ScreenFunction2()

G4double G4PairProductionRelModel::ScreenFunction2 ( const G4double delta)
inlineprotected

Definition at line 207 of file G4PairProductionRelModel.hh.

208{
209 return (delta > 1.4) ? 42.038 - 8.29*G4Log(delta + 0.958)
210 : 41.326 - delta*(5.848 - 0.902*delta);
211}

Referenced by SampleSecondaries().

◆ SetLPMflag()

void G4PairProductionRelModel::SetLPMflag ( G4bool val)
inline

Definition at line 96 of file G4PairProductionRelModel.hh.

96{ fIsUseLPMCorrection = val; }

◆ SetupForMaterial()

void G4PairProductionRelModel::SetupForMaterial ( const G4ParticleDefinition * ,
const G4Material * mat,
G4double  )
overridevirtual

Reimplemented from G4VEmModel.

Definition at line 339 of file G4PairProductionRelModel.cc.

341{
343}

Member Data Documentation

◆ fCoulombCorrectionThreshold

G4double G4PairProductionRelModel::fCoulombCorrectionThreshold
protected

Definition at line 161 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

◆ fG4Calc

G4Pow* G4PairProductionRelModel::fG4Calc
protected

Definition at line 163 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

◆ fIsUseCompleteScreening

G4bool G4PairProductionRelModel::fIsUseCompleteScreening
protected

◆ fIsUseLPMCorrection

G4bool G4PairProductionRelModel::fIsUseLPMCorrection
protected

◆ fLPMEnergy

G4double G4PairProductionRelModel::fLPMEnergy
protected

◆ fParametrizedXSectionThreshold

G4double G4PairProductionRelModel::fParametrizedXSectionThreshold
protected

◆ fParticleChange

G4ParticleChangeForGamma* G4PairProductionRelModel::fParticleChange
protected

◆ fTheElectron

◆ fTheGamma

G4ParticleDefinition* G4PairProductionRelModel::fTheGamma
protected

◆ fThePositron

G4ParticleDefinition* G4PairProductionRelModel::fThePositron
protected

Definition at line 166 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

◆ gEgLPMActivation

const G4double G4PairProductionRelModel::gEgLPMActivation = 100.*CLHEP::GeV
staticprotected

Definition at line 150 of file G4PairProductionRelModel.hh.

Referenced by ComputeXSectionPerAtom(), and SampleSecondaries().

◆ gElementData

std::vector< G4PairProductionRelModel::ElementData * > G4PairProductionRelModel::gElementData
staticprotected

◆ gFelLowZet

const G4double G4PairProductionRelModel::gFelLowZet
staticprotected
Initial value:
= {
0.0, 5.3104, 4.7935, 4.7402, 4.7112, 4.6694, 4.6134, 4.5520
}

Definition at line 93 of file G4PairProductionRelModel.hh.

◆ gFinelLowZet

const G4double G4PairProductionRelModel::gFinelLowZet
staticprotected
Initial value:
= {
0.0, 5.9173, 5.6125, 5.5377, 5.4728, 5.4174, 5.3688, 5.3236
}

Definition at line 96 of file G4PairProductionRelModel.hh.

96 { fIsUseLPMCorrection = val; }
97 inline G4bool LPMflag() const { return fIsUseLPMCorrection; }
98

◆ gLPMconstant

const G4double G4PairProductionRelModel::gLPMconstant
staticprotected
Initial value:
=
CLHEP::fine_structure_const*CLHEP::electron_mass_c2*CLHEP::electron_mass_c2
/(4.*CLHEP::pi*CLHEP::hbarc)

Definition at line 142 of file G4PairProductionRelModel.hh.

Referenced by SampleSecondaries(), and SetupForMaterial().

◆ gMaxZet

const G4int G4PairProductionRelModel::gMaxZet = 120
staticprotected

◆ gWGL

const G4double G4PairProductionRelModel::gWGL
staticprotected
Initial value:
= {
5.06142681e-02, 1.11190517e-01, 1.56853323e-01, 1.81341892e-01,
1.81341892e-01, 1.56853323e-01, 1.11190517e-01, 5.06142681e-02
}

Definition at line 86 of file G4PairProductionRelModel.hh.

Referenced by ComputeXSectionPerAtom().

◆ gXGL

const G4double G4PairProductionRelModel::gXGL
staticprotected
Initial value:
= {
1.98550718e-02, 1.01666761e-01, 2.37233795e-01, 4.08282679e-01,
5.91717321e-01, 7.62766205e-01, 8.98333239e-01, 9.80144928e-01
}

Definition at line 82 of file G4PairProductionRelModel.hh.

Referenced by ComputeXSectionPerAtom().

◆ gXSecFactor

const G4double G4PairProductionRelModel::gXSecFactor
staticprotected
Initial value:
=
4.*CLHEP::fine_structure_const*CLHEP::classic_electr_radius
*CLHEP::classic_electr_radius

Definition at line 149 of file G4PairProductionRelModel.hh.

Referenced by ComputeCrossSectionPerAtom().

◆ isFirstInstance

G4bool G4PairProductionRelModel::isFirstInstance {false}
protected

Definition at line 154 of file G4PairProductionRelModel.hh.

154{false};

Referenced by Initialise(), and ~G4PairProductionRelModel().


The documentation for this class was generated from the following files: