50 LowestEnergyLimit (4*
G4MuonPlus::MuonPlus()->GetPDGMass()),
51 HighestEnergyLimit(1e21*eV),
94 if (GammaEnergy < LowestEnergyLimit)
116 G4double AtomicZ = (*theElementVector)[i]->GetZ();
117 G4double AtomicA = (*theElementVector)[i]->GetA()/(g/mole);
118 SIGMA += NbOfAtomsPerVolume[i] *
149 static const G4double Mele=electron_mass_c2;
150 static const G4double Rc=elm_coupling/Mmuon;
151 static const G4double sqrte=sqrt(exp(1.));
154 static G4double CrossSection = 0.0 ;
156 if ( A < 1. )
return 0;
157 if ( Egam < 4*Mmuon )
return 0 ;
159 static G4double EgamLast=0,Zlast=0,PowThres,Ecor,B,Dn,Zthird,Winfty,WMedAppr,
162 if(Zlast==Z && Egam==EgamLast)
return CrossSection;
175 Zthird=pow(Z,-1./3.);
176 Winfty=B*Zthird*Mmuon/(Dn*Mele);
177 WMedAppr=1./(4.*Dn*sqrte*Mmuon);
178 Wsatur=Winfty/WMedAppr;
179 sigfac=4.*fine_structure_const*Z*Z*Rc*Rc;
180 PowThres=1.479+0.00799*Dn;
181 Ecor=-18.+4347./(B*Zthird);
183 G4double CorFuc=1.+.04*log(1.+Ecor/Egam);
184 G4double Eg=pow(1.-4.*Mmuon/Egam,PowThres)*pow( pow(Wsatur,PowSat)+
185 pow(Egam,PowSat),1./PowSat);
186 CrossSection=7./9.*sigfac*log(1.+WMedAppr*CorFuc*Eg);
187 CrossSection*=CrossSecFactor;
196 G4cout <<
"The cross section for GammaConversionToMuons is artificially "
197 <<
"increased by the CrossSecFactor=" << CrossSecFactor <<
G4endl;
213 static const G4double Mele=electron_mass_c2;
214 static const G4double sqrte=sqrt(exp(1.));
223 const G4Element& anElement = *SelectRandomAtom(aDynamicGamma, aMaterial);
227 static G4double Zlast=0,B,Dn,Zthird,Winfty,A027,C1Num2,C2Term2;
238 Zthird=pow(Z,-1./3.);
239 Winfty=B*Zthird*Mmuon/(Dn*Mele);
243 C2Term2=Mele/(183.*Zthird*Mmuon);
247 G4double sqrtx=sqrt(.25-GammaMuonInv);
254 G4double LogWmaxInv=1./log(Winfty*(1.+2.*Ds2*GammaMuonInv)
255 /(1.+2.*sBZ*Mmuon*GammaMuonInv));
261 G4double del=Mmuon*Mmuon/(2.*Egam*xPM);
262 W=Winfty*(1.+Ds2*del/Mmuon)/(1.+sBZ*del);
265 result=xxp*log(W)*LogWmaxInv;
267 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
268 <<
" in dSigxPlusGen, result=" << result <<
" > 1" <<
G4endl;
278 G4double thetaPlus,thetaMinus,phiHalf;
288 f1=(1.-2.*xPM+4.*xPM*t*(1.-t)) / (1.+
C1/(t*t));
289 if(f1<0 || f1> f1_max)
291 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
292 <<
"outside allowed range f1=" << f1 <<
" is set to zero"
299 G4double f2_max=1.-2.*xPM*(1.-4.*t*(1.-t));
305 f2=1.-2.*xPM+4.*xPM*t*(1.-t)*(1.+cos(2.*psi));
306 if(f2<0 || f2> f2_max)
308 G4cout <<
"G4GammaConversionToMuons::PostStepDoIt WARNING:"
309 <<
"outside allowed range f2=" << f2 <<
" is set to zero"
317 G4double C2Term1=GammaMuonInv/(2.*xPM*t);
318 G4double C2=4./sqrt(xPM)*pow(C2Term1*C2Term1+C2Term2*C2Term2,2.);
320 G4double beta=log( (C2+pow(rhomax,4.))/C2 );
326 phiHalf=0.5*rho/u*sin(psi);
328 thetaPlus =GammaMuonInv*(u+xiHalf)/xPlus;
329 thetaMinus=GammaMuonInv*(u-xiHalf)/xMinus;
331 }
while ( std::abs(thetaPlus)>pi || std::abs(thetaMinus) >pi);
340 G4ThreeVector MuPlusDirection ( sin(thetaPlus) *cos(phi0+phiHalf),
341 sin(thetaPlus) *sin(phi0+phiHalf), cos(thetaPlus) );
342 G4ThreeVector MuMinusDirection (-sin(thetaMinus)*cos(phi0-phiHalf),
343 -sin(thetaMinus) *sin(phi0-phiHalf), cos(thetaMinus) );
345 MuPlusDirection.
rotateUz(GammaDirection);
346 MuMinusDirection.
rotateUz(GammaDirection);
368G4Element* G4GammaConversionToMuons::SelectRandomAtom(
376 if (NumberOfElements == 1)
return (*theElementVector)[0];
384 for (
G4int i=0 ; i < NumberOfElements ; i++ )
385 { PartialSumSigma += NbOfAtomsPerVolume[i] *
387 if (rval <= PartialSumSigma)
return ((*theElementVector)[i]);
389 G4cout <<
" WARNING !!! - The Material '"<< aMaterial->
GetName()
390 <<
"' has no elements, NULL pointer returned." <<
G4endl;
398 G4String comments =
"gamma->mu+mu- Bethe Heitler process, SubType= ";
401 G4cout <<
" good cross section parametrization from "
403 <<
" to " << HighestEnergyLimit/GeV <<
" GeV for all Z." <<
G4endl;
std::vector< G4Element * > G4ElementVector
G4DLLIMPORT std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
~G4GammaConversionToMuons()
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *condition)
G4double ComputeMeanFreePath(G4double GammaEnergy, G4Material *aMaterial)
void PrintInfoDefinition()
void SetCrossSecFactor(G4double fac)
virtual G4double ComputeCrossSectionPerAtom(G4double GammaEnergy, G4double AtomicZ, G4double AtomicA)
G4double GetCrossSectionPerAtom(const G4DynamicParticle *aDynamicGamma, G4Element *anElement)
void BuildPhysicsTable(const G4ParticleDefinition &)
G4bool IsApplicable(const G4ParticleDefinition &)
G4GammaConversionToMuons(const G4String &processName="GammaToMuPair", G4ProcessType type=fElectromagnetic)
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
const G4ElementVector * GetElementVector() const
size_t GetNumberOfElements() const
const G4double * GetVecNbOfAtomsPerVolume() const
const G4String & GetName() const
static G4MuonMinus * MuonMinus()
static G4MuonPlus * MuonPlus()
void AddSecondary(G4Track *aSecondary)
void ProposeEnergy(G4double finalEnergy)
void ProposeMomentumDirection(G4double Px, G4double Py, G4double Pz)
virtual void Initialize(const G4Track &)
G4double GetPDGMass() const
G4Material * GetMaterial() const
const G4DynamicParticle * GetDynamicParticle() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)
void ProposeTrackStatus(G4TrackStatus status)
void SetNumberOfSecondaries(G4int totSecondaries)
G4ParticleChange aParticleChange
void SetProcessSubType(G4int)
G4int GetProcessSubType() const
const G4String & GetProcessName() const