Geant4 11.2.2
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4MicroElecCapture.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// G4MicroElecCapture.cc,
28// 2011/08/29 A.Valentin, M. Raine are with CEA [a]
29// 2020/05/20 P. Caron, C. Inguimbert are with ONERA [b]
30// Q. Gibaru is with CEA [a], ONERA [b] and CNES [c]
31// M. Raine and D. Lambert are with CEA [a]
32//
33// A part of this work has been funded by the French space agency(CNES[c])
34// [a] CEA, DAM, DIF - 91297 ARPAJON, France
35// [b] ONERA - DPHY, 2 avenue E.Belin, 31055 Toulouse, France
36// [c] CNES, 18 av.E.Belin, 31401 Toulouse CEDEX, France
37//
38// Based on the following publications
39// - A.Valentin, M. Raine,
40// Inelastic cross-sections of low energy electrons in silicon
41// for the simulation of heavy ion tracks with the Geant4-DNA toolkit,
42// NSS Conf. Record 2010, pp. 80-85
43// https://doi.org/10.1109/NSSMIC.2010.5873720
44//
45// - A.Valentin, M. Raine, M.Gaillardin, P.Paillet
46// Geant4 physics processes for microdosimetry simulation:
47// very low energy electromagnetic models for electrons in Silicon,
48// https://doi.org/10.1016/j.nimb.2012.06.007
49// NIM B, vol. 288, pp. 66-73, 2012, part A
50// heavy ions in Si, NIM B, vol. 287, pp. 124-129, 2012, part B
51// https://doi.org/10.1016/j.nimb.2012.07.028
52//
53// - M. Raine, M. Gaillardin, P. Paillet
54// Geant4 physics processes for silicon microdosimetry simulation:
55// Improvements and extension of the energy-range validity up to 10 GeV/nucleon
56// NIM B, vol. 325, pp. 97-100, 2014
57// https://doi.org/10.1016/j.nimb.2014.01.014
58//
59// - J. Pierron, C. Inguimbert, M. Belhaj, T. Gineste, J. Puech, M. Raine
60// Electron emission yield for low energy electrons:
61// Monte Carlo simulation and experimental comparison for Al, Ag, and Si
62// Journal of Applied Physics 121 (2017) 215107.
63// https://doi.org/10.1063/1.4984761
64//
65// - P. Caron,
66// Study of Electron-Induced Single-Event Upset in Integrated Memory Devices
67// PHD, 16th October 2019
68//
69// - Q.Gibaru, C.Inguimbert, P.Caron, M.Raine, D.Lambert, J.Puech,
70// Geant4 physics processes for microdosimetry and secondary electron emission simulation :
71// Extension of MicroElec to very low energies and new materials
72// NIM B, 2020, in review.
73//
74//----------------------------------------------------------------------------
75//
76// ClassName: G4MicroElecCapture derivated from G4ElectronCapture (V Ivanchenko)
77//
78// Description: The process to kill particles to save CPU
79//
80// Author: C. Inguimbert 31 january 2022 derivated from G4ElectronCapture (V.Ivanchenko 31 August 2010)
81//
82//----------------------------------------------------------------------------
83//
84//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
85
86#include "G4MicroElecCapture.hh"
87#include "G4SystemOfUnits.hh"
89#include "G4Step.hh"
91#include "G4Track.hh"
92#include "G4Region.hh"
93#include "G4RegionStore.hh"
94#include "G4Electron.hh"
95#include "G4Pow.hh"
96
97//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
98
100 : G4VDiscreteProcess("MicroElecCapture", fElectromagnetic), kinEnergyThreshold(ekinlim),
101 regionName(regName), region(0)
102{
103 if(regName == "" || regName == "world")
104 {
105 regionName = "DefaultRegionForTheWorld";
106 }
107 isInitialised = false;
108 pParticleChange = &fParticleChange;
109}
110
111//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
112
114{
115 for (auto pos = tableWF.cbegin(); pos != tableWF.cend(); ++pos)
116 {
117 G4MicroElecMaterialStructure* table = pos->second;
118 delete table;
119 }
120}
121
122//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
123
125{
126 kinEnergyThreshold = val;
127}
128//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
129
131{
132 region = (G4RegionStore::GetInstance())->GetRegion(regionName);
133 // if(region && verboseLevel > 0) {
134 G4cout << "### G4MicroElecCapture: Tracking cut E(MeV) = "
135 << kinEnergyThreshold/MeV << " is assigned to " << regionName
136 << G4endl;
137}
138
139//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
140
145
147{
148 if (isInitialised) { return; }
149
151 G4int numOfCouples = (G4int)theCoupleTable->GetTableSize();
152 G4cout << numOfCouples << G4endl;
153
154 for (G4int i = 0; i < numOfCouples; ++i)
155 {
156 const G4Material* material = theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial();
157
158 G4cout << "G4Capture, Material " << i + 1 << " / "
159 << numOfCouples << " : " << material->GetName() << G4endl;
160 if (material->GetName() == "Vacuum")
161 {
162 tableWF[material->GetName()] = 0;
163 continue;
164 }
165 G4String mat = material->GetName();
167 tableWF[mat] = str;
168 }
169 isInitialised = true;
170}
171
172//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
173
175 const G4Step&)
176{
177 if (!isInitialised) { Initialise(); }
178
179 G4String mat = aTrack.GetMaterial()->GetName();
180 G4int Ztarget = ((*(aTrack.GetMaterial()->GetElementVector()))[0])->GetZasInt();
181 G4int Atarget = ((*(aTrack.GetMaterial()->GetElementVector()))[0])->GetAtomicMassAmu();
182 G4double Nbelements = aTrack.GetMaterial()->GetNumberOfElements();
183 G4double moleculeMass = aTrack.GetMaterial()->GetMassOfMolecule() / amu;
184 auto FractionMass = aTrack.GetMaterial()->GetFractionVector();
186 G4int Ainc = aTrack.GetParticleDefinition()->GetAtomicMass();
187 G4String IncPartName = aTrack.GetParticleDefinition()->GetParticleName();
188 G4double NIEdep = 0.0;
189
190 for (G4int i = 0; i < Nbelements; ++i)
191 {
192 Ztarget = ((*(aTrack.GetMaterial()->GetElementVector()))[i])->GetZasInt();
193 Atarget = ((*(aTrack.GetMaterial()->GetElementVector()))[i])->GetAtomicMassAmu();
194 NIEdep = NIEdep + moleculeMass*FractionMass[i] / Atarget*G_Lindhard_Rob(aTrack.GetKineticEnergy(), Zinc, Ainc, Ztarget, Atarget);
195 }
196
197 WorkFunctionTable::iterator matWF;
198 matWF = tableWF.find(mat);
199
200 if (matWF == tableWF.end())
201 {
202 G4String str = "Material ";
203 str += mat + " not found!";
204 G4Exception("G4MicroElecCapture::PostStepGPIL", "em0002",
205 FatalException, str);
206 return nullptr;
207 }
208 else
209 {
210 G4MicroElecMaterialStructure* str = matWF->second;
213
214 G4double InitE = str->GetEnergyGap() + str->GetInitialEnergy();
215
216 if (IncPartName == "e-")
217 {
218 // metals = Non ionizing deposited energy = 0.0
219 if (((str->GetEnergyGap()) / eV)<(0.001))
220 {
223 }
224 else // MicroElec materials Non ionizing deposited energy different from zero
225 {
226 G4int c = (G4int)((aTrack.GetKineticEnergy()) / (InitE));
229 }
230 }
231 else
232 {
233 if ((IncPartName == "Genericion") || (IncPartName == "alpha")
234 || (IncPartName == "He3") || (IncPartName == "deuteron")
235 || (IncPartName == "triton") || (IncPartName == "proton"))
236 {
239 }
240 else
241 {
244 }
245 }
246 } // matWF == tableWF.end())
247
248 fParticleChange.SetProposedKineticEnergy(0.0);
249 return pParticleChange;
250}
251
252//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
253
256{
257 G4String material = aTrack.GetMaterial()->GetName();
258 // test particle type in order to applied the capture to both electrons, protons and heavy ions
259
260 if ((aTrack.GetParticleDefinition()->GetParticleName()) == "e-")
261 {
262 if (material != "G4_ALUMINUM_OXIDE" && material != "G4_SILICON_DIOXIDE"
263 && material != "G4_BORON_NITRIDE")
264 {
265 return DBL_MAX;
266 }
267 G4double S = 0;
268 G4double y = 0;
269 if (material == "G4_ALUMINUM_OXIDE")
270 {
271 S = 1 * (1 / nm);
272 y = 0.25 * (1 / eV);
273 }
274 if (material == "G4_SILICON_DIOXIDE")
275 {
276 S = 0.3 * (1 / nm);
277 y = 0.2 * (1 / eV);
278 }
279 if (material == "G4_BORON_NITRIDE")
280 {
281 S = 0 * (1 / nm);
282 y = 1 * (1 / eV);
283 }
284
285 G4double P = S * G4Exp(-y * aTrack.GetKineticEnergy());
286 if (P <= 0) { return DBL_MAX; }
287 else { return 1 / P; }
288 }
289 else return DBL_MAX;
290
291}
292
293//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
294
295G4double G4MicroElecCapture::G_Lindhard_Rob(G4double Trecoil, G4int Zrecoil, G4int Arecoil, G4int Zcible, G4int Acible)
296{
297 G4double Lind =0.0;
298
299 if (Arecoil <= 0 || Zrecoil == 0)
300 {
301 Lind = 0.0;
302 }
303 else
304 {
305 G4double El = 30.724 * Zcible * Zrecoil
306 * std::pow((G4Pow::GetInstance()->Z23(Zcible) + G4Pow::GetInstance()->Z23(Zrecoil)), 0.5)
307 * (Arecoil + Acible) / Acible;
308
309 // multiplication by 1e6 to change El from eV to MeV
310 G4double e = Trecoil / (El * CLHEP::eV);
311 G4double Fl = (0.0793 * G4Pow::GetInstance()->Z23(Zrecoil) * std::pow(Zcible, 0.5) * std::pow((Arecoil + Acible), 1.5))
312 / (std::pow((G4Pow::GetInstance()->Z23(Zcible) + G4Pow::GetInstance()->Z23(Zrecoil)), 3. / 4.) * std::pow(Arecoil, 3. / 2.) * std::pow(Acible, 1. / 2.));
313
314 Lind = 1. / (1 + Fl * (3.4008 * std::pow(e, 1. / 6.) + 0.40244 * std::pow(e, 3. / 4.) + e));
315
316 // to get the energie that go into displacement
317 Lind = Lind * Trecoil;
318 }
319 return Lind;
320}
G4double S(G4double temp)
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4double G4Exp(G4double initial_x)
Exponential Function double precision.
Definition G4Exp.hh:180
G4ForceCondition
@ fElectromagnetic
@ fStopAndKill
double G4double
Definition G4Types.hh:83
bool G4bool
Definition G4Types.hh:86
int G4int
Definition G4Types.hh:85
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
const G4Material * GetMaterial() const
const G4double * GetFractionVector() const
G4double GetMassOfMolecule() const
std::size_t GetNumberOfElements() const
const G4String & GetName() const
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &) override
G4MicroElecCapture(const G4String &regName, G4double ekinlimit)
G4double GetMeanFreePath(const G4Track &, G4double, G4ForceCondition *) override
void BuildPhysicsTable(const G4ParticleDefinition &) override
void SetKinEnergyLimit(G4double)
G4bool IsApplicable(const G4ParticleDefinition &) override
void SetProposedKineticEnergy(G4double proposedKinEnergy)
G4int GetAtomicNumber() const
G4int GetAtomicMass() const
const G4String & GetParticleName() const
static G4Pow * GetInstance()
Definition G4Pow.cc:41
G4double Z23(G4int Z) const
Definition G4Pow.hh:125
const G4MaterialCutsCouple * GetMaterialCutsCouple(G4int i) const
std::size_t GetTableSize() const
static G4ProductionCutsTable * GetProductionCutsTable()
static G4RegionStore * GetInstance()
const G4ParticleDefinition * GetParticleDefinition() const
G4Material * GetMaterial() const
G4double GetKineticEnergy() const
void ProposeTrackStatus(G4TrackStatus status)
void ProposeNonIonizingEnergyDeposit(G4double anEnergyPart)
virtual void Initialize(const G4Track &)
void ProposeLocalEnergyDeposit(G4double anEnergyPart)
G4VParticleChange * pParticleChange
#define DBL_MAX
Definition templates.hh:62