ATLAS Offline Software
Loading...
Searching...
No Matches
VolumePlacement.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4#ifndef SIMULATIONBASE
6#include "GeoModelHelpers/GeoDeDuplicator.h"
7
8#include <cassert>
9namespace ActsTrk{
10 //#################################################################################
11 // VolumePlacement::AlignedCache
12 //#################################################################################
19 const std::size_t portalIdx):
20 ActsTrk::TransformCacheBase(portalIdx, parent->detectorType()),
21 m_parent{parent} {}
22
24 switch (m_flags) {
26 return m_parent->localToGlobalTransform(store);
28 return m_parent->localToGlobalTransform(store) *
29 m_parent->portalPlacement(hash())->portalToVolumeCenter();
31 return m_parent->localToGlobalTransform(store).inverse();
32 }
33 }
34 return Amg::Transform3D::Identity();
35 }
36 //#################################################################################
37 // VolumePlacement
38 //#################################################################################
40 const AlignableNode_t parentNode,
41 std::optional<Amg::Transform3D> addShift):
42 m_parent{parentNode},
43 m_locToGlobCache{std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeLocToGlob, detType, this)},
44 m_globToLocCache{std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeGlobToLoc, detType, this)} {
45 if (!addShift) {
46 return;
47 }
48 m_refShift = GeoDeDuplicator{}.makeTransform(*addShift);
49 }
50 void VolumePlacement::addChild(std::unique_ptr<VolumePlacement>&& child){
51 assert(child.get() != this);
52 assert(child != nullptr);
53 m_children.push_back(std::move(child));
54 }
56 std::optional<Amg::Transform3D> addShift):
57 m_parent{&parentElement},
58 m_globToLocCache{std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeGlobToLoc,
59 parentElement.detectorType(), this)} {
60 if (!addShift) {
61 return;
62 }
63 m_locToGlobCache = std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeLocToGlob,
64 parentElement.detectorType(), this);
65 m_refShift = GeoDeDuplicator{}.makeTransform(*addShift);
66
67 }
68
70 std::optional<Amg::Transform3D> addShift):
71 m_parent{&parentPlacement}{
72 if (!addShift) {
73 return;
74 }
75 m_locToGlobCache = std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeLocToGlob,
76 parentPlacement.detectorType(), this);
77 m_globToLocCache = std::make_unique<AlignedCache>(AlignedCache::CacheFlags::volumeGlobToLoc,
78 parentPlacement.detectorType(), this);
79 m_refShift = GeoDeDuplicator{}.makeTransform(*addShift);
80
81 }
82
83 void VolumePlacement::makePortalsAlignable(const Acts::GeometryContext& gctx,
84 const std::vector<std::shared_ptr<Acts::RegularSurface>>& portalsToAlign) {
85 Acts::VolumePlacementBase::makePortalsAlignable(gctx, portalsToAlign);
86 for (std::size_t p = 0ul; p < portalsToAlign.size(); ++p) {
87 m_portalCaches.emplace_back(std::make_unique<AlignedCache>(this, p));
88 }
89 }
90
91 const Acts::Transform3& VolumePlacement::localToGlobalTransform(const Acts::GeometryContext& gctx) const {
92 if (!m_locToGlobCache) {
93 if (std::holds_alternative<const IDetectorElementBase*>(m_parent)){
94 return std::get<const IDetectorElementBase*>(m_parent)->localToGlobalTransform(gctx);
95 } else if (std::holds_alternative<const VolumePlacement*>(m_parent)) {
96 return std::get<const VolumePlacement*>(m_parent)->localToGlobalTransform(gctx);
97 } else {
98 THROW_EXCEPTION("A VolumePlacement without cache && alignable trf should never happen");
99 }
100 }
101 return m_locToGlobCache->getTransform(gctx);
102 }
106 const Acts::Transform3& VolumePlacement::globalToLocalTransform(const Acts::GeometryContext& gctx) const{
107 // The only configuration without glob -> loc cache is a parent volume placement
108 if (!m_globToLocCache) {
109 return std::get<const VolumePlacement*>(m_parent)->globalToLocalTransform(gctx);
110 }
111 return m_globToLocCache->getTransform(gctx);
112 }
116
117 const Acts::Transform3& VolumePlacement::portalLocalToGlobal(const Acts::GeometryContext& gctx,
118 const std::size_t portalIdx) const {
119 return portalIdx < m_portalCaches.size() ?
120 m_portalCaches.at(portalIdx)->getTransform(gctx) : localToGlobalTransform(gctx);
121 }
122 void VolumePlacement::connectCenterSurface(std::shared_ptr<Acts::RegularSurface> surface) {
123 if (m_surfacePlacement) {
124 THROW_EXCEPTION("Center surface already defined");
125 }
126 m_surfacePlacement = std::make_unique<Acts::detail::PortalPlacement>(std::numeric_limits<std::size_t>::max(),
127 Amg::Transform3D::Identity(), this,
128 surface);
129 }
131 if (m_locToGlobCache){
132 return m_locToGlobCache->detectorType();
133 }
134 return std::visit([](const auto& parent) {
135 using visit_t = std::decay_t<decltype(parent)>;
136 if constexpr(!std::is_same_v<visit_t, AlignableNode_t>) {
137 return parent->detectorType();
138 }
140 }, m_parent);
141 }
142
144 return std::visit([&](const auto& parent) -> Amg::Transform3D {
145 using visit_t = std::decay_t<decltype(parent)>;
146 if constexpr(std::is_same_v<visit_t, AlignableNode_t>) {
147 return parent->getTransform(store ? store->geoModelAlignment.get() : nullptr);
148 } else {
149 return parent->localToGlobalTransform(store);
150 }
151 return Amg::Transform3D::Identity();
152 }, m_parent) * (m_refShift ? m_refShift->getDefTransform()
153 : Amg::Transform3D::Identity());
154 }
155
157 unsigned n{0};
158 for (const std::unique_ptr<VolumePlacement>& child : m_children) {
159 n+=child->storeAlignedTransforms(store);
160 }
161 if (store.detType != detectorType()) {
162 return n;
163 }
164 for (const AlignedCache* volCache : {m_locToGlobCache.get(), m_globToLocCache.get()}) {
165 if (!volCache) {
166 continue;
167 }
168 volCache->getTransform(&store);
169 ++n;
170 }
171 for (const std::unique_ptr<AlignedCache>& cache: m_portalCaches) {
172 cache->getTransform(&store);
173 ++n;
174 }
175 return n;
176 }
177}
178#endif
Acts::GeometryContext context() const
base class interface providing the bare minimal interface extension.
virtual DetectorType detectorType() const =0
Returns the detector element type.
TransformCacheBase(const IdentifierHash &cacheHash, const DetectorType type)
IdentifierHash hash() const
Returns the sensor hash of this transformation cache.
DetectorType detectorType() const
returns the detector type of the cache
Auxiliary class to store the aligned transforms of the volume and of the associated portals.
virtual Amg::Transform3D fetchTransform(const DetectorAlignStore *store) const override
Fetch the transform to store it in the detector alignment cache.
const VolumePlacement * m_parent
Back reference to the parent VolumePlacement.
CacheFlags m_flags
Flags to indicate which transform type is handled.
CacheFlags
Flag to indicate which kind of transform is handled by the AlignedCache.
AlignedCache(const CacheFlags flags, const DetectorType type, const VolumePlacement *parent)
Constructor for the cache storing the of the volume itself.
std::unique_ptr< AlignedCache > m_globToLocCache
Cache to handle the global -> local transform of the volume.
std::vector< std::unique_ptr< AlignedCache > > m_portalCaches
Cache to handle the local -> global transforms of the associated portals.
const Acts::Transform3 & globalToLocalTransform(const Acts::GeometryContext &gctx) const override final
GeoIntrusivePtr< GeoAlignableTransform > AlignableNode_t
Abrivation of an alignable GeoTransform.
Parent_t m_parent
Parent element which is following the alignment.
const Acts::Transform3 & localToGlobalTransform(const Acts::GeometryContext &gctx) const override final
std::unique_ptr< Acts::detail::PortalPlacement > m_surfacePlacement
Pipe the local -> global transform to a surface.
VolumePlacement(const DetectorType detType, const AlignableNode_t parentNode, std::optional< Amg::Transform3D > addShift=std::nullopt)
Constructor taking an Alignable transform from the geometry tree.
GeoIntrusivePtr< GeoTransform > m_refShift
Additional shift on top of the parent position.
void addChild(std::unique_ptr< VolumePlacement > &&child)
Add a child volume placement to this placement.
std::vector< std::unique_ptr< VolumePlacement > > m_children
Children spawning from this VolumePlacement.
unsigned storeAlignedTransforms(const DetectorAlignStore &store) const override final
DetectorType detectorType() const override final
void makePortalsAlignable(const Acts::GeometryContext &gctx, const std::vector< std::shared_ptr< Acts::RegularSurface > > &portalsToAlign) override final
const Acts::Transform3 & portalLocalToGlobal(const Acts::GeometryContext &gctx, const std::size_t portalIdx) const override final
std::unique_ptr< AlignedCache > m_locToGlobCache
Cache to handle the local -> global transform of the volume.
void connectCenterSurface(std::shared_ptr< Acts::RegularSurface > surface)
Connect an external surface and place it into the volume center.
This is a "hash" representation of an Identifier.
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
DetectorType
Simple enum to Identify the Type of the ACTS sub detector.
@ UnDefined
Small Thing Gap chambers (NSW)
Eigen::Affine3d Transform3D
STL namespace.
#define THROW_EXCEPTION(MESSAGE)
Definition throwExcept.h:10