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 // G4ProductionCutsTable 26 // G4ProductionCutsTable 27 // 27 // 28 // Class description: 28 // Class description: 29 // 29 // 30 // G4ProductionCutsTable is a singleton class 30 // G4ProductionCutsTable is a singleton class for a table of 31 // G4ProductionCuts objects. This class manage 31 // G4ProductionCuts objects. This class manages tables of production 32 // cuts and energy cuts for each particle type 32 // cuts and energy cuts for each particle type. 33 33 34 // Author: M.Asai, 5 October 2002 - First impl 34 // Author: M.Asai, 5 October 2002 - First implementation 35 // Modifications: H.Kurashige, 2004-2008 35 // Modifications: H.Kurashige, 2004-2008 36 // ------------------------------------------- 36 // -------------------------------------------------------------------- 37 #ifndef G4ProductionCutsTable_hh 37 #ifndef G4ProductionCutsTable_hh 38 #define G4ProductionCutsTable_hh 1 38 #define G4ProductionCutsTable_hh 1 39 39 40 #include <cmath> 40 #include <cmath> 41 #include <vector> 41 #include <vector> 42 42 43 #include "globals.hh" 43 #include "globals.hh" 44 #include "G4ios.hh" 44 #include "G4ios.hh" 45 #include "G4MaterialCutsCouple.hh" 45 #include "G4MaterialCutsCouple.hh" 46 #include "G4MCCIndexConversionTable.hh" 46 #include "G4MCCIndexConversionTable.hh" 47 #include "G4Region.hh" 47 #include "G4Region.hh" 48 48 49 class G4RegionStore; 49 class G4RegionStore; 50 class G4VRangeToEnergyConverter; 50 class G4VRangeToEnergyConverter; 51 class G4LogicalVolume; 51 class G4LogicalVolume; 52 class G4VPhysicalVolume; 52 class G4VPhysicalVolume; 53 class G4ProductionCuts; 53 class G4ProductionCuts; 54 class G4ProductionCutsTableMessenger; 54 class G4ProductionCutsTableMessenger; 55 55 56 class G4ProductionCutsTable 56 class G4ProductionCutsTable 57 { 57 { 58 public: 58 public: 59 59 60 static G4ProductionCutsTable* GetProductio 60 static G4ProductionCutsTable* GetProductionCutsTable(); 61 // This static method returns the single 61 // This static method returns the singleton pointer of this class object. 62 // At first invocation, the singleton ob 62 // At first invocation, the singleton object is instantiated 63 63 64 G4ProductionCutsTable(const G4ProductionCu 64 G4ProductionCutsTable(const G4ProductionCutsTable&) = delete; 65 G4ProductionCutsTable& operator=(const G4P 65 G4ProductionCutsTable& operator=(const G4ProductionCutsTable&) = delete; 66 66 67 virtual ~G4ProductionCutsTable(); 67 virtual ~G4ProductionCutsTable(); 68 68 69 void CreateCoupleTables(); 69 void CreateCoupleTables(); 70 // Creates material cuts couples table a 70 // Creates material cuts couples table and allocate the other tables 71 71 72 void UpdateCoupleTable(G4VPhysicalVolume* 72 void UpdateCoupleTable(G4VPhysicalVolume* currentWorld); 73 // Triggers an update of the table of G4 73 // Triggers an update of the table of G4ProductionCuts objects 74 74 75 void SetEnergyRange(G4double lowedge, G4do 75 void SetEnergyRange(G4double lowedge, G4double highedge); 76 // Sets the limits of energy cuts for al 76 // Sets the limits of energy cuts for all particles 77 77 78 G4double GetLowEdgeEnergy() const; 78 G4double GetLowEdgeEnergy() const; 79 G4double GetHighEdgeEnergy() const; 79 G4double GetHighEdgeEnergy() const; 80 // Get the limits of energy cuts for all 80 // Get the limits of energy cuts for all particles 81 81 82 G4double GetMaxEnergyCut(); 82 G4double GetMaxEnergyCut(); 83 void SetMaxEnergyCut(G4double value); 83 void SetMaxEnergyCut(G4double value); 84 // Get/set max cut energy of RangeToEner 84 // Get/set max cut energy of RangeToEnergy converter 85 // for all particle types 85 // for all particle types 86 86 87 void DumpCouples() const; 87 void DumpCouples() const; 88 // Displays a list of registered couples 88 // Displays a list of registered couples 89 89 90 const G4MCCIndexConversionTable* GetMCCInd 90 const G4MCCIndexConversionTable* GetMCCIndexConversionTable() const; 91 // Gives the pointer to the MCCIndexConv 91 // Gives the pointer to the MCCIndexConversionTable 92 92 93 const std::vector<G4double>* GetRangeCutsV 93 const std::vector<G4double>* GetRangeCutsVector(std::size_t pcIdx) const; 94 const std::vector<G4double>* GetEnergyCuts 94 const std::vector<G4double>* GetEnergyCutsVector(std::size_t pcIdx) const; 95 95 96 std::size_t GetTableSize() const; 96 std::size_t GetTableSize() const; 97 // Returns the size of the couple table 97 // Returns the size of the couple table 98 98 99 const G4MaterialCutsCouple* GetMaterialCut 99 const G4MaterialCutsCouple* GetMaterialCutsCouple(G4int i) const; 100 // Returns the pointer to the couple 100 // Returns the pointer to the couple 101 101 102 const G4MaterialCutsCouple* GetMaterialCut 102 const G4MaterialCutsCouple* GetMaterialCutsCouple(const G4Material* aMat, 103 co 103 const G4ProductionCuts* aCut) const; 104 // Returns the pointer to the couple 104 // Returns the pointer to the couple 105 105 106 G4int GetCoupleIndex(const G4MaterialCutsC 106 G4int GetCoupleIndex(const G4MaterialCutsCouple* aCouple) const; 107 G4int GetCoupleIndex(const G4Material* aMa 107 G4int GetCoupleIndex(const G4Material* aMat, 108 const G4ProductionCut 108 const G4ProductionCuts* aCut) const; 109 // Return the index of the couple. 109 // Return the index of the couple. 110 // -1 is returned if index is not found 110 // -1 is returned if index is not found 111 111 112 G4bool IsModified() const; 112 G4bool IsModified() const; 113 // Returns TRUE if at least one producti 113 // Returns TRUE if at least one production cut value is modified 114 114 115 void PhysicsTableUpdated(); 115 void PhysicsTableUpdated(); 116 // Resets the status of IsModified(). Th 116 // Resets the status of IsModified(). This method must be exclusively 117 // used by the RunManager when physics t 117 // used by the RunManager when physics tables are built 118 118 119 G4ProductionCuts* GetDefaultProductionCuts 119 G4ProductionCuts* GetDefaultProductionCuts() const; 120 // Returns the default production cuts 120 // Returns the default production cuts 121 121 122 G4double ConvertRangeToEnergy(const G4Part 122 G4double ConvertRangeToEnergy(const G4ParticleDefinition* particle, 123 const G4Mate 123 const G4Material* material, 124 G4doub 124 G4double range); 125 // Gives energy corresponding to range v 125 // Gives energy corresponding to range value. 126 // -1 is returned if particle or materia 126 // -1 is returned if particle or material is not found 127 127 128 void ResetConverters(); 128 void ResetConverters(); 129 // Resets all range to energy converters 129 // Resets all range to energy converters 130 130 131 G4bool StoreCutsTable(const G4String& dire 131 G4bool StoreCutsTable(const G4String& directory, 132 G4bool ascii = false 132 G4bool ascii = false); 133 // Stores cuts and material information 133 // Stores cuts and material information in files under the 134 // the specified directory 134 // the specified directory 135 135 136 G4bool RetrieveCutsTable(const G4String& d 136 G4bool RetrieveCutsTable(const G4String& directory, 137 G4bool ascii = fa 137 G4bool ascii = false); 138 // Retrieve material cut couple informat 138 // Retrieve material cut couple information 139 // in files under the specified director 139 // in files under the specified directory 140 140 141 G4bool CheckForRetrieveCutsTable(const G4S 141 G4bool CheckForRetrieveCutsTable(const G4String& directory, 142 G4bool as 142 G4bool ascii = false); 143 // Checks stored material and cut values 143 // Checks stored material and cut values are consistent 144 // with the current detector setup 144 // with the current detector setup 145 145 146 G4double* GetRangeCutsDoubleVector(std::si 146 G4double* GetRangeCutsDoubleVector(std::size_t pcIdx) const; 147 G4double* GetEnergyCutsDoubleVector(std::s 147 G4double* GetEnergyCutsDoubleVector(std::size_t pcIdx) const; 148 // Methods for backward compatibility 148 // Methods for backward compatibility 149 149 150 void SetEnergyCutVector(const std::vector< 150 void SetEnergyCutVector(const std::vector<G4double>& cutE, std::size_t idx); 151 // User defined cut vectors (idx < 4) ra 151 // User defined cut vectors (idx < 4) range cut should be defined 152 // to avoid inconsistency in physics 152 // to avoid inconsistency in physics 153 153 154 void SetVerboseLevel(G4int value); 154 void SetVerboseLevel(G4int value); 155 G4int GetVerboseLevel() const; 155 G4int GetVerboseLevel() const; 156 // Control flag for output message 156 // Control flag for output message 157 // 0: Silent 157 // 0: Silent 158 // 1: Warning message 158 // 1: Warning message 159 // 2: More 159 // 2: More 160 160 161 protected: 161 protected: 162 162 163 G4ProductionCutsTable(); 163 G4ProductionCutsTable(); 164 164 165 virtual G4bool StoreMaterialInfo(const G4S 165 virtual G4bool StoreMaterialInfo(const G4String& directory, 166 G4bool as 166 G4bool ascii = false); 167 // Stores material information in files 167 // Stores material information in files under the specified directory 168 168 169 virtual G4bool CheckMaterialInfo(const G4S 169 virtual G4bool CheckMaterialInfo(const G4String& directory, 170 G4bool as 170 G4bool ascii = false); 171 // Checks stored material is consistent 171 // Checks stored material is consistent with the current detector setup 172 172 173 virtual G4bool StoreMaterialCutsCoupleInfo 173 virtual G4bool StoreMaterialCutsCoupleInfo(const G4String& directory, 174 174 G4bool ascii = false); 175 // Stores materialCutsCouple information 175 // Stores materialCutsCouple information in files under the 176 // specified directory 176 // specified directory 177 177 178 virtual G4bool CheckMaterialCutsCoupleInfo 178 virtual G4bool CheckMaterialCutsCoupleInfo(const G4String& directory, 179 179 G4bool ascii = false); 180 // Checks stored materialCutsCouple is c 180 // Checks stored materialCutsCouple is consistent with 181 // the current detector setup 181 // the current detector setup 182 182 183 virtual G4bool StoreCutsInfo(const G4Strin 183 virtual G4bool StoreCutsInfo(const G4String& directory, 184 G4bool ascii 184 G4bool ascii = false); 185 // Stores cut values information in file 185 // Stores cut values information in files under the specified directory 186 186 187 virtual G4bool RetrieveCutsInfo(const G4S 187 virtual G4bool RetrieveCutsInfo(const G4String& directory, 188 G4bool as 188 G4bool ascii = false); 189 // Retrieves cut values information in f 189 // Retrieves cut values information in files under the 190 // specified directory 190 // specified directory 191 191 192 private: 192 private: 193 193 194 void ScanAndSetCouple(G4LogicalVolume* aLV 194 void ScanAndSetCouple(G4LogicalVolume* aLV, 195 G4MaterialCutsCouple 195 G4MaterialCutsCouple* aCouple, 196 G4Region* aRegion); 196 G4Region* aRegion); 197 197 198 G4bool IsCoupleUsedInTheRegion(const G4Mat 198 G4bool IsCoupleUsedInTheRegion(const G4MaterialCutsCouple* aCouple, 199 const G4Reg 199 const G4Region* aRegion) const; 200 200 201 201 202 private: 202 private: 203 203 204 static G4ProductionCutsTable* fProductionC 204 static G4ProductionCutsTable* fProductionCutsTable; 205 205 206 std::vector<G4MaterialCutsCouple*> coupleT 206 std::vector<G4MaterialCutsCouple*> coupleTable; 207 std::vector<std::vector<G4double>*> rangeC 207 std::vector<std::vector<G4double>*> rangeCutTable; 208 std::vector<std::vector<G4double>*> energy 208 std::vector<std::vector<G4double>*> energyCutTable; 209 209 210 std::vector<G4double>* userEnergyCuts[4] = 210 std::vector<G4double>* userEnergyCuts[4] = {nullptr, nullptr, nullptr, nullptr}; 211 211 212 G4RegionStore* fG4RegionStore = nullptr; 212 G4RegionStore* fG4RegionStore = nullptr; 213 G4VRangeToEnergyConverter* converters[Numb 213 G4VRangeToEnergyConverter* converters[NumberOfG4CutIndex]; 214 214 215 G4ProductionCuts* defaultProductionCuts = 215 G4ProductionCuts* defaultProductionCuts = nullptr; 216 216 217 G4MCCIndexConversionTable mccConversionTab 217 G4MCCIndexConversionTable mccConversionTable; 218 218 219 // These two vectors are for backward comp 219 // These two vectors are for backward compatibility 220 G4double* rangeDoubleVector[NumberOfG4CutI 220 G4double* rangeDoubleVector[NumberOfG4CutIndex]; 221 G4double* energyDoubleVector[NumberOfG4Cut 221 G4double* energyDoubleVector[NumberOfG4CutIndex]; 222 222 223 enum { FixedStringLengthForStore = 32 }; 223 enum { FixedStringLengthForStore = 32 }; 224 224 225 G4ProductionCutsTableMessenger* fMessenger 225 G4ProductionCutsTableMessenger* fMessenger = nullptr; 226 G4int verboseLevel = 1; 226 G4int verboseLevel = 1; 227 G4bool firstUse = true; 227 G4bool firstUse = true; 228 }; 228 }; 229 229 230 // ------------------ 230 // ------------------ 231 // Inline methods 231 // Inline methods 232 // ------------------ 232 // ------------------ 233 233 234 inline 234 inline 235 const std::vector<G4double>* 235 const std::vector<G4double>* 236 G4ProductionCutsTable::GetRangeCutsVector(std: 236 G4ProductionCutsTable::GetRangeCutsVector(std::size_t pcIdx) const 237 { 237 { 238 return rangeCutTable[pcIdx]; 238 return rangeCutTable[pcIdx]; 239 } 239 } 240 240 241 inline 241 inline 242 const std::vector<G4double>* 242 const std::vector<G4double>* 243 G4ProductionCutsTable::GetEnergyCutsVector(std 243 G4ProductionCutsTable::GetEnergyCutsVector(std::size_t pcIdx) const 244 { 244 { 245 return energyCutTable[pcIdx]; 245 return energyCutTable[pcIdx]; 246 } 246 } 247 247 248 inline 248 inline 249 std::size_t G4ProductionCutsTable::GetTableSiz 249 std::size_t G4ProductionCutsTable::GetTableSize() const 250 { 250 { 251 return coupleTable.size(); 251 return coupleTable.size(); 252 } 252 } 253 253 254 inline 254 inline 255 const G4MaterialCutsCouple* 255 const G4MaterialCutsCouple* 256 G4ProductionCutsTable::GetMaterialCutsCouple(G 256 G4ProductionCutsTable::GetMaterialCutsCouple(G4int i) const 257 { 257 { 258 return coupleTable[std::size_t(i)]; 258 return coupleTable[std::size_t(i)]; 259 } 259 } 260 260 261 inline 261 inline 262 G4bool G4ProductionCutsTable::IsModified() con 262 G4bool G4ProductionCutsTable::IsModified() const 263 { 263 { 264 if(firstUse) return true; 264 if(firstUse) return true; 265 for(auto itr=coupleTable.cbegin(); itr!=coup 265 for(auto itr=coupleTable.cbegin(); itr!=coupleTable.cend(); ++itr) 266 { 266 { 267 if((*itr)->IsRecalcNeeded()) 267 if((*itr)->IsRecalcNeeded()) 268 { 268 { 269 return true; 269 return true; 270 } 270 } 271 } 271 } 272 return false; 272 return false; 273 } 273 } 274 274 275 inline 275 inline 276 void G4ProductionCutsTable::PhysicsTableUpdate 276 void G4ProductionCutsTable::PhysicsTableUpdated() 277 { 277 { 278 for(auto itr=coupleTable.cbegin(); itr!=coup 278 for(auto itr=coupleTable.cbegin(); itr!=coupleTable.cend(); ++itr) 279 { 279 { 280 (*itr)->PhysicsTableUpdated(); 280 (*itr)->PhysicsTableUpdated(); 281 } 281 } 282 } 282 } 283 283 284 inline 284 inline 285 G4double* 285 G4double* 286 G4ProductionCutsTable::GetRangeCutsDoubleVecto 286 G4ProductionCutsTable::GetRangeCutsDoubleVector(std::size_t pcIdx) const 287 { 287 { 288 return rangeDoubleVector[pcIdx]; 288 return rangeDoubleVector[pcIdx]; 289 } 289 } 290 290 291 inline 291 inline 292 G4double* 292 G4double* 293 G4ProductionCutsTable::GetEnergyCutsDoubleVect 293 G4ProductionCutsTable::GetEnergyCutsDoubleVector(std::size_t pcIdx) const 294 { 294 { 295 return energyDoubleVector[pcIdx]; 295 return energyDoubleVector[pcIdx]; 296 } 296 } 297 297 298 inline 298 inline 299 G4ProductionCuts* G4ProductionCutsTable::GetDe 299 G4ProductionCuts* G4ProductionCutsTable::GetDefaultProductionCuts() const 300 { 300 { 301 return defaultProductionCuts; 301 return defaultProductionCuts; 302 } 302 } 303 303 304 inline 304 inline 305 G4bool G4ProductionCutsTable::IsCoupleUsedInTh 305 G4bool G4ProductionCutsTable::IsCoupleUsedInTheRegion( 306 const G4Mater 306 const G4MaterialCutsCouple* aCouple, 307 const G4Regio 307 const G4Region* aRegion) const 308 { 308 { 309 G4ProductionCuts* fProductionCut = aRegion-> 309 G4ProductionCuts* fProductionCut = aRegion->GetProductionCuts(); 310 auto mItr = aRegion->GetMaterialIterator(); 310 auto mItr = aRegion->GetMaterialIterator(); 311 std::size_t nMaterial = aRegion->GetNumberOf 311 std::size_t nMaterial = aRegion->GetNumberOfMaterials(); 312 for(std::size_t iMate=0;iMate<nMaterial; ++i 312 for(std::size_t iMate=0;iMate<nMaterial; ++iMate, ++mItr) 313 { 313 { 314 if(aCouple->GetMaterial()==(*mItr) && 314 if(aCouple->GetMaterial()==(*mItr) && 315 aCouple->GetProductionCuts()==fProducti 315 aCouple->GetProductionCuts()==fProductionCut) 316 { 316 { 317 return true; 317 return true; 318 } 318 } 319 } 319 } 320 return false; 320 return false; 321 } 321 } 322 322 323 inline 323 inline 324 const G4MaterialCutsCouple* 324 const G4MaterialCutsCouple* 325 G4ProductionCutsTable::GetMaterialCutsCouple(c 325 G4ProductionCutsTable::GetMaterialCutsCouple(const G4Material* aMat, 326 c 326 const G4ProductionCuts* aCut) const 327 { 327 { 328 for(auto cItr=coupleTable.cbegin(); cItr!=co 328 for(auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr) 329 { 329 { 330 if((*cItr)->GetMaterial()!=aMat) continue; 330 if((*cItr)->GetMaterial()!=aMat) continue; 331 if((*cItr)->GetProductionCuts()==aCut) ret 331 if((*cItr)->GetProductionCuts()==aCut) return (*cItr); 332 } 332 } 333 return nullptr; 333 return nullptr; 334 } 334 } 335 335 336 inline 336 inline 337 G4int 337 G4int 338 G4ProductionCutsTable::GetCoupleIndex(const G4 338 G4ProductionCutsTable::GetCoupleIndex(const G4MaterialCutsCouple* aCouple) const 339 { 339 { 340 G4int idx = 0; 340 G4int idx = 0; 341 for(auto cItr=coupleTable.cbegin(); cItr!=co 341 for(auto cItr=coupleTable.cbegin(); cItr!=coupleTable.cend(); ++cItr) 342 { 342 { 343 if((*cItr)==aCouple) return idx; 343 if((*cItr)==aCouple) return idx; 344 ++idx; 344 ++idx; 345 } 345 } 346 return -1; 346 return -1; 347 } 347 } 348 348 349 inline 349 inline 350 G4int G4ProductionCutsTable::GetCoupleIndex(co 350 G4int G4ProductionCutsTable::GetCoupleIndex(const G4Material* aMat, 351 co 351 const G4ProductionCuts* aCut) const 352 { 352 { 353 const G4MaterialCutsCouple* aCouple = GetMat 353 const G4MaterialCutsCouple* aCouple = GetMaterialCutsCouple(aMat,aCut); 354 return GetCoupleIndex(aCouple); 354 return GetCoupleIndex(aCouple); 355 } 355 } 356 356 357 inline 357 inline 358 G4int G4ProductionCutsTable::GetVerboseLevel() 358 G4int G4ProductionCutsTable::GetVerboseLevel() const 359 { 359 { 360 return verboseLevel; 360 return verboseLevel; 361 } 361 } 362 362 363 inline 363 inline 364 const G4MCCIndexConversionTable* 364 const G4MCCIndexConversionTable* 365 G4ProductionCutsTable::GetMCCIndexConversionTa 365 G4ProductionCutsTable::GetMCCIndexConversionTable() const 366 { 366 { 367 return &mccConversionTable; 367 return &mccConversionTable; 368 } 368 } 369 369 370 #endif 370 #endif 371 371