98 for(
size_t i=0; i<101; ++i) {
116 char* path = std::getenv(
"G4LEDATA");
121 for(
size_t i=0; i<numOfElm; ++i) {
122 G4int Z = (*theElmTable)[i]->GetZasInt();
124 else if(
Z > 100) {
Z = 100; }
138 return "/livermore/brem/br";
146 const char* datadir = path;
149 datadir = std::getenv(
"G4LEDATA");
151 G4Exception(
"G4LivermoreBremsstrahlungModel::ReadData()",
"em0006",
156 std::ostringstream ost;
158 std::ifstream fin(ost.str().c_str());
159 if( !fin.is_open()) {
161 ed <<
"Bremsstrahlung data file <" << ost.str().c_str()
162 <<
"> is not opened!";
163 G4Exception(
"G4LivermoreBremsstrahlungModel::ReadData()",
"em0003",
165 "G4LEDATA version should be G4EMLOW6.23 or later.");
177 ed <<
"Bremsstrahlung data file <" << ost.str().c_str()
178 <<
"> is not retrieved!";
179 G4Exception(
"G4LivermoreBremsstrahlungModel::ReadData()",
"em0005",
181 "G4LEDATA version should be G4EMLOW6.23 or later.");
212 else { cross *=
G4Exp(xxx); }
225 std::vector<G4DynamicParticle*>* vdp,
234 if(cut >=
emax) {
return; }
264 if(ylim > vmax) { vmax = ylim; }
266 if(x0 < 0.05) { vmax *= 1.2; }
271 if(x < 0.0) { x = 0.0; }
272 gammaEnergy = sqrt(x);
273 G4double x1 = gammaEnergy/kineticEnergy;
287 else { v *=
G4Exp(xxx); }
290 if (v > 1.05*vmax &&
nwarn < 5) {
293 ed <<
"### G4LivermoreBremsstrahlungModel Warning: Majoranta exceeded! "
294 << v <<
" > " << vmax <<
" by " << v/vmax
295 <<
" Egamma(MeV)= " << gammaEnergy
296 <<
" Ee(MeV)= " << kineticEnergy
300 ed <<
"\n ### G4LivermoreBremsstrahlungModel Warnings stopped";
302 G4Exception(
"G4LivermoreBremsstrahlungModel::SampleScattering",
"em0044",
320 vdp->push_back(gamma);
323 - gammaEnergy*gammaDirection).unit();
333 G4double finalE = kineticEnergy - gammaEnergy;
static const G4double e1[44]
static const G4double e2[44]
static const G4double emax
std::vector< G4Element * > G4ElementTable
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
static const G4double elowlimit
static const G4double epeaklimit
static const G4double alpha
G4double G4Log(G4double x)
static constexpr double twopi
static constexpr double millibarn
static constexpr double eV
static constexpr double MeV
#define G4MUTEX_INITIALIZER
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
static G4ElementTable * GetElementTable()
static size_t GetNumberOfElements()
static G4Physics2DVector * dataSB[101]
G4LivermoreBremsstrahlungModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="LowEnBrem")
virtual ~G4LivermoreBremsstrahlungModel()
static G4double ylimit[101]
G4String DirectoryPath() const
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double cutEnergy, G4double maxEnergy) override
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
void InitialiseForElement(const G4ParticleDefinition *, G4int Z) override
void ReadData(G4int Z, const char *path=0)
G4double ComputeDXSectionPerAtom(G4double gammaEnergy) override
static G4double expnumlim
G4bool useBicubicInterpolation
const G4Material * GetMaterial() 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)
virtual G4ThreeVector & SampleDirection(const G4DynamicParticle *dp, G4double finalTotalEnergy, G4int Z, const G4Material *)=0
G4VEmAngularDistribution * GetAngularDistribution()
void SetLPMFlag(G4bool val)
virtual G4double Value(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy)
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
void SetLowEnergyLimit(G4double)
void SetAngularDistribution(G4VEmAngularDistribution *)
G4double SecondaryThreshold() const
void ProposeTrackStatus(G4TrackStatus status)
G4double fPrimaryParticleMass
G4double fPrimaryKinEnergy
const G4ParticleDefinition * fPrimaryParticle
static const G4double gBremFactor
G4double fPrimaryTotalEnergy
G4ParticleDefinition * fGammaParticle
void SetupForMaterial(const G4ParticleDefinition *, const G4Material *, G4double) override
G4ParticleChangeForLoss * fParticleChange
void Initialise(const G4ParticleDefinition *, const G4DataVector &) override
static constexpr double fine_structure_const
static constexpr double keV
static constexpr double twopi
static constexpr double MeV
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
G4Mutex LivermoreBremsstrahlungModelMutex