// // ******************************************************************** // * 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 G4bool G4DNARuddIonizationFinalStatesPolicy :: KillIncomingParticle(G4double energy) const { if(energy < EnergyLimitsPolicy::lowEnergyLimit) return(true); else return (false); } template void G4DNARuddIonizationFinalStatesPolicy ::BuildFinalStatesData(void) const {} template G4double G4DNARuddIonizationFinalStatesPolicy ::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 G4double G4DNARuddIonizationFinalStatesPolicy ::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 void G4DNARuddIonizationFinalStatesPolicy ::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 G4double G4DNARuddIonizationFinalStatesPolicy::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 G4double G4DNARuddIonizationFinalStatesPolicy::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 */