11 template <
typename S,
typename N>
12 template <
typename result_t,
typename propagator_state_t>
17 const auto& logger = state.options.logger;
23 m_navigator.status(state, m_stepper);
25 state.options.actionList(state, m_stepper, result);
30 bool terminatedNormally =
true;
33 if (!state.options.abortList(result, state, m_stepper)) {
35 m_navigator.target(state, m_stepper);
39 terminatedNormally =
false;
42 for (; result.steps < state.options.maxSteps; ++result.steps) {
48 result.pathLength +=
s;
57 m_navigator.status(state, m_stepper);
58 state.options.actionList(state, m_stepper, result);
59 if (state.options.abortList(result, state, m_stepper)) {
60 terminatedNormally =
true;
63 m_navigator.target(state, m_stepper);
66 ACTS_VERBOSE(
"Propagation terminated without going into stepping loop.");
71 if (!terminatedNormally) {
72 state.navigation.navigationBreak =
true;
73 ACTS_ERROR(
"Propagation reached the step count limit of "
74 << state.options.maxSteps <<
" (did " << result.steps
76 return PropagatorError::StepCountLimitReached;
81 state.options.actionList(state, m_stepper, result);
87 template <
typename S,
typename N>
88 template <
typename parameters_t,
typename propagator_options_t,
89 typename path_aborter_t>
91 const parameters_t&
start,
const propagator_options_t&
options)
const
94 typename propagator_options_t::action_list_type>> {
95 static_assert(Concepts::BoundTrackParametersConcept<parameters_t>,
96 "Parameters do not fulfill bound parameters concept.");
104 typename propagator_options_t::action_list_type>;
107 "return track parameter type must be copy-constructible");
110 path_aborter_t pathAborter;
111 pathAborter.internalLimit =
options.pathLimit;
113 auto abortList =
options.abortList.append(pathAborter);
116 auto eOptions =
options.extend(abortList);
117 using OptionsType = decltype(eOptions);
120 StateType state(
start, eOptions);
125 "Step method of the Stepper is not compatible with the propagator "
131 lProtection(state, m_stepper);
134 auto result = propagate_impl<ResultType>(state);
136 auto& propRes = *result;
138 auto curvState = m_stepper.curvilinearState(state.stepping);
139 auto& curvParameters = std::get<CurvilinearTrackParameters>(curvState);
141 propRes.endParameters = std::make_unique<const CurvilinearTrackParameters>(
142 std::move(curvParameters));
144 if (state.stepping.covTransport) {
145 auto& tJacobian = std::get<Jacobian>(curvState);
146 propRes.transportJacobian =
147 std::make_unique<const Jacobian>(std::move(tJacobian));
151 return result.error();
155 template <
typename S,
typename N>
156 template <
typename parameters_t,
typename propagator_options_t,
157 typename target_aborter_t,
typename path_aborter_t>
160 const propagator_options_t&
options)
const
163 typename propagator_options_t::action_list_type>> {
164 static_assert(Concepts::BoundTrackParametersConcept<parameters_t>,
165 "Parameters do not fulfill bound parameters concept.");
171 target_aborter_t targetAborter;
172 path_aborter_t pathAborter;
173 pathAborter.internalLimit =
options.pathLimit;
174 auto abortList =
options.abortList.append(targetAborter, pathAborter);
177 auto eOptions =
options.extend(abortList);
178 using OptionsType = decltype(eOptions);
183 typename propagator_options_t::action_list_type>;
187 StateType state(
start, eOptions);
188 state.navigation.targetSurface = &
target;
193 "Step method of the Stepper is not compatible with the propagator "
198 lProtection(state, m_stepper);
201 auto result = propagate_impl<ResultType>(state);
204 auto& propRes = *result;
206 auto bs = m_stepper.boundState(state.stepping,
target);
207 auto& boundParams = std::get<BoundTrackParameters>(bs);
209 propRes.endParameters =
210 std::make_unique<const BoundTrackParameters>(std::move(boundParams));
212 if (state.stepping.covTransport) {
213 auto& tJacobian = std::get<Jacobian>(bs);
214 propRes.transportJacobian =
215 std::make_unique<const Jacobian>(std::move(tJacobian));
219 return result.error();