11 #include "Acts/Definitions/Common.hpp"
12 #include "Acts/Definitions/Algebra.hpp"
13 #include "Acts/Utilities/VectorHelpers.hpp"
14 #include "Acts/Utilities/Delegate.hpp"
15 #include "Acts/Utilities/Result.hpp"
16 #include "Acts/Geometry/GeometryContext.hpp"
17 #include "Acts/Utilities/CalibrationContext.hpp"
18 #include "Acts/EventData/TrackParameters.hpp"
19 #include "Acts/Surfaces/Surface.hpp"
20 #include "Acts/Utilities/Logger.hpp"
34 #include "boost/container/small_vector.hpp"
37 #include <type_traits>
39 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
42 static constexpr
bool s_fullPreCalibration=
true;
47 template <std::
size_t DIM>
66 template <std::
size_t DIM>
88 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
92 template <std::
size_t N>
96 template <std::
size_t N>
101 template <std::
size_t N>
108 template <std::
size_t N>
113 template <std::
size_t N>
117 template <std::
size_t N>
121 template <
typename T_Container>
122 struct MeasurementContainerTraits {
136 using BoundState = std::tuple<BoundTrackParameters, BoundMatrix, double>;
146 template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
149 AtlasMeasurementSelector<NMeasMax, traj_t, measurement_container_variant_t> ,
150 measurement_container_variant_t >
155 measurement_container_variant_t >;
159 template <std::
size_t DIM>
163 template <std::
size_t DIM,
typename measurement_t>
165 std::pair < typename traits::template CalibratedMeasurement<DIM>,
167 (
const Acts::GeometryContext&,
168 const Acts::CalibrationContext&,
169 const measurement_t &,
170 const typename traits::BoundTrackParameters &)>;
176 template <std::
size_t DIM>
178 template <std::
size_t DIM>
182 template <
typename T_Container>
192 std::conditional<s_fullPreCalibration,
197 template <std::
size_t DIM,
typename T_ValueType>
199 m_calibrators.template setCalibrator<DIM, T_ValueType>(calibrator);
202 template <std::
size_t DIM>
203 static constexpr
bool s_CanPreCalibrate = std::is_same< typename traits::template PreSelectionMeasurement<DIM>,
205 && std::is_same< typename traits::template PreSelectionMeasurementCovariance<DIM>,
208 template < std::
size_t DIM,
typename T_ValueType >
214 template <
typename T_Value>
217 static_assert( !std::is_same<std::remove_pointer_t<T_Value>, T_Value>::
value );
224 template <std::
size_t DIM>
227 const Acts::CalibrationContext& calibrationContext,
228 const Acts::Surface& surface)
const {
233 template <std::
size_t DIM,
typename measurement_t>
236 return m_calibrators.template calibrator<DIM,measurement_t>();
240 template <std::
size_t DIM,
typename measurement_t>
243 if constexpr(s_fullPreCalibration) {
253 return []( [[maybe_unused]]
const Acts::GeometryContext&,
254 [[maybe_unused]]
const Acts::CalibrationContext&,
255 const measurement_t &measurement,
256 [[maybe_unused]]
const typename traits::BoundTrackParameters &) {
257 return std::make_pair( measurement.template localPosition<DIM>(), measurement.template localCovariance<DIM>() );
264 using RecoTrackStateContainer = Acts::VectorMultiTrajectory;
266 static constexpr std::size_t gAbsoluteMaxBranchesPerSurface = 3;
272 template <
typename source_link_iterator_t,
typename traj_t>
275 using TheAtlasMeasurementSelector
277 gAbsoluteMaxBranchesPerSurface,
284 using BoundState = std::tuple<Acts::BoundTrackParameters, Acts::BoundMatrix, double>;
286 using TrackStateCandidateCreator =
287 Acts::Delegate<
Acts::Result<boost::container::small_vector<
289 TheAtlasMeasurementSelector::traits::s_maxBranchesPerSurface>>(
290 const Acts::GeometryContext& geoContext,
291 const Acts::CalibrationContext& calibrationContext,
const Acts::Surface& surface,
292 const BoundState& boundState, source_link_iterator_t slBegin,
293 source_link_iterator_t slEnd, std::size_t prevTip,
294 traj_t& bufferTrajectory,
295 std::vector<typename traj_t::TrackStateProxy>& trackStateCandidates,
296 traj_t& trajectory,
const Acts::Logger&
logger)>;
299 TheAtlasMeasurementSelector::Config &&
config)
300 : m_calibrator( std::move(calibrator)),
301 m_measurementSelector{ {std::move(
config)} }
306 if constexpr( s_fullPreCalibration) {
307 m_measurementSelector.template setPreCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPreCalibrator());
308 m_measurementSelector.template setPreCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPreCalibrator());
309 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
310 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
313 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
314 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
319 void connect(std::any delegate_ptr)
const override {
320 auto delegate = std::any_cast< TrackStateCandidateCreator *>(delegate_ptr);
321 delegate->template connect< & TheAtlasMeasurementSelector::template createSourceLinkTrackStates<source_link_iterator_t> >(&m_measurementSelector);
328 TheAtlasMeasurementSelector m_measurementSelector;
336 const std::vector<float> &etaBinsf,
337 const std::vector<std::pair<float, float> > &chi2CutOffOutlier,
338 const std::vector<size_t> &numMeasurementsCutOff) {
344 using AtlMeasurementSelector = AtlasActsMeasurmentSelector<ActsTrk::UncalibSourceLinkAccessor::Iterator, RecoTrackStateContainer>;
345 using AtlMeasurementSelectorConfig = AtlMeasurementSelector::TheAtlasMeasurementSelector::Config;
347 std::unique_ptr<ActsTrk::IMeasurementSelector>
348 selector(
new AtlMeasurementSelector(
349 std::move(atl_measurement_calibrator),
350 AtlMeasurementSelectorConfig{ {Acts::GeometryIdentifier(),
351 AtlMeasurementSelectorCuts{ etaBinsf,
353 numMeasurementsCutOff} }}));