ATLAS Offline Software
Public Types | Public Member Functions | Private Attributes | List of all members
ActsDetectorElement Class Reference

#include <ActsDetectorElement.h>

Inheritance diagram for ActsDetectorElement:
Collaboration diagram for ActsDetectorElement:

Public Types

using DetectorType = ActsTrk::DetectorType
 
using AlignmentStore = ActsGeometryContext::AlignmentStore
 

Public Member Functions

 ActsDetectorElement (const InDetDD::SiDetectorElement &detElem)
 
 ActsDetectorElement (const Acts::Transform3 &trf, const InDetDD::TRT_BaseElement &detElem, const Identifier &id)
 Constructor for a straw surface. More...
 
 ActsDetectorElement (const InDetDD::HGTD_DetectorElement &detElem, const Identifier &id)
 Constructor for an HGTD surface. More...
 
virtual ~ActsDetectorElement ()=default
 Destructor. More...
 
Identifier identify () const override final
 Identifier. More...
 
DetectorType detectorType () const override final
 Detector type. More...
 
virtual unsigned int storeAlignedTransforms (const ActsTrk::DetectorAlignStore &alignStore) const override
 Caches the aligned transformation in the provided store. Returns the number of cached elements. More...
 
virtual const Acts::Transform3 & transform (const Acts::GeometryContext &gctx) const final override
 
virtual const Acts::Surface & surface () const final override
 Return surface associated with this identifier, which should come from the. More...
 
virtual Acts::Surface & surface () final override
 Mutable surface to this detector element. More...
 
const Trk::SurfaceatlasSurface () const
 Return a shared pointer on the ATLAS surface associated with this identifier,. More...
 
virtual double thickness () const final override
 Returns the thickness of the module. More...
 
IdentityHelper identityHelper () const
 
const Acts::Transform3 & getDefaultTransform () const
 Returns default transform. More...
 
const GeoVDetectorElement * upstreamDetectorElement () const
 Returns the underllying GeoModel detectorelement that this one is based on. More...
 
Amg::Transform3D transform (const ActsTrk::DetectorAlignStore *store) const
 

Private Attributes

DetectorType m_type {DetectorType::UnDefined}
 
ActsTrk::TransformCacheDetEle< ActsDetectorElementm_trfCache {0, this}
 
const GeoVDetectorElement * m_detElement {nullptr}
 Detector element as variant. More...
 
std::shared_ptr< const Acts::SurfaceBounds > m_bounds {}
 Boundaries of the detector element. More...
 
double m_thickness {0.}
 Thickness of this detector element. More...
 
std::shared_ptr< Acts::Surface > m_surface {}
 Corresponding Surface. More...
 
std::vector< std::shared_ptr< const Acts::Surface > > m_surfaces {}
 
std::unique_ptr< const Amg::Transform3Dm_trtTrf {}
 
Identifier m_explicitIdentifier {}
 

Detailed Description

Definition at line 42 of file ActsDetectorElement.h.

Member Typedef Documentation

◆ AlignmentStore

Definition at line 45 of file ActsDetectorElement.h.

◆ DetectorType

Definition at line 44 of file ActsDetectorElement.h.

Constructor & Destructor Documentation

◆ ActsDetectorElement() [1/3]

ActsDetectorElement::ActsDetectorElement ( const InDetDD::SiDetectorElement detElem)

Definition at line 51 of file ActsDetectorElement.cxx.

51  :
52  GeoVDetectorElement{detElem.getMaterialGeom()},
53  m_type{detElem.isPixel() ? DetectorType::Pixel : DetectorType::Sct},
54  m_detElement{&detElem} {
55 
56 
57  auto boundsType = detElem.bounds().type();
58 
59  m_thickness = detElem.thickness();
60 
61 
62  if (boundsType == Trk::SurfaceBounds::Rectangle) {
63 
64  const InDetDD::SiDetectorDesign &design = detElem.design();
65  double hlX = design.width() / 2. * length_unit;
66  double hlY = design.length() / 2. * length_unit;
67 
68  auto rectangleBounds = std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
69 
70  m_bounds = rectangleBounds;
71  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
72 
73  } else if (boundsType == Trk::SurfaceBounds::Trapezoid) {
74 
75  const InDetDD::SiDetectorDesign &design = detElem.design();
76 
77  double minHlX = design.minWidth() / 2. * length_unit;
78  double maxHlX = design.maxWidth() / 2. * length_unit;
79  double hlY = design.length() / 2. * length_unit;
80 
81  auto trapezoidBounds =
82  std::make_shared<const Acts::TrapezoidBounds>(minHlX, maxHlX, hlY);
83 
84  m_bounds = trapezoidBounds;
85 
86  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(trapezoidBounds, *this);
87 
88 
89  } else if (boundsType == Trk::SurfaceBounds::Annulus) {
90 
91  const InDetDD::SiDetectorDesign &design = detElem.design();
92  const auto *annulus = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *>(&design);
93  if (annulus == nullptr) {
94  throw std::domain_error("ActsDetectorElement got inconsistent surface");
95  }
96 
97  double phi = annulus->phiWidth();
98  double phiS = annulus->stereo();
99  double R = annulus->waferCentreR();
100  double maxR = annulus->maxR();
101  double minR = annulus->minR();
102 
103  // phiAvg is the bounds-internal local rotation. We don't want one
104  double phiAvg = 0;
105  // phi is the total opening angle, set up symmetric phi bounds
106  double phiMax = phi / 2.;
107  double phiMin = -phiMax;
108 
109 
110  Amg::Vector2D originStripXYRotated(R * (1 - std::cos(phiS)),
111  R * std::sin(-phiS));
112 
113  auto annulusBounds = std::make_shared<Acts::AnnulusBounds>(
114  minR, maxR, phiMin, phiMax, originStripXYRotated, phiAvg);
115  m_bounds = annulusBounds;
116 
117  m_surface = Acts::Surface::makeShared<Acts::DiscSurface>(annulusBounds, *this);
118 
119  } else {
120  std::cout << boundsType << std::endl;
121  throw std::domain_error("ActsDetectorElement does not support this surface type");
122  }
123 }

◆ ActsDetectorElement() [2/3]

ActsDetectorElement::ActsDetectorElement ( const Acts::Transform3 &  trf,
const InDetDD::TRT_BaseElement detElem,
const Identifier id 
)

Constructor for a straw surface.

Parameters
transformTransform to the straw system

Definition at line 125 of file ActsDetectorElement.cxx.

127  :
128  GeoVDetectorElement{detElem.getMaterialGeom()},
129  m_type{DetectorType::Trt},
130  m_detElement{&detElem},
131  m_trtTrf{std::make_unique<Amg::Transform3D>(trf)},
133 
134  // we know this is a straw
135  double length = detElem.strawLength() * 0.5 * length_unit;
136 
137  // we need to find the radius
138  auto ecElem = dynamic_cast<const InDetDD::TRT_EndcapElement *>(&detElem);
139  auto brlElem = dynamic_cast<const InDetDD::TRT_BarrelElement *>(&detElem);
140  double innerTubeRadius{0.};
141  if (ecElem) {
142  innerTubeRadius = ecElem->getDescriptor()->innerTubeRadius() * length_unit;
143  } else {
144  if (brlElem) {
145  innerTubeRadius =
146  brlElem->getDescriptor()->innerTubeRadius() * length_unit;
147  } else {
148  THROW_EXCEPTION("Cannot get tube radius for element in ActsDetectorElement c'tor");
149  }
150  }
151 
152  auto lineBounds =
153  std::make_shared<const Acts::LineBounds>(innerTubeRadius, length);
154  m_bounds = lineBounds;
155 
156  m_surface = Acts::Surface::makeShared<Acts::StrawSurface>(lineBounds, *this);
157 }

◆ ActsDetectorElement() [3/3]

ActsDetectorElement::ActsDetectorElement ( const InDetDD::HGTD_DetectorElement detElem,
const Identifier id 
)

Constructor for an HGTD surface.

Definition at line 159 of file ActsDetectorElement.cxx.

159  :
160  GeoVDetectorElement{detElem.getMaterialGeom()},
161  m_type{DetectorType::Hgtd},
162  m_detElement{&detElem},
163  m_thickness{detElem.thickness()},
165 
166  auto boundsType = detElem.bounds().type();
167 
168  if (boundsType == Trk::SurfaceBounds::Rectangle) {
169 
170  const InDetDD::HGTD_ModuleDesign &design = detElem.design();
171  double hlX = design.width() / 2. * length_unit;
172  double hlY = design.length() / 2. * length_unit;
173 
174  auto rectangleBounds =
175  std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
176 
177  m_bounds = rectangleBounds;
178 
179  m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
180 
181  } else {
182  throw std::domain_error(
183  "ActsDetectorElement: the surface type of HGTD is not does not Rectangle, it is wrong");
184  }
185 }

◆ ~ActsDetectorElement()

virtual ActsDetectorElement::~ActsDetectorElement ( )
virtualdefault

Destructor.

Member Function Documentation

◆ atlasSurface()

const Trk::Surface & ActsDetectorElement::atlasSurface ( ) const

Return a shared pointer on the ATLAS surface associated with this identifier,.

Definition at line 259 of file ActsDetectorElement.cxx.

259  {
260  if (const auto *detElem =
261  dynamic_cast<const InDetDD::SiDetectorElement *>(m_detElement);
262  detElem != nullptr) {
263  return detElem->surface();
264  } else {
265  throw std::domain_error("Cannot get surface for TRT element");
266  }
267 }

◆ detectorType()

DetectorType ActsDetectorElement::detectorType ( ) const
finaloverridevirtual

Detector type.

Implements ActsTrk::IDetectorElementBase.

Definition at line 291 of file ActsDetectorElement.cxx.

291 { return m_type; }

◆ getDefaultTransform()

const Acts::Transform3 & ActsDetectorElement::getDefaultTransform ( ) const

Returns default transform.

For TRT this is static and set in constructor. For silicon detectors it is calulated from GM, and stored. Thus the method is not const. The store is mutexed.

Definition at line 247 of file ActsDetectorElement.cxx.

247  {
248  return m_trfCache.getTransform(nullptr);
249 }

◆ identify()

Identifier ActsDetectorElement::identify ( ) const
finaloverridevirtual

Identifier.

Implements ActsTrk::IDetectorElementBase.

Definition at line 271 of file ActsDetectorElement.cxx.

271  {
272  if (const auto *detElem =
273  dynamic_cast<const InDetDD::SiDetectorElement *>(m_detElement);
274  detElem != nullptr) {
275  return detElem->identify();
276  } else if (dynamic_cast<const InDetDD::TRT_BaseElement *>(m_detElement) !=
277  nullptr) {
278  return m_explicitIdentifier;
279  } else if (dynamic_cast<const InDetDD::HGTD_DetectorElement *>(m_detElement) !=
280  nullptr) {
281  return m_explicitIdentifier;
282  } else {
283  THROW_EXCEPTION("Unknown detector element type");
284  }
285 }

◆ identityHelper()

IdentityHelper ActsDetectorElement::identityHelper ( ) const

Definition at line 229 of file ActsDetectorElement.cxx.

229  {
230  if (detectorType() == DetectorType::Pixel || detectorType() == DetectorType::Sct) {
231  return IdentityHelper(static_cast<const InDetDD::SiDetectorElement *>(m_detElement));
232  } else {
233  throw std::domain_error("Cannot get IdentityHelper for TRT element");
234  }
235 }

◆ storeAlignedTransforms()

unsigned int ActsDetectorElement::storeAlignedTransforms ( const ActsTrk::DetectorAlignStore store) const
overridevirtual

Caches the aligned transformation in the provided store. Returns the number of cached elements.

Implements ActsTrk::IDetectorElement.

Definition at line 241 of file ActsDetectorElement.cxx.

241  {
242  if (store.detType != detectorType()) return 0;
243  m_trfCache.getTransform(&store);
244  return 1;
245 }

◆ surface() [1/2]

const Acts::Surface & ActsDetectorElement::surface ( ) const
finaloverridevirtual

Return surface associated with this identifier, which should come from the.

Definition at line 251 of file ActsDetectorElement.cxx.

251  {
252  return (*m_surface);
253 }

◆ surface() [2/2]

Acts::Surface & ActsDetectorElement::surface ( )
finaloverridevirtual

Mutable surface to this detector element.

Definition at line 255 of file ActsDetectorElement.cxx.

255  {
256  return (*m_surface);
257 }

◆ thickness()

double ActsDetectorElement::thickness ( ) const
finaloverridevirtual

Returns the thickness of the module.

Definition at line 269 of file ActsDetectorElement.cxx.

269 { return m_thickness; }

◆ transform() [1/2]

const Acts::Transform3 & ActsDetectorElement::transform ( const Acts::GeometryContext &  gctx) const
finaloverridevirtual

Definition at line 237 of file ActsDetectorElement.cxx.

237  {
238  return m_trfCache.transform(anygctx);
239 }

◆ transform() [2/2]

Amg::Transform3D ActsDetectorElement::transform ( const ActsTrk::DetectorAlignStore store) const

Pixel or Sct

Definition at line 187 of file ActsDetectorElement.cxx.

187  {
188 
189  GeoAlignmentStore* geoModelStore = store ? store->geoModelAlignment.get() : nullptr;
190  Amg::Transform3D l2g{Amg::Transform3D::Identity()};
191  switch (m_type) {
192  case DetectorType::Hgtd:{
193  l2g= m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore);
194  break;
195  } case DetectorType::Trt: {
196  l2g = (*m_trtTrf);
197  break;
198  }
200  default: {
201  const auto& detElem = static_cast<const InDetDD::SiDetectorElement&>(*m_detElement);
202  const InDetDD::SiDetectorDesign&design = detElem.design();
203  const Trk::SurfaceBounds::BoundsType boundsType = detElem.bounds().type();
204 
205  // extra shift for split row modules
206  Amg::Transform3D extraTransform{Amg::CLHEPTransformToEigen(detElem.recoToHitTransform())};
207  if (boundsType == Trk::SurfaceBounds::Rectangle &&
208  typeid(design) == typeid(InDetDD::StripBoxDesign) ) {
209  extraTransform = design.moduleShift() * extraTransform;
210  } else if (boundsType == Trk::SurfaceBounds::Annulus) {
211  // need to rotate pi/2 to reproduce ABXY orientation, phiS so that phi=0
212  // is center and symmetric
213  const double phiShift = M_PI_2 - static_cast<const InDetDD::StripStereoAnnulusDesign&>(design).stereo();
214 
215  const Amg::Vector2D origin2D = static_cast<const Acts::AnnulusBounds&>(m_surface->bounds()).moduleOrigin();
216  const Amg::Translation3D transl{origin2D.x(), origin2D.y(), 0};
217  const Amg::Transform3D originTrf{transl * Amg::getRotateZ3D(-phiShift)};
218  extraTransform = extraTransform * originTrf.inverse();
219  }
220  l2g = m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore) * extraTransform;
221  }
222  };
223  // need to make sure translation has correct units
224  l2g.translation() *= 1.0 / CLHEP::mm * length_unit;
225 
226  return l2g;
227 
228 }

◆ upstreamDetectorElement()

const GeoVDetectorElement * ActsDetectorElement::upstreamDetectorElement ( ) const

Returns the underllying GeoModel detectorelement that this one is based on.

Definition at line 288 of file ActsDetectorElement.cxx.

288  {
289  return m_detElement;
290 }

Member Data Documentation

◆ m_bounds

std::shared_ptr<const Acts::SurfaceBounds> ActsDetectorElement::m_bounds {}
private

Boundaries of the detector element.

Definition at line 109 of file ActsDetectorElement.h.

◆ m_detElement

const GeoVDetectorElement* ActsDetectorElement::m_detElement {nullptr}
private

Detector element as variant.

Definition at line 107 of file ActsDetectorElement.h.

◆ m_explicitIdentifier

Identifier ActsDetectorElement::m_explicitIdentifier {}
private

Definition at line 118 of file ActsDetectorElement.h.

◆ m_surface

std::shared_ptr<Acts::Surface> ActsDetectorElement::m_surface {}
private

Corresponding Surface.

Definition at line 113 of file ActsDetectorElement.h.

◆ m_surfaces

std::vector<std::shared_ptr<const Acts::Surface> > ActsDetectorElement::m_surfaces {}
private

Definition at line 114 of file ActsDetectorElement.h.

◆ m_thickness

double ActsDetectorElement::m_thickness {0.}
private

Thickness of this detector element.

Definition at line 111 of file ActsDetectorElement.h.

◆ m_trfCache

ActsTrk::TransformCacheDetEle<ActsDetectorElement> ActsDetectorElement::m_trfCache {0, this}
private

Definition at line 105 of file ActsDetectorElement.h.

◆ m_trtTrf

std::unique_ptr<const Amg::Transform3D> ActsDetectorElement::m_trtTrf {}
private

Definition at line 116 of file ActsDetectorElement.h.

◆ m_type

DetectorType ActsDetectorElement::m_type {DetectorType::UnDefined}
private

Definition at line 103 of file ActsDetectorElement.h.


The documentation for this class was generated from the following files:
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:103
InDetDD::TRT_BaseElement::strawLength
virtual const double & strawLength() const =0
Active straw length.
InDetDD::TRT_BarrelElement
Definition: TRT_BarrelElement.h:44
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
InDetDD::DetectorDesign::moduleShift
virtual const Amg::Transform3D moduleShift() const
Definition: DetectorDesign.cxx:130
ActsDetectorElement::m_detElement
const GeoVDetectorElement * m_detElement
Detector element as variant.
Definition: ActsDetectorElement.h:107
Amg::Vector2D
Eigen::Matrix< double, 2, 1 > Vector2D
Definition: GeoPrimitives.h:48
Trk::SurfaceBounds::Rectangle
@ Rectangle
Definition: SurfaceBounds.h:65
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.
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:291
drawFromPickle.cos
cos
Definition: drawFromPickle.py:36
THROW_EXCEPTION
#define THROW_EXCEPTION(MSG)
Definition: MMReadoutElement.cxx:48
length_unit
constexpr double length_unit
Definition: ActsDetectorElement.cxx:49
InDetDD::TRT_BarrelDescriptor::innerTubeRadius
double innerTubeRadius() const
Get inner tube radius of the straw.
ActsDetectorElement::m_trtTrf
std::unique_ptr< const Amg::Transform3D > m_trtTrf
Definition: ActsDetectorElement.h:116
InDetDD::HGTD_ModuleDesign::length
virtual double length() const
Method to calculate length of a module.
Definition: HGTD_ModuleDesign.cxx:65
InDetDD::HGTD_DetectorElement::design
const HGTD_ModuleDesign & design() const override final
access to the local description:
Definition: HGTD_DetectorElement.h:121
Amg::getRotateZ3D
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Definition: GeoPrimitivesHelpers.h:270
ActsDetectorElement::m_bounds
std::shared_ptr< const Acts::SurfaceBounds > m_bounds
Boundaries of the detector element.
Definition: ActsDetectorElement.h:109
Trk::SurfaceBounds::type
virtual BoundsType type() const =0
Return the bounds type - for persistency optimization.
ActsTrk::DetectorType::Pixel
@ Pixel
Inner detector legacy.
InDetDD::SolidStateDetectorElementBase::thickness
double thickness() const
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
InDetDD::StripStereoAnnulusDesign
Definition: StripStereoAnnulusDesign.h:50
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ActsDetectorElement::m_surface
std::shared_ptr< Acts::Surface > m_surface
Corresponding Surface.
Definition: ActsDetectorElement.h:113
InDetDD::SolidStateDetectorElementBase::bounds
virtual const Trk::SurfaceBounds & bounds() const override final
Return the boundaries of the element.
Definition: SolidStateDetectorElementBase.cxx:198
AnalysisUtils::Delta::R
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)
Definition: AnalysisMisc.h:49
InDetDD::DetectorDesign::maxWidth
virtual double maxWidth() const =0
Method to calculate maximum width of a module.
InDetDD::SiDetectorElement::isPixel
bool isPixel() const
InDetDD::DetectorDesign::bounds
virtual const Trk::SurfaceBounds & bounds() const =0
Element boundary.
ActsDetectorElement::m_thickness
double m_thickness
Thickness of this detector element.
Definition: ActsDetectorElement.h:111
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
Trk::SurfaceBounds::Trapezoid
@ Trapezoid
Definition: SurfaceBounds.h:67
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
ActsDetectorElement::m_trfCache
ActsTrk::TransformCacheDetEle< ActsDetectorElement > m_trfCache
Definition: ActsDetectorElement.h:105
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:118
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
InDetDD::HGTD_ModuleDesign
Definition: HGTD_ModuleDesign.h:43
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
InDetDD::SiDetectorElement::design
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
length
double length(const pvec &v)
Definition: FPGATrackSimLLPDoubletHoughTransformTool.cxx:26
InDetDD::TRT_BaseElement
Definition: TRT_BaseElement.h:57