File indexing completed on 2025-08-05 08:09:49
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "ActsExamples/TrackFitting/RefittingAlgorithm.hpp"
0010
0011 #include "Acts/Definitions/Algebra.hpp"
0012 #include "Acts/EventData/GenericBoundTrackParameters.hpp"
0013 #include "Acts/EventData/MultiTrajectory.hpp"
0014 #include "Acts/EventData/SourceLink.hpp"
0015 #include "Acts/EventData/TrackContainer.hpp"
0016 #include "Acts/EventData/TrackParameters.hpp"
0017 #include "Acts/EventData/TrackProxy.hpp"
0018 #include "Acts/EventData/VectorMultiTrajectory.hpp"
0019 #include "Acts/EventData/VectorTrackContainer.hpp"
0020 #include "Acts/Propagator/Propagator.hpp"
0021 #include "Acts/Surfaces/Surface.hpp"
0022 #include "Acts/Utilities/Result.hpp"
0023 #include "ActsExamples/Framework/AlgorithmContext.hpp"
0024 #include "ActsExamples/TrackFitting/RefittingCalibrator.hpp"
0025 #include "ActsExamples/TrackFitting/TrackFitterFunction.hpp"
0026
0027 #include <functional>
0028 #include <optional>
0029 #include <ostream>
0030 #include <stdexcept>
0031 #include <system_error>
0032 #include <utility>
0033 #include <vector>
0034
0035 ActsExamples::RefittingAlgorithm::RefittingAlgorithm(Config config,
0036 Acts::Logging::Level level)
0037 : ActsExamples::IAlgorithm("TrackFittingAlgorithm", level),
0038 m_cfg(std::move(config)) {
0039 if (m_cfg.inputTracks.empty()) {
0040 throw std::invalid_argument("Missing input tracks collection");
0041 }
0042 if (m_cfg.outputTracks.empty()) {
0043 throw std::invalid_argument("Missing output tracks collection");
0044 }
0045
0046 m_inputTracks.initialize(m_cfg.inputTracks);
0047 m_outputTracks.initialize(m_cfg.outputTracks);
0048 }
0049
0050 ActsExamples::ProcessCode ActsExamples::RefittingAlgorithm::execute(
0051 const ActsExamples::AlgorithmContext& ctx) const {
0052 const auto& inputTracks = m_inputTracks(ctx);
0053
0054 auto trackContainer = std::make_shared<Acts::VectorTrackContainer>();
0055 auto trackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
0056 TrackContainer tracks(trackContainer, trackStateContainer);
0057
0058
0059 std::vector<Acts::SourceLink> trackSourceLinks;
0060 std::vector<const Acts::Surface*> surfSequence;
0061 RefittingCalibrator calibrator;
0062
0063 auto itrack = 0ul;
0064 for (const auto& track : inputTracks) {
0065
0066 if (m_cfg.pickTrack > -1 && m_cfg.pickTrack != static_cast<int>(itrack++)) {
0067 continue;
0068 }
0069
0070 TrackFitterFunction::GeneralFitterOptions options{
0071 ctx.geoContext, ctx.magFieldContext, ctx.calibContext,
0072 &track.referenceSurface(), Acts::PropagatorPlainOptions()};
0073
0074 const Acts::BoundTrackParameters initialParams(
0075 track.referenceSurface().getSharedPtr(), track.parameters(),
0076 track.covariance(), track.particleHypothesis());
0077
0078 trackSourceLinks.clear();
0079 surfSequence.clear();
0080
0081 for (auto state : track.trackStatesReversed()) {
0082 surfSequence.push_back(&state.referenceSurface());
0083
0084 if (!state.hasCalibrated()) {
0085 continue;
0086 }
0087
0088 auto sl = RefittingCalibrator::RefittingSourceLink{state};
0089 trackSourceLinks.push_back(Acts::SourceLink{sl});
0090 }
0091
0092 if (surfSequence.empty()) {
0093 ACTS_WARNING("Empty track " << itrack << " found.");
0094 continue;
0095 }
0096
0097 ACTS_VERBOSE("Initial parameters: "
0098 << initialParams.fourPosition(ctx.geoContext).transpose()
0099 << " -> " << initialParams.direction().transpose());
0100
0101 ACTS_DEBUG("Invoke direct fitter for track " << itrack);
0102 auto result = (*m_cfg.fit)(trackSourceLinks, initialParams, options,
0103 calibrator, surfSequence, tracks);
0104
0105 if (result.ok()) {
0106
0107 const auto& refittedTrack = result.value();
0108 if (refittedTrack.hasReferenceSurface()) {
0109 ACTS_VERBOSE("Refitted parameters for track " << itrack);
0110 ACTS_VERBOSE(" " << track.parameters().transpose());
0111 } else {
0112 ACTS_DEBUG("No refitted parameters for track " << itrack);
0113 }
0114 } else {
0115 ACTS_WARNING("Fit failed for track "
0116 << itrack << " with error: " << result.error() << ", "
0117 << result.error().message());
0118 }
0119 }
0120
0121 std::stringstream ss;
0122 trackStateContainer->statistics().toStream(ss);
0123 ACTS_DEBUG(ss.str());
0124
0125 ConstTrackContainer constTracks{
0126 std::make_shared<Acts::ConstVectorTrackContainer>(
0127 std::move(*trackContainer)),
0128 std::make_shared<Acts::ConstVectorMultiTrajectory>(
0129 std::move(*trackStateContainer))};
0130
0131 m_outputTracks(ctx, std::move(constTracks));
0132 return ActsExamples::ProcessCode::SUCCESS;
0133 }