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