ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
propagation_options.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s)
12#include "detray/propagator/propagation_config.hpp"
13
14// Detray test include(s)
15#include "detray/options/options_handling.hpp"
16
17// Boost
18#include "detray/options/boost_program_options.hpp"
19
20// System include(s)
21#include <stdexcept>
22
23namespace detray::options {
24
26template <>
27void add_options<detray::navigation::config>(
28 boost::program_options::options_description &desc,
29 const detray::navigation::config &cfg) {
30 desc.add_options()(
31 "search_window",
32 boost::program_options::value<std::vector<dindex>>()->multitoken(),
33 "Search window size for the grid")(
34 "min_mask_tolerance",
35 boost::program_options::value<float>()->default_value(
37 "Minimum mask tolerance [mm]")(
38 "max_mask_tolerance",
39 boost::program_options::value<float>()->default_value(
41 "Maximum mask tolerance [mm]")(
42 "mask_tolerance_scalor",
43 boost::program_options::value<float>()->default_value(
45 "Mask tolerance scale factor")(
46 "overstep_tolerance",
47 boost::program_options::value<float>()->default_value(
49 "Overstepping tolerance [um] NOTE: Must be negative!")(
50 "path_tolerance",
51 boost::program_options::value<float>()->default_value(
53 "Tol. to decide when a track is on surface [um]")(
54 "estimate_scattering_noise",
55 "Open the navigation surface tolerance according to an estimation of "
56 "the noise due to multiple scattering")(
57 "n_scattering_stddev",
58 boost::program_options::value<int>()->default_value(
60 "Number of standard deviations of estimated error to use for "
61 "scattering noise")("accumulated_error",
62 boost::program_options::value<float>()->default_value(
64 "Estimation of accumulated positional error [%]");
65}
66
68template <>
69void add_options<detray::stepping::config>(
70 boost::program_options::options_description &desc,
71 const detray::stepping::config &cfg) {
72 desc.add_options()("minimum_stepsize",
73 boost::program_options::value<float>()->default_value(
75 "Minimum step size [mm]")(
76 "step_contraint",
77 boost::program_options::value<float>()->default_value(
79 "Maximum step size [mm]")(
80 "rk-tolerance",
81 boost::program_options::value<float>()->default_value(cfg.rk_error_tol /
83 "The Runge-Kutta integration error tolerance [mm]")(
84 "path_limit",
85 boost::program_options::value<float>()->default_value(cfg.path_limit /
87 "Maximum path length for a track [m]")("mean_energy_loss",
88 "Use Bethe energy loss")(
89 "covariance_transport", "Run the covariance transport")(
90 "eloss_gradient", "Use energy loss gradient in Jacobian transport")(
91 "bfield_gradient", "Use B-field gradient in Jacobian transport");
92}
93
95template <>
96void add_options<detray::propagation::config>(
97 boost::program_options::options_description &desc,
98 const detray::propagation::config &cfg) {
99 add_options(desc, cfg.navigation);
100 add_options(desc, cfg.stepping);
101}
102
104template <>
105void configure_options<detray::navigation::config>(
106 const boost::program_options::variables_map &vm,
107 detray::navigation::config &cfg) {
108 // Local navigation search window
109 if (vm.count("search_window") != 0u) {
110 const auto window = vm["search_window"].as<std::vector<dindex>>();
111 if (window.size() == 2u) {
112 cfg.search_window = {window[0], window[1]};
113 } else {
114 throw std::invalid_argument(
115 "Incorrect surface grid search window. Please provide two "
116 "integer distances.");
117 }
118 }
119 // Overstepping tolerance
120 if (!vm["min_mask_tolerance"].defaulted()) {
121 const float mask_tol{vm["min_mask_tolerance"].as<float>()};
122 assert(mask_tol >= 0.f);
123
125 }
126 if (!vm["max_mask_tolerance"].defaulted()) {
127 const float mask_tol{vm["max_mask_tolerance"].as<float>()};
128 assert(mask_tol >= 0.f);
129
131 }
132 if (!vm["mask_tolerance_scalor"].defaulted()) {
133 const float mask_tol_scalor{vm["mask_tolerance_scalor"].as<float>()};
134 assert(mask_tol_scalor >= 0.f);
135
136 cfg.intersection.mask_tolerance_scalor = mask_tol_scalor;
137 }
138 if (!vm["overstep_tolerance"].defaulted()) {
139 const float overstep_tol{vm["overstep_tolerance"].as<float>()};
140 assert(overstep_tol <= 0.f);
141
143 }
144 if (!vm["path_tolerance"].defaulted()) {
145 const float path_tol{vm["path_tolerance"].as<float>()};
146 assert(path_tol >= 0.f);
147
149 }
150 cfg.estimate_scattering_noise = false;
151 if (vm.count("estimate_scattering_noise") != 0u) {
152 cfg.estimate_scattering_noise = true;
153
154 if (!vm["n_scattering_stddev"].defaulted()) {
155 const int n_stddev{vm["n_scattering_stddev"].as<int>()};
156 assert(n_stddev >= 0);
157
158 cfg.n_scattering_stddev = n_stddev;
159 }
160
161 if (!vm["accumulated_error"].defaulted()) {
162 const float err{vm["accumulated_error"].as<float>()};
163 assert(err >= 0.f);
164
165 cfg.accumulated_error = err;
166 }
167 } else {
168 if (!vm["n_scattering_stddev"].defaulted()) {
169 throw std::invalid_argument(
170 "Option 'n_scattering_stddev' cannot not be configured unless "
171 "'estimate_scattering_noise' is activated");
172 }
173 if (!vm["accumulated_error"].defaulted()) {
174 throw std::invalid_argument(
175 "Option 'accumulated_error' cannot not be configured unless "
176 "'estimate_scattering_noise' is activated");
177 }
178 }
179}
180
182template <>
183void configure_options<detray::stepping::config>(
184 const boost::program_options::variables_map &vm,
185 detray::stepping::config &cfg) {
186 // Overstepping tolerance
187 if (!vm["minimum_stepsize"].defaulted()) {
188 const float min_step{vm["minimum_stepsize"].as<float>()};
189 assert(min_step >= 0.f);
190
191 cfg.min_stepsize = min_step * unit<float>::mm;
192 }
193 if (!vm["step_contraint"].defaulted()) {
194 const float constraint{vm["step_contraint"].as<float>()};
195 assert(constraint >= 0.f);
196
197 cfg.step_constraint = constraint * unit<float>::mm;
198 }
199 if (!vm["rk-tolerance"].defaulted()) {
200 const float err_tol{vm["rk-tolerance"].as<float>()};
201 assert(err_tol >= 0.f);
202
203 cfg.rk_error_tol = err_tol * unit<float>::mm;
204 }
205 if (!vm["path_limit"].defaulted()) {
206 const float path_limit{vm["path_limit"].as<float>()};
207 assert(path_limit > 0.f);
208
209 cfg.path_limit = path_limit * unit<float>::m;
210 }
211 cfg.do_covariance_transport = false;
212 if (vm.count("covariance_transport") != 0u) {
213 cfg.do_covariance_transport = true;
214 }
215 if (vm.count("mean_eloss") != 0u) {
216 cfg.use_mean_loss = true;
217 }
218 if (vm.count("eloss_gradient") != 0u) {
219 cfg.use_eloss_gradient = true;
220 }
221 if (vm.count("bfield_gradient") != 0u) {
222 cfg.use_field_gradient = true;
223 }
224}
225
227template <>
228void configure_options<detray::propagation::config>(
229 const boost::program_options::variables_map &vm,
230 detray::propagation::config &cfg) {
231 configure_options(vm, cfg.navigation);
232 configure_options(vm, cfg.stepping);
233}
234
235} // namespace detray::options
float max_mask_tolerance
Maximal tolerance: loose tolerance when still far away from surface.
Definition intersection_config.hpp:27
float overstep_tolerance
How far behind the track position to look for candidates.
Definition intersection_config.hpp:34
float mask_tolerance_scalor
Scale factor on the path used for the mask tolerance calculation.
Definition intersection_config.hpp:29
float min_mask_tolerance
Tolerance on the mask 'is_inside' check:Minimal tolerance: ~ position uncertainty on surface.
Definition intersection_config.hpp:25
float path_tolerance
Maximal absolute path distance for a track to be considered 'on surface'.
Definition intersection_config.hpp:32
float accumulated_error
Percentage of total track path to assume as accumulated error.
Definition navigation_config.hpp:34
intersection::config intersection
Tolerance on the mask 'is_inside' check:
Definition navigation_config.hpp:26
int n_scattering_stddev
Number of standard deviations to assume to model the scattering noise.
Definition navigation_config.hpp:36
bool estimate_scattering_noise
Add adaptive mask tolerance to navigation.
Definition navigation_config.hpp:38
detray::search_window< dindex, 2 > search_window
Search window size for grid based acceleration structures (0, 0): only look at current bin.
Definition navigation_config.hpp:29
navigation::config navigation
Navigation options controlling candidate selection and stopping.
Definition propagation_config.hpp:25
stepping::config stepping
Stepper options controlling integration and step limits.
Definition propagation_config.hpp:27
float path_limit
Maximal path length of track.
Definition stepping_config.hpp:37
float step_constraint
Step size constraint.
Definition stepping_config.hpp:35
bool use_field_gradient
Use b field gradient in error propagation.
Definition stepping_config.hpp:46
bool use_mean_loss
Use mean energy loss (Bethe) if false, most probable energy loss (Landau) will be used.
Definition stepping_config.hpp:42
float rk_error_tol
Runge-Kutta numeric error tolerance.
Definition stepping_config.hpp:33
float min_stepsize
Minimum step size.
Definition stepping_config.hpp:31
bool do_covariance_transport
Do covariance transport.
Definition stepping_config.hpp:48
bool use_eloss_gradient
Use eloss gradient in error propagation.
Definition stepping_config.hpp:44
static constexpr scalar_t um
Length, native unit mm.
Definition units.hpp:25
static constexpr scalar_t mm
Native length unit, the millimetre.
Definition units.hpp:27
static constexpr scalar_t m
Metre expressed in millimetres.
Definition units.hpp:31