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 // $Id: G4EmModelManager.hh 95657 2016-02-17 13:03:36Z gcosmo $ 26 // 27 // 27 // ------------------------------------------- 28 // ------------------------------------------------------------------- 28 // 29 // 29 // GEANT4 Class header file 30 // GEANT4 Class header file 30 // 31 // 31 // File name: G4EmModelManager 32 // File name: G4EmModelManager 32 // 33 // 33 // Author: Vladimir Ivanchenko 34 // Author: Vladimir Ivanchenko 34 // 35 // 35 // Creation date: 07.05.2002 36 // Creation date: 07.05.2002 36 // 37 // 37 // Modifications: 38 // Modifications: 38 // 39 // 39 // 03-12-02 V.Ivanchenko fix a bug in model se 40 // 03-12-02 V.Ivanchenko fix a bug in model selection 40 // 20-01-03 Migrade to cut per region (V.Ivanc 41 // 20-01-03 Migrade to cut per region (V.Ivanchenko) 41 // 27-01-03 Make models region aware (V.Ivanch 42 // 27-01-03 Make models region aware (V.Ivanchenko) 42 // 13-02-03 The set of models is defined for r 43 // 13-02-03 The set of models is defined for region (V.Ivanchenko) 43 // 26-03-03 Add GetDEDXDispersion (V.Ivanchenk 44 // 26-03-03 Add GetDEDXDispersion (V.Ivanchenko) 44 // 13-04-03 Add startFromNull (V.Ivanchenko) 45 // 13-04-03 Add startFromNull (V.Ivanchenko) 45 // 13-05-03 Add calculation of precise range ( 46 // 13-05-03 Add calculation of precise range (V.Ivanchenko) 46 // 21-07-03 Add UpdateEmModel method (V.Ivanch 47 // 21-07-03 Add UpdateEmModel method (V.Ivanchenko) 47 // 03-11-03 Substitute STL vector for G4Region 48 // 03-11-03 Substitute STL vector for G4RegionModels (V.Ivanchenko) 48 // 11-04-05 Remove access to fluctuation model 49 // 11-04-05 Remove access to fluctuation models (V.Ivanchenko) 49 // 10-01-06 PreciseRange -> CSDARange (V.Ivant 50 // 10-01-06 PreciseRange -> CSDARange (V.Ivantchenko) 50 // 20-01-06 Introduce G4EmTableType and reduci 51 // 20-01-06 Introduce G4EmTableType and reducing number of methods (VI) 51 // 13-05-06 Add GetModel by index method (VI) 52 // 13-05-06 Add GetModel by index method (VI) 52 // 15-03-07 Add maxCutInRange (V.Ivanchenko) 53 // 15-03-07 Add maxCutInRange (V.Ivanchenko) 53 // 08-04-08 Simplify Select method for only on 54 // 08-04-08 Simplify Select method for only one G4RegionModel (VI) 54 // 03-08-09 Removed unused members and simplif 55 // 03-08-09 Removed unused members and simplify model search if only one 55 // model is used (VI) 56 // model is used (VI) 56 // 14-07-11 Use pointer to the vector of cuts 57 // 14-07-11 Use pointer to the vector of cuts and not local copy (VI) 57 // 58 // 58 // Class Description: 59 // Class Description: 59 // 60 // 60 // It is the unified energy loss process it ca 61 // It is the unified energy loss process it calculates the continuous 61 // energy loss for charged particles using a s 62 // energy loss for charged particles using a set of Energy Loss 62 // models valid for different energy regions. 63 // models valid for different energy regions. There are a possibility 63 // to create and access to dE/dx and range tab 64 // to create and access to dE/dx and range tables, or to calculate 64 // that information on fly. 65 // that information on fly. 65 66 66 // ------------------------------------------- 67 // ------------------------------------------------------------------- 67 // 68 // 68 69 >> 70 69 #ifndef G4EmModelManager_h 71 #ifndef G4EmModelManager_h 70 #define G4EmModelManager_h 1 72 #define G4EmModelManager_h 1 71 73 72 //....oooOO0OOooo........oooOO0OOooo........oo 74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 73 75 74 #include "globals.hh" 76 #include "globals.hh" 75 #include "G4DataVector.hh" 77 #include "G4DataVector.hh" 76 #include "G4EmTableType.hh" 78 #include "G4EmTableType.hh" 77 #include "G4EmProcessSubType.hh" 79 #include "G4EmProcessSubType.hh" 78 #include "G4Region.hh" 80 #include "G4Region.hh" 79 81 80 #include "G4VEmModel.hh" << 81 #include "G4VEmFluctuationModel.hh" << 82 #include "G4DynamicParticle.hh" << 83 #include <iostream> << 84 << 85 class G4RegionModels 82 class G4RegionModels 86 { 83 { 87 84 88 friend class G4EmModelManager; 85 friend class G4EmModelManager; 89 86 >> 87 public: >> 88 90 private: 89 private: 91 90 92 G4RegionModels(G4int nMod, std::vector<G4int 91 G4RegionModels(G4int nMod, std::vector<G4int>& indx, 93 G4DataVector& lowE, const G4R 92 G4DataVector& lowE, const G4Region* reg); 94 93 95 ~G4RegionModels(); 94 ~G4RegionModels(); 96 95 97 inline G4int SelectIndex(G4double e) const { 96 inline G4int SelectIndex(G4double e) const { 98 G4int idx = 0; 97 G4int idx = 0; 99 if (nModelsForRegion>1) { 98 if (nModelsForRegion>1) { 100 idx = nModelsForRegion; 99 idx = nModelsForRegion; 101 // Loop checking, 03-Aug-2015, Vladimir 100 // Loop checking, 03-Aug-2015, Vladimir Ivanchenko 102 do {--idx;} while (idx > 0 && e <= lowKi 101 do {--idx;} while (idx > 0 && e <= lowKineticEnergy[idx]); 103 } 102 } 104 return theListOfModelIndexes[idx]; 103 return theListOfModelIndexes[idx]; 105 }; 104 }; 106 105 107 inline G4int ModelIndex(G4int n) const { 106 inline G4int ModelIndex(G4int n) const { 108 return theListOfModelIndexes[n]; 107 return theListOfModelIndexes[n]; 109 }; 108 }; 110 109 111 inline G4int NumberOfModels() const { 110 inline G4int NumberOfModels() const { 112 return nModelsForRegion; 111 return nModelsForRegion; 113 }; 112 }; 114 113 115 inline G4double LowEdgeEnergy(G4int n) const 114 inline G4double LowEdgeEnergy(G4int n) const { 116 return lowKineticEnergy[n]; 115 return lowKineticEnergy[n]; 117 }; 116 }; 118 117 119 inline const G4Region* Region() const { 118 inline const G4Region* Region() const { 120 return theRegion; 119 return theRegion; 121 }; 120 }; 122 121 123 G4RegionModels(G4RegionModels &) = delete; 122 G4RegionModels(G4RegionModels &) = delete; 124 G4RegionModels & operator=(const G4RegionMod 123 G4RegionModels & operator=(const G4RegionModels &right) = delete; 125 124 126 const G4Region* theRegion; 125 const G4Region* theRegion; 127 G4int nModelsForRegion; 126 G4int nModelsForRegion; 128 G4int* theListOfModelIndexes; 127 G4int* theListOfModelIndexes; 129 G4double* lowKineticEnergy; 128 G4double* lowKineticEnergy; 130 129 131 }; 130 }; 132 131 133 //....oooOO0OOooo........oooOO0OOooo........oo << 132 #include "G4VEmModel.hh" >> 133 #include "G4VEmFluctuationModel.hh" >> 134 #include "G4DynamicParticle.hh" 134 135 135 class G4Region; 136 class G4Region; 136 class G4ParticleDefinition; 137 class G4ParticleDefinition; 137 class G4PhysicsVector; 138 class G4PhysicsVector; 138 class G4MaterialCutsCouple; 139 class G4MaterialCutsCouple; 139 140 140 //....oooOO0OOooo........oooOO0OOooo........oo 141 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 141 142 142 class G4EmModelManager 143 class G4EmModelManager 143 { 144 { 144 public: 145 public: 145 146 146 G4EmModelManager(); 147 G4EmModelManager(); 147 148 148 ~G4EmModelManager(); 149 ~G4EmModelManager(); 149 150 150 void Clear(); 151 void Clear(); 151 152 152 const G4DataVector* Initialise(const G4Parti 153 const G4DataVector* Initialise(const G4ParticleDefinition* part, 153 const G4Parti 154 const G4ParticleDefinition* secPart, >> 155 G4double minSubRange, 154 G4int verb); 156 G4int verb); 155 157 156 void FillDEDXVector(G4PhysicsVector*, const 158 void FillDEDXVector(G4PhysicsVector*, const G4MaterialCutsCouple*, 157 G4EmTableType t = fRestr 159 G4EmTableType t = fRestricted); 158 160 159 void FillLambdaVector(G4PhysicsVector*, cons 161 void FillLambdaVector(G4PhysicsVector*, const G4MaterialCutsCouple*, 160 G4bool startFromNull = 162 G4bool startFromNull = true, 161 G4EmTableType t = fRes 163 G4EmTableType t = fRestricted); 162 164 163 void AddEmModel(G4int, G4VEmModel*, G4VEmFlu << 165 void AddEmModel(G4int, G4VEmModel*, G4VEmFluctuationModel*, const G4Region*); 164 const G4Region* r); << 166 >> 167 void UpdateEmModel(const G4String& model_name, G4double emin, G4double emax); 165 168 166 // Get model pointer from the model list 169 // Get model pointer from the model list 167 G4VEmModel* GetModel(G4int idx, G4bool ver = << 170 G4VEmModel* GetModel(G4int idx, G4bool ver = false); 168 171 169 // Get model pointer from the model list for 172 // Get model pointer from the model list for a given material cuts couple 170 // no check on material cuts couple index 173 // no check on material cuts couple index 171 G4VEmModel* GetRegionModel(G4int idx, std::s << 174 G4VEmModel* GetRegionModel(G4int idx, size_t index_couple); 172 175 173 // total number of models for material cut c 176 // total number of models for material cut couples 174 // no check on material cuts couple index 177 // no check on material cuts couple index 175 G4int NumberOfRegionModels(std::size_t index << 178 G4int NumberOfRegionModels(size_t index_couple) const; 176 179 177 // Automatic documentation 180 // Automatic documentation 178 void DumpModelList(std::ostream& out, G4int << 181 void DumpModelList(G4int verb); 179 182 180 // Select model for given material cuts coup 183 // Select model for given material cuts couple index 181 inline G4VEmModel* SelectModel(G4double ener << 184 inline G4VEmModel* SelectModel(G4double& energy, size_t& index); 182 185 183 // Access to cuts 186 // Access to cuts 184 inline const G4DataVector* Cuts() const; 187 inline const G4DataVector* Cuts() const; >> 188 inline const G4DataVector* SubCutoff() const; 185 189 186 // Set flag of fluorescence 190 // Set flag of fluorescence 187 inline void SetFluoFlag(G4bool val); 191 inline void SetFluoFlag(G4bool val); 188 192 189 // total number of models 193 // total number of models 190 inline G4int NumberOfModels() const; 194 inline G4int NumberOfModels() const; 191 195 >> 196 private: >> 197 >> 198 inline G4double ComputeDEDX(G4VEmModel* model, >> 199 const G4MaterialCutsCouple*, >> 200 G4double kinEnergy, >> 201 G4double cutEnergy, >> 202 G4double minEnergy); >> 203 192 // hide assignment operator 204 // hide assignment operator >> 205 193 G4EmModelManager(G4EmModelManager &) = delet 206 G4EmModelManager(G4EmModelManager &) = delete; 194 G4EmModelManager & operator=(const G4EmModel 207 G4EmModelManager & operator=(const G4EmModelManager &right) = delete; 195 208 196 private: << 209 // ===================================================================== 197 << 198 const G4ParticleDefinition* particle = nullp << 199 const G4DataVector* theCuts = nullpt << 200 G4DataVector* theCutsNew = nul << 201 210 202 // may be changed in run time << 211 private: 203 G4RegionModels* currRegionModel << 204 G4VEmModel* currModel = null << 205 212 206 G4int nEmModels = 0; << 213 const G4DataVector* theCuts; 207 G4int nRegions = 0; << 214 G4DataVector* theCutsNew; >> 215 G4DataVector* theSubCuts; >> 216 >> 217 std::vector<G4VEmModel*> models; >> 218 std::vector<G4VEmFluctuationModel*> flucModels; >> 219 std::vector<const G4Region*> regions; >> 220 std::vector<G4int> orderOfModels; >> 221 std::vector<G4int> isUsed; 208 222 209 G4int verboseLevel = 0 << 223 G4int nEmModels; 210 G4bool severalModels = << 224 G4int nRegions; 211 G4bool fluoFlag = false << 212 << 213 std::vector<G4VEmModel*> models; << 214 std::vector<G4VEmFluctuationModel*> flucMod << 215 std::vector<const G4Region*> regions << 216 std::vector<G4int> orderOf << 217 std::vector<G4int> isUsed; << 218 225 219 std::vector<G4int> idxOfRegionMod 226 std::vector<G4int> idxOfRegionModels; 220 std::vector<G4RegionModels*> setOfRegionMod 227 std::vector<G4RegionModels*> setOfRegionModels; >> 228 >> 229 G4double maxSubCutInRange; >> 230 >> 231 const G4ParticleDefinition* particle; >> 232 >> 233 G4int verboseLevel; >> 234 G4bool severalModels; >> 235 G4bool fluoFlag; >> 236 >> 237 // may be changed in run time >> 238 G4RegionModels* currRegionModel; >> 239 G4VEmModel* currModel; 221 }; 240 }; 222 241 223 //....oooOO0OOooo........oooOO0OOooo........oo 242 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 224 //....oooOO0OOooo........oooOO0OOooo........oo 243 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 225 244 226 inline << 245 inline G4VEmModel* G4EmModelManager::SelectModel(G4double& kinEnergy, 227 G4VEmModel* G4EmModelManager::SelectModel(G4do << 246 size_t& index) 228 { 247 { 229 if(severalModels) { 248 if(severalModels) { 230 if(nRegions > 1) { 249 if(nRegions > 1) { 231 currRegionModel = setOfRegionModels[idxO 250 currRegionModel = setOfRegionModels[idxOfRegionModels[index]]; 232 } 251 } 233 currModel = models[currRegionModel->Select 252 currModel = models[currRegionModel->SelectIndex(kinEnergy)]; 234 } 253 } 235 return currModel; 254 return currModel; 236 } 255 } 237 256 238 //....oooOO0OOooo........oooOO0OOooo........oo 257 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 239 258 240 inline const G4DataVector* G4EmModelManager::C 259 inline const G4DataVector* G4EmModelManager::Cuts() const 241 { 260 { 242 return theCuts; 261 return theCuts; 243 } 262 } 244 263 245 //....oooOO0OOooo........oooOO0OOooo........oo 264 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 246 265 >> 266 inline const G4DataVector* G4EmModelManager::SubCutoff() const >> 267 { >> 268 return theSubCuts; >> 269 } >> 270 >> 271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 272 247 inline void G4EmModelManager::SetFluoFlag(G4bo 273 inline void G4EmModelManager::SetFluoFlag(G4bool val) 248 { 274 { 249 fluoFlag = val; 275 fluoFlag = val; 250 } 276 } 251 277 252 //....oooOO0OOooo........oooOO0OOooo........oo 278 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 253 279 254 inline G4int G4EmModelManager::NumberOfModels( 280 inline G4int G4EmModelManager::NumberOfModels() const 255 { 281 { 256 return nEmModels; 282 return nEmModels; >> 283 } >> 284 >> 285 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 286 >> 287 inline G4double >> 288 G4EmModelManager::ComputeDEDX(G4VEmModel* model, >> 289 const G4MaterialCutsCouple* couple, >> 290 G4double e, >> 291 G4double cut, >> 292 G4double emin) >> 293 { >> 294 G4double dedx = 0.0; >> 295 if(model && cut > emin) { >> 296 dedx = model->ComputeDEDX(couple,particle,e,cut); >> 297 if(emin > 0.0) {dedx -= model->ComputeDEDX(couple,particle,e,emin);} >> 298 } >> 299 return dedx; 257 } 300 } 258 301 259 //....oooOO0OOooo........oooOO0OOooo........oo 302 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 260 303 261 #endif 304 #endif 262 305 263 306