Loading [MathJax]/jax/input/TeX/config.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
ActsDetectorElement.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include "GeoModelKernel/throwExcept.h"
8 
9 // ATHENA
17 #include "TrkSurfaces/Surface.h"
20 
21 // PACKAGE
23 // ACTS
24 #include "Acts/Definitions/Units.hpp"
25 #include "Acts/Geometry/GeometryContext.hpp"
26 #include "Acts/Surfaces/AnnulusBounds.hpp"
27 #include "Acts/Surfaces/DiscSurface.hpp"
28 #include "Acts/Surfaces/LineBounds.hpp"
29 #include "Acts/Surfaces/PlaneSurface.hpp"
30 #include "Acts/Surfaces/RectangleBounds.hpp"
31 #include "Acts/Surfaces/StrawSurface.hpp"
32 #include "Acts/Surfaces/TrapezoidBounds.hpp"
33 #include "Acts/Visualization/ObjVisualization3D.hpp"
34 #include "Acts/Visualization/PlyVisualization3D.hpp"
35 
36 
37 // STL
38 #include <mutex>
39 #include <variant>
40 
41 
42 using Acts::Surface;
43 using Acts::Transform3;
44 
45 using namespace Acts::UnitLiterals;
46 using namespace ActsTrk;
47 
48 
49 constexpr double length_unit = 1_mm;
50 
52  GeoVDetectorElement{detElem.getMaterialGeom()},
53  m_idHash(detElem.identifyHash()),
54  m_type{detElem.isPixel() ? DetectorType::Pixel : DetectorType::Sct},
55  m_detElement{&detElem},
56  m_explicitIdentifier(detElem.identify())
57 {
58 
59 
60  auto boundsType = detElem.bounds().type();
61 
62  m_thickness = detElem.thickness();
63 
64 
65  if (boundsType == Trk::SurfaceBounds::Rectangle) {
66 
67  const InDetDD::SiDetectorDesign &design = detElem.design();
68  double hlX = design.width() / 2. * length_unit;
69  double hlY = design.length() / 2. * length_unit;
70 
71  auto rectangleBounds = std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
72 
73  m_bounds = rectangleBounds;
74  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
75 
76  } else if (boundsType == Trk::SurfaceBounds::Trapezoid) {
77 
78  const InDetDD::SiDetectorDesign &design = detElem.design();
79 
80  double minHlX = design.minWidth() / 2. * length_unit;
81  double maxHlX = design.maxWidth() / 2. * length_unit;
82  double hlY = design.length() / 2. * length_unit;
83 
84  auto trapezoidBounds =
85  std::make_shared<const Acts::TrapezoidBounds>(minHlX, maxHlX, hlY);
86 
87  m_bounds = trapezoidBounds;
88 
89  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(trapezoidBounds, *this);
90 
91 
92  } else if (boundsType == Trk::SurfaceBounds::Annulus) {
93 
94  const InDetDD::SiDetectorDesign &design = detElem.design();
95  const auto *annulus = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *>(&design);
96  if (annulus == nullptr) {
97  throw std::domain_error("ActsDetectorElement got inconsistent surface");
98  }
99 
100  double phi = annulus->phiWidth();
101  double phiS = annulus->stereo();
102  double R = annulus->waferCentreR();
103  double maxR = annulus->maxR();
104  double minR = annulus->minR();
105 
106  // phiAvg is the bounds-internal local rotation. We don't want one
107  double phiAvg = 0;
108  // phi is the total opening angle, set up symmetric phi bounds
109  double phiMax = phi / 2.;
110  double phiMin = -phiMax;
111 
112 
113  Amg::Vector2D originStripXYRotated(R * (1 - std::cos(phiS)),
114  R * std::sin(-phiS));
115 
116  auto annulusBounds = std::make_shared<Acts::AnnulusBounds>(
117  minR, maxR, phiMin, phiMax, originStripXYRotated, phiAvg);
118  m_bounds = annulusBounds;
119 
120  m_surface = Acts::Surface::makeShared<Acts::DiscSurface>(annulusBounds, *this);
121 
122  } else {
123  std::cout << boundsType << std::endl;
124  throw std::domain_error("ActsDetectorElement does not support this surface type");
125  }
126 }
127 
129  const InDetDD::TRT_BaseElement &detElem,
130  const Identifier &id) :
131  GeoVDetectorElement{detElem.getMaterialGeom()},
132  m_idHash(detElem.identifyHash()),
133  m_type{DetectorType::Trt},
134  m_detElement{&detElem},
135  m_trtTrf{std::make_unique<Amg::Transform3D>(trf)},
136  m_explicitIdentifier(id)
137 {
138 
139 
140  // we know this is a straw
141  double length = detElem.strawLength() * 0.5 * length_unit;
142 
143  // we need to find the radius
144  auto ecElem = dynamic_cast<const InDetDD::TRT_EndcapElement *>(&detElem);
145  auto brlElem = dynamic_cast<const InDetDD::TRT_BarrelElement *>(&detElem);
146  double innerTubeRadius{0.};
147  if (ecElem) {
148  innerTubeRadius = ecElem->getDescriptor()->innerTubeRadius() * length_unit;
149  } else {
150  if (brlElem) {
151  innerTubeRadius =
152  brlElem->getDescriptor()->innerTubeRadius() * length_unit;
153  } else {
154  THROW_EXCEPTION("Cannot get tube radius for element in ActsDetectorElement c'tor");
155  }
156  }
157 
158  auto lineBounds =
159  std::make_shared<const Acts::LineBounds>(innerTubeRadius, length);
160  m_bounds = lineBounds;
161 
162  m_surface = Acts::Surface::makeShared<Acts::StrawSurface>(lineBounds, *this);
163 }
164 
166  GeoVDetectorElement{detElem.getMaterialGeom()},
167  m_idHash(detElem.identifyHash()),
168  m_type{DetectorType::Hgtd},
169  m_detElement{&detElem},
170  m_thickness{detElem.thickness()},
171  m_explicitIdentifier{id}
172 {
173 
174  auto boundsType = detElem.bounds().type();
175 
176  if (boundsType == Trk::SurfaceBounds::Rectangle) {
177 
178  const InDetDD::HGTD_ModuleDesign &design = detElem.design();
179  double hlX = design.width() / 2. * length_unit;
180  double hlY = design.length() / 2. * length_unit;
181 
182  auto rectangleBounds =
183  std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
184 
185  m_bounds = rectangleBounds;
186 
187  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
188 
189  } else {
190  throw std::domain_error(
191  "ActsDetectorElement: the surface type of HGTD is not does not Rectangle, it is wrong");
192  }
193 }
194 
196 
197  GeoAlignmentStore* geoModelStore = store ? store->geoModelAlignment.get() : nullptr;
198  Amg::Transform3D l2g{Amg::Transform3D::Identity()};
199  switch (m_type) {
200  case DetectorType::Hgtd:{
201  l2g= m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore);
202  break;
203  } case DetectorType::Trt: {
204  l2g = (*m_trtTrf);
205  break;
206  }
208  default: {
209  const auto& detElem = static_cast<const InDetDD::SiDetectorElement&>(*m_detElement);
210  const InDetDD::SiDetectorDesign&design = detElem.design();
211  const Trk::SurfaceBounds::BoundsType boundsType = detElem.bounds().type();
212 
213  // extra shift for split row modules
214  Amg::Transform3D extraTransform{Amg::CLHEPTransformToEigen(detElem.recoToHitTransform())};
215  if (boundsType == Trk::SurfaceBounds::Rectangle &&
216  typeid(design) == typeid(InDetDD::StripBoxDesign) ) {
217  extraTransform = design.moduleShift() * extraTransform;
218  } else if (boundsType == Trk::SurfaceBounds::Annulus) {
219  // need to rotate pi/2 to reproduce ABXY orientation, phiS so that phi=0
220  // is center and symmetric
221  const double phiShift = M_PI_2 - static_cast<const InDetDD::StripStereoAnnulusDesign&>(design).stereo();
222 
223  const Amg::Vector2D origin2D = static_cast<const Acts::AnnulusBounds&>(m_surface->bounds()).moduleOrigin();
224  const Amg::Translation3D transl{origin2D.x(), origin2D.y(), 0};
225  const Amg::Transform3D originTrf{transl * Amg::getRotateZ3D(-phiShift)};
226  extraTransform = extraTransform * originTrf.inverse();
227  }
228  l2g = m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore) * extraTransform;
229  }
230  };
231  // need to make sure translation has correct units
232  l2g.translation() *= 1.0 / CLHEP::mm * length_unit;
233 
234  return l2g;
235 
236 }
238  if (detectorType() == DetectorType::Pixel || detectorType() == DetectorType::Sct) {
239  return IdentityHelper(static_cast<const InDetDD::SiDetectorElement *>(m_detElement));
240  } else {
241  throw std::domain_error("Cannot get IdentityHelper for TRT element");
242  }
243 }
244 
245 const Acts::Transform3 &ActsDetectorElement::transform(const Acts::GeometryContext &anygctx) const {
246  return m_trfCache.transform(anygctx);
247 }
248 
250  if (store.detType != detectorType()) return 0;
251  m_trfCache.getTransform(&store);
252  return 1;
253 }
254 
255 const Acts::Transform3 & ActsDetectorElement::getDefaultTransform() const {
256  return m_trfCache.getTransform(nullptr);
257 }
258 
259 const Acts::Surface &ActsDetectorElement::surface() const {
260  return (*m_surface);
261 }
262 
264  return (*m_surface);
265 }
266 
268  if (const auto *detElem =
269  dynamic_cast<const InDetDD::SiDetectorElement *>(m_detElement);
270  detElem != nullptr) {
271  return detElem->surface();
272  } else {
273  throw std::domain_error("Cannot get surface for TRT element");
274  }
275 }
276 
277 double ActsDetectorElement::thickness() const { return m_thickness; }
278 
280  return m_explicitIdentifier;
281 }
282 
283 const GeoVDetectorElement *
285  return m_detElement;
286 }
TrapezoidBounds.h
GeoAlignmentStore
Ensure that the extensions for the Vector3D are properly loaded.
Definition: GeoAlignmentStore.h:24
SGTest::store
TestStore store
Definition: TestStore.cxx:23
Trk::SurfaceBounds::BoundsType
BoundsType
Definition: SurfaceBounds.h:59
ActsDetectorElement::m_type
DetectorType m_type
Definition: ActsDetectorElement.h:107
InDetDD::TRT_BarrelElement
Definition: TRT_BarrelElement.h:44
StripBoxDesign.h
InDetDD::DetectorDesign::width
virtual double width() const =0
Method to calculate average width of a module.
phi
Scalar phi() const
phi method
Definition: AmgMatrixBasePlugin.h:67
RectangleBounds.h
Surface.h
InDetDD::DetectorDesign::moduleShift
virtual const Amg::Transform3D moduleShift() const
Definition: DetectorDesign.cxx:130
ActsTrk::DetectorType
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
Definition: GeometryDefs.h:17
ActsGeometryContext.h
ActsDetectorElement::m_detElement
const GeoVDetectorElement * m_detElement
Detector element as variant.
Definition: ActsDetectorElement.h:110
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
ActsDetectorElement::storeAlignedTransforms
virtual unsigned int storeAlignedTransforms(const ActsTrk::DetectorAlignStore &alignStore) const override
Caches the aligned transformation in the provided store. Returns the number of cached elements.
Definition: ActsDetectorElement.cxx:249
ActsTrk::DetectorAlignStore
Definition: DetectorAlignStore.h:20
Trk::SurfaceBounds::Rectangle
@ Rectangle
Definition: SurfaceBounds.h:65
IdentityHelper.h
InDetDD::StripBoxDesign
Definition: StripBoxDesign.h:31
InDetDD::HGTD_DetectorElement
Definition: HGTD_DetectorElement.h:40
InDetDD::DetectorDesign::length
virtual double length() const =0
Method to calculate length of a module.
ActsDetectorElement::upstreamDetectorElement
const GeoVDetectorElement * upstreamDetectorElement() const
Returns the underllying GeoModel detectorelement that this one is based on.
Definition: ActsDetectorElement.cxx:284
InDetDD::TRT_EndcapElement
Definition: TRT_EndcapElement.h:44
Trk::SurfaceBounds::Annulus
@ Annulus
Definition: SurfaceBounds.h:70
ActsDetectorElement::detectorType
DetectorType detectorType() const override final
Detector type.
Definition: ActsDetectorElement.cxx:287
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
length_unit
constexpr double length_unit
Definition: ActsDetectorElement.cxx:49
InDetDD::TRT_BarrelDescriptor::innerTubeRadius
double innerTubeRadius() const
Get inner tube radius of the straw.
InDetDD::HGTD_ModuleDesign::length
virtual double length() const
Method to calculate length of a module.
Definition: HGTD_ModuleDesign.cxx:65
ActsDetectorElement::surface
virtual const Acts::Surface & surface() const final override
Return surface associated with this identifier, which should come from the.
Definition: ActsDetectorElement.cxx:259
Amg::getRotateZ3D
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Definition: GeoPrimitivesHelpers.h:270
m_type
TokenType m_type
the type
Definition: TProperty.cxx:44
SurfaceBounds.h
TRT_EndcapElement.h
Trk::SurfaceBounds::type
virtual BoundsType type() const =0
Return the bounds type - for persistency optimization.
ActsTrk::DetectorType::Pixel
@ Pixel
Inner detector legacy.
DetType::Pixel
@ Pixel
Definition: DetType.h:13
AnnulusBounds.h
InDetDD::TRT_BarrelElement::getDescriptor
const TRT_BarrelDescriptor * getDescriptor() const
Returns a pointer to a descriptor, giving common information on module construction:
Definition: TRT_BarrelElement.cxx:72
ActsDetectorElement::transform
virtual const Acts::Transform3 & transform(const Acts::GeometryContext &gctx) const final override
Definition: ActsDetectorElement.cxx:245
ActsDetectorElement::atlasSurface
const Trk::Surface & atlasSurface() const
Return a shared pointer on the ATLAS surface associated with this identifier,.
Definition: ActsDetectorElement.cxx:267
InDetDD::StripStereoAnnulusDesign
Definition: StripStereoAnnulusDesign.h:50
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ActsDetectorElement::getDefaultTransform
const Acts::Transform3 & getDefaultTransform() const
Returns default transform.
Definition: ActsDetectorElement.cxx:255
ActsDetectorElement::m_surface
std::shared_ptr< Acts::Surface > m_surface
Corresponding Surface.
Definition: ActsDetectorElement.h:116
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
ActsDetectorElement::thickness
virtual double thickness() const final override
Returns the thickness of the module.
Definition: ActsDetectorElement.cxx:277
InDetDD::DetectorDesign::maxWidth
virtual double maxWidth() const =0
Method to calculate maximum width of a module.
ActsDetectorElement::identityHelper
IdentityHelper identityHelper() const
Definition: ActsDetectorElement.cxx:237
ActsDetectorElement.h
TRT_BarrelElement.h
ActsDetectorElement::identify
Identifier identify() const override final
Identifier.
Definition: ActsDetectorElement.cxx:279
ActsDetectorElement::m_thickness
double m_thickness
Thickness of this detector element.
Definition: ActsDetectorElement.h:114
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
InDetDD::HGTD_ModuleDesign::bounds
virtual const Trk::SurfaceBounds & bounds() const
Element boundary.
Definition: HGTD_ModuleDesign.cxx:135
Trk::SurfaceBounds::Trapezoid
@ Trapezoid
Definition: SurfaceBounds.h:67
THROW_EXCEPTION
#define THROW_EXCEPTION(MESSAGE)
Definition: throwExcept.h:10
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
StripStereoAnnulusDesign.h
ActsDetectorElement::m_trfCache
ActsTrk::TransformCacheDetEle< ActsDetectorElement > m_trfCache
Definition: ActsDetectorElement.h:108
InDetDD::DetectorDesign::minWidth
virtual double minWidth() const =0
Method to calculate minimum width of a module.
Amg::CLHEPTransformToEigen
Amg::Transform3D CLHEPTransformToEigen(const HepGeom::Transform3D &CLHEPtransf)
Converts a CLHEP-based HepGeom::Transform3D into an Eigen Amg::Transform3D.
Definition: CLHEPtoEigenConverter.h:38
ActsDetectorElement::m_explicitIdentifier
Identifier m_explicitIdentifier
Definition: ActsDetectorElement.h:121
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
InDetDD::HGTD_ModuleDesign
Definition: HGTD_ModuleDesign.h:43
ActsTrk
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
Definition: MuonDetectorBuilderTool.cxx:55
InDetDD::HGTD_ModuleDesign::width
virtual double width() const
Method to calculate average width of a module.
Definition: HGTD_ModuleDesign.cxx:71
drawFromPickle.sin
sin
Definition: drawFromPickle.py:36
CaloLCW_tf.trf
trf
Definition: CaloLCW_tf.py:20
InDetDD::SiDetectorDesign
Definition: SiDetectorDesign.h:50
IdentityHelper
Definition: IdentityHelper.h:14
Trk::Surface
Definition: Tracking/TrkDetDescr/TrkSurfaces/TrkSurfaces/Surface.h:75
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
ActsDetectorElement::ActsDetectorElement
ActsDetectorElement(const InDetDD::SiDetectorElement &detElem)
Definition: ActsDetectorElement.cxx:51
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57
Identifier
Definition: IdentifierFieldParser.cxx:14