45 crossSectionHandler(0),meanFreePathTable(0)
48 highEnergyLimit = 100 *
GeV;
59 if(verboseLevel > 0) {
60 G4cout <<
"Livermore Nuclear Gamma conversion is constructed " <<
G4endl
62 << lowEnergyLimit /
MeV <<
" MeV - "
63 << highEnergyLimit /
GeV <<
" GeV"
72 if (crossSectionHandler)
delete crossSectionHandler;
82 G4cout <<
"Calling G4LivermoreNuclearGammaConversionModel::Initialise()" <<
G4endl;
84 if (crossSectionHandler)
86 crossSectionHandler->
Clear();
87 delete crossSectionHandler;
93 crossSectionHandler->
Initialise(0,lowEnergyLimit,100.*
GeV,400);
94 G4String crossSectionFile =
"pairdata/pp-pair-cs-";
95 crossSectionHandler->
LoadData(crossSectionFile);
99 if (verboseLevel > 0) {
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;
105 if (verboseLevel > 0) {
106 G4cout <<
"Livermore Nuclear Gamma Conversion model is initialized " << G4endl
113 if(isInitialised)
return;
115 isInitialised =
true;
126 if (verboseLevel > 3) {
127 G4cout <<
"Calling ComputeCrossSectionPerAtom() of G4LivermoreNuclearGammaConversionModel"
130 if (GammaEnergy < lowEnergyLimit || GammaEnergy > highEnergyLimit)
return 0;
155 if (verboseLevel > 3)
156 G4cout <<
"Calling SampleSecondaries() of G4LivermoreNuclearGammaConversionModel" <<
G4endl;
165 if (photonEnergy < smallEnergy )
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 ;
208 G4double f10 = ScreenFunction1(screenMin) - fZ;
209 G4double f20 = ScreenFunction2(screenMin) - fZ;
216 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
217 screen = screenFactor / (epsilon * (1. - epsilon));
218 gReject = (ScreenFunction1(screen) - fZ) / f10 ;
223 screen = screenFactor / (epsilon * (1 - epsilon));
224 gReject = (ScreenFunction2(screen) - fZ) / f20 ;
237 electronTotEnergy = (1. - epsilon) * photonEnergy;
238 positronTotEnergy = epsilon * photonEnergy;
242 positronTotEnergy = (1. - epsilon) * photonEnergy;
243 electronTotEnergy = epsilon * photonEnergy;
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);
282 electronDirection.
rotateUz(photonDirection);
294 positronDirection.
rotateUz(photonDirection);
298 positronDirection, positronKineEnergy);
301 fvect->push_back(particle1);
302 fvect->push_back(particle2);
312 G4double G4LivermoreNuclearGammaConversionModel::ScreenFunction1(
G4double screenVariable)
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);
328 G4double G4LivermoreNuclearGammaConversionModel::ScreenFunction2(
G4double 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);
virtual ~G4LivermoreNuclearGammaConversionModel()
G4double LowEnergyLimit() const
G4double GetKineticEnergy() const
G4double HighEnergyLimit() const
G4double GetfCoulomb() const
G4ParticleDefinition * GetDefinition() const
G4ParticleChangeForGamma * fParticleChange
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
Hep3Vector & rotateUz(const Hep3Vector &)
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 XML_Char int const XML_Char * value
static G4Electron * Electron()
void SetProposedKineticEnergy(G4double proposedKinEnergy)
void ProposeTrackStatus(G4TrackStatus status)
const G4Element * SelectRandomAtom(const G4MaterialCutsCouple *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
G4ParticleChangeForGamma * GetParticleChangeForGamma()