54 G4cout <<
"*******************************************************************************" <<
G4endl;
55 G4cout <<
"*******************************************************************************" <<
G4endl;
56 G4cout <<
" The name of the class G4MuElecElasticModel is changed to G4MicroElecElasticModel. " <<
G4endl;
57 G4cout <<
" The obsolete class will be REMOVED with the next release of Geant4. " <<
G4endl;
58 G4cout <<
"*******************************************************************************" <<
G4endl;
59 G4cout <<
"*******************************************************************************" <<
G4endl;
81 G4cout <<
"MuElec Elastic model is constructed " << G4endl
96 std::map< G4String,G4MuElecCrossSectionDataSet*,std::less<G4String> >::iterator
pos;
116 G4cout <<
"Calling G4MuElecElasticModel::Initialise()" <<
G4endl;
122 G4cout <<
"G4MuElecElasticModel: low energy limit increased from " <<
129 G4cout <<
"G4MuElecElasticModel: high energy limit decreased from " <<
138 G4String fileElectron(
"microelec/sigma_elastic_e_Si");
155 char *path = getenv(
"G4LEDATA");
163 std::ostringstream eFullFileName;
164 eFullFileName << path <<
"/microelec/sigmadiff_elastic_e_Si.dat";
165 std::ifstream eDiffCrossSection(eFullFileName.str().c_str());
167 if (!eDiffCrossSection)
168 G4Exception(
"G4MuElecElasticModel::Initialise",
"em0003",
FatalException,
"Missing data file: /microelec/sigmadiff_elastic_e_Si.dat");
172 while(!eDiffCrossSection.eof())
176 eDiffCrossSection>>tDummy>>eDummy;
182 eVecm[tDummy].push_back(0.);
188 if (!eDiffCrossSection.eof()) eDiffCrossSectionData[tDummy][eDummy]*=scaleFactor;
190 if (eDummy !=
eVecm[tDummy].back())
eVecm[tDummy].push_back(eDummy);
197 G4cout <<
"Loaded cross section files for MuElec Elastic model" <<
G4endl;
201 G4cout <<
"MuElec Elastic model is initialized " << G4endl
224 G4cout <<
"Calling CrossSectionPerVolume() of G4MuElecElasticModel" <<
G4endl;
242 std::map< G4String,G4MuElecCrossSectionDataSet*,std::less<G4String> >::iterator
pos;
255 G4Exception(
"G4MuElecElasticModel::ComputeCrossSectionPerVolume",
"em0002",
FatalException,
"Model not applicable to particle type.");
263 G4cout <<
" - Cross section per Si atom (cm^-1)=" << sigma*density/(1./
cm) << G4endl;
281 G4cout <<
"Calling SampleSecondaries() of G4MuElecElasticModel" <<
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));
337 std::vector<double>::iterator t2 = std::upper_bound(eTdummyVec.begin(),eTdummyVec.end(), k);
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;
353 xs11 = eDiffCrossSectionData[valueT1][valueE11];
354 xs12 = eDiffCrossSectionData[valueT1][valueE12];
355 xs21 = eDiffCrossSectionData[valueT2][valueE21];
356 xs22 = eDiffCrossSectionData[valueT2][valueE22];
360 if (xs11==0 || xs12==0 ||xs21==0 ||xs22==0)
return (0.);
362 theta = QuadInterpolator( valueE11, valueE12,
382 G4double value = std::exp(d1 + (d2 - d1)*(e - e1)/ (e2 - e1));
394 G4double a = (std::log10(xs2)-std::log10(xs1)) / (std::log10(e2)-std::log10(e1));
395 G4double b = std::log10(xs2) - a*std::log10(e2);
396 G4double sigma = a*std::log10(e) + b;
397 G4double value = (std::pow(10.,sigma));
423 integrdiff = uniformRand;
429 cosTheta= std::cos(theta*
pi/180);
static G4Electron * ElectronDefinition()
G4double LowEnergyLimit() const
G4Material * FindOrBuildMaterial(const G4String &name, G4bool isotopes=true, G4bool warning=false)
virtual G4double FindValue(G4double e, G4int componentId=0) const
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
std::vector< double > eTdummyVec
G4double LinLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
G4double HighEnergyLimit() const
virtual G4bool LoadData(const G4String &argFileName)
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
static G4NistManager * Instance()
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
virtual ~G4MuElecElasticModel()
const G4String & GetParticleName() const
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
G4double RandomizeCosTheta(G4double k)
void SetHighEnergyLimit(G4double)
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax)
G4GLOB_DLL std::ostream G4cout
G4double LogLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
const G4ThreeVector & GetMomentumDirection() const
G4double lowEnergyLimitOfModel
G4MuElecElasticModel(const G4ParticleDefinition *p=0, const G4String &nam="MuElecElasticModel")
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
G4double Theta(G4ParticleDefinition *aParticleDefinition, G4double k, G4double integrDiff)
TriDimensionMap eDiffCrossSectionData
G4double GetTotNbOfAtomsPerVolume() const
const G4Material * GetBaseMaterial() const
G4ParticleChangeForGamma * fParticleChangeForGamma
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeTrackStatus(G4TrackStatus status)
void SetLowEnergyLimit(G4double)
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)
static const G4double pos
G4ParticleChangeForGamma * GetParticleChangeForGamma()