12#include <boost/container/flat_set.hpp>
16#include "Acts/Geometry/GeometryIdentifier.hpp"
17#include "Tracking/Sim/GroupBy.h"
18#include "Tracking/Sim/Range.h"
20namespace acts_examples {
26 constexpr Acts::GeometryIdentifier operator()(
27 Acts::GeometryIdentifier geometryId)
const {
31 constexpr Acts::GeometryIdentifier operator()(
32 Acts::GeometryIdentifier::Value encoded)
const {
33 return Acts::GeometryIdentifier(encoded);
37 constexpr Acts::GeometryIdentifier operator()(
38 const std::pair<Acts::GeometryIdentifier, T>& mapItem)
const {
43 inline auto operator()(
const T& thing)
const
44 ->
decltype(thing.geometryId(), Acts::GeometryIdentifier()) {
45 return thing.geometryId();
49 inline auto operator()(std::reference_wrapper<T> thing)
const
50 ->
decltype(thing.get().geometryId(), Acts::GeometryIdentifier()) {
51 return thing.get().geometryId();
57 using is_transparent = void;
59 template <
typename Left,
typename Right>
60 constexpr bool operator()(Left&& lhs, Right&& rhs)
const {
78using GeometryIdMultiset =
79 boost::container::flat_multiset<T, detail::CompareGeometryId>;
95using GeometryIdMultimap =
96 GeometryIdMultiset<std::pair<Acts::GeometryIdentifier, T>>;
101selectVolume(
const GeometryIdMultiset<T>& container,
102 Acts::GeometryIdentifier::Value volume) {
103 auto cmp = Acts::GeometryIdentifier().withVolume(volume);
104 auto beg = std::lower_bound(container.begin(), container.end(), cmp,
107 cmp = Acts::GeometryIdentifier().withVolume(volume + 1u);
113 return makeRange(beg, end);
118inline auto selectVolume(
const GeometryIdMultiset<T>& container,
119 Acts::GeometryIdentifier
id) {
120 return selectVolume(container,
id.volume());
126selectLayer(
const GeometryIdMultiset<T>& container,
127 Acts::GeometryIdentifier::Value volume,
128 Acts::GeometryIdentifier::Value layer) {
129 auto cmp = Acts::GeometryIdentifier().withVolume(volume).withLayer(layer);
130 auto beg = std::lower_bound(container.begin(), container.end(), cmp,
131 detail::CompareGeometryId{});
133 cmp = Acts::GeometryIdentifier().withVolume(volume).withLayer(layer + 1u);
138 std::lower_bound(beg, container.end(), cmp, detail::CompareGeometryId{});
139 return makeRange(beg, end);
144inline auto selectLayer(
const GeometryIdMultiset<T>& container,
145 Acts::GeometryIdentifier
id) {
146 return selectLayer(container,
id.volume(),
id.layer());
152selectModule(
const GeometryIdMultiset<T>& container,
153 Acts::GeometryIdentifier geoId) {
155 return makeRange(container.equal_range(geoId));
160inline auto selectModule(
const GeometryIdMultiset<T>& container,
161 Acts::GeometryIdentifier::Value volume,
162 Acts::GeometryIdentifier::Value layer,
163 Acts::GeometryIdentifier::Value module_) {
164 return selectModule(container, Acts::GeometryIdentifier()
167 .withSensitive(module_));
188selectLowestNonZeroGeometryObject(
const GeometryIdMultiset<T>& container,
189 Acts::GeometryIdentifier geoId) {
190 assert((geoId.boundary() == 0u) and
"Boundary component must be zero");
191 assert((geoId.approach() == 0u) and
"Approach component must be zero");
193 if (geoId.sensitive() != 0u) {
194 return selectModule(container, geoId);
195 }
else if (geoId.layer() != 0u) {
196 return selectLayer(container, geoId);
197 }
else if (geoId.volume() != 0u) {
198 return selectVolume(container, geoId);
200 return makeRange(container.begin(), container.end());
208 detail::GeometryIdGetter>
209groupByModule(
const GeometryIdMultiset<T>& container) {
210 return makeGroupBy(container, detail::GeometryIdGetter());
219 using Container = GeometryIdMultiset<T>;
220 using Key = Acts::GeometryIdentifier;
221 using Value =
typename GeometryIdMultiset<T>::value_type;
222 using Iterator =
typename GeometryIdMultiset<T>::const_iterator;
225 const Container* container_ =
nullptr;
Proxy for iterating over groups of elements within a container.
A wrapper around a pair of iterators to simplify range-based loops.
The accessor for the GeometryIdMultiset container.