60 LowestEnergyLimit (4.*Mmuon),
61 HighestEnergyLimit(1e21*
eV),
123 SIGMA += NbOfAtomsPerVolume[i] *
125 (*theElementVector)[i]->GetZasInt());
127 return (SIGMA > 0.0) ? 1./SIGMA :
DBL_MAX;
156 G4double PowThres,Ecor,
B,Dn,Zthird,Winfty,WMedAppr,
167 Zthird=1./nist->
GetZ13(Z);
170 Wsatur=Winfty/WMedAppr;
172 PowThres=1.479+0.00799*Dn;
173 Ecor=-18.+4347./(B*Zthird);
180 CrossSection=7./9.*sigfac*
G4Log(1.+WMedAppr*CorFuc*Eg);
191 G4cout <<
"The cross section for GammaConversionToMuons is artificially "
239 G4double sqrtx=sqrt(.25-GammaMuonInv);
247 /(1.+2.*sBZ*
Mmuon*GammaMuonInv));
256 W=Winfty*(1.+Ds2*del/
Mmuon)/(1.+sBZ*del);
257 if(W<=1. || nn > nmax) {
break; }
259 result=xxp*
G4Log(W)*LogWmaxInv;
261 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
262 <<
" in dSigxPlusGen, result=" << result <<
" > 1" <<
G4endl;
265 if(nn >= nmax) {
break; }
275 G4double a3 = (GammaMuonInv/(2.*xPM));
282 G4double f1_max=-(1.-xPM)*(2.*b1+(a21+a33)*
G4Log(a33/a21))/(2*b3);
284 G4double thetaPlus,thetaMinus,phiHalf;
294 if(std::abs(b1)<0.0001*a34)
297 f1=(1.-2.*xPM+4.*xPM*t*(1.-t))/(12.*a34*a34*a34*a34);
301 f1=-(1.-2.*xPM+4.*xPM*t*(1.-t))*(2.*b1+(a22+a34)*
G4Log(a34/a22))/(2*b3);
303 if(f1<0.0 || f1> f1_max)
305 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
306 <<
"outside allowed range f1=" << f1
307 <<
" is set to zero, a34 = "<< a34 <<
" a22 = "<<a22<<
"."
311 if(nn > nmax) {
break; }
315 G4double f2_max=1.-2.*xPM*(1.-4.*t*(1.-t));
321 f2=1.-2.*xPM+4.*xPM*t*(1.-t)*(1.+cos(2.*psi));
322 if(f2<0 || f2> f2_max)
324 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
325 <<
"outside allowed range f2=" << f2 <<
" is set to zero"
329 if(nn >= nmax) {
break; }
334 G4double C2Term1=GammaMuonInv/(2.*xPM*t);
335 G4double C22 = C2Term1*C2Term1+C2Term2*C2Term2;
344 phiHalf=0.5*rho/u*sin(psi);
346 thetaPlus =GammaMuonInv*(u+xiHalf)/xPlus;
347 thetaMinus=GammaMuonInv*(u-xiHalf)/xMinus;
351 if(std::abs(thetaPlus)>
pi) { thetaPlus = 0.0; }
352 if(std::abs(thetaMinus)>
pi) { thetaMinus = 0.0; }
356 }
while ( std::abs(thetaPlus)>
pi || std::abs(thetaMinus) >
pi);
365 G4ThreeVector MuPlusDirection ( sin(thetaPlus) *cos(phi0+phiHalf),
366 sin(thetaPlus) *sin(phi0+phiHalf), cos(thetaPlus) );
367 G4ThreeVector MuMinusDirection (-sin(thetaMinus)*cos(phi0-phiHalf),
368 -sin(thetaMinus) *sin(phi0-phiHalf), cos(thetaMinus) );
370 MuPlusDirection.
rotateUz(GammaDirection);
371 MuMinusDirection.
rotateUz(GammaDirection);
401 const G4Element* elm = (*theElementVector)[0];
403 if (NumberOfElements > 1) {
409 for (
G4int i=0; i<NumberOfElements; ++i)
411 elm = (*theElementVector)[i];
412 PartialSumSigma += NbOfAtomsPerVolume[i]
414 if (rval <= PartialSumSigma) {
break; }
424 G4String comments =
"gamma->mu+mu- Bethe Heitler process, SubType= ";
427 G4cout <<
" good cross section parametrization from "
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
G4double ComputeCrossSectionPerAtom(G4double GammaEnergy, G4int Z)
const G4ThreeVector & GetMomentumDirection() const
const G4Element * SelectRandomAtom(const G4DynamicParticle *aDynamicGamma, const G4Material *aMaterial)
const G4ElementVector * GetElementVector() const
void SetCrossSecFactor(G4double fac)
Hep3Vector & rotateUz(const Hep3Vector &)
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
const G4double * GetVecNbOfAtomsPerVolume() const
static G4MuonMinus * MuonMinus()
void PrintInfoDefinition()
G4double G4Log(G4double x)
void AddSecondary(G4Track *aSecondary)
G4ParticleChange aParticleChange
G4bool IsApplicable(const G4ParticleDefinition &) override
G4double HighestEnergyLimit
G4double GetCrossSectionPerAtom(const G4DynamicParticle *aDynamicGamma, const G4Element *anElement)
virtual void Initialize(const G4Track &)
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition) override
static constexpr double electron_mass_c2
static constexpr double elm_coupling
static constexpr double twopi
const G4String & GetProcessName() const
static constexpr double eV
void ProposeEnergy(G4double finalEnergy)
G4Material * GetMaterial() const
static const G4double sqrte
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
G4double G4ParticleHPJENDLHEData::G4double result
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep) override
~G4GammaConversionToMuons() override
std::vector< G4Element * > G4ElementVector
G4double GetA27(G4int Z) const
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
static const G4double fac
static const G4double PowSat
static G4MuonPlus * MuonPlus()
void SetProcessSubType(G4int)
G4double GetKineticEnergy() const
G4GLOB_DLL std::ostream G4cout
G4double GetZ13(G4double Z) const
static constexpr double pi
static constexpr double fine_structure_const
double B(double temperature)
void ProposeTrackStatus(G4TrackStatus status)
G4GammaConversionToMuons(const G4String &processName="GammaToMuPair", G4ProcessType type=fElectromagnetic)
static constexpr double GeV
const G4DynamicParticle * GetDynamicParticle() const
G4double LowestEnergyLimit
size_t GetNumberOfElements() const
static G4NistManager * Instance()
G4int GetProcessSubType() const
void SetNumberOfSecondaries(G4int totSecondaries)
G4double ComputeMeanFreePath(G4double GammaEnergy, const G4Material *aMaterial)