Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // G4Region 27 // 28 // Class description: 29 // 30 // Defines a region or a group of regions in t 31 // setup, sharing properties associated to mat 32 // cuts which may affect or bias specific phys 33 34 // 18.09.02, G.Cosmo - Initial version 35 // ------------------------------------------- 36 #ifndef G4REGION_HH 37 #define G4REGION_HH 1 38 39 #include <vector> 40 #include <map> 41 #include <algorithm> 42 43 #include "G4Types.hh" 44 #include "G4String.hh" 45 #include "G4GeomSplitter.hh" 46 47 class G4ProductionCuts; 48 class G4LogicalVolume; 49 class G4Material; 50 class G4VUserRegionInformation; 51 class G4MaterialCutsCouple; 52 class G4UserLimits; 53 class G4FieldManager; 54 class G4FastSimulationManager; 55 class G4VPhysicalVolume; 56 class G4UserSteppingAction; 57 58 class G4RegionData 59 { 60 // Encapsulates the fields associated to the 61 // G4Region that may not be read-only. 62 63 public: 64 65 void initialize() 66 { 67 fFastSimulationManager = nullptr; 68 fRegionalSteppingAction = nullptr; 69 } 70 71 G4FastSimulationManager* fFastSimulationMa 72 G4UserSteppingAction* fRegionalSteppingAct 73 }; 74 75 // The type G4RegionManager is introduced to e 76 // both the master thread and worker threads t 77 // the fields encapsulated by the class G4Regi 78 // initializes the value for these fields, it 79 // definition defined below. For every G4Regio 80 // corresponding G4RegionData instance. All G4 81 // organized by the class G4RegionManager as a 82 // The field "int instanceID" is added to the 83 // The value of this field in each G4Region in 84 // of the corresponding G4RegionData instance. 85 // In order to use the class G4RegionManager, 86 // the class G4Region as follows: "static G4Re 87 // For the master thread, the array for G4Regi 88 // dynamically along with G4Region instances a 89 // thread, it copies the array of G4RegionData 90 // In addition, it invokes a method similiar t 91 // to achieve the partial effect for each inst 92 // 93 using G4RegionManager = G4GeomSplitter<G4Regio 94 95 class G4Region 96 { 97 public: 98 99 G4Region(const G4String& name); 100 virtual ~G4Region(); 101 102 G4Region(const G4Region&) = delete; 103 G4Region& operator=(const G4Region&) = del 104 // Copy constructor and assignment opera 105 106 inline G4bool operator==(const G4Region& r 107 // Equality defined by address only. 108 109 void AddRootLogicalVolume(G4LogicalVolume* 110 void RemoveRootLogicalVolume(G4LogicalVolu 111 // Add/remove root logical volumes and s 112 // daughters flags as regions. They also 113 // materials list for the region. Flag f 114 // always enabled by default. Search in 115 // when adding, assuming the user guaran 116 // NOT already inserted, in which case s 117 // achieved in very complex flat geometr 118 119 void SetName(const G4String& name); 120 inline const G4String& GetName() const; 121 // Set/get region's name. 122 123 inline void RegionModified(G4bool flag); 124 inline G4bool IsModified() const; 125 // Accessors to flag identifying if a re 126 // (and still cuts needs to be computed) 127 128 inline void SetProductionCuts(G4Production 129 inline G4ProductionCuts* GetProductionCuts 130 131 inline std::vector<G4LogicalVolume*>::iter 132 GetRootLogicalVolumeIterator(); 133 inline std::vector<G4Material*>::const_ite 134 GetMaterialIterator() const; 135 // Return iterators to lists of root log 136 137 inline std::size_t GetNumberOfMaterials() 138 inline std::size_t GetNumberOfRootVolumes( 139 // Return the number of elements in the 140 // root logical volumes. 141 142 void UpdateMaterialList(); 143 // Clears material list and recomputes i 144 // each root logical volume in the regio 145 146 void ClearMaterialList(); 147 // Clears the material list. 148 149 void ScanVolumeTree(G4LogicalVolume* lv, G 150 // Scans recursively the 'lv' logical vo 151 // and places all materials in the list 152 153 inline void SetUserInformation(G4VUserRegi 154 inline G4VUserRegionInformation* GetUserIn 155 // Set and Get methods for user informat 156 157 inline void SetUserLimits(G4UserLimits* ul 158 inline G4UserLimits* GetUserLimits() const 159 // Set and Get methods for userL-limits 160 // Once user-limits are set, it will pro 161 162 inline void ClearMap(); 163 // Reset G4MaterialCoupleMap 164 165 inline void RegisterMaterialCouplePair(G4M 166 G4M 167 // Method invoked by G4ProductionCutsTab 168 169 inline G4MaterialCutsCouple* FindCouple(G4 170 // Find a G4MaterialCutsCouple which cor 171 // in this region. 172 173 void SetFastSimulationManager(G4FastSimula 174 G4FastSimulationManager* GetFastSimulation 175 // Set and Get methods for G4FastSimulat 176 // The root logical volume that has the 177 // becomes an envelope of fast simulatio 178 179 void ClearFastSimulationManager(); 180 // Set G4FastSimulationManager pointer t 181 // if it exists. Otherwise set to null. 182 183 inline void SetFieldManager(G4FieldManager 184 inline G4FieldManager* GetFieldManager() c 185 // Set and Get methods for G4FieldManage 186 // The region with assigned field-manage 187 // geometrical area associated with it; 188 // to local fields eventually set to log 189 190 inline G4VPhysicalVolume* GetWorldPhysical 191 // Get method for the world physical vol 192 // belongs to. A valid pointer will be a 193 // through G4RegionStore when the geomet 194 // pointer may be incorrect at PreInit a 195 // is null at the proper state, this par 196 // to any world (maybe not assigned to a 197 198 void SetWorld(G4VPhysicalVolume* wp); 199 // Set the world physical volume if this 200 // If wp is null, reset the pointer. 201 202 G4bool BelongsTo(G4VPhysicalVolume* thePhy 203 // Returns whether this region belongs t 204 // (recursively scanned to the bottom of 205 206 G4Region* GetParentRegion(G4bool& unique) 207 // Returns a region that contains this r 208 // Flag 'unique' is true if there is onl 209 // the current region. 210 211 void SetRegionalSteppingAction(G4UserStepp 212 G4UserSteppingAction* GetRegionalSteppingA 213 // Set/Get method of the regional user s 214 215 public: 216 217 G4Region(__void__&); 218 // Fake default constructor for usage re 219 // persistency for clients requiring pre 220 // persistifiable objects. 221 222 inline G4int GetInstanceID() const; 223 // Returns the instance ID. 224 225 static const G4RegionManager& GetSubInstan 226 // Returns the private data instance man 227 228 static void Clean(); 229 // Clear memory allocated by sub-instanc 230 231 inline void UsedInMassGeometry(G4bool val 232 inline void UsedInParallelGeometry(G4bool 233 inline G4bool IsInMassGeometry() const; 234 inline G4bool IsInParallelGeometry() const 235 // Utility methods to identify if region 236 // geometry for tracking or a parallel g 237 238 private: 239 240 inline void AddMaterial (G4Material* aMate 241 // Searchs the specified material in the 242 // if not present adds it. 243 244 private: 245 246 using G4RootLVList = std::vector<G4Logical 247 using G4MaterialList = std::vector<G4Mater 248 using G4MaterialCouplePair = std::pair<G4M 249 using G4MaterialCoupleMap = std::map<G4Mat 250 251 G4String fName; 252 253 G4RootLVList fRootVolumes; 254 G4MaterialList fMaterials; 255 G4MaterialCoupleMap fMaterialCoupleMap; 256 257 G4bool fRegionMod = true; 258 G4ProductionCuts* fCut = nullptr; 259 260 G4VUserRegionInformation* fUserInfo = null 261 G4UserLimits* fUserLimits = nullptr; 262 G4FieldManager* fFieldManager = nullptr; 263 264 G4VPhysicalVolume* fWorldPhys = nullptr; 265 266 G4bool fInMassGeometry = false; 267 G4bool fInParallelGeometry = false; 268 269 G4int instanceID; 270 // This field is used as instance ID. 271 G4GEOM_DLL static G4RegionManager subInsta 272 // This field helps to use the class G4R 273 }; 274 275 #include "G4Region.icc" 276 277 #endif 278