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
G4VEmProcess.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// GEANT4 Class header file
29//
30//
31// File name: G4VEmProcess
32//
33// Author: Vladimir Ivanchenko
34//
35// Creation date: 01.10.2003
36//
37// Modifications: Vladimir Ivanchenko
38//
39// Class Description:
40//
41// It is the base class - EM discrete and rest/discrete process
42
43// -------------------------------------------------------------------
44//
45
46#ifndef G4VEmProcess_h
47#define G4VEmProcess_h 1
48
50
51#include "G4VDiscreteProcess.hh"
52#include "globals.hh"
53#include "G4Material.hh"
55#include "G4Track.hh"
56#include "G4UnitsTable.hh"
59#include "G4EmParameters.hh"
60#include "G4EmDataHandler.hh"
61#include "G4EmTableType.hh"
62#include "G4EmModelManager.hh"
64
65class G4Step;
66class G4VEmModel;
67class G4DataVector;
69class G4PhysicsTable;
70class G4PhysicsVector;
73
74//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
75
77{
78public:
79
81
82 ~G4VEmProcess() override;
83
84 //------------------------------------------------------------------------
85 // Virtual methods to be implemented in concrete processes
86 //------------------------------------------------------------------------
87
88 virtual G4bool IsApplicable(const G4ParticleDefinition& p) override = 0;
89
90 void ProcessDescription(std::ostream& outFile) const override;
91
92protected:
93
94 virtual void StreamProcessInfo(std::ostream&) const {};
95
96 virtual void InitialiseProcess(const G4ParticleDefinition*) = 0;
97
98 //------------------------------------------------------------------------
99 // Implementation of virtual methods common to all Discrete processes
100 //------------------------------------------------------------------------
101
102public:
103
104 // Initialise for build of tables
105 void PreparePhysicsTable(const G4ParticleDefinition&) override;
106
107 // Build physics table during initialisation
108 void BuildPhysicsTable(const G4ParticleDefinition&) override;
109
110 // Called before tracking of each new G4Track
111 void StartTracking(G4Track*) override;
112
113 // implementation of virtual method, specific for G4VEmProcess
115 const G4Track& track,
116 G4double previousStepSize,
117 G4ForceCondition* condition) override;
118
119 // implementation of virtual method, specific for G4VEmProcess
120 G4VParticleChange* PostStepDoIt(const G4Track&, const G4Step&) override;
121
122 // Store PhysicsTable in a file.
123 // Return false in case of failure at I/O
125 const G4String& directory,
126 G4bool ascii = false) override;
127
128 // Retrieve Physics from a file.
129 // (return true if the Physics Table can be build by using file)
130 // (return false if the process has no functionality or in case of failure)
131 // File name should is constructed as processName+particleName and the
132 // should be placed under the directory specified by the argument.
134 const G4String& directory,
135 G4bool ascii) override;
136
137 // allowing check process name
138 virtual G4VEmProcess* GetEmProcess(const G4String& name);
139
140 //------------------------------------------------------------------------
141 // Specific methods for Discrete EM post step simulation
142 //------------------------------------------------------------------------
143
144 // The main method to access cross section per volume
145 inline G4double GetLambda(G4double kinEnergy,
146 const G4MaterialCutsCouple* couple,
147 G4double logKinEnergy);
148
149 // It returns the cross section per volume for energy/material
150 G4double GetCrossSection(const G4double kinEnergy,
151 const G4MaterialCutsCouple* couple) override;
152
153 // It returns the cross section of the process per atom
155 G4double Z, G4double A=0.,
156 G4double cut=0.0);
157
158 inline G4double MeanFreePath(const G4Track& track);
159
160 //------------------------------------------------------------------------
161 // Specific methods to build and access Physics Tables
162 //------------------------------------------------------------------------
163
164 // Binning for lambda table
165 void SetLambdaBinning(G4int nbins);
166
167 // Min kinetic energy for tables
169
170 // Min kinetic energy for high energy table
172
173 // Max kinetic energy for tables
175
176 // Cross section table pointers
177 inline G4PhysicsTable* LambdaTable() const;
178 inline G4PhysicsTable* LambdaTablePrim() const;
179 inline void SetLambdaTable(G4PhysicsTable*);
181
182 // Integral method type and peak positions
183 inline std::vector<G4double>* EnergyOfCrossSectionMax() const;
184 inline void SetEnergyOfCrossSectionMax(std::vector<G4double>*);
187
188 //------------------------------------------------------------------------
189 // Define and access particle type
190 //------------------------------------------------------------------------
191
192 inline const G4ParticleDefinition* Particle() const;
193 inline const G4ParticleDefinition* SecondaryParticle() const;
194
195protected:
196
197 //------------------------------------------------------------------------
198 // Specific methods to set, access, modify models and basic parameters
199 //------------------------------------------------------------------------
200
201 // Select model in run time
202 inline G4VEmModel* SelectModel(G4double kinEnergy, size_t);
203
204public:
205
206 // Select model by energy and couple index
207 inline G4VEmModel* SelectModelForMaterial(G4double kinEnergy,
208 size_t idxCouple) const;
209
210 // Add model for region, smaller value of order defines which
211 // model will be selected for a given energy interval
212 void AddEmModel(G4int, G4VEmModel*, const G4Region* region = nullptr);
213
214 // Assign a model to a process local list, to enable the list in run time
215 // the derived process should execute AddEmModel(..) for all such models
216 void SetEmModel(G4VEmModel*, G4int index = 0);
217
218 inline G4int NumberOfModels() const;
219
220 // return a model from the local list
221 inline G4VEmModel* EmModel(size_t index = 0) const;
222
223 // Access to active model
224 inline const G4VEmModel* GetCurrentModel() const;
225
226 // Access to models
227 inline G4VEmModel* GetModelByIndex(G4int idx = 0, G4bool ver = false) const;
228
229 // Access to the current G4Element
230 const G4Element* GetCurrentElement() const;
231
232 // Biasing parameters
233 void SetCrossSectionBiasingFactor(G4double f, G4bool flag = true);
234 inline G4double CrossSectionBiasingFactor() const;
235
236 // Activate forced interaction
237 void ActivateForcedInteraction(G4double length = 0.0,
238 const G4String& r = "",
239 G4bool flag = true);
240
241 void ActivateSecondaryBiasing(const G4String& region, G4double factor,
242 G4double energyLimit);
243
244 inline void SetEmMasterProcess(const G4VEmProcess*);
245
246 inline void SetBuildTableFlag(G4bool val);
247
248 inline void CurrentSetup(const G4MaterialCutsCouple*, G4double energy);
249
250 inline G4bool UseBaseMaterial() const;
251
252 void BuildLambdaTable();
253
254 void StreamInfo(std::ostream& outFile, const G4ParticleDefinition&,
255 G4bool rst=false) const;
256
257 // hide copy constructor and assignment operator
259 G4VEmProcess & operator=(const G4VEmProcess &right) = delete;
260
261 //------------------------------------------------------------------------
262 // Other generic methods
263 //------------------------------------------------------------------------
264
265protected:
266
267 G4double GetMeanFreePath(const G4Track& track,
268 G4double previousStepSize,
269 G4ForceCondition* condition) override;
270
272
273 inline void DefineMaterial(const G4MaterialCutsCouple* couple);
274
275 inline G4int LambdaBinning() const;
276
277 inline G4double MinKinEnergy() const;
278
279 inline G4double MaxKinEnergy() const;
280
281 // Single scattering parameters
282 inline G4double PolarAngleLimit() const;
283
285
286 inline void SetParticle(const G4ParticleDefinition* p);
287
288 inline void SetSecondaryParticle(const G4ParticleDefinition* p);
289
290 inline size_t CurrentMaterialCutsCoupleIndex() const;
291
292 inline const G4MaterialCutsCouple* MaterialCutsCouple() const;
293
294 inline G4bool ApplyCuts() const;
295
297
299
300 inline void SetStartFromNullFlag(G4bool val);
301
302 inline void SetSplineFlag(G4bool val);
303
304 const G4Element* GetTargetElement() const;
305
306 const G4Isotope* GetTargetIsotope() const;
307
308 // these two methods assume that vectors are initilized
309 // and idx is within vector length
310 inline G4int DensityIndex(G4int idx) const;
311 inline G4double DensityFactor(G4int idx) const;
312
313private:
314
315 void PrintWarning(G4String tit, G4double val);
316
317 void ComputeIntegralLambda(G4double kinEnergy, G4double logKinEnergy);
318
319 inline G4double GetLambdaFromTable(G4double kinEnergy);
320
321 inline G4double GetLambdaFromTable(G4double kinEnergy, G4double logKinEnergy);
322
323 inline G4double GetLambdaFromTablePrim(G4double kinEnergy);
324
325 inline G4double GetLambdaFromTablePrim(G4double kinEnergy, G4double logKinEnergy);
326
327 inline G4double GetCurrentLambda(G4double kinEnergy);
328
329 inline G4double GetCurrentLambda(G4double kinEnergy, G4double logKinEnergy);
330
331 inline G4double ComputeCurrentLambda(G4double kinEnergy);
332
333 // ======== pointers =========
334
335 G4EmModelManager* modelManager = nullptr;
336 const G4ParticleDefinition* particle = nullptr;
337 const G4ParticleDefinition* currentParticle = nullptr;
338 const G4ParticleDefinition* theGamma = nullptr;
339 const G4ParticleDefinition* theElectron = nullptr;
340 const G4ParticleDefinition* thePositron = nullptr;
341 const G4ParticleDefinition* secondaryParticle = nullptr;
342 const G4VEmProcess* masterProc = nullptr;
343 G4EmDataHandler* theData = nullptr;
344 G4VEmModel* currentModel = nullptr;
345 G4LossTableManager* lManager = nullptr;
346 G4EmParameters* theParameters = nullptr;
347 const G4Material* baseMaterial = nullptr;
348
349 // ======== tables and vectors ========
350 G4PhysicsTable* theLambdaTable = nullptr;
351 G4PhysicsTable* theLambdaTablePrim = nullptr;
352
353 const std::vector<G4double>* theCuts = nullptr;
354 const std::vector<G4double>* theCutsGamma = nullptr;
355 const std::vector<G4double>* theCutsElectron = nullptr;
356 const std::vector<G4double>* theCutsPositron = nullptr;
357
358protected:
359
360 // ======== pointers =========
361
363 const G4Material* currentMaterial = nullptr;
365 std::vector<G4double>* theEnergyOfCrossSectionMax = nullptr;
366
367private:
368
369 const std::vector<G4double>* theDensityFactor = nullptr;
370 const std::vector<G4int>* theDensityIdx = nullptr;
371
372 // ======== parameters =========
373 G4double minKinEnergy;
374 G4double maxKinEnergy;
375 G4double minKinEnergyPrim = DBL_MAX;
376 G4double lambdaFactor = 0.8;
377 G4double invLambdaFactor;
378 G4double biasFactor = 1.0;
379 G4double massRatio = 1.0;
380 G4double fFactor = 1.0;
381 G4double fLambda = 0.0;
382 G4double fLambdaEnergy = 0.0;
383
384protected:
385
390
391private:
392
394
395 G4int numberOfModels = 0;
396 G4int nLambdaBins = 84;
397
398protected:
399
408 size_t coupleIdxLambda = 0;
409 size_t idxLambda = 0;
410
413
414private:
415
416 G4bool buildLambdaTable = true;
417 G4bool applyCuts = false;
418 G4bool startFromNull = false;
419 G4bool splineFlag = true;
420 G4bool actMinKinEnergy = false;
421 G4bool actMaxKinEnergy = false;
422 G4bool actBinning = false;
423 G4bool isIon = false;
424 G4bool biasFlag = false;
425 G4bool weightFlag = false;
426
427protected:
428
429 // ======== particle change =========
430 std::vector<G4DynamicParticle*> secParticles;
432
433private:
434
435 // ======== local vectors =========
436 std::vector<G4VEmModel*> emModels;
437
438};
439
440// ======== Run time inline methods ================
441
442//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
443
445{
446 return currentCoupleIndex;
447}
448
449//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
450
452{
453 return currentCouple;
454}
455
456//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
457
459{
460 return (*theCutsGamma)[currentCoupleIndex];
461}
462
463//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
464
466{
467 return (*theCutsElectron)[currentCoupleIndex];
468}
469
470//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
471
473{
474 if(couple != currentCouple) {
475 currentCouple = couple;
476 baseMaterial = currentMaterial = couple->GetMaterial();
478 fFactor = biasFactor;
480 if(baseMat) {
481 basedCoupleIndex = (*theDensityIdx)[currentCoupleIndex];
482 if(nullptr != currentMaterial->GetBaseMaterial())
483 baseMaterial = currentMaterial->GetBaseMaterial();
484 fFactor *= (*theDensityFactor)[currentCoupleIndex];
485 }
486 }
487}
488
489//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
490
491inline
493{
494 if(1 < numberOfModels) {
495 currentModel = modelManager->SelectModel(kinEnergy, currentCoupleIndex);
496 }
497 currentModel->SetCurrentCouple(currentCouple);
498 return currentModel;
499}
500
501//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
502
503inline
505 size_t idxCouple) const
506{
507 return modelManager->SelectModel(kinEnergy, idxCouple);
508}
509
510//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
511
512inline G4double G4VEmProcess::GetLambdaFromTable(G4double e)
513{
514 return ((*theLambdaTable)[basedCoupleIndex])->Value(e, idxLambda);
515}
516
517//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
518
519inline G4double G4VEmProcess::GetLambdaFromTable(G4double e, G4double loge)
520{
521 return ((*theLambdaTable)[basedCoupleIndex])->LogVectorValue(e, loge);
522}
523
524//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
525
526inline G4double G4VEmProcess::GetLambdaFromTablePrim(G4double e)
527{
528 return ((*theLambdaTablePrim)[basedCoupleIndex])->Value(e, idxLambda)/e;
529}
530
531//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
532
533inline G4double G4VEmProcess::GetLambdaFromTablePrim(G4double e, G4double loge)
534{
535 return ((*theLambdaTablePrim)[basedCoupleIndex])->LogVectorValue(e, loge)/e;
536}
537
538//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
539
540inline G4double G4VEmProcess::ComputeCurrentLambda(G4double e)
541{
542 return currentModel->CrossSectionPerVolume(baseMaterial, currentParticle, e);
543}
544
545//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
546
547inline G4double G4VEmProcess::GetCurrentLambda(G4double e)
548{
549 if(currentCoupleIndex != coupleIdxLambda || fLambdaEnergy != e) {
551 fLambdaEnergy = e;
552 if(e >= minKinEnergyPrim) { fLambda = GetLambdaFromTablePrim(e); }
553 else if(nullptr != theLambdaTable) { fLambda = GetLambdaFromTable(e); }
554 else { fLambda = ComputeCurrentLambda(e); }
555 fLambda *= fFactor;
556 }
557 return fLambda;
558}
559
560//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
561
562inline G4double G4VEmProcess::GetCurrentLambda(G4double e, G4double loge)
563{
564 if(currentCoupleIndex != coupleIdxLambda || fLambdaEnergy != e) {
566 fLambdaEnergy = e;
567 if(e >= minKinEnergyPrim) { fLambda = GetLambdaFromTablePrim(e, loge); }
568 else if(nullptr != theLambdaTable) { fLambda = GetLambdaFromTable(e, loge); }
569 else { fLambda = ComputeCurrentLambda(e); }
570 fLambda *= fFactor;
571 }
572 return fLambda;
573}
574
575//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
576
577inline void
579{
580 DefineMaterial(couple);
581 SelectModel(energy*massRatio, currentCoupleIndex);
582}
583
584//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
585
586inline G4double
588 G4double logKinEnergy)
589{
590 CurrentSetup(couple, kinEnergy);
591 return GetCurrentLambda(kinEnergy, logKinEnergy);
592}
593
594//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
595
597{
598 const G4double kinEnergy = track.GetKineticEnergy();
599 CurrentSetup(track.GetMaterialCutsCouple(), kinEnergy);
600 const G4double xs = GetCurrentLambda(kinEnergy,
602 return (0.0 < xs) ? 1.0/xs : DBL_MAX;
603}
604
605// ======== Get/Set inline methods used at initialisation ================
606
608{
609 return applyCuts;
610}
611
612//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
613
615{
616 return nLambdaBins;
617}
618
619//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
620
622{
623 return minKinEnergy;
624}
625
626//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
627
629{
630 return maxKinEnergy;
631}
632
633//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
634
636{
637 return biasFactor;
638}
639
640//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
641
643{
644 return theLambdaTable;
645}
646
647//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
648
650{
651 return theLambdaTablePrim;
652}
653
654//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
655
657{
658 theLambdaTable = ptr;
659}
660
661//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
662
664{
665 theLambdaTablePrim = ptr;
666}
667
668//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
669
670inline std::vector<G4double>* G4VEmProcess::EnergyOfCrossSectionMax() const
671{
673}
674
675//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
676
677inline void
679{
681}
682
683//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
684
686{
687 return particle;
688}
689
690//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
691
693{
694 return secondaryParticle;
695}
696
697//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
698
700{
701 fXSType = val;
702}
703
704//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
705
707{
708 return fXSType;
709}
710
711//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
712
714{
715 buildLambdaTable = val;
716}
717
718//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
719
721{
722 return &fParticleChange;
723}
724
725//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
726
728{
729 particle = p;
730 currentParticle = p;
731}
732
733//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
734
736{
737 secondaryParticle = p;
738}
739
740//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
741
743{
744 startFromNull = val;
745}
746
747//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
748
750{
751 splineFlag = val;
752}
753
754//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
755
757{
758 return (*theDensityIdx)[idx];
759}
760
761//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
762
764{
765 return (*theDensityFactor)[idx];
766}
767
768//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
769
771{
772 return baseMat;
773}
774
775//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
776
778{
779 return currentModel;
780}
781
782//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
783
785{
786 masterProc = ptr;
787}
788
789//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
790
792{
793 return numberOfModels;
794}
795
796//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
797
798inline G4VEmModel* G4VEmProcess::EmModel(size_t index) const
799{
800 return (index < emModels.size()) ? emModels[index] : nullptr;
801}
802
803//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
804
806{
807 return modelManager->GetModel(idx, ver);
808}
809
810//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
811
812#endif
G4CrossSectionType
@ fEmNoIntegral
G4double condition(const G4ErrorSymMatrix &m)
G4ForceCondition
G4ProcessType
@ fElectromagnetic
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 GetLogKineticEnergy() const
G4VEmModel * SelectModel(G4double energy, std::size_t index)
G4VEmModel * GetModel(G4int idx, G4bool ver=false) const
const G4Material * GetMaterial() const
const G4Material * GetBaseMaterial() const
Definition: G4Material.hh:228
Definition: G4Step.hh:62
const G4DynamicParticle * GetDynamicParticle() const
G4double GetKineticEnergy() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
virtual G4double CrossSectionPerVolume(const G4Material *, const G4ParticleDefinition *, G4double kineticEnergy, G4double cutEnergy=0.0, G4double maxEnergy=DBL_MAX)
Definition: G4VEmModel.cc:181
void SetCurrentCouple(const G4MaterialCutsCouple *)
Definition: G4VEmModel.hh:468
G4CrossSectionType CrossSectionType() const
void DefineMaterial(const G4MaterialCutsCouple *couple)
G4bool ApplyCuts() const
G4double GetGammaEnergyCut()
G4VEmModel * GetModelByIndex(G4int idx=0, G4bool ver=false) const
G4double MeanFreePath(const G4Track &track)
G4int mainSecondaries
G4PhysicsVector * LambdaPhysicsVector(const G4MaterialCutsCouple *)
void CurrentSetup(const G4MaterialCutsCouple *, G4double energy)
const G4ParticleDefinition * Particle() const
virtual void StreamProcessInfo(std::ostream &) const
Definition: G4VEmProcess.hh:94
G4VEmModel * SelectModel(G4double kinEnergy, size_t)
G4EmBiasingManager * biasManager
void BuildPhysicsTable(const G4ParticleDefinition &) override
void SetLambdaTablePrim(G4PhysicsTable *)
G4double preStepLambda
G4VEmModel * EmModel(size_t index=0) const
void SetBuildTableFlag(G4bool val)
G4double preStepLogKinEnergy
G4double ComputeCrossSectionPerAtom(G4double kineticEnergy, G4double Z, G4double A=0., G4double cut=0.0)
G4VEmProcess(G4VEmProcess &)=delete
void SetEnergyOfCrossSectionMax(std::vector< G4double > *)
G4PhysicsTable * LambdaTable() const
std::vector< G4double > * theEnergyOfCrossSectionMax
virtual G4bool IsApplicable(const G4ParticleDefinition &p) override=0
void SetMinKinEnergy(G4double e)
size_t basedCoupleIndex
G4double GetElectronEnergyCut()
G4VParticleChange * PostStepDoIt(const G4Track &, const G4Step &) override
G4int DensityIndex(G4int idx) const
size_t idxLambda
void StartTracking(G4Track *) override
G4double GetCrossSection(const G4double kinEnergy, const G4MaterialCutsCouple *couple) override
G4double CrossSectionBiasingFactor() const
void AddEmModel(G4int, G4VEmModel *, const G4Region *region=nullptr)
void SetEmModel(G4VEmModel *, G4int index=0)
void SetCrossSectionBiasingFactor(G4double f, G4bool flag=true)
G4double mfpKinEnergy
void SetEmMasterProcess(const G4VEmProcess *)
virtual void InitialiseProcess(const G4ParticleDefinition *)=0
void StreamInfo(std::ostream &outFile, const G4ParticleDefinition &, G4bool rst=false) const
size_t coupleIdxLambda
~G4VEmProcess() override
void SetLambdaBinning(G4int nbins)
G4bool RetrievePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii) override
void SetSecondaryParticle(const G4ParticleDefinition *p)
const G4VEmModel * GetCurrentModel() const
void SetSplineFlag(G4bool val)
G4VEmModel * SelectModelForMaterial(G4double kinEnergy, size_t idxCouple) const
std::vector< G4double > * EnergyOfCrossSectionMax() const
G4bool UseBaseMaterial() const
G4int NumberOfModels() const
void SetCrossSectionType(G4CrossSectionType val)
void ProcessDescription(std::ostream &outFile) const override
G4double PostStepGetPhysicalInteractionLength(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
G4VEmProcess & operator=(const G4VEmProcess &right)=delete
G4double GetLambda(G4double kinEnergy, const G4MaterialCutsCouple *couple, G4double logKinEnergy)
const G4Element * GetTargetElement() const
G4double DensityFactor(G4int idx) const
virtual G4VEmProcess * GetEmProcess(const G4String &name)
G4double MaxKinEnergy() const
G4ParticleChangeForGamma * GetParticleChange()
const G4Isotope * GetTargetIsotope() const
G4bool isTheMaster
G4double MinKinEnergy() const
std::vector< G4DynamicParticle * > secParticles
void ActivateForcedInteraction(G4double length=0.0, const G4String &r="", G4bool flag=true)
const G4MaterialCutsCouple * currentCouple
void SetStartFromNullFlag(G4bool val)
G4PhysicsTable * LambdaTablePrim() const
G4bool StorePhysicsTable(const G4ParticleDefinition *, const G4String &directory, G4bool ascii=false) override
void ActivateSecondaryBiasing(const G4String &region, G4double factor, G4double energyLimit)
const G4MaterialCutsCouple * MaterialCutsCouple() const
G4double preStepKinEnergy
G4double PolarAngleLimit() const
size_t currentCoupleIndex
G4ParticleChangeForGamma fParticleChange
void SetLambdaTable(G4PhysicsTable *)
G4int LambdaBinning() const
void SetParticle(const G4ParticleDefinition *p)
void SetMinKinEnergyPrim(G4double e)
void PreparePhysicsTable(const G4ParticleDefinition &) override
void SetMaxKinEnergy(G4double e)
const G4Material * currentMaterial
size_t CurrentMaterialCutsCoupleIndex() const
const G4Element * GetCurrentElement() const
G4double GetMeanFreePath(const G4Track &track, G4double previousStepSize, G4ForceCondition *condition) override
void BuildLambdaTable()
const G4ParticleDefinition * SecondaryParticle() const
#define LOG_EKIN_MIN
Definition: templates.hh:98
#define DBL_MAX
Definition: templates.hh:62