8 #include "GaudiKernel/IInterface.h"
17 #include "Acts/Propagator/Navigator.hpp"
18 #include "Acts/Propagator/EigenStepper.hpp"
19 #include "Acts/Propagator/Propagator.hpp"
20 #include "Acts/Propagator/AbortList.hpp"
21 #include "Acts/Propagator/ActionList.hpp"
22 #include <Acts/Propagator/StraightLineStepper.hpp>
24 #include "Acts/Surfaces/BoundaryCheck.hpp"
25 #include "Acts/Utilities/Logger.hpp"
27 #include "Acts/Propagator/DefaultExtension.hpp"
28 #include "Acts/Propagator/DenseEnvironmentExtension.hpp"
32 #include <boost/variant/variant.hpp>
33 #include <boost/variant/apply_visitor.hpp>
34 #include <boost/variant/static_visitor.hpp>
44 Acts::Propagator<Acts::EigenStepper<Acts::StepperExtensionList<Acts::DefaultExtension,
45 Acts::DenseEnvironmentExtension>,
46 Acts::detail::HighestValidAuctioneer>,
48 Acts::Propagator<Acts::EigenStepper<Acts::StepperExtensionList<Acts::DefaultExtension,
49 Acts::DenseEnvironmentExtension>,
50 Acts::detail::HighestValidAuctioneer>,
79 using namespace std::literals::string_literals;
87 std::shared_ptr<const Acts::TrackingGeometry> trackingGeometry
90 Acts::Navigator navigator( Acts::Navigator::Config{ trackingGeometry } );
94 using Stepper = Acts::EigenStepper<Acts::StepperExtensionList<Acts::DefaultExtension,
95 Acts::DenseEnvironmentExtension>,
96 Acts::detail::HighestValidAuctioneer>;
99 auto bField = std::make_shared<ATLASMagneticFieldWrapper>();
101 auto stepper = Stepper(std::move(bField));
102 auto propagator = Acts::Propagator<Stepper, Acts::Navigator>(std::move(stepper),
103 std::move(navigator),
104 logger().cloneWithSuffix(
"Prop"));
105 m_varProp = std::make_unique<VariantPropagator>(propagator);
110 ATH_MSG_ERROR(
"Incorrect field vector size. Using empty field.");
111 return StatusCode::FAILURE;
122 using Stepper = Acts::EigenStepper<Acts::StepperExtensionList<Acts::DefaultExtension,
123 Acts::DenseEnvironmentExtension>,
124 Acts::detail::HighestValidAuctioneer>;
126 auto bField = std::make_shared<Acts::ConstantBField>(constantFieldVector);
127 auto stepper = Stepper(std::move(bField));
128 auto propagator = Acts::Propagator<Stepper, Acts::Navigator>(std::move(stepper),
129 std::move(navigator));
130 m_varProp = std::make_unique<VariantPropagator>(propagator);
133 ATH_MSG_INFO(
"ACTS extrapolation successfully initialized");
134 return StatusCode::SUCCESS;
140 const Acts::BoundTrackParameters& startParameters,
141 Acts::Direction navDir ,
142 double pathLimit )
const
144 using namespace Acts::UnitLiterals;
155 Acts::ActionList<SteppingLogger, Acts::MaterialInteractor>;
156 using AbortConditions = Acts::AbortList<EndOfWorld>;
158 using Options = Acts::DenseStepperPropagatorOptions<ActionList, AbortConditions>;
170 auto &mInteractor =
options.actionList.get<Acts::MaterialInteractor>();
177 auto res = boost::apply_visitor([&](
const auto& propagator) ->
ResultType {
178 auto result = propagator.propagate(startParameters,
options);
180 return result.error();
184 auto steppingResults = propRes.template get<SteppingLogger::result_type>();
185 auto materialResult = propRes.template get<Acts::MaterialInteractor::result_type>();
186 output.first = std::move(steppingResults.steps);
187 output.second = std::move(materialResult);
194 <<
res.error() <<
" " <<
res.error().message()
195 <<
". Returning empty step vector.");
201 if(
output.first.size() == 0) {
202 ATH_MSG_WARNING(
"ZERO steps returned by stepper, that is not typically a good sign");
212 std::optional<const Acts::CurvilinearTrackParameters>
214 const Acts::BoundTrackParameters& startParameters,
215 Acts::Direction navDir ,
216 double pathLimit )
const
218 using namespace Acts::UnitLiterals;
221 Acts::MagneticFieldContext mctx;
229 Acts::ActionList<Acts::MaterialInteractor>;
230 using AbortConditions = Acts::AbortList<EndOfWorld>;
231 using Options = Acts::DenseStepperPropagatorOptions<ActionList, AbortConditions>;
243 auto& mInteractor =
options.actionList.get<Acts::MaterialInteractor>();
248 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> std::optional<const Acts::CurvilinearTrackParameters> {
249 auto result = propagator.propagate(startParameters,
options);
251 ATH_MSG_ERROR(
"Got error during propagation:" << result.error()
252 <<
". Returning empty parameters.");
255 return result.value().endParameters;
263 const Acts::BoundTrackParameters& startParameters,
264 const Acts::Surface&
target,
265 Acts::Direction navDir ,
266 double pathLimit )
const
268 using namespace Acts::UnitLiterals;
279 Acts::ActionList<SteppingLogger, Acts::MaterialInteractor>;
280 using AbortConditions = Acts::AbortList<EndOfWorld>;
281 using Options = Acts::DenseStepperPropagatorOptions<ActionList, AbortConditions>;
293 auto& mInteractor =
options.actionList.get<Acts::MaterialInteractor>();
300 auto res = boost::apply_visitor([&](
const auto& propagator) ->
ResultType {
303 return result.error();
307 auto steppingResults = propRes.template get<SteppingLogger::result_type>();
308 auto materialResult = propRes.template get<Acts::MaterialInteractor::result_type>();
309 output.first = std::move(steppingResults.steps);
310 output.second = std::move(materialResult);
316 <<
". Returning empty step vector.");
327 std::optional<const Acts::BoundTrackParameters>
329 const Acts::BoundTrackParameters& startParameters,
330 const Acts::Surface&
target,
331 Acts::Direction navDir ,
332 double pathLimit )
const
334 using namespace Acts::UnitLiterals;
345 Acts::ActionList<Acts::MaterialInteractor>;
346 using AbortConditions = Acts::AbortList<EndOfWorld>;
347 using Options = Acts::DenseStepperPropagatorOptions<ActionList, AbortConditions>;
359 auto& mInteractor =
options.actionList.get<Acts::MaterialInteractor>();
364 auto parameters = boost::apply_visitor([&](
const auto& propagator) -> std::optional<const Acts::BoundTrackParameters> {
367 ATH_MSG_ERROR(
"Got error during propagation: " << result.error()
368 <<
". Returning empty parameters.");
371 return result.value().endParameters;
379 if (!readHandle.isValid()) {
380 std::stringstream
msg;
382 throw std::runtime_error(
msg.str());
386 return Acts::MagneticFieldContext(fieldCondObj);