Skip to content

Commit 562d024

Browse files
committed
Update track covariance estimation logic
This commit reworks the covariance estimation logic to match that used in ACTS. It greatly increases the covariances of tracks, hopefully increasing the tracking efficiency.
1 parent d07fabc commit 562d024

21 files changed

+200
-78
lines changed

benchmarks/cpu/toy_detector_cpu.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ BENCHMARK_DEFINE_F(ToyDetectorBenchmark, CPU)(benchmark::State& state) {
5151
// Algorithms
5252
traccc::host::seeding_algorithm sa(seeding_cfg, grid_cfg, filter_cfg,
5353
host_mr);
54-
traccc::host::track_params_estimation tp(host_mr);
54+
traccc::track_params_estimation_config track_params_estimation_config;
55+
traccc::host::track_params_estimation tp(track_params_estimation_config,
56+
host_mr);
5557
traccc::host::combinatorial_kalman_filter_algorithm host_finding(
5658
finding_cfg, host_mr);
5759
traccc::host::kalman_fitting_algorithm host_fitting(fitting_cfg, host_mr,

benchmarks/cuda/toy_detector_cuda.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ BENCHMARK_DEFINE_F(ToyDetectorBenchmark, CUDA)(benchmark::State& state) {
6161
// Algorithms
6262
traccc::cuda::seeding_algorithm sa_cuda(seeding_cfg, grid_cfg, filter_cfg,
6363
mr, async_copy, stream);
64-
traccc::cuda::track_params_estimation tp_cuda(mr, async_copy, stream);
64+
traccc::track_params_estimation_config track_params_estimation_config;
65+
traccc::cuda::track_params_estimation tp_cuda(
66+
track_params_estimation_config, mr, async_copy, stream);
6567
traccc::cuda::combinatorial_kalman_filter_algorithm device_finding(
6668
finding_cfg, mr, async_copy, stream);
6769
traccc::cuda::kalman_fitting_algorithm device_fitting(fitting_cfg, mr,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/** TRACCC library, part of the ACTS project (R&D line)
2+
*
3+
* (c) 2021-2022 CERN for the benefit of the ACTS project
4+
*
5+
* Mozilla Public License Version 2.0
6+
*/
7+
8+
#pragma once
9+
10+
#include <array>
11+
12+
#include "traccc/definitions/common.hpp"
13+
#include "traccc/definitions/primitives.hpp"
14+
#include "traccc/definitions/track_parametrization.hpp"
15+
16+
namespace traccc {
17+
18+
struct track_params_estimation_config {
19+
std::array<scalar, e_bound_size> initial_sigma = {
20+
1.f * unit<scalar>::mm,
21+
1.f * unit<scalar>::mm,
22+
1.f * unit<scalar>::degree,
23+
1.f * unit<scalar>::degree,
24+
0.f * unit<scalar>::e / unit<scalar>::GeV,
25+
1.f * unit<scalar>::ns};
26+
27+
scalar initial_sigma_qopt = 0.1f * unit<scalar>::e / unit<scalar>::GeV;
28+
29+
scalar initial_sigma_pt_rel = 0.1f;
30+
31+
std::array<scalar, e_bound_size> initial_inflation = {1.f, 1.f, 1.f,
32+
1.f, 1.f, 100.f};
33+
};
34+
35+
} // namespace traccc

core/include/traccc/seeding/track_params_estimation.hpp

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "traccc/edm/seed_collection.hpp"
1313
#include "traccc/edm/spacepoint_collection.hpp"
1414
#include "traccc/edm/track_parameters.hpp"
15+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
1516
#include "traccc/utils/algorithm.hpp"
1617
#include "traccc/utils/messaging.hpp"
1718

@@ -31,15 +32,15 @@ class track_params_estimation
3132
: public algorithm<bound_track_parameters_collection_types::host(
3233
const measurement_collection_types::const_view&,
3334
const edm::spacepoint_collection::const_view&,
34-
const edm::seed_collection::const_view&, const vector3&,
35-
const std::array<traccc::scalar, traccc::e_bound_size>&)>,
35+
const edm::seed_collection::const_view&, const vector3&)>,
3636
public messaging {
3737

3838
public:
3939
/// Constructor for track_params_estimation
4040
///
4141
/// @param mr is the memory resource
4242
track_params_estimation(
43+
const track_params_estimation_config& config,
4344
vecmem::memory_resource& mr,
4445
std::unique_ptr<const Logger> logger = getDummyLogger().clone());
4546

@@ -56,16 +57,11 @@ class track_params_estimation
5657
output_type operator()(
5758
const measurement_collection_types::const_view& measurements,
5859
const edm::spacepoint_collection::const_view& spacepoints,
59-
const edm::seed_collection::const_view& seeds, const vector3& bfield,
60-
const std::array<traccc::scalar, traccc::e_bound_size>& stddev = {
61-
0.02f * traccc::unit<traccc::scalar>::mm,
62-
0.03f * traccc::unit<traccc::scalar>::mm,
63-
1.f * traccc::unit<traccc::scalar>::degree,
64-
1.f * traccc::unit<traccc::scalar>::degree,
65-
0.01f / traccc::unit<traccc::scalar>::GeV,
66-
1.f * traccc::unit<traccc::scalar>::ns}) const override;
60+
const edm::seed_collection::const_view& seeds,
61+
const vector3& bfield) const override;
6762

6863
private:
64+
const track_params_estimation_config m_config;
6965
/// The memory resource to use in the algorithm
7066
std::reference_wrapper<vecmem::memory_resource> m_mr;
7167
}; // class track_params_estimation

core/src/seeding/track_params_estimation.cpp

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,15 @@
1616
namespace traccc::host {
1717

1818
track_params_estimation::track_params_estimation(
19-
vecmem::memory_resource& mr, std::unique_ptr<const Logger> logger)
20-
: messaging(std::move(logger)), m_mr(mr) {}
19+
const track_params_estimation_config& config, vecmem::memory_resource& mr,
20+
std::unique_ptr<const Logger> logger)
21+
: messaging(std::move(logger)), m_config(config), m_mr(mr) {}
2122

2223
track_params_estimation::output_type track_params_estimation::operator()(
2324
const measurement_collection_types::const_view& measurements_view,
2425
const edm::spacepoint_collection::const_view& spacepoints_view,
25-
const edm::seed_collection::const_view& seeds_view, const vector3& bfield,
26-
const std::array<traccc::scalar, traccc::e_bound_size>& stddev) const {
26+
const edm::seed_collection::const_view& seeds_view,
27+
const vector3& bfield) const {
2728

2829
// Set up the input / output objects.
2930
const measurement_collection_types::const_device measurements(
@@ -61,8 +62,27 @@ track_params_estimation::output_type track_params_estimation::operator()(
6162

6263
// Set Covariance
6364
for (std::size_t j = 0; j < e_bound_size; ++j) {
64-
getter::element(track_params.covariance(), j, j) =
65-
stddev[j] * stddev[j];
65+
scalar var = m_config.initial_sigma[i] * m_config.initial_sigma[i];
66+
67+
if (i == e_bound_qoverp) {
68+
scalar var_theta = getter::element(
69+
track_params.covariance(), e_bound_theta, e_bound_theta);
70+
71+
var += math::pow(m_config.initial_sigma_qopt *
72+
math::sin(track_params[e_bound_theta]),
73+
2.f);
74+
var += math::pow(m_config.initial_sigma_pt_rel *
75+
track_params[e_bound_qoverp],
76+
2.f);
77+
var += var_theta *
78+
math::pow(track_params[e_bound_qoverp] /
79+
math::tan(track_params[e_bound_theta]),
80+
2.f);
81+
}
82+
83+
var *= m_config.initial_inflation[i];
84+
85+
getter::element(track_params.covariance(), i, i) = var;
6686
}
6787
}
6888

device/common/include/traccc/seeding/device/estimate_track_params.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "traccc/edm/seed_collection.hpp"
1616
#include "traccc/edm/spacepoint_collection.hpp"
1717
#include "traccc/edm/track_parameters.hpp"
18+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
1819

1920
namespace traccc::device {
2021

@@ -30,11 +31,10 @@ namespace traccc::device {
3031
///
3132
TRACCC_HOST_DEVICE
3233
inline void estimate_track_params(
33-
global_index_t globalIndex,
34+
global_index_t globalIndex, const track_params_estimation_config& config,
3435
const measurement_collection_types::const_view& measurements_view,
3536
const edm::spacepoint_collection::const_view& spacepoints_view,
3637
const edm::seed_collection::const_view& seeds_view, const vector3& bfield,
37-
const std::array<traccc::scalar, traccc::e_bound_size>& stddev,
3838
bound_track_parameters_collection_types::view params_view);
3939

4040
} // namespace traccc::device

device/common/include/traccc/seeding/device/impl/estimate_track_params.ipp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#pragma once
99

1010
// Project include(s).
11+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
1112
#include "traccc/seeding/device/estimate_track_params.hpp"
1213
#include "traccc/seeding/track_params_estimation_helper.hpp"
1314

@@ -19,10 +20,10 @@ namespace traccc::device {
1920
TRACCC_HOST_DEVICE
2021
inline void estimate_track_params(
2122
const global_index_t globalIndex,
23+
const track_params_estimation_config& config,
2224
const measurement_collection_types::const_view& measurements_view,
2325
const edm::spacepoint_collection::const_view& spacepoints_view,
2426
const edm::seed_collection::const_view& seeds_view, const vector3& bfield,
25-
const std::array<traccc::scalar, traccc::e_bound_size>& stddev,
2627
bound_track_parameters_collection_types::view params_view) {
2728

2829
// Check if anything needs to be done.
@@ -46,10 +47,33 @@ inline void estimate_track_params(
4647
seed_to_bound_param_vector(track_params, measurements_device,
4748
spacepoints_device, this_seed, bfield);
4849

50+
// NOTE: The code below uses the covariance of theta in the calculation of
51+
// the calculation of q/p. Thus, theta must be computed first.
52+
static_assert(e_bound_qoverp > e_bound_theta);
53+
4954
// Set Covariance
5055
for (std::size_t i = 0; i < e_bound_size; i++) {
51-
getter::element(track_params.covariance(), i, i) =
52-
stddev[i] * stddev[i];
56+
scalar var = config.initial_sigma[i] * config.initial_sigma[i];
57+
58+
if (i == e_bound_qoverp) {
59+
scalar var_theta = getter::element(track_params.covariance(),
60+
e_bound_theta, e_bound_theta);
61+
62+
var += math::pow(config.initial_sigma_qopt *
63+
math::sin(track_params[e_bound_theta]),
64+
2.f);
65+
var += math::pow(
66+
config.initial_sigma_pt_rel * track_params[e_bound_qoverp],
67+
2.f);
68+
var += var_theta *
69+
math::pow(track_params[e_bound_qoverp] /
70+
math::tan(track_params[e_bound_theta]),
71+
2.f);
72+
}
73+
74+
var *= config.initial_inflation[i];
75+
76+
getter::element(track_params.covariance(), i, i) = var;
5377
}
5478
}
5579

device/cuda/include/traccc/cuda/seeding/track_params_estimation.hpp

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "traccc/edm/seed_collection.hpp"
1414
#include "traccc/edm/spacepoint_collection.hpp"
1515
#include "traccc/edm/track_parameters.hpp"
16+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
1617
#include "traccc/utils/algorithm.hpp"
1718
#include "traccc/utils/memory_resource.hpp"
1819
#include "traccc/utils/messaging.hpp"
@@ -31,8 +32,7 @@ struct track_params_estimation
3132
: public algorithm<bound_track_parameters_collection_types::buffer(
3233
const measurement_collection_types::const_view&,
3334
const edm::spacepoint_collection::const_view&,
34-
const edm::seed_collection::const_view&, const vector3&,
35-
const std::array<traccc::scalar, traccc::e_bound_size>&)>,
35+
const edm::seed_collection::const_view&, const vector3&)>,
3636
public messaging {
3737

3838
public:
@@ -43,6 +43,7 @@ struct track_params_estimation
4343
/// and host memory blocks
4444
/// @param str The CUDA stream to perform the operations in
4545
track_params_estimation(
46+
const track_params_estimation_config& config,
4647
const traccc::memory_resource& mr, vecmem::copy& copy, stream& str,
4748
std::unique_ptr<const Logger> logger = getDummyLogger().clone());
4849

@@ -59,16 +60,12 @@ struct track_params_estimation
5960
output_type operator()(
6061
const measurement_collection_types::const_view& measurements,
6162
const edm::spacepoint_collection::const_view& spacepoints,
62-
const edm::seed_collection::const_view& seeds, const vector3& bfield,
63-
const std::array<traccc::scalar, traccc::e_bound_size>& = {
64-
0.02f * traccc::unit<traccc::scalar>::mm,
65-
0.03f * traccc::unit<traccc::scalar>::mm,
66-
1.f * traccc::unit<traccc::scalar>::degree,
67-
1.f * traccc::unit<traccc::scalar>::degree,
68-
0.01f / traccc::unit<traccc::scalar>::GeV,
69-
1.f * traccc::unit<traccc::scalar>::ns}) const override;
63+
const edm::seed_collection::const_view& seeds,
64+
const vector3& bfield) const override;
7065

7166
private:
67+
const track_params_estimation_config m_config;
68+
7269
/// Memory resource used by the algorithm
7370
traccc::memory_resource m_mr;
7471
/// The copy object to use

device/cuda/src/seeding/track_params_estimation.cu

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,22 +23,24 @@ namespace traccc::cuda {
2323
namespace kernels {
2424
/// CUDA kernel for running @c traccc::device::estimate_track_params
2525
__global__ void estimate_track_params(
26+
const track_params_estimation_config config,
2627
measurement_collection_types::const_view measurements_view,
2728
edm::spacepoint_collection::const_view spacepoints_view,
2829
edm::seed_collection::const_view seed_view, const vector3 bfield,
29-
const std::array<traccc::scalar, traccc::e_bound_size> stddev,
3030
bound_track_parameters_collection_types::view params_view) {
3131

32-
device::estimate_track_params(details::global_index1(), measurements_view,
33-
spacepoints_view, seed_view, bfield, stddev,
34-
params_view);
32+
device::estimate_track_params(details::global_index1(), config,
33+
measurements_view, spacepoints_view,
34+
seed_view, bfield, params_view);
3535
}
3636
} // namespace kernels
3737

3838
track_params_estimation::track_params_estimation(
39+
const track_params_estimation_config& config,
3940
const traccc::memory_resource& mr, vecmem::copy& copy, stream& str,
4041
std::unique_ptr<const Logger> logger)
4142
: messaging(std::move(logger)),
43+
m_config(config),
4244
m_mr(mr),
4345
m_copy(copy),
4446
m_stream(str),
@@ -47,8 +49,8 @@ track_params_estimation::track_params_estimation(
4749
track_params_estimation::output_type track_params_estimation::operator()(
4850
const measurement_collection_types::const_view& measurements_view,
4951
const edm::spacepoint_collection::const_view& spacepoints_view,
50-
const edm::seed_collection::const_view& seeds_view, const vector3& bfield,
51-
const std::array<traccc::scalar, traccc::e_bound_size>& stddev) const {
52+
const edm::seed_collection::const_view& seeds_view,
53+
const vector3& bfield) const {
5254

5355
// Get a convenience variable for the stream that we'll be using.
5456
cudaStream_t stream = details::get_stream(m_stream);
@@ -82,7 +84,7 @@ track_params_estimation::output_type track_params_estimation::operator()(
8284

8385
// run the kernel
8486
kernels::estimate_track_params<<<num_blocks, num_threads, 0, stream>>>(
85-
measurements_view, spacepoints_view, seeds_view, bfield, stddev,
87+
m_config, measurements_view, spacepoints_view, seeds_view, bfield,
8688
params_buffer);
8789
TRACCC_CUDA_ERROR_CHECK(cudaGetLastError());
8890

examples/run/common/throughput_mt.ipp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// Project include(s)
1414
#include "traccc/geometry/detector.hpp"
1515
#include "traccc/geometry/host_detector.hpp"
16+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
1617

1718
// Command line option include(s).
1819
#include "traccc/options/clusterization.hpp"
@@ -37,6 +38,7 @@
3738
#include "traccc/performance/throughput.hpp"
3839
#include "traccc/performance/timer.hpp"
3940
#include "traccc/performance/timing_info.hpp"
41+
#include "traccc/seeding/detail/track_params_estimation_config.hpp"
4042

4143
// VecMem include(s).
4244
#include <vecmem/memory/host_memory_resource.hpp>
@@ -142,6 +144,7 @@ int throughput_mt(std::string_view description, int argc, char* argv[]) {
142144
const traccc::seedfinder_config seedfinder_config(seeding_opts);
143145
const traccc::seedfilter_config seedfilter_config(seeding_opts);
144146
const traccc::spacepoint_grid_config spacepoint_grid_config(seeding_opts);
147+
const traccc::track_params_estimation_config track_params_estimation_config;
145148
detray::propagation::config propagation_config(propagation_opts);
146149
typename FULL_CHAIN_ALG::finding_algorithm::config_type finding_cfg(
147150
finding_opts);
@@ -155,10 +158,10 @@ int throughput_mt(std::string_view description, int argc, char* argv[]) {
155158
std::vector<FULL_CHAIN_ALG> algs;
156159
algs.reserve(threading_opts.threads + 1);
157160
for (std::size_t i = 0; i < threading_opts.threads + 1; ++i) {
158-
algs.push_back({host_mr, clustering_cfg, seedfinder_config,
159-
spacepoint_grid_config, seedfilter_config, finding_cfg,
160-
fitting_cfg, det_descr, field, &detector,
161-
logger().clone()});
161+
algs.push_back(
162+
{host_mr, clustering_cfg, seedfinder_config, spacepoint_grid_config,
163+
seedfilter_config, track_params_estimation_config, finding_cfg,
164+
fitting_cfg, det_descr, field, &detector, logger().clone()});
162165
}
163166

164167
// Set up a lambda that calls the correct function on the algorithms.

0 commit comments

Comments
 (0)