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