Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4LogicalVolume.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26// G4LogicalVolume
27//
28// Class description:
29//
30// Represents a leaf node or unpositioned subtree in the geometry hierarchy.
31// Logical volumes are named, and may have daughters ascribed to them.
32// They are responsible for retrieval of the physical and tracking attributes
33// of the physical volume that it represents: solid, material, magnetic field,
34// and optionally, user limits, sensitive detectors, regions, biasing weights.
35//
36// Get and Set functionality is provided for all attributes, but note that
37// most set functions should not be used when the geometry is `closed'.
38// As a further development, `Guard' checks can be added to ensure
39// only legal operations at tracking time.
40//
41// On construction, solid, material and name must be specified.
42//
43// Daughters are ascribed and managed by means of a simple
44// GetNoDaughters,Get/SetDaughter(n),AddDaughter interface.
45//
46// Smart voxels as used for tracking optimisation. They're also an attribute.
47//
48// Logical volumes self register to the logical volume Store on construction,
49// and deregister on destruction.
50//
51// NOTE: This class is currently *NOT* subclassed, since not meant to
52// act as a base class. Therefore, the destructor is NOT virtual.
53//
54// Data members:
55//
56// std::vector<G4VPhysicalVolume*> fDaughters
57// - Vector of daughters. Given initial size of 0.
58// G4FieldManager* fFieldManager
59// - Pointer (possibly 0) to (magnetic or other) field manager object.
60// G4Material* fMaterial
61// - Pointer to material at this node.
62// G4String fName
63// - Name of logical volume.
64// G4VSensitiveDetector *fSensitiveDetector
65// - Pointer (possibly 0) to `Hit' object.
66// G4VSolid* fSolid
67// - Pointer to solid.
68// G4UserLimits* fUserLimits
69// - Pointer (possibly 0) to user Step limit object for this node.
70// G4SmartVoxelHeader* fVoxel
71// - Pointer (possibly 0) to optimisation info objects.
72// G4bool fOptimise
73// - Flag to identify if optimisation should be applied or not.
74// G4bool fRootRegion
75// - Flag to identify if the logical volume is a root region.
76// G4double fSmartless
77// - Quality for optimisation, average number of voxels to be spent
78// per content.
79// const G4VisAttributes* fVisAttributes
80// - Pointer (possibly 0) to visualization attributes.
81// G4Region* fRegion
82// - Pointer to the cuts region (if any)
83// G4MaterialCutsCouple* fCutsCouple
84// - Pointer (possibly 0) to associated production cuts.
85// G4double fBiasWeight
86// - Weight used in the event biasing technique.
87//
88// Following data members has been moved to G4Region - M.Asai (Aug/18/2005)
89// G4FastSimulationManager* fFastSimulationManager
90// - Pointer (possibly 0) to G4FastSimulationManager object.
91// G4bool fIsEnvelope
92// - Flags if the Logical Volume is an envelope for a FastSimulationManager.
93
94// 15.01.13 G.Cosmo, A.Dotti: Modified for thread-safety for MT
95// 12.11.04 G.Cosmo: Added GetMass() method for computing mass of the tree
96// 24.09.02 G.Cosmo: Added flags and accessors for region cuts handling
97// 17.05.02 G.Cosmo: Added IsToOptimise() method and related flag
98// 18.04.01 G.Cosmo: Migrated to STL vector
99// 12.02.99 S.Giani: Added user defined optimisation quality
100// 09.11.98 M.Verderi, J.Apostolakis: Added BiasWeight member and accessors
101// 10.20.97 P.M.DeFreitas, J.Apostolakis: Added pointer to a FastSimulation
102// 11.07.95 P.Kent: Initial version
103// ------------------------------------------------------------------------
104#ifndef G4LOGICALVOLUME_HH
105#define G4LOGICALVOLUME_HH 1
106
107#include <vector>
108#include <memory>
109
110#include "G4Types.hh"
111#include "G4Region.hh" // Required by inline methods
112#include "G4VPhysicalVolume.hh" // Need operator == for vector fdaughters
113#include "G4GeomSplitter.hh" // Needed for MT RW data splitting
114#include "G4Threading.hh"
115
116// Forward declarations
117//
118class G4FieldManager;
119class G4Material;
121class G4VSolid;
122class G4UserLimits;
126class G4VisAttributes;
127
129{
130 // Encapsulates the fields associated to the class
131 // G4LogicalVolume that may not be read-only.
132
133 public:
134
135 G4LVData();
137 {
138 fSolid = nullptr;
139 fSensitiveDetector = nullptr;
140 fFieldManager = nullptr;
141 fMaterial = nullptr;
142 fMass = 0.0;
143 fCutsCouple = nullptr;
144 }
145
146 public:
147
148 G4VSolid* fSolid = nullptr;
149 // Pointer to solid.
151 // Pointer to sensitive detector.
153 // Pointer (possibly nullptr) to (magnetic or other) field manager object.
155 // Pointer to material at this node.
157 // Mass of the logical volume tree.
159 // Pointer (possibly nullptr) to associated production cuts.
160};
161
162// The type G4LVManager is introduced to encapsulate the methods used by
163// both the master thread and worker threads to allocate memory space for
164// the fields encapsulated by the class G4LVData. When each thread
165// initializes the value for these fields, it refers to them using a macro
166// definition defined below. For every G4LogicalVolume instance, there is
167// a corresponding G4LVData instance. All G4LVData instances are organized
168// by the class G4LVManager as an array.
169// The field "int instanceID" is added to the class G4LogicalVolume.
170// The value of this field in each G4LogicalVolume instance is the subscript
171// of the corresponding G4LVData instance.
172// In order to use the class G4LVManager, we add a static member in the class
173// G4LogicalVolume as follows: "static G4LVManager subInstanceManager".
174// For the master thread, the array for G4LVData instances grows dynamically
175// along with G4LogicalVolume instances are created. For each worker thread,
176// it copies the array of G4LVData instances from the master thread.
177// In addition, it invokes a method similiar to the constructor explicitly
178// to achieve the partial effect for each instance in the array.
179//
181
183{
184 public:
185
187 G4Material* pMaterial,
188 const G4String& name,
189 G4FieldManager* pFieldMgr = nullptr,
190 G4VSensitiveDetector* pSDetector = nullptr,
191 G4UserLimits* pULimits = nullptr,
192 G4bool optimise = true);
193 // Constructor. The solid and material pointer must be non null.
194 // The parameters for field, detector and user limits are optional.
195 // The volume also enters itself into the logical volume Store.
196 // Optimisation of the geometry (voxelisation) for the volume
197 // hierarchy is applied by default. For parameterised volumes in
198 // the hierarchy, optimisation is -always- applied.
199
200 virtual ~G4LogicalVolume();
201 // Destructor. Removes the logical volume from the logical volume Store.
202 // This class is NOT meant to act as base class, except for exceptional
203 // circumstances of extended types used in the kernel.
204
207 // Copy-constructor and assignment operator not allowed.
208
209 inline const G4String& GetName() const;
210 void SetName(const G4String& pName);
211 // Returns and sets the name of the logical volume.
212
213 inline std::size_t GetNoDaughters() const;
214 // Returns the number of daughters (0 to n).
215 inline G4VPhysicalVolume* GetDaughter(const std::size_t i) const;
216 // Returns the ith daughter. Note numbering starts from 0,
217 // and no bounds checking is performed.
219 // Adds the volume p as a daughter of the current logical volume.
220 inline G4bool IsDaughter(const G4VPhysicalVolume* p) const;
221 // Returns true if the volume p is a daughter of the current
222 // logical volume.
223 G4bool IsAncestor(const G4VPhysicalVolume* p) const;
224 // Returns true if the volume p is part of the hierarchy of
225 // volumes established by the current logical volume. Scans
226 // recursively the volume tree.
227 void RemoveDaughter(const G4VPhysicalVolume* p);
228 // Removes the volume p from the List of daughter of the current
229 // logical volume.
230 void ClearDaughters();
231 // Clears the list of daughters. Used by the phys-volume store when
232 // the geometry tree is cleared, since modified at run-time.
234 // Returns the total number of physical volumes (replicated or placed)
235 // in the tree represented by the current logical volume.
237 // Characterise the daughters of this logical volume.
239 // Used by CharacteriseDaughters().
240
241 G4VSolid* GetSolid() const;
242 void SetSolid(G4VSolid* pSolid);
243 // Gets and sets the current solid.
244
245 G4Material* GetMaterial() const;
246 void SetMaterial(G4Material* pMaterial);
247 // Gets and sets the current material.
248 void UpdateMaterial(G4Material* pMaterial);
249 // Sets material and corresponding MaterialCutsCouple.
250 // This method is invoked by G4Navigator while it is navigating through
251 // material parameterization.
252 G4double GetMass(G4bool forced = false, G4bool propagate = true,
253 G4Material* parMaterial = nullptr);
254 // Returns the mass of the logical volume tree computed from the
255 // estimated geometrical volume of each solid and material associated
256 // to the logical volume and (by default) to its daughters.
257 // NOTE: the computation may require a considerable amount of time,
258 // depending from the complexity of the geometry tree.
259 // The returned value is cached and can be used for successive
260 // calls (default), unless recomputation is forced by providing
261 // 'true' for the boolean argument in input. Computation should
262 // be forced if the geometry setup has changed after the previous
263 // call. By setting the 'propagate' boolean flag to 'false' the
264 // method returns the mass of the present logical volume only
265 // (subtracted for the volume occupied by the daughter volumes).
266 // An optional argument to specify a material is also provided.
267 void ResetMass();
268 // Ensure that cached value of Mass is invalidated - due to change in
269 // state, e.g. change of size of Solid, change of type of solid,
270 // or the addition/deletion of a daughter volume.
271
273 // Gets current FieldManager.
274 void SetFieldManager(G4FieldManager* pFieldMgr, G4bool forceToAllDaughters);
275 // Sets FieldManager and propagates it:
276 // i) only to daughters with G4FieldManager = nullptr
277 // if forceToAllDaughters=false
278 // ii) to all daughters
279 // if forceToAllDaughters=true
280
282 // Gets current SensitiveDetector.
284 // Sets SensitiveDetector (can be nullptr).
285
287 inline void SetUserLimits(G4UserLimits *pULimits);
288 // Gets and sets current UserLimits.
289
291 inline void SetVoxelHeader(G4SmartVoxelHeader *pVoxel);
292 // Gets and sets current VoxelHeader.
293
294 inline G4double GetSmartless() const;
295 inline void SetSmartless(G4double s);
296 // Gets and sets user defined optimisation quality.
297
298 inline G4bool IsToOptimise() const;
299 // Replies if geometry optimisation (voxelisation) is to be
300 // applied for this volume hierarchy.
301 inline void SetOptimisation(G4bool optim);
302 // Specifies if to apply or not geometry optimisation to this
303 // volume hierarchy. Note that for parameterised volumes in the
304 // hierarchy, optimisation is always applied.
305
306 inline G4bool IsRootRegion() const;
307 // Replies if the logical volume represents a root region or not.
308 inline void SetRegionRootFlag(G4bool rreg);
309 // Sets/unsets the volume as a root region for cuts.
310 inline G4bool IsRegion() const;
311 // Replies if the logical volume is part of a cuts region or not.
312 inline void SetRegion(G4Region* reg);
313 // Sets/unsets the volume as cuts region.
314 inline G4Region* GetRegion() const;
315 // Return the region to which the volume belongs, if any.
316 inline void PropagateRegion();
317 // Propagates region pointer to daughters.
318
321 // Accessors for production cuts.
322
324 // Equality defined by address only.
325 // Returns true if objects are at same address, else false.
326
328 void SetVisAttributes (const G4VisAttributes* pVA);
329 void SetVisAttributes (const G4VisAttributes& VA);
330 // Gets and sets visualization attributes.
331 // Arguments are converted to shared_ptr.
332
334 // Gets current FastSimulationManager pointer if exists, otherwise null.
335
336 inline void SetBiasWeight (G4double w);
337 inline G4double GetBiasWeight() const;
338 // Sets and gets bias weight.
339
340 public:
341
342 G4LogicalVolume(__void__&);
343 // Fake default constructor for usage restricted to direct object
344 // persistency for clients requiring preallocation of memory for
345 // persistifiable objects.
346
347 virtual G4bool IsExtended() const;
348 // Return true if it is not a base-class object.
349
351 // Gets current FieldManager for the master thread.
353 // Gets current SensitiveDetector for the master thread.
354 inline G4VSolid* GetMasterSolid() const;
355 // Gets current Solid for the master thread.
356
357 inline G4int GetInstanceID() const;
358 // Returns the instance ID.
359
360 static const G4LVManager& GetSubInstanceManager();
361 // Returns the private data instance manager.
362
363 static void Clean();
364 // Clear memory allocated by sub-instance manager.
365
366 inline void Lock();
367 // Set lock identifier for final deletion of entity.
368
369 void InitialiseWorker(G4LogicalVolume* ptrMasterObject,
370 G4VSolid* pSolid, G4VSensitiveDetector* pSDetector);
371 // This method is similar to the constructor. It is used by each worker
372 // thread to achieve the partial effect as that of the master thread.
373
374 void TerminateWorker(G4LogicalVolume* ptrMasterObject);
375 // This method is similar to the destructor. It is used by each worker
376 // thread to achieve the partial effect as that of the master thread.
377
379 // Set the FieldManager - only at this level (do not push down hierarchy)
380
381 static G4VSolid* GetSolid(G4LVData& instLVdata) ; // const;
382 static void SetSolid(G4LVData& instLVdata, G4VSolid* pSolid);
383 // Optimised Methods - passing thread instance of worker data
384
386 // Change the type of the daughters volume to be of type atype.
387 // Meant for the user who wants to use the external navigator for
388 // the contents of a volume.
389 // Returns: success (true) or failure (false).
390
391 private:
392
393 using G4PhysicalVolumeList = std::vector<G4VPhysicalVolume *>;
394
395 G4GEOM_DLL static G4LVManager subInstanceManager;
396 // This new field helps to use the class G4LVManager introduced above.
397
398 G4PhysicalVolumeList fDaughters;
399 // Vector of daughters. Given initial size of 0.
400 G4String fName;
401 // Name of logical volume.
402 G4UserLimits* fUserLimits = nullptr;
403 // Pointer (possibly nullptr) to user Step limit object for this node.
404 G4SmartVoxelHeader* fVoxel = nullptr;
405 // Pointer (possibly nullptr) to optimisation info objects.
406 G4double fSmartless = 2.0;
407 // Quality for optimisation, average number of voxels to be spent
408 // per content.
409 G4Region* fRegion = nullptr;
410 // Pointer to the cuts region (if any).
411 G4double fBiasWeight = 1.0;
412 // Weight used in the event biasing technique.
413 std::shared_ptr<const G4VisAttributes> fVisAttributes;
414 // Pointer to visualization attributes.
415
416 // Shadow of master pointers.
417 // Each worker thread can access this field from the master thread
418 // through these pointers.
419 //
420 G4VSolid* fSolid = nullptr;
421 G4VSensitiveDetector* fSensitiveDetector = nullptr;
422 G4FieldManager* fFieldManager = nullptr;
423 G4LVData* lvdata = nullptr; // For use of object persistency
424
425 G4int instanceID;
426 // This new field is used as instance ID.
427 EVolume fDaughtersVolumeType;
428 // Are contents of volume placements, replica, parameterised or external?
429 G4bool fOptimise = true;
430 // Flag to identify if optimisation should be applied or not.
431 G4bool fRootRegion = false;
432 // Flag to identify if the logical volume is a root region.
433 G4bool fLock = false;
434 // Flag to identify if entity is locked for final deletion.
435};
436
437#include "G4LogicalVolume.icc"
438
439#endif
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
void initialize()
G4double fMass
G4VSensitiveDetector * fSensitiveDetector
G4MaterialCutsCouple * fCutsCouple
G4FieldManager * fFieldManager
G4Material * fMaterial
G4VSolid * fSolid
G4bool operator==(const G4LogicalVolume &lv) const
void SetSmartless(G4double s)
G4VSolid * GetSolid() const
G4double GetMass(G4bool forced=false, G4bool propagate=true, G4Material *parMaterial=nullptr)
EVolume CharacteriseDaughters() const
const G4VisAttributes * GetVisAttributes() const
void SetName(const G4String &pName)
G4bool IsAncestor(const G4VPhysicalVolume *p) const
void SetFieldManager(G4FieldManager *pFieldMgr, G4bool forceToAllDaughters)
void AddDaughter(G4VPhysicalVolume *p)
G4VSensitiveDetector * GetMasterSensitiveDetector() const
void SetUserLimits(G4UserLimits *pULimits)
void SetVoxelHeader(G4SmartVoxelHeader *pVoxel)
G4VSensitiveDetector * GetSensitiveDetector() const
void TerminateWorker(G4LogicalVolume *ptrMasterObject)
std::size_t GetNoDaughters() const
virtual ~G4LogicalVolume()
void RemoveDaughter(const G4VPhysicalVolume *p)
void SetRegionRootFlag(G4bool rreg)
void SetRegion(G4Region *reg)
EVolume DeduceDaughtersType() const
virtual G4bool IsExtended() const
G4FastSimulationManager * GetFastSimulationManager() const
G4bool ChangeDaughtersType(EVolume atype)
static const G4LVManager & GetSubInstanceManager()
G4bool IsRootRegion() const
G4Region * GetRegion() const
G4double GetBiasWeight() const
static void Clean()
G4bool IsRegion() const
G4LogicalVolume(const G4LogicalVolume &)=delete
G4double GetSmartless() const
G4bool IsDaughter(const G4VPhysicalVolume *p) const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const std::size_t i) const
void PropagateRegion()
G4LogicalVolume & operator=(const G4LogicalVolume &)=delete
G4UserLimits * GetUserLimits() const
void InitialiseWorker(G4LogicalVolume *ptrMasterObject, G4VSolid *pSolid, G4VSensitiveDetector *pSDetector)
G4FieldManager * GetMasterFieldManager() const
G4FieldManager * GetFieldManager() const
void SetVisAttributes(const G4VisAttributes *pVA)
G4int TotalVolumeEntities() const
void SetBiasWeight(G4double w)
G4int GetInstanceID() const
G4bool IsToOptimise() const
const G4String & GetName() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
G4VSolid * GetMasterSolid() const
void AssignFieldManager(G4FieldManager *fldMgr)
void SetMaterial(G4Material *pMaterial)
void SetSolid(G4VSolid *pSolid)
G4SmartVoxelHeader * GetVoxelHeader() const
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
void SetOptimisation(G4bool optim)
void SetMaterialCutsCouple(G4MaterialCutsCouple *cuts)
void UpdateMaterial(G4Material *pMaterial)
EVolume
Definition: geomdefs.hh:83
#define G4GEOM_DLL
Definition: geomwdefs.hh:44