80 lowEnergyLimit(1.022000*
MeV),
81 highEnergyLimit(100*
GeV),
82 intrinsicLowEnergyLimit(1.022000*
MeV),
83 intrinsicHighEnergyLimit(100*
GeV),
90 G4Exception(
"G4LowEnergyGammaConversion::G4LowEnergyGammaConversion()",
92 "Energy limit outside intrinsic process validity range!");
123 G4String crossSectionFile =
"pair/pp-cs-";
152 G4double epsilon0 = electron_mass_c2 / photonEnergy ;
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 ;
184 G4double epsilon1 = 0.5 - 0.5 * std::sqrt(1. - screenMin / screenMax) ;
186 G4double epsilonRange = 0.5 - epsilonMin ;
200 epsilon = 0.5 - epsilonRange * std::pow(
G4UniformRand(), 0.3333) ;
201 screen = screenFactor / (epsilon * (1. -
epsilon));
207 screen = screenFactor / (epsilon * (1 -
epsilon));
219 if (CLHEP::RandBit::shootBit())
221 electronTotEnergy = (1. -
epsilon) * photonEnergy;
222 positronTotEnergy = epsilon * photonEnergy;
226 positronTotEnergy = (1. -
epsilon) * photonEnergy;
227 electronTotEnergy = epsilon * photonEnergy;
249 G4double thetaEle = u*electron_mass_c2/electronTotEnergy;
250 G4double thetaPos = u*electron_mass_c2/positronTotEnergy;
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);
264 G4double electronKineEnergy =
std::max(0.,electronTotEnergy - electron_mass_c2) ;
273 electronDirection.rotateUz(photonDirection);
282 localEnergyDeposit += electronKineEnergy ;
286 G4double positronKineEnergy =
std::max(0.,positronTotEnergy - electron_mass_c2) ;
291 localEnergyDeposit += positronKineEnergy ;
292 positronKineEnergy = 0. ;
296 positronDirection.rotateUz(photonDirection);
300 positronDirection, positronKineEnergy);
326 size_t materialIndex = couple->
GetIndex();
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);
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);
const G4double intrinsicLowEnergyLimit
G4double ScreenFunction1(G4double screenVariable)
G4double GetKineticEnergy() const
CLHEP::Hep3Vector G4ThreeVector
const G4DynamicParticle * GetDynamicParticle() const
void Initialise(G4RDVDataSetAlgorithm *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)
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
G4double GetfCoulomb() const
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition)
G4RDVRangeTest * rangeTest
G4LowEnergyGammaConversion(const G4String &processName="LowEnConversion")
G4RDVEMDataSet * BuildMeanFreePathForMaterials(const G4DataVector *energyCuts=0)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
~G4LowEnergyGammaConversion()
static constexpr double twopi
G4RDVEMDataSet * meanFreePathTable
G4GLOB_DLL std::ostream G4cout
void BuildPhysicsTable(const G4ParticleDefinition &photon)
const G4ThreeVector & GetMomentumDirection() const
G4RDVCrossSectionHandler * crossSectionHandler
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
const G4String & GetProcessName() const
G4double GetlogZ3() const
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
const G4double intrinsicHighEnergyLimit
virtual G4bool Escape(const G4ParticleDefinition *particle, const G4MaterialCutsCouple *couple, G4double energy, G4double safety) const =0
virtual void Initialize(const G4Track &)
const G4double smallEnergy
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
static G4Positron * Positron()
T max(const T t1, const T t2)
brief Return the largest of the two arguments
G4double energy(const ThreeVector &p, const G4double m)
void SetNumberOfSecondaries(G4int totSecondaries)
G4StepPoint * GetPostStepPoint() const
G4IonisParamElm * GetIonisation() const
void ProposeEnergy(G4double finalEnergy)
G4ParticleChange aParticleChange
T min(const T t1, const T t2)
brief Return the smallest of the two arguments
static constexpr double GeV
G4double GetSafety() const
void AddSecondary(G4Track *aSecondary)
static G4Electron * Electron()
static constexpr double MeV
void LoadData(const G4String &dataFile)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
G4bool IsApplicable(const G4ParticleDefinition &photon)
void ProposeTrackStatus(G4TrackStatus status)
G4double ScreenFunction2(G4double screenVariable)
G4ThreeVector G4ParticleMomentum
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
const G4Element * SelectRandomElement(const G4MaterialCutsCouple *material, G4double e) const
double epsilon(double density, double temperature)