Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4SBBremTable.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: G4SBBremTable
33//
34// Author: Mihaly Novak
35//
36// Creation date: 15.07.2018
37//
38// Modifications:
39//
40// Class description:
41//
42// Utility class to handle sampling tables for the Seltzer-Berger scalled brems-
43// strahlung differential cross sections. It makes possible fast (significantly
44// faster than the rejection) sampling of the emitted photon energy in case of
45// interactions. An object from this class is supposed to be a member of the
46// Seltzer-Berger model for e-/e+ bremsstrahlung photon emission model. Note,
47// that one object from this class can handle both e- and e+ cases (containes
48// e+ correction in the SampleEnergyTransfer method only).
49//
50// ----------------------------------------------------------------------------
51
52#ifndef G4SBBremTable_h
53#define G4SBBremTable_h 1
54
55#include "globals.hh"
56#include "G4String.hh"
57
58#include <vector>
59
60// forward declar
62
64
65public:
66 // CTR/DTR
68
70
71 // loads and init sampling tables: lowe/highe are the low/high energy usage
72 // limits of the corresponding Seltzerberger-model.
73 void Initialize(const G4double lowe, const G4double highe);
74
75 // clean away all sampling tables and makes ready for re-initialisation
77
78 // run-time method to sample energy transferred to the emitted photon
79 double SampleEnergyTransfer(const G4double eekin, const G4double leekin,
80 const G4double gcut , const G4double dielSupConst,
81 const G4int izet , const G4int matCutIndx,
82 const bool iselectron);
83
84 // used only for development: print out table related information
85 // void Dump();
86
87private:
88
89 void BuildSamplingTables();
90
91 void InitSamplingTables();
92
93 void LoadSTGrid();
94
95 void LoadSamplingTables(G4int iz);
96
97 void ReadCompressedFile(const G4String &fname, std::istringstream &iss);
98
99private:
100
101 // Sampling-Table point: describes one [E_i],[kappa_j] point
102 struct STPoint {
103 G4double fCum; // value of the cumulative function
104 G4double fParA; // rational function approximation based interp. parameter
105 G4double fParB; // rational function approximation based interp. parameter
106 };
107
108 // Sampling-Table: describes one [E_j] e- energy point i.e. one Table
109 struct STable {
110 // cumulative values for the kappa-cuts: kappa_cut_i=E_gamma_cut_i/E_el_j
111 std::vector<G4double> fCumCutValues;
112 // as many STPoint-s as kappa values
113 std::vector<STPoint> fSTable;
114 };
115
116 // Sampling-Tables for a given Z:
117 // describes all tables (i.e. for all e- energies) for a given element (Z)
118 struct SamplingTablePerZ {
119 SamplingTablePerZ() : fNumGammaCuts(0), fMinElEnergyIndx(-1), fMaxElEnergyIndx(-1) {}
120 size_t fNumGammaCuts; // number of gamma-cut for this
121 G4int fMinElEnergyIndx; // max(i) such E_i <= E for all E
122 G4int fMaxElEnergyIndx; // min(i) such E_i >= E for all E
123 std::vector<STable*> fTablesPerEnergy; // as many table as e-ekin grid point
124 //the different gamma-cut values that are defined for this element(Z) and ln
125 std::vector<G4double> fGammaECuts;
126 std::vector<G4double> fLogGammaECuts;
127 // the couple index element stores the corresponding (sorted) gamma-cut index
128 std::vector<size_t> fMatCutIndxToGamCutIndx;
129 // temporary vector to store some indecis during initialisation
130 std::vector< std::vector<size_t> > fGamCutIndxToMatCutIndx;
131 };
132
133 // simple linear search: most of the time faster than anything in our case
134 G4int LinSearch(const std::vector<STPoint>& vect,
135 const G4int size,
136 const G4double val);
137
138private:
139
140 // pre-prepared sampling tables are available:
141 G4int fMaxZet; // max Z number
142 G4int fNumElEnergy; // # e- kine (E_k) per Z
143 G4int fNumKappa; // # red. photon eners per E_k
144
145 // min/max electron kinetic energy usage limits
146 G4double fUsedLowEenergy;
147 G4double fUsedHighEenergy;
148 G4double fLogMinElEnergy;
149 G4double fILDeltaElEnergy;
150
151 // e- kinetic energy and reduced photon energy grids and tehir logarithms
152 std::vector<G4double> fElEnergyVect;
153 std::vector<G4double> fLElEnergyVect;
154 std::vector<G4double> fKappaVect;
155 std::vector<G4double> fLKappaVect;
156
157 // container to store samplingtables per Z (size is fMaxZet+1)
158 std::vector<SamplingTablePerZ*> fSBSamplingTables;
159
160};
161
162#endif
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
double SampleEnergyTransfer(const G4double eekin, const G4double leekin, const G4double gcut, const G4double dielSupConst, const G4int izet, const G4int matCutIndx, const bool iselectron)
void Initialize(const G4double lowe, const G4double highe)
void ClearSamplingTables()