Skip to content

Commit 7b7c92f

Browse files
authored
Merge pull request #762 from niermann999/feat-more-material-plots
ref: Use relative error in material comparison and improve material plots
2 parents d4918f6 + 8ee006f commit 7b7c92f

14 files changed

+345
-53
lines changed

tests/include/detray/test/common/material_validation_config.hpp

+8
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ struct material_validation_config : public test::fixture_base<>::configuration {
3838
std::string m_material_file{"navigation_material_trace.csv"};
3939
/// The maximal number of test tracks to run
4040
std::size_t m_n_tracks{detray::detail::invalid_value<std::size_t>()};
41+
/// Allowed relative discrepancy between truth and navigation material
42+
scalar_type m_rel_error{0.001f};
4143

4244
/// Getters
4345
/// @{
@@ -49,6 +51,7 @@ struct material_validation_config : public test::fixture_base<>::configuration {
4951
}
5052
const std::string &material_file() const { return m_material_file; }
5153
std::size_t n_tracks() const { return m_n_tracks; }
54+
scalar_type relative_error() const { return m_rel_error; }
5255
/// @}
5356

5457
/// Setters
@@ -78,6 +81,11 @@ struct material_validation_config : public test::fixture_base<>::configuration {
7881
m_n_tracks = n;
7982
return *this;
8083
}
84+
material_validation_config &relative_error(scalar_type re) {
85+
assert(re > 0.f);
86+
m_rel_error = re;
87+
return *this;
88+
}
8189
/// @}
8290
};
8391

tests/include/detray/test/cpu/material_validation.hpp

+32-8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
// System include(s)
2222
#include <iostream>
23+
#include <limits>
2324
#include <stdexcept>
2425
#include <string>
2526
#include <string_view>
@@ -132,6 +133,7 @@ class material_validation_impl : public test::fixture_base<> {
132133

133134
// Collect some statistics
134135
std::size_t n_tracks{0u};
136+
const scalar_t rel_error{m_cfg.relative_error()};
135137
for (std::size_t i = 0u; i < mat_records.size(); ++i) {
136138

137139
if (n_tracks >= m_cfg.n_tracks()) {
@@ -141,14 +143,36 @@ class material_validation_impl : public test::fixture_base<> {
141143
const auto &truth_mat = truth_mat_records[i];
142144
const auto &recorded_mat = mat_records[i];
143145

144-
EXPECT_NEAR(truth_mat.sX0, recorded_mat.sX0, m_cfg.tol())
145-
<< "Track " << n_tracks << " (X0 / path)";
146-
EXPECT_NEAR(truth_mat.tX0, recorded_mat.tX0, m_cfg.tol())
147-
<< "Track " << n_tracks << " (X0 / thickness)";
148-
EXPECT_NEAR(truth_mat.sL0, recorded_mat.sL0, m_cfg.tol())
149-
<< "Track " << n_tracks << " (L0 / path)";
150-
EXPECT_NEAR(truth_mat.tL0, recorded_mat.tL0, m_cfg.tol())
151-
<< "Track " << n_tracks << " (L0 / thickness)";
146+
auto get_rel_error = [](const scalar_t truth, const scalar_t rec) {
147+
constexpr scalar_t e{std::numeric_limits<scalar_t>::epsilon()};
148+
149+
if (truth <= e && rec <= e) {
150+
// No material for this ray => valid
151+
return scalar_t{0.f};
152+
} else if (truth <= e) {
153+
// Material found where none should be
154+
return detail::invalid_value<scalar_t>();
155+
} else {
156+
return math::fabs(truth - rec) / truth;
157+
}
158+
};
159+
160+
EXPECT_TRUE(get_rel_error(truth_mat.sX0, recorded_mat.sX0) <
161+
rel_error)
162+
<< "Track " << n_tracks << " (X0 / path): Truth "
163+
<< truth_mat.sX0 << ", Nav. " << recorded_mat.sX0;
164+
EXPECT_TRUE(get_rel_error(truth_mat.tX0, recorded_mat.tX0) <
165+
rel_error)
166+
<< "Track " << n_tracks << " (X0 / thickness): Truth "
167+
<< truth_mat.tX0 << ", Nav. " << recorded_mat.tX0;
168+
EXPECT_TRUE(get_rel_error(truth_mat.sL0, recorded_mat.sL0) <
169+
rel_error)
170+
<< "Track " << n_tracks << " (L0 / path): Truth "
171+
<< truth_mat.sL0 << ", Nav. " << recorded_mat.sL0;
172+
EXPECT_TRUE(get_rel_error(truth_mat.tL0, recorded_mat.tL0) <
173+
rel_error)
174+
<< "Track " << n_tracks << " (L0 / thickness): Truth "
175+
<< truth_mat.tL0 << ", Nav. " << recorded_mat.tL0;
152176

153177
++n_tracks;
154178
}

tests/integration_tests/cpu/detectors/toy_detector_navigation.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ int main(int argc, char **argv) {
112112
test::material_validation<toy_detector_t>::config mat_val_cfg{};
113113
mat_val_cfg.name("toy_detector_material_validaiton");
114114
mat_val_cfg.whiteboard(white_board);
115-
mat_val_cfg.tol(1.5e-6f); // < Reduce tolerance for single precision tests
115+
// Reduce tolerance for single precision tests
116+
if constexpr (std::is_same_v<scalar_t, float>) {
117+
mat_val_cfg.relative_error(1.5e-6f);
118+
}
116119
mat_val_cfg.propagation() = cfg_str_nav.propagation();
117120

118121
// @TODO: Put material maps on all portals

tests/integration_tests/cpu/detectors/wire_chamber_navigation.cpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ int main(int argc, char **argv) {
112112
test::material_validation<wire_chamber_t>::config mat_val_cfg{};
113113
mat_val_cfg.name("wire_chamber_material_validaiton");
114114
mat_val_cfg.whiteboard(white_board);
115-
mat_val_cfg.tol(5e-3f); // < Reduce tolerance for single precision tests
115+
// Reduce tolerance for single precision tests
116+
if constexpr (std::is_same_v<scalar_t, float>) {
117+
mat_val_cfg.relative_error(130.f);
118+
}
116119
mat_val_cfg.propagation() = cfg_str_nav.propagation();
117120

118121
detail::register_checks<test::material_validation>(det, names, mat_val_cfg);

tests/integration_tests/device/cuda/toy_detector_navigation_validation.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ int main(int argc, char **argv) {
103103
mat_scan_cfg.name("toy_detector_material_scan_for_cuda");
104104
mat_scan_cfg.whiteboard(white_board);
105105
mat_scan_cfg.track_generator().uniform_eta(true).eta_range(-4.f, 4.f);
106-
mat_scan_cfg.track_generator().phi_steps(10).eta_steps(100);
106+
mat_scan_cfg.track_generator().phi_steps(100).eta_steps(100);
107107

108108
// Record the material using a ray scan
109109
detail::register_checks<test::material_scan>(toy_det, toy_names,
@@ -117,8 +117,8 @@ int main(int argc, char **argv) {
117117
mat_val_cfg.tol(1e-6f); // < Reduce tolerance for single precision tests
118118
mat_val_cfg.propagation() = cfg_str_nav.propagation();
119119

120-
/*detail::register_checks<detray::cuda::material_validation>(toy_det,
121-
toy_names, mat_val_cfg);*/
120+
detail::register_checks<detray::cuda::material_validation>(
121+
toy_det, toy_names, mat_val_cfg);
122122

123123
// Run the material validation - Homogeneous material
124124
toy_cfg.use_material_maps(false);

tests/integration_tests/device/cuda/wire_chamber_navigation_validation.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -89,15 +89,15 @@ int main(int argc, char **argv) {
8989
cfg_hel_scan.track_generator().n_tracks(1000u);
9090
cfg_hel_scan.track_generator().eta_range(-1.f, 1.f);
9191
// TODO: Fails for smaller momenta
92-
cfg_hel_scan.track_generator().p_T(5.f * unit<scalar_t>::GeV);
92+
cfg_hel_scan.track_generator().p_T(4.f * unit<scalar_t>::GeV);
9393

9494
detail::register_checks<test::helix_scan>(det, names, cfg_hel_scan);
9595

9696
// Comparison of navigation in a constant B-field with helix
9797
detray::cuda::helix_navigation<wire_chamber_t>::config cfg_hel_nav{};
9898
cfg_hel_nav.name("wire_chamber_helix_navigation_cuda");
9999
cfg_hel_nav.whiteboard(white_board);
100-
cfg_hel_nav.propagation().navigation.min_mask_tolerance *= 0.9f;
100+
cfg_hel_nav.propagation().navigation.min_mask_tolerance *= 12.f;
101101
cfg_hel_nav.propagation().navigation.search_window = {3u, 3u};
102102

103103
detail::register_checks<detray::cuda::helix_navigation>(det, names,
@@ -108,7 +108,7 @@ int main(int argc, char **argv) {
108108
mat_scan_cfg.name("wire_chamber_material_scan_for_cuda");
109109
mat_scan_cfg.whiteboard(white_board);
110110
mat_scan_cfg.track_generator().uniform_eta(true).eta_range(-1.f, 1.f);
111-
mat_scan_cfg.track_generator().phi_steps(10).eta_steps(100);
111+
mat_scan_cfg.track_generator().phi_steps(100).eta_steps(100);
112112

113113
// Record the material using a ray scan
114114
detail::register_checks<test::material_scan>(det, names, mat_scan_cfg);
@@ -118,7 +118,10 @@ int main(int argc, char **argv) {
118118
mat_val_cfg.name("wire_chamber_material_validaiton_cuda");
119119
mat_val_cfg.whiteboard(white_board);
120120
mat_val_cfg.device_mr(&dev_mr);
121-
mat_val_cfg.tol(5e-3f); // < Reduce tolerance for single precision tests
121+
// Reduce tolerance for single precision tests
122+
if constexpr (std::is_same_v<scalar_t, float>) {
123+
mat_val_cfg.relative_error(130.f);
124+
}
122125
mat_val_cfg.propagation() = cfg_str_nav.propagation();
123126

124127
detail::register_checks<detray::cuda::material_validation>(det, names,

tests/tools/src/cpu/material_validation.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ int main(int argc, char **argv) {
4747
po::options_description desc("\ndetray material validation options");
4848

4949
desc.add_options()(
50-
"tol", boost::program_options::value<float>()->default_value(1e-4f),
51-
"Tolerance for comparing the material traces");
50+
"tol", boost::program_options::value<float>()->default_value(1.f),
51+
"Tolerance for comparing the material traces [%]");
5252

5353
// Configs to be filled
5454
detray::io::detector_reader_config reader_cfg{};
@@ -61,7 +61,7 @@ int main(int argc, char **argv) {
6161

6262
// General options
6363
if (vm.count("tol")) {
64-
mat_val_cfg.tol(vm["tol"].as<float>());
64+
mat_val_cfg.relative_error(vm["tol"].as<float>() / 100.f);
6565
}
6666

6767
vecmem::host_memory_resource host_mr;

tests/tools/src/cuda/material_validation_cuda.cpp

+5-3
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ int main(int argc, char **argv) {
4747
po::options_description desc("\ndetray CUDA material validation options");
4848

4949
desc.add_options()(
50-
"tol", boost::program_options::value<float>()->default_value(1e-4f),
51-
"Tolerance for comparing the material traces");
50+
"tol", boost::program_options::value<float>()->default_value(1.f),
51+
"Tolerance for comparing the material traces [%]");
5252

5353
// Configs to be filled
5454
detray::io::detector_reader_config reader_cfg{};
@@ -61,7 +61,7 @@ int main(int argc, char **argv) {
6161

6262
// General options
6363
if (vm.count("tol")) {
64-
mat_val_cfg.tol(vm["tol"].as<float>());
64+
mat_val_cfg.relative_error(vm["tol"].as<float>() / 100.f);
6565
}
6666

6767
/// Vecmem memory resource for the device allocations
@@ -74,12 +74,14 @@ int main(int argc, char **argv) {
7474
auto white_board = std::make_shared<test::whiteboard>();
7575

7676
// Print the detector's material as recorded by a ray scan
77+
mat_val_cfg.name("material_validation_for_cuda");
7778
mat_scan_cfg.whiteboard(white_board);
7879
mat_scan_cfg.track_generator().uniform_eta(true);
7980
detray::detail::register_checks<test::material_scan>(det, names,
8081
mat_scan_cfg);
8182

8283
// Now trace the material during navigation and compare
84+
mat_val_cfg.name("material_validation_cuda");
8385
mat_val_cfg.whiteboard(white_board);
8486
mat_val_cfg.device_mr(&dev_mr);
8587

0 commit comments

Comments
 (0)