Geant4  v4-10.4-release
 모두 클래스 네임스페이스들 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 Friends 매크로 그룹들 페이지들
G4eBremsstrahlungRelModel.cc
이 파일의 문서화 페이지로 가기
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // $Id: G4eBremsstrahlungRelModel.cc 108737 2018-03-02 13:49:56Z gcosmo $
27 //
28 // -------------------------------------------------------------------
29 //
30 // GEANT4 Class file
31 //
32 //
33 // File name: G4eBremsstrahlungRelModel
34 //
35 // Author: Andreas Schaelicke
36 //
37 // Creation date: 12.08.2008
38 //
39 // Modifications:
40 //
41 // 13.11.08 add SetLPMflag and SetLPMconstant methods
42 // 13.11.08 change default LPMconstant value
43 // 13.10.10 add angular distributon interface (VI)
44 // 31.05.16 change LPMconstant such that it gives suppression variable 's'
45 // that consistent to Migdal's one; fix a small bug in 'logTS1'
46 // computation; better agreement with exp.(M.Novak)
47 //
48 // Main References:
49 // Y.-S.Tsai, Rev. Mod. Phys. 46 (1974) 815; Rev. Mod. Phys. 49 (1977) 421.
50 // S.Klein, Rev. Mod. Phys. 71 (1999) 1501.
51 // T.Stanev et.al., Phys. Rev. D25 (1982) 1291.
52 // M.L.Ter-Mikaelian, High-energy Electromagnetic Processes in Condensed Media, Wiley, 1972.
53 //
54 // -------------------------------------------------------------------
55 //
56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
57 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
58 
60 #include "G4PhysicalConstants.hh"
61 #include "G4SystemOfUnits.hh"
62 #include "G4Electron.hh"
63 #include "G4Positron.hh"
64 #include "G4Gamma.hh"
65 #include "Randomize.hh"
66 #include "G4Material.hh"
67 #include "G4Element.hh"
68 #include "G4ElementVector.hh"
69 #include "G4ProductionCutsTable.hh"
71 #include "G4LossTableManager.hh"
72 #include "G4ModifiedTsai.hh"
73 #include "G4DipBustGenerator.hh"
74 
75 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
76 
77 const G4double
78 G4eBremsstrahlungRelModel::xgi[]={ 0.0199, 0.1017, 0.2372, 0.4083,
79  0.5917, 0.7628, 0.8983, 0.9801 };
80 const G4double
81 G4eBremsstrahlungRelModel::wgi[]={ 0.0506, 0.1112, 0.1569, 0.1813,
82  0.1813, 0.1569, 0.1112, 0.0506 };
83 const G4double
84 G4eBremsstrahlungRelModel::Fel_light[] = {0., 5.31 , 4.79 , 4.74 , 4.71};
85 const G4double
86 G4eBremsstrahlungRelModel::Finel_light[] = {0., 6.144 , 5.621 , 5.805 , 5.924};
87 
88 using namespace std;
89 
91  const G4ParticleDefinition* p, const G4String& nam)
92  : G4VEmModel(nam),
93  particle(nullptr),
95  scatOffElectron(false),
96  isElectron(true),
99  use_completescreening(false)
100 {
101  fParticleChange = nullptr;
103 
104  lowestKinEnergy = 1.0*MeV;
106 
108 
109  SetLPMFlag(true);
111 
114  = xiLPM = phiLPM = gLPM = klpm = kp = nucTerm = sumTerm = 0.0;
115  currentZ = 0;
116  energyThresholdLPM = 1.e39;
117 
119  if(p) { SetParticle(p); }
120 }
121 
122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
123 
125 {
126  facFel = G4Log(184.15);
127  facFinel = G4Log(1194.);
128 
129  preS1 = 1./(184.15*184.15);
130  logTwo = G4Log(2.);
131 }
132 
133 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
134 
136 {
137  particle = p;
138  particleMass = p->GetPDGMass();
139  isElectron = (p == G4Electron::Electron()) ? true : false;
140 }
141 
142 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
143 
145  const G4Material* mat,
147 {
150 
151  // Threshold for LPM effect (i.e. below which LPM hidden by density effect)
152  if (LPMFlag()) {
154  } else {
155  energyThresholdLPM=1.e39; // i.e. do not use LPM effect
156  }
157  // calculate threshold for density effect
159  totalEnergy = kineticEnergy + particleMass;
161 
162  // define critical gamma energies (important for integration/dicing)
163  klpm=totalEnergy*totalEnergy/lpmEnergy;
164  kp=sqrt(densityCorr);
165 }
166 
167 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
168 
170 {
171  if(Z != currentZ) {
172  currentZ = Z;
173 
174  z13 = nist->GetZ13(Z);
175  z23 = z13*z13;
176  lnZ = nist->GetLOGZ(Z);
177 
178  if (Z <= 4) {
179  Fel = Fel_light[Z];
180  Finel = Finel_light[Z] ;
181  }
182  else {
183  G4double lnzt = lnZ/3.;
184  Fel = facFel - lnzt;
185  Finel = facFinel - 2*lnzt;
186  }
187 
189  G4double xz = 1.0/(G4double)Z;
190  fMax = Fel-fCoulomb + Finel*xz + (1. + xz)/12.;
191  }
192 }
193 
194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
195 
197  const G4DataVector& cuts)
198 {
199  if(p) { SetParticle(p); }
200 
201  currentZ = 0;
202 
203  if(IsMaster() && LowEnergyLimit() < HighEnergyLimit()) {
204  InitialiseElementSelectors(p, cuts);
205  }
206 
208  if(GetTripletModel()) {
209  GetTripletModel()->Initialise(p, cuts);
210  scatOffElectron = true;
211  }
212 }
213 
214 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
215 
217  G4VEmModel* masterModel)
218 {
219  if(LowEnergyLimit() < HighEnergyLimit()) {
221  }
222 }
223 
224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
225 
226 G4double
228  const G4ParticleDefinition*,
229  G4double cut)
230 {
231  return std::max(lowestKinEnergy, cut);
232 }
233 
234 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
235 
237  const G4Material* material,
238  const G4ParticleDefinition* p,
240  G4double cutEnergy)
241 {
242  if(!particle) { SetParticle(p); }
243  if(kineticEnergy < LowEnergyLimit()) { return 0.0; }
244  G4double cut = std::min(cutEnergy, kineticEnergy);
245  if(cut == 0.0) { return 0.0; }
246 
247  SetupForMaterial(particle, material,kineticEnergy);
248 
249  const G4ElementVector* theElementVector = material->GetElementVector();
250  const G4double* theAtomicNumDensityVector = material->GetAtomicNumDensityVector();
251 
252  G4double dedx = 0.0;
253 
254  // loop for elements in the material
255  for (size_t i=0; i<material->GetNumberOfElements(); i++) {
256 
257  G4VEmModel::SetCurrentElement((*theElementVector)[i]);
258  SetCurrentElement((*theElementVector)[i]->GetZasInt());
259 
260  dedx += theAtomicNumDensityVector[i]*(currentZ*currentZ)*ComputeBremLoss(cut);
261  }
262  dedx *= bremFactor;
263 
264 
265  return dedx;
266 }
267 
268 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
269 
271 {
272  G4double loss = 0.0;
273 
274  // number of intervals and integration step
275  G4double vcut = cut/totalEnergy;
276  G4int n = (G4int)(20*vcut) + 3;
277  G4double delta = vcut/G4double(n);
278 
279  G4double e0 = 0.0;
280  G4double xs;
281 
282  // integration
283  for(G4int l=0; l<n; l++) {
284 
285  for(G4int i=0; i<8; i++) {
286 
287  G4double eg = (e0 + xgi[i]*delta)*totalEnergy;
288 
291  } else {
292  xs = ComputeDXSectionPerAtom(eg);
293  }
294  loss += wgi[i]*xs/(1.0 + densityCorr/(eg*eg));
295  }
296  e0 += delta;
297  }
298 
299  loss *= delta*totalEnergy;
300 
301  return loss;
302 }
303 
304 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
305 
307  const G4ParticleDefinition* p,
310  G4double cutEnergy,
311  G4double maxEnergy)
312 {
313  if(!particle) { SetParticle(p); }
314  if(kineticEnergy < LowEnergyLimit()) { return 0.0; }
315  G4double cut = std::min(cutEnergy, kineticEnergy);
316  G4double tmax = std::min(maxEnergy, kineticEnergy);
317 
318  if(cut >= tmax) { return 0.0; }
319 
321 
322  G4double cross = ComputeXSectionPerAtom(cut);
323 
324  // allow partial integration
325  if(tmax < kinEnergy) { cross -= ComputeXSectionPerAtom(tmax); }
326 
327  cross *= Z*Z*bremFactor;
328 
329  return cross;
330 }
331 
332 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
333 
334 
336 {
337  G4double cross = 0.0;
338 
339  // number of intervals and integration step
340  G4double vcut = G4Log(cut/totalEnergy);
342  G4int n = (G4int)(0.45*(vmax - vcut)) + 4;
343  // n=1; // integration test
344  G4double delta = (vmax - vcut)/G4double(n);
345 
346  G4double e0 = vcut;
347  G4double xs;
348 
349  // integration
350  for(G4int l=0; l<n; l++) {
351 
352  for(G4int i=0; i<8; i++) {
353 
354  G4double eg = G4Exp(e0 + xgi[i]*delta)*totalEnergy;
355 
358  } else {
359  xs = ComputeDXSectionPerAtom(eg);
360  }
361  cross += wgi[i]*xs/(1.0 + densityCorr/(eg*eg));
362  }
363  e0 += delta;
364  }
365 
366  cross *= delta;
367 
368  return cross;
369 }
370 
371 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
372 
374 {
375  // *** calculate lpm variable s & sprime ***
376  // Klein eqs. (78) & (79)
377  G4double sprime = sqrt(0.125*k*lpmEnergy/(totalEnergy*(totalEnergy-k)));
378 
379  G4double s1 = preS1*z23;
380  G4double logS1 = 2./3.*lnZ-2.*facFel;
381  G4double logTS1 = 0.5*logTwo+logS1;
382 
383  xiLPM = 2.;
384 
385  if (sprime>1)
386  xiLPM = 1.;
387  else if (sprime>sqrt(2.)*s1) {
388  G4double h = G4Log(sprime)/logTS1;
389  xiLPM = 1+h-0.08*(1-h)*(1-sqr(1-h))/logTS1;
390  }
391 
392  G4double s0 = sprime/sqrt(xiLPM);
393 
394  // *** merging with density effect*** should be only necessary in region
395  // "close to" kp, e.g. k<100*kp using Ter-Mikaelian eq. (20.9)
396  G4double k2 = k*k;
397  s0 *= (1 + (densityCorr/k2) );
398 
399  // recalculate Xi using modified s above
400  // Klein eq. (75)
401  xiLPM = 1.;
402  if (s0<=s1) xiLPM = 2.;
403  else if ( (s1<s0) && (s0<=1) ) { xiLPM = 1. + G4Log(s0)/logS1; }
404 
405 
406  // *** calculate supression functions phi and G ***
407  // Klein eqs. (77)
408  G4double s2=s0*s0;
409  G4double s3=s0*s2;
410  G4double s4=s2*s2;
411 
412  if (s0<0.1) {
413  // high suppression limit
414  phiLPM = 6.*s0 - 18.84955592153876*s2 + 39.47841760435743*s3
415  - 57.69873135166053*s4;
416  gLPM = 37.69911184307752*s2 - 236.8705056261446*s3 + 807.7822389*s4;
417  }
418  else if (s0<1.9516) {
419  // intermediate suppression
420  // using eq.77 approxim. valid s<2.
421  phiLPM = 1.-G4Exp(-6.*s0*(1.+(3.-pi)*s0)
422  +s3/(0.623+0.795*s0+0.658*s2));
423  if (s0<0.415827397755) {
424  // using eq.77 approxim. valid 0.07<s<2
425  G4double psiLPM = 1-G4Exp(-4*s0-8*s2/(1+3.936*s0+4.97*s2-0.05*s3+7.50*s4));
426  gLPM = 3*psiLPM-2*phiLPM;
427  }
428  else {
429  // using alternative parametrisiation
430  G4double pre = -0.16072300849123999 + s0*3.7550300067531581 + s2*-1.7981383069010097
431  + s3*0.67282686077812381 + s4*-0.1207722909879257;
432  gLPM = tanh(pre);
433  }
434  }
435  else {
436  // low suppression limit valid s>2.
437  phiLPM = 1. - 0.0119048/s4;
438  gLPM = 1. - 0.0230655/s4;
439  }
440 
441  // *** make sure suppression is smaller than 1 ***
442  // *** caused by Migdal approximation in xi ***
443  if (xiLPM*phiLPM>1. || s0>0.57) { xiLPM=1./phiLPM; }
444 }
445 
446 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
447 
448 
450 // Ultra relativistic model
451 // only valid for very high energies, but includes LPM suppression
452 // * complete screening
453 {
454  if(gammaEnergy < 0.0) { return 0.0; }
455 
456  G4double y = gammaEnergy/totalEnergy;
457  G4double y2 = y*y*.25;
458  G4double yone2 = (1.-y+2.*y2);
459 
460  // form factors complete screening case
461  // calc LPM functions -- include ter-mikaelian merging with density effect
462  // G4double xiLPM, gLPM, phiLPM; // to be made member variables !!!
463  CalcLPMFunctions(gammaEnergy);
464 
465  G4double xz = 1.0/(G4double)currentZ;
466  G4double mainLPM = xiLPM*(y2 * gLPM + yone2*phiLPM) * ( (Fel-fCoulomb) + Finel*xz );
467  G4double secondTerm = (1.-y)/12.*(1. + xz);
468 
469  sumTerm = mainLPM+secondTerm;
470 
471  if(scatOffElectron){
472  nucTerm = xiLPM*(y2 * gLPM + yone2*phiLPM) * (Fel-fCoulomb) + (1.-y)/12.;
473  }
474 
475  return sumTerm;
476 }
477 
478 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
479 
481 // Relativistic model
482 // only valid for high energies (and if LPM suppression does not play a role)
483 // * screening according to thomas-fermi-Model (only valid for Z>5)
484 // * no LPM effect
485 {
486 
487  if(gammaEnergy < 0.0) { return 0.0; }
488 
489  G4double y = gammaEnergy/totalEnergy;
490 
491  G4double main=0.,secondTerm=0.;
492 
493  G4double currZ = (G4double)currentZ;
494  G4double gFact = (0.75*y*y - y + 1.);
495  if (use_completescreening || currentZ<5) {
496  // ** form factors complete screening case **
497  main = gFact * ( (Fel-fCoulomb) + Finel/currZ );
498  secondTerm = (1.-y)/12.*(1.+1./currZ);
499  if(scatOffElectron) {
500  nucTerm = gFact*(Fel-fCoulomb) + (1.-y)/12.;
501  }
502  }
503  else {
504  // ** intermediate screening using Thomas-Fermi FF from Tsai only valid for Z>=5**
505  G4double dd=100.*electron_mass_c2*y/(totalEnergy-gammaEnergy);
506  G4double gg=dd/z13;
507  G4double eps=dd/z23;
508  G4double phi1=Phi1(gg,currZ), phi1m2=Phi1M2(gg,currZ);
509  G4double psi1=Psi1(eps,currZ), psi1m2=Psi1M2(eps,currZ);
510 
511  main = gFact *
512  ( (0.25*phi1-1./3.*lnZ-fCoulomb) + (0.25*psi1-2./3.*lnZ)/currZ );
513  secondTerm = (1.-y)/8.*(phi1m2+psi1m2/currZ);
514  if(scatOffElectron) {
515  nucTerm = gFact*(0.25*phi1-1./3.*lnZ-fCoulomb) + (1.-y)*phi1m2/8.;
516  }
517  }
518  sumTerm = main+secondTerm;
519  return sumTerm;
520 }
521 
522 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
523 
525  std::vector<G4DynamicParticle*>* vdp,
526  const G4MaterialCutsCouple* couple,
527  const G4DynamicParticle* dp,
528  G4double cutEnergy,
529  G4double maxEnergy)
530 {
532  if(kineticEnergy < LowEnergyLimit()) { return; }
533  G4double cut = std::min(cutEnergy, kineticEnergy);
534  G4double emax = std::min(maxEnergy, kineticEnergy);
535  if(cut >= emax) { return; }
536 
538 
539  const G4Element* elm =
540  SelectRandomAtom(couple,particle,kineticEnergy,cut,emax);
541  SetCurrentElement(elm->GetZasInt());
542 
544  totalEnergy = kineticEnergy + particleMass;
546 
547  //G4double fmax= fMax;
548  G4bool highe = true;
549  if(totalEnergy < energyThresholdLPM) { highe = false; }
550 
551  G4double xmin = G4Log(cut*cut + densityCorr);
552  G4double xmax = G4Log(emax*emax + densityCorr);
553  G4double gammaEnergy, f, x;
554 
555  CLHEP::HepRandomEngine* rndmEngine = G4Random::getTheEngine();
556 
557  do {
558  x = std::max(G4Exp(xmin + rndmEngine->flat()*(xmax - xmin)) - densityCorr, 0.0);
559  gammaEnergy = sqrt(x);
560  f = (highe) ? ComputeRelDXSectionPerAtom(gammaEnergy)
561  : ComputeDXSectionPerAtom(gammaEnergy);
562 
563  if ( f > fMax ) {
564  G4cout << "### G4eBremsstrahlungRelModel Warning: Majoranta exceeded! "
565  << f << " > " << fMax
566  << " Egamma(MeV)= " << gammaEnergy
567  << " Ee(MeV)= " << kineticEnergy
568  << " " << GetName()
569  << G4endl;
570  }
571 
572  // Loop checking, 03-Aug-2015, Vladimir Ivanchenko
573  } while (f < fMax*rndmEngine->flat());
574 
575  // scattering off nucleus or off e- by triplet model
577  GetTripletModel()->SampleSecondaries(vdp, couple, dp,
578  cutEnergy, maxEnergy);
579  return;
580  }
581 
582  //
583  // angles of the emitted gamma. ( Z - axis along the parent particle)
584  // use general interface
585  //
586 
587  G4ThreeVector gammaDirection =
588  GetAngularDistribution()->SampleDirection(dp, totalEnergy-gammaEnergy,
589  currentZ,
590  couple->GetMaterial());
591 
592  // create G4DynamicParticle object for the Gamma
593  G4DynamicParticle* gamma = new G4DynamicParticle(theGamma,gammaDirection,
594  gammaEnergy);
595  vdp->push_back(gamma);
596 
597  G4double totMomentum = sqrt(kineticEnergy*(totalEnergy + electron_mass_c2));
598  G4ThreeVector direction = (totMomentum*dp->GetMomentumDirection()
599  - gammaEnergy*gammaDirection).unit();
600 
601  // energy of primary
602  G4double finalE = kineticEnergy - gammaEnergy;
603 
604  // stop tracking and create new secondary instead of primary
605  if(gammaEnergy > SecondaryThreshold()) {
608  G4DynamicParticle* el =
609  new G4DynamicParticle(const_cast<G4ParticleDefinition*>(particle),
610  direction, finalE);
611  vdp->push_back(el);
612 
613  // continue tracking
614  } else {
617  }
618 }
619 
620 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
621 
622 
Float_t x
Definition: compare.C:6
void SetElementSelectors(std::vector< G4EmElementSelector * > *)
Definition: G4VEmModel.hh:792
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition: G4Exp.hh:183
T max(const T t1, const T t2)
brief Return the largest of the two arguments
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
G4eBremsstrahlungRelModel(const G4ParticleDefinition *p=0, const G4String &nam="eBremLPM")
const G4ParticleDefinition * particle
static constexpr double MeV
Definition: G4SIunits.hh:214
G4double ComputeXSectionPerAtom(G4double cutEnergy)
virtual G4double ComputeDXSectionPerAtom(G4double gammaEnergy)
#define G4endl
Definition: G4ios.hh:61
const G4ThreeVector & GetMomentumDirection() const
Float_t y
Definition: compare.C:6
G4double Psi1(G4double, G4double)
G4double GetRadlen() const
Definition: G4Material.hh:221
const char * p
Definition: xmltok.h:285
static constexpr double hbarc
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:191
G4double Phi1(G4double, G4double)
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.hh:552
static const G4double emax
static const G4double Finel_light[5]
G4double GetLOGZ(G4int Z) const
void SetProposedMomentumDirection(const G4ThreeVector &dir)
std::vector< G4EmElementSelector * > * GetElementSelectors()
Definition: G4VEmModel.hh:784
G4double ComputeBremLoss(G4double cutEnergy)
G4double GetPDGMass() const
static constexpr double classic_electr_radius
void SetCurrentElement(const G4Element *)
Definition: G4VEmModel.hh:469
G4double G4Log(G4double x)
Definition: G4Log.hh:230
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:616
Float_t y2[n_points_geant4]
Definition: compare.C:26
static constexpr double electron_Compton_length
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
Float_t Z
G4double Psi1M2(G4double, G4double)
void SetLPMFlag(G4bool val)
Definition: G4VEmModel.hh:756
G4ParticleChangeForLoss * GetParticleChangeForLoss()
Definition: G4VEmModel.cc:116
double G4double
Definition: G4Types.hh:76
bool G4bool
Definition: G4Types.hh:79
virtual double flat()=0
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
Definition: G4VEmModel.cc:146
G4VEmModel * GetTripletModel()
Definition: G4VEmModel.hh:592
static constexpr double electron_mass_c2
#define G4UniformRand()
Definition: Randomize.hh:53
void SetAngularDistribution(G4VEmAngularDistribution *)
Definition: G4VEmModel.hh:582
Float_t mat
static G4Electron * Electron()
Definition: G4Electron.cc:94
int main(int argc, char **argv)
Definition: genwindef.cc:359
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)=0
void CalcLPMFunctions(G4double gammaEnergy)
int G4lrint(double ad)
Definition: templates.hh:151
std::vector< G4Element * > G4ElementVector
int G4int
Definition: G4Types.hh:78
G4bool LPMFlag() const
Definition: G4VEmModel.hh:651
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin=0.0, G4double tmax=DBL_MAX)=0
const G4String & GetName() const
Definition: G4VEmModel.hh:777
void SetLowEnergyLimit(G4double)
Definition: G4VEmModel.hh:714
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetParticle(const G4ParticleDefinition *p)
G4double SecondaryThreshold() const
Definition: G4VEmModel.hh:644
virtual void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *masterModel) override
static const G4double Fel_light[5]
G4double GetKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double cutEnergy, G4double maxEnergy) override
G4bool IsMaster() const
Definition: G4VEmModel.hh:700
G4double GetZ13(G4double Z) const
G4VEmAngularDistribution * GetAngularDistribution()
Definition: G4VEmModel.hh:575
Char_t n[5]
const G4Element * GetCurrentElement() const
Definition: G4VEmModel.hh:477
const G4Material * GetMaterial() const
T sqr(const T &x)
Definition: templates.hh:145
G4ParticleChangeForLoss * fParticleChange
static constexpr double pi
Definition: G4SIunits.hh:75
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:217
G4double Phi1M2(G4double, G4double)
static const G4double eps
virtual G4double MinPrimaryEnergy(const G4Material *, const G4ParticleDefinition *, G4double cut) override
G4bool isElectron(G4int ityp)
G4double GetfCoulomb() const
Definition: G4Element.hh:191
static constexpr double fine_structure_const
G4double HighEnergyLimit() const
Definition: G4VEmModel.hh:609
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
void ProposeTrackStatus(G4TrackStatus status)
double flat()
Definition: G4AblaRandom.cc:48
G4double GetElectronDensity() const
Definition: G4Material.hh:218
G4double ComputeRelDXSectionPerAtom(G4double gammaEnergy)
size_t GetNumberOfElements() const
Definition: G4Material.hh:187
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double tkin, G4double Z, G4double, G4double cutEnergy, G4double maxEnergy=DBL_MAX) override
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static G4NistManager * Instance()