ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
data_generator.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 "algebra/vc_soa.hpp"
13#include "detray/algebra/concepts.hpp"
14
15// System include(s)
16#include <algorithm>
17#include <vector>
18
19namespace detray::algebra {
20
22template <detray::concepts::vector vector_soa_t>
23inline void fill_random_vec(std::vector<vector_soa_t> &collection) {
24 // Generate a vector of the right type with random values
25 auto rand_obj = []() {
26 using simd_vector_t = typename vector_soa_t::scalar_type;
27 vector_soa_t tmp{};
28
29 for (std::size_t i = 0u; i < detray::traits::size<vector_soa_t>; ++i) {
30 tmp[i] = simd_vector_t::Random();
31 }
32
33 return tmp;
34 };
35
36 collection.resize(collection.capacity());
37 std::ranges::generate(collection, rand_obj);
38}
39
41template <detray::concepts::transform3D transform3_t>
42inline void fill_random_trf(std::vector<transform3_t> &collection) {
43 // Generate a random, but valid affine transformation
44 auto rand_obj = []() {
45 using vector_t = typename transform3_t::vector3;
46 using simd_vector_t = typename transform3_t::scalar_type;
47
48 vector_t x_axis;
49 vector_t z_axis;
50 vector_t t;
51
52 x_axis[0] = simd_vector_t::Random();
53 x_axis[1] = simd_vector_t::Random();
54 x_axis[2] = simd_vector_t::Random();
55 x_axis = detray::vector::normalize(x_axis);
56
57 z_axis[0] = simd_vector_t::Random();
58 z_axis[1] = simd_vector_t::Random();
59 z_axis[2] = simd_vector_t::Random();
60
61 t[0] = simd_vector_t::Random();
62 t[1] = simd_vector_t::Random();
63 t[2] = simd_vector_t::Random();
64 t = detray::vector::normalize(t);
65
66 // Gram-Schmidt projection
67 simd_vector_t coeff =
68 detray::vector::dot(x_axis, z_axis) / detray::vector::norm(x_axis);
69 z_axis = x_axis - coeff * z_axis;
70
71 return transform3_t{t, x_axis, detray::vector::normalize(z_axis)};
72 };
73
74 collection.resize(collection.capacity());
75 std::ranges::generate(collection, rand_obj);
76}
77
79template <detray::concepts::matrix matrix_t>
80inline void fill_random_matrix(std::vector<matrix_t> &collection) {
81 // Generate a random, but valid affine transformation
82 auto rand_obj = []() {
83 using simd_vector_t = typename matrix_t::scalar_type;
84
85 matrix_t m;
86
87 for (std::size_t j = 0u; j < matrix_t::columns(); ++j) {
88 typename matrix_t::vector_type v;
89
90 for (std::size_t i = 0u; i < matrix_t::rows(); ++i) {
91 v[i] = simd_vector_t::Random();
92 }
93
94 m[j] = v;
95 }
96
97 return m;
98 };
99
100 collection.resize(collection.capacity());
101 std::ranges::generate(collection, rand_obj);
102}
103
104} // namespace detray::algebra
constexpr double m
Meter.
Definition Units.hpp:97