12#include <boost/container/flat_map.hpp>
13#include <boost/container/flat_set.hpp>
19#include "Acts/EventData/SourceLink.hpp"
20#include "Acts/Geometry/GeometryIdentifier.hpp"
21#include "Acts/Surfaces/Surface.hpp"
22#include "Tracking/Sim/GroupBy.h"
23#include "Tracking/Sim/Range.h"
25namespace acts_examples {
31 constexpr Acts::GeometryIdentifier operator()(
32 Acts::GeometryIdentifier geometryId)
const {
36 constexpr Acts::GeometryIdentifier operator()(
37 Acts::GeometryIdentifier::Value encoded)
const {
38 return Acts::GeometryIdentifier(encoded);
42 constexpr Acts::GeometryIdentifier operator()(
43 const std::pair<Acts::GeometryIdentifier, T>& mapItem)
const {
48 inline auto operator()(
const T& thing)
const
49 ->
decltype(thing.geometryId(), Acts::GeometryIdentifier()) {
50 return thing.geometryId();
54 inline auto operator()(std::reference_wrapper<T> thing)
const
55 ->
decltype(thing.get().geometryId(), Acts::GeometryIdentifier()) {
56 return thing.get().geometryId();
62 using is_transparent = void;
64 template <
typename Left,
typename Right>
65 constexpr bool operator()(Left&& lhs, Right&& rhs)
const {
83using GeometryIdMultiset =
84 boost::container::flat_multiset<T, detail::CompareGeometryId>;
100using GeometryIdMultimap =
101 GeometryIdMultiset<std::pair<Acts::GeometryIdentifier, T>>;
106selectVolume(
const GeometryIdMultiset<T>& container,
107 Acts::GeometryIdentifier::Value volume) {
108 auto cmp = Acts::GeometryIdentifier().setVolume(volume);
109 auto beg = std::lower_bound(container.begin(), container.end(), cmp,
112 cmp = Acts::GeometryIdentifier().setVolume(volume + 1u);
118 return makeRange(beg, end);
123inline auto selectVolume(
const GeometryIdMultiset<T>& container,
124 Acts::GeometryIdentifier
id) {
125 return selectVolume(container,
id.volume());
131selectLayer(
const GeometryIdMultiset<T>& container,
132 Acts::GeometryIdentifier::Value volume,
133 Acts::GeometryIdentifier::Value layer) {
134 auto cmp = Acts::GeometryIdentifier().setVolume(volume).setLayer(layer);
135 auto beg = std::lower_bound(container.begin(), container.end(), cmp,
136 detail::CompareGeometryId{});
138 cmp = Acts::GeometryIdentifier().setVolume(volume).setLayer(layer + 1u);
143 std::lower_bound(beg, container.end(), cmp, detail::CompareGeometryId{});
144 return makeRange(beg, end);
149inline auto selectLayer(
const GeometryIdMultiset<T>& container,
150 Acts::GeometryIdentifier
id) {
151 return selectLayer(container,
id.volume(),
id.layer());
157selectModule(
const GeometryIdMultiset<T>& container,
158 Acts::GeometryIdentifier geoId) {
160 return makeRange(container.equal_range(geoId));
165inline auto selectModule(
const GeometryIdMultiset<T>& container,
166 Acts::GeometryIdentifier::Value volume,
167 Acts::GeometryIdentifier::Value layer,
168 Acts::GeometryIdentifier::Value module_) {
171 Acts::GeometryIdentifier().setVolume(volume).setLayer(layer).setSensitive(
193selectLowestNonZeroGeometryObject(
const GeometryIdMultiset<T>& container,
194 Acts::GeometryIdentifier geoId) {
195 assert((geoId.boundary() == 0u) and
"Boundary component must be zero");
196 assert((geoId.approach() == 0u) and
"Approach component must be zero");
198 if (geoId.sensitive() != 0u) {
199 return selectModule(container, geoId);
200 }
else if (geoId.layer() != 0u) {
201 return selectLayer(container, geoId);
202 }
else if (geoId.volume() != 0u) {
203 return selectVolume(container, geoId);
205 return makeRange(container.begin(), container.end());
213 detail::GeometryIdGetter>
214groupByModule(
const GeometryIdMultiset<T>& container) {
215 return makeGroupBy(container, detail::GeometryIdGetter());
224 using Container = GeometryIdMultiset<T>;
225 using Key = Acts::GeometryIdentifier;
226 using Value =
typename GeometryIdMultiset<T>::value_type;
227 using Iterator =
typename GeometryIdMultiset<T>::const_iterator;
230 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.