ATLAS Offline Software
Loading...
Searching...
No Matches
STGTPPackets.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
5
6#include <algorithm>
7#include <exception>
8#include <sstream>
9#include <stdexcept>
10#include <string>
11#include <tuple>
12#include <vector>
13
17
18
19size_t Muon::nsw::STGTPMMPacket::Size(const int ver){
20 size_t packet_size_w = 0;
21 size_t word_size = 32;
22 switch (ver) {
23 case 1:
24 packet_size_w = Muon::nsw::STGTPMMData::size_v1 / word_size;
25 break;
26 case 2:
27 packet_size_w = Muon::nsw::STGTPMMData::size_v2 / word_size;
28 break;
29 case 3:
30 packet_size_w = Muon::nsw::STGTPMMData::size_v3 / word_size;
31 break;
32 default:
33 packet_size_w = 0;
34 break;
35 }
36 return packet_size_w;
37}
38Muon::nsw::STGTPMMPacket::STGTPMMPacket(const std::vector<uint32_t>& payload, const int ver=1) {
39
40 if (ver < 3){
41 // This section did not exist before v3
42 return;
43 }
44
45 size_t packet_size_w = Size(ver);
46
47 if (std::size(payload) != packet_size_w) {
48 throw std::runtime_error(
49 Muon::nsw::format("Packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
50 }
51
52 const auto packets = std::span{payload.data(), std::size(payload)};
53 auto readPointer = std::size_t{0};
54 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
55 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
56 };
57
58
59 decode(readPointer, Muon::nsw::STGTPMMData::size_v3_padding);
61 for (std::size_t i = Muon::nsw::STGTPMMData::num_mm; i > 0; --i) {
62 const auto index = i - 1;
63 uint32_t segment_bit = 1 << index;
64 uint32_t valid_segment = (m_valids & segment_bit);
72 if (!valid_segment)
73 {
74 m_segmentData.at(index).monitor = 0;
75 m_segmentData.at(index).spare = 0;
76 m_segmentData.at(index).lowRes = 0;
77 m_segmentData.at(index).phiRes = 0;
78 m_segmentData.at(index).dTheta = Muon::nsw::STGTPMMData::mm_stream_invalid_dTheta; // this is the invalid flag
79 m_segmentData.at(index).phiID = 0;
80 m_segmentData.at(index).rIndex = 0;
81 }
82 }
83 m_BCID = decode(readPointer, Muon::nsw::STGTPMMData::size_bcid);
84
85}
86
88 const std::size_t segment) const {
89 if (segment >= STGTPMMData::num_mm) {
90 throw std::out_of_range(
91 Muon::nsw::format("Requested segment {} which does not exist (max {})", segment, STGTPMMData::num_mm - 1));
92 }
93 return m_segmentData.at(segment);
94}
95
96size_t Muon::nsw::STGTPPadPacket::Size(const int ver){
97 size_t packet_size_w = 0;
98 size_t word_size = 32;
99 switch (ver) {
100 case 1:
101 packet_size_w = Muon::nsw::STGTPPad::size_v1 / word_size;
102 break;
103 case 2:
104 packet_size_w = Muon::nsw::STGTPPad::size_v2 / word_size;
105 break;
106 case 3:
107 packet_size_w = Muon::nsw::STGTPPad::size_v3 / word_size;
108 break;
109 default:
110 packet_size_w = 0;
111 break;
112 }
113 return packet_size_w;
114}
115Muon::nsw::STGTPPadPacket::STGTPPadPacket(const std::vector<uint32_t>& payload, const int ver=1) {
116 size_t packet_size_w = Size(ver);
117
118
119 if (std::size(payload) != packet_size_w) {
120 throw std::runtime_error(
121 Muon::nsw::format("Packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
122 }
123
124 const auto packets = std::span{payload.data(), std::size(payload)};
125 auto readPointer = std::size_t{0};
126 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
127 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
128 };
129
130 if (ver >= 3)
131 {
132 // in versions 3+ the padding appears first
133 decode(readPointer, Muon::nsw::STGTPPad::size_v3_padding);
134 }
136 for (std::size_t i = Muon::nsw::STGTPPad::num_pads; i > 0; --i) {
137 const auto index = i - 1;
138 m_phiIDs.at(index) = decode(readPointer, Muon::nsw::STGTPPad::size_phiID);
139 }
140
141 for (std::size_t i = Muon::nsw::STGTPPad::num_pads; i > 0; --i) {
142 const auto index = i - 1;
143 m_bandIDs.at(index) = decode(readPointer, Muon::nsw::STGTPPad::size_bandID);
144 }
145
146 m_BCID = decode(readPointer, Muon::nsw::STGTPPad::size_BCID);
147 readPointer += Muon::nsw::STGTPPad::size_spare;
148 m_idleFlag = decode(readPointer, Muon::nsw::STGTPPad::size_idleFlag);
149}
150
152 size_t packet_size_w = 0;
153 size_t word_size = 32;
154 switch (ver) {
155 case 1:
156 packet_size_w = Muon::nsw::STGTPSegments::size_v1 / word_size;;
157 break;
158 case 2:
159 packet_size_w = Muon::nsw::STGTPSegments::size_v2 / word_size;;
160 break;
161 case 3:
162 packet_size_w = Muon::nsw::STGTPSegments::size_v3 / word_size;
163 break;
164 default:
165 packet_size_w = 0;
166 break;
167 }
168 return packet_size_w;
169}
170
171Muon::nsw::STGTPSegmentPacket::STGTPSegmentPacket(const std::vector<uint32_t>& payload, const int ver=1) {
172 size_t packet_size_w = Size(ver);
173
174 if (std::size(payload) != packet_size_w) {
175 throw std::runtime_error(
176 Muon::nsw::format("Packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
177 }
178 auto readPointer = std::size_t{0};
179 const auto packets = std::span{payload.data(), std::size(payload)};
180 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
181 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
182 };
183
184 if (ver < 3)
185 {
186 // In the versions prior to version 3, there was a LUT used to merge segments
187 // the versions following 3 use an algorithm that simplifies the merge, and hence the
188 // structure of these data changed
192 }
193 else
194 {
198 }
199
200 for (std::size_t i = Muon::nsw::STGTPSegments::num_segments; i > 0; --i) {
201 const auto index = i - 1;
209
210 }
211
212 m_BCID = decode(readPointer, Muon::nsw::STGTPSegments::size_bcid);
214
215
216}
217
219 const std::size_t segment) const {
220 if (segment >= STGTPSegments::num_segments) {
221 throw std::out_of_range(
222 Muon::nsw::format("Requested segment {} which does not exist (max {})", segment, STGTPSegments::num_segments - 1));
223 }
224 return m_segmentData.at(segment);
225}
226
228 size_t packet_size_w = 0;
229 size_t word_size = 32;
230 switch (ver) {
231 case 1:
232 packet_size_w = Muon::nsw::STGTPStrips::size_v1 / word_size;
233 break;
234 case 2:
235 packet_size_w = Muon::nsw::STGTPStrips::size_v2 / word_size;
236 break;
237 case 3:
238 packet_size_w = Muon::nsw::STGTPStrips::size_v3 / word_size;
239 break;
240 default:
241 packet_size_w = 0;
242 break;
243 }
244 return packet_size_w;
245}
246
247Muon::nsw::STGTPStripPacket::STGTPStripPacket(const std::vector<uint32_t>& payload, const int ver) {
248 size_t packet_size_w = Size(ver);
249 if (std::size(payload) != packet_size_w) {
250 throw std::runtime_error(
251 Muon::nsw::format("Strip packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
252 }
253 const auto packets = std::span{payload.data(), std::size(payload)};
254 auto readPointer = std::size_t{0};
255 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
256 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
257 };
258
259 // Skip padding (70 bits)
261 // Decode 112 strips (6 bits each)
262 for (std::size_t i = Muon::nsw::STGTPStrips::num_strips; i > 0; --i) {
263 const auto index = i - 1;
265 }
266
267 // Decode 8 offsets (16 bits each)
268 for (std::size_t i = Muon::nsw::STGTPStrips::num_offsets; i > 0; --i) {
269 const auto index = i - 1;
270 m_offsets.at(index) = decode(readPointer, Muon::nsw::STGTPStrips::size_offset);
271 }
272
273 // Decode remaining fields
276 m_bandId = decode(readPointer, Muon::nsw::STGTPStrips::size_band_id);
277 m_BCID = decode(readPointer, Muon::nsw::STGTPStrips::size_bcid);
278}
279
280std::uint32_t Muon::nsw::STGTPStripPacket::Strip(const std::size_t strip) const {
282 throw std::out_of_range(
283 Muon::nsw::format("Requested strip {} which does not exist (max {})", strip, STGTPStrips::num_strips - 1));
284 }
285 return m_stripData.at(strip);
286}
287
288std::uint32_t Muon::nsw::STGTPStripPacket::Offset(const std::size_t offset) const {
289 if (offset >= STGTPStrips::num_offsets) {
290 throw std::out_of_range(
291 Muon::nsw::format("Requested offset {} which does not exist (max {})", offset, STGTPStrips::num_offsets - 1));
292 }
293 return m_offsets.at(offset);
294}
size_t size() const
Number of registered mappings.
STGTPMMPacket(const std::vector< std::uint32_t > &payload, const int ver)
const MMSegmentData & Segment(std::size_t segment) const
std::array< MMSegmentData, STGTPMMData::num_mm > m_segmentData
size_t Size(const int ver)
std::array< std::uint32_t, STGTPPad::num_pads > m_bandIDs
std::array< std::uint32_t, STGTPPad::num_pads > m_phiIDs
size_t Size(const int version)
STGTPPadPacket(const std::vector< std::uint32_t > &payload, const int ver)
STGTPSegmentPacket(const std::vector< std::uint32_t > &payload, const int ver)
size_t Size(const int ver)
const SegmentData & Segment(std::size_t segment) const
std::uint32_t m_valid_segment_selector
std::array< SegmentData, STGTPSegments::num_segments > m_segmentData
std::uint32_t m_nsw_segment_selector
size_t Size(const int ver)
STGTPStripPacket(const std::vector< std::uint32_t > &payload, const int ver)
std::uint32_t Offset(std::size_t offset) const
std::uint32_t Strip(std::size_t strip) const
std::array< std::uint32_t, STGTPStrips::num_strips > m_stripData
std::array< std::uint32_t, STGTPStrips::num_offsets > m_offsets
constexpr std::size_t size_v2
constexpr std::size_t num_mm
constexpr std::size_t size_v3
constexpr std::size_t size_v1
constexpr std::size_t size_v2
constexpr std::size_t size_phiID
constexpr std::size_t size_coincidence_wedge
constexpr std::size_t num_pads
constexpr std::size_t size_bandID
constexpr std::size_t size_v3_padding
constexpr std::size_t size_BCID
constexpr std::size_t size_spare
constexpr std::size_t size_v1
constexpr std::size_t size_idleFlag
constexpr std::size_t size_v3
constexpr std::size_t size_v3
constexpr std::size_t size_v2
constexpr std::size_t size_v1
constexpr std::size_t num_segments
constexpr std::size_t size_valid_segment_v3
constexpr std::size_t num_strips
constexpr std::size_t size_v3
constexpr std::size_t size_v2
constexpr std::size_t size_v1
constexpr std::size_t num_offsets
std::string format(const std::string &str, const T &arg)
constexpr Target decode_and_advance(const std::span< const Source > words, std::size_t &start, const std::size_t size)
Decode bits from data of words and advance the read pointer.
Definition index.py:1