91 fIsUseSamplingTables(true), fNumWarnings(0), fIndx(0), fIndy(0)
103 for (
size_t iz = 0; iz <
gMaxZet; ++iz) {
127 size_t numOfCouples = theCoupleTable->GetTableSize();
128 for(
size_t j=0; j<numOfCouples; ++j) {
129 auto mat = theCoupleTable->GetMaterialCutsCouple(j)->GetMaterial();
130 auto elmVec = mat->GetElementVector();
131 for (
auto & elm : *elmVec) {
163 const char* path = std::getenv(
"G4LEDATA");
165 std::ostringstream ost;
166 ost << path <<
"/brem_SB/br";
169 G4Exception(
"G4SeltzerBergerModel::FindDirectoryPath()",
"em0006",
171 "Environment variable G4LEDATA not defined");
181#ifdef G4MULTITHREADED
186 std::ostringstream ost;
188 std::ifstream fin(ost.str().c_str());
189 if (!fin.is_open()) {
191 ed <<
"Bremsstrahlung data file <" << ost.str().c_str()
192 <<
"> is not opened!";
194 ed,
"G4LEDATA version should be G4EMLOW6.23 or later.");
207 ed <<
"Bremsstrahlung data file <" << ost.str().c_str()
208 <<
"> is not retrieved!";
210 ed,
"G4LEDATA version should be G4EMLOW6.23 or later.");
213#ifdef G4MULTITHREADED
241 const G4double invbeta1 = std::sqrt(invb2);
249 dxsec *=
G4Exp(dum0);
275 logKinEnergy, tmin, tmax);
291 if (gammaEnergy <= 0.) {
302 vdp->push_back(gamma);
307 const G4double finalE = kinEnergy - gammaEnergy;
354 ((kinEnergy>kEPeakLim) || (kinEnergy<kELowLim))) {
364 static const G4int kNCountMax = 100;
389 ed <<
"### G4SeltzerBergerModel Warning: Majoranta exceeded! "
390 << v <<
" > " << vmax <<
" by " << v/vmax
392 <<
" Egamma(MeV)= " << gammaEnergy
393 <<
" Ee(MeV)= " << kinEnergy
397 ed <<
"\n ### G4SeltzerBergerModel Warnings stopped";
399 G4Exception(
"G4SeltzerBergerModel::SampleScattering",
"em0044",
402 if (v >= vmax*rndm[1]) {
static const G4double e1[44]
static const G4double e2[44]
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
static const G4double emaxlog
G4double G4Log(G4double x)
static constexpr double keV
static const G4double kAlpha
static const G4double kMC2
#define G4MUTEX_INITIALIZER
#define G4MUTEXLOCK(mutex)
#define G4MUTEXUNLOCK(mutex)
virtual void flatArray(const int size, double *vect)=0
const G4ThreeVector & GetMomentumDirection() const
G4double GetLogKineticEnergy() const
G4double GetKineticEnergy() const
static G4EmParameters * Instance()
G4bool EnableSamplingTable() const
const G4Material * GetMaterial() const
G4double GetElectronDensity() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void SetProposedMomentumDirection(const G4ThreeVector &dir)
const G4String & GetParticleName() const
G4bool Retrieve(std::ifstream &fIn)
G4double Value(G4double x, G4double y, std::size_t &lastidx, std::size_t &lastidy) const
void SetBicubicInterpolation(G4bool)
static G4ProductionCutsTable * GetProductionCutsTable()
double SampleEnergyTransfer(const G4double eekin, const G4double leekin, const G4double gcut, const G4double dielSupConst, const G4int izet, const G4int matCutIndx, const bool iselectron)
void Initialize(const G4double lowe, const G4double highe)
G4bool fIsUseSamplingTables
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double cutEnergy, G4double maxEnergy) override
static constexpr G4double gExpNumLimit
static G4String gDataDirectory
G4double SampleEnergyTransfer(const G4double kineticEnergy, const G4double logKineticEnergy, const G4double cut, const G4double emax)
G4double ComputeDXSectionPerAtom(G4double gammaEnergy) override
static G4double gYLimitData[gMaxZet]
G4bool fIsUseBicubicInterpolation
~G4SeltzerBergerModel() override
const G4String & FindDirectoryPath()
G4SeltzerBergerModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="eBremSB")
static G4SBBremTable * gSBSamplingTable
static G4Physics2DVector * gSBDCSData[gMaxZet]
static constexpr G4int gMaxZet
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
G4VEmAngularDistribution * GetAngularDistribution()
G4double LowEnergyLimit() const
G4VEmModel * GetTripletModel()
void SetLPMFlag(G4bool val)
virtual G4double Value(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
G4double HighEnergyLimit() const
void SetLowEnergyLimit(G4double)
void SetAngularDistribution(G4VEmAngularDistribution *)
const G4Element * SelectTargetAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double logKineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void InitialiseElementSelectors(const G4ParticleDefinition *, const G4DataVector &)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)=0
G4double SecondaryThreshold() const
G4ParticleChangeForLoss * GetParticleChangeForLoss()
void ProposeTrackStatus(G4TrackStatus status)
void SetParticle(const G4ParticleDefinition *p)
G4double fPrimaryKinEnergy
const G4ParticleDefinition * fPrimaryParticle
static const G4double gBremFactor
G4bool fIsScatOffElectron
G4double fPrimaryTotalEnergy
G4double fLowestKinEnergy
G4ParticleDefinition * fGammaParticle
G4ParticleChangeForLoss * fParticleChange
static const G4double gMigdalConstant
static constexpr double electron_mass_c2
static constexpr double millibarn
static constexpr double fine_structure_const
static constexpr double keV
static constexpr double twopi
static constexpr double MeV
T max(const T t1, const T t2)
brief Return the largest of the two arguments
T min(const T t1, const T t2)
brief Return the smallest of the two arguments