75 constexpr G4double length = CLHEP::nm;
85 corr = manager->EmCorrections();
86 cutenergy[0] = cutenergy[1] = cutenergy[2] =
DBL_MAX;
99 for (
G4int i=0; i<nLocalMaterials; ++i) {
100 delete localCouples[i];
113 if (
nullptr != couple && UpdateParticle(p, kinEnergy) ) {
114 if (FindEmModel(p, currentProcessName, kinEnergy)) {
116 G4double q2 = currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
117 res = manager->GetDEDX(p, kinEnergy, couple) * q2;
122 currentModel->CorrectionsAlongStep(mat, p, kinEnergy, cut, length, eloss);
123 res = std::max(eloss/length, 0.0);
125 res = manager->GetDEDX(p, kinEnergy, couple);
130 G4cout <<
"G4EmCalculator::GetDEDX: E(MeV)= " << kinEnergy/MeV
131 <<
" DEDX(MeV/mm)= " << res*mm/MeV
132 <<
" DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->
GetDensity())
135 <<
" isIon= " << isIon
150 if(couple && UpdateParticle(p, kinEnergy)) {
151 res = manager->GetRangeFromRestricteDEDX(p, kinEnergy, couple);
153 G4cout <<
" G4EmCalculator::GetRangeFromRestrictedDEDX: E(MeV)= "
155 <<
" range(mm)= " << res/mm
172 if(!theParameters->BuildCSDARange()) {
174 ed <<
"G4EmCalculator::GetCSDARange: CSDA table is not built; "
175 <<
" use UI command: /process/eLoss/CSDARange true";
176 G4Exception(
"G4EmCalculator::GetCSDARange",
"em0077",
182 if(
nullptr != couple && UpdateParticle(p, kinEnergy)) {
183 res = manager->GetCSDARange(p, kinEnergy, couple);
185 G4cout <<
" G4EmCalculator::GetCSDARange: E(MeV)= " << kinEnergy/MeV
186 <<
" range(mm)= " << res/mm
203 if(theParameters->BuildCSDARange()) {
220 if(
nullptr != couple && UpdateParticle(p, 1.0*GeV)) {
221 res = manager->GetEnergy(p, range, couple);
223 G4cout <<
"G4EmCalculator::GetKinEnergy: Range(mm)= " << range/mm
224 <<
" KinE(MeV)= " << res/MeV
244 if(
nullptr != couple && UpdateParticle(p, kinEnergy)) {
245 if(FindEmModel(p, processName, kinEnergy)) {
248 FindLambdaTable(p, processName, kinEnergy, procType);
250 G4VEmProcess* emproc = FindDiscreteProcess(p, processName);
251 if(
nullptr != emproc) {
253 }
else if(currentLambda) {
257 auto mscM =
static_cast<G4VMscModel*
>(currentModel);
259 G4double tr1Mfp = mscM->GetTransportMeanFreePath(p, kinEnergy);
265 res = (((*currentLambda)[idx])->Value(e))*chargeSquare;
271 G4cout <<
"G4EmCalculator::GetXSPerVolume: E(MeV)= " << kinEnergy/MeV
272 <<
" cross(cm-1)= " << res*cm
276 G4cout <<
" idx= " << idx <<
" Escaled((MeV)= "
277 << kinEnergy*massRatio
278 <<
" q2= " << chargeSquare;
297 if(
nullptr != p &&
nullptr != ad) {
313 if(x > 0.0) { res = 1.0/x; }
315 G4cout <<
"G4EmCalculator::GetMeanFreePath: E(MeV)= " << kinEnergy/MeV
316 <<
" MFP(mm)= " << res/mm
347 G4cout <<
"### G4EmCalculator: Inverse Range Table for "
364 <<
" in " << currentMaterialName
365 <<
" e(MeV)= " << kinEnergy/MeV <<
" cut(MeV)= " << cut/MeV
368 if (UpdateParticle(p, kinEnergy)) {
369 if (FindEmModel(p, processName, kinEnergy)) {
370 G4double escaled = kinEnergy*massRatio;
371 chargeSquare = currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
372 if (
nullptr != baseParticle && !isIon) {
373 res = currentModel->ComputeDEDXPerVolume(mat, baseParticle, escaled, cut)
377 <<
" E(MeV)=" << kinEnergy
378 <<
" Base particle: " << baseParticle->GetParticleName()
379 <<
" Escaled(MeV)= " << escaled
380 <<
" q2=" << chargeSquare
381 <<
" dEdx(MeV/mm)=" << res <<
" << cut=" << cut <<
G4endl;
384 res = currentModel->ComputeDEDXPerVolume(mat, p, kinEnergy, cut);
387 <<
" dE/dx(MeV/mm)=" << res <<
G4endl;
391 G4cout << currentModel->GetName() <<
": E(MeV)=" << kinEnergy
392 <<
" cut(MeV)=" << cut <<
" DEDX(MeV/mm)=" << res
393 <<
" q2=" << chargeSquare <<
G4endl;
396 if (applySmoothing &&
nullptr != loweModel && loweModel != currentModel) {
397 G4double eth = loweModel->HighEnergyLimit();
400 if (
nullptr != baseParticle && !isIon) {
402 currentModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut);
404 loweModel->ComputeDEDXPerVolume(mat, baseParticle, eth, cut);
406 res1 = currentModel->ComputeDEDXPerVolume(mat, p, eth, cut);
407 res0 = loweModel->ComputeDEDXPerVolume(mat, p, eth, cut);
409 if(res1 > 0.0 && escaled > 0.0) {
410 res *= (1.0 + (res0/res1 - 1.0)*eth/escaled);
413 G4cout <<
"At boundary energy(MeV)= " << eth/MeV
414 <<
" DEDX(MeV/mm)= " << res0*mm/MeV <<
" " << res1*mm/MeV
415 <<
" after correction DEDX(MeV/mm)=" << res*mm/MeV <<
G4endl;
420 currentModel->CorrectionsAlongStep(mat, p, kinEnergy, cut, length, eloss);
421 res = std::max(eloss/length, 0.0);
424 G4cout <<
"## E(MeV)= " << kinEnergy/MeV
425 <<
" DEDX(MeV/mm)= " << res*mm/MeV
426 <<
" DEDX(MeV*cm^2/g)= " << res*gram/(MeV*cm2*mat->
GetDensity())
427 <<
" cut(MeV)= " << cut/MeV
429 <<
" in " << currentMaterialName
430 <<
" Zi^2= " << chargeSquare
431 <<
" isIon=" << isIon
448 if(UpdateParticle(part, kinEnergy)) {
451 const std::vector<G4VEnergyLossProcess*> vel =
453 std::size_t n = vel.size();
458 for(std::size_t i=0; i<n; ++i) {
461 if(ActiveForParticle(part, p)) {
464 dedx +=
ComputeDEDX(kinEnergy,part,(vel[i])->GetProcessName(),mat,cut);
482 if(UpdateParticle(part, kinEnergy)) {
485 const std::vector<G4VEnergyLossProcess*> vel =
487 std::size_t n = vel.size();
489 if(mat != cutMaterial) {
502 for(std::size_t i=0; i<n; ++i) {
505 if(ActiveForParticle(part, p)) {
513 dedx +=
ComputeDEDX(kinEnergy,part,(vel[i])->GetProcessName(),
541 G4VEmProcess* nucst = FindDiscreteProcess(p,
"nuclearStopping");
552 <<
" NuclearDEDX(MeV/mm)= " << res*mm/MeV
553 <<
" NuclearDEDX(MeV*cm^2/g)= "
571 if(UpdateParticle(p, kinEnergy)) {
572 if(FindEmModel(p, processName, kinEnergy)) {
574 G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
575 chargeSquare = currentModel->GetChargeSquareRatio(p, mat, kinEnergy);
576 if (baseParticle && !isIon) {
577 e *= kinEnergy*massRatio;
578 res = currentModel->CrossSectionPerVolume(
579 mat, baseParticle, e, aCut, e) * chargeSquare;
581 res = currentModel->CrossSectionPerVolume(mat, p, e, aCut, e);
584 G4cout <<
"G4EmCalculator::ComputeXSPerVolume: E(MeV)= "
586 <<
" cross(cm-1)= " << res*cm
587 <<
" cut(keV)= " << aCut/keV
607 if(UpdateParticle(p, kinEnergy)) {
610 if(FindEmModel(p, processName, kinEnergy)) {
612 G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
614 e *= kinEnergy*massRatio;
615 currentModel->InitialiseForElement(baseParticle, iz);
616 res = currentModel->ComputeCrossSectionPerAtom(
617 baseParticle, e, Z,
A, aCut) * chargeSquare;
619 currentModel->InitialiseForElement(p, iz);
620 res = currentModel->ComputeCrossSectionPerAtom(p, e, Z,
A, aCut);
623 G4cout <<
"E(MeV)= " << kinEnergy/MeV
624 <<
" cross(barn)= " << res/barn
626 <<
" Z= " << Z <<
" A= " <<
A/(g/mole) <<
" g/mole"
627 <<
" cut(keV)= " << aCut/keV
645 if(UpdateParticle(p, kinEnergy)) {
647 if(FindEmModel(p, processName, kinEnergy)) {
649 G4double aCut = std::max(cut, theParameters->LowestElectronEnergy());
650 if(
nullptr != baseParticle) {
651 e *= kinEnergy*massRatio;
652 currentModel->InitialiseForElement(baseParticle, Z);
654 currentModel->ComputeCrossSectionPerShell(baseParticle, Z, shellIdx,
655 e, aCut) * chargeSquare;
657 currentModel->InitialiseForElement(p, Z);
658 res = currentModel->ComputeCrossSectionPerAtom(p, Z, shellIdx, e, aCut);
661 G4cout <<
"E(MeV)= " << kinEnergy/MeV
662 <<
" cross(barn)= " << res/barn
664 <<
" Z= " << Z <<
" shellIdx= " << shellIdx
665 <<
" cut(keV)= " << aCut/keV
685 if(res > 0.0) { res = 1.0/res; }
719 if(x > 0.0) { mfp = 1.0/x; }
721 G4cout <<
"E(MeV)= " << kinEnergy/MeV
722 <<
" MFP(mm)= " << mfp/mm
738 ConvertRangeToEnergy(part, mat, range);
746 if(p != currentParticle) {
752 baseParticle =
nullptr;
758 currentProcessName =
"";
762 if(
nullptr != currentProcess) {
765 if (currentProcessName ==
"ionIoni" && !(p->
GetParticleName() ==
"alpha")) {
766 baseParticle = theGenericIon;
771 if(
nullptr != baseParticle) {
772 massRatio = baseParticle->GetPDGMass()/p->
GetPDGMass();
779 if(isIon &&
nullptr != currentProcess) {
781 corr->EffectiveChargeSquareRatio(p, currentMaterial, kinEnergy);
782 currentProcess->SetDynamicMassCharge(massRatio,chargeSquare);
784 G4cout <<
"\n NewIon: massR= "<< massRatio <<
" q2= "
785 << chargeSquare <<
" " << currentProcess <<
G4endl;
796 if(name != currentParticleName) {
799 G4cout <<
"### WARNING: G4EmCalculator::FindParticle fails to find "
820 if(name != currentMaterialName) {
822 if(
nullptr == currentMaterial) {
823 G4cout <<
"### WARNING: G4EmCalculator::FindMaterial fails to find "
827 return currentMaterial;
845 if(
nullptr != currentMaterial) {
855 std::size_t nr = store->size();
857 for(std::size_t i=0; i<nr; ++i) {
859 material, ((*store)[i])->GetProductionCuts());
860 if(
nullptr != couple) {
break; }
865 if(
nullptr == couple) {
867 ed <<
"G4EmCalculator::FindCouple: fail for material <"
868 << currentMaterialName <<
">";
869 if(region) { ed <<
" and region " << region->
GetName(); }
870 G4Exception(
"G4EmCalculator::FindCouple",
"em0078",
881 if (
nullptr == currentMaterial) {
return false; }
882 for (
G4int i=0; i<nLocalMaterials; ++i) {
884 <<
" " << cut <<
" " << localCuts[i] <<
G4endl;
885 if(material == localMaterials[i] && cut == localCuts[i]) {
886 currentCouple = localCouples[i];
887 currentCoupleIndex = currentCouple->GetIndex();
892 auto prodcut =
new G4ProductionCuts();
893 prodcut->SetProductionCut(cut, 0);
894 prodcut->SetProductionCut(cut, 1);
895 auto const cc =
new G4MaterialCutsCouple(material, prodcut);
896 localMaterials.push_back(material);
897 localCouples.push_back(cc);
898 localCuts.push_back(cut);
901 currentCoupleIndex = currentCouple->GetIndex();
913 if (!currentLambda || p != lambdaParticle || processName != lambdaName) {
914 lambdaName = processName;
915 currentLambda =
nullptr;
917 isApplicable =
false;
919 const G4ParticleDefinition* part = (isIon) ? theGenericIon : p;
922 currentName = processName;
923 currentModel =
nullptr;
926 G4VEnergyLossProcess* elproc = FindEnLossProcess(part, processName);
927 if(
nullptr != elproc) {
930 if(
nullptr != currentLambda) {
933 G4cout <<
"G4VEnergyLossProcess is found out: " << currentName
942 G4VEmProcess* proc = FindDiscreteProcess(part, processName);
943 if(
nullptr != proc) {
946 if(
nullptr != currentLambda) {
949 G4cout <<
"G4VEmProcess is found out: " << currentName <<
G4endl;
957 G4VMultipleScattering* msc = FindMscProcess(part, processName);
961 if(
nullptr != currentModel) {
962 currentLambda = currentModel->GetCrossSectionTable();
963 if(
nullptr != currentLambda) {
966 G4cout <<
"G4VMultipleScattering is found out: " << currentName
982 isApplicable =
false;
983 if(
nullptr == p ||
nullptr == currentMaterial) {
984 G4cout <<
"G4EmCalculator::FindEmModel WARNING: no particle"
985 <<
" or materail defined; particle: " << p <<
G4endl;
989 G4double scaledEnergy = kinEnergy*massRatio;
990 const G4ParticleDefinition* part = (isIon) ? theGenericIon : p;
993 G4cout <<
"## G4EmCalculator::FindEmModel for " << partname
995 <<
") and " << processName <<
" at E(MeV)= " << scaledEnergy
997 if(p != part) {
G4cout <<
" GenericIon is the base particle" <<
G4endl; }
1001 currentName = processName;
1002 currentModel =
nullptr;
1003 loweModel =
nullptr;
1004 std::size_t idx = 0;
1006 G4VEnergyLossProcess* elproc = FindEnLossProcess(part, processName);
1007 if(
nullptr != elproc) {
1010 currentModel->SetupForMaterial(part, currentMaterial, kinEnergy);
1011 G4double eth = currentModel->LowEnergyLimit();
1014 if(loweModel == currentModel) { loweModel =
nullptr; }
1016 loweModel->InitialiseForMaterial(part, currentMaterial);
1017 loweModel->SetupForMaterial(part, currentMaterial, eth - CLHEP::eV);
1023 if(
nullptr == currentModel) {
1024 G4VEmProcess* proc = FindDiscreteProcess(part, processName);
1025 if(
nullptr != proc) {
1028 currentModel->SetupForMaterial(part, currentMaterial, kinEnergy);
1029 G4double eth = currentModel->LowEnergyLimit();
1032 if(loweModel == currentModel) { loweModel =
nullptr; }
1034 loweModel->InitialiseForMaterial(part, currentMaterial);
1035 loweModel->SetupForMaterial(part, currentMaterial, eth - CLHEP::eV);
1042 if(
nullptr == currentModel) {
1043 G4VMultipleScattering* proc = FindMscProcess(part, processName);
1044 if(
nullptr != proc) {
1046 loweModel =
nullptr;
1049 if(
nullptr != currentModel) {
1050 if(loweModel == currentModel) { loweModel =
nullptr; }
1051 isApplicable =
true;
1052 currentModel->InitialiseForMaterial(part, currentMaterial);
1054 loweModel->InitialiseForMaterial(part, currentMaterial);
1057 G4cout <<
" Model <" << currentModel->GetName()
1058 <<
"> Emin(MeV)= " << currentModel->LowEnergyLimit()/MeV
1060 if(
nullptr != elproc) {
1064 if(
nullptr != loweModel) {
1065 G4cout <<
" LowEnergy model <" << loweModel->GetName() <<
">";
1070 return isApplicable;
1079 G4VEnergyLossProcess* proc =
nullptr;
1080 const std::vector<G4VEnergyLossProcess*> v =
1081 manager->GetEnergyLossProcessVector();
1082 std::size_t
n = v.size();
1083 for(std::size_t i=0; i<
n; ++i) {
1084 if((v[i])->GetProcessName() == processName) {
1085 auto p =
static_cast<G4VProcess*
>(v[i]);
1086 if(ActiveForParticle(part, p)) {
1101 G4VEmProcess* proc =
nullptr;
1102 auto v = manager->GetEmProcessVector();
1103 std::size_t
n = v.size();
1104 for(std::size_t i=0; i<
n; ++i) {
1105 const G4String& pName = v[i]->GetProcessName();
1106 if(pName ==
"GammaGeneralProc") {
1107 proc = v[i]->GetEmProcess(processName);
1109 }
else if(pName == processName) {
1110 const auto p =
static_cast<G4VProcess*
>(v[i]);
1111 if(ActiveForParticle(part, p)) {
1126 G4VMultipleScattering* proc =
nullptr;
1127 const std::vector<G4VMultipleScattering*> v =
1128 manager->GetMultipleScatteringVector();
1129 std::size_t
n = v.size();
1130 for(std::size_t i=0; i<
n; ++i) {
1131 if((v[i])->GetProcessName() == processName) {
1132 auto p =
static_cast<G4VProcess*
>(v[i]);
1133 if(ActiveForParticle(part, p)) {
1151 for(
G4int i=0; i<nproc; ++i) {
1152 if(processName == (*pv)[i]->GetProcessName()) {
1169 for(
G4int i=0; i<n; ++i) {
1170 if((*pv)[i] == proc) {
1182 if (
nullptr != mat) {
1183 currentMaterial = mat;
1184 currentMaterialName = mat->
GetName();
1186 currentMaterial =
nullptr;
1187 currentMaterialName =
"";
1200void G4EmCalculator::CheckMaterial(
G4int Z)
1203 if(
nullptr != currentMaterial) {
1205 for(
G4int i=0; i<nn; ++i) {
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4GLOB_DLL std::ostream G4cout
void SetDefinition(const G4ParticleDefinition *aParticleDefinition)
void SetKineticEnergy(G4double aEnergy)
static G4Electron * Electron()
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double GetShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy)
G4double GetDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double ComputeTotalDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, G4double cut=DBL_MAX)
G4double GetCSDARange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double GetRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double ComputeNuclearDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
const G4ParticleDefinition * FindIon(G4int Z, G4int A)
G4double ComputeGammaAttenuationLength(G4double kinEnergy, const G4Material *)
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
void SetVerbose(G4int val)
G4double ComputeEnergyCutFromRangeCut(G4double range, const G4ParticleDefinition *, const G4Material *)
G4double GetKinEnergy(G4double range, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double GetRangeFromRestricteDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double ComputeCrossSectionPerAtom(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4double Z, G4double A, G4double cut=0.0)
void PrintDEDXTable(const G4ParticleDefinition *)
const G4Region * FindRegion(const G4String &)
G4VProcess * FindProcess(const G4ParticleDefinition *part, const G4String &processName)
G4double GetCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
G4double ComputeCrossSectionPerShell(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4int Z, G4int shellIdx, G4double cut=0.0)
G4double ComputeShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy, const G4Material *mat=nullptr)
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
void SetupMaterial(const G4Material *)
void PrintRangeTable(const G4ParticleDefinition *)
void PrintInverseRangeTable(const G4ParticleDefinition *)
G4double ComputeDEDXForCutInRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double rangecut=DBL_MAX)
G4double GetMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
G4double ComputeElectronicDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
const G4Material * FindMaterial(const G4String &)
static G4EmParameters * Instance()
static const G4Region * FindRegion(const G4String ®ionName, const G4int verbose=0)
static G4GenericIon * GenericIon()
static G4LossTableManager * Instance()
G4VEnergyLossProcess * GetEnergyLossProcess(const G4ParticleDefinition *)
const std::vector< G4VEnergyLossProcess * > & GetEnergyLossProcessVector()
G4double GetDensity() const
const G4Element * GetElement(G4int iel) const
std::size_t GetNumberOfElements() const
const G4String & GetName() const
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
static G4NistManager * Instance()
G4ProcessManager * GetProcessManager() const
const G4String & GetParticleType() const
G4double GetPDGMass() const
G4double GetPDGCharge() const
const G4String & GetParticleName() const
G4IonTable * GetIonTable() const
G4ParticleDefinition * FindParticle(G4int PDGEncoding)
static G4ParticleTable * GetParticleTable()
static G4Positron * Positron()
G4bool GetProcessActivation(G4VProcess *aProcess) const
G4ProcessVector * GetProcessList() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
const std::vector< G4double > * GetEnergyCutsVector(std::size_t pcIdx) const
static G4ProductionCutsTable * GetProductionCutsTable()
G4RegionStore is a singleton class, acting as container for all geometrical regions,...
static G4RegionStore * GetInstance()
G4Region defines a region or a group of regions in the detector geometry setup, sharing properties as...
G4ProductionCuts * GetProductionCuts() const
const G4String & GetName() const
virtual G4double ComputeShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr)=0
virtual G4double GetShellIonisationCrossSectionPerAtom(const G4ParticleDefinition *, G4int Z, G4AtomicShellEnumerator shell, G4double kinE, const G4Material *mat=nullptr)=0
virtual void InitialiseForMaterial(const G4ParticleDefinition *, const G4Material *)
void SetCurrentCouple(const G4MaterialCutsCouple *)
void SetFluctuationFlag(G4bool val)
virtual G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=DBL_MAX)
G4VEmModel * EmModel(std::size_t index=0) const
G4PhysicsTable * LambdaTable() const
G4VEmModel * SelectModelForMaterial(G4double kinEnergy, std::size_t idxCouple) const
G4double GetCrossSection(const G4double kinEnergy, const G4MaterialCutsCouple *couple) override
const G4ParticleDefinition * BaseParticle() const
G4PhysicsTable * RangeTableForLoss() const
G4PhysicsTable * InverseRangeTable() const
G4VEmModel * SelectModelForMaterial(G4double kinEnergy, std::size_t &idxCouple) const
G4PhysicsTable * LambdaTable() const
G4PhysicsTable * DEDXTable() const
G4VEmModel * SelectModel(G4double kinEnergy, size_t idx)
const G4String & GetProcessName() const