2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
5 #include "ActsCalibrators/xAODUncalibMeasCalibrator.h"
8 namespace ActsTrk::detail {
10 template <typename traj_t>
11 OnTrackCalibrator<traj_t> OnTrackCalibrator<traj_t>::NoCalibration(const ActsTrk::ITrackingGeometryTool* trackGeoTool)
13 ToolHandle<IOnTrackCalibratorTool<traj_t>> null(nullptr);
14 return OnTrackCalibrator<traj_t>(trackGeoTool, null, null, null);
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);
26 pixelCalibrator.template connect<&OnTrackCalibrator<traj_t>::passthrough<2, xAOD::PixelCluster>>(this);
29 if (stripTool.isEnabled()) {
30 stripTool->connect(*this);
32 stripCalibrator.template connect<&OnTrackCalibrator<traj_t>::passthrough<1, xAOD::StripCluster>>(this);
34 if (hgtdTool.isEnabled()) {
35 hgtdTool->connect(*this);
37 // cppcheck-suppress missingReturn; false positive
38 hgtdCalibrator.template connect<&OnTrackCalibrator<traj_t>::passthrough<3, xAOD::HGTDCluster>>(this);
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 {
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);
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);
65 throw std::runtime_error("OnTrackCalibrator<traj_t>::calibrate() -- No surface for measurement.");
67 setState<1, traj_t>(surface->bounds().type() == Acts::SurfaceBounds::eAnnulus ? e1DimRotNoTime : e1DimNoTime,
68 pos, cov, link, state);
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);
77 throw std::domain_error("OnTrackCalibrator can only handle Pixel or Strip measurements");
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>());
91 } // namespace ActsTrk