Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4MuMinusCapturePrecompound Class Reference

#include <G4MuMinusCapturePrecompound.hh>

Inheritance diagram for G4MuMinusCapturePrecompound:

Public Member Functions

 G4MuMinusCapturePrecompound (G4VPreCompoundModel *ptr=0)
 ~G4MuMinusCapturePrecompound ()
G4HadFinalStateApplyYourself (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
void ModelDescription (std::ostream &outFile) const
Public Member Functions inherited from G4HadronicInteraction
 G4HadronicInteraction (const G4String &modelName="HadronicModel")
virtual ~G4HadronicInteraction ()
virtual G4double SampleInvariantT (const G4ParticleDefinition *p, G4double plab, G4int Z, G4int A)
virtual G4bool IsApplicable (const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
G4double GetMinEnergy () const
G4double GetMinEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMinEnergy (G4double anEnergy)
void SetMinEnergy (G4double anEnergy, const G4Element *anElement)
void SetMinEnergy (G4double anEnergy, const G4Material *aMaterial)
G4double GetMaxEnergy () const
G4double GetMaxEnergy (const G4Material *aMaterial, const G4Element *anElement) const
void SetMaxEnergy (const G4double anEnergy)
void SetMaxEnergy (G4double anEnergy, const G4Element *anElement)
void SetMaxEnergy (G4double anEnergy, const G4Material *aMaterial)
G4int GetVerboseLevel () const
void SetVerboseLevel (G4int value)
const G4StringGetModelName () const
void DeActivateFor (const G4Material *aMaterial)
void ActivateFor (const G4Material *aMaterial)
void DeActivateFor (const G4Element *anElement)
void ActivateFor (const G4Element *anElement)
G4bool IsBlocked (const G4Material *aMaterial) const
G4bool IsBlocked (const G4Element *anElement) const
void SetRecoilEnergyThreshold (G4double val)
G4double GetRecoilEnergyThreshold () const
virtual const std::pair< G4double, G4doubleGetFatalEnergyCheckLevels () const
virtual std::pair< G4double, G4doubleGetEnergyMomentumCheckLevels () const
void SetEnergyMomentumCheckLevels (G4double relativeLevel, G4double absoluteLevel)
virtual void BuildPhysicsTable (const G4ParticleDefinition &)
virtual void InitialiseModel ()
 G4HadronicInteraction (const G4HadronicInteraction &right)=delete
const G4HadronicInteractionoperator= (const G4HadronicInteraction &right)=delete
G4bool operator== (const G4HadronicInteraction &right) const =delete
G4bool operator!= (const G4HadronicInteraction &right) const =delete

Additional Inherited Members

Protected Member Functions inherited from G4HadronicInteraction
void SetModelName (const G4String &nam)
G4bool IsBlocked () const
void Block ()
Protected Attributes inherited from G4HadronicInteraction
G4HadFinalState theParticleChange
G4int verboseLevel
G4double theMinEnergy
G4double theMaxEnergy
G4bool isBlocked

Detailed Description

Definition at line 64 of file G4MuMinusCapturePrecompound.hh.

Constructor & Destructor Documentation

◆ G4MuMinusCapturePrecompound()

G4MuMinusCapturePrecompound::G4MuMinusCapturePrecompound ( G4VPreCompoundModel * ptr = 0)

Definition at line 63 of file G4MuMinusCapturePrecompound.cc.

65 : G4HadronicInteraction("muMinusNuclearCapture")
66{
67 fMuMass = G4MuonMinus::MuonMinus()->GetPDGMass();
68 fProton = G4Proton::Proton();
69 fNeutron = G4Neutron::Neutron();
70 fThreshold = 10*MeV;
71 fTime = 0.0;
72 fPreCompound = ptr;
73 if(!ptr) {
76 ptr = static_cast<G4VPreCompoundModel*>(p);
77 fPreCompound = ptr;
78 if(!ptr) { fPreCompound = new G4PreCompoundModel(); }
79 }
80}
G4HadronicInteraction * FindModel(const G4String &name)
static G4HadronicInteractionRegistry * Instance()
G4HadronicInteraction(const G4String &modelName="HadronicModel")
static G4MuonMinus * MuonMinus()
static G4Neutron * Neutron()
Definition G4Neutron.cc:101
static G4Proton * Proton()
Definition G4Proton.cc:90

◆ ~G4MuMinusCapturePrecompound()

G4MuMinusCapturePrecompound::~G4MuMinusCapturePrecompound ( )

Definition at line 84 of file G4MuMinusCapturePrecompound.cc.

85{
86 result.Clear();
87}

Member Function Documentation

◆ ApplyYourself()

G4HadFinalState * G4MuMinusCapturePrecompound::ApplyYourself ( const G4HadProjectile & aTrack,
G4Nucleus & targetNucleus )
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 92 of file G4MuMinusCapturePrecompound.cc.

94{
95 result.Clear();
96 result.SetStatusChange(stopAndKill);
97 fTime = projectile.GetGlobalTime();
98 G4double time0 = fTime;
99
100 G4double muBindingEnergy = projectile.GetBoundEnergy();
101
102 G4int Z = targetNucleus.GetZ_asInt();
103 G4int A = targetNucleus.GetA_asInt();
105
106 /*
107 G4cout << "G4MuMinusCapturePrecompound::ApplyYourself: Emu= "
108 << muBindingEnergy << G4endl;
109 */
110 // Energy on K-shell
111 G4double muEnergy = fMuMass + muBindingEnergy;
112 G4double muMom =std::sqrt(muBindingEnergy*(muBindingEnergy + 2.0*fMuMass));
113 G4double availableEnergy = massA + fMuMass - muBindingEnergy;
114 G4double residualMass = G4NucleiProperties::GetNuclearMass(A, Z - 1);
115
116 G4ThreeVector vmu = muMom*G4RandomDirection();
117 G4LorentzVector aMuMom(vmu, muEnergy);
118
119 const G4double nenergy = keV;
120
121 // p or 3He as a target
122 // two body reaction mu- + A(Z,A) -> nuMu + A(Z-1,A)
123 if((1 == Z && 1 == A) || (2 == Z && 3 == A)) {
124
125 const G4ParticleDefinition* pd = 0;
126 if(1 == Z) { pd = fNeutron; }
127 else { pd = G4Triton::Triton(); }
128
129 //
130 // Computation in assumption of CM reaction
131 //
132 G4double e = 0.5*(availableEnergy -
133 residualMass*residualMass/availableEnergy);
134
136 AddNewParticle(G4NeutrinoMu::NeutrinoMu(), nudir, e);
137 nudir *= -1.0;
138 AddNewParticle(pd, nudir, availableEnergy - e - residualMass);
139
140 // d or 4He as a target
141 // three body reaction mu- + A(Z,A) -> nuMu + n + A(Z-1,A)
142 // extra neutron produced at rest
143 } else if((1 == Z && 2 == A) || (2 == Z && 4 == A)) {
144
145 const G4ParticleDefinition* pd = 0;
146 if(1 == Z) { pd = fNeutron; }
147 else { pd = G4Triton::Triton(); }
148
149 availableEnergy -= neutron_mass_c2 - nenergy;
150 residualMass = pd->GetPDGMass();
151
152 //
153 // Computation in assumption of CM reaction
154 //
155 G4double e = 0.5*(availableEnergy -
156 residualMass*residualMass/availableEnergy);
157
159 AddNewParticle(G4NeutrinoMu::NeutrinoMu(), nudir, e);
160 nudir *= -1.0;
161 AddNewParticle(pd, nudir, availableEnergy - e - residualMass);
162
163 // extra low-energy neutron
164 nudir = G4RandomDirection();
165 AddNewParticle(fNeutron, nudir, nenergy);
166
167 } else {
168 // sample mu- + p -> nuMu + n reaction in CM of muonic atom
169
170 // nucleus
171 G4LorentzVector momInitial(0.0,0.0,0.0,availableEnergy);
172 G4LorentzVector momResidual, momNu;
173
174 // pick random proton inside nucleus
175 G4double eEx;
176 fNucleus.Init(A, Z);
177 const std::vector<G4Nucleon>& nucleons= fNucleus.GetNucleons();
178 const G4ParticleDefinition* pDef;
179
180 G4int reentryCount = 0;
181
182 do {
183 ++reentryCount;
184 G4int index = 0;
185 do {
186 index=G4int(A*G4UniformRand());
187 pDef = nucleons[index].GetDefinition();
188 } while(pDef != fProton);
189 G4LorentzVector momP = nucleons[index].Get4Momentum();
190
191 // Get CMS kinematics
192 G4LorentzVector theCMS = momP + aMuMom;
193 G4ThreeVector bst = theCMS.boostVector();
194
195 G4double Ecms = theCMS.mag();
196 G4double Enu = 0.5*(Ecms - neutron_mass_c2*neutron_mass_c2/Ecms);
197 eEx = 0.0;
198
199 if(Enu > 0.0) {
200 // make the nu, and transform to lab;
201 momNu.set(Enu*G4RandomDirection(), Enu);
202
203 // nu in lab.
204 momNu.boost(bst);
205 momResidual = momInitial - momNu;
206 eEx = momResidual.mag() - residualMass;
207 if(eEx < 0.0 && eEx + nenergy >= 0.0) {
208 momResidual.set(0.0, 0.0, 0.0, residualMass);
209 eEx = 0.0;
210 }
211 }
212 // in the case of many iterations stop the loop
213 // with zero excitation energy
214 if(reentryCount > 100 && eEx < 0.0) {
216 ed << "Call for " << GetModelName() << G4endl;
217 ed << "Target Z= " << Z
218 << " A= " << A << " Eex(MeV)= " << eEx/MeV << G4endl;
219 ed << " ApplyYourself does not completed after 100 attempts -"
220 << " excitation energy is set to zero";
221 G4Exception("G4MuMinusCapturePrecompound::ApplyYourself", "had006",
222 JustWarning, ed);
223 momResidual.set(0.0, 0.0, 0.0, residualMass);
224 eEx = 0.0;
225 }
226 // Loop checking, 06-Aug-2015, Vladimir Ivanchenko
227 } while(eEx <= 0.0);
228
229 G4ThreeVector dir = momNu.vect().unit();
230 AddNewParticle(G4NeutrinoMu::NeutrinoMu(), dir, momNu.e());
231
232 G4Fragment initialState(A, Z-1, momResidual);
233 initialState.SetNumberOfExcitedParticle(2,0);
234 initialState.SetNumberOfHoles(1,1);
235
236 // decay time for pre-compound/de-excitation starts from zero
237 G4ReactionProductVector* rpv = fPreCompound->DeExcite(initialState);
238 size_t n = rpv->size();
239 for(size_t i=0; i<n; ++i) {
240 G4ReactionProduct* rp = (*rpv)[i];
241
242 // reaction time
243 fTime = time0 + rp->GetTOF();
244 G4ThreeVector direction = rp->GetMomentum().unit();
245 AddNewParticle(rp->GetDefinition(), direction, rp->GetKineticEnergy());
246 delete rp;
247 }
248 delete rpv;
249 }
250 if(verboseLevel > 1)
251 G4cout << "G4MuMinusCapturePrecompound::ApplyYourself: Nsec= "
252 << result.GetNumberOfSecondaries()
253 <<" E0(MeV)= " <<availableEnergy/MeV
254 <<" Mres(GeV)= " <<residualMass/GeV
255 <<G4endl;
256
257 return &result;
258}
@ JustWarning
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
@ stopAndKill
CLHEP::HepLorentzVector G4LorentzVector
G4ThreeVector G4RandomDirection()
std::vector< G4ReactionProduct * > G4ReactionProductVector
CLHEP::Hep3Vector G4ThreeVector
double G4double
Definition G4Types.hh:83
int G4int
Definition G4Types.hh:85
const G4double A[17]
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
#define G4UniformRand()
Definition Randomize.hh:52
Hep3Vector unit() const
Hep3Vector boostVector() const
HepLorentzVector & boost(double, double, double)
void set(double x, double y, double z, double t)
const G4String & GetModelName() const
static G4NeutrinoMu * NeutrinoMu()
static G4double GetNuclearMass(const G4double A, const G4double Z)
G4int GetA_asInt() const
Definition G4Nucleus.hh:78
G4int GetZ_asInt() const
Definition G4Nucleus.hh:84
G4double GetKineticEnergy() const
const G4ParticleDefinition * GetDefinition() const
G4ThreeVector GetMomentum() const
G4double GetTOF() const
static G4Triton * Triton()
Definition G4Triton.cc:90

◆ ModelDescription()

void G4MuMinusCapturePrecompound::ModelDescription ( std::ostream & outFile) const
virtual

Reimplemented from G4HadronicInteraction.

Definition at line 262 of file G4MuMinusCapturePrecompound.cc.

263{
264 outFile << "Sampling of mu- capture by atomic nucleus from K-shell"
265 << " mesoatom orbit.\n"
266 << "Primary reaction mu- + p -> n + neutrino, neutron providing\n"
267 << " initial excitation of the target nucleus and PreCompound"
268 << " model samples final state\n";
269}

The documentation for this class was generated from the following files: