Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/standard/include/G4SBBremTable.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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