19#include <Acts/Definitions/Algebra.hpp>
20#include <Acts/Definitions/Units.hpp>
21#include <Acts/EventData/SourceLink.hpp>
22#include <Acts/Geometry/GeometryContext.hpp>
23#include <Acts/Geometry/GeometryIdentifier.hpp>
24#include <Acts/Geometry/TrackingGeometry.hpp>
25#include <Acts/Surfaces/Surface.hpp>
26#include <Acts/Utilities/CalibrationContext.hpp>
28#include <SHiP/RecHit.hpp>
55 const Acts::GeometryContext& gctx,
56 const std::vector<SHiP::RecHit>& hits,
double zWindowMm = 510.0) {
57 double const zWindow = zWindowMm * Acts::UnitConstants::mm;
58 std::vector<std::pair<const Acts::Surface*, double>> stationSurfaces;
59 geometry.visitSurfaces(
60 [&](
const Acts::Surface* s) { stationSurfaces.emplace_back(s, s->center(gctx).z()); });
62 for (
auto const& hit : hits) {
63 Acts::Vector3
const global(hit.position[0] * Acts::UnitConstants::mm,
64 hit.position[1] * Acts::UnitConstants::mm,
65 hit.position[2] * Acts::UnitConstants::mm);
67 const Acts::Surface* best =
nullptr;
68 double bestDz = std::numeric_limits<double>::max();
69 for (
auto const& [s, zSurface] : stationSurfaces) {
70 double const dz = std::abs(global.z() - zSurface);
71 if (dz < zWindow && dz < bestDz) {
78 auto locRes = best->globalToLocal(gctx, global, Acts::Vector3::UnitZ(), zWindow);
81 double const time = hit.time * Acts::UnitConstants::ns;
84 m_measurements.push_back(
Measurement{best, global, locRes.value(), cov, time});
85 m_sourceLinks.emplace(best->geometryId(), idx);
89 const std::vector<Measurement>&
measurements()
const {
return m_measurements; }
98 template <
typename trajectory_t>
99 void calibrator(
const Acts::GeometryContext&,
const Acts::CalibrationContext&,
100 const Acts::SourceLink& sl,
typename trajectory_t::TrackStateProxy ts)
const {
102 auto const& m = m_measurements[indexSourceLink.index()];
103 ts.allocateCalibrated(m.local, m.covariance);
106 ts.setProjectorSubspaceIndices(std::array{Acts::eBoundLoc0, Acts::eBoundLoc1});
111 ts.setUncalibratedSourceLink(Acts::SourceLink{sl});
115 std::vector<Measurement> m_measurements;
A source link that stores just an index.
Definition IndexSourceLink.hpp:32
SpectrometerMeasurements(const Acts::TrackingGeometry &geometry, const Acts::GeometryContext &gctx, const std::vector< SHiP::RecHit > &hits, double zWindowMm=510.0)
Definition SpectrometerMeasurements.hpp:54
const ActsExamples::GeometryIdMultiset< IndexSourceLink > & sourceLinks() const
Definition SpectrometerMeasurements.hpp:91
void calibrator(const Acts::GeometryContext &, const Acts::CalibrationContext &, const Acts::SourceLink &sl, typename trajectory_t::TrackStateProxy ts) const
Definition SpectrometerMeasurements.hpp:99
const std::vector< Measurement > & measurements() const
Definition SpectrometerMeasurements.hpp:89
boost::container::flat_multiset< T, detail::CompareGeometryId > GeometryIdMultiset
Store elements that know their detector geometry id, e.g.
Definition GeometryContainers.hpp:116
std::uint32_t Index
Index type to reference elements in a container.
Definition Index.hpp:22
Definition fit_seed.cpp:16
Acts::SquareMatrix2 hitCovariance(HitUncertaintyContext const &)
Definition HitUncertainty.cpp:11
Definition HitUncertainty.hpp:24
Definition SpectrometerMeasurements.hpp:39
double time
Definition SpectrometerMeasurements.hpp:46
const Acts::Surface * surface
Definition SpectrometerMeasurements.hpp:42
Acts::Vector2 local
Definition SpectrometerMeasurements.hpp:44
Acts::SquareMatrix2 covariance
Definition SpectrometerMeasurements.hpp:45
Acts::Vector3 global
Definition SpectrometerMeasurements.hpp:43