Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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