// // ******************************************************************** // * 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: G4DNAIonizationInWater.icc,v 1.4 2006/06/29 19:34:45 gunter Exp $ // GEANT4 tag $Name: geant4-08-02 $ // #ifdef G4DNAIONIZATIONINWATER_HH #include "G4Electron.hh" template G4VParticleChange* G4DNAIonizationInWater :: PostStepDoIt(const G4Track & aTrack, const G4Step & aStep) { const G4int z(10); // H2O number of electrons this->aParticleChange.Initialize(aTrack); const G4DynamicParticle* aDynamicParticle = aTrack.GetDynamicParticle(); G4double k = aDynamicParticle->GetKineticEnergy(); G4ParticleMomentum primaryDirection = aDynamicParticle->GetMomentumDirection(); G4double particleMass = aDynamicParticle->GetDefinition()->GetPDGMass(); G4double TotalEnergy = k + particleMass; G4double Psquare = k*(TotalEnergy+particleMass); G4double TotalMomentum = std::sqrt(Psquare); G4int ionizationShell(TotalCrossSectionPolicy::RandomizePartialCrossSection(k,z)); G4double secondaryKinetic(FinalStatesPolicy::RandomizeEjectedElectronEnergy(k,ionizationShell)); G4double bindingEnergy(FinalStatesPolicy::EnergyConstant(ionizationShell)); //Direction of the secondary electron G4double cosTheta = 0.; G4double phi = 0.; FinalStatesPolicy::RandomizeEjectedElectronDirection(k,secondaryKinetic, cosTheta, phi); G4double sinTheta = std::sqrt(1.-cosTheta*cosTheta); G4double dirx = sinTheta*std::cos(phi),diry = sinTheta*std::sin(phi),dirz = cosTheta; G4ThreeVector DeltaDirection(dirx,diry,dirz); DeltaDirection.rotateUz(primaryDirection); G4double DeltaTotalMomentum = std::sqrt(secondaryKinetic*(secondaryKinetic + 2.*electron_mass_c2 )); //Primary Particle Direction G4double finalPx = TotalMomentum*primaryDirection.x() - DeltaTotalMomentum*DeltaDirection.x(); G4double finalPy = TotalMomentum*primaryDirection.y() - DeltaTotalMomentum*DeltaDirection.y(); G4double finalPz = TotalMomentum*primaryDirection.z() - DeltaTotalMomentum*DeltaDirection.z(); G4double finalMomentum = std::sqrt(finalPx*finalPx+finalPy*finalPy+finalPz*finalPz); finalPx /= finalMomentum; finalPy /= finalMomentum; finalPz /= finalMomentum; this->aParticleChange.ProposeMomentumDirection( finalPx,finalPy,finalPz ); this->aParticleChange.ProposeEnergy(k-bindingEnergy-secondaryKinetic); this->aParticleChange.ProposeLocalEnergyDeposit(bindingEnergy); this->aParticleChange.SetNumberOfSecondaries(1); G4DynamicParticle* aElectron = new G4DynamicParticle(G4Electron::Electron(),DeltaDirection,secondaryKinetic); this->aParticleChange.AddSecondary(aElectron); return G4VDNAProcessInWater::PostStepDoIt(aTrack, aStep); } #endif /* G4DNAIONIZATIONINWATER_HH */