ATLAS Offline Software
Toggle main menu visibility
Loading...
Searching...
No Matches
MuonSpectrometer
MuonCnv
MuonNSWCommonDecode
src
NSWTriggerMML1AElink.cxx
Go to the documentation of this file.
1
/*
2
Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3
*/
4
5
6
#include "
MuonNSWCommonDecode/NSWTriggerMML1AElink.h
"
7
8
#include "
MuonNSWCommonDecode/NSWMMTPDecodeBitmaps.h
"
9
#include "
MuonNSWCommonDecode/NSWResourceId.h
"
10
#include "
MuonNSWCommonDecode/MMARTPacket.h
"
11
#include "
MuonNSWCommonDecode/MMTrigPacket.h
"
12
#include "ers/ers.h"
13
#include <exception>
14
#include <sstream>
15
16
Muon::nsw::NSWTriggerMML1AElink::NSWTriggerMML1AElink
(
const
uint32_t *bs,
const
uint32_t remaining):
17
NSWTriggerElink
(bs, remaining)
18
{
19
20
std::size_t size_word{
sizeof
(uint32_t) * 8};
21
// 2 felix header 32b words already decoded
22
std::size_t readPointer{2 * 32};
23
std::span<const std::uint32_t> data{bs, remaining};
24
//once format finalized, checking a minimum size or at least the structure
25
26
m_head_fragID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_fragID
);
27
m_head_sectID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_sectID
);
28
m_head_EC
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_EC
);
29
m_head_flags
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_flags
);
30
m_head_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_BCID
);
31
m_head_orbit
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_orbit
);
32
m_head_spare
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_head_spare
);
33
m_L1ID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_L1ID
);
34
35
ERS_DEBUG(2,
Muon::nsw::format
(
"\n TP header: \n"
36
" fradID: {}\n"
37
" sectID: {}\n"
38
" EC: {}\n"
39
" flags: {}\n"
40
" BCID: {}\n"
41
" orbit: {}\n"
42
" spare: {}\n"
43
" L1ID: {}"
,
44
m_head_fragID
,
m_head_sectID
,
m_head_EC
,
m_head_flags
,
m_head_BCID
,
m_head_orbit
,
m_head_spare
,
m_L1ID
));
45
46
m_l1a_versionID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_versionID
);
47
m_l1a_local_req_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_local_req_BCID
);
48
m_l1a_local_rel_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_local_rel_BCID
);
49
m_l1a_open_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_open_BCID
);
50
m_l1a_req_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_req_BCID
);
51
m_l1a_close_BCID
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_close_BCID
);
52
m_l1a_timeout
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_timeout
);
53
m_l1a_open_BCID_offset
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_open_BCID_offset
);
54
m_l1a_req_BCID_offset
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_req_BCID_offset
);
55
m_l1a_close_BCID_offset
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_close_BCID_offset
);
56
m_l1a_timeout_config
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_timeout_config
);
57
m_l1a_busy_thr
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_busy_thr
);
58
m_l1a_engine_snapshot
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_engine_snapshot
);
59
m_l1a_link_const
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_link_const
);
60
m_l1a_padding
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_l1a_padding
);
61
//m_l1a_link_const is important! It identifies the elink! It should be ABCD1230/ABCD1231/ABCD1232
62
//not checked during decoding but must be checked at some point
63
64
//already checked in NSWTriggerElink that remaining >= m_wordCountFlx
65
while
( readPointer < (
m_wordCountFlx
-1) * size_word ) {
66
//later during commissioning, need to change to ( readPointer < (m_wordCountFlx-1-stream_block_size) * size_word )
67
//later during commissioning, checking if there's at least enough space for the stream header and stream content
68
//(protected for now by a generic expression in bit_slice, just want to be more specific)
69
70
uint32_t current_stream_head_nbits =
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_stream_head_nbits
);
71
uint32_t current_stream_head_nwords =
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_stream_head_nwords
);
72
uint32_t current_stream_head_fifo_size =
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_stream_head_fifo_size
);
73
uint32_t current_stream_head_streamID =
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_stream_head_streamID
);
74
75
ERS_DEBUG(2,
Muon::nsw::format
(
"\n Stream header: \n"
76
" nbits: {}\n"
77
" nwords: {}\n"
78
" fifo_size: {}\n"
79
" streamID: {}"
,
80
current_stream_head_nbits, current_stream_head_nwords, current_stream_head_fifo_size, current_stream_head_streamID));
81
82
83
//zero padding to multiples of 16bits - TP logic - this is the real number of bits to read
84
current_stream_head_nbits = current_stream_head_nbits%16? ((current_stream_head_nbits+15)/16)*16 : current_stream_head_nbits;
85
86
m_stream_head_nbits
.push_back ( current_stream_head_nbits );
87
m_stream_head_nwords
.push_back ( current_stream_head_nwords );
88
m_stream_head_fifo_size
.push_back ( current_stream_head_fifo_size );
89
m_stream_head_streamID
.push_back ( current_stream_head_streamID );
90
91
int
current_stream_head_n32b_per_word = (current_stream_head_nbits-1)/32 +1;
//how many 32b words needed for a art/trigger packet
92
std::vector<std::vector<uint32_t>> current_stream_data;
93
94
//this block is very generic and agnostic of MMTP stream data format!
95
//only assumption: art/trigger packet size is multiple of 32b --- SF FIX BEFORE MR!
96
for
(
uint
i = 0; i<current_stream_head_nwords; i++){
97
std::vector<uint32_t> current_stream_word;
98
for
(
int
j = 0; j < current_stream_head_n32b_per_word; j++){
99
current_stream_word.push_back(
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer, size_word) );
100
}
101
current_stream_data.push_back(std::move(current_stream_word));
102
}
103
m_stream_data
.push_back(std::move(current_stream_data));
104
105
}
106
107
for
(
uint
i=0; i<
m_stream_data
.size(); i++){
108
109
switch
(
m_stream_head_streamID
[i]) {
110
case
0xAAA0:
111
case
0xAAA1:
112
case
0xAAA2:
113
case
0xAAA3:
114
for
(
uint
j = 0; j <
m_stream_data
[i].size(); j++){
115
if
(
m_stream_data
[i][j].
size
()!=3 ){
116
Muon::nsw::NSWTriggerException
e (
Muon::nsw::format
(
"Stream ID 0xAAA[0-3] packet length not correct: expected 3, got ({})"
,
m_stream_data
[i][j].
size
() ), 6);
117
throw
e;
118
}
119
m_art_packets
.push_back( std::make_shared<Muon::nsw::MMARTPacket>(
m_stream_data
[i][j]) );
//arg will be a vector<uint32_t> of size 3
120
}
121
break
;
122
case
0xAAA4:
123
for
(
uint
j = 0; j <
m_stream_data
[i].size(); j++){
124
if
(
m_stream_data
[i][j].
size
()!=2 ){
125
Muon::nsw::NSWTriggerException
e (
Muon::nsw::format
(
"Stream ID 0xAAA4 packet length not correct: expected 2, got ({})"
,
m_stream_data
[i][j].
size
() ), 7);
126
throw
e;
127
}
128
m_trig_packets
.push_back( std::make_shared<Muon::nsw::MMTrigPacket>(
m_stream_data
[i][j]) );
//arg will be a vector<uint32_t> of size 2
129
}
130
break
;
131
default
:
132
Muon::nsw::NSWTriggerException
e (
Muon::nsw::format
(
"Stream ID in MMTP L1A not recognized: {}"
,
m_stream_head_streamID
[i]), 5);
133
throw
e;
134
}
135
136
}
137
138
// warning: swROD is zero padding the last word to 32b
139
// this means that there can be a leftover 16b 0x0000 after the CRC
140
// m_wordCountFlx is anyway "aware" of this
141
m_trailer_CRC
=
Muon::nsw::decode_and_advance<uint64_t>
(data, readPointer,
Muon::nsw::MMTPL1A::size_trailer_CRC
);
142
143
// calculate CRC by hand now - need to exclude the FEC header (2 words)
144
m_trailer_CRC_calc
=
Muon::nsw::get_16bxor_crc
(bs+2,
m_wordCountFlx
-2);
145
146
}
uint
unsigned int uint
Definition
LArOFPhaseFill.cxx:19
MMARTPacket.h
MMTrigPacket.h
NSWMMTPDecodeBitmaps.h
NSWResourceId.h
NSWTriggerMML1AElink.h
size
size_t size() const
Number of registered mappings.
Muon::nsw::NSWTriggerElink::NSWTriggerElink
NSWTriggerElink(const uint32_t *bs, uint32_t remaining)
Definition
NSWTriggerElink.cxx:12
Muon::nsw::NSWTriggerElink::m_wordCountFlx
unsigned int m_wordCountFlx
Definition
NSWTriggerElink.h:67
Muon::nsw::NSWTriggerException
Definition
NSWTriggerElink.h:20
Muon::nsw::NSWTriggerMML1AElink::m_l1a_engine_snapshot
uint32_t m_l1a_engine_snapshot
Definition
NSWTriggerMML1AElink.h:94
Muon::nsw::NSWTriggerMML1AElink::m_l1a_padding
uint32_t m_l1a_padding
Definition
NSWTriggerMML1AElink.h:96
Muon::nsw::NSWTriggerMML1AElink::m_l1a_open_BCID
uint32_t m_l1a_open_BCID
Definition
NSWTriggerMML1AElink.h:85
Muon::nsw::NSWTriggerMML1AElink::NSWTriggerMML1AElink
NSWTriggerMML1AElink(const uint32_t *bs, uint32_t remaining)
Definition
NSWTriggerMML1AElink.cxx:16
Muon::nsw::NSWTriggerMML1AElink::m_l1a_timeout_config
uint32_t m_l1a_timeout_config
Definition
NSWTriggerMML1AElink.h:92
Muon::nsw::NSWTriggerMML1AElink::m_l1a_local_req_BCID
uint32_t m_l1a_local_req_BCID
Definition
NSWTriggerMML1AElink.h:83
Muon::nsw::NSWTriggerMML1AElink::m_head_BCID
uint32_t m_head_BCID
Definition
NSWTriggerMML1AElink.h:77
Muon::nsw::NSWTriggerMML1AElink::m_l1a_link_const
uint32_t m_l1a_link_const
Definition
NSWTriggerMML1AElink.h:95
Muon::nsw::NSWTriggerMML1AElink::m_stream_data
std::vector< std::vector< std::vector< uint32_t > > > m_stream_data
Definition
NSWTriggerMML1AElink.h:102
Muon::nsw::NSWTriggerMML1AElink::m_l1a_busy_thr
uint32_t m_l1a_busy_thr
Definition
NSWTriggerMML1AElink.h:93
Muon::nsw::NSWTriggerMML1AElink::m_l1a_timeout
uint32_t m_l1a_timeout
Definition
NSWTriggerMML1AElink.h:88
Muon::nsw::NSWTriggerMML1AElink::m_stream_head_nwords
std::vector< uint32_t > m_stream_head_nwords
Definition
NSWTriggerMML1AElink.h:99
Muon::nsw::NSWTriggerMML1AElink::m_stream_head_nbits
std::vector< uint32_t > m_stream_head_nbits
Definition
NSWTriggerMML1AElink.h:98
Muon::nsw::NSWTriggerMML1AElink::m_head_flags
uint32_t m_head_flags
Definition
NSWTriggerMML1AElink.h:76
Muon::nsw::NSWTriggerMML1AElink::m_l1a_local_rel_BCID
uint32_t m_l1a_local_rel_BCID
Definition
NSWTriggerMML1AElink.h:84
Muon::nsw::NSWTriggerMML1AElink::m_head_orbit
uint32_t m_head_orbit
Definition
NSWTriggerMML1AElink.h:78
Muon::nsw::NSWTriggerMML1AElink::m_head_sectID
uint32_t m_head_sectID
Definition
NSWTriggerMML1AElink.h:74
Muon::nsw::NSWTriggerMML1AElink::m_head_fragID
uint32_t m_head_fragID
Definition
NSWTriggerMML1AElink.h:73
Muon::nsw::NSWTriggerMML1AElink::m_l1a_versionID
uint32_t m_l1a_versionID
Definition
NSWTriggerMML1AElink.h:82
Muon::nsw::NSWTriggerMML1AElink::m_l1a_req_BCID_offset
uint32_t m_l1a_req_BCID_offset
Definition
NSWTriggerMML1AElink.h:90
Muon::nsw::NSWTriggerMML1AElink::m_trailer_CRC_calc
uint32_t m_trailer_CRC_calc
Definition
NSWTriggerMML1AElink.h:108
Muon::nsw::NSWTriggerMML1AElink::m_l1a_open_BCID_offset
uint32_t m_l1a_open_BCID_offset
Definition
NSWTriggerMML1AElink.h:89
Muon::nsw::NSWTriggerMML1AElink::m_l1a_close_BCID
uint32_t m_l1a_close_BCID
Definition
NSWTriggerMML1AElink.h:87
Muon::nsw::NSWTriggerMML1AElink::m_trailer_CRC
uint32_t m_trailer_CRC
Definition
NSWTriggerMML1AElink.h:107
Muon::nsw::NSWTriggerMML1AElink::m_L1ID
uint32_t m_L1ID
Definition
NSWTriggerMML1AElink.h:80
Muon::nsw::NSWTriggerMML1AElink::m_art_packets
std::vector< std::shared_ptr< Muon::nsw::MMARTPacket > > m_art_packets
Definition
NSWTriggerMML1AElink.h:110
Muon::nsw::NSWTriggerMML1AElink::m_trig_packets
std::vector< std::shared_ptr< Muon::nsw::MMTrigPacket > > m_trig_packets
Definition
NSWTriggerMML1AElink.h:111
Muon::nsw::NSWTriggerMML1AElink::m_stream_head_fifo_size
std::vector< uint32_t > m_stream_head_fifo_size
Definition
NSWTriggerMML1AElink.h:100
Muon::nsw::NSWTriggerMML1AElink::m_l1a_close_BCID_offset
uint32_t m_l1a_close_BCID_offset
Definition
NSWTriggerMML1AElink.h:91
Muon::nsw::NSWTriggerMML1AElink::m_head_spare
uint32_t m_head_spare
Definition
NSWTriggerMML1AElink.h:79
Muon::nsw::NSWTriggerMML1AElink::m_head_EC
uint32_t m_head_EC
Definition
NSWTriggerMML1AElink.h:75
Muon::nsw::NSWTriggerMML1AElink::m_l1a_req_BCID
uint32_t m_l1a_req_BCID
Definition
NSWTriggerMML1AElink.h:86
Muon::nsw::NSWTriggerMML1AElink::m_stream_head_streamID
std::vector< uint32_t > m_stream_head_streamID
Definition
NSWTriggerMML1AElink.h:101
Muon::nsw::MMTPL1A::size_head_BCID
constexpr int size_head_BCID
Definition
NSWMMTPDecodeBitmaps.h:20
Muon::nsw::MMTPL1A::size_l1a_close_BCID_offset
constexpr int size_l1a_close_BCID_offset
Definition
NSWMMTPDecodeBitmaps.h:33
Muon::nsw::MMTPL1A::size_l1a_close_BCID
constexpr int size_l1a_close_BCID
Definition
NSWMMTPDecodeBitmaps.h:29
Muon::nsw::MMTPL1A::size_l1a_local_req_BCID
constexpr int size_l1a_local_req_BCID
Definition
NSWMMTPDecodeBitmaps.h:25
Muon::nsw::MMTPL1A::size_head_orbit
constexpr int size_head_orbit
Definition
NSWMMTPDecodeBitmaps.h:21
Muon::nsw::MMTPL1A::size_l1a_req_BCID
constexpr int size_l1a_req_BCID
Definition
NSWMMTPDecodeBitmaps.h:28
Muon::nsw::MMTPL1A::size_head_sectID
constexpr int size_head_sectID
Definition
NSWMMTPDecodeBitmaps.h:17
Muon::nsw::MMTPL1A::size_stream_head_fifo_size
constexpr int size_stream_head_fifo_size
Definition
NSWMMTPDecodeBitmaps.h:41
Muon::nsw::MMTPL1A::size_trailer_CRC
constexpr int size_trailer_CRC
Definition
NSWMMTPDecodeBitmaps.h:43
Muon::nsw::MMTPL1A::size_L1ID
constexpr int size_L1ID
Definition
NSWMMTPDecodeBitmaps.h:23
Muon::nsw::MMTPL1A::size_l1a_versionID
constexpr int size_l1a_versionID
Definition
NSWMMTPDecodeBitmaps.h:24
Muon::nsw::MMTPL1A::size_l1a_req_BCID_offset
constexpr int size_l1a_req_BCID_offset
Definition
NSWMMTPDecodeBitmaps.h:32
Muon::nsw::MMTPL1A::size_head_flags
constexpr int size_head_flags
Definition
NSWMMTPDecodeBitmaps.h:19
Muon::nsw::MMTPL1A::size_head_spare
constexpr int size_head_spare
Definition
NSWMMTPDecodeBitmaps.h:22
Muon::nsw::MMTPL1A::size_l1a_timeout
constexpr int size_l1a_timeout
Definition
NSWMMTPDecodeBitmaps.h:30
Muon::nsw::MMTPL1A::size_stream_head_nwords
constexpr int size_stream_head_nwords
Definition
NSWMMTPDecodeBitmaps.h:40
Muon::nsw::MMTPL1A::size_head_fragID
constexpr int size_head_fragID
Definition
NSWMMTPDecodeBitmaps.h:16
Muon::nsw::MMTPL1A::size_l1a_link_const
constexpr int size_l1a_link_const
Definition
NSWMMTPDecodeBitmaps.h:37
Muon::nsw::MMTPL1A::size_l1a_engine_snapshot
constexpr int size_l1a_engine_snapshot
Definition
NSWMMTPDecodeBitmaps.h:36
Muon::nsw::MMTPL1A::size_l1a_open_BCID
constexpr int size_l1a_open_BCID
Definition
NSWMMTPDecodeBitmaps.h:27
Muon::nsw::MMTPL1A::size_l1a_padding
constexpr int size_l1a_padding
Definition
NSWMMTPDecodeBitmaps.h:38
Muon::nsw::MMTPL1A::size_l1a_busy_thr
constexpr int size_l1a_busy_thr
Definition
NSWMMTPDecodeBitmaps.h:35
Muon::nsw::MMTPL1A::size_l1a_open_BCID_offset
constexpr int size_l1a_open_BCID_offset
Definition
NSWMMTPDecodeBitmaps.h:31
Muon::nsw::MMTPL1A::size_stream_head_streamID
constexpr int size_stream_head_streamID
Definition
NSWMMTPDecodeBitmaps.h:42
Muon::nsw::MMTPL1A::size_l1a_local_rel_BCID
constexpr int size_l1a_local_rel_BCID
Definition
NSWMMTPDecodeBitmaps.h:26
Muon::nsw::MMTPL1A::size_head_EC
constexpr int size_head_EC
Definition
NSWMMTPDecodeBitmaps.h:18
Muon::nsw::MMTPL1A::size_l1a_timeout_config
constexpr int size_l1a_timeout_config
Definition
NSWMMTPDecodeBitmaps.h:34
Muon::nsw::MMTPL1A::size_stream_head_nbits
constexpr int size_stream_head_nbits
Definition
NSWMMTPDecodeBitmaps.h:39
Muon::nsw::get_16bxor_crc
uint16_t get_16bxor_crc(const uint32_t *dataPointer, uint32_t dataSize)
Definition
NSWDecodeHelper.h:178
Muon::nsw::format
std::string format(const std::string &str, const T &arg)
Definition
NSWDecodeHelper.h:43
Muon::nsw::decode_and_advance
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
NSWDecodeHelper.h:119
Generated on
for ATLAS Offline Software by
1.17.0