Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4MuonMinusAtomicCapture.cc
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//---------------------------------------------------------------------
28//
29// GEANT4 Class
30//
31// GEANT4 Class header file
32//
33// File name: G4MuonMinusAtomicCapture
34//
35// 20160912 K.L. Genser - New process using G4MuonicAtom somewhat
36// based on G4HadronStoppingProcess
37//
38// Class Description:
39//
40// Stopping of mu-
41//
42// G4VParticleChange will contain gammas from G4EmCaptureCascade and
43// resulting G4MuonicAtom
44//
45//
46//------------------------------------------------------------------------
47
53#include "G4HadProjectile.hh"
55#include "G4EmCaptureCascade.hh"
56#include "G4MuonMinus.hh"
57#include "G4IonTable.hh"
58#include "G4RandomDirection.hh"
59#include "G4HadSecondary.hh"
60
61//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
62
65 fElementSelector(new G4ElementSelector()),
66 fEmCascade(new G4EmCaptureCascade()), // Owned by InteractionRegistry
67 theTotalResult(new G4ParticleChange()),
68 result(nullptr)
69{
72}
73
74//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
75
77{
79 delete theTotalResult;
80}
81
82//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
83
85{
86 return (&p == G4MuonMinus::MuonMinus());
87}
88//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
89
90void
92{
94}
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
97
99{
101}
102
103//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
104
107{
109 return 0.0;
110}
111
112//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
113
115 const G4Step&)
116{
117 // if primary is not Alive then do nothing (how?)
118 theTotalResult->Initialize(track);
119
120 G4Nucleus* nucleus = &targetNucleus;
121 // the call below actually sets the nucleus params;
122 // G4Nucleus targetNucleus; is a member of G4HadronicProcess
123 // G4Element* elm =
124 fElementSelector->SelectZandA(track, nucleus);
125
126 thePro.Initialise(track); // thePro was G4HadProjectile from G4HadronicProcess
127
128 // save track time an dstart capture from zero time
129 thePro.SetGlobalTime(0.0);
130 G4double time0 = track.GetGlobalTime();
131
132 // Do the electromagnetic cascade in the nuclear field.
133 // EM cascade should keep G4HadFinalState object,
134 // because it will not be deleted at the end of this method
135 //
136 result = fEmCascade->ApplyYourself(thePro, *nucleus);
137 G4double ebound = result->GetLocalEnergyDeposit(); // may need to carry this over; review
138 G4double edep = 0.0;
139 G4int nSecondaries = (G4int)result->GetNumberOfSecondaries();
140 thePro.SetBoundEnergy(ebound);
141
142 // creating the muonic atom
143 ++nSecondaries;
144
146 G4ParticleDefinition* muonicAtom = itp->GetMuonicAtom(nucleus->GetZ_asInt(),
147 nucleus->GetA_asInt());
148
149 G4DynamicParticle* dp = new G4DynamicParticle(muonicAtom,G4RandomDirection(),0.);
150 G4HadSecondary hadSec(dp);
151 hadSec.SetTime(time0);
152 result->AddSecondary(hadSec);
153
154 // Fill results
155 //
156 theTotalResult->ProposeTrackStatus(fStopAndKill);
157 theTotalResult->ProposeLocalEnergyDeposit(edep);
158 theTotalResult->SetNumberOfSecondaries(nSecondaries);
159 G4double w = track.GetWeight();
160 theTotalResult->ProposeWeight(w);
161
162#ifdef G4VERBOSE
163 if (GetVerboseLevel() > 1) {
164 G4cout << __func__
165 << " nSecondaries "
166 << nSecondaries
167 << G4endl;
168 }
169#endif
170
171 for(G4int i=0; i<nSecondaries; ++i) {
172 G4HadSecondary* sec = result->GetSecondary(i);
173
174 // add track global time to the reaction time
175 G4double time = sec->GetTime();
176 if(time < 0.0) { time = 0.0; }
177 time += time0;
178
179#ifdef G4VERBOSE
180 if (GetVerboseLevel() > 1) {
181 G4cout << __func__
182 << " "
183 << i
184 << " Resulting secondary "
185 << sec->GetParticle()->GetPDGcode()
186 << " "
188 << G4endl;
189 }
190#endif
191
192 // create secondary track
193 G4Track* t = new G4Track(sec->GetParticle(),
194 time,
195 track.GetPosition());
196 t->SetWeight(w*sec->GetWeight());
197
199 theTotalResult->AddSecondary(t);
200 }
201 result->Clear();
202
203 // fixme: needs to be done at the MuonicAtom level
204 // if (epReportLevel != 0) { // G4HadronicProcess::
205 // CheckEnergyMomentumConservation(track, *nucleus);
206 // }
207 return theTotalResult;
208}
209
210//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
211
212void G4MuonMinusAtomicCapture::ProcessDescription(std::ostream& outFile) const
213{
214 outFile << "Stopping of mu- using default element selector, EM cascade"
215 << "G4MuonicAtom is created\n";
216}
217
218//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
G4double condition(const G4ErrorSymMatrix &m)
G4ForceCondition
@ NotForced
@ fMuAtomicCapture
@ fHadronic
G4ThreeVector G4RandomDirection()
@ fStopAndKill
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4ParticleDefinition * GetDefinition() const
G4int GetPDGcode() const
virtual const G4Element * SelectZandA(const G4Track &track, G4Nucleus *)
void AddSecondary(G4DynamicParticle *aP, G4int mod=-1)
G4double GetLocalEnergyDeposit() const
std::size_t GetNumberOfSecondaries() const
G4HadSecondary * GetSecondary(size_t i)
void Initialise(const G4Track &aT)
void SetGlobalTime(G4double t)
void SetBoundEnergy(G4double e)
G4DynamicParticle * GetParticle()
G4double GetWeight() const
void SetTime(G4double aT)
G4double GetTime() const
virtual G4HadFinalState * ApplyYourself(const G4HadProjectile &aTrack, G4Nucleus &targetNucleus)
void DeRegisterExtraProcess(G4VProcess *)
void RegisterExtraProcess(G4VProcess *)
void RegisterParticleForExtraProcess(G4VProcess *, const G4ParticleDefinition *)
static G4HadronicProcessStore * Instance()
void PrintInfo(const G4ParticleDefinition *)
G4ParticleDefinition * GetMuonicAtom(G4Ions const *)
Definition: G4IonTable.cc:2167
static G4IonTable * GetIonTable()
Definition: G4IonTable.cc:170
virtual void PreparePhysicsTable(const G4ParticleDefinition &)
G4MuonMinusAtomicCapture(const G4String &name="muMinusAtomicCaptureAtRest")
void ProcessDescription(std::ostream &outFile) const
virtual G4VParticleChange * AtRestDoIt(const G4Track &, const G4Step &)
G4bool IsApplicable(const G4ParticleDefinition &)
virtual G4double AtRestGetPhysicalInteractionLength(const G4Track &track, G4ForceCondition *condition)
virtual void BuildPhysicsTable(const G4ParticleDefinition &)
static G4MuonMinus * MuonMinus()
Definition: G4MuonMinus.cc:99
G4int GetA_asInt() const
Definition: G4Nucleus.hh:99
G4int GetZ_asInt() const
Definition: G4Nucleus.hh:105
void AddSecondary(G4Track *aSecondary)
void Initialize(const G4Track &) override
const G4String & GetParticleName() const
Definition: G4Step.hh:62
G4double GetWeight() const
void SetWeight(G4double aValue)
const G4ThreeVector & GetPosition() const
void SetTouchableHandle(const G4TouchableHandle &apValue)
G4double GetGlobalTime() const
const G4TouchableHandle & GetTouchableHandle() const
void ProposeTrackStatus(G4TrackStatus status)
void ProposeWeight(G4double finalWeight)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
void SetNumberOfSecondaries(G4int totSecondaries)
G4int GetVerboseLevel() const
Definition: G4VProcess.hh:422
void SetProcessSubType(G4int)
Definition: G4VProcess.hh:410