diff --git a/Examples/Algorithms/Alignment/CMakeLists.txt b/Examples/Algorithms/Alignment/CMakeLists.txt index 4a2d9495454..59c7b1d9a08 100644 --- a/Examples/Algorithms/Alignment/CMakeLists.txt +++ b/Examples/Algorithms/Alignment/CMakeLists.txt @@ -9,7 +9,7 @@ target_link_libraries( ActsExamplesAlignment PUBLIC ActsCore ActsAlignment - ActsExamplesFramework ActsExamplesMagneticField) + ActsExamplesFramework ActsExamplesMagneticField) install( TARGETS ActsExamplesAlignment diff --git a/Examples/Algorithms/Alignment/src/AlignmentAlgorithm.cpp b/Examples/Algorithms/Alignment/src/AlignmentAlgorithm.cpp index 31dc01dea11..48dde02db75 100644 --- a/Examples/Algorithms/Alignment/src/AlignmentAlgorithm.cpp +++ b/Examples/Algorithms/Alignment/src/AlignmentAlgorithm.cpp @@ -11,6 +11,7 @@ #include "Acts/Surfaces/PerigeeSurface.hpp" #include "Acts/TrackFitting/GainMatrixSmoother.hpp" #include "Acts/TrackFitting/GainMatrixUpdater.hpp" +#include "ActsExamples/EventData/MeasurementCalibration.hpp" #include "ActsExamples/EventData/ProtoTrack.hpp" #include "ActsExamples/EventData/Trajectories.hpp" #include "ActsExamples/Framework/WhiteBoard.hpp" @@ -98,8 +99,10 @@ ActsExamples::ProcessCode ActsExamples::AlignmentAlgorithm::execute( Acts::Vector3{0., 0., 0.}); Acts::KalmanFitterExtensions extensions; - MeasurementCalibrator calibrator{measurements}; - extensions.calibrator.connect<&MeasurementCalibrator::calibrate>(&calibrator); + PassThroughCalibrator pcalibrator; + MeasurementCalibratorAdapter calibrator(pcalibrator, measurements); + extensions.calibrator.connect<&MeasurementCalibratorAdapter::calibrate>( + &calibrator); Acts::GainMatrixUpdater kfUpdater; Acts::GainMatrixSmoother kfSmoother; extensions.updater.connect< diff --git a/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp b/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp index b60ee65b257..d62df237582 100644 --- a/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp +++ b/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp @@ -16,6 +16,7 @@ #include "Acts/TrackFitting/GainMatrixSmoother.hpp" #include "Acts/TrackFitting/GainMatrixUpdater.hpp" #include "ActsExamples/EventData/Measurement.hpp" +#include "ActsExamples/EventData/MeasurementCalibration.hpp" #include "ActsExamples/EventData/Track.hpp" #include "ActsExamples/Framework/ProcessCode.hpp" #include "ActsExamples/Framework/WhiteBoard.hpp" @@ -63,14 +64,16 @@ ActsExamples::ProcessCode ActsExamples::TrackFindingAlgorithm::execute( Acts::PropagatorPlainOptions pOptions; pOptions.maxSteps = 100000; - MeasurementCalibrator calibrator{measurements}; + PassThroughCalibrator pcalibrator; + MeasurementCalibratorAdapter calibrator(pcalibrator, measurements); Acts::GainMatrixUpdater kfUpdater; Acts::GainMatrixSmoother kfSmoother; Acts::MeasurementSelector measSel{m_cfg.measurementSelectorCfg}; Acts::CombinatorialKalmanFilterExtensions extensions; - extensions.calibrator.connect<&MeasurementCalibrator::calibrate>(&calibrator); + extensions.calibrator.connect<&MeasurementCalibratorAdapter::calibrate>( + &calibrator); extensions.updater.connect< &Acts::GainMatrixUpdater::operator()>( &kfUpdater); diff --git a/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFitterFunction.hpp b/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFitterFunction.hpp index f732acdc32c..b1cd9f56e86 100644 --- a/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFitterFunction.hpp +++ b/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFitterFunction.hpp @@ -21,6 +21,7 @@ #include "Acts/TrackFitting/BetheHeitlerApprox.hpp" #include "Acts/Utilities/CalibrationContext.hpp" #include "ActsExamples/EventData/Measurement.hpp" +#include "ActsExamples/EventData/MeasurementCalibration.hpp" #include "ActsExamples/EventData/Track.hpp" #include "ActsExamples/TrackFitting/RefittingCalibrator.hpp" @@ -46,7 +47,7 @@ class TrackFitterFunction { virtual TrackFitterResult operator()(const std::vector&, const TrackParameters&, const GeneralFitterOptions&, - const MeasurementCalibrator&, + const MeasurementCalibratorAdapter&, TrackContainer&) const = 0; virtual TrackFitterResult operator()(const std::vector&, diff --git a/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFittingAlgorithm.hpp b/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFittingAlgorithm.hpp index db2e3399e18..9e54c0414ae 100644 --- a/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFittingAlgorithm.hpp +++ b/Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFittingAlgorithm.hpp @@ -37,8 +37,10 @@ class TrackFittingAlgorithm final : public IAlgorithm { std::string outputTracks; /// Type erased fitter function. std::shared_ptr fit; - /// Tracking geometry for surface lookup + /// Pick a single track for debugging (-1 process all tracks) int pickTrack = -1; + // Type erased calibrator for the measurements + std::shared_ptr calibrator; }; /// Constructor of the fitting algorithm diff --git a/Examples/Algorithms/TrackFitting/src/GsfFitterFunction.cpp b/Examples/Algorithms/TrackFitting/src/GsfFitterFunction.cpp index b6f004595ba..7348012bb3c 100644 --- a/Examples/Algorithms/TrackFitting/src/GsfFitterFunction.cpp +++ b/Examples/Algorithms/TrackFitting/src/GsfFitterFunction.cpp @@ -87,7 +87,7 @@ struct GsfFitterFunctionImpl final : public ActsExamples::TrackFitterFunction { TrackFitterResult operator()(const std::vector& sourceLinks, const TrackParameters& initialParameters, const GeneralFitterOptions& options, - const MeasurementCalibrator& calibrator, + const MeasurementCalibratorAdapter& calibrator, TrackContainer& tracks) const override { const auto gsfOptions = makeGsfOptions(options, calibrator); diff --git a/Examples/Algorithms/TrackFitting/src/KalmanFitterFunction.cpp b/Examples/Algorithms/TrackFitting/src/KalmanFitterFunction.cpp index b125fe5952e..7553675ce43 100644 --- a/Examples/Algorithms/TrackFitting/src/KalmanFitterFunction.cpp +++ b/Examples/Algorithms/TrackFitting/src/KalmanFitterFunction.cpp @@ -94,7 +94,7 @@ struct KalmanFitterFunctionImpl final : public TrackFitterFunction { TrackFitterResult operator()(const std::vector& sourceLinks, const TrackParameters& initialParameters, const GeneralFitterOptions& options, - const MeasurementCalibrator& calibrator, + const MeasurementCalibratorAdapter& calibrator, TrackContainer& tracks) const override { const auto kfOptions = makeKfOptions(options, calibrator); return fitter.fit(sourceLinks.begin(), sourceLinks.end(), initialParameters, diff --git a/Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp b/Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp index 40321542b05..8f13c7f7d25 100644 --- a/Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp +++ b/Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp @@ -38,6 +38,9 @@ ActsExamples::TrackFittingAlgorithm::TrackFittingAlgorithm( if (m_cfg.outputTracks.empty()) { throw std::invalid_argument("Missing output tracks collection"); } + if (!m_cfg.calibrator) { + throw std::invalid_argument("Missing calibrator"); + } m_inputMeasurements.initialize(m_cfg.inputMeasurements); m_inputSourceLinks.initialize(m_cfg.inputSourceLinks); @@ -68,7 +71,8 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute( // Measurement calibrator must be instantiated here, because we need the // measurements to construct it. The other extensions are hold by the // fit-function-object - ActsExamples::MeasurementCalibrator calibrator(measurements); + ActsExamples::MeasurementCalibratorAdapter calibrator(*(m_cfg.calibrator), + measurements); TrackFitterFunction::GeneralFitterOptions options{ ctx.geoContext, ctx.magFieldContext, ctx.calibContext, pSurface.get(), diff --git a/Examples/Algorithms/TrackFittingChi2/src/TrackFittingChi2Algorithm.cpp b/Examples/Algorithms/TrackFittingChi2/src/TrackFittingChi2Algorithm.cpp index b7ed29876e8..10febed6960 100644 --- a/Examples/Algorithms/TrackFittingChi2/src/TrackFittingChi2Algorithm.cpp +++ b/Examples/Algorithms/TrackFittingChi2/src/TrackFittingChi2Algorithm.cpp @@ -10,6 +10,7 @@ #include "Acts/EventData/TrackContainer.hpp" #include "Acts/Surfaces/PerigeeSurface.hpp" +#include "ActsExamples/EventData/MeasurementCalibration.hpp" #include "ActsExamples/EventData/ProtoTrack.hpp" #include "ActsExamples/Framework/WhiteBoard.hpp" @@ -64,8 +65,10 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute( // Set Chi2 options Acts::Experimental::Chi2FitterExtensions extensions; - MeasurementCalibrator calibrator{measurements}; - extensions.calibrator.connect<&MeasurementCalibrator::calibrate>(&calibrator); + PassThroughCalibrator pcalibrator; + MeasurementCalibratorAdapter calibrator(pcalibrator, measurements); + extensions.calibrator.connect<&MeasurementCalibratorAdapter::calibrate>( + &calibrator); Acts::Experimental::Chi2FitterOptions chi2Options( ctx.geoContext, ctx.magFieldContext, ctx.calibContext, extensions, diff --git a/Examples/Framework/CMakeLists.txt b/Examples/Framework/CMakeLists.txt index e72d6bfa927..24cae515337 100644 --- a/Examples/Framework/CMakeLists.txt +++ b/Examples/Framework/CMakeLists.txt @@ -2,6 +2,7 @@ include(ActsTargetLinkLibrariesSystem) add_library( ActsExamplesFramework SHARED + src/EventData/MeasurementCalibration.cpp src/Framework/IAlgorithm.cpp src/Framework/SequenceElement.cpp src/Framework/WhiteBoard.cpp @@ -62,4 +63,4 @@ install( install( DIRECTORY include/ActsExamples - DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) \ No newline at end of file + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/Examples/Framework/include/ActsExamples/EventData/Measurement.hpp b/Examples/Framework/include/ActsExamples/EventData/Measurement.hpp index a770d0da78b..df16d773103 100644 --- a/Examples/Framework/include/ActsExamples/EventData/Measurement.hpp +++ b/Examples/Framework/include/ActsExamples/EventData/Measurement.hpp @@ -1,6 +1,6 @@ // This file is part of the Acts project. // -// Copyright (C) 2020 CERN for the benefit of the Acts project +// Copyright (C) 2020-2023 CERN for the benefit of the Acts project // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -8,19 +8,15 @@ #pragma once -#include "Acts/EventData/Measurement.hpp" -#include "Acts/EventData/MultiTrajectory.hpp" -#include "Acts/EventData/SourceLink.hpp" -#include "Acts/EventData/VectorMultiTrajectory.hpp" -#include "ActsExamples/EventData/IndexSourceLink.hpp" +#include -#include #include namespace ActsExamples { /// Variable measurement type that can contain all possible combinations. using Measurement = ::Acts::BoundVariantMeasurement; + /// Container of measurements. /// /// In contrast to the source links, the measurements themself must not be @@ -28,41 +24,4 @@ using Measurement = ::Acts::BoundVariantMeasurement; /// as opaque here and no ordering is enforced on the stored measurements. using MeasurementContainer = std::vector; -/// Calibrator to convert an index source link to a measurement. -class MeasurementCalibrator { - public: - /// Construct an invalid calibrator. Required to allow copying. - MeasurementCalibrator() = default; - /// Construct using a user-provided container to chose measurements from. - MeasurementCalibrator(const MeasurementContainer& measurements) - : m_measurements(&measurements) {} - - /// Find the measurement corresponding to the source link. - /// - /// @tparam parameters_t Track parameters type - /// @param gctx The geometry context (unused) - /// @param trackState The track state to calibrate - void calibrate( - const Acts::GeometryContext& /*gctx*/, - Acts::MultiTrajectory::TrackStateProxy - trackState) const { - const IndexSourceLink& sourceLink = - trackState.getUncalibratedSourceLink().get(); - assert(m_measurements and - "Undefined measurement container in DigitizedCalibrator"); - assert((sourceLink.index() < m_measurements->size()) and - "Source link index is outside the container bounds"); - std::visit( - [&](const auto& meas) { - trackState.allocateCalibrated(meas.size()); - trackState.setCalibrated(meas); - }, - (*m_measurements)[sourceLink.index()]); - } - - private: - // use pointer so the calibrator is copyable and default constructible. - const MeasurementContainer* m_measurements = nullptr; -}; - } // namespace ActsExamples diff --git a/Examples/Framework/include/ActsExamples/EventData/MeasurementCalibration.hpp b/Examples/Framework/include/ActsExamples/EventData/MeasurementCalibration.hpp new file mode 100644 index 00000000000..c5e2d497011 --- /dev/null +++ b/Examples/Framework/include/ActsExamples/EventData/MeasurementCalibration.hpp @@ -0,0 +1,65 @@ +// This file is part of the Acts project. +// +// Copyright (C) 2023 CERN for the benefit of the Acts project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#pragma once + +#include "Acts/EventData/MultiTrajectory.hpp" +#include "Acts/EventData/SourceLink.hpp" +#include "Acts/EventData/VectorMultiTrajectory.hpp" +#include "ActsExamples/EventData/IndexSourceLink.hpp" +#include + +#include + +namespace ActsExamples { + +/// Abstract base class for measurement-based calibration +class MeasurementCalibrator { + public: + virtual void calibrate( + const MeasurementContainer& measurements, + const Acts::GeometryContext& gctx, + Acts::MultiTrajectory::TrackStateProxy& + trackState) const = 0; + + virtual ~MeasurementCalibrator() = default; +}; + +// Calibrator to convert an index source link to a measurement as-is +class PassThroughCalibrator : public MeasurementCalibrator { + public: + /// Find the measurement corresponding to the source link. + /// + /// @tparam parameters_t Track parameters type + /// @param gctx The geometry context (unused) + /// @param trackState The track state to calibrate + void calibrate( + const MeasurementContainer& measurements, + const Acts::GeometryContext& /*gctx*/, + Acts::MultiTrajectory::TrackStateProxy& + trackState) const override; +}; + +// Adapter class that wraps a MeasurementCalibrator to conform to the +// core ACTS calibration interface +class MeasurementCalibratorAdapter { + public: + MeasurementCalibratorAdapter(const MeasurementCalibrator& calibrator, + const MeasurementContainer& measurements); + + void calibrate( + const Acts::GeometryContext& gctx, + Acts::MultiTrajectory::TrackStateProxy + trackState) const; + + private: + const MeasurementCalibrator& m_calibrator; + const MeasurementContainer& m_measurements; +}; + +} // namespace ActsExamples diff --git a/Examples/Framework/src/EventData/MeasurementCalibration.cpp b/Examples/Framework/src/EventData/MeasurementCalibration.cpp new file mode 100644 index 00000000000..7e12db9f8a2 --- /dev/null +++ b/Examples/Framework/src/EventData/MeasurementCalibration.cpp @@ -0,0 +1,39 @@ +// This file is part of the Acts project. +// +// Copyright (C) 2023 CERN for the benefit of the Acts project +// +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#include + +void ActsExamples::PassThroughCalibrator::calibrate( + const MeasurementContainer& measurements, + const Acts::GeometryContext& /*gctx*/, + Acts::MultiTrajectory::TrackStateProxy& + trackState) const { + const IndexSourceLink& sourceLink = + trackState.getUncalibratedSourceLink().get(); + assert((sourceLink.index() < measurements.size()) and + "Source link index is outside the container bounds"); + + std::visit( + [&trackState](const auto& meas) { + trackState.allocateCalibrated(meas.size()); + trackState.setCalibrated(meas); + }, + (measurements)[sourceLink.index()]); +} + +ActsExamples::MeasurementCalibratorAdapter::MeasurementCalibratorAdapter( + const MeasurementCalibrator& calibrator, + const MeasurementContainer& measurements) + : m_calibrator{calibrator}, m_measurements{measurements} {} + +void ActsExamples::MeasurementCalibratorAdapter::calibrate( + const Acts::GeometryContext& gctx, + Acts::MultiTrajectory::TrackStateProxy + trackState) const { + return m_calibrator.calibrate(m_measurements, gctx, trackState); +} diff --git a/Examples/Io/Csv/include/ActsExamples/Io/Csv/CsvMeasurementReader.hpp b/Examples/Io/Csv/include/ActsExamples/Io/Csv/CsvMeasurementReader.hpp index f41a227e88c..feeee5cd7ae 100644 --- a/Examples/Io/Csv/include/ActsExamples/Io/Csv/CsvMeasurementReader.hpp +++ b/Examples/Io/Csv/include/ActsExamples/Io/Csv/CsvMeasurementReader.hpp @@ -11,6 +11,8 @@ #include "Acts/Geometry/TrackingGeometry.hpp" #include "Acts/Utilities/Logger.hpp" #include "ActsExamples/EventData/Cluster.hpp" +#include "ActsExamples/EventData/Index.hpp" +#include "ActsExamples/EventData/IndexSourceLink.hpp" #include "ActsExamples/EventData/Measurement.hpp" #include "ActsExamples/Framework/DataHandle.hpp" #include "ActsExamples/Framework/IReader.hpp" diff --git a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp index aad6934c457..692345c4cde 100644 --- a/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp +++ b/Examples/Io/EDM4hep/include/ActsExamples/Io/EDM4hep/EDM4hepMeasurementReader.hpp @@ -9,6 +9,7 @@ #include "Acts/Utilities/Logger.hpp" #include "ActsExamples/EventData/Cluster.hpp" +#include "ActsExamples/EventData/IndexSourceLink.hpp" #include "ActsExamples/EventData/Measurement.hpp" #include "ActsExamples/Framework/DataHandle.hpp" #include "ActsExamples/Framework/IReader.hpp" diff --git a/Examples/Python/python/acts/examples/reconstruction.py b/Examples/Python/python/acts/examples/reconstruction.py index 2f1396c093f..b1e19f9ee31 100644 --- a/Examples/Python/python/acts/examples/reconstruction.py +++ b/Examples/Python/python/acts/examples/reconstruction.py @@ -853,6 +853,7 @@ def addKalmanTracks( fit=acts.examples.makeKalmanFitterFunction( trackingGeometry, field, **kalmanOptions ), + calibrator=acts.examples.makePassThroughCalibrator(), ) s.addAlgorithm(fitAlg) @@ -896,6 +897,7 @@ def addTruthTrackingGsf( outputTracks="gsf_tracks", pickTrack=-1, fit=acts.examples.makeGsfFitterFunction(trackingGeometry, field, **gsfOptions), + calibrator=acts.examples.makePassThroughCalibrator(), ) s.addAlgorithm(gsfAlg) diff --git a/Examples/Python/src/TrackFitting.cpp b/Examples/Python/src/TrackFitting.cpp index 98cefc1ccf9..93eab987536 100644 --- a/Examples/Python/src/TrackFitting.cpp +++ b/Examples/Python/src/TrackFitting.cpp @@ -38,7 +38,7 @@ void addTrackFitting(Context& ctx) { ACTS_PYTHON_DECLARE_ALGORITHM( ActsExamples::TrackFittingAlgorithm, mex, "TrackFittingAlgorithm", inputMeasurements, inputSourceLinks, inputProtoTracks, - inputInitialTrackParameters, outputTracks, fit, pickTrack); + inputInitialTrackParameters, outputTracks, fit, pickTrack, calibrator); ACTS_PYTHON_DECLARE_ALGORITHM(ActsExamples::RefittingAlgorithm, mex, "RefittingAlgorithm", inputTracks, outputTracks, @@ -66,6 +66,14 @@ void addTrackFitting(Context& ctx) { py::arg("reverseFilteringMomThreshold"), py::arg("freeToBoundCorrection"), py::arg("level")); + py::class_>( + mex, "MeasurementCalibrator"); + + mex.def("makePassThroughCalibrator", + []() -> std::shared_ptr { + return std::make_shared(); + }); + py::enum_(mex, "FinalReductionMethod") .value("mean", Acts::FinalReductionMethod::eMean) .value("maxWeight", Acts::FinalReductionMethod::eMaxWeight);