58#define G4MT_solid ((subInstanceManager.offset[instanceID]).fSolid)
59#define G4MT_sdetector ((subInstanceManager.offset[instanceID]).fSensitiveDetector)
60#define G4MT_fmanager ((subInstanceManager.offset[instanceID]).fFieldManager)
61#define G4MT_material ((subInstanceManager.offset[instanceID]).fMaterial)
62#define G4MT_mass ((subInstanceManager.offset[instanceID]).fMass)
63#define G4MT_ccouple ((subInstanceManager.offset[instanceID]).fCutsCouple)
64#define G4MT_instance (subInstanceManager.offset[instanceID])
85 fSensitiveDetector = pSDetector;
86 fFieldManager = pFieldMgr;
88 instanceID = subInstanceManager.CreateSubInstance();
103 lvdata->fSolid = pSolid;
104 lvdata->fMaterial = pMaterial;
120 instanceID = subInstanceManager.CreateSubInstance();
140 if (!fLock && fRootRegion)
142 fRegion->RemoveRootLogicalVolume(
this,
true);
173 subInstanceManager.SlaveCopySubInstanceArray();
181#ifdef CLONE_FIELD_MGR
204 subInstanceManager.FreeSlave();
228 return subInstanceManager;
270 while ( (NoDaughters--)>0 )
274 if ( forceAllDaughters || (DaughterLogVol->
GetFieldManager() ==
nullptr) )
291 if( fDaughters.empty() )
293 fDaughtersVolumeType = daughterType;
303 std::ostringstream message;
304 message <<
"ERROR - Attempt to place a volume in a mother volume"
306 <<
" already containing a replicated volume." <<
G4endl
307 <<
" A volume can either contain several placements" <<
G4endl
308 <<
" or a unique replica or parameterised volume !" <<
G4endl
310 <<
" Placing volume: " << pNewDaughter->
GetName()
312 G4Exception(
"G4LogicalVolume::AddDaughter()",
"GeomMgt0002",
314 "Replica or parameterised volume must be the only daughter!");
320 if( daughterType != fDaughtersVolumeType )
322 std::ostringstream message;
323 message <<
"ERROR - Attempt to place a volume in a mother volume"
325 <<
" already containing a different type of volume." <<
G4endl
326 <<
" A volume can either contain" <<
G4endl
327 <<
" - one or more placements, OR" <<
G4endl
328 <<
" - one or more 'external' type physical volumes." <<
G4endl
330 <<
" Volume being placed: " << pNewDaughter->
GetName()
332 G4Exception(
"G4LogicalVolume::AddDaughter()",
"GeomMgt0002",
334 "Cannot mix placements and external physical volumes !");
342 fDaughters.push_back(pNewDaughter);
353 if( (
G4MT_fmanager !=
nullptr ) && (pDaughterFieldManager ==
nullptr) )
357 if (fRegion !=
nullptr)
360 fRegion->RegionModified(
true);
370 for (
auto i=fDaughters.cbegin(); i!=fDaughters.cend(); ++i )
378 if (fRegion !=
nullptr)
380 fRegion->RegionModified(
true);
391 fDaughters.erase(fDaughters.cbegin(), fDaughters.cend());
392 if (fRegion !=
nullptr)
394 fRegion->RegionModified(
true);
419 return this->
GetSolid( subInstanceManager.offset[instanceID] );
435 instLVdata.
fSolid = pSolid;
436 instLVdata.
fMass = 0.0;
465 if (fRegion !=
nullptr) {
G4MT_ccouple = fRegion->FindCouple(pMaterial); }
519 for (
const auto & daughter : fDaughters)
521 isDaughter = daughter->GetLogicalVolume()->IsAncestor(aVolume);
522 if (isDaughter) {
break; }
538 for (
auto physDaughter : fDaughters)
540 vols += physDaughter->GetMultiplicity()
541 *physDaughter->GetLogicalVolume()->TotalVolumeEntities();
577 if (logMaterial ==
nullptr)
579 std::ostringstream message;
580 message <<
"No material associated to the logical volume: "
581 << fName <<
" !" <<
G4endl
582 <<
"Sorry, cannot compute the mass ...";
583 G4Exception(
"G4LogicalVolume::GetMass()",
"GeomMgt0002",
589 std::ostringstream message;
590 message <<
"No solid is associated to the logical volume: "
591 << fName <<
" !" <<
G4endl
592 <<
"Sorry, cannot compute the mass ...";
593 G4Exception(
"G4LogicalVolume::GetMass()",
"GeomMgt0002",
605 for (
const auto & physDaughter : fDaughters)
616 for (
auto i=0; i<physDaughter->GetMultiplicity(); ++i)
619 if (physParam !=
nullptr)
621 daughterSolid = physParam->
ComputeSolid(i, physDaughter);
627 daughterSolid = logDaughter->
GetSolid();
638 massSum += logDaughter->
GetMass(
true,
true, daughterMaterial);
663 fDaughtersVolumeType = aType;
669 works = (expectedVType == aType);
672 fDaughtersVolumeType = aType;
685 fVisAttributes = std::make_shared<const G4VisAttributes>(VA);
695 fVisAttributes = std::shared_ptr<const G4VisAttributes>(pVA,[](
const G4VisAttributes*){});
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4GeomSplitter< G4LVData > G4LVManager
G4bool IsReplicated() const override
G4FieldManager is a manager (store) for a pointer to the Field subclass that describes the field of a...
G4LVData encapsulates the fields associated to the class G4LogicalVolume that may not be read-only.
static void DeRegister(G4LogicalVolume *pVolume)
void SetMapValid(G4bool val)
static void Register(G4LogicalVolume *pVolume)
static G4LogicalVolumeStore * GetInstance()
G4VSolid * GetSolid() const
G4double GetMass(G4bool forced=false, G4bool propagate=true, G4Material *parMaterial=nullptr)
void SetName(const G4String &pName)
G4bool IsAncestor(const G4VPhysicalVolume *p) const
void SetFieldManager(G4FieldManager *pFieldMgr, G4bool forceToAllDaughters)
void AddDaughter(G4VPhysicalVolume *p)
void SetUserLimits(G4UserLimits *pULimits)
G4VSensitiveDetector * GetSensitiveDetector() const
void TerminateWorker(G4LogicalVolume *ptrMasterObject)
std::size_t GetNoDaughters() const
virtual ~G4LogicalVolume()
void RemoveDaughter(const G4VPhysicalVolume *p)
EVolume DeduceDaughtersType() const
virtual G4bool IsExtended() const
G4bool ChangeDaughtersType(EVolume atype)
static const G4LVManager & GetSubInstanceManager()
G4LogicalVolume(G4VSolid *pSolid, G4Material *pMaterial, const G4String &name, G4FieldManager *pFieldMgr=nullptr, G4VSensitiveDetector *pSDetector=nullptr, G4UserLimits *pULimits=nullptr, G4bool optimise=true)
G4bool IsDaughter(const G4VPhysicalVolume *p) const
G4Material * GetMaterial() const
G4VPhysicalVolume * GetDaughter(const std::size_t i) const
void InitialiseWorker(G4LogicalVolume *ptrMasterObject, G4VSolid *pSolid, G4VSensitiveDetector *pSDetector)
G4FieldManager * GetFieldManager() const
void SetVisAttributes(const G4VisAttributes *pVA)
G4int TotalVolumeEntities() const
const G4String & GetName() const
const G4MaterialCutsCouple * GetMaterialCutsCouple() const
void AssignFieldManager(G4FieldManager *fldMgr)
void SetMaterial(G4Material *pMaterial)
void SetSolid(G4VSolid *pSolid)
void SetSensitiveDetector(G4VSensitiveDetector *pSDetector)
void SetMaterialCutsCouple(G4MaterialCutsCouple *cuts)
void UpdateMaterial(G4Material *pMaterial)
G4double GetDensity() const
G4VPVParameterisation ia an abstract base class for Parameterisation, able to compute the transformat...
virtual G4Material * ComputeMaterial(const G4int repNo, G4VPhysicalVolume *currentVol, const G4VTouchable *parentTouch=nullptr)
virtual G4VSolid * ComputeSolid(const G4int no, G4VPhysicalVolume *pv)
G4VPhysicalVolume is an abstract base class for the representation of a positioned volume....
virtual EVolume VolumeType() const =0
G4LogicalVolume * GetLogicalVolume() const
const G4String & GetName() const
G4VSolid is an abstract base class for solids, physical shapes that can be tracked through....
virtual void ComputeDimensions(G4VPVParameterisation *p, const G4int n, const G4VPhysicalVolume *pRep)
virtual G4double GetCubicVolume()