12 #include "Acts/Definitions/Common.hpp"
13 #include "Acts/Definitions/Algebra.hpp"
14 #include "Acts/Utilities/VectorHelpers.hpp"
15 #include "Acts/Utilities/Delegate.hpp"
16 #include "Acts/Utilities/Result.hpp"
17 #include "Acts/Geometry/GeometryContext.hpp"
18 #include "Acts/Utilities/CalibrationContext.hpp"
19 #include "Acts/EventData/TrackParameters.hpp"
20 #include "Acts/Surfaces/Surface.hpp"
21 #include "Acts/Utilities/Logger.hpp"
22 #include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
23 #include "Acts/TrackFinding/TrackStateCreator.hpp"
36 #include "boost/container/small_vector.hpp"
39 #include <type_traits>
45 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
48 static constexpr
bool s_fullPreCalibration=
true;
53 template <std::
size_t DIM>
72 template <std::
size_t DIM>
94 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
98 template <std::
size_t N>
102 template <std::
size_t N>
107 template <std::
size_t N>
114 template <std::
size_t N>
119 template <std::
size_t N>
123 template <std::
size_t N>
127 template <
typename T_MeasurementRangeIterator>
128 struct MeasurementContainerTraits {
129 using value_type =
typename T_MeasurementRangeIterator::value_type;
144 using BoundState = std::tuple<BoundTrackParameters, BoundMatrix, double>;
154 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
157 AtlasMeasurementSelector<NMeasMax, traj_t, measurement_container_variant_t> ,
158 measurement_container_variant_t >
163 measurement_container_variant_t >;
167 template <std::
size_t DIM>
173 template <std::
size_t DIM,
typename measurement_t>
175 std::pair < typename traits::template CalibratedMeasurement<DIM>,
177 (
const Acts::GeometryContext&,
178 const Acts::CalibrationContext&,
179 const measurement_t &,
180 const typename traits::BoundTrackParameters &)>;
186 template <std::
size_t DIM>
188 template <std::
size_t DIM>
192 template <
typename T_Container>
203 std::conditional<s_fullPreCalibration,
215 template <std::
size_t DIM,
typename T_ValueType>
217 m_calibrators.template setCalibrator<DIM, T_ValueType>(calibrator);
220 template <std::
size_t DIM>
221 static constexpr
bool s_CanPreCalibrate = std::is_same< typename traits::template PreSelectionMeasurement<DIM>,
223 && std::is_same< typename traits::template PreSelectionMeasurementCovariance<DIM>,
226 template < std::
size_t DIM,
typename T_ValueType >
232 template <
typename T_Value>
235 static_assert( !std::is_same<std::remove_pointer_t<T_Value>, T_Value>::
value );
242 template <std::
size_t DIM>
245 const Acts::CalibrationContext& calibrationContext,
246 const Acts::Surface& surface)
const {
251 template <std::
size_t DIM,
typename measurement_t>
254 return m_calibrators.template calibrator<DIM,measurement_t>();
258 template <std::
size_t DIM,
typename measurement_t>
261 if constexpr(s_fullPreCalibration) {
271 return []( [[maybe_unused]]
const Acts::GeometryContext&,
272 [[maybe_unused]]
const Acts::CalibrationContext&,
273 const measurement_t &measurement,
274 [[maybe_unused]]
const typename traits::BoundTrackParameters &) {
275 return std::make_pair( measurement.template localPosition<DIM>(), measurement.template localCovariance<DIM>() );
280 std::tuple<const measurement_container_variant_t *, abstract_measurement_range_t >
283 const ActsTrk::detail::MeasurementRangeList::const_iterator
291 range_iter->second.elementEndIndex()};
292 assert( !range_iter->second.isMeasurementExpected() &&
range.begin() >
range.end());
300 [[maybe_unused]]
const measurement_container_variant_t *container_variant_ptr,
302 return (abstract_range.begin()<=abstract_range.end());
305 template <
typename measurement_container_t>
309 unsigned int begin_idx = abstract_range.front();
310 auto begin_iter = concrete_container.container().begin() + begin_idx;
311 auto end_iter = begin_iter +
static_cast<unsigned int>(abstract_range.size());
312 return std::ranges::subrange(begin_iter, end_iter);
319 Acts::VectorMultiTrajectory>;
321 static constexpr std::size_t gAbsoluteMaxBranchesPerSurface = 3;
327 template <
typename track_container_t>
330 using TheAtlasMeasurementSelector
332 gAbsoluteMaxBranchesPerSurface,
333 typename track_container_t::TrackStateContainerBackend,
339 using BoundState = std::tuple<Acts::BoundTrackParameters, Acts::BoundMatrix, double>;
344 TheAtlasMeasurementSelector::Config &&
config)
345 : m_calibrator( std::move(calibrator)),
346 m_measurementSelector(std::move(
config),
352 if constexpr( s_fullPreCalibration) {
353 m_measurementSelector.template setPreCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPreCalibrator());
354 m_measurementSelector.template setPreCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPreCalibrator());
355 m_measurementSelector.template setPreCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPreCalibrator());
356 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
357 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
358 m_measurementSelector.template setCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPostCalibrator());
361 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
362 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
363 m_measurementSelector.template setCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPostCalibrator());
368 void connect(std::any delegate_ptr)
const override {
369 using TrackStateCreator = Acts::CombinatorialKalmanFilterExtensions<RecoTrackContainer>::TrackStateCreator;
371 auto delegate = std::any_cast< TrackStateCreator *>(delegate_ptr);
372 delegate->template connect< & TheAtlasMeasurementSelector::createTrackStates >(&m_measurementSelector);
379 TheAtlasMeasurementSelector m_measurementSelector;
387 const std::vector<float> &etaBinsf,
388 const std::vector<std::pair<float, float> > &chi2CutOffOutlier,
389 const std::vector<size_t> &numMeasurementsCutOff) {
395 using AtlMeasurementSelector = AtlasActsMeasurmentSelector<RecoTrackContainer>;
396 using AtlMeasurementSelectorConfig = AtlMeasurementSelector::TheAtlasMeasurementSelector::Config;
398 std::unique_ptr<ActsTrk::IMeasurementSelector>
399 selector(
new AtlMeasurementSelector(
400 std::move(atl_measurement_calibrator),
402 AtlMeasurementSelectorConfig{ {Acts::GeometryIdentifier(),
403 AtlMeasurementSelectorCuts{ etaBinsf,
405 numMeasurementsCutOff} }}));