186 if(!(gammaPolarization0.
isOrthogonal(gammaDirection0, 1
e-6))||(gammaPolarization0.
mag()==0))
223 G4double alpha1 = - std::log(epsilon0);
224 G4double alpha2 = 0.5*(1.- epsilon0Sq);
239 epsilon = std::sqrt(epsilonSq);
242 onecost = (1.-
epsilon)/(epsilon*E0_m);
243 sinThetaSqr = onecost*(2.-onecost);
246 if (sinThetaSqr > 1.)
249 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 250 <<
"sin(theta)**2 = " 256 if (sinThetaSqr < 0.)
259 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 260 <<
"sin(theta)**2 = " 268 G4double x = std::sqrt(onecost/2.) / (wlGamma/
cm);;
270 greject = (1. - epsilon*sinThetaSqr/(1.+ epsilonSq))*scatteringFunction;
292 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 302 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 312 G4double sinTheta = std::sqrt (sinThetaSqr);
318 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 328 <<
" -- Warning -- G4LowEnergyPolarizedCompton::PostStepDoIt " 338 G4double dirx = sinTheta*std::cos(phi);
339 G4double diry = sinTheta*std::sin(phi);
354 G4int maxDopplerIterations = 1000;
356 G4double photonEoriginal = epsilon * gammaEnergy0;
368 eMax = gammaEnergy0 - bindingE;
374 G4double pDoppler2 = pDoppler * pDoppler;
375 G4double var2 = 1. + onecost * E0_m;
376 G4double var3 = var2*var2 - pDoppler2;
377 G4double var4 = var2 - pDoppler2 * cosTheta;
378 G4double var = var4*var4 - var3 + pDoppler2 * var3;
384 if (
G4UniformRand() < 0.5) photonE = (var4 - varSqrt) * scale;
385 else photonE = (var4 + varSqrt) * scale;
391 }
while ( iteration <= maxDopplerIterations &&
392 (photonE < 0. || photonE > eMax || photonE < eMax*
G4UniformRand()) );
396 if (iteration >= maxDopplerIterations)
398 photonE = photonEoriginal;
402 gammaEnergy1 = photonE;
428 gammaDirection1 = tmpDirection1;
433 gammaPolarization0,gammaPolarization1);
435 if (gammaEnergy1 > 0.)
451 G4double ElecKineEnergy = gammaEnergy0 - gammaEnergy1 -bindingE;
456 G4double safety = aStep.GetPostStepPoint()->GetSafety();
462 G4ThreeVector ElecDirection((gammaEnergy0 * gammaDirection0 -
463 gammaEnergy1 * gammaDirection1) * (1./ElecMomentum));
G4int SelectRandomAtom(const G4MaterialCutsCouple *couple, G4double e) const
double howOrthogonal(const Hep3Vector &v) const
G4RDDopplerProfile profileData
G4ThreeVector SetNewPolarization(G4double epsilon, G4double sinSqrTheta, G4double phi, G4double cosTheta)
G4double GetKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
virtual G4double FindValue(G4double x, G4int componentId=0) const =0
void SystemOfRefChange(G4ThreeVector &direction0, G4ThreeVector &direction1, G4ThreeVector &polarization0, G4ThreeVector &polarization1)
bool isOrthogonal(const Hep3Vector &v, double epsilon=tolerance) const
G4int SelectRandomShell(G4int Z) const
G4RDVRangeTest * rangeTest
virtual G4bool Escape(const G4ParticleDefinition *particle, const G4MaterialCutsCouple *couple, G4double energy, G4double safety) const =0
G4double BindingEnergy(G4int Z, G4int shellIndex) const
G4RDVCrossSectionHandler * crossSectionHandler
const G4ThreeVector & GetMomentumDirection() const
G4double SetPhi(G4double, G4double)
const G4ThreeVector & GetPolarization() const
G4ParticleChange aParticleChange
G4double RandomSelectMomentum(G4int Z, G4int shellIndex) const
G4RDVEMDataSet * scatterFunctionData
static G4Electron * Electron()
G4ThreeVector GetPerpendicularPolarization(const G4ThreeVector &direction0, const G4ThreeVector &polarization0) const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
double epsilon(double density, double temperature)
G4ThreeVector GetRandomPolarization(G4ThreeVector &direction0)