76 fCrossSectionHandler(nullptr),
77 fAtomDeexcitation(nullptr), fKineticEnergy1(0.*eV),
78 fCosThetaPrimary(1.0),fEnergySecondary(0.*eV),
79 fCosThetaSecondary(0.0),fTargetOscillator(-1),
80 fIsInitialised(false),fPIXEflag(false),fLocalTable(false)
82 fIntrinsicLowEnergyLimit = 100.0*eV;
83 fIntrinsicHighEnergyLimit = 100.0*GeV;
112 if (fCrossSectionHandler)
113 delete fCrossSectionHandler;
122 if (fVerboseLevel > 3)
123 G4cout <<
"Calling G4PenelopeIonisationModel::Initialise()" <<
G4endl;
127 if (!fAtomDeexcitation)
130 G4cout <<
"WARNING from G4PenelopeIonisationModel " <<
G4endl;
131 G4cout <<
"Atomic de-excitation module is not instantiated, so there will not be ";
133 G4cout <<
"Please make sure this is intended" <<
G4endl;
136 if (fAtomDeexcitation)
145 G4cout <<
"======================================================================" <<
G4endl;
146 G4cout <<
"The G4PenelopeIonisationModel is being used with the PIXE flag ON." <<
G4endl;
147 G4cout <<
"Atomic de-excitation will be produced statistically by the PIXE " <<
G4endl;
148 G4cout <<
"interface by using the shell cross section --> " << theModel <<
G4endl;
149 G4cout <<
"The built-in model procedure for atomic de-excitation is disabled. " <<
G4endl;
150 G4cout <<
"*Please be sure this is intended*, or disable PIXE by" <<
G4endl;
152 G4cout <<
"======================================================================" <<
G4endl;
155 SetParticle(particle);
163 fNBins = std::max(fNBins,(std::size_t)100);
166 if (fCrossSectionHandler)
168 delete fCrossSectionHandler;
169 fCrossSectionHandler = 0;
172 fCrossSectionHandler->SetVerboseLevel(fVerboseLevel);
182 fCrossSectionHandler->BuildXSTable(theMat,theCuts.at(i),particle,
186 if (fVerboseLevel > 2) {
187 G4cout <<
"Penelope Ionisation model v2008 is initialized " <<
G4endl
191 << fNBins <<
" bins."
199 fIsInitialised =
true;
209 if (fVerboseLevel > 3)
210 G4cout <<
"Calling G4PenelopeIonisationModel::InitialiseLocal()" <<
G4endl;
222 fCrossSectionHandler = theModel->fCrossSectionHandler;
225 fNBins = theModel->fNBins;
228 fVerboseLevel = theModel->fVerboseLevel;
259 if (fVerboseLevel > 3)
260 G4cout <<
"Calling CrossSectionPerVolume() of G4PenelopeIonisationModel" <<
G4endl;
269 if (!fCrossSectionHandler)
278 fCrossSectionHandler->GetCrossSectionTableForCouple(theParticle,
285 if (fVerboseLevel > 0)
289 ed <<
"Unable to retrieve the cross section table for " <<
291 " in " << material->
GetName() <<
", cut = " << cutEnergy/keV <<
" keV " <<
G4endl;
292 ed <<
"This can happen only in Unit Tests or via G4EmCalculator" <<
G4endl;
293 G4Exception(
"G4PenelopeIonisationModel::CrossSectionPerVolume()",
297 G4AutoLock lock(&PenelopeIonisationModelMutex);
298 fCrossSectionHandler->BuildXSTable(material,cutEnergy,theParticle);
302 fCrossSectionHandler->GetCrossSectionTableForCouple(theParticle,
311 G4double atPerMol = fOscManager->GetAtomsPerMolecule(material);
313 if (fVerboseLevel > 3)
314 G4cout <<
"Material " << material->
GetName() <<
" has " << atPerMol <<
315 "atoms per molecule" <<
G4endl;
319 moleculeDensity = atomDensity/atPerMol;
320 G4double crossPerVolume = crossPerMolecule*moleculeDensity;
322 if (fVerboseLevel > 2)
325 G4cout <<
"Mean free path for delta emission > " << cutEnergy/keV <<
" keV at " <<
326 energy/keV <<
" keV = " <<
327 (crossPerVolume ? (1./crossPerVolume)/mm :
DBL_MAX) <<
" mm" <<
G4endl;
330 G4cout <<
"Total free path for ionisation (no threshold) at " <<
331 energy/keV <<
" keV = " <<
332 (totalCross ? (1./totalCross)/mm :
DBL_MAX) <<
" mm" <<
G4endl;
334 return crossPerVolume;
349 G4cout <<
"*** G4PenelopeIonisationModel -- WARNING ***" <<
G4endl;
350 G4cout <<
"Penelope Ionisation model v2008 does not calculate cross section _per atom_ " <<
G4endl;
351 G4cout <<
"so the result is always zero. For physics values, please invoke " <<
G4endl;
352 G4cout <<
"GetCrossSectionPerVolume() or GetMeanFreePath() via the G4EmCalculator" <<
G4endl;
378 if (fVerboseLevel > 3)
379 G4cout <<
"Calling ComputeDEDX() of G4PenelopeIonisationModel" <<
G4endl;
383 if (!fCrossSectionHandler)
392 fCrossSectionHandler->GetCrossSectionTableForCouple(theParticle,material,
398 if (fVerboseLevel > 0)
402 ed <<
"Unable to retrieve the cross section table for " <<
404 " in " << material->
GetName() <<
", cut = " << cutEnergy/keV <<
" keV " <<
G4endl;
405 ed <<
"This can happen only in Unit Tests or via G4EmCalculator" <<
G4endl;
406 G4Exception(
"G4PenelopeIonisationModel::ComputeDEDXPerVolume()",
410 G4AutoLock lock(&PenelopeIonisationModelMutex);
411 fCrossSectionHandler->BuildXSTable(material,cutEnergy,theParticle);
415 fCrossSectionHandler->GetCrossSectionTableForCouple(theParticle,
425 G4double atPerMol = fOscManager->GetAtomsPerMolecule(material);
429 moleculeDensity = atomDensity/atPerMol;
430 G4double sPowerPerVolume = sPowerPerMolecule*moleculeDensity;
432 if (fVerboseLevel > 2)
435 G4cout <<
"Stopping power < " << cutEnergy/keV <<
" keV at " <<
436 kineticEnergy/keV <<
" keV = " <<
437 sPowerPerVolume/(keV/mm) <<
" keV/mm" <<
G4endl;
439 return sPowerPerVolume;
447 return fIntrinsicLowEnergyLimit;
489 if (fVerboseLevel > 3)
490 G4cout <<
"Calling SamplingSecondaries() of G4PenelopeIonisationModel" <<
G4endl;
495 if (kineticEnergy0 <= fIntrinsicLowEnergyLimit)
509 fKineticEnergy1=kineticEnergy0;
510 fCosThetaPrimary=1.0;
511 fEnergySecondary=0.0;
512 fCosThetaSecondary=1.0;
513 fTargetOscillator = -1;
516 SampleFinalStateElectron(material,cutE,kineticEnergy0);
518 SampleFinalStatePositron(material,cutE,kineticEnergy0);
523 G4Exception(
"G4PenelopeIonisationModel::SamplingSecondaries()",
527 if (fEnergySecondary == 0)
return;
529 if (fVerboseLevel > 3)
531 G4cout <<
"G4PenelopeIonisationModel::SamplingSecondaries() for " <<
533 G4cout <<
"Final eKin = " << fKineticEnergy1 <<
" keV" <<
G4endl;
534 G4cout <<
"Final cosTheta = " << fCosThetaPrimary <<
G4endl;
535 G4cout <<
"Delta-ray eKin = " << fEnergySecondary <<
" keV" <<
G4endl;
536 G4cout <<
"Delta-ray cosTheta = " << fCosThetaSecondary <<
G4endl;
537 G4cout <<
"Oscillator: " << fTargetOscillator <<
G4endl;
541 G4double sint = std::sqrt(1. - fCosThetaPrimary*fCosThetaPrimary);
543 G4double dirx = sint * std::cos(phiPrimary);
544 G4double diry = sint * std::sin(phiPrimary);
548 electronDirection1.
rotateUz(particleDirection0);
550 if (fKineticEnergy1 > 0)
559 G4double ionEnergyInPenelopeDatabase =
560 (*theTable)[fTargetOscillator]->GetIonisationEnergy();
564 G4int shFlag = (*theTable)[fTargetOscillator]->GetShellFlag();
565 G4int Z = (
G4int) (*theTable)[fTargetOscillator]->GetParentZ();
573 if (Z > 0 && shFlag<30)
575 shell = transitionManager->
Shell(Z,shFlag-1);
576 bindingEnergy = shell->BindingEnergy();
583 fEnergySecondary += ionEnergyInPenelopeDatabase-bindingEnergy;
585 G4double localEnergyDeposit = bindingEnergy;
590 if (fEnergySecondary < 0)
596 localEnergyDeposit += fEnergySecondary;
597 fEnergySecondary = 0.0;
605 if (fAtomDeexcitation && !fPIXEflag && shell)
608 if (fAtomDeexcitation->CheckDeexcitationActiveRegion(index))
610 std::size_t nBefore = fvect->size();
611 fAtomDeexcitation->GenerateParticles(fvect,shell,Z,index);
612 std::size_t nAfter = fvect->size();
616 for (std::size_t j=nBefore;j<nAfter;++j)
618 G4double itsEnergy = ((*fvect)[j])->GetKineticEnergy();
619 if (itsEnergy < localEnergyDeposit)
621 localEnergyDeposit -= itsEnergy;
623 energyInFluorescence += itsEnergy;
625 energyInAuger += itsEnergy;
630 (*fvect)[j] =
nullptr;
638 if (fEnergySecondary > cutE)
641 G4double sinThetaE = std::sqrt(1.-fCosThetaSecondary*fCosThetaSecondary);
643 G4double xEl = sinThetaE * std::cos(phiEl);
644 G4double yEl = sinThetaE * std::sin(phiEl);
647 eDirection.
rotateUz(particleDirection0);
649 eDirection,fEnergySecondary) ;
650 fvect->push_back(electron);
654 localEnergyDeposit += fEnergySecondary;
655 fEnergySecondary = 0;
658 if (localEnergyDeposit < 0)
660 G4Exception(
"G4PenelopeIonisationModel::SampleSecondaries()",
661 "em2099",
JustWarning,
"WARNING: Negative local energy deposit");
662 localEnergyDeposit=0.;
666 if (fVerboseLevel > 1)
668 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
669 G4cout <<
"Energy balance from G4PenelopeIonisation" <<
G4endl;
670 G4cout <<
"Incoming primary energy: " << kineticEnergy0/keV <<
" keV" <<
G4endl;
671 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
672 G4cout <<
"Outgoing primary energy: " << fKineticEnergy1/keV <<
" keV" <<
G4endl;
673 G4cout <<
"Delta ray " << fEnergySecondary/keV <<
" keV" <<
G4endl;
674 if (energyInFluorescence)
675 G4cout <<
"Fluorescence x-rays: " << energyInFluorescence/keV <<
" keV" <<
G4endl;
677 G4cout <<
"Auger electrons: " << energyInAuger/keV <<
" keV" <<
G4endl;
678 G4cout <<
"Local energy deposit " << localEnergyDeposit/keV <<
" keV" <<
G4endl;
679 G4cout <<
"Total final state: " << (fEnergySecondary+energyInFluorescence+fKineticEnergy1+
680 localEnergyDeposit+energyInAuger)/keV <<
682 G4cout <<
"-----------------------------------------------------------" <<
G4endl;
685 if (fVerboseLevel > 0)
687 G4double energyDiff = std::fabs(fEnergySecondary+energyInFluorescence+fKineticEnergy1+
688 localEnergyDeposit+energyInAuger-kineticEnergy0);
689 if (energyDiff > 0.05*keV)
690 G4cout <<
"Warning from G4PenelopeIonisation: problem with energy conservation: " <<
691 (fEnergySecondary+energyInFluorescence+fKineticEnergy1+localEnergyDeposit+energyInAuger)/keV <<
692 " keV (final) vs. " <<
693 kineticEnergy0/keV <<
" keV (initial)" <<
G4endl;
699void G4PenelopeIonisationModel::SampleFinalStateElectron(
const G4Material* mat,
712 std::size_t numberOfOscillators = theTable->size();
720 fTargetOscillator =
G4int(numberOfOscillators-1);
723 for (std::size_t i=0;i<numberOfOscillators-1;++i)
729 fTargetOscillator = (
G4int) i;
734 if (fVerboseLevel > 3)
736 G4cout <<
"SampleFinalStateElectron: sampled oscillator #" <<
737 fTargetOscillator <<
"." <<
G4endl;
738 G4cout <<
"Ionisation energy: " <<
739 (*theTable)[fTargetOscillator]->GetIonisationEnergy()/eV <<
741 G4cout <<
"Resonance energy: : " <<
742 (*theTable)[fTargetOscillator]->GetResonanceEnergy()/eV <<
" eV "
746 G4double rb = kineticEnergy + 2.0*electron_mass_c2;
753 G4double resEne = (*theTable)[fTargetOscillator]->GetResonanceEnergy();
755 G4double ionEne = (*theTable)[fTargetOscillator]->GetIonisationEnergy();
756 G4double cutoffEne = (*theTable)[fTargetOscillator]->GetCutoffRecoilResonantEnergy();
764 if (resEne > cutEnergy && resEne < kineticEnergy)
766 cps = kineticEnergy*rb;
769 if (resEne > 1.0e-6*kineticEnergy)
771 G4double cpp = std::sqrt((kineticEnergy-resEne)*(kineticEnergy-resEne+2.0*electron_mass_c2));
772 QM = std::sqrt((cp-cpp)*(cp-cpp)+electron_mass_c2*electron_mass_c2)-electron_mass_c2;
776 QM = resEne*resEne/(beta2*2.0*electron_mass_c2);
777 QM *= (1.0-QM*0.5/electron_mass_c2);
781 XHDL =
G4Log(cutoffEne*(QM+2.0*electron_mass_c2)/(QM*(cutoffEne+2.0*electron_mass_c2)))
783 XHDT = XHDT0*invResEne;
802 G4double EE = kineticEnergy + ionEne;
804 G4double wcl = std::max(cutEnergy,cutoffEne);
811 XHC = (amol*(0.5-rcl)+1.0/rcl-rrl1+
812 (1.0-amol)*
G4Log(rcl*rrl1))/EE;
819 if (XHTOT < 1.e-14*barn)
821 fKineticEnergy1=kineticEnergy;
822 fCosThetaPrimary=1.0;
823 fEnergySecondary=0.0;
824 fCosThetaSecondary=1.0;
825 fTargetOscillator =
G4int(numberOfOscillators-1);
846 rk = rcl/(1.0-fb*(1.0-(rcl+rcl)));
848 rk = rcl + (fb-1.0)*(0.5-rcl)/ARCL;
851 G4double phi = 1.0+rkf*rkf-rkf+amol*(rk2+rkf);
858 fKineticEnergy1 = kineticEnergy - deltaE;
859 fCosThetaPrimary = std::sqrt(fKineticEnergy1*rb/(kineticEnergy*(rb-deltaE)));
861 fEnergySecondary = deltaE - ionEne;
862 fCosThetaSecondary= std::sqrt(deltaE*rb/(kineticEnergy*(deltaE+2.0*electron_mass_c2)));
863 if (fVerboseLevel > 3)
864 G4cout <<
"SampleFinalStateElectron: sampled close collision " <<
G4endl;
871 fKineticEnergy1 = kineticEnergy - deltaE;
875 G4double QS = QM/(1.0+QM*0.5/electron_mass_c2);
877 - (QS*0.5/electron_mass_c2));
878 G4double QTREV = Q*(Q+2.0*electron_mass_c2);
879 G4double cpps = fKineticEnergy1*(fKineticEnergy1+2.0*electron_mass_c2);
880 fCosThetaPrimary = (cpps+cps-QTREV)/(2.0*cp*std::sqrt(cpps));
881 if (fCosThetaPrimary > 1.)
882 fCosThetaPrimary = 1.0;
884 fEnergySecondary = deltaE - ionEne;
885 fCosThetaSecondary = 0.5*(deltaE*(kineticEnergy+rb-deltaE)+QTREV)/std::sqrt(cps*QTREV);
886 if (fCosThetaSecondary > 1.0)
887 fCosThetaSecondary = 1.0;
888 if (fVerboseLevel > 3)
889 G4cout <<
"SampleFinalStateElectron: sampled distant longitudinal collision " <<
G4endl;
894 fCosThetaPrimary = 1.0;
896 fEnergySecondary = deltaE - ionEne;
897 fCosThetaSecondary = 0.5;
898 if (fVerboseLevel > 3)
899 G4cout <<
"SampleFinalStateElectron: sampled distant transverse collision " <<
G4endl;
906void G4PenelopeIonisationModel::SampleFinalStatePositron(
const G4Material* mat,
919 std::size_t numberOfOscillators = theTable->size();
920 const G4PenelopeCrossSection* theXS =
923 G4double delta = fCrossSectionHandler->GetDensityCorrection(mat,kineticEnergy);
927 fTargetOscillator =
G4int(numberOfOscillators-1);
929 for (std::size_t i=0;i<numberOfOscillators-1;++i)
934 fTargetOscillator = (
G4int) i;
939 if (fVerboseLevel > 3)
941 G4cout <<
"SampleFinalStatePositron: sampled oscillator #" <<
942 fTargetOscillator <<
"." <<
G4endl;
943 G4cout <<
"Ionisation energy: " << (*theTable)[fTargetOscillator]->GetIonisationEnergy()/eV
945 G4cout <<
"Resonance energy: : " << (*theTable)[fTargetOscillator]->GetResonanceEnergy()/eV
950 G4double rb = kineticEnergy + 2.0*electron_mass_c2;
957 G4double bha1 = amol*(2.0*g12-1.0)/(gam2-1.0);
965 G4double resEne = (*theTable)[fTargetOscillator]->GetResonanceEnergy();
967 G4double ionEne = (*theTable)[fTargetOscillator]->GetIonisationEnergy();
968 G4double cutoffEne = (*theTable)[fTargetOscillator]->GetCutoffRecoilResonantEnergy();
977 if (resEne > cutEnergy && resEne < kineticEnergy)
979 cps = kineticEnergy*rb;
982 if (resEne > 1.0e-6*kineticEnergy)
984 G4double cpp = std::sqrt((kineticEnergy-resEne)*(kineticEnergy-resEne+2.0*electron_mass_c2));
985 QM = std::sqrt((cp-cpp)*(cp-cpp)+electron_mass_c2*electron_mass_c2)-electron_mass_c2;
989 QM = resEne*resEne/(beta2*2.0*electron_mass_c2);
990 QM *= (1.0-QM*0.5/electron_mass_c2);
994 XHDL =
G4Log(cutoffEne*(QM+2.0*electron_mass_c2)/(QM*(cutoffEne+2.0*electron_mass_c2)))
996 XHDT = XHDT0*invResEne;
1015 G4double wcl = std::max(cutEnergy,cutoffEne);
1021 XHC = ((1.0/rcl-1.0)+bha1*
G4Log(rcl)+bha2*rl1
1022 + (bha3/2.0)*(rcl*rcl-1.0)
1023 + (bha4/3.0)*(1.0-rcl*rcl*rcl))/kineticEnergy;
1027 G4double XHTOT = XHC + XHDL + XHDT;
1030 if (XHTOT < 1.e-14*barn)
1032 fKineticEnergy1=kineticEnergy;
1033 fCosThetaPrimary=1.0;
1034 fEnergySecondary=0.0;
1035 fCosThetaSecondary=1.0;
1036 fTargetOscillator =
G4int(numberOfOscillators-1);
1049 G4bool loopAgain =
false;
1054 G4double phi = 1.0-rk*(bha1-rk*(bha2-rk*(bha3-bha4*rk)));
1059 G4double deltaE = rk*kineticEnergy;
1060 fKineticEnergy1 = kineticEnergy - deltaE;
1061 fCosThetaPrimary = std::sqrt(fKineticEnergy1*rb/(kineticEnergy*(rb-deltaE)));
1063 fEnergySecondary = deltaE - ionEne;
1064 fCosThetaSecondary= std::sqrt(deltaE*rb/(kineticEnergy*(deltaE+2.0*electron_mass_c2)));
1065 if (fVerboseLevel > 3)
1066 G4cout <<
"SampleFinalStatePositron: sampled close collision " <<
G4endl;
1073 fKineticEnergy1 = kineticEnergy - deltaE;
1076 G4double QS = QM/(1.0+QM*0.5/electron_mass_c2);
1078 - (QS*0.5/electron_mass_c2));
1079 G4double QTREV = Q*(Q+2.0*electron_mass_c2);
1080 G4double cpps = fKineticEnergy1*(fKineticEnergy1+2.0*electron_mass_c2);
1081 fCosThetaPrimary = (cpps+cps-QTREV)/(2.0*cp*std::sqrt(cpps));
1082 if (fCosThetaPrimary > 1.)
1083 fCosThetaPrimary = 1.0;
1085 fEnergySecondary = deltaE - ionEne;
1086 fCosThetaSecondary = 0.5*(deltaE*(kineticEnergy+rb-deltaE)+QTREV)/std::sqrt(cps*QTREV);
1087 if (fCosThetaSecondary > 1.0)
1088 fCosThetaSecondary = 1.0;
1089 if (fVerboseLevel > 3)
1090 G4cout <<
"SampleFinalStatePositron: sampled distant longitudinal collision " <<
G4endl;
1095 fCosThetaPrimary = 1.0;
1097 fEnergySecondary = deltaE - ionEne;
1098 fCosThetaSecondary = 0.5;
1100 if (fVerboseLevel > 3)
1101 G4cout <<
"SampleFinalStatePositron: sampled distant transverse collision " <<
G4endl;
G4TemplateAutoLock< G4Mutex > G4AutoLock
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Log(G4double x)
G4ThreeVector G4ParticleMomentum
std::vector< G4PenelopeOscillator * > G4PenelopeOscillatorTable
#define G4MUTEX_INITIALIZER
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
G4AtomicShell * Shell(G4int Z, std::size_t shellIndex) const
static G4AtomicTransitionManager * Instance()
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * Definition()
static G4Electron * Electron()
static G4EmParameters * Instance()
const G4String & PIXEElectronCrossSectionModel()
static G4Gamma * Definition()
static G4LossTableManager * Instance()
G4VAtomDeexcitation * AtomDeexcitation()
const G4Material * GetMaterial() const
G4double GetTotNbOfAtomsPerVolume() const
const G4String & GetName() const
const G4String & GetParticleName() const
G4double GetTotalCrossSection(G4double energy) const
Returns total cross section at the given energy.
G4double GetSoftStoppingPower(G4double energy) const
Returns the total stopping power due to soft collisions.
G4double GetHardCrossSection(G4double energy) const
Returns hard cross section at the given energy.
G4double GetNormalizedShellCrossSection(size_t shellID, G4double energy) const
Returns the hard cross section for the given shell (normalized to 1).
G4ParticleChangeForLoss * fParticleChange
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void InitialiseLocal(const G4ParticleDefinition *, G4VEmModel *) override
virtual ~G4PenelopeIonisationModel()
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double, G4double, G4double, G4double, G4double) override
G4double ComputeDEDXPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy) override
G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *theParticle, G4double kineticEnergy, G4double cutEnergy, G4double maxEnergy=DBL_MAX) override
G4double MinEnergyCut(const G4ParticleDefinition *, const G4MaterialCutsCouple *) override
const G4ParticleDefinition * fParticle
G4PenelopeIonisationModel(const G4ParticleDefinition *p=nullptr, const G4String &processName="PenIoni")
G4double GetDensityCorrection(const G4Material *, const G4double energy) const
Returns the density coeection for the material at the given energy.
const G4PenelopeCrossSection * GetCrossSectionTableForCouple(const G4ParticleDefinition *, const G4Material *, const G4double cut) const
static G4PenelopeOscillatorManager * GetOscillatorManager()
G4PenelopeOscillatorTable * GetOscillatorTableIonisation(const G4Material *)
static G4Positron * Positron()
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
G4bool IsPIXEActive() const
void SetHighEnergyLimit(G4double)
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
virtual void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double kineticEnergy)
void SetDeexcitationFlag(G4bool val)
G4VEmModel(const G4String &nam)
G4ParticleChangeForLoss * GetParticleChangeForLoss()