Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // 26 // 23 // 27 // ------------------------------------------- 24 // ------------------------------------------------------------------- 28 // 25 // 29 // GEANT4 Class header file 26 // GEANT4 Class header file 30 // 27 // 31 // File name: G4EmModelManager << 32 // 28 // 33 // Author: Vladimir Ivanchenko << 29 // File name: G4EmModelManager 34 // 30 // >> 31 // Author: Vladimir Ivanchenko >> 32 // 35 // Creation date: 07.05.2002 33 // Creation date: 07.05.2002 36 // 34 // 37 // Modifications: << 35 // Modifications: 03.12.2002 V.Ivanchenko fix a bug in model selection 38 // 36 // 39 // 03-12-02 V.Ivanchenko fix a bug in model se << 37 // Class Description: 40 // 20-01-03 Migrade to cut per region (V.Ivanc << 41 // 27-01-03 Make models region aware (V.Ivanch << 42 // 13-02-03 The set of models is defined for r << 43 // 26-03-03 Add GetDEDXDispersion (V.Ivanchenk << 44 // 13-04-03 Add startFromNull (V.Ivanchenko) << 45 // 13-05-03 Add calculation of precise range ( << 46 // 21-07-03 Add UpdateEmModel method (V.Ivanch << 47 // 03-11-03 Substitute STL vector for G4Region << 48 // 11-04-05 Remove access to fluctuation model << 49 // 10-01-06 PreciseRange -> CSDARange (V.Ivant << 50 // 20-01-06 Introduce G4EmTableType and reduci << 51 // 13-05-06 Add GetModel by index method (VI) << 52 // 15-03-07 Add maxCutInRange (V.Ivanchenko) << 53 // 08-04-08 Simplify Select method for only on << 54 // 03-08-09 Removed unused members and simplif << 55 // model is used (VI) << 56 // 14-07-11 Use pointer to the vector of cuts << 57 // 38 // 58 // Class Description: << 39 // It is the unified energy loss process it calculates the continuous 59 // << 60 // It is the unified energy loss process it ca << 61 // energy loss for charged particles using a s 40 // energy loss for charged particles using a set of Energy Loss 62 // models valid for different energy regions. 41 // models valid for different energy regions. There are a possibility 63 // to create and access to dE/dx and range tab 42 // to create and access to dE/dx and range tables, or to calculate 64 // that information on fly. 43 // that information on fly. 65 44 66 // ------------------------------------------- 45 // ------------------------------------------------------------------- 67 // 46 // 68 47 >> 48 69 #ifndef G4EmModelManager_h 49 #ifndef G4EmModelManager_h 70 #define G4EmModelManager_h 1 50 #define G4EmModelManager_h 1 71 51 72 //....oooOO0OOooo........oooOO0OOooo........oo << 73 << 74 #include "globals.hh" 52 #include "globals.hh" 75 #include "G4DataVector.hh" << 53 #include "G4Material.hh" 76 #include "G4EmTableType.hh" << 54 #include "G4Track.hh" 77 #include "G4EmProcessSubType.hh" << 55 #include "G4PhysicsTable.hh" 78 #include "G4Region.hh" << 56 #include "G4PhysicsVector.hh" 79 << 80 #include "G4VEmModel.hh" << 81 #include "G4VEmFluctuationModel.hh" << 82 #include "G4DynamicParticle.hh" << 83 #include <iostream> << 84 << 85 class G4RegionModels << 86 { << 87 << 88 friend class G4EmModelManager; << 89 << 90 private: << 91 << 92 G4RegionModels(G4int nMod, std::vector<G4int << 93 G4DataVector& lowE, const G4R << 94 << 95 ~G4RegionModels(); << 96 << 97 inline G4int SelectIndex(G4double e) const { << 98 G4int idx = 0; << 99 if (nModelsForRegion>1) { << 100 idx = nModelsForRegion; << 101 // Loop checking, 03-Aug-2015, Vladimir << 102 do {--idx;} while (idx > 0 && e <= lowKi << 103 } << 104 return theListOfModelIndexes[idx]; << 105 }; << 106 << 107 inline G4int ModelIndex(G4int n) const { << 108 return theListOfModelIndexes[n]; << 109 }; << 110 << 111 inline G4int NumberOfModels() const { << 112 return nModelsForRegion; << 113 }; << 114 << 115 inline G4double LowEdgeEnergy(G4int n) const << 116 return lowKineticEnergy[n]; << 117 }; << 118 << 119 inline const G4Region* Region() const { << 120 return theRegion; << 121 }; << 122 << 123 G4RegionModels(G4RegionModels &) = delete; << 124 G4RegionModels & operator=(const G4RegionMod << 125 << 126 const G4Region* theRegion; << 127 G4int nModelsForRegion; << 128 G4int* theListOfModelIndexes; << 129 G4double* lowKineticEnergy; << 130 << 131 }; << 132 57 133 //....oooOO0OOooo........oooOO0OOooo........oo << 58 class G4Step; 134 << 135 class G4Region; << 136 class G4ParticleDefinition; 59 class G4ParticleDefinition; 137 class G4PhysicsVector; << 60 class G4VEmModel; 138 class G4MaterialCutsCouple; << 61 class G4DataVector; >> 62 class G4VParticleChange; 139 63 140 //....oooOO0OOooo........oooOO0OOooo........oo 64 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 141 << 65 142 class G4EmModelManager << 66 class G4EmModelManager 143 { 67 { 144 public: 68 public: 145 69 146 G4EmModelManager(); 70 G4EmModelManager(); 147 71 148 ~G4EmModelManager(); << 72 ~G4EmModelManager(); 149 73 150 void Clear(); 74 void Clear(); 151 75 152 const G4DataVector* Initialise(const G4Parti << 76 const G4DataVector* Initialise(const G4ParticleDefinition*, 153 const G4Parti << 77 const G4ParticleDefinition*, 154 G4int verb); << 78 G4double, 155 << 79 G4int); 156 void FillDEDXVector(G4PhysicsVector*, const << 157 G4EmTableType t = fRestr << 158 80 159 void FillLambdaVector(G4PhysicsVector*, cons << 81 const G4DataVector* Cuts() const; 160 G4bool startFromNull = << 161 G4EmTableType t = fRes << 162 82 163 void AddEmModel(G4int, G4VEmModel*, G4VEmFlu << 83 const G4DataVector* SubCutoff() const; 164 const G4Region* r); << 165 84 166 // Get model pointer from the model list << 85 void FillDEDXVector(G4PhysicsVector*, const G4Material*); 167 G4VEmModel* GetModel(G4int idx, G4bool ver = << 168 86 169 // Get model pointer from the model list for << 87 void FillLambdaVector(G4PhysicsVector*, const G4Material*); 170 // no check on material cuts couple index << 171 G4VEmModel* GetRegionModel(G4int idx, std::s << 172 88 173 // total number of models for material cut c << 89 void FillSubLambdaVector(G4PhysicsVector*, const G4Material*); 174 // no check on material cuts couple index << 175 G4int NumberOfRegionModels(std::size_t index << 176 90 177 // Automatic documentation << 91 G4VEmModel* SelectModel(G4double energy); 178 void DumpModelList(std::ostream& out, G4int << 179 92 180 // Select model for given material cuts coup << 93 void AddEmModel(G4VEmModel*, G4int); 181 inline G4VEmModel* SelectModel(G4double ener << 182 94 183 // Access to cuts << 95 private: 184 inline const G4DataVector* Cuts() const; << 185 96 186 // Set flag of fluorescence << 97 // hide assignment operator 187 inline void SetFluoFlag(G4bool val); << 188 98 189 // total number of models << 99 G4EmModelManager(G4EmModelManager &); 190 inline G4int NumberOfModels() const; << 100 G4EmModelManager & operator=(const G4EmModelManager &right); 191 101 192 // hide assignment operator << 102 // ===================================================================== 193 G4EmModelManager(G4EmModelManager &) = delet << 194 G4EmModelManager & operator=(const G4EmModel << 195 103 196 private: 104 private: 197 105 198 const G4ParticleDefinition* particle = nullp << 106 G4DataVector theCuts; 199 const G4DataVector* theCuts = nullpt << 107 G4DataVector theSubCuts; 200 G4DataVector* theCutsNew = nul << 108 201 << 109 G4VEmModel* emModels[5]; 202 // may be changed in run time << 110 G4int nEmModels; 203 G4RegionModels* currRegionModel << 111 G4int nmax; 204 G4VEmModel* currModel = null << 112 205 << 113 G4int order[5]; 206 G4int nEmModels = 0; << 114 G4double upperEkin[5]; 207 G4int nRegions = 0; << 115 G4bool orderIsChanged; 208 << 116 209 G4int verboseLevel = 0 << 117 G4double minSubRange; 210 G4bool severalModels = << 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 118 219 std::vector<G4int> idxOfRegionMod << 119 const G4ParticleDefinition* particle; 220 std::vector<G4RegionModels*> setOfRegionMod << 120 const G4ParticleDefinition* secondaryParticle; >> 121 >> 122 G4int verboseLevel; >> 123 >> 124 // cash >> 125 G4VEmModel* currentModel; 221 }; 126 }; 222 127 223 //....oooOO0OOooo........oooOO0OOooo........oo 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 224 //....oooOO0OOooo........oooOO0OOooo........oo 129 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 225 130 226 inline << 131 inline G4VEmModel* G4EmModelManager::SelectModel(G4double energy) 227 G4VEmModel* G4EmModelManager::SelectModel(G4do << 228 { 132 { 229 if(severalModels) { << 133 if(nEmModels == 4 && energy > upperEkin[2]) { 230 if(nRegions > 1) { << 134 currentModel = emModels[3]; 231 currRegionModel = setOfRegionModels[idxO << 135 } else if(nEmModels >= 3 && energy > upperEkin[1]) { 232 } << 136 currentModel = emModels[2]; 233 currModel = models[currRegionModel->Select << 137 } else if(nEmModels >= 2 && energy > upperEkin[0]) { 234 } << 138 currentModel = emModels[1]; 235 return currModel; << 139 } else { >> 140 currentModel = emModels[0]; >> 141 } >> 142 return currentModel; 236 } 143 } 237 144 238 //....oooOO0OOooo........oooOO0OOooo........oo 145 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 239 146 240 inline const G4DataVector* G4EmModelManager::C 147 inline const G4DataVector* G4EmModelManager::Cuts() const 241 { 148 { 242 return theCuts; << 149 return &theCuts; 243 } << 244 << 245 //....oooOO0OOooo........oooOO0OOooo........oo << 246 << 247 inline void G4EmModelManager::SetFluoFlag(G4bo << 248 { << 249 fluoFlag = val; << 250 } 150 } 251 151 252 //....oooOO0OOooo........oooOO0OOooo........oo 152 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 253 153 254 inline G4int G4EmModelManager::NumberOfModels( << 154 inline const G4DataVector* G4EmModelManager::SubCutoff() const 255 { 155 { 256 return nEmModels; << 156 return &theSubCuts; 257 } 157 } 258 158 259 //....oooOO0OOooo........oooOO0OOooo........oo 159 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 260 160 261 #endif 161 #endif >> 162 >> 163 262 164 263 165