ATLAS Offline Software
Loading...
Searching...
No Matches
CuboidVolumeBounds.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6// CuboidVolumeBounds.cxx, (c) ATLAS Detector software
8
9// Trk
11// TrkSurfaces
14#include "TrkSurfaces/Surface.h"
15// Gaudi
16#include "GaudiKernel/MsgStream.h"
17#include "GaudiKernel/SystemOfUnits.h"
18// STD
19#include <cmath>
20#include <iostream>
21
29
31 double halex,
32 double haley,
33 double halez)
34 : VolumeBounds()
35 , m_halfX(halex)
36 , m_halfY(haley)
37 , m_halfZ(halez)
39{}
40
48
50
53{
54 if (this != &bobo) {
55 m_halfX = bobo.m_halfX;
56 m_halfY = bobo.m_halfY;
57 m_halfZ = bobo.m_halfZ;
59 }
60 return *this;
61}
62
63std::vector<std::unique_ptr<Trk::Surface>>
65 (const Amg::Transform3D& transform)
66{
67
68 auto retsf = std::vector<std::unique_ptr<Trk::Surface>>() ;
69 // memory optimisation
70 retsf.reserve(6);
71 // face surfaces xy
72 // (1) - at negative local z
73 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
75 transform *
76 Amg::AngleAxis3D(180. * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
78 this->faceXYRectangleBounds()));
79 // (2) - at positive local z
80 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
82 transform *
84 this->faceXYRectangleBounds()));
85 // face surfaces yz
86 // transmute cyclical
87 // (3) - at negative local x
88 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
90 transform *
91 Amg::AngleAxis3D(180. * Gaudi::Units::deg, Amg::Vector3D(0., 0., 1.)) *
93 Amg::AngleAxis3D(90. * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0)) *
94 Amg::AngleAxis3D(90. * Gaudi::Units::deg, Amg::Vector3D(0., 0., 1.))),
95 this->faceYZRectangleBounds()));
96 // (4) - at positive local x
97 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
99 transform *
101 Amg::AngleAxis3D(90. * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
102 Amg::AngleAxis3D(90. * Gaudi::Units::deg, Amg::Vector3D(0., 0., 1.))),
103 this->faceYZRectangleBounds()));
104 // face surfaces zx
105 // (5) - at negative local y
106 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
108 transform *
109 Amg::AngleAxis3D(180. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.)) *
111 Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
112 Amg::AngleAxis3D(-90. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.))),
113 this->faceZXRectangleBounds()));
114 // (6) - at positive local y
115 retsf.push_back(std::make_unique<Trk::PlaneSurface>(
117 transform *
119 Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
120 Amg::AngleAxis3D(-90. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.))),
121 this->faceZXRectangleBounds()));
122
123 return retsf;
124}
125
126std::shared_ptr<Trk::RectangleBounds>
128{
129 return std::make_shared<Trk::RectangleBounds>(m_halfX, m_halfY);
130}
131
132std::shared_ptr<Trk::RectangleBounds>
134{
135 return std::make_shared<Trk::RectangleBounds>(m_halfY, m_halfZ);
136}
137
138std::shared_ptr<Trk::RectangleBounds>
140{
141 return std::make_shared<Trk::RectangleBounds>(m_halfZ, m_halfX);
142}
143
144// ostream operator overload
145
146MsgStream&
148{
149
150 std::stringstream temp_sl;
151 temp_sl << std::setiosflags(std::ios::fixed);
152 temp_sl << std::setprecision(7);
153 temp_sl << "Trk::CuboidVolumeBounds: (halfX, halfY, halfZ) = ";
154 temp_sl << "(" << m_halfX << ", " << m_halfY << ", " << m_halfZ << ")";
155 sl << temp_sl.str();
156 return sl;
157}
158
159std::ostream&
160Trk::CuboidVolumeBounds::dump(std::ostream& sl) const
161{
162 std::stringstream temp_sl;
163 temp_sl << std::setiosflags(std::ios::fixed);
164 temp_sl << std::setprecision(7);
165 temp_sl << "Trk::CuboidVolumeBounds: (halfX, halfY, halfZ) = ";
166 temp_sl << "(" << m_halfX << ", " << m_halfY << ", " << m_halfZ << ")";
167 sl << temp_sl.str();
168 return sl;
169}
170
Bounds for a cubical Volume, the decomposeToSurfaces method creates a vector of 6 surfaces:
SixObjectsAccessor m_objectAccessor
There's only one single object Acessor for the moment has to be implemented if Cuboids are used more ...
CuboidVolumeBounds()
Default Constructor.
double halflengthX() const
This method returns the halflength in local x.
virtual std::vector< std::unique_ptr< Trk::Surface > > decomposeToSurfaces(const Amg::Transform3D &transform) override final
Method to decompose the Bounds into boundarySurfaces.
std::shared_ptr< RectangleBounds > faceZXRectangleBounds() const
This method returns the associated RecantleBounds of the face PlaneSurface parallel to local zx plane...
CuboidVolumeBounds & operator=(const CuboidVolumeBounds &bobo)
Assignment operator.
MsgStream & dump(MsgStream &sl) const override final
Output Method for MsgStream.
virtual ~CuboidVolumeBounds()
Destructor.
std::shared_ptr< RectangleBounds > faceYZRectangleBounds() const
This method returns the associated RecantleBounds of the face PlaneSurface parallel to local yz plane...
double halflengthY() const
This method returns the halflength in local y.
std::shared_ptr< RectangleBounds > faceXYRectangleBounds() const
This method returns the associated RecantleBounds of the face PlaneSurface parallel to local xy plane...
double halflengthZ() const
This method returns the halflength in local z.
VolumeBounds()
Default Constructor.
Eigen::AngleAxisd AngleAxis3D
Eigen::Affine3d Transform3D
Eigen::Matrix< double, 3, 1 > Vector3D
Eigen::Translation< double, 3 > Translation3D