9#include "GaudiKernel/IInterface.h"
16#include "Acts/Propagator/Navigator.hpp"
17#include "Acts/Propagator/EigenStepper.hpp"
18#include "Acts/Propagator/Propagator.hpp"
19#include "Acts/Propagator/ActorList.hpp"
20#include <Acts/Propagator/StraightLineStepper.hpp>
21#include "Acts/Propagator/EigenStepperDefaultExtension.hpp"
23#include "Acts/Utilities/Logger.hpp"
26#include <boost/variant/variant.hpp>
27#include <boost/variant/apply_visitor.hpp>
28#include <boost/variant/static_visitor.hpp>
35 using SteppingLogger = Acts::detail::SteppingLogger;
36 using EndOfWorld = Acts::EndOfWorldReached;
38 using CurvedStepper_t = Acts::EigenStepper<Acts::EigenStepperDefaultExtension>;
39 using CurvedPropagator_t = Acts::Propagator<CurvedStepper_t, Acts::Navigator>;
40 using StraightStepper_t = Acts::StraightLineStepper;
41 using StraightPropagator_t = Acts::Propagator<StraightStepper_t, Acts::Navigator>;
50 using VariantPropagatorBase::VariantPropagatorBase;
60 const std::string& name,
61 const IInterface* parent):
62 base_class{
type,name, parent} {}
78 Acts::Navigator navigator{std::move(navConfig),
logger().clone()};
84 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
86 CurvedStepper_t stepper{std::move(bField)};
87 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
89 m_varProp = std::make_unique<VariantPropagator>(propagator);
94 ATH_MSG_ERROR(
"Incorrect field vector size. Using empty field.");
95 return StatusCode::FAILURE;
102 ATH_MSG_INFO(
"Using constant magnetic field: (Bx, By, Bz) = "
105 auto bField = std::make_shared<Acts::ConstantBField>(constantFieldVector);
106 CurvedStepper_t stepper{std::move(bField)};
107 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
logger().clone()};
108 m_varProp = std::make_unique<VariantPropagator>(propagator);
110 Acts::StraightLineStepper stepper{};
111 StraightPropagator_t propagator{stepper, std::move(navigator),
logger().clone()};
112 m_varProp = std::make_unique<VariantPropagator>(propagator);
115 return StatusCode::FAILURE;
118 ATH_MSG_INFO(
"ACTS extrapolation successfully initialized");
119 return StatusCode::SUCCESS;
123Acts::Result<ExtrapolationTool::PropagationOutput>
125 const Acts::BoundTrackParameters& startParameters,
126 Acts::Direction navDir ,
127 double pathLimit )
const
135 auto anygctx = geo_ctx.
context();
137 PropagationOutput output;
139 auto res = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<ExtrapolationTool::PropagationOutput> {
140 using Propagator = std::decay_t<
decltype(propagator)>;
144 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor, EndOfWorld>;
145 using Options =
typename Propagator::template Options<ActorList>;
149 auto result = propagator.propagate(startParameters, options);
151 return result.error();
153 auto& propRes = *result;
157 output.first = std::move(steppingResults.steps);
158 output.second = std::move(materialResult);
160 return std::move(output);
165 <<
res.error() <<
" " <<
res.error().message()
166 <<
". Returning empty step vector.");
169 output = std::move(*
res);
172 if(output.first.size() == 0) {
173 ATH_MSG_WARNING(
"ZERO steps returned by stepper, that is not typically a good sign");
183Acts::Result<Acts::BoundTrackParameters>
185 const Acts::BoundTrackParameters& startParameters,
186 Acts::Direction navDir ,
187 double pathLimit )
const
194 auto anygctx = geo_ctx.
context();
196 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<Acts::BoundTrackParameters> {
197 using Propagator = std::decay_t<
decltype(propagator)>;
201 Acts::ActorList<Acts::MaterialInteractor, EndOfWorld>;
202 using Options =
typename Propagator::template Options<ActorList>;
207 auto result = propagator.propagate(startParameters, options);
209 ATH_MSG_DEBUG(
"Got error during propagation:" << result.error());
210 return result.error();
212 if (!result.value().endParameters.has_value()) {
213 ATH_MSG_DEBUG(
"Propagation did not result in valid end parameters.");
214 return Acts::PropagatorError::Failure;
216 return result.value().endParameters.value();
222Acts::Result<ExtrapolationTool::PropagationOutput>
224 const Acts::BoundTrackParameters& startParameters,
225 const Acts::Surface& target,
226 Acts::Direction navDir ,
227 double pathLimit )
const
231 PropagationOutput output;
236 auto anygctx = geo_ctx.
context();
238 auto res = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<ExtrapolationTool::PropagationOutput> {
239 using Propagator = std::decay_t<
decltype(propagator)>;
243 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor>;
244 using Options =
typename Propagator::template Options<ActorList>;
247 auto result = target.type() == Acts::Surface::Perigee ?
253 return result.error();
255 auto& propRes = *result;
259 output.first = std::move(steppingResults.steps);
260 output.second = std::move(materialResult);
261 return std::move(output);
266 <<
". Returning empty step vector.");
269 output = std::move(*
res);
277Acts::Result<Acts::BoundTrackParameters>
279 const Acts::BoundTrackParameters& startParameters,
280 const Acts::Surface& target,
281 Acts::Direction navDir ,
282 double pathLimit )
const
290 auto anygctx = geo_ctx.
context();
292 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<Acts::BoundTrackParameters> {
293 using Propagator = std::decay_t<
decltype(propagator)>;
297 Acts::ActorList<Acts::MaterialInteractor>;
298 using Options =
typename Propagator::template Options<ActorList>;
301 auto result = target.type() == Acts::Surface::Perigee ?
305 ATH_MSG_DEBUG(
"Got error during propagation: " << result.error());
306 return result.error();
308 if (!result.value().endParameters.has_value()) {
309 ATH_MSG_DEBUG(
"Propagation did not result in valid end parameters.");
310 return Acts::PropagatorError::Failure;
312 return result.value().endParameters.value();
323 return Acts::MagneticFieldContext{fieldCondObj};
326template<
typename OptionsType>
328 const Acts::MagneticFieldContext& mctx,
329 const Acts::BoundTrackParameters& startParameters,
330 Acts::Direction navDir,
331 double pathLimit)
const {
332 using namespace Acts::UnitLiterals;
333 OptionsType options(gctx, mctx);
335 options.pathLimit = pathLimit;
336 options.loopProtection
337 = (Acts::VectorHelpers::perp(startParameters.momentum())
340 options.direction = navDir;
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
std::unique_ptr< const Acts::Logger > makeActsAthenaLogger(IMessageSvc *svc, const std::string &name, int level, std::optional< std::string > parent_name)
Acts::GeometryContext context() const
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
The AlignStoreProviderAlg loads the rigid alignment corrections and pipes them through the readout ge...
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
const T * get(const ReadCondHandleKey< T > &key, const EventContext &ctx)
Convenience function to retrieve an object given a ReadCondHandleKey.