File indexing completed on 2026-07-26 08:21:58
0001
0002
0003
0004
0005
0006
0007
0008 #pragma once
0009
0010
0011 #include "traccc/definitions/common.hpp"
0012 #include "traccc/definitions/qualifiers.hpp"
0013
0014
0015 #include <detray/geometry/identifier.hpp>
0016
0017
0018 #include <vecmem/edm/container.hpp>
0019
0020
0021 #include <array>
0022 #include <compare>
0023 #include <cstdint>
0024 #include <ostream>
0025
0026 namespace traccc::edm {
0027
0028
0029
0030
0031
0032
0033
0034 template <typename BASE>
0035 class measurement : public BASE {
0036 public:
0037
0038
0039
0040
0041 using BASE::BASE;
0042
0043 using BASE::operator=;
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054 TRACCC_HOST_DEVICE
0055 auto& local_position() { return BASE::template get<0>(); }
0056
0057
0058
0059
0060 TRACCC_HOST_DEVICE
0061 const auto& local_position() const { return BASE::template get<0>(); }
0062
0063
0064
0065
0066
0067 TRACCC_HOST_DEVICE
0068 auto& local_variance() { return BASE::template get<1>(); }
0069
0070
0071
0072
0073 TRACCC_HOST_DEVICE
0074 const auto& local_variance() const { return BASE::template get<1>(); }
0075
0076
0077
0078
0079
0080 TRACCC_HOST_DEVICE
0081 auto& dimensions() { return BASE::template get<2>(); }
0082
0083
0084
0085
0086 TRACCC_HOST_DEVICE
0087 const auto& dimensions() const { return BASE::template get<2>(); }
0088
0089
0090
0091
0092
0093 TRACCC_HOST_DEVICE
0094 auto& time() { return BASE::template get<3>(); }
0095
0096
0097
0098
0099 TRACCC_HOST_DEVICE
0100 const auto& time() const { return BASE::template get<3>(); }
0101
0102
0103
0104
0105
0106 TRACCC_HOST_DEVICE
0107 auto& diameter() { return BASE::template get<4>(); }
0108
0109
0110
0111
0112 TRACCC_HOST_DEVICE
0113 const auto& diameter() const { return BASE::template get<4>(); }
0114
0115
0116
0117
0118
0119 TRACCC_HOST_DEVICE
0120 auto& identifier() { return BASE::template get<5>(); }
0121
0122
0123
0124
0125 TRACCC_HOST_DEVICE
0126 const auto& identifier() const { return BASE::template get<5>(); }
0127
0128
0129
0130
0131
0132 TRACCC_HOST_DEVICE
0133 auto& surface_link() { return BASE::template get<6>(); }
0134
0135
0136
0137
0138 TRACCC_HOST_DEVICE
0139 const auto& surface_link() const { return BASE::template get<6>(); }
0140
0141
0142
0143
0144
0145 TRACCC_HOST_DEVICE
0146 auto& subspace() { return BASE::template get<7>(); }
0147
0148
0149
0150
0151 TRACCC_HOST_DEVICE
0152 const auto& subspace() const { return BASE::template get<7>(); }
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163 template <std::integral TYPE>
0164 TRACCC_HOST_DEVICE void set_subspace(const std::array<TYPE, 2u>& subs);
0165
0166
0167
0168
0169
0170 TRACCC_HOST_DEVICE
0171 auto& cluster_index() { return BASE::template get<8>(); }
0172
0173
0174
0175
0176 TRACCC_HOST_DEVICE
0177 const auto& cluster_index() const { return BASE::template get<8>(); }
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192 template <typename T>
0193 TRACCC_HOST_DEVICE bool operator==(const measurement<T>& other) const;
0194
0195
0196
0197
0198
0199
0200
0201
0202
0203
0204 template <typename T>
0205 TRACCC_HOST_DEVICE std::partial_ordering operator<=>(
0206 const measurement<T>& other) const;
0207
0208
0209
0210 private:
0211
0212 TRACCC_HOST
0213 friend std::ostream& operator<<(std::ostream& os, const measurement& m) {
0214 os << "ID = " << m.identifier() << ", dim = " << m.dimensions()
0215 << ", surface: " << m.surface_link() << std::endl;
0216
0217 os << " -> cluster idx = " << m.cluster_index() << std::endl;
0218
0219 os << " -> loc pos = [" << m.local_position()[0];
0220 for (unsigned int i = 1u; i < m.dimensions(); ++i) {
0221 os << ", " << m.local_position()[i];
0222 }
0223 os << "]\n -> loc var = [" << m.local_variance()[0];
0224 for (unsigned int i = 1u; i < m.dimensions(); ++i) {
0225 os << ", " << m.local_variance()[i];
0226 }
0227 os << "]" << std::endl;
0228
0229 os << " -> t = " << m.time() * traccc::unit<float>::s << "s"
0230 << std::endl;
0231 os << " -> diameter = " << m.diameter() * traccc::unit<float>::mm << "mm"
0232 << std::endl;
0233
0234 return os;
0235 }
0236
0237 };
0238
0239
0240 using measurement_collection = vecmem::edm::container<
0241 measurement,
0242
0243 vecmem::edm::type::vector<std::array<float, 2u>>,
0244
0245 vecmem::edm::type::vector<std::array<float, 2u>>,
0246
0247 vecmem::edm::type::vector<unsigned int>,
0248
0249 vecmem::edm::type::vector<float>,
0250
0251 vecmem::edm::type::vector<float>,
0252
0253 vecmem::edm::type::vector<unsigned int>,
0254
0255 vecmem::edm::type::vector<detray::geometry::identifier>,
0256
0257 vecmem::edm::type::vector<std::array<std::uint8_t, 2u>>,
0258
0259 vecmem::edm::type::vector<unsigned int>>;
0260
0261 }
0262
0263
0264 #include "traccc/edm/impl/measurement_collection.ipp"