ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
statistics.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// TODO: Remove this when gcc fixes their false positives.
12#if defined(__GNUC__) && !defined(__clang__)
13#pragma GCC diagnostic warning "-Wfree-nonheap-object"
14#endif
15
16// Project include(s)
17#include "detray/utils/ranges.hpp"
18
19// System include(s).
20#include <algorithm>
21#include <numeric>
22#include <type_traits>
23
24namespace detray::statistics {
25
27template <detray::ranges::range range_t>
28inline auto mean(const range_t& r) noexcept(false)
29 -> detray::ranges::range_value_t<range_t> {
30 using value_t = detray::ranges::range_value_t<range_t>;
31
32 value_t sum = std::accumulate(r.begin(), r.end(), value_t{});
33 value_t mean = sum * (1.0f / static_cast<value_t>(r.size()));
34
35 return mean;
36}
37
39template <detray::ranges::range range_t>
40inline auto rms(
41 const range_t& r,
42 const detray::ranges::range_value_t<range_t> mean) noexcept(false)
43 -> detray::ranges::range_value_t<range_t> {
44 using value_t = detray::ranges::range_value_t<range_t>;
45
46 std::vector<value_t> diff(r.size());
47 std::ranges::transform(r, diff.begin(),
48 [mean](value_t x) { return x - mean; });
49 value_t sq_sum =
50 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
51 value_t variance = sq_sum * (1.0f / static_cast<value_t>(r.size()));
52
53 return variance;
54}
55
58template <detray::ranges::range range_t>
59inline auto variance(const range_t& r) noexcept(false)
60 -> detray::ranges::range_value_t<range_t> {
61 using value_t = detray::ranges::range_value_t<range_t>;
62
63 // Variance is zero for single element
64 if (r.size() == 1u) {
65 return 0.f;
66 }
67
68 value_t mean = statistics::mean(r);
69
70 std::vector<value_t> diff(r.size());
71 std::ranges::transform(r, diff.begin(),
72 [mean](value_t x) { return x - mean; });
73 value_t sq_sum =
74 std::inner_product(diff.begin(), diff.end(), diff.begin(), value_t{});
75
76 // Divide with n-1 to avoid a bias
77 value_t variance = sq_sum * (1.0f / static_cast<value_t>(r.size() - 1u));
78
79 return variance;
80}
81
82} // namespace detray::statistics