9 #include "GaudiKernel/IInterface.h"
18 #include "Acts/Propagator/Navigator.hpp"
19 #include "Acts/Propagator/EigenStepper.hpp"
20 #include "Acts/Propagator/Propagator.hpp"
21 #include "Acts/Propagator/ActorList.hpp"
22 #include <Acts/Propagator/StraightLineStepper.hpp>
23 #include "Acts/Propagator/EigenStepperDefaultExtension.hpp"
25 #include "Acts/Utilities/Logger.hpp"
28 #include <boost/variant/variant.hpp>
29 #include <boost/variant/apply_visitor.hpp>
30 #include <boost/variant/static_visitor.hpp>
37 using CurvedStepper_t = Acts::EigenStepper<Acts::EigenStepperDefaultExtension>;
38 using CurvedPropagator_t = Acts::Propagator<CurvedStepper_t, Acts::Navigator>;
39 using StraightStepper_t = Acts::StraightLineStepper;
40 using StraightPropagator_t = Acts::Propagator<StraightStepper_t, Acts::Navigator>;
63 const std::string&
name,
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;
126 ExtrapolationTool::PropagationOutput
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>;
150 Options options = prepareOptions<Options>(anygctx, mctx, startParameters, navDir, pathLimit);
152 auto result = propagator.propagate(startParameters,
options);
158 auto steppingResults = propRes.template get<SteppingLogger::result_type>();
159 auto materialResult = propRes.template get<Acts::MaterialInteractor::result_type>();
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");
186 std::optional<Acts::BoundTrackParameters>
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>;
207 Options options = prepareOptions<Options>(anygctx, mctx, startParameters, navDir, pathLimit);
210 auto result = propagator.propagate(startParameters,
options);
213 <<
". Returning empty parameters.");
216 return result.value().endParameters;
222 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) ->
ResultType {
239 using Propagator = std::decay_t<decltype(propagator)>;
243 Acts::ActorList<SteppingLogger, Acts::MaterialInteractor>;
246 Options options = prepareOptions<Options>(anygctx, mctx, startParameters, navDir, pathLimit);
249 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters,
target,
options) :
251 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters,
target,
options);
259 auto steppingResults = propRes.template get<SteppingLogger::result_type>();
260 auto materialResult = propRes.template get<Acts::MaterialInteractor::result_type>();
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);
279 std::optional<Acts::BoundTrackParameters>
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>;
302 Options options = prepareOptions<Options>(anygctx, mctx, startParameters, navDir, pathLimit);
305 Acts::ForcedSurfaceReached, Acts::PathLimitReached>(startParameters,
target,
options) :
307 Acts::SurfaceReached, Acts::PathLimitReached>(startParameters,
target,
options);
310 <<
". Returning empty parameters.");
313 return result.value().endParameters;
324 return Acts::MagneticFieldContext{fieldCondObj};
327 template<
typename OptionsType>
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);
346 auto& mInteractor =
options.actorList.template get<Acts::MaterialInteractor>();