45 crossSectionHandler(0),meanFreePathTable(0)
60 G4cout <<
"Livermore Nuclear Gamma conversion is constructed " <<
G4endl
82 G4cout <<
"Calling G4LivermoreNuclearGammaConversionModel::Initialise()" <<
G4endl;
94 G4String crossSectionFile =
"pairdata/pp-pair-cs-";
100 G4cout <<
"Loaded cross section files for Livermore GammaConversion" <<
G4endl;
101 G4cout <<
"To obtain the total cross section this should be used only " << G4endl
102 <<
"in connection with G4ElectronGammaConversion " <<
G4endl;
106 G4cout <<
"Livermore Nuclear Gamma Conversion model is initialized " << G4endl
127 G4cout <<
"Calling ComputeCrossSectionPerAtom() of G4LivermoreNuclearGammaConversionModel"
130 if (GammaEnergy < lowEnergyLimit || GammaEnergy >
highEnergyLimit)
return 0;
156 G4cout <<
"Calling SampleSecondaries() of G4LivermoreNuclearGammaConversionModel" <<
G4endl;
162 G4double epsilon0Local = electron_mass_c2 / photonEnergy ;
167 epsilon = epsilon0Local + (0.5 - epsilon0Local) *
G4UniformRand();
178 G4cout <<
"G4LivermoreNuclearGammaConversionModel::SampleSecondaries - element = 0"
185 G4cout <<
"G4LivermoreNuclearGammaConversionModel::SampleSecondaries - ionisation = 0"
192 if (photonEnergy > 50. *
MeV) fZ += 8. * (element->
GetfCoulomb());
196 G4double screenMax = std::exp ((42.24 - fZ)/8.368) - 0.952 ;
200 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
202 G4double epsilonRange = 0.5 - epsilonMin ;
216 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
217 screen = screenFactor / (epsilon * (1. - epsilon));
223 screen = screenFactor / (epsilon * (1 - epsilon));
237 electronTotEnergy = (1. - epsilon) * photonEnergy;
238 positronTotEnergy = epsilon * photonEnergy;
242 positronTotEnergy = (1. - epsilon) * photonEnergy;
243 electronTotEnergy = epsilon * photonEnergy;
265 G4double thetaEle = u*electron_mass_c2/electronTotEnergy;
266 G4double thetaPos = u*electron_mass_c2/positronTotEnergy;
269 G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle);
270 G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos);
277 G4double electronKineEnergy =
std::max(0.,electronTotEnergy - electron_mass_c2) ;
282 electronDirection.rotateUz(photonDirection);
289 G4double positronKineEnergy =
std::max(0.,positronTotEnergy - electron_mass_c2) ;
294 positronDirection.rotateUz(photonDirection);
298 positronDirection, positronKineEnergy);
301 fvect->push_back(particle1);
302 fvect->push_back(particle2);
318 if (screenVariable > 1.)
319 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
321 value = 42.392 - screenVariable * (7.796 - 1.961 * screenVariable);
334 if (screenVariable > 1.)
335 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
337 value = 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable);
G4double ScreenFunction1(G4double screenVariable)
virtual ~G4LivermoreNuclearGammaConversionModel()
G4double LowEnergyLimit() const
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
G4double HighEnergyLimit() const
G4double GetfCoulomb() const
G4ParticleDefinition * GetDefinition() const
G4ParticleChangeForGamma * fParticleChange
G4VCrossSectionHandler * crossSectionHandler
void SetHighEnergyLimit(G4double)
G4double FindValue(G4int Z, G4double e) const
G4GLOB_DLL std::ostream G4cout
G4LivermoreNuclearGammaConversionModel(const G4ParticleDefinition *p=0, const G4String &nam="LivermoreNuclearGammaConversion")
const G4ThreeVector & GetMomentumDirection() const
virtual G4double ComputeCrossSectionPerAtom(const G4ParticleDefinition *, G4double kinEnergy, G4double Z, G4double A=0, G4double cut=0, G4double emax=DBL_MAX)
G4double GetlogZ3() const
virtual void SampleSecondaries(std::vector< G4DynamicParticle * > *, const G4MaterialCutsCouple *, const G4DynamicParticle *, G4double tmin, G4double maxEnergy)
void Initialise(G4VDataSetAlgorithm *interpolation=0, G4double minE=250 *CLHEP::eV, G4double maxE=100 *CLHEP::GeV, G4int numberOfBins=200, G4double unitE=CLHEP::MeV, G4double unitData=CLHEP::barn, G4int minZ=1, G4int maxZ=99)
static G4Positron * Positron()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4IonisParamElm * GetIonisation() const
void LoadData(const G4String &dataFile)
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
virtual void Initialise(const G4ParticleDefinition *, const G4DataVector &)
const G4double smallEnergy
static G4Electron * Electron()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeTrackStatus(G4TrackStatus status)
G4ThreeVector G4ParticleMomentum
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4ParticleChangeForGamma * GetParticleChangeForGamma()
G4double ScreenFunction2(G4double screenVariable)