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 ;
197 G4double screenMin = std::min(4.*screenFactor,screenMax) ;
200 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
201 G4double epsilonMin = std::max(epsilon0Local,epsilon1);
202 G4double epsilonRange = 0.5 - epsilonMin ;
208 G4double f10 = ScreenFunction1(screenMin) - fZ;
209 G4double f20 = ScreenFunction2(screenMin) - fZ;
210 G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
211 G4double normF2 = std::max(1.5 * f20,0.);
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);