72 G4cout <<
"MicroElec Elastic model is constructed " <<
G4endl 87 std::map< G4String,G4MicroElecCrossSectionDataSet*,std::less<G4String> >::iterator
pos;
107 G4cout <<
"Calling G4MicroElecElasticModel::Initialise()" <<
G4endl;
113 G4cout <<
"G4MicroElecElasticModel: low energy limit increased from " <<
120 G4cout <<
"G4MicroElecElasticModel: high energy limit decreased from " <<
129 G4String fileElectron(
"microelec/sigma_elastic_e_Si");
146 char *path = getenv(
"G4LEDATA");
154 std::ostringstream eFullFileName;
155 eFullFileName << path <<
"/microelec/sigmadiff_cumulated_elastic_e_Si.dat";
156 std::ifstream eDiffCrossSection(eFullFileName.str().c_str());
158 if (!eDiffCrossSection)
159 G4Exception(
"G4MicroElecElasticModel::Initialise",
"em0003",
FatalException,
"Missing data file: /microelec/sigmadiff_cumulated_elastic_e_Si.dat");
174 while(!eDiffCrossSection.eof())
178 eDiffCrossSection>>tDummy>>eDummy;
185 eVecm[tDummy].push_back(0.);
190 if (eDummy !=
eVecm[tDummy].back())
eVecm[tDummy].push_back(eDummy);
197 G4cout <<
"Loaded cross section files for MicroElec Elastic model" <<
G4endl;
201 G4cout <<
"MicroElec Elastic model is initialized " << G4endl
223 G4cout <<
"Calling CrossSectionPerVolume() of G4MicroElecElasticModel" <<
G4endl;
241 std::map< G4String,G4MicroElecCrossSectionDataSet*,std::less<G4String> >::iterator
pos;
254 G4Exception(
"G4MicroElecElasticModel::ComputeCrossSectionPerVolume",
"em0002",
FatalException,
"Model not applicable to particle type.");
262 G4cout <<
" - Cross section per Si atom (cm^-1)=" << sigma*density/(1./
cm) << G4endl;
280 G4cout <<
"Calling SampleSecondaries() of G4MicroElecElasticModel" <<
G4endl;
302 G4double xDir = std::sqrt(1. - cosTheta*cosTheta);
304 xDir *= std::cos(phi);
305 yDir *= std::sin(phi);
307 G4ThreeVector zPrimeVers((xDir*xVers + yDir*yVers + cosTheta*zVers));
338 std::vector<double>::iterator
t1 = t2-1;
340 std::vector<double>::iterator e12 = std::upper_bound(
eVecm[(*t1)].begin(),
eVecm[(*t1)].end(), integrDiff);
341 std::vector<double>::iterator e11 = e12-1;
343 std::vector<double>::iterator e22 = std::upper_bound(
eVecm[(*t2)].begin(),
eVecm[(*t2)].end(), integrDiff);
344 std::vector<double>::iterator e21 = e22-1;
360 if (xs11==0 || xs12==0 ||xs21==0 ||xs22==0)
return (0.);
408 G4double a = (std::log10(xs2)-std::log10(xs1)) / (std::log10(e2)-std::log10(e1));
409 G4double b = std::log10(xs2) - a*std::log10(e2);
411 G4double value = (std::pow(10.,sigma));
451 integrdiff = uniformRand;
457 cosTheta= std::cos(theta*
pi/180);
G4double LowEnergyLimit() const
G4double LogLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
static G4Electron * ElectronDefinition()
G4double QuadInterpolator(G4double e11, G4double e12, G4double e21, G4double e22, G4double x11, G4double x12, G4double x21, G4double x22, G4double t1, G4double t2, G4double t, G4double e)
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
G4MicroElecElasticModel(const G4ParticleDefinition *p=0, const G4String &nam="MicroElecElasticModel")
G4double Theta(G4ParticleDefinition *aParticleDefinition, G4double k, G4double integrDiff)
std::vector< double > eTdummyVec
G4double lowEnergyLimitOfModel
G4double GetTotNbOfAtomsPerVolume() const
TriDimensionMap eDiffCrossSectionData
virtual void SampleSecondaries(std::vector< G4DynamicParticle *> *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
static G4NistManager * Instance()
void SetHighEnergyLimit(G4double)
G4double GetKineticEnergy() const
const G4String & GetParticleName() const
G4GLOB_DLL std::ostream G4cout
Hep3Vector cross(const Hep3Vector &) const
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax)
G4double LinLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
G4double HighEnergyLimit() const
G4double LinLinInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
Hep3Vector orthogonal() const
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
virtual G4bool LoadData(const G4String &argFileName)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
const G4ThreeVector & GetMomentumDirection() const
virtual ~G4MicroElecElasticModel()
G4ParticleChangeForGamma * fParticleChangeForGamma
G4double RandomizeCosTheta(G4double k)
void SetLowEnergyLimit(G4double)
const G4Material * GetBaseMaterial() const
static const G4double pos
G4ParticleChangeForGamma * GetParticleChangeForGamma()
virtual G4double FindValue(G4double e, G4int componentId=0) const