Geant4 Cross Reference |
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 61 class G4MaterialCutsCouple; 62 63 class G4SBBremTable { 64 65 public: 66 // CTR/DTR 67 G4SBBremTable(); 68 69 ~G4SBBremTable(); 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) 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 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 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 163