ATLAS Offline Software
DoubleTrapezoidVolumeBounds.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // DoubleTrapezoidVolumeBounds.cxx, (c) ATLAS Detector software
8 
9 // Trk
11 // TrkSurfaces
15 // Gaudi
16 #include "GaudiKernel/MsgStream.h"
17 #include "GaudiKernel/SystemOfUnits.h"
18 // STD
19 #include <cmath>
20 #include <iomanip>
21 #include <iostream>
22 
24  : VolumeBounds()
25  , m_minHalfX(0.)
26  , m_medHalfX(0.)
27  , m_maxHalfX(0.)
28  , m_halfY1(0.)
29  , m_halfY2(0.)
30  , m_halfZ(0.)
31  , m_alpha1(0.)
32  , m_alpha2(0.)
33  , m_objectAccessor()
34 {}
35 
37  double minhalex,
38  double medhalex,
39  double maxhalex,
40  double haley1,
41  double haley2,
42  double halez)
43  : VolumeBounds()
44  , m_minHalfX(minhalex)
45  , m_medHalfX(medhalex)
46  , m_maxHalfX(maxhalex)
47  , m_halfY1(haley1)
48  , m_halfY2(haley2)
49  , m_halfZ(halez)
50  , m_alpha1(0.)
51  , m_alpha2(0.)
52  , m_objectAccessor()
53 {
54  m_alpha1 = atan2(m_medHalfX - m_minHalfX, 2. * m_halfY1);
55  m_alpha2 = atan2(m_medHalfX - m_maxHalfX, 2. * m_halfY2);
56 }
57 
60  : VolumeBounds()
61  , m_minHalfX(trabo.m_minHalfX)
62  , m_medHalfX(trabo.m_medHalfX)
63  , m_maxHalfX(trabo.m_maxHalfX)
64  , m_halfY1(trabo.m_halfY1)
65  , m_halfY2(trabo.m_halfY2)
66  , m_halfZ(trabo.m_halfZ)
67  , m_alpha1(trabo.m_alpha1)
68  , m_alpha2(trabo.m_alpha2)
69  , m_objectAccessor(trabo.m_objectAccessor)
70 {}
71 
73 
77 {
78  if (this != &trabo) {
79  m_minHalfX = trabo.m_minHalfX;
80  m_medHalfX = trabo.m_medHalfX;
81  m_maxHalfX = trabo.m_maxHalfX;
82  m_halfY1 = trabo.m_halfY1;
83  m_halfY2 = trabo.m_halfY2;
84  m_halfZ = trabo.m_halfZ;
85  m_alpha1 = trabo.m_alpha1;
86  m_alpha2 = trabo.m_alpha2;
87  m_objectAccessor = trabo.m_objectAccessor;
88  }
89  return *this;
90 }
91 
92 const std::vector<const Trk::Surface*>*
94  (const Amg::Transform3D& transform)
95 {
96  std::vector<const Trk::Surface*>* retsf =
97  new std::vector<const Trk::Surface*>;
98 
99  // face surfaces xy
100  Amg::RotationMatrix3D diamondRotation(transform.rotation());
101  Amg::Vector3D diamondX(diamondRotation.col(0));
102  Amg::Vector3D diamondY(diamondRotation.col(1));
103  Amg::Vector3D diamondZ(diamondRotation.col(2));
104  Amg::Vector3D diamondCenter(transform.translation());
105 
106  // (1) - at negative local z
107  retsf->push_back(new Trk::PlaneSurface(
109  transform *
110  Amg::Translation3D(Amg::Vector3D(0., 0., -this->halflengthZ())) *
112  ),
113  this->faceXYDiamondBounds()));
114  // (2) - at positive local z
115  retsf->push_back(new Trk::PlaneSurface(
117  transform *
118  Amg::Translation3D(Amg::Vector3D(0., 0., this->halflengthZ()))),
119  this->faceXYDiamondBounds()));
120  // face surfaces yz
121  // transmute cyclical
122  // (3) - at point A, attached to alpha opening angle
123  // in the local diamond coordinate system the center of the bottom left yz face plane is:
124  Amg::Vector3D A(- this->minHalflengthX(), -this->halflengthY1(), 0.);
125  Amg::AngleAxis3D alpha1ZRotation(this->alpha1(), Amg::Vector3D(0., 0., 1.));
126  // the face plane has to be rotated first by 90 degrees around the z-axis
127  // because the x-axis should point into ~y direction
128  // then it has to be rotated around the y-axis by 90 degrees to become a yz plane
129  // finally it is rotated by alpha1 around the z-axis
130  Amg::RotationMatrix3D alpha1Rotation(
131  alpha1ZRotation *
132  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
134  RectangleBounds* faceAlpha1Bounds = this->faceAlpha1RectangleBounds();
135  Amg::Vector3D faceAlpha1Position(A);
136  retsf->push_back(new Trk::PlaneSurface(
138  transform * Amg::Translation3D(faceAlpha1Position) * Amg::Transform3D(alpha1Rotation) ),
139  faceAlpha1Bounds));
140  // (4) - at point B, attached to beta opening angle
141  // in the local diamond coordinate system the center of the bottom right yz face plane is:
142  Amg::Vector3D B(this->minHalflengthX(), -this->halflengthY1(), 0.);
143  Amg::AngleAxis3D beta1ZRotation(-this->alpha1(), Amg::Vector3D(0., 0., 1.));
144  Amg::RotationMatrix3D beta1Rotation(
145  beta1ZRotation *
148  RectangleBounds* faceBeta1Bounds = this->faceBeta1RectangleBounds();
149  Amg::Vector3D faceBeta1Position(B);
150  retsf->push_back(new Trk::PlaneSurface(
151  transform * Amg::Translation3D(faceBeta1Position) * Amg::Transform3D(beta1Rotation) ,
152  faceBeta1Bounds));
153  // face surfaces yz
154  // transmute cyclical
155  // (5) - at point A', attached to alpha opening angle
156  // center of the left top yz face plate;
157  Amg::Vector3D AA(- this->maxHalflengthX(), this->halflengthY2(), 0.);
158  Amg::AngleAxis3D alpha2ZRotation(-this->alpha2(), Amg::Vector3D(0., 0., 1.));
159  Amg::RotationMatrix3D alpha2Rotation(
160  alpha2ZRotation *
161  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
162  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 0., 1.)));
163  RectangleBounds* faceAlpha2Bounds = this->faceAlpha2RectangleBounds();
164  Amg::Vector3D faceAlpha2Position(
165  AA);
166  retsf->push_back(new Trk::PlaneSurface(
168  transform * Amg::Translation3D(faceAlpha2Position) * Amg::Transform3D(alpha2Rotation)),
169  faceAlpha2Bounds));
170  // (6) - at point B', attached to beta opening angle
171  // center of the right top yz face plate;
172  Amg::Vector3D BB( this->maxHalflengthX(),this->halflengthY2(), 0.);
173  Amg::AngleAxis3D beta2ZRotation(this->alpha2(), Amg::Vector3D(0., 0., 1.));
174  Amg::RotationMatrix3D beta2Rotation(
175  beta2ZRotation *
177  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 0., 1.)));
178  RectangleBounds* faceBeta2Bounds = this->faceBeta2RectangleBounds();
179  Amg::Vector3D faceBeta2Position(BB);
180  retsf->push_back(new Trk::PlaneSurface(
181  transform * Amg::Translation3D(faceBeta2Position) * Amg::Transform3D(beta2Rotation),
182  faceBeta2Bounds));
183  // face surfaces zx
184  // (7) - at negative local y
185  retsf->push_back(new Trk::PlaneSurface(
187  transform *
188  Amg::Translation3D(Amg::Vector3D(0., -2 * this->halflengthY1(), 0.)) *
189  Amg::AngleAxis3D(180. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.)) *
190  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
191  Amg::AngleAxis3D(-90. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.))),
192  this->faceZXRectangleBoundsBottom()));
193  // (8) - at positive local y
194  retsf->push_back(new Trk::PlaneSurface(
196  transform *
197  Amg::Translation3D(Amg::Vector3D(0., 2*this->halflengthY2(), 0.)) *
198  Amg::AngleAxis3D(-90 * Gaudi::Units::deg, Amg::Vector3D(0., 1., 0.)) *
199  Amg::AngleAxis3D(-90. * Gaudi::Units::deg, Amg::Vector3D(1., 0., 0.))),
200  this->faceZXRectangleBoundsTop()));
201 
202  return retsf;
203 }
204 
205 // faces in xy
208 {
209  return new Trk::DiamondBounds(
210  m_minHalfX, m_medHalfX, m_maxHalfX, m_halfY1, m_halfY2);
211 }
212 
215 {
216  return new Trk::RectangleBounds(m_halfY1 / cos(m_alpha1), m_halfZ);
217 }
218 
221 {
222  return new Trk::RectangleBounds(m_halfY2 / cos(m_alpha2), m_halfZ);
223 }
224 
227 {
228  return new Trk::RectangleBounds(m_halfY1 / cos(m_alpha1), m_halfZ);
229 }
230 
233 {
234  return new Trk::RectangleBounds(m_halfY2 / cos(m_alpha2), m_halfZ);
235 }
236 
239 {
240  return new Trk::RectangleBounds(m_halfZ, m_minHalfX);
241 }
242 
245 {
246  return new Trk::RectangleBounds(m_halfZ, m_maxHalfX);
247 }
248 
249 // Trk::RectangleBounds*
250 // Trk::DoubleTrapezoidVolumeBounds::faceZXRectangleBoundsTop() const
251 //{
252 // double delta = (m_alpha < m_beta) ? m_alpha - M_PI/2. : m_beta - M_PI/2.;
253 // return new Trk::RectangleBounds(m_halfZ,
254 // 0.5*(m_minHalfX+m_minHalfX+2.*m_halfY/cos(delta)));
255 //}
256 
257 bool
259  const
260 {
261  if (std::abs(pos.z()) > m_halfZ + tol)
262  return false;
263  if (pos.y() < -2 * m_halfY1 - tol)
264  return false;
265  if (pos.y() > 2 * m_halfY2 + tol)
266  return false;
267  Trk::DiamondBounds* faceXYBounds = this->faceXYDiamondBounds();
268  Amg::Vector2D locp(pos.x(), pos.y());
269  bool inside(faceXYBounds->inside(locp, tol, tol));
270  delete faceXYBounds;
271  return inside;
272 }
273 
274 // ostream operator overload
275 MsgStream&
277 {
278  std::stringstream temp_sl;
279  temp_sl << std::setiosflags(std::ios::fixed);
280  temp_sl << std::setprecision(7);
281  temp_sl << "Trk::DoubleTrapezoidVolumeBounds: (minhalfX, medhalfX, maxhalfX, "
282  "halfY1, halfY2, halfZ) = ";
283  temp_sl << "(" << m_minHalfX << ", " << m_medHalfX << ", " << m_maxHalfX;
284  temp_sl << ", " << m_halfY1 << ", " << m_halfY2 << ", " << m_halfZ << ")";
285  sl << temp_sl.str();
286  return sl;
287 }
288 
289 std::ostream&
291 {
292  std::stringstream temp_sl;
293  temp_sl << std::setiosflags(std::ios::fixed);
294  temp_sl << std::setprecision(7);
295  temp_sl << "Trk::DoubleTrapezoidVolumeBounds: ) =(minhalfX, medhalfX, "
296  "maxhalfX, halfY1, halfY2, halfZ) ";
297  temp_sl << "(" << m_minHalfX << ", " << m_medHalfX << ", " << m_maxHalfX;
298  temp_sl << ", " << m_halfY1 << ", " << m_halfY2 << ", " << m_halfZ << ")";
299  sl << temp_sl.str();
300  return sl;
301 }
302 
Trk::DoubleTrapezoidVolumeBounds::m_alpha2
double m_alpha2
opening angle alpha (in point A')
Definition: DoubleTrapezoidVolumeBounds.h:166
Trk::RectangleBounds
Definition: RectangleBounds.h:38
Trk::DoubleTrapezoidVolumeBounds::m_halfY1
double m_halfY1
halflength in y
Definition: DoubleTrapezoidVolumeBounds.h:161
Trk::DoubleTrapezoidVolumeBounds::m_objectAccessor
Trk::EightObjectsAccessor m_objectAccessor
There's only one single object Acessor for the moment has to be implemented if Cuboids are used more ...
Definition: DoubleTrapezoidVolumeBounds.h:173
Trk::DoubleTrapezoidVolumeBounds::m_halfZ
double m_halfZ
halflength in z
Definition: DoubleTrapezoidVolumeBounds.h:163
Trk::DoubleTrapezoidVolumeBounds::m_minHalfX
double m_minHalfX
minimal Y halflength in x
Definition: DoubleTrapezoidVolumeBounds.h:158
Trk::DoubleTrapezoidVolumeBounds::faceXYDiamondBounds
DiamondBounds * faceXYDiamondBounds() const
This method returns the associated DoubleTrapezoidBounds of the face PlaneSurface parallel to local x...
Definition: DoubleTrapezoidVolumeBounds.cxx:207
RectangleBounds.h
Trk::DoubleTrapezoidVolumeBounds::m_alpha1
double m_alpha1
opening angle alpha (in point A)
Definition: DoubleTrapezoidVolumeBounds.h:165
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
Trk::DoubleTrapezoidVolumeBounds::inside
bool inside(const Amg::Vector3D &, double tol=0.) const override final
This method checks if position in the 3D volume frame is inside the cylinder.
Definition: DoubleTrapezoidVolumeBounds.cxx:258
Trk::DoubleTrapezoidVolumeBounds::operator=
DoubleTrapezoidVolumeBounds & operator=(const DoubleTrapezoidVolumeBounds &bobo)
Assignment operator.
Definition: DoubleTrapezoidVolumeBounds.cxx:75
Trk::DoubleTrapezoidVolumeBounds::~DoubleTrapezoidVolumeBounds
virtual ~DoubleTrapezoidVolumeBounds()
Destructor.
deg
#define deg
Definition: SbPolyhedron.cxx:17
Trk::DoubleTrapezoidVolumeBounds::DoubleTrapezoidVolumeBounds
DoubleTrapezoidVolumeBounds()
Default Constructor.
Definition: DoubleTrapezoidVolumeBounds.cxx:23
Trk::DoubleTrapezoidVolumeBounds::m_halfY2
double m_halfY2
halflength in y
Definition: DoubleTrapezoidVolumeBounds.h:162
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
Trk::DiamondBounds::inside
virtual bool inside(const Amg::Vector2D &locpo, double tol1=0., double tol2=0.) const override final
The orientation of the Diamond is according to the figure.
Definition: DiamondBounds.cxx:61
Trk::DoubleTrapezoidVolumeBounds::faceAlpha2RectangleBounds
RectangleBounds * faceAlpha2RectangleBounds() const
Definition: DoubleTrapezoidVolumeBounds.cxx:220
DiamondBounds.h
Trk::VolumeBounds
Definition: VolumeBounds.h:45
A
Trk::DoubleTrapezoidVolumeBounds::dump
MsgStream & dump(MsgStream &sl) const override final
Output Method for MsgStream.
Definition: DoubleTrapezoidVolumeBounds.cxx:276
Trk::DiamondBounds
Definition: DiamondBounds.h:37
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
Trk::DoubleTrapezoidVolumeBounds::faceBeta2RectangleBounds
RectangleBounds * faceBeta2RectangleBounds() const
Definition: DoubleTrapezoidVolumeBounds.cxx:232
DoubleTrapezoidVolumeBounds.h
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
Trk::DoubleTrapezoidVolumeBounds::decomposeToSurfaces
const std::vector< const Trk::Surface * > * decomposeToSurfaces(const Amg::Transform3D &transform) override final
Method to decompose the Bounds into Surfaces.
Definition: DoubleTrapezoidVolumeBounds.cxx:94
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:18
Trk::inside
@ inside
Definition: PropDirection.h:29
Trk::DoubleTrapezoidVolumeBounds::faceZXRectangleBoundsTop
RectangleBounds * faceZXRectangleBoundsTop() const
This method returns the associated RecantleBounds of the face PlaneSurface parallel to local zx plane...
Definition: DoubleTrapezoidVolumeBounds.cxx:244
Trk::DoubleTrapezoidVolumeBounds::faceAlpha1RectangleBounds
RectangleBounds * faceAlpha1RectangleBounds() const
This method returns the associated RecantleBounds of the face PlaneSurface attached to alpha (negativ...
Definition: DoubleTrapezoidVolumeBounds.cxx:214
Trk::PlaneSurface
Definition: PlaneSurface.h:64
Amg::RotationMatrix3D
Eigen::Matrix< double, 3, 3 > RotationMatrix3D
Definition: GeoPrimitives.h:49
PlaneSurface.h
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
Trk::DoubleTrapezoidVolumeBounds
Definition: DoubleTrapezoidVolumeBounds.h:66
Trk::DoubleTrapezoidVolumeBounds::faceZXRectangleBoundsBottom
RectangleBounds * faceZXRectangleBoundsBottom() const
This method returns the associated RecantleBounds of the face PlaneSurface parallel to local zx plane...
Definition: DoubleTrapezoidVolumeBounds.cxx:238
Trk::DoubleTrapezoidVolumeBounds::m_maxHalfX
double m_maxHalfX
maximal Y halflength in x
Definition: DoubleTrapezoidVolumeBounds.h:160
Amg::AngleAxis3D
Eigen::AngleAxisd AngleAxis3D
Definition: GeoPrimitives.h:45
Trk::DoubleTrapezoidVolumeBounds::faceBeta1RectangleBounds
RectangleBounds * faceBeta1RectangleBounds() const
This method returns the associated RecantleBounds of the face PlaneSurface attached to beta (positive...
Definition: DoubleTrapezoidVolumeBounds.cxx:226
Trk::DoubleTrapezoidVolumeBounds::m_medHalfX
double m_medHalfX
maximal halflength in x
Definition: DoubleTrapezoidVolumeBounds.h:159