81 Acts::Navigator navigator{std::move(navConfig),
logger().clone()};
87 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
89 CurvedStepper_t stepper{std::move(bField)};
90 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
92 m_varProp = std::make_unique<VariantPropagator>(propagator);
97 ATH_MSG_ERROR(
"Incorrect field vector size. Using empty field.");
98 return StatusCode::FAILURE;
105 ATH_MSG_INFO(
"Using constant magnetic field: (Bx, By, Bz) = "
108 auto bField = std::make_shared<Acts::ConstantBField>(constantFieldVector);
109 CurvedStepper_t stepper{std::move(bField)};
110 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
logger().clone()};
111 m_varProp = std::make_unique<VariantPropagator>(propagator);
113 Acts::StraightLineStepper stepper{};
114 StraightPropagator_t propagator{stepper, std::move(navigator),
logger().clone()};
115 m_varProp = std::make_unique<VariantPropagator>(propagator);
118 return StatusCode::FAILURE;
121 ATH_MSG_INFO(
"ACTS extrapolation successfully initialized");
122 return StatusCode::SUCCESS;
128 const Acts::BoundTrackParameters& startParameters,
129 Acts::Direction navDir ,
130 double pathLimit )
const
138 auto anygctx = geo_ctx.
context();
140 PropagationOutput output;
142 auto res = boost::apply_visitor([&](
const auto& propagator) ->
ResultType {
143 using Propagator = std::decay_t<
decltype(propagator)>;
147 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor, EndOfWorld>;
148 using Options =
typename Propagator::template Options<ActorList>;
152 auto result = propagator.propagate(startParameters, options);
160 output.first = std::move(steppingResults.steps);
161 output.second = std::move(materialResult);
163 return std::move(output);
168 <<
res.error() <<
" " <<
res.error().message()
169 <<
". Returning empty step vector.");
172 output = std::move(*
res);
175 if(output.first.size() == 0) {
176 ATH_MSG_WARNING(
"ZERO steps returned by stepper, that is not typically a good sign");
188 const Acts::BoundTrackParameters& startParameters,
189 Acts::Direction navDir ,
190 double pathLimit )
const
197 auto anygctx = geo_ctx.
context();
199 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> std::optional<const Acts::BoundTrackParameters> {
200 using Propagator = std::decay_t<
decltype(propagator)>;
204 Acts::ActorList<Acts::MaterialInteractor, EndOfWorld>;
205 using Options =
typename Propagator::template Options<ActorList>;
210 auto result = propagator.propagate(startParameters, options);
213 <<
". Returning empty parameters.");
216 return result.value().endParameters;
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) ->
ResultType {
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 ?
248 propagator.template
propagate<Acts::BoundTrackParameters, Options,
249 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters, target, options) :
250 propagator.template
propagate<Acts::BoundTrackParameters, Options,
251 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters, target, options);
261 output.first = std::move(steppingResults.steps);
262 output.second = std::move(materialResult);
263 return std::move(output);
268 <<
". Returning empty step vector.");
271 output = std::move(*
res);
281 const Acts::BoundTrackParameters& startParameters,
282 const Acts::Surface& target,
283 Acts::Direction navDir ,
284 double pathLimit )
const
292 auto anygctx = geo_ctx.
context();
294 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> std::optional<const Acts::BoundTrackParameters> {
295 using Propagator = std::decay_t<
decltype(propagator)>;
299 Acts::ActorList<Acts::MaterialInteractor>;
300 using Options =
typename Propagator::template Options<ActorList>;
303 auto result = target.type() == Acts::Surface::Perigee ?
304 propagator.template
propagate<Acts::BoundTrackParameters, Options,
305 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters, target, options) :
306 propagator.template
propagate<Acts::BoundTrackParameters, Options,
307 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters, target, options);
310 <<
". Returning empty parameters.");
313 return result.value().endParameters;
329 const Acts::MagneticFieldContext& mctx,
330 const Acts::BoundTrackParameters& startParameters,
331 Acts::Direction navDir,
332 double pathLimit)
const {
333 using namespace Acts::UnitLiterals;
334 OptionsType options(gctx, mctx);
336 options.pathLimit = pathLimit;
337 options.loopProtection
338 = (Acts::VectorHelpers::perp(startParameters.momentum())
341 options.direction = navDir;
Acts::GeometryContext context() const