Files
geant4/source/processes/electromagnetic/lowenergy/src/G4hBetheBlochModel.cc
T
2016-06-08 16:57:27 +02:00

227 lines
7.3 KiB
C++

//
// ********************************************************************
// * DISCLAIMER *
// * *
// * The following disclaimer summarizes all the specific disclaimers *
// * of contributors to this software. The specific disclaimers,which *
// * govern, are listed with their locations in: *
// * http://cern.ch/geant4/license *
// * *
// * 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. *
// * *
// * This code implementation is the intellectual property of the *
// * GEANT4 collaboration. *
// * By copying, distributing or modifying the Program (or any work *
// * based on the Program) you indicate your acceptance of this *
// * statement, and all its terms. *
// ********************************************************************
//
//
// -------------------------------------------------------------------
//
// GEANT4 Class file
//
//
// File name: G4hBetheBlochModel
//
// Author: V.Ivanchenko (Vladimir.Ivanchenko@cern.ch)
//
// Creation date: 20 July 2000
//
// Modifications:
// 20/07/2000 V.Ivanchenko First implementation
// 03/10/2000 V.Ivanchenko clean up accoding to CodeWizard
//
// Class Description:
//
// Bethe-Bloch ionisation model
//
// Class Description: End
//
// -------------------------------------------------------------------
//
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
#include "G4hBetheBlochModel.hh"
#include "G4DynamicParticle.hh"
#include "G4ParticleDefinition.hh"
#include "G4Material.hh"
#include "globals.hh"
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4hBetheBlochModel::G4hBetheBlochModel(const G4String& name)
: G4VLowEnergyModel(name),
lowEnergyLimit(1.*MeV),
highEnergyLimit(100.*GeV),
twoln10(2.*log(10.)),
bg2lim(0.0169),
taulim(8.4146e-3)
{;}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4hBetheBlochModel::~G4hBetheBlochModel()
{;}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::TheValue(const G4DynamicParticle* particle,
const G4Material* material)
{
G4double energy = particle->GetKineticEnergy() ;
G4double particleMass = particle->GetMass() ;
G4double eloss = BetheBlochFormula(material,energy,particleMass) ;
return eloss ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::TheValue(const G4ParticleDefinition* aParticle,
const G4Material* material,
G4double kineticEnergy)
{
G4double particleMass = aParticle->GetPDGMass() ;
G4double eloss = BetheBlochFormula(material,kineticEnergy,particleMass) ;
return eloss ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::HighEnergyLimit(
const G4ParticleDefinition* aParticle,
const G4Material* material) const
{
return highEnergyLimit ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::LowEnergyLimit(
const G4ParticleDefinition* aParticle,
const G4Material* material) const
{
G4double taul = (material->GetIonisation()->GetTaul())*
(aParticle->GetPDGMass()) ;
return taul ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::HighEnergyLimit(
const G4ParticleDefinition* aParticle) const
{
return highEnergyLimit ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::LowEnergyLimit(
const G4ParticleDefinition* aParticle) const
{
return lowEnergyLimit ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4bool G4hBetheBlochModel::IsInCharge(const G4DynamicParticle* particle,
const G4Material* material) const
{
return true ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4bool G4hBetheBlochModel::IsInCharge(const G4ParticleDefinition* aParticle,
const G4Material* material) const
{
return true ;
}
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double G4hBetheBlochModel::BetheBlochFormula(
const G4Material* material,
G4double kineticEnergy,
G4double particleMass) const
{
// This member function is applied normally to proton/antiproton
G4double ionloss ;
G4double rateMass = electron_mass_c2/particleMass ;
G4double taul = material->GetIonisation()->GetTaul() ;
G4double tau = kineticEnergy/particleMass ; // tau is relative energy
// It is not normal case for this function
// for low energy parametrisation have to be applied
if ( tau < taul ) tau = taul ;
// some local variables
G4double gamma,bg2,beta2,tmax,x,delta,sh ;
G4double electronDensity = material->GetElectronDensity();
G4double eexc = material->GetIonisation()->GetMeanExcitationEnergy();
G4double eexc2 = eexc*eexc ;
G4double cden = material->GetIonisation()->GetCdensity();
G4double mden = material->GetIonisation()->GetMdensity();
G4double aden = material->GetIonisation()->GetAdensity();
G4double x0den = material->GetIonisation()->GetX0density();
G4double x1den = material->GetIonisation()->GetX1density();
G4double* shellCorrectionVector =
material->GetIonisation()->GetShellCorrectionVector();
gamma = tau + 1.0 ;
bg2 = tau*(tau+2.0) ;
beta2 = bg2/(gamma*gamma) ;
tmax = 2.*electron_mass_c2*bg2/(1.+2.*gamma*rateMass+rateMass*rateMass) ;
ionloss = log(2.0*electron_mass_c2*bg2*tmax/eexc2)-2.0*beta2 ;
// density correction
x = log(bg2)/twoln10 ;
if ( x < x0den ) {
delta = 0.0 ;
} else {
delta = twoln10*x - cden ;
if ( x < x1den ) delta += aden*pow((x1den-x),mden) ;
}
// shell correction
sh = 0.0 ;
x = 1.0 ;
if ( bg2 > bg2lim ) {
for (G4int k=0; k<=2; k++) {
x *= bg2 ;
sh += shellCorrectionVector[k]/x;
}
} else {
for (G4int k=0; k<=2; k++) {
x *= bg2lim ;
sh += shellCorrectionVector[k]/x;
}
sh *= log(tau/taul)/log(taulim/taul) ;
}
// now compute the total ionization loss
ionloss -= delta + sh ;
ionloss *= twopi_mc2_rcl2*electronDensity/beta2 ;
if ( ionloss < 0.0) ionloss = 0.0 ;
return ionloss;
}