Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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