ATLAS Offline Software
Loading...
Searching...
No Matches
Trk::CombinedVolumeBounds Class Referencefinal

Bounds for a generic combined volume, the decomposeToSurfaces method creates a vector of n surfaces (n1+n2-nshared): More...

#include <CombinedVolumeBounds.h>

Inheritance diagram for Trk::CombinedVolumeBounds:
Collaboration diagram for Trk::CombinedVolumeBounds:

Public Member Functions

 CombinedVolumeBounds ()
 Default Constructor.
 CombinedVolumeBounds (std::unique_ptr< Volume > first, std::unique_ptr< Volume > second, bool intersection)
 Constructor - the box boundaries.
 CombinedVolumeBounds (const CombinedVolumeBounds &bobo)
 Copy Constructor.
virtual ~CombinedVolumeBounds ()
 Destructor.
CombinedVolumeBoundsoperator= (const CombinedVolumeBounds &bobo)
 Assignment operator.
virtual CombinedVolumeBoundsclone () const override final
 Virtual constructor.
virtual bool inside (const Amg::Vector3D &, double tol=0.) const override final
 This method checks if position in the 3D volume frame is inside the volume.
virtual std::vector< std::unique_ptr< Trk::Surface > > decomposeToSurfaces (const Amg::Transform3D &transform) override final
 Method to decompose the Bounds into boundarySurfaces.
virtual ObjectAccessor boundarySurfaceAccessor (const Amg::Vector3D &gp, const Amg::Vector3D &dir, bool forceInside=false) const override final
 Provide accessor for BoundarySurfaces.
const Volumefirst () const
 This method returns the first VolumeBounds.
const Volumesecond () const
 This method returns the second VolumeBounds.
bool intersection () const
 This method distinguishes between Union(0) and Intersection(1)
const std::vector< bool > & boundsOrientation () const
 This method returns bounds orientation.
virtual MsgStream & dump (MsgStream &sl) const override final
 Output Method for MsgStream.
virtual std::ostream & dump (std::ostream &sl) const override final
 Output Method for std::ostream.

Static Private Member Functions

static Trk::VolumecreateSubtractedVolume (const Amg::Transform3D &transf, const Trk::Volume *subtrVol)

Private Attributes

std::unique_ptr< Volumem_first {}
std::unique_ptr< Volumem_second {}
bool m_intersection {}
EightObjectsAccessor m_objectAccessor {}
std::vector< bool > m_boundsOrientation {}

Detailed Description

Bounds for a generic combined volume, the decomposeToSurfaces method creates a vector of n surfaces (n1+n2-nshared):

BoundarySurfaceFace [index]: [n1+n2-nshared] combined surfaces

designed to allow transcript of GeoShapeUnion and GeoShapeIntersection

Author
Sarka.nosp@m..Tod.nosp@m.orova.nosp@m.@cer.nosp@m.n.ch
Christos Anastopoulos (Athena MT modifications)

Definition at line 44 of file CombinedVolumeBounds.h.

Constructor & Destructor Documentation

◆ CombinedVolumeBounds() [1/3]

Trk::CombinedVolumeBounds::CombinedVolumeBounds ( )
default

Default Constructor.

◆ CombinedVolumeBounds() [2/3]

Trk::CombinedVolumeBounds::CombinedVolumeBounds ( std::unique_ptr< Volume > first,
std::unique_ptr< Volume > second,
bool intersection )

Constructor - the box boundaries.

Definition at line 36 of file CombinedVolumeBounds.cxx.

40 : VolumeBounds()
41 , m_first(std::move(vol1))
42 , m_second(std::move(vol2))
46{}
std::unique_ptr< Volume > m_second
std::unique_ptr< Volume > m_first
EightObjectsAccessor m_objectAccessor
bool intersection() const
This method distinguishes between Union(0) and Intersection(1)
std::vector< bool > m_boundsOrientation
VolumeBounds()
Default Constructor.

◆ CombinedVolumeBounds() [3/3]

Trk::CombinedVolumeBounds::CombinedVolumeBounds ( const CombinedVolumeBounds & bobo)

Copy Constructor.

Definition at line 48 of file CombinedVolumeBounds.cxx.

50 : VolumeBounds()
51 , m_first{bobo.m_first->clone()}
52 , m_second{bobo.m_second->clone()}
53 , m_intersection(bobo.m_intersection)
54 , m_objectAccessor(bobo.m_objectAccessor)
55 , m_boundsOrientation(bobo.m_boundsOrientation)
56{}

◆ ~CombinedVolumeBounds()

Trk::CombinedVolumeBounds::~CombinedVolumeBounds ( )
virtualdefault

Destructor.

Member Function Documentation

◆ boundarySurfaceAccessor()

ObjectAccessor Trk::CombinedVolumeBounds::boundarySurfaceAccessor ( const Amg::Vector3D & gp,
const Amg::Vector3D & dir,
bool forceInside = false ) const
inlinefinaloverridevirtual

Provide accessor for BoundarySurfaces.

Implements Trk::VolumeBounds.

Definition at line 131 of file CombinedVolumeBounds.h.

132 {
133 return Trk::ObjectAccessor(m_objectAccessor);
134}

◆ boundsOrientation()

const std::vector< bool > & Trk::CombinedVolumeBounds::boundsOrientation ( ) const
inline

This method returns bounds orientation.

Definition at line 136 of file CombinedVolumeBounds.h.

136 {
137 return (m_boundsOrientation);
138}

◆ clone()

CombinedVolumeBounds * Trk::CombinedVolumeBounds::clone ( ) const
inlinefinaloverridevirtual

Virtual constructor.

Implements Trk::VolumeBounds.

Definition at line 108 of file CombinedVolumeBounds.h.

108 {
109 return new CombinedVolumeBounds(*this);
110}
CombinedVolumeBounds()
Default Constructor.

◆ createSubtractedVolume()

Trk::Volume * Trk::CombinedVolumeBounds::createSubtractedVolume ( const Amg::Transform3D & transf,
const Trk::Volume * subtrVol )
staticprivate

Definition at line 341 of file CombinedVolumeBounds.cxx.

344{
345 if (!subtrVol){
346 return nullptr;
347 }
348 return new Trk::Volume(*subtrVol, transf);
349}

◆ decomposeToSurfaces()

std::vector< std::unique_ptr< Trk::Surface > > Trk::CombinedVolumeBounds::decomposeToSurfaces ( const Amg::Transform3D & transform)
finaloverridevirtual

Method to decompose the Bounds into boundarySurfaces.

Implements Trk::VolumeBounds.

Definition at line 74 of file CombinedVolumeBounds.cxx.

74 {
75
76 auto retsf = std::vector<std::unique_ptr<Trk::Surface>>();
77
78 const Trk::CylinderVolumeBounds* cylVol = dynamic_cast<const Trk::CylinderVolumeBounds*>(&(m_first->volumeBounds()));
79 const Trk::SimplePolygonBrepVolumeBounds* spbVol = dynamic_cast<const Trk::SimplePolygonBrepVolumeBounds*>(&(m_first->volumeBounds()));
80 const Trk::CombinedVolumeBounds* comVol = dynamic_cast<const Trk::CombinedVolumeBounds*>(&(m_first->volumeBounds()));
81 const Trk::SubtractedVolumeBounds* subVol = dynamic_cast<const Trk::SubtractedVolumeBounds*>(&(m_first->volumeBounds()));
82
83 // get surfaces for first boundaries
84 std::vector<std::unique_ptr<Trk::Surface>> firstSurfaces =
85 m_first->volumeBounds().decomposeToSurfaces(transf * m_first->transform());
86 // get surfaces for second boundaries
87 std::vector<std::unique_ptr<Trk::Surface>> secondSurfaces =
88 m_second->volumeBounds().decomposeToSurfaces(transf * m_second->transform());
89 unsigned int nSurf = firstSurfaces.size() + secondSurfaces.size();
90 m_boundsOrientation.resize(nSurf);
91
92 std::vector<unsigned int> subtrSecond;
93
94 // loop over surfaces; convert disc surface to a plane surface using elliptic
95 // bounds
96 for (unsigned int out = 0; out < firstSurfaces.size(); out++) {
97 //
98 const SubtractedPlaneSurface* splo = dynamic_cast<const SubtractedPlaneSurface*>(firstSurfaces[out].get());
99 const PlaneSurface* plo = dynamic_cast<const PlaneSurface*>(firstSurfaces[out].get());
100 const SubtractedCylinderSurface* sclo = dynamic_cast<const SubtractedCylinderSurface*>(firstSurfaces[out].get());
101 const CylinderSurface* clo = dynamic_cast<const CylinderSurface*>(firstSurfaces[out].get());
102 const DiscSurface* dlo = dynamic_cast<const DiscSurface*>(firstSurfaces[out].get());
103
104 // resolve bounds orientation : copy from combined/subtracted, swap inner
105 // cyl, swap bottom spb
106 if (comVol){
108 }
109 else if (subVol){
111 }
112 else if (cylVol && clo && out == 3){
113 m_boundsOrientation[out] = false;
114 }
115 else if (spbVol && out == 0){
116 m_boundsOrientation[out] = false;
117 }
118 else{
119 m_boundsOrientation[out] = true;
120 }
121
122 std::unique_ptr<Trk::Volume> secondSub(createSubtractedVolume(
123 firstSurfaces[out]->transform().inverse() * transf, m_second.get()));
124
125 if (sclo || splo) {
126 bool shared = false;
127 const Trk::AreaExcluder* vEx;
128 if (splo) {
129 vEx = splo->subtractedVolume();
130 shared = splo->shared();
131 }
132 if (sclo) {
133 vEx = sclo->subtractedVolume();
134 shared = sclo->shared();
135 }
136 const Trk::VolumeExcluder* volExcl = dynamic_cast<const Trk::VolumeExcluder*>(vEx);
137 if (!volExcl){
138 throw std::logic_error("Not a VolumeExcluder");
139 }
140
141 auto firstSub = std::make_unique<Trk::Volume>(*volExcl->volume());
142
143 std::unique_ptr<Trk::Volume> comb_sub{};
144 if (!shared && !m_intersection){
145 comb_sub = std::make_unique<Trk::Volume>(
146 nullptr,
147 std::make_shared<Trk::CombinedVolumeBounds>(std::move(secondSub), std::move(firstSub), m_intersection));
148 }
149 if (!shared && m_intersection){
150 comb_sub = std::make_unique<Trk::Volume>(
151 nullptr,
152 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(secondSub), std::move(firstSub)));
153 }
154 if (shared && m_intersection){
155 comb_sub = std::make_unique<Trk::Volume>(
156 nullptr,
157 std::make_shared<Trk::CombinedVolumeBounds>(std::move(secondSub), std::move(firstSub), m_intersection));
158 }
159 if (shared && !m_intersection){
160 comb_sub = std::make_unique<Trk::Volume>(
161 nullptr,
162 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(firstSub), std::move(secondSub)));
163 }
164 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(comb_sub));
165 bool new_shared = shared;
166 if (m_intersection){
167 new_shared = true;
168 }
169 if (splo){
170 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*splo, std::move(volEx), new_shared));
171 }
172 else if (sclo){
173 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*sclo, std::move(volEx), new_shared));
174 }
175 } else if (plo || clo || dlo) {
176 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(secondSub));
177 if (plo){
178 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*plo, std::move(volEx), m_intersection));
179 }
180 else if (clo){
181 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*clo, std::move(volEx), m_intersection));
182 }
183 else if (dlo) {
184 const DiscBounds* db = dynamic_cast<const DiscBounds*>(&(dlo->bounds()));
185 if (!db){
186 throw std::logic_error("Not DiscBounds");
187 }
188 auto eb = std::make_shared<EllipseBounds>(db->rMin(), db->rMin(), db->rMax(), db->rMax(), db->halfPhiSector());
189 retsf.push_back( std::make_unique<Trk::SubtractedPlaneSurface>(
190 PlaneSurface(Amg::Transform3D(dlo->transform()), eb),
191 std::move(volEx),
193 }
194 } else {
195 throw std::runtime_error(
196 "Unhandled surface in CombinedVolumeBounds::decomposeToSurfaces.");
197 }
198 }
199
200 cylVol =
201 dynamic_cast<const Trk::CylinderVolumeBounds*>(&(m_second->volumeBounds()));
202 spbVol = dynamic_cast<const Trk::SimplePolygonBrepVolumeBounds*>(
203 &(m_second->volumeBounds()));
204 comVol =
205 dynamic_cast<const Trk::CombinedVolumeBounds*>(&(m_second->volumeBounds()));
206 subVol = dynamic_cast<const Trk::SubtractedVolumeBounds*>(
207 &(m_second->volumeBounds()));
208 unsigned int nOut = firstSurfaces.size();
209
210 for (unsigned int in = 0; in < secondSurfaces.size(); in++) {
211 //
212 const SubtractedPlaneSurface* spli = dynamic_cast<const SubtractedPlaneSurface*>(secondSurfaces[in].get());
213 const PlaneSurface* pli = dynamic_cast<const PlaneSurface*>(secondSurfaces[in].get());
214 const SubtractedCylinderSurface* scli = dynamic_cast<const SubtractedCylinderSurface*>(secondSurfaces[in].get());
215 const CylinderSurface* cli = dynamic_cast<const CylinderSurface*>(secondSurfaces[in].get());
216 const DiscSurface* dli = dynamic_cast<const DiscSurface*>(secondSurfaces[in].get());
217
218 // resolve bounds orientation : copy from combined/subtracted, swap inner
219 // cyl, swap bottom spb
220 if (comVol){
221 m_boundsOrientation[nOut + in] = comVol->boundsOrientation()[in];
222 }
223 else if (subVol){
224 m_boundsOrientation[nOut + in] = subVol->boundsOrientation()[in];
225 }
226 else if (cylVol && cli && in == 3){
227 m_boundsOrientation[nOut + in] = false;
228 }
229 else if (spbVol && in == 0){
230 m_boundsOrientation[nOut + in] = false;
231 }
232 else{
233 m_boundsOrientation[nOut + in] = true;
234 }
235
236 std::unique_ptr<Trk::Volume> firstSub(createSubtractedVolume(
237 secondSurfaces[in]->transform().inverse() * transf, m_first.get()));
238 if (scli || spli) {
239 bool shared = false;
240 const Trk::AreaExcluder* vEx;
241 if (spli) {
242 vEx = spli->subtractedVolume();
243 shared = spli->shared();
244 }
245 if (scli) {
246 vEx = scli->subtractedVolume();
247 shared = scli->shared();
248 }
249 const Trk::VolumeExcluder* volExcl = dynamic_cast<const Trk::VolumeExcluder*>(vEx);
250 if (!volExcl){
251 throw std::logic_error("Not a VolumeExcluder");
252 }
253 auto secondSub = std::make_unique<Trk::Volume>(*volExcl->volume());
254
255 std::unique_ptr<Trk::Volume> comb_sub{};
256 if (!shared && !m_intersection){
257 comb_sub = std::make_unique<Trk::Volume>(
258 nullptr,
259 std::make_shared<Trk::CombinedVolumeBounds>(std::move(firstSub), std::move(secondSub), m_intersection));
260 }
261 if (!shared && m_intersection){
262 comb_sub = std::make_unique<Trk::Volume>(
263 nullptr,
264 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(firstSub), std::move(secondSub)));
265 }
266 if (shared && m_intersection){
267 comb_sub = std::make_unique<Trk::Volume>(
268 nullptr,
269 std::make_shared<Trk::CombinedVolumeBounds>(std::move(firstSub), std::move(secondSub), m_intersection));
270 }
271 if (shared && !m_intersection){
272 comb_sub = std::make_unique<Trk::Volume>(
273 nullptr,
274 std::make_shared<Trk::SubtractedVolumeBounds>(std::move(secondSub), std::move(firstSub)));
275 }
276 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(comb_sub));
277 bool new_shared = shared;
278 if (m_intersection){
279 new_shared = true;
280 }
281 if (spli){
282 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*spli, std::move(volEx), new_shared));
283 }
284 else if (scli)
285 retsf.push_back( std::make_unique<Trk::SubtractedCylinderSurface>(*scli, std::move(volEx), new_shared));
286
287 } else if (pli || cli || dli) {
288 auto volEx = std::make_shared<const Trk::VolumeExcluder>(std::move(firstSub));
289 if (pli){
290 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(*pli, std::move(volEx), m_intersection));
291 }
292 else if (cli){
293 retsf.push_back(std::make_unique<Trk::SubtractedCylinderSurface>(*cli, std::move(volEx), m_intersection));
294 }
295 else if (dli) {
296 const DiscBounds* db = dynamic_cast<const DiscBounds*>(&(dli->bounds()));
297 if (!db){
298 throw std::logic_error("Not DiscBounds");
299 }
300 auto eb = std::make_shared<EllipseBounds>(db->rMin(), db->rMin(), db->rMax(), db->rMax(), db->halfPhiSector());
301 auto pliN = PlaneSurface(Amg::Transform3D(dli->transform()), eb);
302 retsf.push_back(std::make_unique<Trk::SubtractedPlaneSurface>(pliN, std::move(volEx), m_intersection));
303 }
304 } else {
305 throw std::runtime_error(
306 "Unhandled surface in CombinedVolumeBounds::decomposeToSurfaces.");
307 }
308 }
309 return retsf;
310}
const std::vector< bool > & boundsOrientation() const
This method returns bounds orientation.
static Trk::Volume * createSubtractedVolume(const Amg::Transform3D &transf, const Trk::Volume *subtrVol)
const std::vector< bool > & boundsOrientation() const
This method returns bounds orientation.
const Volume * volume() const
Acces the subtracted volume.
Eigen::Affine3d Transform3D
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.

◆ dump() [1/2]

MsgStream & Trk::CombinedVolumeBounds::dump ( MsgStream & sl) const
finaloverridevirtual

Output Method for MsgStream.

Implements Trk::VolumeBounds.

Definition at line 315 of file CombinedVolumeBounds.cxx.

316{
317 std::stringstream temp_sl;
318 temp_sl << std::setiosflags(std::ios::fixed);
319 temp_sl << std::setprecision(7);
320 temp_sl << "Trk::CombinedVolumeBounds: first,second ";
321 sl << temp_sl.str();
322 std::as_const(*m_first).volumeBounds().dump(sl);
323 std::as_const(*m_second).volumeBounds().dump(sl);
324 return sl;
325}

◆ dump() [2/2]

std::ostream & Trk::CombinedVolumeBounds::dump ( std::ostream & sl) const
finaloverridevirtual

Output Method for std::ostream.

Implements Trk::VolumeBounds.

Definition at line 328 of file CombinedVolumeBounds.cxx.

329{
330 std::stringstream temp_sl;
331 temp_sl << std::setiosflags(std::ios::fixed);
332 temp_sl << std::setprecision(7);
333 temp_sl << "Trk::CombinedVolumeBounds: first,second ";
334 sl << temp_sl.str();
335 std::as_const(*m_first).volumeBounds().dump(sl);
336 std::as_const(*m_second).volumeBounds().dump(sl);
337 return sl;
338}

◆ first()

const Volume * Trk::CombinedVolumeBounds::first ( ) const
inline

This method returns the first VolumeBounds.

Definition at line 119 of file CombinedVolumeBounds.h.

119 {
120 return m_first.get();
121}

◆ inside()

bool Trk::CombinedVolumeBounds::inside ( const Amg::Vector3D & pos,
double tol = 0. ) const
inlinefinaloverridevirtual

This method checks if position in the 3D volume frame is inside the volume.

Implements Trk::VolumeBounds.

Definition at line 112 of file CombinedVolumeBounds.h.

112 {
113 if (m_intersection) {
114 return (m_first->inside(pos, tol) && m_second->inside(pos, tol));
115 }
116 return (m_first->inside(pos, tol) || m_second->inside(pos, tol));
117}

◆ intersection()

bool Trk::CombinedVolumeBounds::intersection ( ) const
inline

This method distinguishes between Union(0) and Intersection(1)

Definition at line 127 of file CombinedVolumeBounds.h.

127 {
128 return m_intersection;
129}

◆ operator=()

Trk::CombinedVolumeBounds & Trk::CombinedVolumeBounds::operator= ( const CombinedVolumeBounds & bobo)

Assignment operator.

Definition at line 61 of file CombinedVolumeBounds.cxx.

62{
63 if (this != &bobo) {
64 m_first.reset(bobo.m_first->clone());
65 m_second.reset(bobo.m_second->clone());
66 m_intersection = bobo.m_intersection;
67 m_objectAccessor = bobo.m_objectAccessor;
68 m_boundsOrientation = bobo.m_boundsOrientation;
69 }
70 return *this;
71}

◆ second()

const Volume * Trk::CombinedVolumeBounds::second ( ) const
inline

This method returns the second VolumeBounds.

Definition at line 123 of file CombinedVolumeBounds.h.

123 {
124 return m_second.get();
125}

Member Data Documentation

◆ m_boundsOrientation

std::vector<bool> Trk::CombinedVolumeBounds::m_boundsOrientation {}
private

Definition at line 105 of file CombinedVolumeBounds.h.

105{};

◆ m_first

std::unique_ptr<Volume> Trk::CombinedVolumeBounds::m_first {}
private

Definition at line 101 of file CombinedVolumeBounds.h.

101{};

◆ m_intersection

bool Trk::CombinedVolumeBounds::m_intersection {}
private

Definition at line 103 of file CombinedVolumeBounds.h.

103{};

◆ m_objectAccessor

EightObjectsAccessor Trk::CombinedVolumeBounds::m_objectAccessor {}
private

Definition at line 104 of file CombinedVolumeBounds.h.

104{};

◆ m_second

std::unique_ptr<Volume> Trk::CombinedVolumeBounds::m_second {}
private

Definition at line 102 of file CombinedVolumeBounds.h.

102{};

The documentation for this class was generated from the following files: