80 lowEnergyLimit(1.022000*
MeV),
81 highEnergyLimit(100*
GeV),
82 intrinsicLowEnergyLimit(1.022000*
MeV),
83 intrinsicHighEnergyLimit(100*
GeV),
87 if (lowEnergyLimit < intrinsicLowEnergyLimit ||
88 highEnergyLimit > intrinsicHighEnergyLimit)
90 G4Exception(
"G4LowEnergyGammaConversion::G4LowEnergyGammaConversion()",
92 "Energy limit outside intrinsic process validity range!");
99 meanFreePathTable = 0;
106 << lowEnergyLimit /
MeV <<
" MeV - "
107 << highEnergyLimit /
GeV <<
" GeV"
114 delete meanFreePathTable;
115 delete crossSectionHandler;
122 crossSectionHandler->
Clear();
123 G4String crossSectionFile =
"pair/pp-cs-";
124 crossSectionHandler->
LoadData(crossSectionFile);
126 delete meanFreePathTable;
155 if (photonEnergy < smallEnergy )
166 G4cout <<
"G4LowEnergyGammaConversion::PostStepDoIt - element = 0" <<
G4endl;
171 G4cout <<
"G4LowEnergyGammaConversion::PostStepDoIt - ionisation = 0" <<
G4endl;
176 if (photonEnergy > 50. *
MeV) fZ += 8. * (element->
GetfCoulomb());
180 G4double screenMax = std::exp ((42.24 - fZ)/8.368) - 0.952 ;
181 G4double screenMin = std::min(4.*screenFactor,screenMax) ;
184 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
185 G4double epsilonMin = std::max(epsilon0,epsilon1);
186 G4double epsilonRange = 0.5 - epsilonMin ;
192 G4double f10 = ScreenFunction1(screenMin) - fZ;
193 G4double f20 = ScreenFunction2(screenMin) - fZ;
194 G4double normF1 = std::max(f10 * epsilonRange * epsilonRange,0.);
195 G4double normF2 = std::max(1.5 * f20,0.);
200 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
201 screen = screenFactor / (epsilon * (1. - epsilon));
202 gReject = (ScreenFunction1(screen) - fZ) / f10 ;
207 screen = screenFactor / (epsilon * (1 - epsilon));
208 gReject = (ScreenFunction2(screen) - fZ) / f20 ;
221 electronTotEnergy = (1. - epsilon) * photonEnergy;
222 positronTotEnergy = epsilon * photonEnergy;
226 positronTotEnergy = (1. - epsilon) * photonEnergy;
227 electronTotEnergy = epsilon * photonEnergy;
253 G4double dxEle= std::sin(thetaEle)*std::cos(phi),dyEle= std::sin(thetaEle)*std::sin(phi),dzEle=std::cos(thetaEle);
254 G4double dxPos=-std::sin(thetaPos)*std::cos(phi),dyPos=-std::sin(thetaPos)*std::sin(phi),dzPos=std::cos(thetaPos);
273 electronDirection.
rotateUz(photonDirection);
282 localEnergyDeposit += electronKineEnergy ;
291 localEnergyDeposit += positronKineEnergy ;
292 positronKineEnergy = 0. ;
296 positronDirection.
rotateUz(photonDirection);
300 positronDirection, positronKineEnergy);
326 size_t materialIndex = couple->
GetIndex();
329 if (energy > highEnergyLimit) meanFreePath = meanFreePathTable->
FindValue(highEnergyLimit,materialIndex);
330 else if (energy < lowEnergyLimit) meanFreePath =
DBL_MAX;
331 else meanFreePath = meanFreePathTable->
FindValue(energy,materialIndex);
335 G4double G4LowEnergyGammaConversion::ScreenFunction1(
G4double screenVariable)
341 if (screenVariable > 1.)
342 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
344 value = 42.392 - screenVariable * (7.796 - 1.961 * screenVariable);
349 G4double G4LowEnergyGammaConversion::ScreenFunction2(
G4double screenVariable)
355 if (screenVariable > 1.)
356 value = 42.24 - 8.368 * std::log(screenVariable + 0.952);
358 value = 41.405 - screenVariable * (5.828 - 0.8945 * screenVariable);