58 for(
G4int i=0; i<numOfCouples; ++i)
69 Z =
G4lrint((*theElementVector)[0]->GetZ());
93 G4cout <<
"ELSEPA Elastic model is constructed for "
153 G4cout <<
"Calling G4DNAELSEPAElasticModel::Initialise()" <<
G4endl;
159 G4Exception(
"G4DNAELSEPAElasticModel::Initialise",
"em0001",
178 for(
G4int i=0; i<numOfCouples; ++i)
195 G4String fileZElectron(
"dna/sigma_elastic_e_elsepa_Z");
196 std::ostringstream oss;
198 oss.clear(stringstream::goodbit);
200 fileZElectron += oss.str()+
"_muffintin";
214 std::ostringstream eFullFileNameZ;
215 char *path = getenv(
"G4LEDATA");
218 G4Exception(
"G4DNAELSEPAElasticModel::Initialise",
"em0002",
223 eFullFileNameZ.str(
"");
224 eFullFileNameZ.clear(stringstream::goodbit);
228 <<
"/dna/sigmadiff_cumulated_elastic_e_elsepa_Z"
229 <<
Z <<
"_muffintin.dat";
231 std::ifstream eDiffCrossSectionZ(eFullFileNameZ.str().c_str());
233 if (!eDiffCrossSectionZ)
235 G4Exception(
"G4DNAELSEPAElasticModel::Initialise",
"em0003",
254 eDiffCrossSectionZ>>eDummy>>cumDummy;
267 if (cumDummy !=
eCum_Au[eDummy].back())
270 eCum_Au[eDummy].push_back(cumDummy);
272 }
while(!eDiffCrossSectionZ.eof());
276 if(
material->GetName()==
"G4_WATER"){
279 G4cout<<
"G4DNAELSEPAElasticModel: low energy limit increased from "
287 G4cout<<
"G4DNAELSEPAElasticModel: high energy limit decreased from "
293 G4String fileZElectron(
"dna/sigma_elastic_e_elsepa_muffin");
307 std::ostringstream eFullFileNameZ;
309 char *path = getenv(
"G4LEDATA");
312 G4Exception(
"G4DNAELSEPAElasticModel::Initialise",
"em0004",
317 eFullFileNameZ.str(
"");
318 eFullFileNameZ.clear(stringstream::goodbit);
322 <<
"/dna/sigmadiff_cumulated_elastic_e_elsepa_muffin.dat";
324 std::ifstream eDiffCrossSectionZ(eFullFileNameZ.str().c_str());
326 if (!eDiffCrossSectionZ)
327 G4Exception(
"G4DNAELSEPAElasticModel::Initialise",
"em0005",
329 "Missing data file for cumulated DCS");
346 eDiffCrossSectionZ>>eDummy>>cumDummy;
358 if (cumDummy !=
eCum_H2O[eDummy].back()){
360 eCum_H2O[eDummy].push_back(cumDummy);
362 }
while(!eDiffCrossSectionZ.eof());
366 G4cout <<
"Loaded cross section files of ELSEPA Elastic model for"
371 G4cout <<
"ELSEPA elastic model is initialized " <<
G4endl
399 "Calling CrossSectionPerVolume() of G4DNAELSEPAElasticModel"
415 atomicNDensity =
material->GetAtomicNumDensityVector()[0];
416 if(atomicNDensity!= 0.0)
450 G4cout <<
"__________________________________" <<
G4endl;
451 G4cout <<
"=== G4DNAELSEPAElasticModel - XS INFO START" <<
G4endl;
452 G4cout <<
"=== Material is made of one element with Z =" <<
Z <<
G4endl;
453 G4cout <<
"=== Kinetic energy(eV)=" << ekin/
eV <<
" particle : "
454 << particleName <<
G4endl;
455 G4cout <<
"=== Cross section per atom for Z="<<
Z<<
" is (cm^2)"
457 G4cout <<
"=== Cross section per atom for Z="<<
Z<<
" is (cm^-1)="
458 << sigma*atomicNDensity/(1./
cm) <<
G4endl;
459 G4cout <<
"=== G4DNAELSEPAElasticModel - XS INFO END" <<
G4endl;
465 atomicNDensity = (*fpMolDensity)[
material->GetIndex()];
466 if(atomicNDensity!= 0.0)
491 G4cout <<
"__________________________________" <<
G4endl;
492 G4cout <<
"=== G4DNAELSEPAElasticModel - XS INFO START" <<
G4endl;
493 G4cout <<
"=== Kinetic energy(eV)=" << ekin/
eV
495 G4cout <<
"=== Cross section per water molecule (cm^2)="
497 G4cout <<
"=== Cross section per water molecule (cm^-1)="
498 << sigma*atomicNDensity/(1./
cm) <<
G4endl;
499 G4cout <<
"=== G4DNAELSEPAElasticModel - XS INFO END" <<
G4endl;
503 return sigma*atomicNDensity;
509 std::vector<G4DynamicParticle*>*,
518 "Calling SampleSecondaries() of G4DNAELSEPAElasticModel"
542 if (electronEnergy0>=10*
eV){
554 G4double xDir = std::sqrt(1. - cosTheta*cosTheta);
556 xDir *= std::cos(phi);
557 yDir *= std::sin(phi);
559 G4ThreeVector zPrimeVers((xDir*xVers + yDir*yVers + cosTheta*zVers));
565 if(
material->GetName()==
"G4_WATER"){
575 G4double xDir = std::sqrt(1. - cosTheta*cosTheta);
577 xDir *= std::cos(phi);
578 yDir *= std::sin(phi);
580 G4ThreeVector zPrimeVers((xDir*xVers + yDir*yVers + cosTheta*zVers));
612 std::vector<G4double>::iterator
e2;
621 std::vector<G4double>::iterator
e1 =
e2 - 1;
626 std::vector<G4double>::iterator cum12;
628 cum12 = std::upper_bound(
eCum_H2O[(*
e1)].begin(),
631 cum12 = std::upper_bound(
eCum_Au[(*
e1)].begin(),
635 std::vector<G4double>::iterator cum11 = cum12 - 1;
640 std::vector<G4double>::iterator cum22;
642 cum22 = std::upper_bound(
eCum_H2O[(*
e2)].begin(),
645 cum22 = std::upper_bound(
eCum_Au[(*
e2)].begin(),
649 std::vector<G4double>::iterator cum21 = cum22 - 1;
677 if (a11 == 0 && a12 == 0 && a21 == 0 && a22 == 0)
return (0.);
680 a11, a12,a21, a22, valueE1, valueE2, k, integrDiff);
696 value = xs1 + a/(a+b)*(xs2-xs1);
743 G4double a = (std::log10(xs2) - std::log10(xs1))
744 / (std::log10(
e2) - std::log10(
e1));
745 G4double b = std::log10(xs2) - a * std::log10(
e2);
746 G4double sigma = a * std::log10(e) + b;
747 G4double value = (std::pow(10., sigma));
802 cosTheta = std::cos(theta *
CLHEP::pi / 180.);
813 if (threshold < 10 *
eV)
815 G4cout<<
"*** WARNING : the G4DNAELSEPAElasticModel model is not "
816 "defined below 10 eV !" <<
G4endl;
static const G4double e1[44]
static const G4double e2[44]
std::vector< const G4Element * > G4ElementVector
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
static constexpr double eV
static constexpr double GeV
static constexpr double MeV
static constexpr double pi
static constexpr double cm
CLHEP::Hep3Vector G4ThreeVector
G4GLOB_DLL std::ostream G4cout
Hep3Vector orthogonal() const
Hep3Vector cross(const Hep3Vector &) const
virtual G4double FindValue(G4double e, G4int componentId=0) const
virtual G4bool LoadData(const G4String &argFileName)
virtual ~G4DNAELSEPAElasticModel()
const std::vector< G4double > * fpMolDensity
virtual G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *particle, G4double ekin, G4double emin, G4double emax)
std::vector< G4double > eEdummyVec_Au
G4double LogLinInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
G4double LinLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
G4double Theta(G4int Z, G4ParticleDefinition *aParticleDefinition, G4double k, G4double integrDiff)
G4double fhighEnergyLimit
G4double LogLogInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
G4DNAELSEPAElasticModel(const G4ParticleDefinition *particle=0, const G4String &nam="DNAELSEPAElasticModel")
G4double LinLinInterpolate(G4double e1, G4double e2, G4double e, G4double xs1, G4double xs2)
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)
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
std::vector< G4double > eEdummyVec_H2O
TriDimensionMap fAngleData_H2O
TriDimensionMap fAngleData_Au
G4double fkillBelowEnergy_Au
void SetKillBelowThreshold(G4double threshold)
G4double RandomizeCosTheta(G4int Z, G4double k)
virtual void Initialise(const G4ParticleDefinition *particle, const G4DataVector &)
G4ParticleChangeForGamma * fParticleChangeForGamma
G4DNACrossSectionDataSet * fpData_H2O
G4DNACrossSectionDataSet * fpData_Au
static G4DNAMolecularMaterial * Instance()
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
static G4Electron * ElectronDefinition()
const G4Material * GetMaterial() const
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
const G4String & GetParticleName() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
void SetHighEnergyLimit(G4double)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
void SetLowEnergyLimit(G4double)
void ProposeTrackStatus(G4TrackStatus status)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
static constexpr double pi