Geant4.10
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Public Member Functions | Protected Member Functions | Protected Attributes | Static Protected Attributes
G4PairProductionRelModel Class Reference

#include <G4PairProductionRelModel.hh>

Inheritance diagram for G4PairProductionRelModel:
G4VEmModel

Public Member Functions

 G4PairProductionRelModel (const G4ParticleDefinition *p=0, const G4String &nam="BetheHeitlerLPM")
 
virtual ~G4PairProductionRelModel ()
 
virtual void Initialise (const G4ParticleDefinition *, const G4DataVector &)
 
virtual void InitialiseLocal (const G4ParticleDefinition *, G4VEmModel *masterModel)
 
virtual G4double ComputeCrossSectionPerAtom (const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cut=0., G4double emax=DBL_MAX)
 
virtual void SampleSecondaries (std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
 
virtual void SetupForMaterial (const G4ParticleDefinition *, const G4Material *, G4double)
 
void SetCurrentElement (G4double)
 
void SetLPMconstant (G4double val)
 
G4double LPMconstant () const
 
void SetLPMflag (G4bool)
 
G4bool LPMflag () const
 
- 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 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 G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
 
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 *)
 
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)
 
G4int SelectIsotopeNumber (const G4Element *)
 
const G4ElementSelectRandomAtom (const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
const G4ElementSelectRandomAtom (const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
 
G4int SelectRandomAtomNumber (const G4Material *)
 
void SetParticleChange (G4VParticleChange *, G4VEmFluctuationModel *f=0)
 
void SetCrossSectionTable (G4PhysicsTable *, G4bool isLocal)
 
G4ElementDataGetElementData ()
 
G4PhysicsTableGetCrossSectionTable ()
 
G4VEmFluctuationModelGetModelOfFluctuations ()
 
G4VEmAngularDistributionGetAngularDistribution ()
 
void SetAngularDistribution (G4VEmAngularDistribution *)
 
G4double HighEnergyLimit () const
 
G4double LowEnergyLimit () const
 
G4double HighEnergyActivationLimit () const
 
G4double LowEnergyActivationLimit () const
 
G4double PolarAngleLimit () const
 
G4double SecondaryThreshold () const
 
G4bool LPMFlag () 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)
 
void SetPolarAngleLimit (G4double)
 
void SetSecondaryThreshold (G4double)
 
void SetLPMFlag (G4bool val)
 
void SetDeexcitationFlag (G4bool val)
 
void SetForceBuildTable (G4bool val)
 
void SetMasterThread (G4bool val)
 
G4bool IsMaster () const
 
G4double MaxSecondaryKinEnergy (const G4DynamicParticle *dynParticle)
 
const G4StringGetName () const
 
void SetCurrentCouple (const G4MaterialCutsCouple *)
 
const G4ElementGetCurrentElement () const
 

Protected Member Functions

G4double Phi1 (G4double delta) const
 
G4double Phi2 (G4double delta) const
 
G4double ScreenFunction1 (G4double ScreenVariable)
 
G4double ScreenFunction2 (G4double ScreenVariable)
 
G4double DeltaMax () const
 
G4double DeltaMin (G4double) const
 
void CalcLPMFunctions (G4double k, G4double eplus)
 
G4double ComputeXSectionPerAtom (G4double totalEnergy, G4double Z)
 
G4double ComputeDXSectionPerAtom (G4double eplusEnergy, G4double totalEnergy, G4double Z)
 
G4double ComputeRelDXSectionPerAtom (G4double eplusEnergy, G4double totalEnergy, G4double Z)
 
G4PairProductionRelModeloperator= (const G4PairProductionRelModel &right)
 
 G4PairProductionRelModel (const G4PairProductionRelModel &)
 
- Protected Member Functions inherited from G4VEmModel
G4ParticleChangeForLossGetParticleChangeForLoss ()
 
G4ParticleChangeForGammaGetParticleChangeForGamma ()
 
virtual G4double MaxSecondaryEnergy (const G4ParticleDefinition *, G4double kineticEnergy)
 
const G4MaterialCutsCoupleCurrentCouple () const
 
void SetCurrentElement (const G4Element *)
 

Protected Attributes

G4NistManagernist
 
G4ParticleDefinitiontheGamma
 
G4ParticleDefinitiontheElectron
 
G4ParticleDefinitionthePositron
 
G4ParticleChangeForGammafParticleChange
 
G4double fLPMconstant
 
G4bool fLPMflag
 
G4double z13
 
G4double z23
 
G4double lnZ
 
G4double Fel
 
G4double Finel
 
G4double fCoulomb
 
G4double currentZ
 
G4double lpmEnergy
 
G4double xiLPM
 
G4double phiLPM
 
G4double gLPM
 
G4bool use_completescreening
 
- Protected Attributes inherited from G4VEmModel
G4ElementDatafElementData
 
G4VParticleChangepParticleChange
 
G4PhysicsTablexSectionTable
 
const std::vector< G4double > * theDensityFactor
 
const std::vector< G4int > * theDensityIdx
 
size_t idxTable
 

Static Protected Attributes

static const G4double xgi [8]
 
static const G4double wgi [8]
 
static const G4double Fel_light [5] = {0., 5.31 , 4.79 , 4.74 , 4.71}
 
static const G4double Finel_light [5] = {0., 6.144 , 5.621 , 5.805 , 5.924}
 
static const G4double facFel = G4Log(184.15)
 
static const G4double facFinel = G4Log(1194.)
 
static const G4double preS1 = 1./(184.15*184.15)
 
static const G4double logTwo = G4Log(2.)
 

Detailed Description

Definition at line 61 of file G4PairProductionRelModel.hh.

Constructor & Destructor Documentation

G4PairProductionRelModel::G4PairProductionRelModel ( const G4ParticleDefinition p = 0,
const G4String nam = "BetheHeitlerLPM" 
)

Definition at line 90 of file G4PairProductionRelModel.cc.

References currentZ, G4Electron::Electron(), fCoulomb, Fel, Finel, fParticleChange, G4Gamma::Gamma(), gLPM, G4NistManager::Instance(), lnZ, nist, phiLPM, G4Positron::Positron(), theElectron, theGamma, thePositron, xiLPM, z13, and z23.

92  : G4VEmModel(nam),
94  fLPMflag(true),
95  lpmEnergy(0.),
97 {
98  fParticleChange = 0;
102 
104 
105  currentZ = z13 = z23 = lnZ = Fel = Finel = fCoulomb = phiLPM = gLPM = xiLPM = 0;
106 
107 }
G4ParticleDefinition * thePositron
static G4NistManager * Instance()
G4VEmModel(const G4String &nam)
Definition: G4VEmModel.cc:65
float electron_mass_c2
Definition: hepunit.py:274
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
static G4Positron * Positron()
Definition: G4Positron.cc:94
G4ParticleChangeForGamma * fParticleChange
static G4Electron * Electron()
Definition: G4Electron.cc:94
G4ParticleDefinition * theElectron
G4PairProductionRelModel::~G4PairProductionRelModel ( )
virtual

Definition at line 111 of file G4PairProductionRelModel.cc.

112 {}
G4PairProductionRelModel::G4PairProductionRelModel ( const G4PairProductionRelModel )
protected

Member Function Documentation

void G4PairProductionRelModel::CalcLPMFunctions ( G4double  k,
G4double  eplus 
)
protected

Definition at line 234 of file G4PairProductionRelModel.cc.

References facFel, G4Exp(), G4Log(), gLPM, lnZ, logTwo, lpmEnergy, phiLPM, python.hepunit::pi, preS1, G4InuclParticleNames::s0, sqr(), xiLPM, and z23.

Referenced by ComputeRelDXSectionPerAtom(), and SampleSecondaries().

235 {
236  // *** calculate lpm variable s & sprime ***
237  // Klein eqs. (78) & (79)
238  G4double sprime = sqrt(0.125*k*lpmEnergy/(eplusEnergy*(k-eplusEnergy)));
239 
240  G4double s1 = preS1*z23;
241  G4double logS1 = 2./3.*lnZ-2.*facFel;
242  G4double logTS1 = logTwo+logS1;
243 
244  xiLPM = 2.;
245 
246  if (sprime>1)
247  xiLPM = 1.;
248  else if (sprime>sqrt(2.)*s1) {
249  G4double h = G4Log(sprime)/logTS1;
250  xiLPM = 1+h-0.08*(1-h)*(1-sqr(1-h))/logTS1;
251  }
252 
253  G4double s0 = sprime/sqrt(xiLPM);
254  // G4cout<<"k="<<k<<" y="<<eplusEnergy/k<<G4endl;
255  // G4cout<<"s0="<<s0<<G4endl;
256 
257  // *** calculate supression functions phi and G ***
258  // Klein eqs. (77)
259  G4double s2=s0*s0;
260  G4double s3=s0*s2;
261  G4double s4=s2*s2;
262 
263  if (s0<0.1) {
264  // high suppression limit
265  phiLPM = 6.*s0 - 18.84955592153876*s2 + 39.47841760435743*s3
266  - 57.69873135166053*s4;
267  gLPM = 37.69911184307752*s2 - 236.8705056261446*s3 + 807.7822389*s4;
268  }
269  else if (s0<1.9516) {
270  // intermediate suppression
271  // using eq.77 approxim. valid s0<2.
272  phiLPM = 1.-G4Exp(-6.*s0*(1.+(3.-pi)*s0)
273  +s3/(0.623+0.795*s0+0.658*s2));
274  if (s0<0.415827397755) {
275  // using eq.77 approxim. valid 0.07<s<2
276  G4double psiLPM = 1-G4Exp(-4*s0-8*s2/(1+3.936*s0+4.97*s2-0.05*s3+7.50*s4));
277  gLPM = 3*psiLPM-2*phiLPM;
278  }
279  else {
280  // using alternative parametrisiation
281  G4double pre = -0.16072300849123999 + s0*3.7550300067531581 + s2*-1.7981383069010097
282  + s3*0.67282686077812381 + s4*-0.1207722909879257;
283  gLPM = tanh(pre);
284  }
285  }
286  else {
287  // low suppression limit valid s>2.
288  phiLPM = 1. - 0.0119048/s4;
289  gLPM = 1. - 0.0230655/s4;
290  }
291 
292  // *** make sure suppression is smaller than 1 ***
293  // *** caused by Migdal approximation in xi ***
294  if (xiLPM*phiLPM>1. || s0>0.57) xiLPM=1./phiLPM;
295 }
G4double G4Log(G4double x)
Definition: G4Log.hh:227
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
T sqr(const T &x)
Definition: templates.hh:145
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::ComputeCrossSectionPerAtom ( const G4ParticleDefinition ,
G4double  kinEnergy,
G4double  Z,
G4double  A = 0.,
G4double  cut = 0.,
G4double  emax = DBL_MAX 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 301 of file G4PairProductionRelModel.cc.

References ComputeXSectionPerAtom(), python.hepunit::electron_mass_c2, fCoulomb, Fel, Finel, and SetCurrentElement().

304 {
305  G4double crossSection = 0.0 ;
306  // if ( Z < 0.9 ) return crossSection;
307  if ( gammaEnergy <= 2.0*electron_mass_c2 ) return crossSection;
308 
310  // choose calculator according to parameters and switches
311  // in the moment only one calculator:
312  crossSection=ComputeXSectionPerAtom(gammaEnergy,Z);
313 
314  G4double xi = Finel/(Fel - fCoulomb); // inelastic contribution
315  crossSection *= xsfactor*Z*(Z+xi);
316 
317  return crossSection;
318 }
G4double ComputeXSectionPerAtom(G4double totalEnergy, G4double Z)
float electron_mass_c2
Definition: hepunit.py:274
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::ComputeDXSectionPerAtom ( G4double  eplusEnergy,
G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 177 of file G4PairProductionRelModel.cc.

References DeltaMin(), fCoulomb, Fel, lnZ, Phi1(), Phi2(), and use_completescreening.

Referenced by ComputeXSectionPerAtom().

180 {
181  // most simple case - complete screening:
182 
183  // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k
184  // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ]
185  // y = E+/k
186  G4double yp=eplusEnergy/totalEnergy;
187  G4double ym=1.-yp;
188 
189  G4double cross = 0.;
191  cross = (yp*yp + ym*ym + 2./3.*ym*yp)*(Fel - fCoulomb) + 1./9.*yp*ym;
192  else {
193  G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym);
194  cross = (yp*yp + ym*ym)*(0.25*Phi1(delta) - lnZ/3. - fCoulomb)
195  + 2./3.*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb);
196  }
197  return cross/totalEnergy;
198 
199 }
G4double Phi1(G4double delta) const
G4double Phi2(G4double delta) const
G4double DeltaMin(G4double) const
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::ComputeRelDXSectionPerAtom ( G4double  eplusEnergy,
G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 203 of file G4PairProductionRelModel.cc.

References CalcLPMFunctions(), DeltaMin(), fCoulomb, Fel, gLPM, lnZ, Phi1(), Phi2(), phiLPM, use_completescreening, and xiLPM.

Referenced by ComputeXSectionPerAtom().

206 {
207  // most simple case - complete screening:
208 
209  // dsig/dE+ = 4 * alpha * Z**2 * r0**2 / k
210  // * [ (y**2 + (1-y**2) + 2/3*y*(1-y) ) * ( log (183 * Z**-1/3) + 1/9 * y*(1-y) ]
211  // y = E+/k
212  G4double yp=eplusEnergy/totalEnergy;
213  G4double ym=1.-yp;
214 
215  CalcLPMFunctions(totalEnergy,eplusEnergy); // gamma
216 
217  G4double cross = 0.;
219  cross = xiLPM*(2./3.*phiLPM*(yp*yp + ym*ym) + gLPM)*(Fel - fCoulomb);
220  else {
221  G4double delta = 0.25*DeltaMin(totalEnergy)/(yp*ym);
222  cross = (1./3.*gLPM + 2./3.*phiLPM)*(yp*yp + ym*ym)
223  *(0.25*Phi1(delta) - lnZ/3. - fCoulomb)
224  + 2./3.*gLPM*ym*yp*(0.25*Phi2(delta) - lnZ/3. - fCoulomb);
225  cross *= xiLPM;
226  }
227  return cross/totalEnergy;
228 
229 }
G4double Phi1(G4double delta) const
G4double Phi2(G4double delta) const
G4double DeltaMin(G4double) const
void CalcLPMFunctions(G4double k, G4double eplus)
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::ComputeXSectionPerAtom ( G4double  totalEnergy,
G4double  Z 
)
protected

Definition at line 133 of file G4PairProductionRelModel.cc.

References ComputeDXSectionPerAtom(), ComputeRelDXSectionPerAtom(), DeltaMax(), DeltaMin(), python.hepunit::electron_mass_c2, fLPMflag, python.hepunit::GeV, G4INCL::Math::max(), G4INCL::Math::min(), n, wgi, and xgi.

Referenced by ComputeCrossSectionPerAtom().

134 {
135  G4double cross = 0.0;
136 
137  // number of intervals and integration step
138  G4double vcut = electron_mass_c2/totalEnergy ;
139 
140  // limits by the screening variable
141  G4double dmax = DeltaMax();
142  G4double dmin = min(DeltaMin(totalEnergy),dmax);
143  G4double vcut1 = 0.5 - 0.5*sqrt(1. - dmin/dmax) ;
144  vcut = max(vcut, vcut1);
145 
146 
147  G4double vmax = 0.5;
148  G4int n = 1; // needs optimisation
149 
150  G4double delta = (vmax - vcut)*totalEnergy/G4double(n);
151 
152  G4double e0 = vcut*totalEnergy;
153  G4double xs;
154 
155  // simple integration
156  for(G4int l=0; l<n; l++,e0 += delta) {
157  for(G4int i=0; i<8; i++) {
158 
159  G4double eg = (e0 + xgi[i]*delta);
160  if (fLPMflag && totalEnergy>100.*GeV)
161  xs = ComputeRelDXSectionPerAtom(eg,totalEnergy,Z);
162  else
163  xs = ComputeDXSectionPerAtom(eg,totalEnergy,Z);
164  cross += wgi[i]*xs;
165 
166  }
167  }
168 
169  cross *= delta*2.;
170 
171  return cross;
172 }
int G4int
Definition: G4Types.hh:78
static const G4double xgi[8]
static const G4double wgi[8]
G4double DeltaMin(G4double) const
float electron_mass_c2
Definition: hepunit.py:274
const G4int n
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4double ComputeRelDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
double G4double
Definition: G4Types.hh:76
G4double ComputeDXSectionPerAtom(G4double eplusEnergy, G4double totalEnergy, G4double Z)
G4double G4PairProductionRelModel::DeltaMax ( ) const
inlineprotected

Definition at line 277 of file G4PairProductionRelModel.hh.

References fCoulomb, and lnZ.

Referenced by ComputeXSectionPerAtom().

278 {
279  // k > 50 MeV
280  G4double FZ = 8.*(lnZ/3. + fCoulomb);
281  return std::exp( (42.24-FZ)/8.368 ) + 0.952;
282 }
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::DeltaMin ( G4double  k) const
inlineprotected

Definition at line 284 of file G4PairProductionRelModel.hh.

References z13.

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

285 {
286  return 4.*136./z13*(CLHEP::electron_mass_c2/k);
287 }
void G4PairProductionRelModel::Initialise ( const G4ParticleDefinition p,
const G4DataVector cuts 
)
virtual

Implements G4VEmModel.

Definition at line 116 of file G4PairProductionRelModel.cc.

References fParticleChange, G4VEmModel::GetParticleChangeForGamma(), G4VEmModel::InitialiseElementSelectors(), and G4VEmModel::IsMaster().

118 {
120  if(IsMaster()) { InitialiseElementSelectors(p, cuts); }
121 }
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:135
G4bool IsMaster() const
Definition: G4VEmModel.hh:676
G4ParticleChangeForGamma * fParticleChange
G4ParticleChangeForGamma * GetParticleChangeForGamma()
Definition: G4VEmModel.cc:121
void G4PairProductionRelModel::InitialiseLocal ( const G4ParticleDefinition ,
G4VEmModel masterModel 
)
virtual

Reimplemented from G4VEmModel.

Definition at line 125 of file G4PairProductionRelModel.cc.

References G4VEmModel::GetElementSelectors(), and G4VEmModel::SetElementSelectors().

127 {
129 }
std::vector< G4EmElementSelector * > * GetElementSelectors()
Definition: G4VEmModel.hh:760
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
Definition: G4VEmModel.hh:768
G4double G4PairProductionRelModel::LPMconstant ( ) const
inline

Definition at line 169 of file G4PairProductionRelModel.hh.

References fLPMconstant.

170 {
171  return fLPMconstant;
172 }
G4bool G4PairProductionRelModel::LPMflag ( ) const
inline

Definition at line 185 of file G4PairProductionRelModel.hh.

References fLPMflag.

186 {
187  return fLPMflag;
188 }
G4PairProductionRelModel& G4PairProductionRelModel::operator= ( const G4PairProductionRelModel right)
protected
G4double G4PairProductionRelModel::Phi1 ( G4double  delta) const
inlineprotected

Definition at line 216 of file G4PairProductionRelModel.hh.

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

217 {
218  G4double screenVal;
219 
220  if (delta > 1.)
221  screenVal = 21.12 - 4.184*std::log(delta+0.952);
222  else
223  screenVal = 20.868 - delta*(3.242 - 0.625*delta);
224 
225  return screenVal;
226 }
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::Phi2 ( G4double  delta) const
inlineprotected

Definition at line 230 of file G4PairProductionRelModel.hh.

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

231 {
232  G4double screenVal;
233 
234  if (delta > 1.)
235  screenVal = 21.12 - 4.184*std::log(delta+0.952);
236  else
237  screenVal = 20.209 - delta*(1.930 + 0.086*delta);
238 
239  return screenVal;
240 }
double G4double
Definition: G4Types.hh:76
void G4PairProductionRelModel::SampleSecondaries ( std::vector< G4DynamicParticle * > *  fvect,
const G4MaterialCutsCouple couple,
const G4DynamicParticle aDynamicGamma,
G4double  tmin,
G4double  maxEnergy 
)
virtual

Implements G4VEmModel.

Definition at line 323 of file G4PairProductionRelModel.cc.

References CalcLPMFunctions(), python.hepunit::electron_mass_c2, F10, F20, fLPMflag, fParticleChange, fStopAndKill, G4Exp(), G4Log(), G4UniformRand, G4Element::GetfCoulomb(), G4Element::GetIonisation(), G4DynamicParticle::GetKineticEnergy(), G4IonisParamElm::GetlogZ3(), G4MaterialCutsCouple::GetMaterial(), G4DynamicParticle::GetMomentumDirection(), G4NistManager::GetZ13(), G4IonisParamElm::GetZ3(), python.hepunit::GeV, gLPM, G4INCL::Math::max(), python.hepunit::MeV, G4INCL::Math::min(), nist, Phi1(), Phi2(), phiLPM, G4VParticleChange::ProposeTrackStatus(), CLHEP::Hep3Vector::rotateUz(), ScreenFunction1(), ScreenFunction2(), G4VEmModel::SelectRandomAtom(), G4ParticleChangeForGamma::SetProposedKineticEnergy(), SetupForMaterial(), theElectron, theGamma, thePositron, python.hepunit::twopi, and xiLPM.

340 {
341  const G4Material* aMaterial = couple->GetMaterial();
342 
343  G4double GammaEnergy = aDynamicGamma->GetKineticEnergy();
344  G4ParticleMomentum GammaDirection = aDynamicGamma->GetMomentumDirection();
345 
346  G4double epsil ;
347  G4double epsil0 = electron_mass_c2/GammaEnergy ;
348  if(epsil0 > 1.0) { return; }
349 
350  // do it fast if GammaEnergy < 2. MeV
351  SetupForMaterial(theGamma, aMaterial, GammaEnergy);
352 
353  // select randomly one element constituing the material
354  const G4Element* anElement =
355  SelectRandomAtom(aMaterial, theGamma, GammaEnergy);
356 
357  if (GammaEnergy < Egsmall) {
358 
359  epsil = epsil0 + (0.5-epsil0)*G4UniformRand();
360 
361  } else {
362  // now comes the case with GammaEnergy >= 2. MeV
363 
364  // Extract Coulomb factor for this Element
365  G4double FZ = 8.*(anElement->GetIonisation()->GetlogZ3());
366  if (GammaEnergy > 50.*MeV) { FZ += 8.*(anElement->GetfCoulomb()); }
367 
368  // limits of the screening variable
369  G4double screenfac = 136.*epsil0/(anElement->GetIonisation()->GetZ3());
370  G4double screenmax = G4Exp ((42.24 - FZ)/8.368) - 0.952 ;
371  G4double screenmin = min(4.*screenfac,screenmax);
372 
373  // limits of the energy sampling
374  G4double epsil1 = 0.5 - 0.5*sqrt(1. - screenmin/screenmax) ;
375  G4double epsilmin = max(epsil0,epsil1) , epsilrange = 0.5 - epsilmin;
376 
377  //
378  // sample the energy rate of the created electron (or positron)
379  //
380  //G4double epsil, screenvar, greject ;
381  G4double screenvar, greject ;
382 
383  G4double F10 = ScreenFunction1(screenmin) - FZ;
384  G4double F20 = ScreenFunction2(screenmin) - FZ;
385  G4double NormF1 = max(F10*epsilrange*epsilrange,0.);
386  G4double NormF2 = max(1.5*F20,0.);
387 
388  do {
389  if ( NormF1/(NormF1+NormF2) > G4UniformRand() ) {
390  epsil = 0.5 - epsilrange*nist->GetZ13(G4UniformRand());
391  screenvar = screenfac/(epsil*(1-epsil));
392  if (fLPMflag && GammaEnergy>100.*GeV) {
393  CalcLPMFunctions(GammaEnergy,GammaEnergy*epsil);
394  greject = xiLPM*((gLPM+2.*phiLPM)*Phi1(screenvar) -
395  gLPM*Phi2(screenvar) - phiLPM*FZ)/F10;
396  }
397  else {
398  greject = (ScreenFunction1(screenvar) - FZ)/F10;
399  }
400 
401  } else {
402  epsil = epsilmin + epsilrange*G4UniformRand();
403  screenvar = screenfac/(epsil*(1-epsil));
404  if (fLPMflag && GammaEnergy>100.*GeV) {
405  CalcLPMFunctions(GammaEnergy,GammaEnergy*epsil);
406  greject = xiLPM*((0.5*gLPM+phiLPM)*Phi1(screenvar) +
407  0.5*gLPM*Phi2(screenvar) - 0.5*(gLPM+phiLPM)*FZ)/F20;
408  }
409  else {
410  greject = (ScreenFunction2(screenvar) - FZ)/F20;
411  }
412  }
413 
414  } while( greject < G4UniformRand() );
415 
416  } // end of epsil sampling
417 
418  //
419  // fixe charges randomly
420  //
421 
422  G4double ElectTotEnergy, PositTotEnergy;
423  if (G4UniformRand() > 0.5) {
424 
425  ElectTotEnergy = (1.-epsil)*GammaEnergy;
426  PositTotEnergy = epsil*GammaEnergy;
427 
428  } else {
429 
430  PositTotEnergy = (1.-epsil)*GammaEnergy;
431  ElectTotEnergy = epsil*GammaEnergy;
432  }
433 
434  //
435  // scattered electron (positron) angles. ( Z - axis along the parent photon)
436  //
437  // universal distribution suggested by L. Urban
438  // (Geant3 manual (1993) Phys211),
439  // derived from Tsai distribution (Rev Mod Phys 49,421(1977))
440 
441  G4double u;
442  static const G4double a1 = 0.625;
443  static const G4double a2 = 3.*a1;
444  static const G4double d = 27. ;
445 
446  if (9./(9.+d) >G4UniformRand()) u= - G4Log(G4UniformRand()*G4UniformRand())/a1;
447  else u= - G4Log(G4UniformRand()*G4UniformRand())/a2;
448 
449  G4double TetEl = u*electron_mass_c2/ElectTotEnergy;
450  G4double TetPo = u*electron_mass_c2/PositTotEnergy;
451  G4double Phi = twopi * G4UniformRand();
452  G4double dxEl= sin(TetEl)*cos(Phi),dyEl= sin(TetEl)*sin(Phi),dzEl=cos(TetEl);
453  G4double dxPo=-sin(TetPo)*cos(Phi),dyPo=-sin(TetPo)*sin(Phi),dzPo=cos(TetPo);
454 
455  //
456  // kinematic of the created pair
457  //
458  // the electron and positron are assumed to have a symetric
459  // angular distribution with respect to the Z axis along the parent photon.
460 
461  G4double ElectKineEnergy = max(0.,ElectTotEnergy - electron_mass_c2);
462 
463  G4ThreeVector ElectDirection (dxEl, dyEl, dzEl);
464  ElectDirection.rotateUz(GammaDirection);
465 
466  // create G4DynamicParticle object for the particle1
467  G4DynamicParticle* aParticle1= new G4DynamicParticle(
468  theElectron,ElectDirection,ElectKineEnergy);
469 
470  // the e+ is always created (even with Ekine=0) for further annihilation.
471 
472  G4double PositKineEnergy = max(0.,PositTotEnergy - electron_mass_c2);
473 
474  G4ThreeVector PositDirection (dxPo, dyPo, dzPo);
475  PositDirection.rotateUz(GammaDirection);
476 
477  // create G4DynamicParticle object for the particle2
478  G4DynamicParticle* aParticle2= new G4DynamicParticle(
479  thePositron,PositDirection,PositKineEnergy);
480 
481  // Fill output vector
482  fvect->push_back(aParticle1);
483  fvect->push_back(aParticle2);
484 
485  // kill incident photon
488 }
G4double Phi1(G4double delta) const
G4double GetKineticEnergy() const
G4double Phi2(G4double delta) const
G4double GetZ13(G4double Z)
G4double GetfCoulomb() const
Definition: G4Element.hh:190
#define F20
G4ParticleDefinition * thePositron
G4double ScreenFunction1(G4double ScreenVariable)
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double)
#define G4UniformRand()
Definition: Randomize.hh:87
const G4ThreeVector & GetMomentumDirection() const
void CalcLPMFunctions(G4double k, G4double eplus)
float electron_mass_c2
Definition: hepunit.py:274
G4double ScreenFunction2(G4double ScreenVariable)
#define F10
G4double GetlogZ3() const
G4double G4Log(G4double x)
Definition: G4Log.hh:227
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:180
G4ParticleChangeForGamma * fParticleChange
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4IonisParamElm * GetIonisation() const
Definition: G4Element.hh:198
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
void SetProposedKineticEnergy(G4double proposedKinEnergy)
G4ParticleDefinition * theElectron
double G4double
Definition: G4Types.hh:76
void ProposeTrackStatus(G4TrackStatus status)
G4double GetZ3() const
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:510
const G4Material * GetMaterial() const
G4double G4PairProductionRelModel::ScreenFunction1 ( G4double  ScreenVariable)
inlineprotected

Definition at line 242 of file G4PairProductionRelModel.hh.

Referenced by SampleSecondaries().

246 {
247  G4double screenVal;
248 
249  if (ScreenVariable > 1.)
250  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
251  else
252  screenVal = 42.392 - ScreenVariable*(7.796 - 1.961*ScreenVariable);
253 
254  return screenVal;
255 }
double G4double
Definition: G4Types.hh:76
G4double G4PairProductionRelModel::ScreenFunction2 ( G4double  ScreenVariable)
inlineprotected

Definition at line 259 of file G4PairProductionRelModel.hh.

Referenced by SampleSecondaries().

263 {
264  G4double screenVal;
265 
266  if (ScreenVariable > 1.)
267  screenVal = 42.24 - 8.368*std::log(ScreenVariable+0.952);
268  else
269  screenVal = 41.405 - ScreenVariable*(5.828 - 0.8945*ScreenVariable);
270 
271  return screenVal;
272 }
double G4double
Definition: G4Types.hh:76
void G4PairProductionRelModel::SetCurrentElement ( G4double  Z)
inline

Definition at line 192 of file G4PairProductionRelModel.hh.

References currentZ, facFel, facFinel, fCoulomb, Fel, Fel_light, Finel, Finel_light, G4VEmModel::GetCurrentElement(), G4Element::GetfCoulomb(), G4NistManager::GetLOGZ(), G4NistManager::GetZ13(), iz, lnZ, nist, z13, and z23.

Referenced by ComputeCrossSectionPerAtom().

193 {
194  if(Z != currentZ) {
195  currentZ = Z;
196 
197  G4int iz = G4int(Z);
198  z13 = nist->GetZ13(iz);
199  z23 = z13*z13;
200  lnZ = nist->GetLOGZ(iz);
201 
202  if (iz <= 4) {
203  Fel = Fel_light[iz];
204  Finel = Finel_light[iz] ;
205  }
206  else {
207  Fel = facFel - lnZ/3. ;
208  Finel = facFinel - 2.*lnZ/3. ;
209  }
211  }
212 }
G4double GetZ13(G4double Z)
G4double GetfCoulomb() const
Definition: G4Element.hh:190
static const G4double Finel_light[5]
int G4int
Definition: G4Types.hh:78
G4double iz
Definition: TRTMaterials.hh:39
G4double GetLOGZ(G4int Z)
static const G4double Fel_light[5]
const G4Element * GetCurrentElement() const
Definition: G4VEmModel.hh:440
void G4PairProductionRelModel::SetLPMconstant ( G4double  val)
inline

Definition at line 161 of file G4PairProductionRelModel.hh.

References fLPMconstant.

162 {
163  fLPMconstant = val;
164 }
void G4PairProductionRelModel::SetLPMflag ( G4bool  val)
inline

Definition at line 177 of file G4PairProductionRelModel.hh.

References fLPMflag.

178 {
179  fLPMflag = val;
180 }
void G4PairProductionRelModel::SetupForMaterial ( const G4ParticleDefinition ,
const G4Material mat,
G4double   
)
virtual

Reimplemented from G4VEmModel.

Definition at line 493 of file G4PairProductionRelModel.cc.

References fLPMconstant, G4Material::GetRadlen(), and lpmEnergy.

Referenced by SampleSecondaries().

495 {
497  // G4cout<<" lpmEnergy="<<lpmEnergy<<G4endl;
498 }
G4double GetRadlen() const
Definition: G4Material.hh:218

Field Documentation

G4double G4PairProductionRelModel::currentZ
protected

Definition at line 138 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SetCurrentElement().

const G4double G4PairProductionRelModel::facFel = G4Log(184.15)
staticprotected

Definition at line 150 of file G4PairProductionRelModel.hh.

Referenced by CalcLPMFunctions(), and SetCurrentElement().

const G4double G4PairProductionRelModel::facFinel = G4Log(1194.)
staticprotected

Definition at line 151 of file G4PairProductionRelModel.hh.

Referenced by SetCurrentElement().

G4double G4PairProductionRelModel::fCoulomb
protected
G4double G4PairProductionRelModel::Fel
protected
const G4double G4PairProductionRelModel::Fel_light = {0., 5.31 , 4.79 , 4.74 , 4.71}
staticprotected

Definition at line 148 of file G4PairProductionRelModel.hh.

Referenced by SetCurrentElement().

G4double G4PairProductionRelModel::Finel
protected
const G4double G4PairProductionRelModel::Finel_light = {0., 6.144 , 5.621 , 5.805 , 5.924}
staticprotected

Definition at line 149 of file G4PairProductionRelModel.hh.

Referenced by SetCurrentElement().

G4double G4PairProductionRelModel::fLPMconstant
protected

Definition at line 132 of file G4PairProductionRelModel.hh.

Referenced by LPMconstant(), SetLPMconstant(), and SetupForMaterial().

G4bool G4PairProductionRelModel::fLPMflag
protected
G4ParticleChangeForGamma* G4PairProductionRelModel::fParticleChange
protected
G4double G4PairProductionRelModel::gLPM
protected
G4double G4PairProductionRelModel::lnZ
protected
const G4double G4PairProductionRelModel::logTwo = G4Log(2.)
staticprotected

Definition at line 153 of file G4PairProductionRelModel.hh.

Referenced by CalcLPMFunctions().

G4double G4PairProductionRelModel::lpmEnergy
protected

Definition at line 141 of file G4PairProductionRelModel.hh.

Referenced by CalcLPMFunctions(), and SetupForMaterial().

G4NistManager* G4PairProductionRelModel::nist
protected
G4double G4PairProductionRelModel::phiLPM
protected
const G4double G4PairProductionRelModel::preS1 = 1./(184.15*184.15)
staticprotected

Definition at line 153 of file G4PairProductionRelModel.hh.

Referenced by CalcLPMFunctions().

G4ParticleDefinition* G4PairProductionRelModel::theElectron
protected

Definition at line 128 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

G4ParticleDefinition* G4PairProductionRelModel::theGamma
protected

Definition at line 127 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

G4ParticleDefinition* G4PairProductionRelModel::thePositron
protected

Definition at line 129 of file G4PairProductionRelModel.hh.

Referenced by G4PairProductionRelModel(), and SampleSecondaries().

G4bool G4PairProductionRelModel::use_completescreening
protected
const G4double G4PairProductionRelModel::wgi
staticprotected
Initial value:
={ 0.0506, 0.1112, 0.1569, 0.1813,
0.1813, 0.1569, 0.1112, 0.0506 }

Definition at line 147 of file G4PairProductionRelModel.hh.

Referenced by ComputeXSectionPerAtom().

const G4double G4PairProductionRelModel::xgi
staticprotected
Initial value:
={ 0.0199, 0.1017, 0.2372, 0.4083,
0.5917, 0.7628, 0.8983, 0.9801 }

Definition at line 147 of file G4PairProductionRelModel.hh.

Referenced by ComputeXSectionPerAtom().

G4double G4PairProductionRelModel::xiLPM
protected
G4double G4PairProductionRelModel::z13
protected
G4double G4PairProductionRelModel::z23
protected

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