ATLAS Offline Software
TrkMeasurementCalibrator.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 "ActsGeometry/ATLASSourceLink.h"
6 #include "TrkSurfaces/Surface.h"
7 #include "TrkSurfaces/SurfaceBounds.h"
8 
9 #include "InDetMeasurementUtilities/ClusterConversionUtilities.h"
10 #include "TrkRIO_OnTrack/RIO_OnTrack.h"
11 #include "InDetRIO_OnTrack/SCT_ClusterOnTrack.h"
12 #include "InDetRIO_OnTrack/PixelClusterOnTrack.h"
13 
14 #include "HGTD_RIO_OnTrack/HGTD_ClusterOnTrack.h"
15 
16 #include <format>
17 namespace ActsTrk::detail {
18 
19  template <typename trajectory_t>
20  void TrkMeasurementCalibrator::calibrate(const Acts::GeometryContext& /*gctx*/,
21  const Acts::CalibrationContext& /*cctx*/,
22  const Acts::SourceLink& sl,
23  TrackState_t<trajectory_t> trackState) const {
24  const SourceLink_t sourceLink = unpack(sl);
25 
26  auto detEl = dynamic_cast<const InDetDD::SiDetectorElement *>(sourceLink->associatedSurface().associatedDetectorElement());
27 
28  if(auto pixelCluster = dynamic_cast<const InDet::PixelClusterOnTrack *>(sourceLink); pixelCluster != nullptr) {
29  auto [locPos, locCov] = TrackingUtilities::convertPix_LocalPosCov(*pixelCluster->prepRawData());
30  setState<2, trajectory_t>(ProjectorType::e2DimNoTime, locPos, locCov, sl, trackState);
31  } else if(auto stripCluster = dynamic_cast<const InDet::SCT_ClusterOnTrack *>(sourceLink); stripCluster != nullptr) {
32  auto [locPos, locCov] = TrackingUtilities::convertSCT_LocalPosCov(*stripCluster->prepRawData());
33  if( detEl->isBarrel() ) {
34  setState<1, trajectory_t>(ProjectorType::e1DimNoTime, locPos, locCov,
35  sl, trackState);
36  } else {
37  setState<1, trajectory_t>(ProjectorType::e1DimRotNoTime, locPos, locCov,
38  sl, trackState);
39  }
40  } else if(auto hgtdCluster = dynamic_cast<const HGTD_ClusterOnTrack*>(sourceLink); hgtdCluster != nullptr ) {
41  auto [locPos, locCov] = TrackingUtilities::convertHGTD_LocalPosCov(*hgtdCluster->prepRawData());
42  setState<3, trajectory_t>(ProjectorType::e2DimWithTime, locPos, locCov, sl, trackState);
43  } else {
44  std::stringstream linkDump{};
45  sourceLink->dump(linkDump);
46  throw std::domain_error(
47  std::format(
48  "TrkMeasurementCalibrator::calibrate() - Invalid dimension {:d} for measurement {:} ",
49  sourceLink->localParameters().dimension(), linkDump.str()
50  )
51  );
52  }
53  }
54 } // namespace ActsTrk::detail
55