ATLAS Offline Software
Loading...
Searching...
No Matches
ActsDetectorElement Class Reference

#include <ActsDetectorElement.h>

Inheritance diagram for ActsDetectorElement:
Collaboration diagram for ActsDetectorElement:

Public Types

using DetectorType = ActsTrk::DetectorType
using AlignmentStore = ActsTrk::GeometryContext::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.
 ActsDetectorElement (const InDetDD::HGTD_DetectorElement &detElem, const Identifier &id)
 Constructor for an HGTD surface.
virtual ~ActsDetectorElement ()=default
 Destructor.
Identifier identify () const override final
 Identifier.
DetectorType detectorType () const override final
 Detector type.
IdentifierHash identifyHash () const
 Identifier hash.
virtual unsigned int storeAlignedTransforms (const ActsTrk::DetectorAlignStore &alignStore) const override
 Caches the aligned transformation in the provided store. Returns the number of cached elements.
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.
virtual Acts::Surface & surface () final override
 Mutable surface to this detector element.
const Trk::SurfaceatlasSurface () const
 Return a shared pointer on the ATLAS surface associated with this identifier,.
virtual double thickness () const final override
 Returns the thickness of the module.
IdentityHelper identityHelper () const
const Acts::Transform3 & getDefaultTransform () const
 Returns default transform.
const GeoVDetectorElement * upstreamDetectorElement () const
 Returns the underllying GeoModel detectorelement that this one is based on.
Amg::Transform3D transform (const ActsTrk::DetectorAlignStore *store) const

Private Attributes

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

Detailed Description

Definition at line 44 of file ActsDetectorElement.h.

Member Typedef Documentation

◆ AlignmentStore

◆ DetectorType

Constructor & Destructor Documentation

◆ ActsDetectorElement() [1/3]

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

Definition at line 53 of file ActsDetectorElement.cxx.

53 :
54 GeoVDetectorElement{detElem.getMaterialGeom()},
55 m_idHash(detElem.identifyHash()),
56 m_type{detElem.isPixel() ? DetectorType::Pixel : DetectorType::Sct},
57 m_detElement{&detElem},
59{
60
61
62 auto boundsType = detElem.bounds().type();
63
64 m_thickness = detElem.thickness();
65
66
67 if (boundsType == Trk::SurfaceBounds::Rectangle) {
68
69 const InDetDD::SiDetectorDesign &design = detElem.design();
70 double hlX = design.width() / 2. * length_unit;
71 double hlY = design.length() / 2. * length_unit;
72
73 auto rectangleBounds = std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
74
75 m_bounds = rectangleBounds;
76 m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
77
78 } else if (boundsType == Trk::SurfaceBounds::Trapezoid) {
79
80 const InDetDD::SiDetectorDesign &design = detElem.design();
81
82 double minHlX = design.minWidth() / 2. * length_unit;
83 double maxHlX = design.maxWidth() / 2. * length_unit;
84 double hlY = design.length() / 2. * length_unit;
85
86 auto trapezoidBounds =
87 std::make_shared<const Acts::TrapezoidBounds>(minHlX, maxHlX, hlY);
88
89 m_bounds = trapezoidBounds;
90
91 m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(trapezoidBounds, *this);
92
93
94 } else if (boundsType == Trk::SurfaceBounds::Annulus) {
95
96 const InDetDD::SiDetectorDesign &design = detElem.design();
97 const auto *annulus = dynamic_cast<const InDetDD::StripStereoAnnulusDesign *>(&design);
98 if (annulus == nullptr) {
99 throw std::domain_error("ActsDetectorElement got inconsistent surface");
100 }
101
102 double phi = annulus->phiWidth();
103 double phiS = annulus->stereo();
104 double R = annulus->waferCentreR();
105 double maxR = annulus->maxR();
106 double minR = annulus->minR();
107
108 // phiAvg is the bounds-internal local rotation. We don't want one
109 double phiAvg = 0;
110 // phi is the total opening angle, set up symmetric phi bounds
111 double phiMax = phi / 2.;
112 double phiMin = -phiMax;
113
114
115 Amg::Vector2D originStripXYRotated(R * (1 - std::cos(phiS)),
116 R * std::sin(-phiS));
117
118 auto annulusBounds = std::make_shared<Acts::AnnulusBounds>(
119 minR, maxR, phiMin, phiMax, originStripXYRotated, phiAvg);
120 m_bounds = annulusBounds;
121
122 m_surface = Acts::Surface::makeShared<Acts::DiscSurface>(annulusBounds, *this);
123
124 } else {
125 std::cout << boundsType << std::endl;
126 throw std::domain_error("ActsDetectorElement does not support this surface type");
127 }
128}
constexpr double length_unit
Scalar phi() const
phi method
double m_thickness
Thickness of this detector element.
std::shared_ptr< const Acts::SurfaceBounds > m_bounds
Boundaries of the detector element.
std::shared_ptr< Acts::Surface > m_surface
Corresponding Surface.
const GeoVDetectorElement * m_detElement
Detector element as variant.
virtual double maxWidth() const =0
Method to calculate maximum width of a module.
virtual double minWidth() const =0
Method to calculate minimum width of a module.
virtual double length() const =0
Method to calculate length of a module.
virtual double width() const =0
Method to calculate average width of a module.
virtual const SiDetectorDesign & design() const override final
access to the local description (inline):
virtual IdentifierHash identifyHash() const override final
identifier hash (inline)
virtual const Trk::SurfaceBounds & bounds() const override final
Return the boundaries of the element.
virtual Identifier identify() const override final
identifier of this detector element (inline)
virtual BoundsType type() const =0
Return the bounds type - for persistency optimization.
Eigen::Matrix< double, 2, 1 > Vector2D
double R(const INavigable4Momentum *p1, const double v_eta, const double v_phi)

◆ 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 130 of file ActsDetectorElement.cxx.

132 :
133 GeoVDetectorElement{detElem.getMaterialGeom()},
134 m_idHash(detElem.identifyHash()),
135 m_type{DetectorType::Trt},
136 m_detElement{&detElem},
137 m_trtTrf{std::make_unique<Amg::Transform3D>(trf)},
139{
140
141
142 // we know this is a straw
143 double length = detElem.strawLength() * 0.5 * length_unit;
144
145 // we need to find the radius
146 auto ecElem = dynamic_cast<const InDetDD::TRT_EndcapElement *>(&detElem);
147 auto brlElem = dynamic_cast<const InDetDD::TRT_BarrelElement *>(&detElem);
148 double innerTubeRadius{0.};
149 if (ecElem) {
150 innerTubeRadius = ecElem->getDescriptor()->innerTubeRadius() * length_unit;
151 } else {
152 if (brlElem) {
153 innerTubeRadius =
154 brlElem->getDescriptor()->innerTubeRadius() * length_unit;
155 } else {
156 THROW_EXCEPTION("Cannot get tube radius for element in ActsDetectorElement c'tor");
157 }
158 }
159
160 auto lineBounds =
161 std::make_shared<const Acts::LineBounds>(innerTubeRadius, length);
162 m_bounds = lineBounds;
163
164 m_surface = Acts::Surface::makeShared<Acts::StrawSurface>(lineBounds, *this);
165}
double length(const pvec &v)
std::unique_ptr< const Amg::Transform3D > m_trtTrf
virtual const double & strawLength() const =0
Active straw length.
virtual IdentifierHash identifyHash() const override final
identifier hash
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10

◆ ActsDetectorElement() [3/3]

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

Constructor for an HGTD surface.

Definition at line 167 of file ActsDetectorElement.cxx.

167 :
168 GeoVDetectorElement{detElem.getMaterialGeom()},
169 m_idHash(detElem.identifyHash()),
170 m_type{DetectorType::Hgtd},
171 m_detElement{&detElem},
172 m_thickness{detElem.thickness()},
174{
175
176 auto boundsType = detElem.bounds().type();
177
178 if (boundsType == Trk::SurfaceBounds::Rectangle) {
179
180 const InDetDD::HGTD_ModuleDesign &design = detElem.design();
181 double hlX = design.width() / 2. * length_unit;
182 double hlY = design.length() / 2. * length_unit;
183
184 auto rectangleBounds =
185 std::make_shared<const Acts::RectangleBounds>(hlX, hlY);
186
187 m_bounds = rectangleBounds;
188
189 m_surface = Acts::Surface::makeShared<Acts::PlaneSurface>(rectangleBounds, *this);
190
191 } else {
192 throw std::domain_error(
193 "ActsDetectorElement: the surface type of HGTD is not does not Rectangle, it is wrong");
194 }
195}
const HGTD_ModuleDesign & design() const override final
access to the local description:
virtual double width() const
Method to calculate average width of a module.
virtual double length() const
Method to calculate length of a module.

◆ ~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 269 of file ActsDetectorElement.cxx.

269 {
270 if (const auto *detElem =
271 dynamic_cast<const InDetDD::SiDetectorElement *>(m_detElement);
272 detElem != nullptr) {
273 return detElem->surface();
274 } else {
275 throw std::domain_error("Cannot get surface for TRT element");
276 }
277}

◆ detectorType()

DetectorType ActsDetectorElement::detectorType ( ) const
finaloverridevirtual

Detector type.

Implements ActsTrk::IDetectorElementBase.

Definition at line 289 of file ActsDetectorElement.cxx.

289{ 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 257 of file ActsDetectorElement.cxx.

257 {
258 return m_trfCache.getTransform(nullptr);
259}
ActsTrk::TransformCacheDetEle< ActsDetectorElement > m_trfCache

◆ identify()

Identifier ActsDetectorElement::identify ( ) const
finaloverridevirtual

Identifier.

Implements ActsTrk::IDetectorElementBase.

Definition at line 281 of file ActsDetectorElement.cxx.

281 {
283}

◆ identifyHash()

IdentifierHash ActsDetectorElement::identifyHash ( ) const
inline

Identifier hash.

Definition at line 75 of file ActsDetectorElement.h.

75{ return m_idHash; }

◆ identityHelper()

IdentityHelper ActsDetectorElement::identityHelper ( ) const

Definition at line 239 of file ActsDetectorElement.cxx.

239 {
240 if (detectorType() == DetectorType::Pixel || detectorType() == DetectorType::Sct) {
241 return IdentityHelper(static_cast<const InDetDD::SiDetectorElement *>(m_detElement));
242 } else {
243 throw std::domain_error("Cannot get IdentityHelper for TRT element");
244 }
245}
DetectorType detectorType() const override final
Detector type.

◆ 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 251 of file ActsDetectorElement.cxx.

251 {
252 if (store.detType != detectorType()) return 0;
253 m_trfCache.getTransform(&store);
254 return 1;
255}
TestStore store
Definition TestStore.cxx:23

◆ surface() [1/2]

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

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

Definition at line 261 of file ActsDetectorElement.cxx.

261 {
262 return (*m_surface);
263}

◆ surface() [2/2]

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

Mutable surface to this detector element.

Definition at line 265 of file ActsDetectorElement.cxx.

265 {
266 return (*m_surface);
267}

◆ thickness()

double ActsDetectorElement::thickness ( ) const
finaloverridevirtual

Returns the thickness of the module.

Definition at line 279 of file ActsDetectorElement.cxx.

279{ return m_thickness; }

◆ transform() [1/2]

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

Definition at line 247 of file ActsDetectorElement.cxx.

247 {
248 return m_trfCache.transform(anygctx);
249}

◆ transform() [2/2]

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

Pixel or Sct

Definition at line 197 of file ActsDetectorElement.cxx.

197 {
198
199 GeoAlignmentStore* geoModelStore = store ? store->geoModelAlignment.get() : nullptr;
200 Amg::Transform3D l2g{Amg::Transform3D::Identity()};
201 switch (m_type) {
202 case DetectorType::Hgtd:{
203 l2g= m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore);
204 break;
205 } case DetectorType::Trt: {
206 l2g = (*m_trtTrf);
207 break;
208 }
210 default: {
211 const auto& detElem = static_cast<const InDetDD::SiDetectorElement&>(*m_detElement);
212 const InDetDD::SiDetectorDesign&design = detElem.design();
213 const Trk::SurfaceBounds::BoundsType boundsType = detElem.bounds().type();
214
215 // extra shift for split row modules
216 Amg::Transform3D extraTransform{Amg::CLHEPTransformToEigen(detElem.recoToHitTransform())};
217 if (boundsType == Trk::SurfaceBounds::Rectangle &&
218 typeid(design) == typeid(InDetDD::StripBoxDesign) ) {
219 extraTransform = design.moduleShift() * extraTransform;
220 } else if (boundsType == Trk::SurfaceBounds::Annulus) {
221 // need to rotate pi/2 to reproduce ABXY orientation, phiS so that phi=0
222 // is center and symmetric
223 const double phiShift = M_PI_2 - static_cast<const InDetDD::StripStereoAnnulusDesign&>(design).stereo();
224
225 const Amg::Vector2D origin2D = static_cast<const Acts::AnnulusBounds&>(m_surface->bounds()).moduleOrigin();
226 const Amg::Translation3D transl{origin2D.x(), origin2D.y(), 0};
227 const Amg::Transform3D originTrf{transl * Amg::getRotateZ3D(-phiShift)};
228 extraTransform = extraTransform * originTrf.inverse();
229 }
230 l2g = m_detElement->getMaterialGeom()->getAbsoluteTransform(geoModelStore) * extraTransform;
231 }
232 };
233 // need to make sure translation has correct units
234 l2g.translation() *= 1.0 / CLHEP::mm * length_unit;
235
236 return l2g;
237
238}
virtual const Amg::Transform3D moduleShift() const
BoundsType
This enumerator simplifies the persistency, by saving a dynamic_cast to happen.
Amg::Transform3D CLHEPTransformToEigen(const HepGeom::Transform3D &CLHEPtransf)
Converts a CLHEP-based HepGeom::Transform3D into an Eigen Amg::Transform3D.
Amg::Transform3D getRotateZ3D(double angle)
get a rotation transformation around Z-axis
Eigen::Affine3d Transform3D
Eigen::Translation< double, 3 > Translation3D

◆ upstreamDetectorElement()

const GeoVDetectorElement * ActsDetectorElement::upstreamDetectorElement ( ) const

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

Definition at line 286 of file ActsDetectorElement.cxx.

286 {
287 return m_detElement;
288}

Member Data Documentation

◆ m_bounds

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

Boundaries of the detector element.

Definition at line 114 of file ActsDetectorElement.h.

114{};

◆ m_detElement

const GeoVDetectorElement* ActsDetectorElement::m_detElement {nullptr}
private

Detector element as variant.

Definition at line 112 of file ActsDetectorElement.h.

112{nullptr};

◆ m_explicitIdentifier

Identifier ActsDetectorElement::m_explicitIdentifier {}
private

Definition at line 122 of file ActsDetectorElement.h.

122{};

◆ m_idHash

IdentifierHash ActsDetectorElement::m_idHash {}
private

Definition at line 108 of file ActsDetectorElement.h.

108{};

◆ m_surface

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

Corresponding Surface.

Definition at line 118 of file ActsDetectorElement.h.

118{};

◆ m_thickness

double ActsDetectorElement::m_thickness {0.}
private

Thickness of this detector element.

Definition at line 116 of file ActsDetectorElement.h.

116{0.};

◆ m_trfCache

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

Definition at line 110 of file ActsDetectorElement.h.

110{0, this};

◆ m_trtTrf

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

Definition at line 120 of file ActsDetectorElement.h.

120{};

◆ m_type

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

Definition at line 109 of file ActsDetectorElement.h.

109{DetectorType::UnDefined};

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