66 HighestEnergyLimit = 1000.*
TeV;
101 CrossSecFactor =
fac;
102 G4cout <<
"The cross section for AnnihiToMuPair is artificially "
103 <<
"increased by the CrossSecFactor=" << CrossSecFactor <<
G4endl;
114 static const G4double Sig0 =
pi*Rmuon*Rmuon/3.;
117 if (Epos < LowestEnergyLimit)
return CrossSection;
119 G4double xi = LowestEnergyLimit/Epos;
120 G4double SigmaEl = Sig0*xi*(1.+xi/2.)*sqrt(1.-xi);
121 CrossSection = SigmaEl*
Z;
137 G4double AtomicZ = (*theElementVector)[i]->GetZ();
138 SIGMA += NbOfAtomsPerVolume[i] *
160 if(CurrentSigma >
DBL_MIN) mfp = 1.0/(CurrentSigma*CrossSecFactor);
189 if (Epos < LowestEnergyLimit) {
195 G4double xi = LowestEnergyLimit/Epos;
211 G4double Ecm = sqrt(0.5*Mele*(Epos+Mele));
212 G4double Pcm = sqrt(Ecm*Ecm-Mmuon*Mmuon);
213 G4double beta = sqrt((Epos-Mele)/(Epos+Mele));
219 G4double EmuPlus = gamma*( Ecm+cost*beta*Pcm);
220 G4double EmuMinus = gamma*( Ecm-cost*beta*Pcm);
221 G4double PmuPlusZ = gamma*(beta*Ecm+cost* Pcm);
222 G4double PmuMinusZ = gamma*(beta*Ecm-cost* Pcm);
228 G4double PmuPlus = sqrt(Pt*Pt+PmuPlusZ *PmuPlusZ );
229 G4double PmuMinus = sqrt(Pt*Pt+PmuMinusZ*PmuMinusZ);
234 MuPlusDirection ( PmuPlusX/PmuPlus, PmuPlusY/PmuPlus, PmuPlusZ/PmuPlus );
236 MuMinusDirection(PmuMinusX/PmuMinus,PmuMinusY/PmuMinus,PmuMinusZ/PmuMinus);
240 MuPlusDirection.
rotateUz(PositronDirection);
241 MuMinusDirection.
rotateUz(PositronDirection);
265 G4String comments =
"e+e->mu+mu- annihilation, atomic e- at rest, SubType=.";
268 G4cout <<
" threshold at " << LowestEnergyLimit/
GeV <<
" GeV"
269 <<
" good description up to "
270 << HighestEnergyLimit/
TeV <<
" TeV for all Z." <<
G4endl;
void BuildPhysicsTable(const G4ParticleDefinition &) override
static G4MuonPlus * MuonPlus()
std::vector< G4Element * > G4ElementVector
void PrintInfoDefinition()
G4double GetKineticEnergy() const
const G4DynamicParticle * GetDynamicParticle() const
G4double ComputeCrossSectionPerAtom(G4double PositronEnergy, G4double AtomicZ)
G4AnnihiToMuPair(const G4String &processName="AnnihiToMuPair", G4ProcessType type=fElectromagnetic)
const G4ElementVector * GetElementVector() const
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep) override
static constexpr double electron_mass_c2
static constexpr double TeV
const G4double * GetVecNbOfAtomsPerVolume() const
G4GLOB_DLL std::ostream G4cout
const G4ThreeVector & GetMomentumDirection() const
Hep3Vector & rotateUz(const Hep3Vector &)
void SetProcessSubType(G4int)
G4bool IsApplicable(const G4ParticleDefinition &) override
const G4String & GetProcessName() const
G4Material * GetMaterial() const
virtual void Initialize(const G4Track &)
static G4Positron * Positron()
G4double GetPDGMass() const
void SetNumberOfSecondaries(G4int totSecondaries)
void ProposeEnergy(G4double finalEnergy)
G4ParticleChange aParticleChange
static constexpr double GeV
void AddSecondary(G4Track *aSecondary)
static constexpr double elm_coupling
static G4MuonMinus * MuonMinus()
static const G4double fac
static constexpr double pi
size_t GetNumberOfElements() const
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *) override
G4double CrossSectionPerVolume(G4double PositronEnergy, const G4Material *)
void SetCrossSecFactor(G4double fac)
void ProposeTrackStatus(G4TrackStatus status)
G4int GetProcessSubType() const
virtual G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &)