91 lines
4.5 KiB
Plaintext
91 lines
4.5 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: G4DNAIonizationInWater.icc,v 1.4 2006/06/29 19:34:45 gunter Exp $
|
|
// GEANT4 tag $Name: geant4-08-01 $
|
|
//
|
|
|
|
#ifdef G4DNAIONIZATIONINWATER_HH
|
|
#include "G4Electron.hh"
|
|
|
|
template<typename TotalCrossSectionPolicy, typename FinalStatesPolicy>
|
|
G4VParticleChange* G4DNAIonizationInWater<TotalCrossSectionPolicy, FinalStatesPolicy> :: 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<TotalCrossSectionPolicy, FinalStatesPolicy>::PostStepDoIt(aTrack, aStep);
|
|
}
|
|
#endif /* G4DNAIONIZATIONINWATER_HH */
|