75     lowEnergyLimit(250*
eV),
 
   76     highEnergyLimit(100*
GeV),
 
   77     intrinsicLowEnergyLimit(10*
eV),
 
   78     intrinsicHighEnergyLimit(100*
GeV)
 
   80   if (lowEnergyLimit < intrinsicLowEnergyLimit ||
 
   81       highEnergyLimit > intrinsicHighEnergyLimit)
 
   83       G4Exception(
"G4LowEnergyCompton::G4LowEnergyCompton()",
 
   85                   "Energy outside intrinsic process validity range!");
 
   91   G4String scatterFile = 
"comp/ce-sf-";
 
   93   scatterFunctionData->
LoadData(scatterFile);
 
   95   meanFreePathTable = 0;
 
  106           << lowEnergyLimit / 
keV << 
" keV - " 
  107           << highEnergyLimit / 
GeV << 
" GeV" 
  114   delete meanFreePathTable;
 
  115   delete crossSectionHandler;
 
  116   delete scatterFunctionData;
 
  123   crossSectionHandler->
Clear();
 
  124   G4String crossSectionFile = 
"comp/ce-cs-";
 
  125   crossSectionHandler->
LoadData(crossSectionFile);
 
  127   delete meanFreePathTable;
 
  131   G4String file = 
"/doppler/shell-doppler";
 
  158   if (photonEnergy0 <= lowEnergyLimit)
 
  170   G4double alpha1 = -std::log(epsilon0);
 
  171   G4double alpha2 = 0.5 * (1. - epsilon0Sq);
 
  193       epsilonSq = epsilon0Sq + (1. - epsilon0Sq) * 
G4UniformRand();
 
  194       epsilon = std::sqrt(epsilonSq);
 
  197       oneCosT = (1. - 
epsilon) / ( epsilon * e0m);
 
  198       sinT2 = oneCosT * (2. - oneCosT);
 
  199       G4double x = std::sqrt(oneCosT/2.) / (wlPhoton/
cm);
 
  201       gReject = (1. - epsilon * sinT2 / (1. + epsilonSq)) * scatteringFunction;
 
  206   G4double sinTheta = std::sqrt (sinT2);
 
  208   G4double dirX = sinTheta * std::cos(phi);
 
  209   G4double dirY = sinTheta * std::sin(phi);
 
  218   G4int maxDopplerIterations = 1000;
 
  220   G4double photonEoriginal = epsilon * photonEnergy0;
 
  231       eMax = photonEnergy0 - bindingE;
 
  237       G4double pDoppler2 = pDoppler * pDoppler;
 
  239       G4double var3 = var2*var2 - pDoppler2;
 
  240       G4double var4 = var2 - pDoppler2 * cosTheta;
 
  241       G4double var = var4*var4 - var3 + pDoppler2 * var3;
 
  245       G4double scale = photonEnergy0 / var3;  
 
  247       if (
G4UniformRand() < 0.5) photonE = (var4 - varSqrt) * scale;               
 
  248       else photonE = (var4 + varSqrt) * scale;
 
  254    } 
while ( iteration <= maxDopplerIterations && 
 
  255          (photonE < 0. || photonE > eMax || photonE < eMax*
G4UniformRand()) );
 
  259   if (iteration >= maxDopplerIterations)
 
  261       photonE = photonEoriginal;
 
  268   photonDirection1.
rotateUz(photonDirection0);
 
  274   if (photonEnergy1 > 0.)
 
  285   G4double eKineticEnergy = photonEnergy0 - photonEnergy1 - bindingE;
 
  288   G4double electronE = photonEnergy0 * (1. - 
epsilon) + electron_mass_c2; 
 
  294       cosThetaE = (eTotalEnergy + photonEnergy1 )* (1. - epsilon) / std::sqrt(electronP2);
 
  295       sinThetaE = -1. * std::sqrt(1. - cosThetaE * cosThetaE); 
 
  298   G4double eDirX = sinThetaE * std::cos(phi);
 
  299   G4double eDirY = sinThetaE * std::sin(phi);
 
  309       eDirection.
rotateUz(photonDirection0);
 
  338   size_t materialIndex = couple->
GetIndex();
 
  341   if (energy > highEnergyLimit) meanFreePath = meanFreePathTable->
FindValue(highEnergyLimit,materialIndex);
 
  342   else if (energy < lowEnergyLimit) meanFreePath = 
DBL_MAX;
 
  343   else meanFreePath = meanFreePathTable->
FindValue(energy,materialIndex);
 
G4double GetKineticEnergy() const 
 
const G4DynamicParticle * GetDynamicParticle() const 
 
G4LowEnergyCompton(const G4String &processName="LowEnCompton")
 
const G4MaterialCutsCouple * GetMaterialCutsCouple() const 
 
G4double BindingEnergy(G4int Z, G4int shellIndex) const 
 
G4RDVEMDataSet * BuildMeanFreePathForMaterials(const G4DataVector *energyCuts=0)
 
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
 
static constexpr double twopi
 
void LoadData(const G4String &fileName)
 
void BuildPhysicsTable(const G4ParticleDefinition &definition)
 
G4GLOB_DLL std::ostream G4cout
 
const G4ThreeVector & GetMomentumDirection() const 
 
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition)
 
static constexpr double cm
 
Hep3Vector & rotateUz(const Hep3Vector &)
 
G4bool IsApplicable(const G4ParticleDefinition &definition)
 
static constexpr double eV
 
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
 
const G4String & GetProcessName() const 
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
G4double RandomSelectMomentum(G4int Z, G4int shellIndex) const 
 
virtual G4bool Escape(const G4ParticleDefinition *particle, const G4MaterialCutsCouple *couple, G4double energy, G4double safety) const =0
 
virtual void Initialize(const G4Track &)
 
G4double energy(const ThreeVector &p, const G4double m)
 
void SetNumberOfSecondaries(G4int totSecondaries)
 
G4StepPoint * GetPostStepPoint() const 
 
G4int SelectRandomAtom(const G4MaterialCutsCouple *couple, G4double e) const 
 
void ProposeEnergy(G4double finalEnergy)
 
G4ParticleChange aParticleChange
 
static constexpr double GeV
 
G4double GetSafety() const 
 
void AddSecondary(G4Track *aSecondary)
 
static G4Electron * Electron()
 
G4VParticleChange * PostStepDoIt(const G4Track &track, const G4Step &step)
 
void LoadData(const G4String &dataFile)
 
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
 
void ProposeTrackStatus(G4TrackStatus status)
 
static constexpr double keV
 
G4int SelectRandomShell(G4int Z) const 
 
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
 
double epsilon(double density, double temperature)
 
virtual G4bool LoadData(const G4String &fileName)=0