ATLAS Offline Software
CalibratorRegistry.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3  */
4 #ifndef CALIBRATORREGISTRY_H
5 #define CALIBRATORREGISTRY_H
6 
7 #include "MakeDerivedVariant.h"
8 // Helper class to store and retrieve calibrators for a certain measurement type and measurement dimension
9 // this class only provides calibrators for types and associated dimension which are defined by the measurement container
10 // and the associated dimension. The template parameter is assumed to be:
11 // std::variant< ContainerRefWithDim<ContainerType1,N1>, ContainerRefWithDim<ContainerType2,N2>, .... >
12 // where ContainerType1 is the type of the container e.g. xAOD::PixelClusterContainer, and N1 the associated
13 // dimension e.g. 2.
14 template <typename MeasurementTypeTraits, typename bound_track_parameters_t, typename measurement_container_variant_t>
16  template <std::size_t DIM>
18  template <std::size_t DIM>
20 
21  template <std::size_t DIM, typename measurement_t>
22  using Calibrator = Acts::Delegate<
23  std::pair<Measurement<DIM>,MeasurementCovariance<DIM> >
24  (const Acts::GeometryContext&,
25  const Acts::CalibrationContext&,
26  const measurement_t &,
27  const bound_track_parameters_t &)>;
28 
29  // Get the calibrator for the given measurement type T_ValueType, and the measurement dimension
30  template <std::size_t DIM, typename T_ValueType>
32 
33  // register a calibrator for the given measurement type and dimension.
34  // the allowed measurement types and their allowed dimensions are defined by the measurement container variant
35  template <std::size_t DIM, typename T_ValueType>
37 
38 private:
39  // helper for type specific calibrator storage
40  struct CalibratorType {
41  // the MeasurementContainer is a variant containing pointer to containers
42  template <typename T_ContainerPtr>
43  using container_type = std::remove_cv_t<std::remove_pointer_t<T_ContainerPtr> >;
44 
45  // this is supposed to be the value type of the measurement container
46  // T_Container is ContainerWithDimension<T>, needed is T::const_value_type where T should
47  // be xAOD::PixelClusterContainer which should be DataVector<xAOD::PixelCluster>
48  template <typename T_Container>
49  using value_type = typename MeasurementTypeTraits::template MeassurementContainerValueType<typename T_Container::container_type >;
50 
51  // the calibrators are associated to the element types of the container without pointer and const qualifiers
52  template <typename T_ContainerWithDimension>
53  using type = Calibrator< T_ContainerWithDimension::dimension() , std::remove_cv_t<std::remove_pointer_t< value_type<T_ContainerWithDimension> > > >;
54  };
55 
56  using CalibratorVariant = MakeDerivedVariant::MakeVariant< CalibratorType, measurement_container_variant_t >::variant_type;
57 
58  std::array< CalibratorVariant, std::variant_size_v<measurement_container_variant_t> > m_calibrators;
59 
60  template <std::size_t DIM, typename T_ValueType, std::size_t N>
61  static
62  const CalibratorVariant &
63  getCalibratorGeneric(const std::array< CalibratorVariant, std::variant_size_v<measurement_container_variant_t> > &calibrator_arr);
64 };
65 
66 // helper to find the variant index for the given measurement type
67 template <typename MeasurementTypeTraits, typename bound_track_parameters_t, typename measurement_container_variant_t>
68 template <std::size_t DIM, typename T_ValueType, std::size_t N>
69 inline
72  ::getCalibratorGeneric(const std::array< CalibratorVariant, std::variant_size_v<measurement_container_variant_t> > &calibrator_arr){
73  if constexpr(N==1) {
74  return calibrator_arr[0];
75  }
76  else {
77  using Container = std::remove_cv_t<std::remove_pointer_t<decltype( MakeDerivedVariant::lvalue(std::get<N-1>(measurement_container_variant_t{})))> >;
78  // Container should be ContainerWithDimension<T>, needed is ContainerWithDimension<T>::contaienr_type
79  using ElementType = typename MeasurementTypeTraits::template MeassurementContainerValueType<typename Container::container_type>;
80  using BaseElementType = typename std::remove_cv_t<std::remove_pointer_t< ElementType > >;
81  if constexpr(std::is_same<T_ValueType,BaseElementType>::value && Container::dimension() == DIM) {
82  return calibrator_arr[N-1];
83  }
84  else {
85  return getCalibratorGeneric<DIM, T_ValueType,N-1>(calibrator_arr);
86  }
87  }
88 }
89 
90 template <typename MeasurementTypeTraits, typename bound_track_parameters_t, typename measurement_container_variant_t>
91 template <std::size_t DiM, typename T_ValueType>
92 inline
95  CalibratorVariant universial { calibrator };
96  assert( universial.index() < m_calibrators.size() );
97  m_calibrators.at(universial.index()) = std::move( universial);
98 }
99 
100 template <typename MeasurementTypeTraits, typename bound_track_parameters_t, typename measurement_container_variant_t>
101 template <std::size_t DIM, typename T_ValueType>
102 inline
105 ::calibrator() const {
106  const CalibratorVariant &universal = getCalibratorGeneric< DIM, T_ValueType,std::variant_size_v<measurement_container_variant_t> >(m_calibrators);
107  return std::get<Calibrator<DIM, T_ValueType> >(universal);
108 }
109 #endif
CalibratorRegistry< AtlasMeasurementSelector::CalibratedMeasurementTraits, typename traits::BoundTrackParameters, measurement_container_variant_t >::CalibratorVariant
MakeDerivedVariant::MakeVariant< CalibratorType, measurement_container_variant_t >::variant_type CalibratorVariant
Definition: CalibratorRegistry.h:56
Calibrator
A structure to contain data associated with the calibration of a certain sub-module.
Definition: Calibrator.h:178
taskman.template
dictionary template
Definition: taskman.py:317
athena.value
value
Definition: athena.py:122
JetTiledMap::N
@ N
Definition: TiledEtaPhiMap.h:44
Container
storage of the time histories of all the cells
CalibratorRegistry::setCalibrator
void setCalibrator(const Calibrator< DIM, T_ValueType > &calibrator)
CalibratorRegistry< AtlasMeasurementSelector::CalibratedMeasurementTraits, typename traits::BoundTrackParameters, measurement_container_variant_t >::MeasurementCovariance
typename MeasurementTypeTraits::template MeasurementCovariance< DIM > MeasurementCovariance
Definition: CalibratorRegistry.h:19
CalibratorRegistry::m_calibrators
std::array< CalibratorVariant, std::variant_size_v< measurement_container_variant_t > > m_calibrators
Definition: CalibratorRegistry.h:58
CalibratorRegistry
Definition: CalibratorRegistry.h:15
CalibratorRegistry::CalibratorType::container_type
std::remove_cv_t< std::remove_pointer_t< T_ContainerPtr > > container_type
Definition: CalibratorRegistry.h:43
CalibratorRegistry::CalibratorType
Definition: CalibratorRegistry.h:40
lumiFormat.array
array
Definition: lumiFormat.py:98
CalibratorRegistry::CalibratorType::type
Calibrator< T_ContainerWithDimension::dimension(), std::remove_cv_t< std::remove_pointer_t< value_type< T_ContainerWithDimension > > > > type
Definition: CalibratorRegistry.h:53
CalibratorRegistry::getCalibratorGeneric
static const CalibratorVariant & getCalibratorGeneric(const std::array< CalibratorVariant, std::variant_size_v< measurement_container_variant_t > > &calibrator_arr)
Definition: CalibratorRegistry.h:72
CalibratorRegistry< AtlasMeasurementSelector::CalibratedMeasurementTraits, typename traits::BoundTrackParameters, measurement_container_variant_t >::Measurement
typename MeasurementTypeTraits::template Measurement< DIM > Measurement
Definition: CalibratorRegistry.h:17
CalibratorRegistry::calibrator
const Calibrator< DIM, T_ValueType > & calibrator() const
MakeDerivedVariant.h
value_type
Definition: EDM_MasterSearch.h:11