ATLAS Offline Software
Loading...
Searching...
No Matches
OnTrackCalibrator.icc
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include "ActsCalibrators/xAODUncalibMeasCalibrator.h"
6#include <utility> // for declval
7
8
9namespace ActsTrk::detail {
10
11 template <typename traj_t>
12 template <typename T_CalibratorToolHandle, typename T_Delegate>
13 void OnTrackCalibrator<traj_t>::connectPassThrough(T_Delegate &delegate) {
14 using CalibratorBase_t = typename decltype( std::declval<T_CalibratorToolHandle>()->createOnTrackCalibrator(std::declval<EventContext>()) )::element_type;
15 delegate.template connect<&OnTrackCalibrator<traj_t>::passthrough<CalibratorBase_t::ClusterDIM,
16 typename CalibratorBase_t::ClusterType>>(this);
17 }
18 template <typename traj_t>
19 template <typename T_CalibratorToolHandle, typename T_Delegate>
20 void OnTrackCalibrator<traj_t>::connect(const EventContext &ctx,
21 const T_CalibratorToolHandle &calibrator_tool,
22 T_Delegate &delegate ) {
23 if (calibrator_tool.isEnabled()) {
24 auto calibrator = calibrator_tool->createOnTrackCalibrator(ctx);
25 calibrator->connectOnTrackCalibrator(delegate);
26 m_calibrators.push_back(std::move(calibrator));
27 } else {
28 connectPassThrough<T_CalibratorToolHandle>(delegate);
29 }
30 }
31
32 template <typename traj_t>
33 OnTrackCalibrator<traj_t>::OnTrackCalibrator(const ActsTrk::ITrackingGeometryTool* trackGeoTool)
34 : m_surfAcc{trackGeoTool} {
35 connectPassThrough<ToolHandle<ActsTrk::IPixelOnTrackCalibratorTool<traj_t> > >(pixelCalibrator);
36 connectPassThrough<ToolHandle<ActsTrk::IStripOnTrackCalibratorTool<traj_t> > >(stripCalibrator);
37 connectPassThrough<ToolHandle<ActsTrk::IHGTDOnTrackCalibratorTool<traj_t> > >(hgtdCalibrator);
38 }
39
40 template <typename traj_t>
41 OnTrackCalibrator<traj_t>::OnTrackCalibrator(const EventContext &ctx,
42 const ActsTrk::ITrackingGeometryTool* trackGeoTool,
43 const ToolHandle<IPixelOnTrackCalibratorTool<traj_t>>& pixelTool,
44 const ToolHandle<IStripOnTrackCalibratorTool<traj_t>>& stripTool,
45 const ToolHandle<IHGTDOnTrackCalibratorTool<traj_t>>& hgtdTool)
46 : m_surfAcc{trackGeoTool} {
47 assert( m_calibrators.capacity() >= 3); // if capacity was constexpr should turn into static_assert
48 connect(ctx,pixelTool,pixelCalibrator);
49 connect(ctx,stripTool,stripCalibrator);
50 connect(ctx,hgtdTool,hgtdCalibrator);
51 }
52
53 template <typename traj_t>
54 void OnTrackCalibrator<traj_t>::calibrate(const Acts::GeometryContext& geoctx,
55 const Acts::CalibrationContext& cctx,
56 const Acts::SourceLink& link,
57 TrackStateProxy state) const {
58
59 const xAOD::UncalibratedMeasurement& measurement{*xAODUncalibMeasCalibrator::unpack(link)};
60 // @TODO in principle only need to lookup surface for strips
61 switch (measurement.type()) {
62 using enum xAOD::UncalibMeasType;
63 using enum ProjectorType;
64 case PixelClusterType: {
65 assert(pixelCalibrator.connected());
66 auto [pos, cov] = pixelCalibrator(geoctx, cctx,
67 static_cast<const xAOD::PixelCluster&>(measurement), state);
68 setState<2, traj_t>(e2DimNoTime, pos, cov, link, state);
69 break;
70 } case StripClusterType: {
71 assert(stripCalibrator.connected());
72 auto [pos, cov] = stripCalibrator(geoctx, cctx,
73 static_cast<const xAOD::StripCluster&>(measurement), state);
74 const Acts::Surface *surface = m_surfAcc.get(&measurement);
75 if (!surface) {
76 throw std::runtime_error("OnTrackCalibrator<traj_t>::calibrate() -- No surface for measurement.");
77 }
78 setState<1, traj_t>(surface->bounds().type() == Acts::SurfaceBounds::eAnnulus ? e1DimRotNoTime : e1DimNoTime,
79 pos, cov, link, state);
80 break;
81 } case HGTDClusterType: {
82 assert(hgtdCalibrator.connected());
83 auto [pos, cov] = hgtdCalibrator(geoctx, cctx,
84 static_cast<const xAOD::HGTDCluster&>(measurement), state);
85 setState<3, traj_t>(e2DimWithTime, pos, cov, link, state);
86 break;
87 } default:
88 throw std::domain_error("OnTrackCalibrator can only handle Pixel or Strip measurements");
89 }
90 }
91
92 template <typename traj_t>
93 template <std::size_t Dim, typename Cluster>
94 std::pair<xAOD::MeasVector<Dim>, xAOD::MeasMatrix<Dim>>
95 OnTrackCalibrator<traj_t>::passthrough(const Acts::GeometryContext& /*gctx*/,
96 const Acts::CalibrationContext& /*cctx*/,
97 const Cluster& cluster,
98 const TrackStateProxy& /*state*/) const {
99 return std::make_pair(cluster.template localPosition<Dim>(),
100 cluster.template localCovariance<Dim>());
101 }
102} // namespace ActsTrk
103