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/BoundTrackParameters.hpp"
19#include "Acts/Surfaces/Surface.hpp"
20#include "Acts/Utilities/Logger.hpp"
21#include "Acts/TrackFinding/CombinatorialKalmanFilter.hpp"
22#include "Acts/TrackFinding/TrackStateCreator.hpp"
23#include "Acts/Surfaces/BoundaryTolerance.hpp"
36#include "boost/container/small_vector.hpp"
45template <std::
size_t NMeasMax,
typename traj_t,
typename measurement_container_variant_t>
53template <std::
size_t DIM>
57 this->m_data =
a.m_data;
61 this->m_data =
a.m_data;
65 this->m_data =
a.data();
72template <std::
size_t DIM>
76 this->m_data =
a.m_data;
80 this->m_data =
a.m_data;
84 this->m_data =
a.data();
94template <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>
129 using value_type =
typename T_MeasurementRangeIterator::value_type;
144 using BoundState = std::tuple<BoundTrackParameters, BoundMatrix, double>;
154template <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>
168 using Measurement =
typename traits::template CalibratedMeasurement<DIM>;
173 template <std::
size_t DIM,
typename measurement_t>
175 std::pair < typename traits::template CalibratedMeasurement<DIM>,
176 typename traits::template CalibratedMeasurementCovariance<DIM> >
177 (
const Acts::GeometryContext&,
178 const Acts::CalibrationContext&,
179 const Acts::Surface&,
180 const measurement_t &,
181 const typename traits::BoundTrackParameters &)>;
187 template <std::
size_t DIM>
188 using Measurement =
typename traits::template CalibratedMeasurement<DIM>;
189 template <std::
size_t DIM>
193 template <
typename T_Container>
222 template <std::
size_t DIM,
typename T_ValueType>
227 template <std::
size_t DIM>
228 static constexpr bool s_CanPreCalibrate = std::is_same< typename traits::template PreSelectionMeasurement<DIM>,
229 typename traits::template CalibratedMeasurement<DIM> >::value
230 && std::is_same< typename traits::template PreSelectionMeasurementCovariance<DIM>,
231 typename traits::template CalibratedMeasurementCovariance<DIM> >::value;
233 template < std::
size_t DIM,
typename T_ValueType >
239 template <
typename T_Value>
242 static_assert( !std::is_same<std::remove_pointer_t<T_Value>, T_Value>::value );
244 static_assert(std::is_base_of_v< xAOD::UncalibratedMeasurement, std::remove_cv_t<std::remove_pointer_t<T_Value> > > );
249 template <std::
size_t DIM>
252 const Acts::CalibrationContext& calibrationContext,
253 const Acts::Surface& surface)
const {
254 return m_projector.parameterMap<DIM>(geometryContext,calibrationContext,surface);
258 template <std::
size_t DIM,
typename measurement_t>
261 return m_calibrators.template calibrator<DIM,measurement_t>();
265 template <std::
size_t DIM,
typename measurement_t>
278 return []( [[maybe_unused]]
const Acts::GeometryContext&,
279 [[maybe_unused]]
const Acts::CalibrationContext&,
280 [[maybe_unused]]
const Acts::Surface&,
281 const measurement_t &measurement,
282 [[maybe_unused]]
const typename traits::BoundTrackParameters &) {
283 return std::make_pair( measurement.template localPosition<DIM>(), measurement.template localCovariance<DIM>() );
288 std::tuple<const measurement_container_variant_t *, abstract_measurement_range_t, bool >
292 if (std::get<0>(ret))
return ret;
298 template <
typename MeasurementRangeList_t>
299 static std::tuple<const measurement_container_variant_t *, abstract_measurement_range_t, bool >
301 typename MeasurementRangeList_t::const_iterator range_iter = measurementRanges.find(surface.geometryId().value());
302 if (range_iter == measurementRanges.end())
308 range_iter->second.elementEndIndex()};
309 assert( !range_iter->second.isMeasurementExpected() || range.begin() <= range.end());
311 return { forced || range_iter->second.isMeasurementExpected() ? &(measurementRanges.container(range_iter->second.containerIndex())) :
nullptr,
312 std::move(range), forced};
317 [[maybe_unused]]
const measurement_container_variant_t *container_variant_ptr,
319 return (abstract_range.begin()<=abstract_range.end());
322 template <
typename measurement_container_t>
326 unsigned int begin_idx = abstract_range.front();
327 auto begin_iter = concrete_container.container().begin() + begin_idx;
328 auto end_iter = begin_iter +
static_cast<unsigned int>(abstract_range.size());
329 return std::ranges::subrange(begin_iter, end_iter);
336 Acts::VectorMultiTrajectory>;
338 static constexpr std::size_t gAbsoluteMaxBranchesPerSurface = 3;
344 template <
typename track_container_t>
347 using TheAtlasMeasurementSelector
348 = AtlasMeasurementSelector<
349 gAbsoluteMaxBranchesPerSurface,
350 typename track_container_t::TrackStateContainerBackend,
356 using BoundState = std::tuple<Acts::BoundTrackParameters, Acts::BoundMatrix, double>;
359 AtlasActsMeasurmentSelector(ActsTrk::MeasurementCalibrator &&calibrator,
362 : m_calibrator( std::move(calibrator)),
363 m_measurementSelector(std::move(
config),
370 m_measurementSelector.template setPreCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPreCalibrator());
371 m_measurementSelector.template setPreCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPreCalibrator());
372 m_measurementSelector.template setPreCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPreCalibrator());
373 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
374 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
375 m_measurementSelector.template setCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPostCalibrator());
378 m_measurementSelector.template setCalibrator<2,xAOD::PixelCluster>(m_calibrator.pixelPostCalibrator());
379 m_measurementSelector.template setCalibrator<1,xAOD::StripCluster>(m_calibrator.stripPostCalibrator());
380 m_measurementSelector.template setCalibrator<3,xAOD::HGTDCluster>(m_calibrator.hgtdPostCalibrator());
385 void connect(std::any delegate_ptr)
const override {
386 using TrackStateCreator = Acts::CombinatorialKalmanFilterExtensions<RecoTrackContainer>::TrackStateCreator;
388 auto delegate = std::any_cast< TrackStateCreator *>(delegate_ptr);
389 delegate->template connect< & TheAtlasMeasurementSelector::createTrackStates >(&m_measurementSelector);
393 m_measurementSelector.setMeasurementRangesForced(measurementRangesForced);
397 ActsTrk::MeasurementCalibrator m_calibrator;
400 TheAtlasMeasurementSelector m_measurementSelector;
411 const std::vector<float> &etaBinsf,
412 const std::vector<std::pair<float, float> > &chi2CutOffOutlier,
413 const std::vector<size_t> &numMeasurementsCutOff,
414 double edge_hole_border_width) {
418 pixelOnTrackCalibratorTool,
419 stripOnTrackCalibratorTool,
420 hgtdOnTrackCalibratorTool);
423 using AtlMeasurementSelector = AtlasActsMeasurmentSelector<RecoTrackContainer>;
424 using AtlMeasurementSelectorConfig = AtlMeasurementSelector::TheAtlasMeasurementSelector::Config;
426 std::unique_ptr<ActsTrk::IMeasurementSelector>
427 selector(
new AtlMeasurementSelector(
428 std::move(atl_measurement_calibrator),
430 AtlMeasurementSelectorConfig{
431 {Acts::GeometryIdentifier(),
432 AtlMeasurementSelectorCuts{ etaBinsf,
434 numMeasurementsCutOff,
435 edge_hole_border_width==0.
436 ? std::optional<Acts::BoundaryTolerance>{}
437 : std::optional{Acts::BoundaryTolerance::AbsoluteEuclidean(-std::abs(edge_hole_border_width))}
static constexpr bool s_fullPreCalibration
An instance of this class is created for each sub-level of the TRT by the TRTCalibrator.
static constexpr std::size_t getMeasurementDimMax()
std::variant< T_Container... > measurement_container_variant_t
Athena definition of the Eigen plugin.
GenMeasurementRangeListFlat< AtlasMeasurementContainerList > MeasurementRangeListFlat
Acts::TrackContainer< Acts::VectorTrackContainer, Acts::VectorMultiTrajectory > RecoTrackContainer
GenMeasurementRangeList< AtlasMeasurementContainerList > MeasurementRangeList
std::unique_ptr< ActsTrk::IMeasurementSelector > getMeasurementSelector(const EventContext &ctx, const ActsTrk::IPixelOnBoundStateCalibratorTool *pixelOnTrackCalibratorTool, const ActsTrk::IStripOnBoundStateCalibratorTool *stripOnTrackCalibratorTool, const ActsTrk::IHGTDOnBoundStateCalibratorTool *hgtdOnTrackCalibratorTool, const ActsTrk::detail::MeasurementRangeList &measurementRanges, const std::vector< float > &etaBinsf, const std::vector< std::pair< float, float > > &chi2CutOffOutlier, const std::vector< size_t > &numMeasurementsCutOff, double edge_hole_border_width)
ATLASUncalibSourceLink makeATLASUncalibSourceLink(const xAOD::UncalibratedMeasurementContainer *container, std::size_t index, const EventContext &ctx)
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
Eigen::Matrix< float, N, N > MeasMatrix
Eigen::Map< const MeasMatrix< N > > ConstMatrixMap
Eigen::Matrix< float, N, 1 > MeasVector
Abrivation of the Matrix & Covariance definitions.
Eigen::Map< const MeasVector< N > > ConstVectorMap
typename traits::template CalibratedMeasurement< DIM > Measurement
typename traits::template MeasurementContainerTraits< T_Container >::value_type MeassurementContainerValueType
typename traits::template CalibratedMeasurementCovariance< DIM > MeasurementCovariance
ATALS specific Implementation of the member functions needed by the measurement selector.
typename traits::template CalibratedMeasurement< DIM > Measurement
ActsTrk::MeasurementParameterMap m_projector
static constexpr bool s_CanPreCalibrate
void setCalibrator(const Calibrator< DIM, T_ValueType > &calibrator)
AtlasMeasurementSelector(typename BASE::Config &&config, const ActsTrk::detail::MeasurementRangeList &measurementRanges)
const Calibrator< DIM, measurement_t > & postCalibrator() const
BASE::abstract_measurement_range_t abstract_measurement_range_t
MeasurementSelectorBaseImpl< NMeasMax, AtlasMeasurementSelector< NMeasMax, traj_t, measurement_container_variant_t >, measurement_container_variant_t > BASE
void setMeasurementRangesForced(const ActsTrk::detail::MeasurementRangeListFlat *measurementRangesForced)
std::conditional< s_fullPreCalibration, CalibratorRegistry< CalibratedMeasurementTraits, typenametraits::BoundTrackParameters, measurement_container_variant_t >, Empty >::type m_preCalibrators
static Acts::SourceLink makeSourceLink(T_Value &&value)
bool expectMeasurements(const Acts::Surface &surface, const measurement_container_variant_t *container_variant_ptr, const abstract_measurement_range_t &abstract_range) const
ParameterMapping::type< DIM > parameterMap(const Acts::GeometryContext &geometryContext, const Acts::CalibrationContext &calibrationContext, const Acts::Surface &surface) const
void setPreCalibrator(typename std::enable_if< s_CanPreCalibrate< DIM >, const Calibrator< DIM, T_ValueType > & >::type calibrator)
Acts::Delegate< std::pair< typename traits::template CalibratedMeasurement< DIM >, typename traits::template CalibratedMeasurementCovariance< DIM > >(const Acts::GeometryContext &, const Acts::CalibrationContext &, const Acts::Surface &, const measurement_t &, const typename traits::BoundTrackParameters &)> Calibrator
const ActsTrk::detail::MeasurementRangeList * m_measurementRanges
typename BASE::traits traits
auto rangeForContainer(const measurement_container_t &concrete_container, const abstract_measurement_range_t &abstract_range) const
const ActsTrk::detail::MeasurementRangeListFlat * m_measurementRangesForced
static std::tuple< const measurement_container_variant_t *, abstract_measurement_range_t, bool > containerAndRangeSingle(const MeasurementRangeList_t &measurementRanges, const Acts::Surface &surface, bool forced)
auto preCalibrator() const
std::tuple< const measurement_container_variant_t *, abstract_measurement_range_t, bool > containerAndRange(const Acts::Surface &surface) const
CalibratorRegistry< CalibratedMeasurementTraits, typename traits::BoundTrackParameters, measurement_container_variant_t > m_calibrators
ConstMatrixMapWithInvalidDef()
ConstMatrixMapWithInvalidDef< DIM > & operator=(ConstMatrixMapWithInvalidDef< DIM > &&a)
ConstMatrixMapWithInvalidDef< DIM > & operator=(const xAOD::ConstMatrixMap< DIM > &a)
ConstMatrixMapWithInvalidDef< DIM > & operator=(const ConstMatrixMapWithInvalidDef< DIM > &a)
ConstVectorMapWithInvalidDef< DIM > & operator=(const ConstVectorMapWithInvalidDef< DIM > &a)
ConstVectorMapWithInvalidDef< DIM > & operator=(ConstVectorMapWithInvalidDef< DIM > &&a)
ConstVectorMapWithInvalidDef()
ConstVectorMapWithInvalidDef< DIM > & operator=(const xAOD::ConstVectorMap< DIM > &a)
MeasurementSelectorTraits< AtlasMeasurementSelector< NMeasMax, traj_t, measurement_container_variant_t > >::abstract_measurement_range_t abstract_measurement_range_t
MeasurementSelectorTraits< AtlasMeasurementSelector< NMeasMax, traj_t, measurement_container_variant_t > > traits
Acts::GeometryHierarchyMap< AtlasMeasurementSelectorCuts > Config
Acts::BoundTrackParameters BoundTrackParameters
static constexpr std::size_t s_maxBranchesPerSurface
std::conditional< s_fullPreCalibration, CalibratedMeasurementCovariance< N >, ConstMatrixMapWithInvalidDef< N > >::type PreSelectionMeasurementCovariance
CalibratedMeasurementCovariance< N > PredictedCovariance
xAOD::MeasMatrix< N > CalibratedMeasurementCovariance
xAOD::MeasVector< N > CalibratedMeasurement
std::conditional< s_fullPreCalibration, CalibratedMeasurement< N >, ConstVectorMapWithInvalidDef< N > >::type PreSelectionMeasurement
static const std::size_t s_dimMax
std::ranges::iota_view< unsigned int, unsigned int > abstract_measurement_range_t
std::tuple< BoundTrackParameters, BoundMatrix, double > BoundState
typename traj_t::TrackStateProxy TrackStateProxy
Acts::BoundMatrix BoundMatrix
CalibratedMeasurement< N > Predicted
typename T_MeasurementRangeIterator::value_type value_type
std::array< unsigned char, N > type