Geant4  10.03.p02
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4EmCalculator Class Reference

#include <G4EmCalculator.hh>

Inheritance diagram for G4EmCalculator:

Public Member Functions

 G4EmCalculator ()
 
 ~G4EmCalculator ()
 
G4double GetDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
 
G4double GetDEDX (G4double kinEnergy, const G4String &part, const G4String &mat, const G4String &s="world")
 
G4double GetRangeFromRestricteDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
 
G4double GetRangeFromRestricteDEDX (G4double kinEnergy, const G4String &part, const G4String &mat, const G4String &s="world")
 
G4double GetCSDARange (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
 
G4double GetCSDARange (G4double kinEnergy, const G4String &part, const G4String &mat, const G4String &s="world")
 
G4double GetRange (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
 
G4double GetRange (G4double kinEnergy, const G4String &part, const G4String &mat, const G4String &s="world")
 
G4double GetKinEnergy (G4double range, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
 
G4double GetKinEnergy (G4double range, const G4String &part, const G4String &mat, const G4String &s="world")
 
G4double GetCrossSectionPerVolume (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
 
G4double GetCrossSectionPerVolume (G4double kinEnergy, const G4String &part, const G4String &proc, const G4String &mat, const G4String &s="world")
 
G4double GetShellIonisationCrossSectionPerAtom (const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy)
 
G4double GetMeanFreePath (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
 
G4double GetMeanFreePath (G4double kinEnergy, const G4String &part, const G4String &proc, const G4String &mat, const G4String &s="world")
 
void PrintDEDXTable (const G4ParticleDefinition *)
 
void PrintRangeTable (const G4ParticleDefinition *)
 
void PrintInverseRangeTable (const G4ParticleDefinition *)
 
G4double ComputeDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
 
G4double ComputeDEDX (G4double kinEnergy, const G4String &part, const G4String &proc, const G4String &mat, G4double cut=DBL_MAX)
 
G4double ComputeElectronicDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
 
G4double ComputeElectronicDEDX (G4double kinEnergy, const G4String &part, const G4String &mat, G4double cut=DBL_MAX)
 
G4double ComputeDEDXForCutInRange (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double rangecut=DBL_MAX)
 
G4double ComputeDEDXForCutInRange (G4double kinEnergy, const G4String &part, const G4String &mat, G4double rangecut=DBL_MAX)
 
G4double ComputeNuclearDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
 
G4double ComputeNuclearDEDX (G4double kinEnergy, const G4String &part, const G4String &mat)
 
G4double ComputeTotalDEDX (G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, G4double cut=DBL_MAX)
 
G4double ComputeTotalDEDX (G4double kinEnergy, const G4String &part, const G4String &mat, G4double cut=DBL_MAX)
 
G4double ComputeCrossSectionPerVolume (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
 
G4double ComputeCrossSectionPerVolume (G4double kinEnergy, const G4String &part, const G4String &proc, const G4String &mat, G4double cut=0.0)
 
G4double ComputeCrossSectionPerAtom (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4double Z, G4double A, G4double cut=0.0)
 
G4double ComputeCrossSectionPerAtom (G4double kinEnergy, const G4String &part, const G4String &processName, const G4Element *, G4double cut=0.0)
 
G4double ComputeCrossSectionPerShell (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4int Z, G4int shellIdx, G4double cut=0.0)
 
G4double ComputeCrossSectionPerShell (G4double kinEnergy, const G4String &part, const G4String &processName, const G4Element *, G4int shellIdx, G4double cut=0.0)
 
G4double ComputeGammaAttenuationLength (G4double kinEnergy, const G4Material *)
 
G4double ComputeShellIonisationCrossSectionPerAtom (const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy, const G4Material *mat=nullptr)
 
G4double ComputeMeanFreePath (G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
 
G4double ComputeMeanFreePath (G4double kinEnergy, const G4String &, const G4String &, const G4String &processName, G4double cut=0.0)
 
G4double ComputeEnergyCutFromRangeCut (G4double range, const G4ParticleDefinition *, const G4Material *)
 
G4double ComputeEnergyCutFromRangeCut (G4double range, const G4String &, const G4String &)
 
const G4ParticleDefinitionFindParticle (const G4String &)
 
const G4ParticleDefinitionFindIon (G4int Z, G4int A)
 
const G4MaterialFindMaterial (const G4String &)
 
const G4RegionFindRegion (const G4String &)
 
const G4MaterialCutsCoupleFindCouple (const G4Material *, const G4Region *r=nullptr)
 
G4VProcessFindProcess (const G4ParticleDefinition *part, const G4String &processName)
 
void SetupMaterial (const G4Material *)
 
void SetupMaterial (const G4String &)
 
void SetVerbose (G4int val)
 

Detailed Description

Definition at line 82 of file G4EmCalculator.hh.

Constructor & Destructor Documentation

G4EmCalculator::G4EmCalculator ( )

Definition at line 93 of file G4EmCalculator.cc.

94 {
95  manager = G4LossTableManager::Instance();
96  nist = G4NistManager::Instance();
97  theParameters = G4EmParameters::Instance();
98  corr = manager->EmCorrections();
99  nLocalMaterials = 0;
100  verbose = 0;
101  currentCoupleIndex = 0;
102  currentCouple = nullptr;
103  currentMaterial = cutMaterial = nullptr;
104  currentParticle = nullptr;
105  lambdaParticle = nullptr;
106  baseParticle = nullptr;
107  currentLambda = nullptr;
108  currentModel = nullptr;
109  currentProcess = nullptr;
110  curProcess = nullptr;
111  loweModel = nullptr;
112  chargeSquare = 1.0;
113  massRatio = 1.0;
114  mass = 0.0;
115  currentCut = 0.0;
116  cutenergy[0] = cutenergy[1] = cutenergy[2] = DBL_MAX;
117  currentParticleName= "";
118  currentMaterialName= "";
119  currentName = "";
120  lambdaName = "";
121  theGenericIon = G4GenericIon::GenericIon();
122  ionEffCharge = new G4ionEffectiveCharge();
124  isIon = false;
125  isApplicable = false;
126 }
static G4LossTableManager * Instance()
static G4NistManager * Instance()
G4IonTable * GetIonTable() const
G4EmCorrections * EmCorrections()
static G4GenericIon * GenericIon()
Definition: G4GenericIon.cc:93
static G4ParticleTable * GetParticleTable()
static G4EmParameters * Instance()
#define DBL_MAX
Definition: templates.hh:83

Here is the call graph for this function:

G4EmCalculator::~G4EmCalculator ( )

Definition at line 130 of file G4EmCalculator.cc.

131 {
132  delete ionEffCharge;
133  for (G4int i=0; i<nLocalMaterials; ++i) {
134  delete localCouples[i];
135  }
136 }
int G4int
Definition: G4Types.hh:78

Member Function Documentation

G4double G4EmCalculator::ComputeCrossSectionPerAtom ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
G4double  Z,
G4double  A,
G4double  cut = 0.0 
)

Definition at line 648 of file G4EmCalculator.cc.

654 {
655  G4double res = 0.0;
656  if(UpdateParticle(p, kinEnergy)) {
657  G4int iz = G4lrint(Z);
658  CheckMaterial(iz);
659  if(FindEmModel(p, processName, kinEnergy)) {
660  G4double e = kinEnergy;
661  G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
662  if(baseParticle) {
663  e *= kinEnergy*massRatio;
664  currentModel->InitialiseForElement(baseParticle, iz);
665  res = currentModel->ComputeCrossSectionPerAtom(
666  baseParticle, e, Z, A, aCut) * chargeSquare;
667  } else {
668  currentModel->InitialiseForElement(p, iz);
669  res = currentModel->ComputeCrossSectionPerAtom(p, e, Z, A, aCut);
670  }
671  if(verbose>0) {
672  G4cout << "E(MeV)= " << kinEnergy/MeV
673  << " cross(barn)= " << res/barn
674  << " " << p->GetParticleName()
675  << " Z= " << Z << " A= " << A/(g/mole) << " g/mole"
676  << " cut(keV)= " << aCut/keV
677  << G4endl;
678  }
679  }
680  }
681  return res;
682 }
virtual void InitialiseForElement(const G4ParticleDefinition *, G4int Z)
Definition: G4VEmModel.cc:243
G4double LowestElectronEnergy() const
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
function g(Y1, Y2, PT2)
Definition: hijing1.383.f:5205
G4GLOB_DLL std::ostream G4cout
double A(double temperature)
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:321
int G4lrint(double ad)
Definition: templates.hh:163
T max(const T t1, const T t2)
brief Return the largest of the two arguments
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
static constexpr double barn
Definition: G4SIunits.hh:105
static constexpr double keV
Definition: G4SIunits.hh:216
static constexpr double mole
Definition: G4SIunits.hh:286

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeCrossSectionPerAtom ( G4double  kinEnergy,
const G4String part,
const G4String processName,
const G4Element elm,
G4double  cut = 0.0 
)
inline

Definition at line 513 of file G4EmCalculator.hh.

518 {
519  return ComputeCrossSectionPerAtom(kinEnergy,FindParticle(particle),
520  processName,
521  elm->GetZ(),elm->GetN(),cut);
522 }
G4double GetN() const
Definition: G4Element.hh:135
G4double GetZ() const
Definition: G4Element.hh:131
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeCrossSectionPerAtom(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4double Z, G4double A, G4double cut=0.0)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeCrossSectionPerShell ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
G4int  Z,
G4int  shellIdx,
G4double  cut = 0.0 
)

Definition at line 686 of file G4EmCalculator.cc.

691 {
692  G4double res = 0.0;
693  if(UpdateParticle(p, kinEnergy)) {
694  CheckMaterial(Z);
695  if(FindEmModel(p, processName, kinEnergy)) {
696  G4double e = kinEnergy;
697  G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
698  if(baseParticle) {
699  e *= kinEnergy*massRatio;
700  currentModel->InitialiseForElement(baseParticle, Z);
701  res = currentModel->ComputeCrossSectionPerShell(baseParticle, Z, shellIdx,
702  e, aCut) * chargeSquare;
703  } else {
704  currentModel->InitialiseForElement(p, Z);
705  res = currentModel->ComputeCrossSectionPerAtom(p, Z, shellIdx, e, aCut);
706  }
707  if(verbose>0) {
708  G4cout << "E(MeV)= " << kinEnergy/MeV
709  << " cross(barn)= " << res/barn
710  << " " << p->GetParticleName()
711  << " Z= " << Z << " shellIdx= " << shellIdx
712  << " cut(keV)= " << aCut/keV
713  << G4endl;
714  }
715  }
716  }
717  return res;
718 }
virtual void InitialiseForElement(const G4ParticleDefinition *, G4int Z)
Definition: G4VEmModel.cc:243
G4double LowestElectronEnergy() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0., G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:321
T max(const T t1, const T t2)
brief Return the largest of the two arguments
virtual G4double ComputeCrossSectionPerShell(const G4ParticleDefinition *, G4int Z, G4int shellIdx, G4double kinEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:331
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
static constexpr double barn
Definition: G4SIunits.hh:105
static constexpr double keV
Definition: G4SIunits.hh:216

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeCrossSectionPerShell ( G4double  kinEnergy,
const G4String part,
const G4String processName,
const G4Element elm,
G4int  shellIdx,
G4double  cut = 0.0 
)
inline

Definition at line 526 of file G4EmCalculator.hh.

530 {
531  return ComputeCrossSectionPerShell(kinEnergy, FindParticle(part),
532  processName, elm->GetZasInt(),
533  shellIdx, cut);
534 }
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeCrossSectionPerShell(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4int Z, G4int shellIdx, G4double cut=0.0)
G4int GetZasInt() const
Definition: G4Element.hh:132

Here is the call graph for this function:

G4double G4EmCalculator::ComputeCrossSectionPerVolume ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
const G4Material mat,
G4double  cut = 0.0 
)

Definition at line 613 of file G4EmCalculator.cc.

619 {
620  SetupMaterial(mat);
621  G4double res = 0.0;
622  if(UpdateParticle(p, kinEnergy)) {
623  if(FindEmModel(p, processName, kinEnergy)) {
624  G4double e = kinEnergy;
625  G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
626  if(baseParticle) {
627  e *= kinEnergy*massRatio;
628  res = currentModel->CrossSectionPerVolume(
629  mat, baseParticle, e, aCut, e) * chargeSquare;
630  } else {
631  res = currentModel->CrossSectionPerVolume(mat, p, e, aCut, e);
632  }
633  if(verbose>0) {
634  G4cout << "G4EmCalculator::ComputeXSPerVolume: E(MeV)= " << kinEnergy/MeV
635  << " cross(cm-1)= " << res*cm
636  << " cut(keV)= " << aCut/keV
637  << " " << p->GetParticleName()
638  << " in " << mat->GetName()
639  << G4endl;
640  }
641  }
642  }
643  return res;
644 }
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:257
G4double LowestElectronEnergy() const
const G4String & GetName() const
Definition: G4Material.hh:178
void SetupMaterial(const G4Material *)
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
static constexpr double cm
Definition: G4SIunits.hh:119
T max(const T t1, const T t2)
brief Return the largest of the two arguments
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
static constexpr double keV
Definition: G4SIunits.hh:216

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeCrossSectionPerVolume ( G4double  kinEnergy,
const G4String part,
const G4String proc,
const G4String mat,
G4double  cut = 0.0 
)
inline

Definition at line 498 of file G4EmCalculator.hh.

504 {
505  return ComputeCrossSectionPerVolume(kinEnergy,FindParticle(particle),
506  processName,
507  FindMaterial(material),cut);
508 }
const G4Material * FindMaterial(const G4String &)
string material
Definition: eplot.py:19
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeDEDX ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
const G4Material mat,
G4double  cut = DBL_MAX 
)

Definition at line 381 of file G4EmCalculator.cc.

386 {
387  SetupMaterial(mat);
388  G4double res = 0.0;
389  if(verbose > 1) {
390  G4cout << "### G4EmCalculator::ComputeDEDX: " << p->GetParticleName()
391  << " in " << currentMaterialName
392  << " e(MeV)= " << kinEnergy/MeV << " cut(MeV)= " << cut/MeV
393  << G4endl;
394  }
395  if(UpdateParticle(p, kinEnergy)) {
396  if(FindEmModel(p, processName, kinEnergy)) {
397 
398  // Special case of ICRU'73 model
399  if(currentModel->GetName() == "ParamICRU73") {
400  res = currentModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cut);
401  if(verbose > 1) {
402  G4cout << " ICRU73 ion E(MeV)= " << kinEnergy << " ";
403  G4cout << currentModel->GetName() << ": DEDX(MeV/mm)= " << res*mm/MeV
404  << " DEDX(MeV*cm^2/g)= "
405  << res*gram/(MeV*cm2*mat->GetDensity())
406  << G4endl;
407  }
408  } else {
409 
410  G4double escaled = kinEnergy*massRatio;
411  if(baseParticle) {
412  res = currentModel->ComputeDEDXPerVolume(
413  mat, baseParticle, escaled, cut) * chargeSquare;
414  if(verbose > 1) {
415  G4cout << baseParticle->GetParticleName()
416  << " Escaled(MeV)= " << escaled;
417  }
418  } else {
419  res = currentModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cut);
420  if(verbose > 1) { G4cout << " no basePart E(MeV)= " << kinEnergy << " "; }
421  }
422  if(verbose > 1) {
423  G4cout << currentModel->GetName() << ": DEDX(MeV/mm)= " << res*mm/MeV
424  << " DEDX(MeV*cm^2/g)= "
425  << res*gram/(MeV*cm2*mat->GetDensity())
426  << G4endl;
427  }
428 
429  // emulate smoothing procedure
430  G4double eth = currentModel->LowEnergyLimit();
431  // G4cout << "massRatio= " << massRatio << " eth= " << eth << G4endl;
432  if(loweModel) {
433  G4double res0 = 0.0;
434  G4double res1 = 0.0;
435  if(baseParticle) {
436  res1 = currentModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut)
437  * chargeSquare;
438  res0 = loweModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut)
439  * chargeSquare;
440  } else {
441  res1 = currentModel->ComputeDEDXPerVolume(mat, p, eth, cut);
442  res0 = loweModel->ComputeDEDXPerVolume(mat, p, eth, cut);
443  }
444  if(verbose > 1) {
445  G4cout << "At boundary energy(MeV)= " << eth/MeV
446  << " DEDX(MeV/mm)= " << res1*mm/MeV
447  << G4endl;
448  }
449 
450  //G4cout << "eth= " << eth << " escaled= " << escaled
451  // << " res0= " << res0 << " res1= "
452  // << res1 << " q2= " << chargeSquare << G4endl;
453 
454  if(res1 > 0.0 && escaled > 0.0) {
455  res *= (1.0 + (res0/res1 - 1.0)*eth/escaled);
456  }
457  }
458 
459  // low energy correction for ions
460  if(isIon) {
461  G4double length = CLHEP::nm;
462  const G4Region* r = 0;
463  const G4MaterialCutsCouple* couple = FindCouple(mat, r);
464  G4double eloss = res*length;
465  G4double niel = 0.0;
466  dynParticle.SetKineticEnergy(kinEnergy);
467  currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
468  currentModel->CorrectionsAlongStep(couple,&dynParticle,eloss,niel,length);
469  res = eloss/length;
470 
471  if(verbose > 1) {
472  G4cout << "After Corrections: DEDX(MeV/mm)= " << res*mm/MeV
473  << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
474  << G4endl;
475  }
476  }
477  }
478  }
479  if(verbose > 0) {
480  G4cout << "Sum: E(MeV)= " << kinEnergy/MeV
481  << " DEDX(MeV/mm)= " << res*mm/MeV
482  << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
483  << " cut(MeV)= " << cut/MeV
484  << " " << p->GetParticleName()
485  << " in " << currentMaterialName
486  << " Zi^2= " << chargeSquare
487  << " isIon=" << isIon
488  << G4endl;
489  }
490  }
491  return res;
492 }
G4double LowEnergyLimit() const
Definition: G4VEmModel.hh:643
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
static constexpr double mm
Definition: G4SIunits.hh:115
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
Definition: G4VEmModel.cc:370
static constexpr double cm2
Definition: G4SIunits.hh:120
G4double GetDensity() const
Definition: G4Material.hh:180
void SetupMaterial(const G4Material *)
const G4String & GetParticleName() const
static constexpr double gram
Definition: G4SIunits.hh:178
G4GLOB_DLL std::ostream G4cout
void SetKineticEnergy(G4double aEnergy)
virtual G4double GetChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:353
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
Definition: G4VEmModel.cc:248
static constexpr double nm
Definition: SystemOfUnits.h:92
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
const G4String & GetName() const
Definition: G4VEmModel.hh:802
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeDEDX ( G4double  kinEnergy,
const G4String part,
const G4String proc,
const G4String mat,
G4double  cut = DBL_MAX 
)
inline

Definition at line 474 of file G4EmCalculator.hh.

479 {
480  return ComputeDEDX(kinEnergy,FindParticle(particle),processName,
481  FindMaterial(material),cut);
482 }
const G4Material * FindMaterial(const G4String &)
string material
Definition: eplot.py:19
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
const G4ParticleDefinition * FindParticle(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeDEDXForCutInRange ( G4double  kinEnergy,
const G4ParticleDefinition part,
const G4Material mat,
G4double  rangecut = DBL_MAX 
)

Definition at line 529 of file G4EmCalculator.cc.

533 {
534  SetupMaterial(mat);
535  G4double dedx = 0.0;
536  if(UpdateParticle(part, kinEnergy)) {
537 
539  const std::vector<G4VEnergyLossProcess*> vel =
540  lManager->GetEnergyLossProcessVector();
541  G4int n = vel.size();
542 
543  if(mat != cutMaterial) {
544  cutMaterial = mat;
545  cutenergy[0] = ComputeEnergyCutFromRangeCut(rangecut, G4Gamma::Gamma(), mat);
546  cutenergy[1] = ComputeEnergyCutFromRangeCut(rangecut, G4Electron::Electron(), mat);
547  cutenergy[2] = ComputeEnergyCutFromRangeCut(rangecut, G4Positron::Positron(), mat);
548  }
549 
550  //G4cout << "ComputeElectronicDEDX for " << part->GetParticleName()
551  // << " n= " << n << G4endl;
552 
553  for(G4int i=0; i<n; ++i) {
554  if(vel[i]) {
555  G4VProcess* p = reinterpret_cast<G4VProcess*>(vel[i]);
556  if(ActiveForParticle(part, p)) {
557  //G4cout << "idx= " << i << " " << (vel[i])->GetProcessName()
558  // << " " << (vel[i])->Particle()->GetParticleName() << G4endl;
559  const G4ParticleDefinition* sec = (vel[i])->SecondaryParticle();
560  G4int idx = 0;
561  if(sec == G4Electron::Electron()) { idx = 1; }
562  else if(sec == G4Positron::Positron()) { idx = 2; }
563 
564  dedx += ComputeDEDX(kinEnergy,part,(vel[i])->GetProcessName(),
565  mat,cutenergy[idx]);
566  }
567  }
568  }
569  }
570  return dedx;
571 }
static G4LossTableManager * Instance()
const char * p
Definition: xmltok.h:285
void SetupMaterial(const G4Material *)
int G4int
Definition: G4Types.hh:78
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
const G4int n
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
const std::vector< G4VEnergyLossProcess * > & GetEnergyLossProcessVector()
static G4Positron * Positron()
Definition: G4Positron.cc:94
static G4Electron * Electron()
Definition: G4Electron.cc:94
double G4double
Definition: G4Types.hh:76
G4double ComputeEnergyCutFromRangeCut(G4double range, const G4ParticleDefinition *, const G4Material *)

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeDEDXForCutInRange ( G4double  kinEnergy,
const G4String part,
const G4String mat,
G4double  rangecut = DBL_MAX 
)
inline

Definition at line 451 of file G4EmCalculator.hh.

455 {
456  return ComputeDEDXForCutInRange(kinEnergy,FindParticle(part),
457  FindMaterial(mat), rangecut);
458 }
const G4Material * FindMaterial(const G4String &)
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeDEDXForCutInRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double rangecut=DBL_MAX)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeElectronicDEDX ( G4double  kinEnergy,
const G4ParticleDefinition part,
const G4Material mat,
G4double  cut = DBL_MAX 
)

Definition at line 496 of file G4EmCalculator.cc.

500 {
501  SetupMaterial(mat);
502  G4double dedx = 0.0;
503  if(UpdateParticle(part, kinEnergy)) {
504 
506  const std::vector<G4VEnergyLossProcess*> vel =
507  lManager->GetEnergyLossProcessVector();
508  G4int n = vel.size();
509 
510  //G4cout << "ComputeElectronicDEDX for " << part->GetParticleName()
511  // << " n= " << n << G4endl;
512 
513  for(G4int i=0; i<n; ++i) {
514  if(vel[i]) {
515  G4VProcess* p = reinterpret_cast<G4VProcess*>(vel[i]);
516  if(ActiveForParticle(part, p)) {
517  //G4cout << "idx= " << i << " " << (vel[i])->GetProcessName()
518  // << " " << (vel[i])->Particle()->GetParticleName() << G4endl;
519  dedx += ComputeDEDX(kinEnergy,part,(vel[i])->GetProcessName(),mat,cut);
520  }
521  }
522  }
523  }
524  return dedx;
525 }
static G4LossTableManager * Instance()
const char * p
Definition: xmltok.h:285
void SetupMaterial(const G4Material *)
int G4int
Definition: G4Types.hh:78
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
const G4int n
const std::vector< G4VEnergyLossProcess * > & GetEnergyLossProcessVector()
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeElectronicDEDX ( G4double  kinEnergy,
const G4String part,
const G4String mat,
G4double  cut = DBL_MAX 
)
inline

Definition at line 441 of file G4EmCalculator.hh.

443 {
444  return
445  ComputeElectronicDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
446 }
const G4Material * FindMaterial(const G4String &)
G4double ComputeElectronicDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
const G4ParticleDefinition * FindParticle(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeEnergyCutFromRangeCut ( G4double  range,
const G4ParticleDefinition part,
const G4Material mat 
)

Definition at line 778 of file G4EmCalculator.cc.

782 {
784  ConvertRangeToEnergy(part, mat, range);
785 }
const G4ParticleDefinition const G4Material *G4double range
static G4ProductionCutsTable * GetProductionCutsTable()

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeEnergyCutFromRangeCut ( G4double  range,
const G4String particle,
const G4String material 
)
inline

Definition at line 539 of file G4EmCalculator.hh.

543 {
545  FindMaterial(material));
546 }
const G4Material * FindMaterial(const G4String &)
const G4ParticleDefinition const G4Material *G4double range
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeEnergyCutFromRangeCut(G4double range, const G4ParticleDefinition *, const G4Material *)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeGammaAttenuationLength ( G4double  kinEnergy,
const G4Material mat 
)

Definition at line 723 of file G4EmCalculator.cc.

725 {
726  G4double res = 0.0;
727  const G4ParticleDefinition* gamma = G4Gamma::Gamma();
728  res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "conv", mat, 0.0);
729  res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "compt", mat, 0.0);
730  res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "phot", mat, 0.0);
731  res += ComputeCrossSectionPerVolume(kinEnergy, gamma, "Rayl", mat, 0.0);
732  if(res > 0.0) { res = 1.0/res; }
733  return res;
734 }
static G4Gamma * Gamma()
Definition: G4Gamma.cc:86
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

G4double G4EmCalculator::ComputeMeanFreePath ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
const G4Material mat,
G4double  cut = 0.0 
)

Definition at line 757 of file G4EmCalculator.cc.

762 {
763  G4double mfp = DBL_MAX;
764  G4double x = ComputeCrossSectionPerVolume(kinEnergy, p, processName, mat, cut);
765  if(x > 0.0) { mfp = 1.0/x; }
766  if(verbose>1) {
767  G4cout << "E(MeV)= " << kinEnergy/MeV
768  << " MFP(mm)= " << mfp/mm
769  << " " << p->GetParticleName()
770  << " in " << mat->GetName()
771  << G4endl;
772  }
773  return mfp;
774 }
static constexpr double mm
Definition: G4SIunits.hh:115
const G4String & GetName() const
Definition: G4Material.hh:178
tuple x
Definition: test.py:50
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
#define DBL_MAX
Definition: templates.hh:83

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeMeanFreePath ( G4double  kinEnergy,
const G4String particle,
const G4String processName,
const G4String processName,
G4double  cut = 0.0 
)
inline

Definition at line 551 of file G4EmCalculator.hh.

556 {
557  return ComputeMeanFreePath(kinEnergy,FindParticle(particle),processName,
558  FindMaterial(material),cut);
559 }
const G4Material * FindMaterial(const G4String &)
string material
Definition: eplot.py:19
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeNuclearDEDX ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4Material mat 
)

Definition at line 587 of file G4EmCalculator.cc.

590 {
591  G4double res = 0.0;
592  G4VEmProcess* nucst = FindDiscreteProcess(p, "nuclearStopping");
593  if(nucst) {
594  G4VEmModel* mod = nucst->GetModelByIndex();
595  if(mod) {
596  mod->SetFluctuationFlag(false);
597  res = mod->ComputeDEDXPerVolume(mat, p, kinEnergy);
598  }
599  }
600 
601  if(verbose > 1) {
602  G4cout << p->GetParticleName() << " E(MeV)= " << kinEnergy/MeV
603  << " NuclearDEDX(MeV/mm)= " << res*mm/MeV
604  << " NuclearDEDX(MeV*cm^2/g)= "
605  << res*gram/(MeV*cm2*mat->GetDensity())
606  << G4endl;
607  }
608  return res;
609 }
static constexpr double mm
Definition: G4SIunits.hh:115
static constexpr double cm2
Definition: G4SIunits.hh:120
G4double GetDensity() const
Definition: G4Material.hh:180
const G4String & GetParticleName() const
static constexpr double gram
Definition: G4SIunits.hh:178
G4GLOB_DLL std::ostream G4cout
void SetFluctuationFlag(G4bool val)
Definition: G4VEmModel.hh:711
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
Definition: G4VEmModel.cc:248
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
G4VEmModel * GetModelByIndex(G4int idx=0, G4bool ver=false) const
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeNuclearDEDX ( G4double  kinEnergy,
const G4String part,
const G4String mat 
)
inline

Definition at line 487 of file G4EmCalculator.hh.

490 {
491  return ComputeNuclearDEDX(kinEnergy,FindParticle(particle),
493 }
const G4Material * FindMaterial(const G4String &)
string material
Definition: eplot.py:19
G4double ComputeNuclearDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
const G4ParticleDefinition * FindParticle(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::ComputeShellIonisationCrossSectionPerAtom ( const G4String part,
G4int  Z,
G4AtomicShellEnumerator  shell,
G4double  kinEnergy,
const G4Material mat = nullptr 
)

Definition at line 738 of file G4EmCalculator.cc.

744 {
745  G4double res = 0.0;
746  const G4ParticleDefinition* p = FindParticle(particle);
747  G4VAtomDeexcitation* ad = manager->AtomDeexcitation();
748  if(p && ad) {
749  res = ad->ComputeShellIonisationCrossSectionPerAtom(p, Z, shell,
750  kinEnergy, mat);
751  }
752  return res;
753 }
const char * p
Definition: xmltok.h:285
virtual G4double ComputeShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr)=0
const G4ParticleDefinition * FindParticle(const G4String &)
G4VAtomDeexcitation * AtomDeexcitation()
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

G4double G4EmCalculator::ComputeTotalDEDX ( G4double  kinEnergy,
const G4ParticleDefinition part,
const G4Material mat,
G4double  cut = DBL_MAX 
)

Definition at line 575 of file G4EmCalculator.cc.

579 {
580  G4double dedx = ComputeElectronicDEDX(kinEnergy,part,mat,cut);
581  if(mass > 700.*MeV) { dedx += ComputeNuclearDEDX(kinEnergy,part,mat); }
582  return dedx;
583 }
G4double ComputeElectronicDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
G4double ComputeNuclearDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::ComputeTotalDEDX ( G4double  kinEnergy,
const G4String part,
const G4String mat,
G4double  cut = DBL_MAX 
)
inline

Definition at line 463 of file G4EmCalculator.hh.

467 {
468  return ComputeTotalDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
469 }
const G4Material * FindMaterial(const G4String &)
G4double ComputeTotalDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, G4double cut=DBL_MAX)
const G4ParticleDefinition * FindParticle(const G4String &)

Here is the call graph for this function:

const G4MaterialCutsCouple * G4EmCalculator::FindCouple ( const G4Material material,
const G4Region r = nullptr 
)

Definition at line 909 of file G4EmCalculator.cc.

912 {
913  const G4MaterialCutsCouple* couple = nullptr;
914  SetupMaterial(material);
915  if(currentMaterial) {
916  // Access to materials
917  const G4ProductionCutsTable* theCoupleTable=
919  const G4Region* r = region;
920  if(r) {
921  couple = theCoupleTable->GetMaterialCutsCouple(material,
922  r->GetProductionCuts());
923  } else {
925  size_t nr = store->size();
926  if(0 < nr) {
927  for(size_t i=0; i<nr; ++i) {
928  couple = theCoupleTable->GetMaterialCutsCouple(
929  material, ((*store)[i])->GetProductionCuts());
930  if(couple) { break; }
931  }
932  }
933  }
934  }
935  if(!couple) {
937  ed << "G4EmCalculator::FindCouple: fail for material <"
938  << currentMaterialName << ">";
939  if(region) { ed << " and region " << region->GetName(); }
940  G4Exception("G4EmCalculator::FindCouple", "em0078",
941  FatalException, ed);
942  }
943  return couple;
944 }
G4ProductionCuts * GetProductionCuts() const
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
void SetupMaterial(const G4Material *)
static G4RegionStore * GetInstance()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
static G4ProductionCutsTable * GetProductionCutsTable()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const

Here is the call graph for this function:

Here is the caller graph for this function:

const G4ParticleDefinition * G4EmCalculator::FindIon ( G4int  Z,
G4int  A 
)

Definition at line 874 of file G4EmCalculator.cc.

875 {
876  const G4ParticleDefinition* p = ionTable->GetIon(Z,A,0);
877  return p;
878 }
const char * p
Definition: xmltok.h:285
G4ParticleDefinition * GetIon(G4int Z, G4int A, G4int lvl=0)
Definition: G4IonTable.cc:503
double A(double temperature)

Here is the call graph for this function:

const G4Material * G4EmCalculator::FindMaterial ( const G4String name)

Definition at line 882 of file G4EmCalculator.cc.

883 {
884  if(name != currentMaterialName) {
886  if(!currentMaterial) {
887  G4cout << "### WARNING: G4EmCalculator::FindMaterial fails to find "
888  << name << G4endl;
889  }
890  }
891  return currentMaterial;
892 }
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:602
void SetupMaterial(const G4Material *)
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

const G4ParticleDefinition * G4EmCalculator::FindParticle ( const G4String name)

Definition at line 857 of file G4EmCalculator.cc.

858 {
859  const G4ParticleDefinition* p = 0;
860  if(name != currentParticleName) {
862  if(!p) {
863  G4cout << "### WARNING: G4EmCalculator::FindParticle fails to find "
864  << name << G4endl;
865  }
866  } else {
867  p = currentParticle;
868  }
869  return p;
870 }
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
const char * p
Definition: xmltok.h:285
G4GLOB_DLL std::ostream G4cout
static G4ParticleTable * GetParticleTable()
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

G4VProcess * G4EmCalculator::FindProcess ( const G4ParticleDefinition part,
const G4String processName 
)

Definition at line 1232 of file G4EmCalculator.cc.

1234 {
1235  G4VProcess* proc = 0;
1236  const G4ProcessManager* procman = part->GetProcessManager();
1237  G4ProcessVector* pv = procman->GetProcessList();
1238  G4int nproc = pv->size();
1239  for(G4int i=0; i<nproc; ++i) {
1240  if(processName == (*pv)[i]->GetProcessName()) {
1241  proc = (*pv)[i];
1242  break;
1243  }
1244  }
1245  return proc;
1246 }
int G4int
Definition: G4Types.hh:78
G4int size() const
G4ProcessManager * GetProcessManager() const
G4ProcessVector * GetProcessList() const

Here is the call graph for this function:

const G4Region * G4EmCalculator::FindRegion ( const G4String reg)

Definition at line 896 of file G4EmCalculator.cc.

897 {
898  const G4Region* r = 0;
899  if(reg != "" && reg != "world") {
901  } else {
902  r = G4RegionStore::GetInstance()->GetRegion("DefaultRegionForTheWorld");
903  }
904  return r;
905 }
G4Region * GetRegion(const G4String &name, G4bool verbose=true) const
static G4RegionStore * GetInstance()

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetCrossSectionPerVolume ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 273 of file G4EmCalculator.cc.

278 {
279  G4double res = 0.0;
280  const G4MaterialCutsCouple* couple = FindCouple(mat,region);
281 
282  if(couple && UpdateParticle(p, kinEnergy)) {
283  if(FindEmModel(p, processName, kinEnergy)) {
284  G4int idx = couple->GetIndex();
285  FindLambdaTable(p, processName, kinEnergy);
286 
287  G4VEmProcess* emproc = FindDiscreteProcess(p, processName);
288  if(emproc) {
289  res = emproc->CrossSectionPerVolume(kinEnergy, couple);
290  } else if(currentLambda) {
291  G4double e = kinEnergy*massRatio;
292  res = (((*currentLambda)[idx])->Value(e))*chargeSquare;
293  } else {
294  res = ComputeCrossSectionPerVolume(kinEnergy, p, processName, mat,
295  kinEnergy);
296  }
297  if(verbose>0) {
298  G4cout << "G4EmCalculator::GetXSPerVolume: E(MeV)= " << kinEnergy/MeV
299  << " cross(cm-1)= " << res*cm
300  << " " << p->GetParticleName()
301  << " in " << mat->GetName();
302  if(verbose>1)
303  G4cout << " idx= " << idx << " Escaled((MeV)= "
304  << kinEnergy*massRatio
305  << " q2= " << chargeSquare;
306  G4cout << G4endl;
307  }
308  }
309  }
310  return res;
311 }
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
const G4String & GetName() const
Definition: G4Material.hh:178
int G4int
Definition: G4Types.hh:78
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
static constexpr double cm
Definition: G4SIunits.hh:119
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
G4double CrossSectionPerVolume(G4double kineticEnergy, const G4MaterialCutsCouple *couple)

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetCrossSectionPerVolume ( G4double  kinEnergy,
const G4String part,
const G4String proc,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 415 of file G4EmCalculator.hh.

420 {
421  return GetCrossSectionPerVolume(kinEnergy,FindParticle(particle),processName,
423 }
const G4Material * FindMaterial(const G4String &)
static const G4double reg
string material
Definition: eplot.py:19
G4double GetCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetCSDARange ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 204 of file G4EmCalculator.cc.

208 {
209  G4double res = 0.0;
210  if(!theParameters->BuildCSDARange()) {
212  ed << "G4EmCalculator::GetCSDARange: CSDA table is not built; "
213  << " use UI command: /process/eLoss/CSDARange true";
214  G4Exception("G4EmCalculator::GetCSDARange", "em0077",
215  JustWarning, ed);
216  return res;
217  }
218 
219  const G4MaterialCutsCouple* couple = FindCouple(mat,region);
220  if(couple && UpdateParticle(p, kinEnergy)) {
221  res = manager->GetCSDARange(p, kinEnergy, couple);
222  if(verbose>1) {
223  G4cout << " G4EmCalculator::GetCSDARange: E(MeV)= " << kinEnergy/MeV
224  << " range(mm)= " << res/mm
225  << " " << p->GetParticleName()
226  << " in " << mat->GetName()
227  << G4endl;
228  }
229  }
230  return res;
231 }
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
static constexpr double mm
Definition: G4SIunits.hh:115
std::ostringstream G4ExceptionDescription
Definition: globals.hh:76
const G4String & GetName() const
Definition: G4Material.hh:178
const G4String & GetParticleName() const
G4double GetCSDARange(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
G4bool BuildCSDARange() const
G4GLOB_DLL std::ostream G4cout
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetCSDARange ( G4double  kinEnergy,
const G4String part,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 381 of file G4EmCalculator.hh.

385 {
386  return GetCSDARange(kinEnergy,FindParticle(particle),
388 }
const G4Material * FindMaterial(const G4String &)
G4double GetCSDARange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
static const G4double reg
string material
Definition: eplot.py:19
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetDEDX ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 140 of file G4EmCalculator.cc.

144 {
145  G4double res = 0.0;
146  const G4MaterialCutsCouple* couple = FindCouple(mat, region);
147  if(couple && UpdateParticle(p, kinEnergy) ) {
148  res = manager->GetDEDX(p, kinEnergy, couple);
149 
150  if(isIon) {
151  if(FindEmModel(p, currentProcessName, kinEnergy)) {
152  G4double length = CLHEP::nm;
153  G4double eloss = res*length;
154  //G4cout << "### GetDEDX: E= " << kinEnergy << " dedx0= " << res
155  // << " de= " << eloss << G4endl;;
156  G4double niel = 0.0;
157  dynParticle.SetKineticEnergy(kinEnergy);
158  currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
159  currentModel->CorrectionsAlongStep(couple,&dynParticle,eloss,niel,length);
160  res = eloss/length;
161  //G4cout << " de1= " << eloss << " res1= " << res
162  // << " " << p->GetParticleName() <<G4endl;;
163  }
164  }
165 
166  if(verbose>0) {
167  G4cout << "G4EmCalculator::GetDEDX: E(MeV)= " << kinEnergy/MeV
168  << " DEDX(MeV/mm)= " << res*mm/MeV
169  << " DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->GetDensity())
170  << " " << p->GetParticleName()
171  << " in " << mat->GetName()
172  << " isIon= " << isIon
173  << G4endl;
174  }
175  }
176  return res;
177 }
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
static constexpr double mm
Definition: G4SIunits.hh:115
virtual void CorrectionsAlongStep(const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double &eloss, G4double &niel, G4double length)
Definition: G4VEmModel.cc:370
G4double GetDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
static constexpr double cm2
Definition: G4SIunits.hh:120
const G4String & GetName() const
Definition: G4Material.hh:178
G4double GetDensity() const
Definition: G4Material.hh:180
const G4String & GetParticleName() const
static constexpr double gram
Definition: G4SIunits.hh:178
G4GLOB_DLL std::ostream G4cout
void SetKineticEnergy(G4double aEnergy)
virtual G4double GetChargeSquareRatio(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
Definition: G4VEmModel.cc:353
static constexpr double nm
Definition: SystemOfUnits.h:92
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetDEDX ( G4double  kinEnergy,
const G4String part,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 359 of file G4EmCalculator.hh.

361 {
362  return GetDEDX(kinEnergy,FindParticle(particle),
364 }
const G4Material * FindMaterial(const G4String &)
static const G4double reg
string material
Definition: eplot.py:19
G4double GetDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetKinEnergy ( G4double  range,
const G4ParticleDefinition p,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 251 of file G4EmCalculator.cc.

255 {
256  G4double res = 0.0;
257  const G4MaterialCutsCouple* couple = FindCouple(mat,region);
258  if(couple && UpdateParticle(p, 1.0*GeV)) {
259  res = manager->GetEnergy(p, range, couple);
260  if(verbose>0) {
261  G4cout << "G4EmCalculator::GetKinEnergy: Range(mm)= " << range/mm
262  << " KinE(MeV)= " << res/MeV
263  << " " << p->GetParticleName()
264  << " in " << mat->GetName()
265  << G4endl;
266  }
267  }
268  return res;
269 }
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
static constexpr double mm
Definition: G4SIunits.hh:115
const G4String & GetName() const
Definition: G4Material.hh:178
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
const G4ParticleDefinition const G4Material *G4double range
G4double GetEnergy(const G4ParticleDefinition *aParticle, G4double range, const G4MaterialCutsCouple *couple)
static constexpr double GeV
Definition: G4SIunits.hh:217
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetKinEnergy ( G4double  range,
const G4String part,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 405 of file G4EmCalculator.hh.

407 {
408  return GetKinEnergy(range,FindParticle(particle),
410 }
const G4Material * FindMaterial(const G4String &)
G4double GetKinEnergy(G4double range, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
static const G4double reg
string material
Definition: eplot.py:19
const G4ParticleDefinition const G4Material *G4double range
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetMeanFreePath ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4String processName,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 332 of file G4EmCalculator.cc.

337 {
338  G4double res = DBL_MAX;
339  G4double x = GetCrossSectionPerVolume(kinEnergy,p, processName, mat,region);
340  if(x > 0.0) { res = 1.0/x; }
341  if(verbose>1) {
342  G4cout << "G4EmCalculator::GetMeanFreePath: E(MeV)= " << kinEnergy/MeV
343  << " MFP(mm)= " << res/mm
344  << " " << p->GetParticleName()
345  << " in " << mat->GetName()
346  << G4endl;
347  }
348  return res;
349 }
static constexpr double mm
Definition: G4SIunits.hh:115
const G4String & GetName() const
Definition: G4Material.hh:178
tuple x
Definition: test.py:50
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4double GetCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76
#define DBL_MAX
Definition: templates.hh:83

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetMeanFreePath ( G4double  kinEnergy,
const G4String part,
const G4String proc,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 428 of file G4EmCalculator.hh.

433 {
434  return GetMeanFreePath(kinEnergy,FindParticle(particle),processName,
436 }
const G4Material * FindMaterial(const G4String &)
static const G4double reg
string material
Definition: eplot.py:19
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)
G4double GetMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)

Here is the call graph for this function:

G4double G4EmCalculator::GetRange ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 235 of file G4EmCalculator.cc.

239 {
240  G4double res = 0.0;
241  if(theParameters->BuildCSDARange()) {
242  res = GetCSDARange(kinEnergy, p, mat, region);
243  } else {
244  res = GetRangeFromRestricteDEDX(kinEnergy, p, mat, region);
245  }
246  return res;
247 }
G4double GetCSDARange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4bool BuildCSDARange() const
G4double GetRangeFromRestricteDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetRange ( G4double  kinEnergy,
const G4String part,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 393 of file G4EmCalculator.hh.

397 {
398  return GetRange(kinEnergy,FindParticle(particle),
400 }
const G4Material * FindMaterial(const G4String &)
G4double GetRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
static const G4double reg
string material
Definition: eplot.py:19
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetRangeFromRestricteDEDX ( G4double  kinEnergy,
const G4ParticleDefinition p,
const G4Material mat,
const G4Region r = nullptr 
)

Definition at line 181 of file G4EmCalculator.cc.

185 {
186  G4double res = 0.0;
187  const G4MaterialCutsCouple* couple = FindCouple(mat,region);
188  if(couple && UpdateParticle(p, kinEnergy)) {
189  res = manager->GetRangeFromRestricteDEDX(p, kinEnergy, couple);
190  if(verbose>1) {
191  G4cout << " G4EmCalculator::GetRangeFromRestrictedDEDX: E(MeV)= "
192  << kinEnergy/MeV
193  << " range(mm)= " << res/mm
194  << " " << p->GetParticleName()
195  << " in " << mat->GetName()
196  << G4endl;
197  }
198  }
199  return res;
200 }
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
static constexpr double mm
Definition: G4SIunits.hh:115
const G4String & GetName() const
Definition: G4Material.hh:178
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4double GetRangeFromRestricteDEDX(const G4ParticleDefinition *aParticle, G4double kineticEnergy, const G4MaterialCutsCouple *couple)
#define G4endl
Definition: G4ios.hh:61
static constexpr double MeV
Definition: G4SIunits.hh:214
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

Here is the caller graph for this function:

G4double G4EmCalculator::GetRangeFromRestricteDEDX ( G4double  kinEnergy,
const G4String part,
const G4String mat,
const G4String s = "world" 
)
inline

Definition at line 369 of file G4EmCalculator.hh.

373 {
374  return GetRangeFromRestricteDEDX(kinEnergy,FindParticle(particle),
376 }
const G4Material * FindMaterial(const G4String &)
static const G4double reg
string material
Definition: eplot.py:19
G4double GetRangeFromRestricteDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
const G4ParticleDefinition * FindParticle(const G4String &)
const G4Region * FindRegion(const G4String &)

Here is the call graph for this function:

G4double G4EmCalculator::GetShellIonisationCrossSectionPerAtom ( const G4String part,
G4int  Z,
G4AtomicShellEnumerator  shell,
G4double  kinEnergy 
)

Definition at line 315 of file G4EmCalculator.cc.

320 {
321  G4double res = 0.0;
322  const G4ParticleDefinition* p = FindParticle(particle);
323  G4VAtomDeexcitation* ad = manager->AtomDeexcitation();
324  if(p && ad) {
325  res = ad->GetShellIonisationCrossSectionPerAtom(p, Z, shell, kinEnergy);
326  }
327  return res;
328 }
virtual G4double GetShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr)=0
const char * p
Definition: xmltok.h:285
const G4ParticleDefinition * FindParticle(const G4String &)
G4VAtomDeexcitation * AtomDeexcitation()
double G4double
Definition: G4Types.hh:76

Here is the call graph for this function:

void G4EmCalculator::PrintDEDXTable ( const G4ParticleDefinition p)

Definition at line 353 of file G4EmCalculator.cc.

354 {
355  const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
356  G4cout << "##### DEDX Table for " << p->GetParticleName() << G4endl;
357  if(elp) G4cout << *(elp->DEDXTable()) << G4endl;
358 }
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4PhysicsTable * DEDXTable() const
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

void G4EmCalculator::PrintInverseRangeTable ( const G4ParticleDefinition p)

Definition at line 371 of file G4EmCalculator.cc.

372 {
373  const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
374  G4cout << "### G4EmCalculator: Inverse Range Table for "
375  << p->GetParticleName() << G4endl;
376  if(elp) G4cout << *(elp->InverseRangeTable()) << G4endl;
377 }
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
G4PhysicsTable * InverseRangeTable() const
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

void G4EmCalculator::PrintRangeTable ( const G4ParticleDefinition p)

Definition at line 362 of file G4EmCalculator.cc.

363 {
364  const G4VEnergyLossProcess* elp = FindEnergyLossProcess(p);
365  G4cout << "##### Range Table for " << p->GetParticleName() << G4endl;
366  if(elp) G4cout << *(elp->RangeTableForLoss()) << G4endl;
367 }
G4PhysicsTable * RangeTableForLoss() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
#define G4endl
Definition: G4ios.hh:61

Here is the call graph for this function:

Here is the caller graph for this function:

void G4EmCalculator::SetupMaterial ( const G4Material mat)

Definition at line 1269 of file G4EmCalculator.cc.

1270 {
1271  if(mat) {
1272  currentMaterial = mat;
1273  currentMaterialName = mat->GetName();
1274  } else {
1275  currentMaterial = 0;
1276  currentMaterialName = "";
1277  }
1278 }
const G4String & GetName() const
Definition: G4Material.hh:178

Here is the call graph for this function:

Here is the caller graph for this function:

void G4EmCalculator::SetupMaterial ( const G4String mname)

Definition at line 1282 of file G4EmCalculator.cc.

1283 {
1284  SetupMaterial(nist->FindOrBuildMaterial(mname));
1285 }
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
void SetupMaterial(const G4Material *)

Here is the call graph for this function:

void G4EmCalculator::SetVerbose ( G4int  val)

Definition at line 1308 of file G4EmCalculator.cc.

1309 {
1310  verbose = verb;
1311 }

Here is the caller graph for this function:


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