Files
geant4/source/processes/electromagnetic/lowenergy/include/G4DNARuddIonizationFinalStatesPolicy.icc
T
2016-06-09 14:44:26 +02:00

152 lines
7.6 KiB
Plaintext

//
// ********************************************************************
// * License and Disclaimer *
// * *
// * The Geant4 software is copyright of the Copyright Holders of *
// * the Geant4 Collaboration. It is provided under the terms and *
// * conditions of the Geant4 Software License, included in the file *
// * LICENSE and available at http://cern.ch/geant4/license . These *
// * include a list of copyright holders. *
// * *
// * Neither the authors of this software system, nor their employing *
// * institutes,nor the agencies providing financial support for this *
// * work make any representation or warranty, express or implied, *
// * regarding this software system or assume any liability for its *
// * use. Please see the license in the file LICENSE and URL above *
// * for the full disclaimer and the limitation of liability. *
// * *
// * This code implementation is the result of the scientific and *
// * technical work of the GEANT4 collaboration. *
// * By using, copying, modifying or distributing the software (or *
// * any work based on the software) you agree to acknowledge its *
// * use in resulting scientific publications, and indicate your *
// * acceptance of all terms of the Geant4 Software license. *
// ********************************************************************
//
//
// $Id: G4DNARuddIonizationFinalStatesPolicy.icc,v 2005/09/19 19:08:54 Ziad FRANCIS
// GEANT4 tag $Name: geant4-08-01 $
//
#ifdef G4DNARuddIonizationFinalStatesPolicy_HH
#include "Randomize.hh"
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
G4bool G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy> :: KillIncomingParticle(G4double energy) const
{
if(energy < EnergyLimitsPolicy::lowEnergyLimit) return(true);
else return (false);
}
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
void G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy> ::BuildFinalStatesData(void) const
{}
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
G4double G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy> ::RandomizeEjectedElectronEnergy(G4double k, G4int shell) const
{
G4double maximumKineticEnergyTransfer = 4.* (electron_mass_c2 / proton_mass_c2) * k;
G4double crossSectionMaximum=0.;
for(G4double value=EnergyConstant(shell); value<=4.*EnergyConstant(shell) ; value+=0.1*eV){
G4double differentialCrossSection = DifferentialCrossSection(k, value, shell);
if(differentialCrossSection >= crossSectionMaximum) crossSectionMaximum = differentialCrossSection;
}
G4double secElecKinetic=0.;
do{
secElecKinetic = G4UniformRand() * maximumKineticEnergyTransfer;
}while(G4UniformRand()*crossSectionMaximum > DifferentialCrossSection(k,secElecKinetic+EnergyConstant(shell),shell));
return(secElecKinetic);
}
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
G4double G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy> ::CorrectionFactor(G4double k) const
{
if(IncomingParticlePolicy::IncomingParticleDefinition()->GetParticleName() == "proton") return(1);
else if(IncomingParticlePolicy::IncomingParticleDefinition()->GetParticleName() == "hydrogen") {
G4double value = (std::log(k/eV)-4.2)/0.5;
return((0.8/(1+std::exp(value))) + 0.9);
}
else return(1.);
}
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
void G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy> ::RandomizeEjectedElectronDirection(G4double k, G4double secKinetic, G4double & cosTheta, G4double & phi ) const
{
G4double maxSecKinetic = 4.* (electron_mass_c2 / proton_mass_c2) * k;
phi = twopi * G4UniformRand();
cosTheta = std::sqrt(secKinetic / maxSecKinetic);
}
template <typename EnergyLimitsPolicy,typename IncomingParticlePolicy>
G4double G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy>::EnergyConstant(G4int ionizationLevel) const
{
const G4double bindingEnergy[]={10.79*eV, 13.39*eV, 16.05*eV, 32.30*eV, 539.0*eV};
return(bindingEnergy[ionizationLevel]);
}
template <typename EnergyLimitsPolicy, typename IncomingParticlePolicy>
G4double G4DNARuddIonizationFinalStatesPolicy<EnergyLimitsPolicy, IncomingParticlePolicy>::DifferentialCrossSection(G4double k, G4double energyTransfer, G4int ionizationLevelIndex) const
{
// Shells ids are 0 1 2 3 4 (4 is k shell)
// !!Attention, "energyTransfer" here is the energy transfered to the electron which means
// that the secondary kinetic energy is w = energyTransfer - bindingEnergy
//
// ds S F1(nu) + w * F2(nu)
// ---- = G(k) * ---- -------------------------------------------
// dw Bj (1+w)^3 * [1 + exp{alpha * (w - wc) / nu}]
//
// w is the secondary electron kinetic Energy in eV
//
// All the other parameters can be found in Rudd's Papers
//
// M.Eugene Rudd, 1988, User-Friendly model for the energy distribution of
// electrons from protons or electron collisions. Nucl. Tracks Rad. Meas.Vol 16 N0 2/3 pp 219-218
//
const G4int j=ionizationLevelIndex;
G4double A1 ; G4double B1 ; G4double C1 ; G4double D1 ; G4double E1 ;
G4double A2 ; G4double B2 ; G4double C2 ; G4double D2 ; G4double Alpha ;
if(j == 4) {//Data For Liquid Water K SHELL from Dingfelder (Protons in Water)
A1 = 1.25; B1 = 0.5; C1 = 1.00; D1 = 1.00; E1 = 3.00; A2 = 1.10; B2 = 1.30;
C2 = 1.00; D2 = 0.00; Alpha = 0.66;}
else {//Data For Liquid Water from Dingfelder (Protons in Water)
A1 = 1.02; B1 = 82.0; C1 = 0.45; D1 = -0.80; E1 = 0.38; A2 = 1.07; B2 = 14.6;
C2 = 0.60; D2 = 0.04; Alpha = 0.64;}
const G4double n = 2.;
const G4double Gj[5] = {0.99, 1.11, 1.11, 0.52, 1.};
//const G4double I[5]={12.61*eV, 14.73*eV, 18.55*eV, 32.2*eV, 539.7*eV}; // for water Vapor
//const G4double energyConstant[]={10.79*eV, 13.39*eV, 16.05*eV, 32.30*eV, 539.*eV};
G4double W = (energyTransfer - EnergyConstant(ionizationLevelIndex));
G4double w = W / EnergyConstant(ionizationLevelIndex);
G4double Ry = 13.6*eV;
G4double tau = (electron_mass_c2/proton_mass_c2) * k ;
G4double S = 4.*pi*Bohr_radius*Bohr_radius*n*std::pow((Ry/EnergyConstant(ionizationLevelIndex)),2);
G4double v2 = tau / EnergyConstant(ionizationLevelIndex);
G4double v = std::sqrt(v2);
G4double wc = 4.*v2 - 2.*v - (Ry/(4.*EnergyConstant(ionizationLevelIndex)));
G4double L1 = (C1* std::pow(v,(D1))) / (1.+ E1*std::pow(v, (D1+4.)));
G4double L2 = C2*std::pow(v,(D2));
G4double H1 = (A1*std::log(1.+v2)) / (v2+(B1/v2));
G4double H2 = (A2/v2) + (B2/(v2*v2));
G4double F1 = L1+H1;
G4double F2 = (L2*H2)/(L2+H2);
G4double sigma = CorrectionFactor(k/eV) * Gj[j] * (S/EnergyConstant(ionizationLevelIndex)) * ( (F1+w*F2) / ( std::pow((1.+w),3) * ( 1.+std::exp(Alpha*(w-wc)/v))) );
return(sigma);
}
#endif /* G4DNARuddIonizationTotalCrossSectionPolicy_HH */