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 SteppingLogger = Acts::detail::SteppingLogger;
38 using EndOfWorld = Acts::EndOfWorldReached;
40 using CurvedStepper_t = Acts::EigenStepper<Acts::EigenStepperDefaultExtension>;
41 using CurvedPropagator_t = Acts::Propagator<CurvedStepper_t, Acts::Navigator>;
42 using StraightStepper_t = Acts::StraightLineStepper;
43 using StraightPropagator_t = Acts::Propagator<StraightStepper_t, Acts::Navigator>;
52 using VariantPropagatorBase::VariantPropagatorBase;
62 const std::string& name,
63 const IInterface* parent):
64 base_class{
type,name, parent} {}
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;
125Acts::Result<ExtrapolationTool::PropagationOutput>
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);
153 return result.error();
155 auto& propRes = *result;
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");
185Acts::Result<Acts::BoundTrackParameters>
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);
211 ATH_MSG_DEBUG(
"Got error during propagation:" << result.error());
212 return result.error();
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();
224Acts::Result<ExtrapolationTool::PropagationOutput>
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 ?
255 return result.error();
257 auto& propRes = *result;
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);
279Acts::Result<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) -> Acts::Result<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 ?
307 ATH_MSG_DEBUG(
"Got error during propagation: " << result.error());
308 return result.error();
310 if (!result.value().endParameters.has_value()) {
311 ATH_MSG_DEBUG(
"Propagation did not result in valid end parameters.");
312 return Acts::PropagatorError::Failure;
314 return result.value().endParameters.value();
325 return Acts::MagneticFieldContext{fieldCondObj};
328template<
typename OptionsType>
330 const Acts::MagneticFieldContext& mctx,
331 const Acts::BoundTrackParameters& startParameters,
332 Acts::Direction navDir,
333 double pathLimit)
const {
334 using namespace Acts::UnitLiterals;
335 OptionsType options(gctx, mctx);
337 options.pathLimit = pathLimit;
338 options.loopProtection
339 = (Acts::VectorHelpers::perp(startParameters.momentum())
342 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.