80 Acts::Navigator navigator{std::move(navConfig),
logger().clone()};
86 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
88 CurvedStepper_t stepper{std::move(bField)};
89 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
91 m_varProp = std::make_unique<VariantPropagator>(propagator);
96 ATH_MSG_ERROR(
"Incorrect field vector size. Using empty field.");
97 return StatusCode::FAILURE;
104 ATH_MSG_INFO(
"Using constant magnetic field: (Bx, By, Bz) = "
107 auto bField = std::make_shared<Acts::ConstantBField>(constantFieldVector);
108 CurvedStepper_t stepper{std::move(bField)};
109 CurvedPropagator_t propagator{std::move(stepper), std::move(navigator),
logger().clone()};
110 m_varProp = std::make_unique<VariantPropagator>(propagator);
112 Acts::StraightLineStepper stepper{};
113 StraightPropagator_t propagator{stepper, std::move(navigator),
logger().clone()};
114 m_varProp = std::make_unique<VariantPropagator>(propagator);
117 return StatusCode::FAILURE;
120 ATH_MSG_INFO(
"ACTS extrapolation successfully initialized");
121 return StatusCode::SUCCESS;
127 const Acts::BoundTrackParameters& startParameters,
128 Acts::Direction navDir ,
129 double pathLimit )
const
137 auto anygctx = geo_ctx.
context();
139 PropagationOutput output;
141 auto res = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<ExtrapolationTool::PropagationOutput> {
142 using Propagator = std::decay_t<
decltype(propagator)>;
146 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor, EndOfWorld>;
147 using Options =
typename Propagator::template Options<ActorList>;
151 auto result = propagator.propagate(startParameters, options);
159 output.first = std::move(steppingResults.steps);
160 output.second = std::move(materialResult);
162 return std::move(output);
167 <<
res.error() <<
" " <<
res.error().message()
168 <<
". Returning empty step vector.");
171 output = std::move(*
res);
174 if(output.first.size() == 0) {
175 ATH_MSG_WARNING(
"ZERO steps returned by stepper, that is not typically a good sign");
187 const Acts::BoundTrackParameters& startParameters,
188 Acts::Direction navDir ,
189 double pathLimit )
const
196 auto anygctx = geo_ctx.
context();
198 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<Acts::BoundTrackParameters> {
199 using Propagator = std::decay_t<
decltype(propagator)>;
203 Acts::ActorList<Acts::MaterialInteractor, EndOfWorld>;
204 using Options =
typename Propagator::template Options<ActorList>;
209 auto result = propagator.propagate(startParameters, options);
214 if (!
result.value().endParameters.has_value()) {
215 ATH_MSG_DEBUG(
"Propagation did not result in valid end parameters.");
216 return Acts::PropagatorError::Failure;
218 return result.value().endParameters.value();
226 const Acts::BoundTrackParameters& startParameters,
227 const Acts::Surface& target,
228 Acts::Direction navDir ,
229 double pathLimit )
const
233 PropagationOutput output;
238 auto anygctx = geo_ctx.
context();
240 auto res = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<ExtrapolationTool::PropagationOutput> {
241 using Propagator = std::decay_t<
decltype(propagator)>;
245 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor>;
246 using Options =
typename Propagator::template Options<ActorList>;
249 auto result = target.type() == Acts::Surface::Perigee ?
250 propagator.template
propagate<Acts::BoundTrackParameters, Options,
251 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters, target, options) :
252 propagator.template
propagate<Acts::BoundTrackParameters, Options,
253 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters, target, options);
263 output.first = std::move(steppingResults.steps);
264 output.second = std::move(materialResult);
265 return std::move(output);
270 <<
". Returning empty step vector.");
273 output = std::move(*
res);
283 const Acts::BoundTrackParameters& startParameters,
284 const Acts::Surface& target,
285 Acts::Direction navDir ,
286 double pathLimit )
const
294 auto anygctx = geo_ctx.
context();
296 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> Acts::Result<Acts::BoundTrackParameters> {
297 using Propagator = std::decay_t<
decltype(propagator)>;
301 Acts::ActorList<Acts::MaterialInteractor>;
302 using Options =
typename Propagator::template Options<ActorList>;
305 auto result = target.type() == Acts::Surface::Perigee ?
306 propagator.template
propagate<Acts::BoundTrackParameters, Options,
307 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters, target, options) :
308 propagator.template
propagate<Acts::BoundTrackParameters, Options,
309 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters, target, options);
314 if (!
result.value().endParameters.has_value()) {
315 ATH_MSG_DEBUG(
"Propagation did not result in valid end parameters.");
316 return Acts::PropagatorError::Failure;
318 return result.value().endParameters.value();
334 const Acts::MagneticFieldContext& mctx,
335 const Acts::BoundTrackParameters& startParameters,
336 Acts::Direction navDir,
337 double pathLimit)
const {
338 using namespace Acts::UnitLiterals;
339 OptionsType options(gctx, mctx);
341 options.pathLimit = pathLimit;
342 options.loopProtection
343 = (Acts::VectorHelpers::perp(startParameters.momentum())
346 options.direction = navDir;
Acts::GeometryContext context() const