diff --git a/DDCore/include/DD4hep/Volumes.h b/DDCore/include/DD4hep/Volumes.h index ae70060aa2bafeed7e5e81bc84e53a6a31c6ce31..11d043750fafefb9a676d3a3fe4227c13ab0fea2 100644 --- a/DDCore/include/DD4hep/Volumes.h +++ b/DDCore/include/DD4hep/Volumes.h @@ -126,7 +126,8 @@ namespace DD4hep { m_element = v.m_element; return *this; } - + /// Check if placement is properly instrumented + Object* data() const; /// Add identifier PlacedVolume& addPhysVolID(const std::string& name, int value); /// Volume material diff --git a/DDCore/src/VolumeManager.cpp b/DDCore/src/VolumeManager.cpp index e03801478e1aafc41bce83b4fdf65102c09e9523..7e2fae6db35a91e67f715f44ac80195da9adcb54 100644 --- a/DDCore/src/VolumeManager.cpp +++ b/DDCore/src/VolumeManager.cpp @@ -98,7 +98,8 @@ namespace { } for (Int_t idau = 0, ndau = node->GetNdaughters(); idau < ndau; ++idau) { TGeoNode* daughter = node->GetDaughter(idau); - if (dynamic_cast<const PlacedVolume::Object*>(daughter)) { + PlacedVolume placement(daughter); + if ( placement.data() ) { size_t cnt; PlacedVolume pv_dau = Ref_t(daughter); DetElement de_dau = findElt(e, daughter); @@ -114,6 +115,9 @@ namespace { } count += cnt; } + else { + throw runtime_error("Invalid not instrumented placement:"+string(daughter->GetName())+" [Internal error -- bad detector constructor]"); + } } chain.pop_back(); } diff --git a/DDCore/src/Volumes.cpp b/DDCore/src/Volumes.cpp index 3ab070da8063b559e4c8f7c5832de022a793a143..14cd37c092331112204d5668d454a825712aabb6 100644 --- a/DDCore/src/Volumes.cpp +++ b/DDCore/src/Volumes.cpp @@ -353,6 +353,12 @@ static PlacedVolume::Object* _data(const PlacedVolume& v) { throw runtime_error("DD4hep: Attempt to access invalid handle of type: PlacedVolume"); } +/// Check if placement is properly instrumented +PlacedVolume::Object* PlacedVolume::data() const { + PlacedVolume::Object* o = _userExtension(*this); + return o; +} + /// Add identifier PlacedVolume& PlacedVolume::addPhysVolID(const string& name, int value) { Object* obj = _data(*this);