ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4SBBremTable.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4SBBremTable.hh
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 
65 public:
66  // CTR/DTR
67  G4SBBremTable();
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
76  void ClearSamplingTables();
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 
87 private:
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 
99 private:
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)
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 
138 private:
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
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