64 LowestEnergyLimit = 2.*Mu_massc2*Mu_massc2/electron_mass_c2 - electron_mass_c2;
67 HighestEnergyLimit = 1000.*TeV;
104 CrossSecFactor = fac;
105 G4cout <<
"The cross section for AnnihiToMuPair is artificially "
106 <<
"increased by the CrossSecFactor=" << CrossSecFactor <<
G4endl;
116 static const G4double Rmuon = CLHEP::elm_coupling/Mmuon;
117 static const G4double Sig0 = CLHEP::pi*Rmuon*Rmuon/3.;
118 static const G4double pia = CLHEP::pi * CLHEP::fine_structure_const;
121 if (Epos < LowestEnergyLimit)
return CrossSection;
123 G4double xi = LowestEnergyLimit/Epos;
125 G4double SigmaEl = Sig0 * xi * (1.+xi/2.) * piaxi;
126 if( Epos>LowestEnergyLimit+1.e-5 ) SigmaEl /= (1.-std::exp( -piaxi/std::sqrt(1-xi) ));
127 CrossSection = SigmaEl*Z;
143 G4double AtomicZ = (*theElementVector)[i]->GetZ();
144 SIGMA += NbOfAtomsPerVolume[i] *
166 if(CurrentSigma >
DBL_MIN) mfp = 1.0/(CurrentSigma*CrossSecFactor);
181 static const G4double Mele=electron_mass_c2;
195 if (Epos < LowestEnergyLimit) {
201 G4double xi = LowestEnergyLimit/Epos;
217 G4double Ecm = sqrt(0.5*Mele*(Epos+Mele));
218 G4double Pcm = sqrt(Ecm*Ecm-Mmuon*Mmuon);
219 G4double beta = sqrt((Epos-Mele)/(Epos+Mele));
225 G4double EmuPlus = gamma*( Ecm+cost*beta*Pcm);
226 G4double EmuMinus = gamma*( Ecm-cost*beta*Pcm);
227 G4double PmuPlusZ = gamma*(beta*Ecm+cost* Pcm);
228 G4double PmuMinusZ = gamma*(beta*Ecm-cost* Pcm);
234 G4double PmuPlus = sqrt(Pt*Pt+PmuPlusZ *PmuPlusZ );
235 G4double PmuMinus = sqrt(Pt*Pt+PmuMinusZ*PmuMinusZ);
240 MuPlusDirection ( PmuPlusX/PmuPlus, PmuPlusY/PmuPlus, PmuPlusZ/PmuPlus );
242 MuMinusDirection(PmuMinusX/PmuMinus,PmuMinusY/PmuMinus,PmuMinusZ/PmuMinus);
246 MuPlusDirection.
rotateUz(PositronDirection);
247 MuMinusDirection.
rotateUz(PositronDirection);
271 G4String comments =
"e+e->mu+mu- annihilation, atomic e- at rest, SubType=.";
274 G4cout <<
" threshold at " << LowestEnergyLimit/GeV <<
" GeV"
275 <<
" good description up to "
276 << HighestEnergyLimit/TeV <<
" TeV for all Z." <<
G4endl;
std::vector< G4Element * > G4ElementVector
G4GLOB_DLL std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *) override
void BuildPhysicsTable(const G4ParticleDefinition &) override
G4double ComputeCrossSectionPerAtom(G4double PositronEnergy, G4double AtomicZ)
G4bool IsApplicable(const G4ParticleDefinition &) override
void SetCrossSecFactor(G4double fac)
void PrintInfoDefinition()
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep) override
G4double CrossSectionPerVolume(G4double PositronEnergy, const G4Material *)
G4AnnihiToMuPair(const G4String &processName="AnnihiToMuPair", G4ProcessType type=fElectromagnetic)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
static G4LossTableManager * Instance()
void DeRegister(G4VEnergyLossProcess *p)
void Register(G4VEnergyLossProcess *p)
const G4ElementVector * GetElementVector() const
size_t GetNumberOfElements() const
const G4double * GetVecNbOfAtomsPerVolume() const
static G4MuonMinus * MuonMinus()
static G4MuonPlus * MuonPlus()
void AddSecondary(G4Track *aSecondary)
void ProposeEnergy(G4double finalEnergy)
virtual void Initialize(const G4Track &)
G4double GetPDGMass() const
static G4Positron * Positron()
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