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
G4EmCalculator.hh
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 header file
30//
31//
32// File name: G4EmCalculator
33//
34// Author: Vladimir Ivanchenko
35//
36// Creation date: 27.06.2004
37//
38// Modifications:
39// 17.11.2004 Change signature of methods, add new methods (V.Ivanchenko)
40// 11.01.2006 Add GetCSDARange (V.Ivanchenko)
41// 26.01.2006 Rename GetRange -> GetRangeFromRestricteDEDX (V.Ivanchenko)
42// 22.03.2006 Add ComputeElectronicDEDX and ComputeTotalDEDX (V.Ivanchenko)
43// 29.09.2006 Add member loweModel (V.Ivanchenko)
44// 15.03.2007 Add ComputeEnergyCutFromRangeCut methods (V.Ivanchenko)
45// 02.02.2018 Add parameter to FindLambdaTable to store process type (M. Novak)
46//
47// Class Description:
48//
49// Provide access to dE/dx and cross sections
50
51// -------------------------------------------------------------------
52//
53
54#ifndef G4EmCalculator_h
55#define G4EmCalculator_h 1
56
57#include <vector>
58#include "globals.hh"
60
62class G4NistManager;
63class G4Material;
66class G4PhysicsTable;
67class G4VEmModel;
69class G4VEmProcess;
71class G4VProcess;
73class G4Region;
74class G4Element;
75class G4EmCorrections;
76class G4EmParameters;
77class G4IonTable;
78
80{
81
82public:
83
85
87
88 //===========================================================================
89 // Methods to access precalculated dE/dx and cross sections
90 // Materials should exist in the list of the G4MaterialCutsCouple
91 //===========================================================================
92
94 const G4Material*,
95 const G4Region* r = nullptr);
96 inline G4double GetDEDX(G4double kinEnergy, const G4String& part,
97 const G4String& mat,
98 const G4String& regname = "world");
99
101 const G4ParticleDefinition*,
102 const G4Material*,
103 const G4Region* r = nullptr);
105 const G4String& part,
106 const G4String& mat,
107 const G4String& regname = "world");
108
110 const G4Material*,
111 const G4Region* r = nullptr);
112 inline G4double GetCSDARange(G4double kinEnergy, const G4String& part,
113 const G4String& mat,
114 const G4String& regname = "world");
115
117 const G4Material*,
118 const G4Region* r = nullptr);
119 inline G4double GetRange(G4double kinEnergy, const G4String& part,
120 const G4String& mat,
121 const G4String& regname = "world");
122
124 const G4Material*,
125 const G4Region* r = nullptr);
126 inline G4double GetKinEnergy(G4double range, const G4String& part,
127 const G4String& mat,
128 const G4String& regname = "world");
129
131 G4double kinEnergy, const G4ParticleDefinition*,
132 const G4String& processName, const G4Material*,
133 const G4Region* r = nullptr);
135 G4double kinEnergy, const G4String& part, const G4String& proc,
136 const G4String& mat, const G4String& regname = "world");
137
139 const G4String& part, G4int Z,
141 G4double kinEnergy);
142
144 const G4String& processName, const G4Material*,
145 const G4Region* r = nullptr);
146 inline G4double GetMeanFreePath(G4double kinEnergy, const G4String& part,
147 const G4String& proc, const G4String& mat,
148 const G4String& regname = "world");
149
151
153
155
156 //===========================================================================
157 // Methods to calculate dE/dx and cross sections "on fly"
158 // Existing tables and G4MaterialCutsCouples are not used
159 //===========================================================================
160
162 const G4String& processName, const G4Material*,
163 G4double cut = DBL_MAX);
164 inline G4double ComputeDEDX(G4double kinEnergy, const G4String& part,
165 const G4String& proc,
166 const G4String& mat, G4double cut = DBL_MAX);
167
170 const G4Material* mat, G4double cut = DBL_MAX);
171 inline G4double ComputeElectronicDEDX(G4double kinEnergy, const G4String& part,
172 const G4String& mat, G4double cut = DBL_MAX);
173
176 const G4Material* mat, G4double rangecut = DBL_MAX);
177 inline G4double ComputeDEDXForCutInRange(G4double kinEnergy, const G4String& part,
178 const G4String& mat,
179 G4double rangecut = DBL_MAX);
180
182 const G4Material*);
183 inline G4double ComputeNuclearDEDX(G4double kinEnergy, const G4String& part,
184 const G4String& mat);
185
187 const G4Material*, G4double cut = DBL_MAX);
188 inline G4double ComputeTotalDEDX(G4double kinEnergy, const G4String& part,
189 const G4String& mat, G4double cut = DBL_MAX);
190
192 G4double kinEnergy, const G4ParticleDefinition*,
193 const G4String& processName, const G4Material*,
194 G4double cut = 0.0);
196 G4double kinEnergy, const G4String& part,
197 const G4String& proc,
198 const G4String& mat, G4double cut = 0.0);
199
201 G4double kinEnergy, const G4ParticleDefinition*,
202 const G4String& processName, G4double Z, G4double A,
203 G4double cut = 0.0);
205 G4double kinEnergy, const G4String& part,
206 const G4String& processName, const G4Element*,
207 G4double cut = 0.0);
208
210 G4double kinEnergy, const G4ParticleDefinition*,
211 const G4String& processName, G4int Z, G4int shellIdx,
212 G4double cut = 0.0);
214 G4double kinEnergy, const G4String& part,
215 const G4String& processName, const G4Element*,
216 G4int shellIdx,
217 G4double cut = 0.0);
218
220 const G4Material*);
221
223 const G4String& part, G4int Z,
225 G4double kinEnergy,
226 const G4Material* mat = nullptr);
227
229 G4double kinEnergy, const G4ParticleDefinition*,
230 const G4String& processName, const G4Material*,
231 G4double cut = 0.0);
233 G4double kinEnergy, const G4String&, const G4String&,
234 const G4String& processName, G4double cut = 0.0);
235
237 G4double range, const G4ParticleDefinition*,
238 const G4Material*);
240 G4double range, const G4String&,
241 const G4String&);
242
243 //===========================================================================
244 // Methods to access particles, materials, regions, processes
245 //===========================================================================
246
248
250
251 const G4Material* FindMaterial(const G4String&);
252
253 const G4Region* FindRegion(const G4String&);
254
256 const G4Region* r = nullptr);
257
259 const G4String& processName);
260
261 void SetupMaterial(const G4Material*);
262
263 void SetupMaterial(const G4String&);
264
265 void SetVerbose(G4int val);
266
267 inline void SetApplySmoothing(G4int val);
268
269 // hide copy and assign
270 G4EmCalculator & operator=(const G4EmCalculator &right) = delete;
272
273private:
274
275 G4bool UpdateParticle(const G4ParticleDefinition*, G4double kinEnergy);
276
277 G4bool UpdateCouple(const G4Material*, G4double cut);
278
279 void FindLambdaTable(const G4ParticleDefinition*,
280 const G4String& processName,
281 G4double kinEnergy, G4int& proctype);
282
283 G4bool FindEmModel(const G4ParticleDefinition*,
284 const G4String& processName,
285 G4double kinEnergy);
286
287 G4VEnergyLossProcess* FindEnLossProcess(const G4ParticleDefinition*,
288 const G4String& processName);
289
290 G4VEmProcess* FindDiscreteProcess(const G4ParticleDefinition*,
291 const G4String& processName);
292
293 G4VMultipleScattering* FindMscProcess(const G4ParticleDefinition*,
294 const G4String& processName);
295
296 G4bool ActiveForParticle(const G4ParticleDefinition* part,
297 G4VProcess* proc);
298
299 void CheckMaterial(G4int Z);
300
301 G4EmParameters* theParameters;
302 G4LossTableManager* manager;
303 G4NistManager* nist;
304 G4IonTable* ionTable;
305 G4EmCorrections* corr;
306
307 // cache
308 const G4MaterialCutsCouple* currentCouple = nullptr;
309 const G4Material* currentMaterial = nullptr;
310 const G4Material* cutMaterial = nullptr;
311 const G4ParticleDefinition* currentParticle = nullptr;
312 const G4ParticleDefinition* lambdaParticle = nullptr;
313 const G4ParticleDefinition* baseParticle = nullptr;
314 const G4PhysicsTable* currentLambda = nullptr;
315
316 G4VEmModel* currentModel = nullptr;
317 G4VEmModel* loweModel = nullptr;
318 G4VEnergyLossProcess* currentProcess = nullptr;
319 G4VProcess* curProcess = nullptr;
320 G4DynamicParticle* dynParticle = nullptr;
321
322 const G4ParticleDefinition* theGenericIon;
323 G4ionEffectiveCharge* ionEffCharge;
324
325 G4double currentCut = DBL_MAX;
326 G4double chargeSquare = 1.0;
327 G4double massRatio = 1.0;
328 G4double mass = 0;
329 G4double cutenergy[3];
330
331 G4int currentCoupleIndex = 0;
332 G4int nLocalMaterials = 0;
333 G4int verbose = 0;
334
335 G4bool isIon = false;
336 G4bool isApplicable = false;
337 G4bool applySmoothing = true;
338
339 std::vector<const G4Material*> localMaterials;
340 std::vector<const G4MaterialCutsCouple*> localCouples;
341 std::vector<G4double> localCuts;
342
343 G4String currentName = "";
344 G4String lambdaName = "";
345 G4String currentParticleName = "";
346 G4String currentMaterialName = "";
347 G4String currentProcessName = "";
348};
349
350//....oooOO0OOooo.......oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
351//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.....
352
353inline
355 const G4String& material, const G4String& reg)
356{
357 return GetDEDX(kinEnergy,FindParticle(particle),
358 FindMaterial(material),FindRegion(reg));
359}
360
361//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
362
363inline
365 const G4String& particle,
366 const G4String& material,
367 const G4String& reg)
368{
369 return GetRangeFromRestricteDEDX(kinEnergy,FindParticle(particle),
370 FindMaterial(material),FindRegion(reg));
371}
372
373//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
374
375inline
377 const G4String& particle,
378 const G4String& material,
379 const G4String& reg)
380{
381 return GetCSDARange(kinEnergy,FindParticle(particle),
382 FindMaterial(material),FindRegion(reg));
383}
384
385//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
386
387inline
389 const G4String& particle,
390 const G4String& material,
391 const G4String& reg)
392{
393 return GetRange(kinEnergy,FindParticle(particle),
394 FindMaterial(material),FindRegion(reg));
395}
396
397//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
398
399inline
401 const G4String& material, const G4String& reg)
402{
403 return GetKinEnergy(range,FindParticle(particle),
404 FindMaterial(material),FindRegion(reg));
405}
406
407//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
408
409inline
411 const G4String& particle,
412 const G4String& processName,
413 const G4String& material,
414 const G4String& reg)
415{
416 return GetCrossSectionPerVolume(kinEnergy,FindParticle(particle),processName,
417 FindMaterial(material),FindRegion(reg));
418}
419
420//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
421
422inline
424 const G4String& particle,
425 const G4String& processName,
426 const G4String& material,
427 const G4String& reg)
428{
429 return GetMeanFreePath(kinEnergy,FindParticle(particle),processName,
430 FindMaterial(material),FindRegion(reg));
431}
432
433//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
434
435inline G4double
437 const G4String& mat, G4double cut)
438{
439 return
440 ComputeElectronicDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
441}
442
443//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
444
445inline G4double
447 const G4String& part,
448 const G4String& mat,
449 G4double rangecut)
450{
451 return ComputeDEDXForCutInRange(kinEnergy,FindParticle(part),
452 FindMaterial(mat), rangecut);
453}
454
455//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
456
457inline
459 const G4String& part,
460 const G4String& mat,
461 G4double cut)
462{
463 return ComputeTotalDEDX(kinEnergy,FindParticle(part),FindMaterial(mat),cut);
464}
465
466//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
467
468inline
470 const G4String& particle,
471 const G4String& processName,
472 const G4String& material,
473 G4double cut)
474{
475 return ComputeDEDX(kinEnergy,FindParticle(particle),processName,
476 FindMaterial(material),cut);
477}
478
479//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
480
481inline
483 const G4String& particle,
484 const G4String& material)
485{
486 return ComputeNuclearDEDX(kinEnergy,FindParticle(particle),
487 FindMaterial(material));
488}
489
490//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
491
492inline
494 G4double kinEnergy,
495 const G4String& particle,
496 const G4String& processName,
497 const G4String& material,
498 G4double cut)
499{
500 return ComputeCrossSectionPerVolume(kinEnergy,FindParticle(particle),
501 processName,
502 FindMaterial(material),cut);
503}
504
505//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
506
507inline
509 const G4String& particle,
510 const G4String& processName,
511 const G4Element* elm,
512 G4double cut)
513{
514 return ComputeCrossSectionPerAtom(kinEnergy,FindParticle(particle),
515 processName,
516 elm->GetZ(),elm->GetN(),cut);
517}
518
519//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
520
522 G4double kinEnergy, const G4String& part,
523 const G4String& processName, const G4Element* elm,
524 G4int shellIdx, G4double cut)
525{
526 return ComputeCrossSectionPerShell(kinEnergy, FindParticle(part),
527 processName, elm->GetZasInt(),
528 shellIdx, cut);
529}
530
531//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
532
533inline
535 G4double range,
536 const G4String& particle,
537 const G4String& material)
538{
539 return ComputeEnergyCutFromRangeCut(range,FindParticle(particle),
540 FindMaterial(material));
541}
542
543//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
544
545inline
547 const G4String& particle,
548 const G4String& processName,
549 const G4String& material,
550 G4double cut)
551{
552 return ComputeMeanFreePath(kinEnergy,FindParticle(particle),processName,
553 FindMaterial(material),cut);
554}
555
556//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
557
559{
560 applySmoothing = val;
561}
562
563//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
564
565#endif
G4AtomicShellEnumerator
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4int Z[17]
const G4double A[17]
G4double GetZ() const
Definition: G4Element.hh:131
G4int GetZasInt() const
Definition: G4Element.hh:132
G4double GetN() const
Definition: G4Element.hh:135
const G4ParticleDefinition * FindParticle(const G4String &)
G4double ComputeMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double GetShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy)
G4double GetDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4EmCalculator(const G4EmCalculator &)=delete
G4double ComputeTotalDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, G4double cut=DBL_MAX)
G4double GetCSDARange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double GetRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4EmCalculator & operator=(const G4EmCalculator &right)=delete
G4double ComputeNuclearDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *)
const G4ParticleDefinition * FindIon(G4int Z, G4int A)
G4double ComputeGammaAttenuationLength(G4double kinEnergy, const G4Material *)
G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=DBL_MAX)
void SetVerbose(G4int val)
G4double ComputeEnergyCutFromRangeCut(G4double range, const G4ParticleDefinition *, const G4Material *)
G4double GetKinEnergy(G4double range, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double GetRangeFromRestricteDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *, const G4Region *r=nullptr)
G4double ComputeCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, G4double cut=0.0)
G4double ComputeCrossSectionPerAtom(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4double Z, G4double A, G4double cut=0.0)
void PrintDEDXTable(const G4ParticleDefinition *)
const G4Region * FindRegion(const G4String &)
G4VProcess * FindProcess(const G4ParticleDefinition *part, const G4String &processName)
G4double GetCrossSectionPerVolume(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
G4double ComputeCrossSectionPerShell(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, G4int Z, G4int shellIdx, G4double cut=0.0)
G4double ComputeShellIonisationCrossSectionPerAtom(const G4String &part, G4int Z, G4AtomicShellEnumerator shell, G4double kinEnergy, const G4Material *mat=nullptr)
void SetApplySmoothing(G4int val)
const G4MaterialCutsCouple * FindCouple(const G4Material *, const G4Region *r=nullptr)
void SetupMaterial(const G4Material *)
void PrintRangeTable(const G4ParticleDefinition *)
void PrintInverseRangeTable(const G4ParticleDefinition *)
G4double ComputeDEDXForCutInRange(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double rangecut=DBL_MAX)
G4double GetMeanFreePath(G4double kinEnergy, const G4ParticleDefinition *, const G4String &processName, const G4Material *, const G4Region *r=nullptr)
G4double ComputeElectronicDEDX(G4double kinEnergy, const G4ParticleDefinition *, const G4Material *mat, G4double cut=DBL_MAX)
const G4Material * FindMaterial(const G4String &)
#define DBL_MAX
Definition: templates.hh:62