48 fpMaterialDensity =
nullptr;
49 fLowEnergyLimit = 10 * eV;
50 fHighEnergyLimit = 1.0 * GeV;
52 for(
int & i : nValenceElectron) i=0;
58 G4cout <<
"Quinn plasmon excitation model is constructed " <<
G4endl;
75 for(
int & i : nValenceElectron) i=0;
80 "Calling G4DNAQuinnPlasmonExcitationModel::Initialise()"
86 fLowEnergyLimit = 10 * eV;
87 fHighEnergyLimit = 1.0 * GeV;
91 G4Exception(
"G4DNAQuinnPlasmonExcitationModel::Initialise",
"em0001",
102 for(
G4int i=0;i<numOfCouples;i++){
117 nValenceElectron[z] = GetNValenceElectron(z);
121 G4Exception(
"G4DNAQuinnPlasmonExcitationModel::Initialise",
"em0002",
133 G4cout <<
"Quinn plasmon excitation model is initialized " <<
G4endl
141 if (isInitialised){
return;}
143 isInitialised =
true;
155 if (verboseLevel > 3)
158 "Calling CrossSectionPerVolume() of G4DNAQuinnPlasmonExcitationModel"
167 if (z!=79){
return 0.;}
173 if(atomicNDensity!= 0.0)
175 if (ekin >= fLowEnergyLimit && ekin < fHighEnergyLimit)
180 if (verboseLevel > 2)
183 G4cout<<
"=== G4DNAQuinnPlasmonExcitationModel - XS INFO START"<<
G4endl;
184 G4cout<<
"=== Kinetic energy (eV)=" << ekin/eV <<
" particle : "
186 G4cout<<
"=== Cross section per atom for Z="<<z<<
" is (cm^2)"
188 G4cout<<
"=== Cross section per atom for Z="<<z<<
" is (cm^-1)="
189 <<sigma*atomicNDensity/(1./cm) <<
G4endl;
190 G4cout<<
"=== G4DNAQuinnPlasmonExcitationModel - XS INFO END" <<
G4endl;
194 return sigma*atomicNDensity;
200 (std::vector<G4DynamicParticle*>* ,
206 if (verboseLevel > 3)
209 "Calling SampleSecondaries() of G4DNAQuinnPlasmonExcitationModel"
226 if(z<100) Nve = nValenceElectron[z];
230 G4double veDens = Dens*CLHEP::Avogadro*Nve/
A;
232 G4double omega_p = std::sqrt(veDens*std::pow(e,2)/
233 (CLHEP::epsilon0/(1./cm)*CLHEP::electron_mass_c2
234 /(CLHEP::c_squared/cm/cm)));
236 G4double excitationEnergy = CLHEP::hbar_Planck*omega_p;
237 G4double newEnergy = k - excitationEnergy;
274 if(z<100) Nve = nValenceElectron[z];
277 G4double veDens = Dens*CLHEP::Avogadro*Nve/
A;
279 G4double omega_p = std::sqrt(veDens*std::pow(e,2)
280 /(CLHEP::epsilon0/(1./cm)*CLHEP::electron_mass_c2/
281 (CLHEP::c_squared/cm/cm)));
283 G4double fEnergy = std::pow(CLHEP::h_Planck,2)/(8*CLHEP::electron_mass_c2)*
284 std::pow(3*veDens/CLHEP::pi,2./3.)/e
285 *(CLHEP::c_squared/cm/cm);
287 G4double p0 = sqrt(2*CLHEP::electron_mass_c2
288 /(CLHEP::c_squared/cm/cm)*fEnergy);
290 G4double p = sqrt(2*CLHEP::electron_mass_c2
291 /(CLHEP::c_squared/cm/cm)*kineticEnergy);
293 G4double mfp = 2*CLHEP::Bohr_radius/cm*kineticEnergy
294 /(CLHEP::hbar_Planck*omega_p)/
295 (
G4Log((std::pow(std::pow(p0,2)
296 +2*CLHEP::electron_mass_c2/
297 (CLHEP::c_squared/cm/cm)*omega_p
298 *CLHEP::hbar_Planck,1./2.)-p0)
299 /(p-std::pow(std::pow(p,2)-2*CLHEP::electron_mass_c2/
300 (CLHEP::c_squared/cm/cm)*omega_p
301 *CLHEP::hbar_Planck,1./2.))));
303 G4double excitationEnergy = CLHEP::hbar_Planck*omega_p;
305 if((0<mfp)&&(0<veDens)&&(excitationEnergy<kineticEnergy)){
306 value = 1./(veDens*mfp);
314G4int G4DNAQuinnPlasmonExcitationModel::GetNValenceElectron(
G4int z)
320 if (z!=79){
return 0.;}
322 if (verboseLevel > 3)
325 "Calling GetNValenceElectron() of G4DNAQuinnPlasmonExcitationModel"
329 const char *datadir=
nullptr;
331 if(datadir ==
nullptr)
334 if(datadir ==
nullptr)
336 G4Exception(
"G4DNAQuinnPlasmonExcitationModel::GetNValenceElectron()"
338 "Enviroment variable G4LEDATA not defined");
343 std::ostringstream targetfile;
345 targetfile.clear(stringstream::goodbit);
346 targetfile << datadir <<
"/dna/atomicstate_Z"<< z <<
".dat";
347 std::ifstream fin(targetfile.str().c_str());
351 G4cout<<
" Error : "<< targetfile.str() <<
" is not found "<<endl;
352 G4Exception(
"G4DNAQuinnPlasmonExcitationModel::GetNValenceElectron()"
354 "There is no target file");
358 string buff0,buff1,buff2,buff3,buff4,buff5,buff6;
359 fin >> buff0 >>buff1>>buff2>>buff3>>buff4>>buff5>>buff6;
362 fin >> buff0 >>buff1>>buff2>>buff3>>buff4>>buff5>>buff6;
std::vector< const G4Element * > G4ElementVector
const char * G4FindDataDir(const char *)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double G4Log(G4double x)
G4GLOB_DLL std::ostream G4cout
void Initialise(const G4ParticleDefinition *, const G4DataVector &= *(new G4DataVector())) override
G4double CrossSectionPerVolume(const G4Material *material, const G4ParticleDefinition *p, G4double ekin, G4double emin, G4double emax) override
~G4DNAQuinnPlasmonExcitationModel() override
virtual G4double GetCrossSection(const G4Material *material, const G4ParticleDefinition *, G4double kineticEnergy)
void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy) override
G4ParticleChangeForGamma * fParticleChangeForGamma
G4DNAQuinnPlasmonExcitationModel(const G4ParticleDefinition *p=nullptr, const G4String &nam="DNAQuinnPlasmonExcitationModel")
const G4ThreeVector & GetMomentumDirection() const
G4ParticleDefinition * GetDefinition() const
G4double GetKineticEnergy() const
static G4Electron * ElectronDefinition()
const G4Material * GetMaterial() const
G4double GetDensity() const
const G4ElementVector * GetElementVector() const
const G4double * GetAtomicNumDensityVector() const
std::size_t GetNumberOfElements() const
void SetProposedKineticEnergy(G4double proposedKinEnergy)
const G4String & GetParticleName() const
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double LowEnergyLimit() const
G4double HighEnergyLimit() const
void ProposeLocalEnergyDeposit(G4double anEnergyPart)