Import Geant4 8.3.0 source tree
This commit is contained in:
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4BetheHeitlerModel.cc,v 1.9 2006/06/29 19:52:40 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4BetheHeitlerModel.cc,v 1.10 2007/02/20 17:06:35 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -42,6 +42,8 @@
|
||||
// 24-06-05 Increase number of bins to 200 (V.Ivantchenko)
|
||||
// 16-11-05 replace shootBit() by G4UniformRand() mma
|
||||
// 04-12-05 SetProposedKineticEnergy(0.) for the killed photon (mma)
|
||||
// 20-02-20 SelectRandomElement is called for any initial gamma energy
|
||||
// in order to have selected element for polarized model (VI)
|
||||
//
|
||||
// Class Description:
|
||||
//
|
||||
@@ -208,14 +210,15 @@ std::vector<G4DynamicParticle*>* G4BetheHeitlerModel::SampleSecondaries(
|
||||
// do it fast if GammaEnergy < 2. MeV
|
||||
static const G4double Egsmall=2.*MeV;
|
||||
|
||||
// select randomly one element constituing the material
|
||||
const G4Element* anElement = SelectRandomAtom(aMaterial, theGamma, GammaEnergy);
|
||||
|
||||
if (GammaEnergy < Egsmall) {
|
||||
|
||||
epsil = epsil0 + (0.5-epsil0)*G4UniformRand();
|
||||
|
||||
} else {
|
||||
// now comes the case with GammaEnergy >= 2. MeV
|
||||
// select randomly one element constituing the material
|
||||
const G4Element* anElement = SelectRandomAtom(aMaterial, theGamma, GammaEnergy);
|
||||
|
||||
// Extract Coulomb factor for this Element
|
||||
G4double FZ = 8.*(anElement->GetIonisation()->GetlogZ3());
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4MollerBhabhaModel.cc,v 1.28 2006/08/28 17:44:36 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4MollerBhabhaModel.cc,v 1.29 2007/01/17 09:17:56 maire Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4MultipleScattering.cc,v 1.58 2006/11/23 10:07:42 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4MultipleScattering.cc,v 1.64 2007/04/24 12:00:16 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -----------------------------------------------------------------------------
|
||||
//
|
||||
@@ -118,6 +118,7 @@
|
||||
// there is no z sampling by default (L.Urban)
|
||||
// 23-10-06 skin = 1 by default (L.Urban)
|
||||
// 23-11-06 skin = 1 by default for e+-, 0 for other particles (VI)
|
||||
// 12-02-07 skin can be changed via UI command, default skin=1 (VI)
|
||||
//
|
||||
// -----------------------------------------------------------------------------
|
||||
//
|
||||
@@ -144,10 +145,6 @@ G4MultipleScattering::G4MultipleScattering(const G4String& processName)
|
||||
dtrl = 0.05;
|
||||
lambdalimit = 1.*mm;
|
||||
facgeom = 2.5;
|
||||
// there is no single scattering for this skin <= 0
|
||||
// to have single scattering at boundary
|
||||
// skin should be > 0 !
|
||||
skin = 0.0;
|
||||
|
||||
steppingAlgorithm = true;
|
||||
samplez = false ;
|
||||
@@ -158,6 +155,7 @@ G4MultipleScattering::G4MultipleScattering(const G4String& processName)
|
||||
SetMaxKinEnergy(highKineticEnergy);
|
||||
|
||||
SetLateralDisplasmentFlag(true);
|
||||
SetSkin(0.0);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -191,26 +189,37 @@ void G4MultipleScattering::InitialiseProcess(const G4ParticleDefinition* p)
|
||||
{
|
||||
if(isInitialized) {
|
||||
mscUrban->SetMscStepLimitation(steppingAlgorithm, facrange);
|
||||
if (p->GetParticleType() != "nucleus") {
|
||||
mscUrban->SetLateralDisplasmentFlag(LateralDisplasmentFlag());
|
||||
mscUrban->SetSkin(Skin());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
G4String part_name = p->GetParticleName();
|
||||
if(part_name == "e-" || part_name == "e+") skin = 1.0;
|
||||
|
||||
if (p->GetParticleType() == "nucleus") {
|
||||
SetLateralDisplasmentFlag(false);
|
||||
SetBuildLambdaTable(false);
|
||||
SetSkin(0.0);
|
||||
} else {
|
||||
SetBuildLambdaTable(true);
|
||||
}
|
||||
mscUrban = new G4UrbanMscModel(facrange,dtrl,lambdalimit,
|
||||
facgeom,skin,
|
||||
facgeom,Skin(),
|
||||
samplez,steppingAlgorithm);
|
||||
mscUrban->SetLateralDisplasmentFlag(LateralDisplasmentFlag());
|
||||
mscUrban->SetLowEnergyLimit(lowKineticEnergy);
|
||||
mscUrban->SetHighEnergyLimit(highKineticEnergy);
|
||||
AddEmModel(1,mscUrban);
|
||||
isInitialized = true;
|
||||
/*
|
||||
G4cout << "G4MultipleScattering::InitialiseProcess for "
|
||||
<< p->GetParticleName()
|
||||
<< " skin= " << Skin()
|
||||
<< " SA= " << steppingAlgorithm
|
||||
<< G4endl;
|
||||
*/
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4UniversalFluctuation.cc,v 1.8 2006/06/29 19:53:32 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4UniversalFluctuation.cc,v 1.13 2007/03/21 15:23:45 urban Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -52,6 +52,9 @@
|
||||
// 03-10-05 energy dependent rate -> cut dependence of the
|
||||
// distribution is much weaker (L.Urban)
|
||||
// 17-10-05 correction for very small loss (L.Urban)
|
||||
// 20-03-07 'GLANDZ' part rewritten completely, no 'very small loss'
|
||||
// regime any more (L.Urban)
|
||||
// 21-03-07 optimization in ionization part (L.Urban)
|
||||
//
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -75,12 +78,9 @@ G4UniversalFluctuation::G4UniversalFluctuation(const G4String& nam)
|
||||
minNumberInteractionsBohr(10.0),
|
||||
theBohrBeta2(50.0*keV/proton_mass_c2),
|
||||
minLoss(10.*eV),
|
||||
problim(5.e-3),
|
||||
alim(10.),
|
||||
nmaxCont1(4.),
|
||||
nmaxCont2(16.)
|
||||
{
|
||||
sumalim = -log(problim);
|
||||
lastMaterial = 0;
|
||||
}
|
||||
|
||||
@@ -168,142 +168,104 @@ G4double G4UniversalFluctuation::SampleFluctuations(const G4Material* material,
|
||||
e2LogFluct = material->GetIonisation()->GetLogEnergy2fluct();
|
||||
ipotFluct = material->GetIonisation()->GetMeanExcitationEnergy();
|
||||
ipotLogFluct = material->GetIonisation()->GetLogMeanExcEnergy();
|
||||
e0 = material->GetIonisation()->GetEnergy0fluct();
|
||||
lastMaterial = material;
|
||||
}
|
||||
|
||||
G4double a1 = 0. , a2 = 0., a3 = 0. ;
|
||||
G4double p1,p2,p3;
|
||||
// cut and material dependent rate --------------------------------
|
||||
G4double rate = 0.173+0.027*log(tmax/ipotFluct) ;
|
||||
if(rate < 0.) rate = 0. ;
|
||||
if(rate > 1.) rate = 1. ;
|
||||
|
||||
G4double w1 = tmax/ipotFluct;
|
||||
G4double w2 = log(2.*electron_mass_c2*beta2*gam2)-beta2;
|
||||
// cut and material dependent rate
|
||||
G4double rate = 1.0;
|
||||
if(tmax > ipotFluct) {
|
||||
G4double w2 = log(2.*electron_mass_c2*beta2*gam2)-beta2;
|
||||
|
||||
if(w2 > ipotLogFluct)
|
||||
{
|
||||
G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct);
|
||||
a1 = C*f1Fluct*(w2-e1LogFluct)/e1Fluct;
|
||||
a2 = C*f2Fluct*(w2-e2LogFluct)/e2Fluct;
|
||||
if(a2 < 0.)
|
||||
{
|
||||
a1 = 0. ;
|
||||
a2 = 0. ;
|
||||
rate = 1. ;
|
||||
if(w2 > ipotLogFluct && w2 > e2LogFluct) {
|
||||
|
||||
rate = 0.03+0.23*log(log(tmax/ipotFluct));
|
||||
G4double C = meanLoss*(1.-rate)/(w2-ipotLogFluct);
|
||||
a1 = C*f1Fluct*(w2-e1LogFluct)/e1Fluct;
|
||||
a2 = C*f2Fluct*(w2-e2LogFluct)/e2Fluct;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
rate = 1. ;
|
||||
}
|
||||
|
||||
if(tmax > ipotFluct)
|
||||
a3 = rate*meanLoss*(tmax-ipotFluct)/(ipotFluct*tmax*log(w1));
|
||||
G4double w1 = tmax/e0;
|
||||
if(tmax > e0)
|
||||
a3 = rate*meanLoss*(tmax-e0)/(e0*tmax*log(w1));
|
||||
|
||||
G4double suma = a1+a2+a3;
|
||||
|
||||
// Glandz regime
|
||||
//
|
||||
if (suma > sumalim)
|
||||
{
|
||||
p1 = 0., p2 = 0 ;
|
||||
if((a1+a2) > 0.)
|
||||
{
|
||||
// excitation type 1
|
||||
if (a1>alim) {
|
||||
siga=sqrt(a1) ;
|
||||
p1 = max(0.,G4RandGauss::shoot(a1,siga)+0.5);
|
||||
} else {
|
||||
p1 = G4double(G4Poisson(a1));
|
||||
}
|
||||
|
||||
// excitation type 2
|
||||
if (a2>alim) {
|
||||
siga=sqrt(a2) ;
|
||||
p2 = max(0.,G4RandGauss::shoot(a2,siga)+0.5);
|
||||
} else {
|
||||
p2 = G4double(G4Poisson(a2));
|
||||
}
|
||||
|
||||
loss = p1*e1Fluct+p2*e2Fluct;
|
||||
//'nearly' Gaussian fluctuation if a1>nmaxCont2&&a2>nmaxCont2&&a3>nmaxCont2
|
||||
G4double emean = 0.;
|
||||
G4double sig2e = 0., sige = 0.;
|
||||
G4double p1 = 0., p2 = 0., p3 = 0.;
|
||||
|
||||
// smearing to avoid unphysical peaks
|
||||
if (p2 > 0.)
|
||||
loss += (1.-2.*G4UniformRand())*e2Fluct;
|
||||
else if (loss>0.)
|
||||
loss += (1.-2.*G4UniformRand())*e1Fluct;
|
||||
if (loss < 0.) loss = 0.0;
|
||||
}
|
||||
|
||||
// ionisation
|
||||
if (a3 > 0.) {
|
||||
if (a3>alim) {
|
||||
siga=sqrt(a3) ;
|
||||
p3 = max(0.,G4RandGauss::shoot(a3,siga)+0.5);
|
||||
} else {
|
||||
p3 = G4double(G4Poisson(a3));
|
||||
}
|
||||
G4double lossc = 0.;
|
||||
if (p3 > 0) {
|
||||
G4double na = 0.;
|
||||
G4double alfa = 1.;
|
||||
if (p3 > nmaxCont2) {
|
||||
G4double rfac = p3/(nmaxCont2+p3);
|
||||
G4double namean = p3*rfac;
|
||||
G4double sa = nmaxCont1*rfac;
|
||||
na = G4RandGauss::shoot(namean,sa);
|
||||
if (na > 0.) {
|
||||
alfa = w1*(nmaxCont2+p3)/(w1*nmaxCont2+p3);
|
||||
G4double alfa1 = alfa*log(alfa)/(alfa-1.);
|
||||
G4double ea = na*ipotFluct*alfa1;
|
||||
G4double sea = ipotFluct*sqrt(na*(alfa-alfa1*alfa1));
|
||||
lossc += G4RandGauss::shoot(ea,sea);
|
||||
}
|
||||
}
|
||||
|
||||
if (p3 > na) {
|
||||
w2 = alfa*ipotFluct;
|
||||
G4double w = (tmax-w2)/tmax;
|
||||
G4int nb = G4int(p3-na);
|
||||
for (G4int k=0; k<nb; k++) lossc += w2/(1.-w*G4UniformRand());
|
||||
}
|
||||
}
|
||||
loss += lossc;
|
||||
}
|
||||
return loss;
|
||||
}
|
||||
|
||||
// suma < sumalim; very small energy loss;
|
||||
//
|
||||
G4double e0 = material->GetIonisation()->GetEnergy0fluct();
|
||||
|
||||
if(tmax <= e0) return meanLoss;
|
||||
else a3 = meanLoss*(tmax-e0)/(tmax*e0*log(tmax/e0));
|
||||
|
||||
if (a3 > alim)
|
||||
// excitation of type 1
|
||||
if(a1 > nmaxCont2)
|
||||
{
|
||||
siga=sqrt(a3);
|
||||
p3 = max(0.,G4RandGauss::shoot(a3,siga)+0.5);
|
||||
} else {
|
||||
p3 = G4double(G4Poisson(a3));
|
||||
emean += a1*e1Fluct;
|
||||
sig2e += a1*e1Fluct*e1Fluct;
|
||||
}
|
||||
if (p3 > 0.) {
|
||||
G4double w = (tmax-e0)/tmax;
|
||||
G4double corrfac = 1.;
|
||||
if (p3 > nmaxCont2) {
|
||||
corrfac = p3/nmaxCont2;
|
||||
p3 = nmaxCont2;
|
||||
}
|
||||
G4int ip3 = (G4int)p3;
|
||||
for (G4int i=0; i<ip3; i++) loss += 1./(1.-w*G4UniformRand());
|
||||
loss *= e0*corrfac;
|
||||
// smearing for losses near to e0
|
||||
if(p3 <= 2.)
|
||||
loss += e0*(1.-2.*G4UniformRand()) ;
|
||||
}
|
||||
|
||||
return loss;
|
||||
else if(a1 > 0.)
|
||||
{
|
||||
p1 = G4double(G4Poisson(a1));
|
||||
loss += p1*e1Fluct;
|
||||
if(p1 > 0.)
|
||||
loss += (1.-2.*G4UniformRand())*e1Fluct;
|
||||
}
|
||||
|
||||
// excitation of type 2
|
||||
if(a2 > nmaxCont2)
|
||||
{
|
||||
emean += a2*e2Fluct;
|
||||
sig2e += a2*e2Fluct*e2Fluct;
|
||||
}
|
||||
else if(a2 > 0.)
|
||||
{
|
||||
p2 = G4double(G4Poisson(a2));
|
||||
loss += p2*e2Fluct;
|
||||
if(p2 > 0.)
|
||||
loss += (1.-2.*G4UniformRand())*e2Fluct;
|
||||
}
|
||||
|
||||
// ionisation
|
||||
G4double lossc = 0.;
|
||||
if(a3 > 0.)
|
||||
{
|
||||
p3 = a3;
|
||||
G4double alfa = 1.;
|
||||
if(a3 > nmaxCont2)
|
||||
{
|
||||
alfa = w1*(nmaxCont2+a3)/(w1*nmaxCont2+a3);
|
||||
G4double alfa1 = alfa*log(alfa)/(alfa-1.);
|
||||
G4double namean = a3*w1*(alfa-1.)/((w1-1.)*alfa);
|
||||
emean += namean*e0*alfa1;
|
||||
sig2e += e0*e0*namean*(alfa-alfa1*alfa1);
|
||||
p3 = a3-namean;
|
||||
}
|
||||
|
||||
G4double w2 = alfa*e0;
|
||||
G4double w = (tmax-w2)/tmax;
|
||||
G4double scale = 1.;
|
||||
G4int nb = 0;
|
||||
if(p3 < nmaxCont2)
|
||||
nb = G4Poisson(p3);
|
||||
else
|
||||
{
|
||||
nb = G4Poisson(nmaxCont2);
|
||||
scale = p3/nmaxCont2;
|
||||
}
|
||||
if(nb > 0)
|
||||
for (G4int k=0; k<nb; k++) lossc += scale*w2/(1.-w*G4UniformRand());
|
||||
}
|
||||
|
||||
if(emean > 0.)
|
||||
{
|
||||
sige = sqrt(sig2e);
|
||||
loss += max(0.,G4RandGauss::shoot(emean,sige));
|
||||
}
|
||||
|
||||
loss += lossc;
|
||||
|
||||
return loss;
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4UrbanMscModel.cc,v 1.26 2006/12/04 05:53:24 urban Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4UrbanMscModel.cc,v 1.47 2007/03/07 15:44:42 urban Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -114,6 +114,26 @@
|
||||
// 20-11-06 bugfix in single scattering part of SampleCosineTheta,
|
||||
// single scattering just before boundary crossing now (L.Urban)
|
||||
// 04-12-06 fix in ComputeTruePathLengthLimit (L.Urban)
|
||||
// 17-01-07 remove LocatePoint from GeomLimit method (V.Ivanchenko)
|
||||
// 19-01-07 fix of true < geom problem (L.Urban)
|
||||
// 25-01-07 add protections from NaN vaues and for zero geometry step (VI)
|
||||
// 31-01-07 correction in SampleCosineTheta: screening parameter
|
||||
// corrected in single/plural scattering +
|
||||
// code cleaning (L.Urban)
|
||||
// 01-02-07 restore logic inside ComputeTrueStepLength (V.Ivanchenko)
|
||||
// 06-02-07 Move SetMscStepLimitation method into the source, add there
|
||||
// reinitialisation of some private members, add protection inside
|
||||
// SampleDisplacement(VI)
|
||||
// 07-02-07 fix single scattering for heavy particles, now skin=1 can be used
|
||||
// for heavy particles as well (L.Urban)
|
||||
// 08-02-07 randomization of tlimit removed (L.Urban)
|
||||
// 11-02-07 modified stepping algorithm for skin=0
|
||||
// 15-02-07 new data member: smallstep, small steps with single scattering
|
||||
// before + after boundary for skin > 1
|
||||
// 23-02-07 use tPathLength inside ComputeStep instead of geombig
|
||||
// 24-02-07 step reduction before boundary for 'small' geomlimit only
|
||||
// 03-03-07 single scattering around boundaries only (L.Urban)
|
||||
// 07-03-07 bugfix in ComputeTruePathLengthLimit (for skin > 0.) (L.Urban)
|
||||
//
|
||||
|
||||
// Class Description:
|
||||
@@ -161,18 +181,17 @@ G4UrbanMscModel::G4UrbanMscModel(G4double m_facrange, G4double m_dtrl,
|
||||
tausmall = 1.e-20;
|
||||
taulim = 1.e-6;
|
||||
currentTau = taulim;
|
||||
stepmin = 1.e-6*mm;
|
||||
skindepth = (skin-1)*stepmin;
|
||||
skindepth1 = skindepth+stepmin;
|
||||
tlimitminfix = 1.e-6*mm;
|
||||
stepmin = tlimitminfix;
|
||||
skindepth = skin*stepmin;
|
||||
smallstep = 1.e10;
|
||||
currentRange = 0. ;
|
||||
frscaling2 = 0.25;
|
||||
frscaling1 = 1.-frscaling2;
|
||||
tlimit = 1.e10*mm;
|
||||
tlimitmin = 10.e-6*mm;
|
||||
tlimitminfix = 10.e-6*mm;
|
||||
tnow = 10.e-6*mm;
|
||||
tlimitmin = 10.*tlimitminfix;
|
||||
tnow = 10.*tlimitminfix;
|
||||
nstepmax = 25.;
|
||||
tgeom = 1.e50*mm;
|
||||
geombig = 1.e50*mm;
|
||||
geommin = 1.e-3*mm;
|
||||
geomlimit = geombig;
|
||||
@@ -182,6 +201,8 @@ G4UrbanMscModel::G4UrbanMscModel(G4double m_facrange, G4double m_dtrl,
|
||||
particle = 0;
|
||||
theManager = G4LossTableManager::Instance();
|
||||
inside = false;
|
||||
insideskin = false;
|
||||
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -213,6 +234,21 @@ void G4UrbanMscModel::Initialise(const G4ParticleDefinition* p,
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
void G4UrbanMscModel::SetMscStepLimitation(G4bool alg, G4double factor)
|
||||
{
|
||||
steppingAlgorithm = alg;
|
||||
facrange = factor;
|
||||
|
||||
// reinitialisation
|
||||
stepmin = tlimitminfix;
|
||||
skindepth = skin*stepmin;
|
||||
tlimitmin = 10.*tlimitminfix;
|
||||
tnow = 10.*tlimitminfix;
|
||||
inside = false;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
|
||||
G4double G4UrbanMscModel::ComputeCrossSectionPerAtom(
|
||||
const G4ParticleDefinition* part,
|
||||
G4double KineticEnergy,
|
||||
@@ -479,117 +515,191 @@ G4double G4UrbanMscModel::ComputeTruePathLengthLimit(
|
||||
tPathLength = currentRange;
|
||||
|
||||
G4StepPoint* sp = track.GetStep()->GetPreStepPoint();
|
||||
|
||||
presafety = sp->GetSafety();
|
||||
G4StepStatus stepStatus = sp->GetStepStatus();
|
||||
G4int stepNumber = track.GetCurrentStepNumber();
|
||||
if(stepNumber == 1) insideskin = false;
|
||||
|
||||
// standard version
|
||||
//
|
||||
if (steppingAlgorithm)
|
||||
{
|
||||
if((stepNumber > 1) && inside)
|
||||
return tPathLength;
|
||||
|
||||
//compute geomlimit and presafety
|
||||
GeomLimit(track);
|
||||
|
||||
if((stepStatus == fGeomBoundary) || (stepNumber == 1))
|
||||
//for precise simulation for the case without magnatic field
|
||||
// small step(s) + single/plural scattering around boundaries
|
||||
if(skin > 0.)
|
||||
{
|
||||
if((stepNumber == 1) && (currentRange < presafety))
|
||||
if((stepNumber > 1) && inside)
|
||||
return tPathLength;
|
||||
|
||||
//compute geomlimit and presafety
|
||||
GeomLimit(track);
|
||||
|
||||
insideskin = false;
|
||||
smallstep += 1.;
|
||||
|
||||
if((stepStatus == fGeomBoundary) || (stepNumber == 1))
|
||||
{
|
||||
stepmin = 1.e-6*mm;
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
else
|
||||
inside = false;
|
||||
if(stepNumber == 1) smallstep = 1.e10;
|
||||
else smallstep = 1.;
|
||||
|
||||
// facrange scaling in lambda
|
||||
// not so strong step restriction above llimit
|
||||
G4double facr = facrange;
|
||||
if(lambda0 > llimit)
|
||||
facr *= frscaling1+frscaling2*lambda0/llimit;
|
||||
|
||||
// constraint from the physics
|
||||
if (currentRange > lambda0) tlimit = facr*currentRange;
|
||||
else tlimit = facr*lambda0;
|
||||
|
||||
// constraint from the geometry (if tlimit above is too big)
|
||||
tgeom = geombig;
|
||||
if(geomlimit > geommin)
|
||||
{
|
||||
if(stepStatus == fGeomBoundary)
|
||||
tgeom = geomlimit/facgeom;
|
||||
if((stepNumber == 1) && (currentRange < presafety))
|
||||
{
|
||||
stepmin = tlimitminfix;
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
else
|
||||
tgeom = 2.*geomlimit/facgeom;
|
||||
inside = false;
|
||||
|
||||
// facrange scaling in lambda
|
||||
// not so strong step restriction above lambdalimit
|
||||
G4double facr = facrange;
|
||||
if(lambda0 > lambdalimit)
|
||||
facr *= frscaling1+frscaling2*lambda0/lambdalimit;
|
||||
|
||||
// constraint from the physics
|
||||
if (currentRange > lambda0) tlimit = facr*currentRange;
|
||||
else tlimit = facr*lambda0;
|
||||
|
||||
// constraint from the geometry (if tlimit above is too big)
|
||||
G4double tgeom = geombig;
|
||||
if(geomlimit > geommin)
|
||||
{
|
||||
if(stepStatus == fGeomBoundary)
|
||||
tgeom = geomlimit/facgeom;
|
||||
else
|
||||
tgeom = 2.*geomlimit/facgeom;
|
||||
}
|
||||
|
||||
//define stepmin here (it depends on lambda!)
|
||||
//rough estimation of lambda_elastic/lambda_transport
|
||||
G4double rat = currentKinEnergy/MeV ;
|
||||
rat = 1.e-3/(rat*(10.+rat)) ;
|
||||
//stepmin ~ lambda_elastic
|
||||
stepmin = rat*lambda0;
|
||||
skindepth = skin*stepmin;
|
||||
|
||||
//define tlimitmin
|
||||
tlimitmin = lambda0/nstepmax;
|
||||
if(tlimitmin < stepmin) tlimitmin = 1.01*stepmin;
|
||||
if(tlimitmin < tlimitminfix) tlimitmin = tlimitminfix;
|
||||
|
||||
//lower limit for tlimit
|
||||
if(tlimit < tlimitmin) tlimit = tlimitmin;
|
||||
|
||||
//check against geometry limit
|
||||
if(tlimit > tgeom) tlimit = tgeom;
|
||||
|
||||
//if track starts far from boundaries increase tlimit!
|
||||
if(tlimit < facsafety*presafety)
|
||||
tlimit = facsafety*presafety ;
|
||||
}
|
||||
|
||||
//define stepmin here (it depends on lambda!)
|
||||
//rough estimation of lambda_elastic/lambda_transport
|
||||
G4double rat = currentKinEnergy/MeV ;
|
||||
rat = 1.e-3/(rat*(10.+rat)) ;
|
||||
//stepmin ~ lambda_elastic
|
||||
stepmin = rat*lambda0;
|
||||
skindepth = (skin-1.)*stepmin;
|
||||
skindepth1 = skindepth+stepmin;
|
||||
if(stepmin > tgeom) stepmin = tgeom;
|
||||
if(currentRange < presafety)
|
||||
{
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
|
||||
//define tlimitmin
|
||||
tlimitmin = lambda0/nstepmax;
|
||||
if(tlimitmin < stepmin) tlimitmin = 1.01*stepmin;
|
||||
if(tlimitmin < tlimitminfix) tlimitmin = tlimitminfix;
|
||||
// shortcut
|
||||
if((tPathLength < tlimit) &&
|
||||
(tPathLength < presafety))
|
||||
return tPathLength;
|
||||
|
||||
//lower limit for tlimit
|
||||
if(tlimit < tlimitmin) tlimit = tlimitmin;
|
||||
|
||||
//check against geometry limit
|
||||
if(tlimit > tgeom) tlimit = tgeom;
|
||||
|
||||
//if track starts far from boundaries increase tlimit!
|
||||
//if track far from boundaries increase tPathLength
|
||||
tnow = tlimit;
|
||||
if(tlimit < facsafety*presafety)
|
||||
tlimit = facsafety*presafety ;
|
||||
tnow = facsafety*presafety ;
|
||||
|
||||
// "randomize" tlimit
|
||||
tlimit *= 0.5+G4UniformRand();
|
||||
}
|
||||
|
||||
if(currentRange < presafety)
|
||||
{
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
|
||||
// shortcut
|
||||
if((tPathLength < tlimit) &&
|
||||
(tPathLength < presafety))
|
||||
return tPathLength;
|
||||
|
||||
//if track far from boundaries increase tPathLength
|
||||
tnow = tlimit;
|
||||
if(tlimit < facsafety*presafety)
|
||||
tnow = facsafety*presafety ;
|
||||
|
||||
// step reduction near to boundary
|
||||
if(skindepth >= 0.)
|
||||
{
|
||||
if(geomlimit > skindepth)
|
||||
// step reduction near to boundary
|
||||
if(smallstep < skin)
|
||||
{
|
||||
if(tnow > geomlimit-skindepth)
|
||||
tnow = geomlimit-skindepth;
|
||||
tnow = stepmin;
|
||||
insideskin = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(tnow > stepmin)
|
||||
tnow = stepmin;
|
||||
else if(geomlimit < geombig)
|
||||
{
|
||||
if(geomlimit > skindepth)
|
||||
{
|
||||
if(tnow > geomlimit-0.999*skindepth)
|
||||
tnow = geomlimit-0.999*skindepth;
|
||||
}
|
||||
else
|
||||
{
|
||||
insideskin = true;
|
||||
if(tnow > stepmin)
|
||||
tnow = stepmin;
|
||||
}
|
||||
}
|
||||
|
||||
if(tnow < stepmin)
|
||||
tnow = stepmin;
|
||||
|
||||
if(tPathLength > tnow)
|
||||
tPathLength = tnow ;
|
||||
}
|
||||
// for 'normal' simulation with or without magnetic field
|
||||
// there no small step/single scattering at boundaries
|
||||
else
|
||||
{
|
||||
if((stepNumber > 1) && inside)
|
||||
return tPathLength;
|
||||
|
||||
if(tnow < stepmin)
|
||||
tnow = stepmin;
|
||||
// compute presafety again if presafety <= 0 and no boundary
|
||||
// i.e. when it is needed for optimization purposes
|
||||
if((stepStatus != fGeomBoundary) && (presafety <= 0.))
|
||||
{
|
||||
presafety = safetyHelper->ComputeSafety(sp->GetPosition());
|
||||
if(currentRange < presafety)
|
||||
{
|
||||
stepmin = tlimitminfix;
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
else
|
||||
inside = false;
|
||||
}
|
||||
|
||||
if(tPathLength > tnow)
|
||||
tPathLength = tnow ;
|
||||
if((stepStatus == fGeomBoundary) || (stepNumber == 1))
|
||||
{
|
||||
if(stepNumber == 1)
|
||||
insideskin = false;
|
||||
|
||||
// facrange scaling in lambda
|
||||
// not so strong step restriction above lambdalimit
|
||||
G4double facr = facrange;
|
||||
if(lambda0 > lambdalimit)
|
||||
facr *= frscaling1+frscaling2*lambda0/lambdalimit;
|
||||
|
||||
// constraint from the physics
|
||||
if (currentRange > lambda0) tlimit = facr*currentRange;
|
||||
else tlimit = facr*lambda0;
|
||||
|
||||
//lower limit for tlimit
|
||||
tlimitmin = lambda0/nstepmax;
|
||||
if(tlimitmin < tlimitminfix) tlimitmin = tlimitminfix;
|
||||
if(tlimit < tlimitmin) tlimit = tlimitmin;
|
||||
|
||||
//if track starts far from boundaries increase tlimit!
|
||||
if(tlimit < facsafety*presafety)
|
||||
tlimit = facsafety*presafety ;
|
||||
}
|
||||
|
||||
if(currentRange < presafety)
|
||||
{
|
||||
inside = true;
|
||||
return tPathLength;
|
||||
}
|
||||
|
||||
// shortcut
|
||||
if((tPathLength < tlimit) &&
|
||||
(tPathLength < presafety))
|
||||
return tPathLength;
|
||||
|
||||
if(tPathLength > tlimit) tPathLength = tlimit;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// version similar to 7.1 (needed for some experiments)
|
||||
@@ -597,14 +707,15 @@ G4double G4UrbanMscModel::ComputeTruePathLengthLimit(
|
||||
{
|
||||
if(stepNumber == 1)
|
||||
tlimit = geombig;
|
||||
|
||||
if (stepStatus == fGeomBoundary)
|
||||
{
|
||||
if (currentRange > lambda0) tlimit = facrange*currentRange;
|
||||
else tlimit = facrange*lambda0;
|
||||
|
||||
if(tlimit < tlimitmin) tlimit = tlimitmin;
|
||||
if(tPathLength > tlimit) tPathLength = tlimit;
|
||||
}
|
||||
if(tPathLength > tlimit) tPathLength = tlimit;
|
||||
}
|
||||
|
||||
return tPathLength ;
|
||||
@@ -620,14 +731,14 @@ void G4UrbanMscModel::GeomLimit(const G4Track& track)
|
||||
if((track.GetVolume() != 0) &&
|
||||
(track.GetVolume() != navigator->GetWorldVolume()))
|
||||
{
|
||||
const G4double cstep = geombig;
|
||||
navigator->LocateGlobalPointWithinVolume(
|
||||
track.GetStep()->GetPreStepPoint()->GetPosition());
|
||||
const G4double cstep = tPathLength;
|
||||
geomlimit = navigator->ComputeStep(
|
||||
track.GetStep()->GetPreStepPoint()->GetPosition(),
|
||||
track.GetMomentumDirection(),
|
||||
cstep,
|
||||
presafety);
|
||||
// G4cout << "!!!G4UrbanMscModel::GeomLimit presafety= " << presafety
|
||||
// << " limit= " << geomlimit << G4endl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -635,14 +746,16 @@ void G4UrbanMscModel::GeomLimit(const G4Track& track)
|
||||
|
||||
G4double G4UrbanMscModel::ComputeGeomPathLength(G4double)
|
||||
{
|
||||
// do the true -> geom transformation
|
||||
|
||||
lambdaeff = lambda0;
|
||||
par1 = -1. ;
|
||||
par2 = par3 = 0. ;
|
||||
|
||||
// do the true -> geom transformation
|
||||
zPathLength = tPathLength;
|
||||
|
||||
// z = t for very small tPathLength
|
||||
if(tPathLength < tlimitminfix) return zPathLength;
|
||||
|
||||
// this correction needed to run MSC with eIoni and eBrem inactivated
|
||||
// and makes no harm for a normal run
|
||||
if(tPathLength > currentRange)
|
||||
@@ -650,10 +763,10 @@ G4double G4UrbanMscModel::ComputeGeomPathLength(G4double)
|
||||
|
||||
G4double tau = tPathLength/lambda0 ;
|
||||
|
||||
if ((tau <= tausmall) || (tPathLength <= stepmin)) {
|
||||
geomLength = tPathLength;
|
||||
if(geomLength > lambda0) geomLength = lambda0;
|
||||
return geomLength;
|
||||
if ((tau <= tausmall) || insideskin) {
|
||||
zPathLength = tPathLength;
|
||||
if(zPathLength > lambda0) zPathLength = lambda0;
|
||||
return zPathLength;
|
||||
}
|
||||
|
||||
G4double zmean = tPathLength;
|
||||
@@ -709,10 +822,9 @@ G4double G4UrbanMscModel::ComputeGeomPathLength(G4double)
|
||||
}
|
||||
}
|
||||
|
||||
geomLength = zPathLength;
|
||||
if(geomLength > lambda0) geomLength = lambda0;
|
||||
if(zPathLength > lambda0) zPathLength = lambda0;
|
||||
|
||||
return geomLength;
|
||||
return zPathLength;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -720,29 +832,30 @@ G4double G4UrbanMscModel::ComputeGeomPathLength(G4double)
|
||||
G4double G4UrbanMscModel::ComputeTrueStepLength(G4double geomStepLength)
|
||||
{
|
||||
// step defined other than transportation
|
||||
if(geomStepLength == geomLength && tPathLength <= currentRange)
|
||||
if(geomStepLength == zPathLength && tPathLength <= currentRange)
|
||||
return tPathLength;
|
||||
|
||||
// recalculation
|
||||
G4double trueLength = geomStepLength;
|
||||
// t = z for very small step
|
||||
zPathLength = geomStepLength;
|
||||
if((geomStepLength > lambda0*tausmall) && (geomStepLength > stepmin))
|
||||
tPathLength = geomStepLength;
|
||||
if(geomStepLength < tlimitminfix) return tPathLength;
|
||||
|
||||
// recalculation
|
||||
if((geomStepLength > lambda0*tausmall) && !insideskin)
|
||||
{
|
||||
if(par1 < 0.)
|
||||
trueLength = -lambda0*log(1.-geomStepLength/lambda0) ;
|
||||
tPathLength = -lambda0*log(1.-geomStepLength/lambda0) ;
|
||||
else
|
||||
{
|
||||
if(par1*par3*geomStepLength < 1.)
|
||||
trueLength = (1.-exp(log(1.-par1*par3*geomStepLength)/par3))/par1 ;
|
||||
tPathLength = (1.-exp(log(1.-par1*par3*geomStepLength)/par3))/par1 ;
|
||||
else
|
||||
trueLength = currentRange ;
|
||||
tPathLength = currentRange;
|
||||
}
|
||||
}
|
||||
if(trueLength < geomStepLength) trueLength = geomStepLength;
|
||||
if(tPathLength < geomStepLength) tPathLength = geomStepLength;
|
||||
|
||||
tPathLength = trueLength;
|
||||
|
||||
return trueLength;
|
||||
return tPathLength;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -780,7 +893,7 @@ std::vector<G4DynamicParticle*>* G4UrbanMscModel::SampleSecondaries(
|
||||
G4double safety)
|
||||
{
|
||||
G4double kineticEnergy = dynParticle->GetKineticEnergy();
|
||||
if((kineticEnergy <= 0.0) || (truestep <= 0.)) return 0;
|
||||
if((kineticEnergy <= 0.0) || (truestep <= tlimitminfix)) return 0;
|
||||
|
||||
G4double cth = SampleCosineTheta(truestep,kineticEnergy);
|
||||
G4double sth = sqrt((1.0 - cth)*(1.0 + cth));
|
||||
@@ -796,6 +909,13 @@ std::vector<G4DynamicParticle*>* G4UrbanMscModel::SampleSecondaries(
|
||||
if (latDisplasment) {
|
||||
|
||||
G4double r = SampleDisplacement();
|
||||
/*
|
||||
G4cout << "G4UrbanMscModel::SampleSecondaries: e(MeV)= " << kineticEnergy
|
||||
<< " sinTheta= " << sth << " r(mm)= " << r
|
||||
<< " trueStep(mm)= " << truestep
|
||||
<< " geomStep(mm)= " << zPathLength
|
||||
<< G4endl;
|
||||
*/
|
||||
if(r > 0.)
|
||||
{
|
||||
G4double latcorr = LatCorrelation();
|
||||
@@ -826,10 +946,8 @@ std::vector<G4DynamicParticle*>* G4UrbanMscModel::SampleSecondaries(
|
||||
else
|
||||
{
|
||||
// ******* we do not have track info at this level ***********
|
||||
// ******* so navigator is called at boundary too ************
|
||||
G4double newsafety= -100.; // = safety;
|
||||
// newsafety= navigator->ComputeSafety(Position);
|
||||
newsafety= safetyHelper->ComputeSafety(Position);
|
||||
// ******* so safety is computed at boundary too ************
|
||||
G4double newsafety = safetyHelper->ComputeSafety(Position);
|
||||
safety= newsafety;
|
||||
if(r < newsafety)
|
||||
fac = 1.;
|
||||
@@ -842,7 +960,6 @@ std::vector<G4DynamicParticle*>* G4UrbanMscModel::SampleSecondaries(
|
||||
// compute new endpoint of the Step
|
||||
G4ThreeVector newPosition = Position+fac*r*latDirection;
|
||||
|
||||
// navigator->LocateGlobalPointWithinVolume(newPosition);
|
||||
safetyHelper->ReLocateWithinVolume(newPosition);
|
||||
|
||||
fParticleChange->ProposePosition(newPosition);
|
||||
@@ -863,20 +980,17 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength,
|
||||
Zeff = couple->GetMaterial()->GetTotNbOfElectPerVolume()/
|
||||
couple->GetMaterial()->GetTotNbOfAtomsPerVolume() ;
|
||||
|
||||
if((trueStepLength <= stepmin) && (skin > 0.) &&
|
||||
(geomlimit <= skindepth1))
|
||||
if(insideskin)
|
||||
{
|
||||
//no scattering, single or plural scattering
|
||||
// just before boundary crossing only (for skin > 0)
|
||||
G4double mean = trueStepLength/stepmin ;
|
||||
cth = 1.;
|
||||
G4int n = G4Poisson(mean);
|
||||
if(n > 0)
|
||||
{
|
||||
G4double tm = KineticEnergy/mass;
|
||||
// ascr - screening parameter, factor 0.025 comes from
|
||||
// requirement of 'smooth' transition msc -> single scattering
|
||||
G4double ascr = 0.025*exp(log(Zeff)/3.)/(137.*sqrt(tm*(tm+2.)));
|
||||
G4double tm = KineticEnergy/electron_mass_c2;
|
||||
// ascr - screening parameter
|
||||
G4double ascr = exp(log(Zeff)/3.)/(137.*sqrt(tm*(tm+2.)));
|
||||
G4double ascr1 = 1.+0.5*ascr*ascr;
|
||||
G4double bp1=ascr1+1.;
|
||||
G4double bm1=ascr1-1.;
|
||||
@@ -899,11 +1013,13 @@ G4double G4UrbanMscModel::SampleCosineTheta(G4double trueStepLength,
|
||||
}
|
||||
else
|
||||
{
|
||||
if(trueStepLength >= currentRange*dtrl)
|
||||
if(par1*trueStepLength < 1.)
|
||||
tau = -par2*log(1.-par1*trueStepLength) ;
|
||||
else
|
||||
tau = taubig ;
|
||||
if(trueStepLength >= currentRange*dtrl)
|
||||
if(par1*trueStepLength < 1.)
|
||||
tau = -par2*log(1.-par1*trueStepLength) ;
|
||||
// for the case if ioni/brems are inactivated
|
||||
// see the corresponding condition in ComputeGeomPathLength
|
||||
else if(1.-KineticEnergy/currentKinEnergy > taulim)
|
||||
tau = taubig ;
|
||||
|
||||
currentTau = tau ;
|
||||
lambdaeff = trueStepLength/currentTau;
|
||||
@@ -996,7 +1112,7 @@ G4double G4UrbanMscModel::SampleDisplacement()
|
||||
const G4double kappapl1 = kappa+1.;
|
||||
const G4double kappami1 = kappa-1.;
|
||||
G4double rmean = 0.0;
|
||||
if ((currentTau >= tausmall) && (tPathLength > stepmin)) {
|
||||
if ((currentTau >= tausmall) && !insideskin) {
|
||||
if (currentTau < taulim) {
|
||||
rmean = kappa*currentTau*currentTau*currentTau*
|
||||
(1.-kappapl1*currentTau*0.25)/6. ;
|
||||
@@ -1010,10 +1126,15 @@ G4double G4UrbanMscModel::SampleDisplacement()
|
||||
}
|
||||
if (rmean>0.) rmean = 2.*lambdaeff*sqrt(rmean/3.0);
|
||||
else rmean = 0.;
|
||||
}
|
||||
|
||||
// check: z*z+r*r <= t*t should be satisfied
|
||||
if(rmean*rmean > (tPathLength-zPathLength)*(tPathLength+zPathLength))
|
||||
rmean = sqrt((tPathLength-zPathLength)*(tPathLength+zPathLength));
|
||||
// protection against z > t ...........................
|
||||
if(rmean > 0.) {
|
||||
G4double zt = (tPathLength-zPathLength)*(tPathLength+zPathLength);
|
||||
if(zt <= 0.)
|
||||
rmean = 0.;
|
||||
else if(rmean*rmean > zt)
|
||||
rmean = sqrt(zt);
|
||||
}
|
||||
return rmean;
|
||||
}
|
||||
@@ -1026,7 +1147,7 @@ G4double G4UrbanMscModel::LatCorrelation()
|
||||
const G4double kappami1 = kappa-1.;
|
||||
|
||||
G4double latcorr = 0.;
|
||||
if((currentTau >= tausmall) && (tPathLength > stepmin))
|
||||
if((currentTau >= tausmall) && !insideskin)
|
||||
{
|
||||
if(currentTau < taulim)
|
||||
latcorr = lambdaeff*kappa*currentTau*currentTau*
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4eBremsstrahlung.cc,v 1.44 2006/06/29 19:53:43 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4eBremsstrahlung.cc,v 1.46 2007/01/18 12:17:04 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -67,6 +67,7 @@
|
||||
// 08-11-04 Migration to new interface of Store/Retrieve tables (V.Ivantchenko)
|
||||
// 08-04-05 Major optimisation of internal interfaces (V.Ivantchenko)
|
||||
// 22-05-06 Use gammaThreshold from manager (V.Ivantchenko)
|
||||
// 15-01-07 use SetEmModel() from G4VEnergyLossProcess (mma)
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -106,23 +107,22 @@ G4eBremsstrahlung::~G4eBremsstrahlung()
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
void G4eBremsstrahlung::InitialiseEnergyLossProcess(const G4ParticleDefinition* p,
|
||||
const G4ParticleDefinition*)
|
||||
void G4eBremsstrahlung::InitialiseEnergyLossProcess(
|
||||
const G4ParticleDefinition* p,
|
||||
const G4ParticleDefinition*)
|
||||
{
|
||||
gammaThreshold = G4LossTableManager::Instance()->BremsstrahlungTh();
|
||||
if(!isInitialised) {
|
||||
isInitialised = true;
|
||||
particle = p;
|
||||
SetSecondaryParticle(G4Gamma::Gamma());
|
||||
SetIonisation(false);
|
||||
|
||||
//G4VEmFluctuationModel* fm = 0;
|
||||
G4VEmFluctuationModel* fm = new G4UniversalFluctuation();
|
||||
|
||||
G4VEmModel* em = new G4eBremsstrahlungModel();
|
||||
em->SetLowEnergyLimit(0.1*keV);
|
||||
em->SetHighEnergyLimit(100.0*TeV);
|
||||
AddEmModel(1, em, fm);
|
||||
if (!EmModel()) SetEmModel(new G4eBremsstrahlungModel());
|
||||
EmModel()->SetLowEnergyLimit (100*eV);
|
||||
EmModel()->SetHighEnergyLimit(100*TeV);
|
||||
if (!FluctModel()) SetFluctModel(new G4UniversalFluctuation());
|
||||
|
||||
AddEmModel(1, EmModel(), FluctModel());
|
||||
isInitialised = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -130,12 +130,13 @@ void G4eBremsstrahlung::InitialiseEnergyLossProcess(const G4ParticleDefinition*
|
||||
|
||||
void G4eBremsstrahlung::PrintInfo()
|
||||
{
|
||||
G4cout << " Total cross sections from a parametrisation"
|
||||
<< " based on the EEDL data library. "
|
||||
<< G4endl
|
||||
<< " Good description from 1 KeV to 100 GeV, "
|
||||
<< "log scale extrapolation above 100 GeV."
|
||||
<< G4endl;
|
||||
if(EmModel())
|
||||
G4cout << " Total cross sections and sampling from "
|
||||
<< EmModel()->GetName() << " model"
|
||||
<< " (based on the EEDL data library) "
|
||||
<< "\n Good description from 1 KeV to 100 GeV, "
|
||||
<< "log scale extrapolation above 100 GeV."
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4eBremsstrahlungModel.cc,v 1.35 2006/08/29 14:00:25 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4eBremsstrahlungModel.cc,v 1.37 2007/02/15 10:37:37 maire Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -52,6 +52,7 @@
|
||||
// 07-02-06 public function ComputeCrossSectionPerAtom() (mma)
|
||||
// 21-03-06 Fix problem of initialisation in case when cuts are not defined (VI)
|
||||
// 27-03-06 Fix calculation of fl parameter at low energy (energy loss) (VI)
|
||||
// 15-02-07 correct LPMconstant by a factor 2, thanks to G. Depaola (mma)
|
||||
//
|
||||
// Class Description:
|
||||
//
|
||||
@@ -87,7 +88,7 @@ G4eBremsstrahlungModel::G4eBremsstrahlungModel(const G4ParticleDefinition* p,
|
||||
lowKinEnergy(1.0*keV),
|
||||
probsup(1.0),
|
||||
MigdalConstant(classic_electr_radius*electron_Compton_length*electron_Compton_length/pi),
|
||||
LPMconstant(fine_structure_const*electron_mass_c2*electron_mass_c2/(8.*pi*hbarc)),
|
||||
LPMconstant(fine_structure_const*electron_mass_c2*electron_mass_c2/(4.*pi*hbarc)),
|
||||
theLPMflag(true)
|
||||
{
|
||||
if(p) SetParticle(p);
|
||||
@@ -792,8 +793,7 @@ std::vector<G4DynamicParticle*>* G4eBremsstrahlungModel::SampleSecondaries(
|
||||
<< " e= " << kineticEnergy
|
||||
<< G4endl;
|
||||
}
|
||||
*/
|
||||
|
||||
*/
|
||||
} while( greject < G4UniformRand()*grejmax );
|
||||
|
||||
} else {
|
||||
@@ -814,7 +814,18 @@ std::vector<G4DynamicParticle*>* G4eBremsstrahlungModel::SampleSecondaries(
|
||||
*/
|
||||
} while( greject < G4UniformRand()*grejmax );
|
||||
}
|
||||
|
||||
/*
|
||||
if(x > 0.999) {
|
||||
G4cout << "### G4eBremsstrahlungModel Warning: e= " << kineticEnergy
|
||||
<< " tlow= " << tlow
|
||||
<< " x= " << x
|
||||
<< " greject= " << greject
|
||||
<< " grejmax= " << grejmax
|
||||
<< " migdal= " << migdal
|
||||
<< G4endl;
|
||||
// if(x >= 1.0) G4Exception("X=1");
|
||||
}
|
||||
*/
|
||||
gammaEnergy = x*kineticEnergy;
|
||||
|
||||
if (theLPMflag) {
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4eIonisation.cc,v 1.50 2006/06/29 19:53:51 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4eIonisation.cc,v 1.52 2007/01/18 12:17:04 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -65,6 +65,7 @@
|
||||
// 12-08-05 SetStepLimits(0.2, 0.1*mm) (mma)
|
||||
// 02-09-05 Return SetStepLimits(1, 1*mm) (V.Ivantchenko)
|
||||
// 10-01-06 SetStepLimits -> SetStepFunction (V.Ivantchenko)
|
||||
// 14-01-07 use SetEmModel() and SetFluctModel() from G4VEnergyLossProcess (mma)
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -111,15 +112,12 @@ void G4eIonisation::InitialiseEnergyLossProcess(
|
||||
if(!isInitialised) {
|
||||
if(part == G4Positron::Positron()) isElectron = false;
|
||||
SetSecondaryParticle(theElectron);
|
||||
|
||||
flucModel = new G4UniversalFluctuation();
|
||||
//flucModel = new G4BohrFluctuations();
|
||||
|
||||
G4VEmModel* em = new G4MollerBhabhaModel();
|
||||
em->SetLowEnergyLimit(100*eV);
|
||||
em->SetHighEnergyLimit(100*TeV);
|
||||
AddEmModel(1, em, flucModel);
|
||||
|
||||
if (!EmModel()) SetEmModel(new G4MollerBhabhaModel());
|
||||
EmModel()->SetLowEnergyLimit (100*eV);
|
||||
EmModel()->SetHighEnergyLimit(100*TeV);
|
||||
if (!FluctModel()) SetFluctModel(new G4UniversalFluctuation());
|
||||
|
||||
AddEmModel(1, EmModel(), FluctModel());
|
||||
isInitialised = true;
|
||||
}
|
||||
}
|
||||
@@ -128,9 +126,11 @@ void G4eIonisation::InitialiseEnergyLossProcess(
|
||||
|
||||
void G4eIonisation::PrintInfo()
|
||||
{
|
||||
G4cout << " Delta cross sections from Moller+Bhabha, "
|
||||
<< "good description from 1 KeV to 100 GeV."
|
||||
<< G4endl;
|
||||
if(EmModel())
|
||||
G4cout << " Delta cross sections and sampling from "
|
||||
<< EmModel()->GetName() << " model"
|
||||
<< "\n Good description from 1 KeV to 100 GeV."
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4hIonisation.cc,v 1.65 2006/06/29 19:54:01 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4hIonisation.cc,v 1.68 2007/02/23 14:54:00 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -74,7 +74,9 @@
|
||||
// 24-03-05 Optimize internal interfaces (V.Ivantchenko)
|
||||
// 12-08-05 SetStepLimits(0.2, 0.1*mm) (mma)
|
||||
// 10-01-06 SetStepLimits -> SetStepFunction (V.Ivanchenko)
|
||||
// 26-05-06 scale negative particles from pi- and pbar, positive from pi+ and p (VI)
|
||||
// 26-05-06 scale negative particles from pi- and pbar,
|
||||
// positive from pi+ and p (VI)
|
||||
// 14-01-07 use SetEmModel() and SetFluctModel() from G4VEnergyLossProcess (mma)
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -92,8 +94,6 @@
|
||||
#include "G4UnitsTable.hh"
|
||||
#include "G4PionPlus.hh"
|
||||
#include "G4PionMinus.hh"
|
||||
#include "G4KaonPlus.hh"
|
||||
#include "G4KaonMinus.hh"
|
||||
#include "G4LossTableManager.hh"
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
@@ -133,19 +133,19 @@ void G4hIonisation::InitialiseEnergyLossProcess(
|
||||
|
||||
theParticle = part;
|
||||
|
||||
if(part == bpart ||
|
||||
part == G4Proton::Proton() ||
|
||||
part == G4AntiProton::AntiProton() ||
|
||||
part == G4PionPlus::PionPlus() ||
|
||||
part == G4PionMinus::PionMinus() ) theBaseParticle = 0;
|
||||
G4String pname = part->GetParticleName();
|
||||
|
||||
// standard base particles
|
||||
if(part == bpart || pname == "proton" ||
|
||||
pname == "anti_proton" || pname == "pi+" || pname == "pi-" )
|
||||
theBaseParticle = 0;
|
||||
|
||||
// select base particle
|
||||
else if(bpart == 0) {
|
||||
if(part == G4KaonPlus::KaonPlus())
|
||||
theBaseParticle = G4PionPlus::PionPlus();
|
||||
else if(part == G4KaonMinus::KaonMinus())
|
||||
theBaseParticle = G4PionMinus::PionMinus();
|
||||
else if(part->GetPDGCharge() > 0.0)
|
||||
theBaseParticle = G4Proton::Proton();
|
||||
|
||||
if(pname == "kaon+") theBaseParticle = G4PionPlus::PionPlus();
|
||||
else if(pname == "kaon-") theBaseParticle = G4PionMinus::PionMinus();
|
||||
else if(part->GetPDGCharge() > 0.0) theBaseParticle = G4Proton::Proton();
|
||||
else theBaseParticle = G4AntiProton::AntiProton();
|
||||
|
||||
} else theBaseParticle = bpart;
|
||||
@@ -157,18 +157,17 @@ void G4hIonisation::InitialiseEnergyLossProcess(
|
||||
massratio = 1.0;
|
||||
if(theBaseParticle) massratio = theBaseParticle->GetPDGMass()/mass;
|
||||
|
||||
G4VEmModel* em = new G4BraggModel();
|
||||
em->SetLowEnergyLimit(0.1*keV);
|
||||
if (!EmModel(1)) SetEmModel(new G4BraggModel(),1);
|
||||
EmModel(1)->SetLowEnergyLimit(100*eV);
|
||||
eth = 2.0*MeV*mass/proton_mass_c2;
|
||||
em->SetHighEnergyLimit(eth);
|
||||
EmModel(1)->SetHighEnergyLimit(eth);
|
||||
if (!FluctModel()) SetFluctModel(new G4UniversalFluctuation());
|
||||
AddEmModel(1, EmModel(1), FluctModel());
|
||||
|
||||
flucModel = new G4UniversalFluctuation();
|
||||
|
||||
AddEmModel(1, em, flucModel);
|
||||
G4VEmModel* em1 = new G4BetheBlochModel();
|
||||
em1->SetLowEnergyLimit(eth);
|
||||
em1->SetHighEnergyLimit(100.0*TeV);
|
||||
AddEmModel(2, em1, flucModel);
|
||||
if (!EmModel(2)) SetEmModel(new G4BetheBlochModel(),2);
|
||||
EmModel(2)->SetLowEnergyLimit(eth);
|
||||
EmModel(2)->SetHighEnergyLimit(100*TeV);
|
||||
AddEmModel(2, EmModel(2), FluctModel());
|
||||
|
||||
isInitialised = true;
|
||||
}
|
||||
@@ -177,11 +176,14 @@ void G4hIonisation::InitialiseEnergyLossProcess(
|
||||
|
||||
void G4hIonisation::PrintInfo()
|
||||
{
|
||||
G4cout << " Scaling relation is used to proton dE/dx and range"
|
||||
<< G4endl
|
||||
<< " Bether-Bloch model for Escaled > " << eth << " MeV, ICRU49 "
|
||||
<< "parametrisation for protons below."
|
||||
<< G4endl;
|
||||
if(EmModel(1) && EmModel(2))
|
||||
G4cout << " Scaling relation is used from proton dE/dx and range."
|
||||
<< "\n Delta cross sections and sampling from "
|
||||
<< EmModel(2)->GetName() << " model for scaled energy > "
|
||||
<< eth/MeV << " MeV"
|
||||
<< "\n Parametrisation from "
|
||||
<< EmModel(1)->GetName() << " for protons below."
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4hMultipleScattering.cc,v 1.1 2006/10/26 11:04:39 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4hMultipleScattering.cc,v 1.3 2007/03/20 15:40:59 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -----------------------------------------------------------------------------
|
||||
//
|
||||
@@ -37,6 +37,8 @@
|
||||
// Creation date: 24.10.2006 cloned from G4MultipleScattering
|
||||
//
|
||||
// Modified:
|
||||
// 12-02-07 skin can be changed via UI command (VI)
|
||||
// 20.03.07 Remove local parameter skin, set facgeom=0.1(V.Ivanchenko)
|
||||
//
|
||||
// -----------------------------------------------------------------------------
|
||||
//
|
||||
@@ -62,11 +64,7 @@ G4hMultipleScattering::G4hMultipleScattering(const G4String& processName)
|
||||
facrange = 0.2;
|
||||
dtrl = 0.05;
|
||||
lambdalimit = 1.*mm;
|
||||
facgeom = 0.5;
|
||||
// there is no single scattering for this skin <= 0
|
||||
// to have single scattering at boundary
|
||||
// skin should be > 0 !
|
||||
skin = 0.;
|
||||
facgeom = 0.1;
|
||||
|
||||
steppingAlgorithm = false;
|
||||
samplez = false ;
|
||||
@@ -77,6 +75,7 @@ G4hMultipleScattering::G4hMultipleScattering(const G4String& processName)
|
||||
SetMaxKinEnergy(highKineticEnergy);
|
||||
|
||||
SetLateralDisplasmentFlag(true);
|
||||
SetSkin(0.0);
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
|
||||
@@ -110,17 +109,22 @@ void G4hMultipleScattering::InitialiseProcess(const G4ParticleDefinition* p)
|
||||
{
|
||||
if(isInitialized) {
|
||||
mscUrban->SetMscStepLimitation(steppingAlgorithm, facrange);
|
||||
if (p->GetParticleType() != "nucleus") {
|
||||
mscUrban->SetLateralDisplasmentFlag(LateralDisplasmentFlag());
|
||||
mscUrban->SetSkin(Skin());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (p->GetParticleType() == "nucleus") {
|
||||
SetLateralDisplasmentFlag(false);
|
||||
SetBuildLambdaTable(false);
|
||||
SetSkin(0.0);
|
||||
} else {
|
||||
SetBuildLambdaTable(true);
|
||||
}
|
||||
mscUrban = new G4UrbanMscModel(facrange,dtrl,lambdalimit,
|
||||
facgeom,skin,
|
||||
facgeom,Skin(),
|
||||
samplez,steppingAlgorithm);
|
||||
mscUrban->SetLateralDisplasmentFlag(LateralDisplasmentFlag());
|
||||
mscUrban->SetLowEnergyLimit(lowKineticEnergy);
|
||||
|
||||
@@ -23,8 +23,8 @@
|
||||
// * acceptance of all terms of the Geant4 Software license. *
|
||||
// ********************************************************************
|
||||
//
|
||||
// $Id: G4ionIonisation.cc,v 1.37 2006/06/29 19:54:05 gunter Exp $
|
||||
// GEANT4 tag $Name: geant4-08-02 $
|
||||
// $Id: G4ionIonisation.cc,v 1.39 2007/01/18 12:17:04 vnivanch Exp $
|
||||
// GEANT4 tag $Name: geant4-08-03 $
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
//
|
||||
@@ -51,6 +51,7 @@
|
||||
// 10-01-06 SetStepLimits -> SetStepFunction (V.Ivantchenko)
|
||||
// 10-05-06 Add a possibility to download user data (V.Ivantchenko)
|
||||
// 13-05-06 Add data for light ion stopping in water (V.Ivantchenko)
|
||||
// 14-01-07 use SetEmModel() and SetFluctModel() from G4VEnergyLossProcess (mma)
|
||||
//
|
||||
//
|
||||
// -------------------------------------------------------------------
|
||||
@@ -66,7 +67,6 @@
|
||||
#include "G4BraggIonModel.hh"
|
||||
#include "G4BetheBlochModel.hh"
|
||||
#include "G4IonFluctuations.hh"
|
||||
#include "G4UniversalFluctuation.hh"
|
||||
#include "G4UnitsTable.hh"
|
||||
#include "G4LossTableManager.hh"
|
||||
#include "G4WaterStopping.hh"
|
||||
@@ -117,21 +117,20 @@ void G4ionIonisation::InitialiseEnergyLossProcess(
|
||||
|
||||
if(theBaseParticle) baseMass = theBaseParticle->GetPDGMass();
|
||||
else baseMass = theParticle->GetPDGMass();
|
||||
|
||||
if (!EmModel(1)) SetEmModel(new G4BraggIonModel(),1);
|
||||
EmModel(1)->SetLowEnergyLimit(100*eV);
|
||||
eth = 2.0*MeV;
|
||||
EmModel(1)->SetHighEnergyLimit(eth);
|
||||
if (!FluctModel()) SetFluctModel(new G4IonFluctuations());
|
||||
AddEmModel(1, EmModel(1), FluctModel());
|
||||
|
||||
flucModel = new G4IonFluctuations();
|
||||
if (!EmModel(2)) SetEmModel(new G4BetheBlochModel(),2);
|
||||
EmModel(2)->SetLowEnergyLimit(eth);
|
||||
EmModel(2)->SetHighEnergyLimit(100*TeV);
|
||||
AddEmModel(2, EmModel(2), FluctModel());
|
||||
|
||||
eth = 2.0*MeV;
|
||||
|
||||
G4BraggIonModel* theBraggModel = new G4BraggIonModel();
|
||||
theBraggModel->SetLowEnergyLimit(0.1*keV);
|
||||
theBraggModel->SetHighEnergyLimit(eth);
|
||||
AddEmModel(1, theBraggModel, flucModel);
|
||||
G4VEmModel* em1 = new G4BetheBlochModel();
|
||||
em1->SetLowEnergyLimit(eth);
|
||||
em1->SetHighEnergyLimit(100.0*TeV);
|
||||
AddEmModel(2, em1, flucModel);
|
||||
|
||||
effCharge = corr->GetIonEffectiveCharge(theBraggModel);
|
||||
effCharge = corr->GetIonEffectiveCharge(EmModel(1));
|
||||
G4WaterStopping ws(corr);
|
||||
|
||||
isInitialised = true;
|
||||
@@ -141,14 +140,19 @@ void G4ionIonisation::InitialiseEnergyLossProcess(
|
||||
|
||||
void G4ionIonisation::PrintInfo()
|
||||
{
|
||||
G4cout << " Scaling relation is used to proton dE/dx and range"
|
||||
<< G4endl
|
||||
<< " Bether-Bloch model for Escaled > " << eth << " MeV, ICRU49 "
|
||||
<< "parametrisation for alpha particles below.";
|
||||
if(stopDataActive)
|
||||
G4cout << G4endl << " Stopping Power data for " << corr->GetNumberOfStoppingVectors()
|
||||
<< " ion/material pairs are used.";
|
||||
G4cout << G4endl;
|
||||
if(EmModel(1) && EmModel(2))
|
||||
G4cout << " Scaling relation is used from proton dE/dx and range."
|
||||
<< "\n Delta cross sections and sampling from "
|
||||
<< EmModel(2)->GetName() << " model for scaled energy > "
|
||||
<< eth/MeV << " MeV"
|
||||
<< "\n Parametrisation from "
|
||||
<< EmModel(1)->GetName() << " for protons below."
|
||||
<< G4endl;
|
||||
if (stopDataActive)
|
||||
G4cout << "\n Stopping Power data for "
|
||||
<< corr->GetNumberOfStoppingVectors()
|
||||
<< " ion/material pairs are used."
|
||||
<< G4endl;
|
||||
}
|
||||
|
||||
//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
|
||||
|
||||
Reference in New Issue
Block a user