Import Geant4 9.1.0 source tree

This commit is contained in:
Gabriele Cosmo
2016-06-09 15:37:50 +02:00
parent a8e9364cea
commit 96c8bcd0af
6923 changed files with 198390 additions and 41849 deletions
@@ -24,8 +24,8 @@
// ********************************************************************
//
//
// $Id: G4DiffuseElastic.hh,v 1.7 2007/06/12 14:46:26 grichine Exp $
// GEANT4 tag $Name: geant4-09-00 $
// $Id: G4DiffuseElastic.hh,v 1.13 2007/11/06 17:01:20 grichine Exp $
// GEANT4 tag $Name: geant4-09-01 $
//
//
// G4 Model: optical elastic scattering with 4-momentum balance
@@ -35,7 +35,8 @@
// Class Description - End
//
//
// 24.05.07 V. Grichine first implementation for proton elastic scattering
// 24.05.07 V. Grichine first implementation for hadron (no Coulomb) elastic scattering
// 04.09.07 V. Grichine implementation for Coulomb elastic scattering
#ifndef G4DiffuseElastic_h
@@ -49,6 +50,8 @@
using namespace std;
class G4ParticleDefinition;
class G4PhysicsTable;
class G4PhysicsLogVector;
class G4DiffuseElastic : public G4HadronicInteraction
{
@@ -56,7 +59,20 @@ public:
G4DiffuseElastic();
G4DiffuseElastic(const G4ParticleDefinition* aParticle);
virtual ~G4DiffuseElastic();
void Initialise();
void InitialiseOnFly(G4double Z, G4double A);
void BuildAngleTable();
G4HadFinalState * ApplyYourself(const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus);
@@ -75,8 +91,16 @@ public:
G4double SampleT(const G4ParticleDefinition* aParticle,
G4double p, G4double A);
G4double SampleTableT(const G4ParticleDefinition* aParticle,
G4double p, G4double Z, G4double A);
G4double SampleThetaCMS(const G4ParticleDefinition* aParticle, G4double p, G4double A);
G4double SampleTableThetaCMS(const G4ParticleDefinition* aParticle, G4double p,
G4double Z, G4double A);
G4double GetScatteringAngle(G4int iMomentum, G4int iAngle, G4double position);
G4double SampleThetaLab(const G4HadProjectile* aParticle,
G4double tmass, G4double A);
@@ -84,17 +108,72 @@ public:
G4double theta,
G4double momentum,
G4double A );
G4double GetInvElasticXsc( const G4ParticleDefinition* particle,
G4double theta,
G4double momentum,
G4double A, G4double Z );
G4double GetDiffuseElasticSumXsc( const G4ParticleDefinition* particle,
G4double theta,
G4double momentum,
G4double A, G4double Z );
G4double GetInvElasticSumXsc( const G4ParticleDefinition* particle,
G4double tMand,
G4double momentum,
G4double A, G4double Z );
G4double IntegralElasticProb( const G4ParticleDefinition* particle,
G4double theta,
G4double momentum,
G4double A );
G4double GetCoulombElasticXsc( const G4ParticleDefinition* particle,
G4double theta,
G4double momentum,
G4double Z );
G4double GetInvCoulombElasticXsc( const G4ParticleDefinition* particle,
G4double tMand,
G4double momentum,
G4double A, G4double Z );
G4double GetCoulombTotalXsc( const G4ParticleDefinition* particle,
G4double momentum, G4double Z );
G4double GetCoulombIntegralXsc( const G4ParticleDefinition* particle,
G4double momentum, G4double Z,
G4double theta1, G4double theta2 );
G4double CalculateParticleBeta( const G4ParticleDefinition* particle,
G4double momentum );
G4double CalculateZommerfeld( G4double beta, G4double Z1, G4double Z2 );
G4double CalculateAm( G4double momentum, G4double n, G4double Z);
G4double CalculateNuclearRad( G4double A);
G4double ThetaCMStoThetaLab(const G4DynamicParticle* aParticle,
G4double tmass, G4double thetaCMS);
G4double ThetaLabToThetaCMS(const G4DynamicParticle* aParticle,
G4double tmass, G4double thetaLab);
G4double BesselJzero(G4double z);
G4double BesselJone(G4double z);
G4double DampFactor(G4double z);
G4double BesselOneByArg(G4double z);
G4double GetDiffElasticProb(G4double theta);
G4double GetDiffElasticSumProb(G4double theta);
G4double GetIntegrandFunction(G4double theta);
@@ -117,13 +196,29 @@ private:
G4double lowestEnergyLimit;
G4double plabLowLimit;
G4int fEnergyBin;
G4int fAngleBin;
G4PhysicsLogVector* fEnergyVector;
G4PhysicsTable* fAngleTable;
std::vector<G4PhysicsTable*> fAngleBank;
std::vector<G4double> fElementNumberVector;
std::vector<G4String> fElementNameVector;
const G4ParticleDefinition* fParticle;
G4double fWaveVector;
G4double fAtomicWeight;
G4double fAtomicNumber;
G4double fNuclearRadius;
G4double fBeta;
G4double fZommerfeld;
G4double fAm;
G4bool fAddCoulomb;
};
inline void G4DiffuseElastic::SetRecoilKinEnergyLimit(G4double value)
{
lowEnergyRecoilLimit = value;
@@ -257,7 +352,7 @@ inline G4double G4DiffuseElastic::BesselJone(G4double value)
////////////////////////////////////////////////////////////////////
//
// damp factor in diffraction x*pi/sh(x*pi)
// damp factor in diffraction x/sh(x), x was already *pi
inline G4double G4DiffuseElastic::DampFactor(G4double x)
{
@@ -299,4 +394,148 @@ inline G4double G4DiffuseElastic::BesselOneByArg(G4double x)
return result;
}
////////////////////////////////////////////////////////////////////
//
// return particle beta
inline G4double G4DiffuseElastic::CalculateParticleBeta( const G4ParticleDefinition* particle,
G4double momentum )
{
G4double mass = particle->GetPDGMass();
G4double a = momentum/mass;
fBeta = a/std::sqrt(1+a*a);
return fBeta;
}
////////////////////////////////////////////////////////////////////
//
// return Zommerfeld parameter for Coulomb scattering
inline G4double G4DiffuseElastic::CalculateZommerfeld( G4double beta, G4double Z1, G4double Z2 )
{
fZommerfeld = fine_structure_const*Z1*Z2/beta;
return fZommerfeld;
}
////////////////////////////////////////////////////////////////////
//
// return Wentzel correction for Coulomb scattering
inline G4double G4DiffuseElastic::CalculateAm( G4double momentum, G4double n, G4double Z)
{
G4double k = momentum/hbarc;
G4double ch = 1.13 + 3.76*n*n;
G4double zn = 1.77*k*std::pow(Z,-1./3.)*Bohr_radius;
G4double zn2 = zn*zn;
fAm = ch/zn2;
return fAm;
}
////////////////////////////////////////////////////////////////////
//
// calculate nuclear radius for different atomic weights using different approximations
inline G4double G4DiffuseElastic::CalculateNuclearRad( G4double A)
{
G4double r0;
if(A < 50.)
{
if(A > 10.) r0 = 1.16*( 1 - std::pow(A, -2./3.) )*fermi; // 1.08*fermi;
else r0 = 1.1*fermi;
fNuclearRadius = r0*std::pow(A, 1./3.);
}
else
{
r0 = 1.7*fermi;
fNuclearRadius = r0*std::pow(A, 0.27);
}
return fNuclearRadius;
}
////////////////////////////////////////////////////////////////////
//
// return Coulomb scattering differential xsc with Wentzel correction
inline G4double G4DiffuseElastic::GetCoulombElasticXsc( const G4ParticleDefinition* particle,
G4double theta,
G4double momentum,
G4double Z )
{
G4double sinHalfTheta = std::sin(0.5*theta);
G4double sinHalfTheta2 = sinHalfTheta*sinHalfTheta;
G4double beta = CalculateParticleBeta( particle, momentum);
G4double z = particle->GetPDGCharge();
G4double n = CalculateZommerfeld( beta, z, Z );
G4double am = CalculateAm( momentum, n, Z);
G4double k = momentum/hbarc;
G4double ch = 0.5*n/k;
G4double ch2 = ch*ch;
G4double xsc = ch2/(sinHalfTheta2+am)/(sinHalfTheta2+am);
return xsc;
}
////////////////////////////////////////////////////////////////////
//
// return Coulomb scattering total xsc with Wentzel correction
inline G4double G4DiffuseElastic::GetCoulombTotalXsc( const G4ParticleDefinition* particle,
G4double momentum, G4double Z )
{
G4double beta = CalculateParticleBeta( particle, momentum);
G4cout<<"beta = "<<beta<<G4endl;
G4double z = particle->GetPDGCharge();
G4double n = CalculateZommerfeld( beta, z, Z );
G4cout<<"fZomerfeld = "<<n<<G4endl;
G4double am = CalculateAm( momentum, n, Z);
G4cout<<"cof Am = "<<am<<G4endl;
G4double k = momentum/hbarc;
G4cout<<"k = "<<k*fermi<<" 1/fermi"<<G4endl;
G4cout<<"k*Bohr_radius = "<<k*Bohr_radius<<G4endl;
G4double ch = n/k;
G4double ch2 = ch*ch;
G4double xsc = ch2*pi/(am +am*am);
return xsc;
}
////////////////////////////////////////////////////////////////////
//
// return Coulomb scattering xsc with Wentzel correction integrated between
// theta1 and < theta2
inline G4double G4DiffuseElastic::GetCoulombIntegralXsc( const G4ParticleDefinition* particle,
G4double momentum, G4double Z,
G4double theta1, G4double theta2 )
{
G4double c1 = std::cos(theta1);
G4cout<<"c1 = "<<c1<<G4endl;
G4double c2 = std::cos(theta2);
G4cout<<"c2 = "<<c2<<G4endl;
G4double beta = CalculateParticleBeta( particle, momentum);
// G4cout<<"beta = "<<beta<<G4endl;
G4double z = particle->GetPDGCharge();
G4double n = CalculateZommerfeld( beta, z, Z );
// G4cout<<"fZomerfeld = "<<n<<G4endl;
G4double am = CalculateAm( momentum, n, Z);
// G4cout<<"cof Am = "<<am<<G4endl;
G4double k = momentum/hbarc;
// G4cout<<"k = "<<k*fermi<<" 1/fermi"<<G4endl;
// G4cout<<"k*Bohr_radius = "<<k*Bohr_radius<<G4endl;
G4double ch = n/k;
G4double ch2 = ch*ch;
am *= 2.;
G4double xsc = ch2*twopi*(c1-c2);
xsc /= (1 - c1 + am)*(1 - c2 + am);
return xsc;
}
#endif