63 LowestEnergyLimit = 2*Mu_massc2*Mu_massc2/electron_mass_c2 - electron_mass_c2;
66 HighestEnergyLimit = 1000*TeV;
101 CrossSecFactor = fac;
102 G4cout <<
"The cross section for AnnihiToMuPair is artificially "
103 <<
"increased by the CrossSecFactor=" << CrossSecFactor <<
G4endl;
113 static const G4double Rmuon = elm_coupling/Mmuon;
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);
175 static const G4double Mele=electron_mass_c2;
189 if (Epos < LowestEnergyLimit) {
195 G4double xi = LowestEnergyLimit/Epos;
210 G4double Ecm = sqrt(0.5*Mele*(Epos+Mele));
211 G4double Pcm = sqrt(Ecm*Ecm-Mmuon*Mmuon);
212 G4double beta = sqrt((Epos-Mele)/(Epos+Mele));
218 G4double EmuPlus = gamma*( Ecm+cost*beta*Pcm);
219 G4double EmuMinus = gamma*( Ecm-cost*beta*Pcm);
220 G4double PmuPlusZ = gamma*(beta*Ecm+cost* Pcm);
221 G4double PmuMinusZ = gamma*(beta*Ecm-cost* Pcm);
227 G4double PmuPlus = sqrt(Pt*Pt+PmuPlusZ *PmuPlusZ );
228 G4double PmuMinus = sqrt(Pt*Pt+PmuMinusZ*PmuMinusZ);
233 MuPlusDirection ( PmuPlusX/PmuPlus, PmuPlusY/PmuPlus, PmuPlusZ/PmuPlus );
235 MuMinusDirection(PmuMinusX/PmuMinus,PmuMinusY/PmuMinus,PmuMinusZ/PmuMinus);
239 MuPlusDirection.
rotateUz(PositronDirection);
240 MuMinusDirection.
rotateUz(PositronDirection);
264 G4String comments =
"e+e->mu+mu- annihilation, atomic e- at rest, SubType=.";
267 G4cout <<
" threshold at " << LowestEnergyLimit/GeV <<
" GeV"
268 <<
" good description up to "
269 << HighestEnergyLimit/TeV <<
" TeV for all Z." <<
G4endl;
std::vector< G4Element * > G4ElementVector
G4DLLIMPORT std::ostream G4cout
Hep3Vector & rotateUz(const Hep3Vector &)
G4VParticleChange * PostStepDoIt(const G4Track &aTrack, const G4Step &aStep)
void BuildPhysicsTable(const G4ParticleDefinition &)
G4double ComputeCrossSectionPerAtom(G4double PositronEnergy, G4double AtomicZ)
G4bool IsApplicable(const G4ParticleDefinition &)
void SetCrossSecFactor(G4double fac)
void PrintInfoDefinition()
G4double CrossSectionPerVolume(G4double PositronEnergy, const G4Material *)
G4AnnihiToMuPair(const G4String &processName="AnnihiToMuPair", G4ProcessType type=fElectromagnetic)
G4double GetMeanFreePath(const G4Track &aTrack, G4double previousStepSize, G4ForceCondition *)
const G4ThreeVector & GetMomentumDirection() const
G4double GetKineticEnergy() const
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