Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id$ 27 // 28 // >> 29 // $Id: 28 // 30 // 29 // ------------------------------------------- 31 // ----------------------------------------------------------------------------- 30 32 31 #ifndef included_G4EnergyLossTables 33 #ifndef included_G4EnergyLossTables 32 #define included_G4EnergyLossTables 34 #define included_G4EnergyLossTables 33 35 34 #include <map> 36 #include <map> 35 #include "globals.hh" 37 #include "globals.hh" 36 38 37 #include "G4PhysicsTable.hh" 39 #include "G4PhysicsTable.hh" 38 #include "G4ParticleDefinition.hh" 40 #include "G4ParticleDefinition.hh" 39 #include "G4Material.hh" 41 #include "G4Material.hh" 40 #include "G4ios.hh" 42 #include "G4ios.hh" 41 43 42 //-------------------------------------------- 44 //------------------------------------------------------------------------------ 43 // A utility class, containing the energy loss 45 // A utility class, containing the energy loss tables 44 // for each particle 46 // for each particle 45 // 47 // 46 // Energy loss processes have to register thei 48 // Energy loss processes have to register their tables with this 47 // class. The responsibility of creating and d 49 // class. The responsibility of creating and deleting the tables 48 // remains with the energy loss classes. 50 // remains with the energy loss classes. 49 // ------------------------------------------- 51 // ----------------------------------------------------------------------------- 50 // 52 // 51 // P. Urban, 06/04/1998 53 // P. Urban, 06/04/1998 52 // L. Urban, 27/05/1988 , modifications + new 54 // L. Urban, 27/05/1988 , modifications + new functions added 53 // L.Urban , 13/10/98 , revision 55 // L.Urban , 13/10/98 , revision 54 // L.Urban, 26/10/98 , revision, Interpolate 56 // L.Urban, 26/10/98 , revision, Interpolate removed 55 // L.Urban , 08/02/99, cache mechanism 57 // L.Urban , 08/02/99, cache mechanism 56 // L.Urban , 12/04/99 , bug fixed 58 // L.Urban , 12/04/99 , bug fixed 57 // don't use the helper class. 59 // don't use the helper class. 58 // It can't be hidden for Rogue Wave uses it. 60 // It can't be hidden for Rogue Wave uses it. 59 // 10.11.99: moved from RWT hash dictionary to 61 // 10.11.99: moved from RWT hash dictionary to STL map, G.Barrand, M.Maire 60 // 26.10.01: all static functions movev from . 62 // 26.10.01: all static functions movev from .icc to .cc file (mma) 61 // 15.01.03 Add interfaces required for "cut p 63 // 15.01.03 Add interfaces required for "cut per region" (V.Ivanchenko) 62 // 12.03.03 Add warnings to obsolete interface 64 // 12.03.03 Add warnings to obsolete interfaces (V.Ivanchenko) 63 // 12.04.03 move exception to new method (V.Iv 65 // 12.04.03 move exception to new method (V.Ivanchenko) 64 // 66 // 65 // ------------------------------------------- 67 // ----------------------------------------------------------------------------- 66 68 67 //....oooOO0OOooo........oooOO0OOooo........oo 69 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 68 70 69 class G4EnergyLossTablesHelper { 71 class G4EnergyLossTablesHelper { 70 72 71 friend class G4EnergyLossTables; 73 friend class G4EnergyLossTables; 72 // the only instances are within the class G 74 // the only instances are within the class G4EnergyLossTables 73 75 74 public: 76 public: 75 G4EnergyLossTablesHelper(); 77 G4EnergyLossTablesHelper(); 76 78 77 private: 79 private: 78 G4EnergyLossTablesHelper(const G4PhysicsTabl 80 G4EnergyLossTablesHelper(const G4PhysicsTable* aDEDXTable, 79 const G4PhysicsTable* aRangeTable, 81 const G4PhysicsTable* aRangeTable, 80 const G4PhysicsTabl 82 const G4PhysicsTable* anInverseRangeTable, 81 const G4PhysicsTabl 83 const G4PhysicsTable* aLabTimeTable, 82 const G4PhysicsTabl 84 const G4PhysicsTable* aProperTimeTable, 83 G4double aLowestKineticEnergy, 85 G4double aLowestKineticEnergy, 84 G4double aHighestKineticEnergy, 86 G4double aHighestKineticEnergy, 85 G4double aMassRatio, 87 G4double aMassRatio, 86 G4int aNumberOfBins 88 G4int aNumberOfBins); 87 // data to be stored in the dictionary 89 // data to be stored in the dictionary 88 const G4PhysicsTable* theDEDXTable; 90 const G4PhysicsTable* theDEDXTable; 89 const G4PhysicsTable* theRangeTable; 91 const G4PhysicsTable* theRangeTable; 90 const G4PhysicsTable* theInverseRangeTable; 92 const G4PhysicsTable* theInverseRangeTable; 91 const G4PhysicsTable* theLabTimeTable; 93 const G4PhysicsTable* theLabTimeTable; 92 const G4PhysicsTable* theProperTimeTable; 94 const G4PhysicsTable* theProperTimeTable; 93 G4double theLowestKineticEnergy; 95 G4double theLowestKineticEnergy; 94 G4double theHighestKineticEnergy; 96 G4double theHighestKineticEnergy; 95 G4double theMassRatio; 97 G4double theMassRatio; 96 G4int theNumberOfBins; 98 G4int theNumberOfBins; 97 }; 99 }; 98 100 99 //....oooOO0OOooo........oooOO0OOooo........oo 101 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 100 102 101 class G4MaterialCutsCouple; 103 class G4MaterialCutsCouple; 102 104 103 class G4EnergyLossTables { 105 class G4EnergyLossTables { 104 106 105 public: 107 public: 106 108 107 // get the table for a given particle 109 // get the table for a given particle 108 // (0 if the table was not found) 110 // (0 if the table was not found) 109 static const G4PhysicsTable* GetDEDXTable( 111 static const G4PhysicsTable* GetDEDXTable( 110 const G4ParticleDefinition* p); 112 const G4ParticleDefinition* p); 111 static const G4PhysicsTable* GetRangeTable( 113 static const G4PhysicsTable* GetRangeTable( 112 const G4ParticleDefinition* p); 114 const G4ParticleDefinition* p); 113 static const G4PhysicsTable* GetInverseRange 115 static const G4PhysicsTable* GetInverseRangeTable( 114 const G4ParticleDefinition* p); 116 const G4ParticleDefinition* p); 115 static const G4PhysicsTable* GetLabTimeTable 117 static const G4PhysicsTable* GetLabTimeTable( 116 const G4ParticleDefinition* p); 118 const G4ParticleDefinition* p); 117 static const G4PhysicsTable* GetProperTimeTa 119 static const G4PhysicsTable* GetProperTimeTable( 118 const G4ParticleDefinition* p); 120 const G4ParticleDefinition* p); 119 121 120 // get the DEDX or the range for a given par 122 // get the DEDX or the range for a given particle/energy/material 121 static G4double GetDEDX( 123 static G4double GetDEDX( 122 const G4ParticleDefinition *aParticle, 124 const G4ParticleDefinition *aParticle, 123 G4double KineticEnergy, 125 G4double KineticEnergy, 124 const G4Material *aMaterial); 126 const G4Material *aMaterial); 125 static G4double GetRange( 127 static G4double GetRange( 126 const G4ParticleDefinition *aParticle, 128 const G4ParticleDefinition *aParticle, 127 G4double KineticEnergy, 129 G4double KineticEnergy, 128 const G4Material *aMaterial); 130 const G4Material *aMaterial); 129 static G4double GetLabTime( 131 static G4double GetLabTime( 130 const G4ParticleDefinition *aParticle, 132 const G4ParticleDefinition *aParticle, 131 G4double KineticEnergy, 133 G4double KineticEnergy, 132 const G4Material *aMaterial); 134 const G4Material *aMaterial); 133 static G4double GetDeltaLabTime( 135 static G4double GetDeltaLabTime( 134 const G4ParticleDefinition *aParticle, 136 const G4ParticleDefinition *aParticle, 135 G4double KineticEnergyStart, 137 G4double KineticEnergyStart, 136 G4double KineticEnergyEnd, 138 G4double KineticEnergyEnd, 137 const G4Material *aMaterial); 139 const G4Material *aMaterial); 138 static G4double GetProperTime( 140 static G4double GetProperTime( 139 const G4ParticleDefinition *aParticle, 141 const G4ParticleDefinition *aParticle, 140 G4double KineticEnergy, 142 G4double KineticEnergy, 141 const G4Material *aMaterial); 143 const G4Material *aMaterial); 142 static G4double GetDeltaProperTime( 144 static G4double GetDeltaProperTime( 143 const G4ParticleDefinition *aParticle, 145 const G4ParticleDefinition *aParticle, 144 G4double KineticEnergyStart, 146 G4double KineticEnergyStart, 145 G4double KineticEnergyEnd, 147 G4double KineticEnergyEnd, 146 const G4Material *aMaterial); 148 const G4Material *aMaterial); 147 149 148 static G4double GetPreciseDEDX( 150 static G4double GetPreciseDEDX( 149 const G4ParticleDefinition *aParticle, 151 const G4ParticleDefinition *aParticle, 150 G4double KineticEnergy, 152 G4double KineticEnergy, 151 const G4Material *aMaterial); 153 const G4Material *aMaterial); 152 static G4double GetPreciseRangeFromEnergy( 154 static G4double GetPreciseRangeFromEnergy( 153 const G4ParticleDefinition *aParticle, 155 const G4ParticleDefinition *aParticle, 154 G4double KineticEnergy, 156 G4double KineticEnergy, 155 const G4Material *aMaterial); 157 const G4Material *aMaterial); 156 static G4double GetPreciseEnergyFromRange( 158 static G4double GetPreciseEnergyFromRange( 157 const G4ParticleDefinition *aParticle, 159 const G4ParticleDefinition *aParticle, 158 G4double range, 160 G4double range, 159 const G4Material *aMaterial); 161 const G4Material *aMaterial); 160 162 161 // get the DEDX or the range for a given par 163 // get the DEDX or the range for a given particle/energy/materialCutsCouple 162 static G4double GetDEDX( 164 static G4double GetDEDX( 163 const G4ParticleDefinition *aParticle, 165 const G4ParticleDefinition *aParticle, 164 G4double KineticEnergy, 166 G4double KineticEnergy, 165 const G4MaterialCutsCouple *couple, 167 const G4MaterialCutsCouple *couple, 166 G4bool check = true); 168 G4bool check = true); 167 static G4double GetRange( 169 static G4double GetRange( 168 const G4ParticleDefinition *aParticle, 170 const G4ParticleDefinition *aParticle, 169 G4double KineticEnergy, 171 G4double KineticEnergy, 170 const G4MaterialCutsCouple *couple, 172 const G4MaterialCutsCouple *couple, 171 G4bool check = true); 173 G4bool check = true); 172 174 173 static G4double GetPreciseDEDX( 175 static G4double GetPreciseDEDX( 174 const G4ParticleDefinition *aParticle, 176 const G4ParticleDefinition *aParticle, 175 G4double KineticEnergy, 177 G4double KineticEnergy, 176 const G4MaterialCutsCouple *couple); 178 const G4MaterialCutsCouple *couple); 177 static G4double GetPreciseRangeFromEnergy( 179 static G4double GetPreciseRangeFromEnergy( 178 const G4ParticleDefinition *aParticle, 180 const G4ParticleDefinition *aParticle, 179 G4double KineticEnergy, 181 G4double KineticEnergy, 180 const G4MaterialCutsCouple *couple); 182 const G4MaterialCutsCouple *couple); 181 static G4double GetPreciseEnergyFromRange( 183 static G4double GetPreciseEnergyFromRange( 182 const G4ParticleDefinition *aParticle, 184 const G4ParticleDefinition *aParticle, 183 G4double range, 185 G4double range, 184 const G4MaterialCutsCouple *couple, 186 const G4MaterialCutsCouple *couple, 185 G4bool check = true); 187 G4bool check = true); 186 188 187 // to be called only by energy loss processe 189 // to be called only by energy loss processes 188 static void Register( 190 static void Register( 189 const G4ParticleDefinition* p, 191 const G4ParticleDefinition* p, 190 const G4PhysicsTable* tDEDX, 192 const G4PhysicsTable* tDEDX, 191 const G4PhysicsTable* tRange, 193 const G4PhysicsTable* tRange, 192 const G4PhysicsTable* tInverseRange, 194 const G4PhysicsTable* tInverseRange, 193 const G4PhysicsTable* tLabTime, 195 const G4PhysicsTable* tLabTime, 194 const G4PhysicsTable* tProperTime, 196 const G4PhysicsTable* tProperTime, 195 G4double lowestKineticEnergy, 197 G4double lowestKineticEnergy, 196 G4double highestKineticEnergy, 198 G4double highestKineticEnergy, 197 G4double massRatio, 199 G4double massRatio, 198 G4int NumberOfBins); 200 G4int NumberOfBins); 199 201 200 public: 202 public: 201 typedef const G4ParticleDefinition* K; 203 typedef const G4ParticleDefinition* K; 202 204 203 private: 205 private: 204 206 205 static void CPRWarning(); 207 static void CPRWarning(); 206 static void ParticleHaveNoLoss(const G4Parti 208 static void ParticleHaveNoLoss(const G4ParticleDefinition* aParticle, 207 const G4Strin 209 const G4String&); 208 210 209 /* 211 /* 210 typedef std::map<K,G4EnergyLossTablesHelper, 212 typedef std::map<K,G4EnergyLossTablesHelper,std::less<K> > helper_map; 211 static G4ThreadLocal helper_map *dict; 213 static G4ThreadLocal helper_map *dict; 212 214 213 static G4EnergyLossTablesHelper GetTables(co 215 static G4EnergyLossTablesHelper GetTables(const G4ParticleDefinition* p); 214 216 215 static G4ThreadLocal G4EnergyLossTablesHelpe 217 static G4ThreadLocal G4EnergyLossTablesHelper *t; 216 static G4ThreadLocal G4EnergyLossTablesHelpe 218 static G4ThreadLocal G4EnergyLossTablesHelper *null_loss; 217 static G4ThreadLocal G4ParticleDefinition* l 219 static G4ThreadLocal G4ParticleDefinition* lastParticle ; 218 static G4ThreadLocal G4double QQPositron ; 220 static G4ThreadLocal G4double QQPositron ; 219 static G4ThreadLocal G4double Chargesquare ; 221 static G4ThreadLocal G4double Chargesquare ; 220 static G4ThreadLocal G4int oldIndex ; 222 static G4ThreadLocal G4int oldIndex ; 221 static G4ThreadLocal G4double rmin,rmax,Thig 223 static G4ThreadLocal G4double rmin,rmax,Thigh ; 222 static G4ThreadLocal G4int let_counter; 224 static G4ThreadLocal G4int let_counter; 223 static G4ThreadLocal G4int let_max_num_warn 225 static G4ThreadLocal G4int let_max_num_warnings; 224 static G4ThreadLocal G4bool first_loss; 226 static G4ThreadLocal G4bool first_loss; 225 */ 227 */ 226 using helper_map = std::map<K, G4EnergyLossT << 228 typedef std::map<K,G4EnergyLossTablesHelper,std::less<K> > helper_map; 227 static helper_map *dict; 229 static helper_map *dict; 228 230 229 static G4EnergyLossTablesHelper GetTables(co 231 static G4EnergyLossTablesHelper GetTables(const G4ParticleDefinition* p); 230 232 231 static G4EnergyLossTablesHelper *t; 233 static G4EnergyLossTablesHelper *t; 232 static G4EnergyLossTablesHelper *null_loss; 234 static G4EnergyLossTablesHelper *null_loss; 233 static G4ParticleDefinition* lastParticle ; 235 static G4ParticleDefinition* lastParticle ; 234 static G4double QQPositron ; 236 static G4double QQPositron ; 235 static G4double Chargesquare ; 237 static G4double Chargesquare ; 236 static G4int oldIndex ; 238 static G4int oldIndex ; 237 static G4double rmin,rmax,Thigh ; 239 static G4double rmin,rmax,Thigh ; 238 static G4int let_counter; 240 static G4int let_counter; 239 static G4int let_max_num_warnings; 241 static G4int let_max_num_warnings; 240 static G4bool first_loss; 242 static G4bool first_loss; 241 243 242 }; 244 }; 243 245 244 //....oooOO0OOooo........oooOO0OOooo........oo 246 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 245 247 246 #endif 248 #endif 247 249