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 if (std::size(payload) != packet_size_w) {
118 throw std::runtime_error(
119 Muon::nsw::format("Packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
120 }
121
122 const auto packets = std::span{payload.data(), std::size(payload)};
123 auto readPointer = std::size_t{0};
124 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
125 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
126 };
127
128 if (ver >= 3)
129 {
130 // in versions 3+ the padding appears first
131 decode(readPointer, Muon::nsw::STGTPPad::size_v3_padding);
132 }
134 for (std::size_t i = Muon::nsw::STGTPPad::num_pads; i > 0; --i) {
135 const auto index = i - 1;
136 m_phiIDs.at(index) = decode(readPointer, Muon::nsw::STGTPPad::size_phiID);
137 }
138
139 for (std::size_t i = Muon::nsw::STGTPPad::num_pads; i > 0; --i) {
140 const auto index = i - 1;
141 m_bandIDs.at(index) = decode(readPointer, Muon::nsw::STGTPPad::size_bandID);
142 }
143
144 m_BCID = decode(readPointer, Muon::nsw::STGTPPad::size_BCID);
145 readPointer += Muon::nsw::STGTPPad::size_spare;
146 m_idleFlag = decode(readPointer, Muon::nsw::STGTPPad::size_idleFlag);
147}
148
150 size_t packet_size_w = 0;
151 size_t word_size = 32;
152 switch (ver) {
153 case 1:
154 packet_size_w = Muon::nsw::STGTPSegments::size_v1 / word_size;;
155 break;
156 case 2:
157 packet_size_w = Muon::nsw::STGTPSegments::size_v2 / word_size;;
158 break;
159 case 3:
160 packet_size_w = Muon::nsw::STGTPSegments::size_v3 / word_size;
161 break;
162 default:
163 packet_size_w = 0;
164 break;
165 }
166 return packet_size_w;
167}
168
169Muon::nsw::STGTPSegmentPacket::STGTPSegmentPacket(const std::vector<uint32_t>& payload, const int ver=1) {
170 size_t packet_size_w = Size(ver);
171
172 if (std::size(payload) != packet_size_w) {
173 throw std::runtime_error(
174 Muon::nsw::format("Packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
175 }
176 auto readPointer = std::size_t{0};
177 const auto packets = std::span{payload.data(), std::size(payload)};
178 auto decode = [&packets](std::size_t& readPointer, const std::size_t size) {
179 return decode_and_advance<std::uint64_t, std::uint32_t>(packets, readPointer, size);
180 };
181
182 if (ver < 3)
183 {
184 // In the versions prior to version 3, there was a LUT used to merge segments
185 // the versions following 3 use an algorithm that simplifies the merge, and hence the
186 // structure of these data changed
190 }
191 else
192 {
196 }
197
198 for (std::size_t i = Muon::nsw::STGTPSegments::num_segments; i > 0; --i) {
199 const auto index = i - 1;
207
208 }
209
210 m_BCID = decode(readPointer, Muon::nsw::STGTPSegments::size_bcid);
212
213
214}
215
217 const std::size_t segment) const {
218 if (segment >= STGTPSegments::num_segments) {
219 throw std::out_of_range(
220 Muon::nsw::format("Requested segment {} which does not exist (max {})", segment, STGTPSegments::num_segments - 1));
221 }
222 return m_segmentData.at(segment);
223}
224
226 size_t packet_size_w = 0;
227 size_t word_size = 32;
228 switch (ver) {
229 case 1:
230 packet_size_w = Muon::nsw::STGTPStrips::size_v1 / word_size;
231 break;
232 case 2:
233 packet_size_w = Muon::nsw::STGTPStrips::size_v2 / word_size;
234 break;
235 case 3:
236 packet_size_w = Muon::nsw::STGTPStrips::size_v3 / word_size;
237 break;
238 default:
239 packet_size_w = 0;
240 break;
241 }
242 return packet_size_w;
243}
244
245Muon::nsw::STGTPStripPacket::STGTPStripPacket(const std::vector<uint32_t>& payload, const int ver) {
246 size_t packet_size_w = Size(ver);
247
248 if (std::size(payload) != packet_size_w) {
249 throw std::runtime_error(
250 Muon::nsw::format("Strip packet vector has size {} instead of expected size {}", std::size(payload), packet_size_w));
251 }
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)
260 decode(readPointer, Muon::nsw::STGTPStrips::size_padding);
261
262 // Decode 112 strips (6 bits each)
263 for (std::size_t i = Muon::nsw::STGTPStrips::num_strips; i > 0; --i) {
264 const auto index = i - 1;
266 }
267
268 // Decode 8 offsets (16 bits each)
269 for (std::size_t i = Muon::nsw::STGTPStrips::num_offsets; i > 0; --i) {
270 const auto index = i - 1;
271 m_offsets.at(index) = decode(readPointer, Muon::nsw::STGTPStrips::size_offset);
272 }
273
274 // Decode remaining fields
277 m_bandId = decode(readPointer, Muon::nsw::STGTPStrips::size_band_id);
278 m_BCID = decode(readPointer, Muon::nsw::STGTPStrips::size_bcid);
279}
280
281std::uint32_t Muon::nsw::STGTPStripPacket::Strip(const std::size_t strip) const {
283 throw std::out_of_range(
284 Muon::nsw::format("Requested strip {} which does not exist (max {})", strip, STGTPStrips::num_strips - 1));
285 }
286 return m_stripData.at(strip);
287}
288
289std::uint32_t Muon::nsw::STGTPStripPacket::Offset(const std::size_t offset) const {
290 if (offset >= STGTPStrips::num_offsets) {
291 throw std::out_of_range(
292 Muon::nsw::format("Requested offset {} which does not exist (max {})", offset, STGTPStrips::num_offsets - 1));
293 }
294 return m_offsets.at(offset);
295}
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