Skip to content

Commit 8eaa536

Browse files
authored
Merge pull request #48559 from CMS-HGCAL/ECON_SLink_Diff
Read BX, L1A, and Orbit numbers from ECON-D, Capture Block, and S-Link headers
2 parents dc1c73b + 1dce0ee commit 8eaa536

File tree

6 files changed

+61
-9
lines changed

6 files changed

+61
-9
lines changed

DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoSoA.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,15 @@ namespace hgcaldigi {
7373
// If exception found before ECON-D, this would be 0
7474
// Otherwise the payload length of the ECON-D
7575
SOA_COLUMN(uint16_t, payloadLength),
76+
// BX,L1A,Orbit number of the ECON-D
77+
SOA_COLUMN(uint16_t, BX),
78+
SOA_COLUMN(uint8_t, L1A),
79+
SOA_COLUMN(uint8_t, Orbit),
80+
// BX,L1A,Orbit number of the Capture Block
81+
SOA_COLUMN(uint16_t, CBBX),
82+
SOA_COLUMN(uint8_t, CBL1A),
83+
SOA_COLUMN(uint8_t, CBOrbit),
84+
// Common modes
7685
SOA_EIGEN_COLUMN(Matrix, cm))
7786
using HGCalECONDPacketInfoSoA = HGCalECONDPacketInfoSoALayout<>;
7887
} // namespace hgcaldigi

DataFormats/HGCalDigi/interface/HGCalFEDPacketInfoSoA.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ namespace hgcaldigi {
5757
// bit 1 : unable to unpack data
5858
// bit 2 : at least one capture block has active flags
5959
SOA_COLUMN(uint16_t, FEDUnpackingFlag),
60-
SOA_COLUMN(uint32_t, FEDPayload)) //number of words (char)
60+
SOA_COLUMN(uint32_t, FEDPayload), //number of words (char)
61+
// BX,L1A,Orbit number of the SLink
62+
SOA_COLUMN(uint16_t, FEDBX),
63+
SOA_COLUMN(uint64_t, FEDL1A),
64+
SOA_COLUMN(uint32_t, FEDOrbit))
6165

6266
using HGCalFEDPacketInfoSoA = HGCalFEDPacketInfoSoALayout<>;
6367
} // namespace hgcaldigi

DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace hgcal {
3232

3333
namespace BACKEND_FRAME {
3434
constexpr uint32_t CAPTUREBLOCK_RESERVED_MASK = 0x7f, CAPTUREBLOCK_RESERVED_POS = 25, CAPTUREBLOCK_BC_MASK = 0xfff,
35-
CAPTUREBLOCK_BC_POS = 13, CAPTUREBLOCK_EC_MASK = 0x7f, CAPTUREBLOCK_EC_POS = 7,
35+
CAPTUREBLOCK_BC_POS = 13, CAPTUREBLOCK_EC_MASK = 0x3f, CAPTUREBLOCK_EC_POS = 7,
3636
CAPTUREBLOCK_OC_MASK = 0x7, CAPTUREBLOCK_OC_POS = 4, SLINK_BOE_MASK = 0xff, SLINK_BOE_POS = 24,
3737
SLINK_V_MASK = 0xf, SLINK_V_POS = 19, SLINK_R8_MASK = 0xff, SLINK_R8_POS = 11,
3838
SLINK_GLOBAL_EVENTID_MSB_MASK = 0xfff, SLINK_GLOBAL_EVENTID_MSB_POS = 0,

EventFilter/HGCalRawToDigi/interface/HGCalUnpacker.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "DataFormats/HGCalDigi/interface/HGCalRawDataDefinitions.h"
1515
#include "DataFormats/FEDRawData/interface/FEDRawData.h"
1616
#include "DataFormats/HGCalDigi/interface/HGCalDigiHost.h"
17+
#include "DataFormats/HGCalDigi/interface/HGCalFEDPacketInfoHost.h"
1718
#include "DataFormats/HGCalDigi/interface/HGCalECONDPacketInfoHost.h"
1819
#include "CondFormats/HGCalObjects/interface/HGCalMappingModuleIndexer.h"
1920
#include "CondFormats/HGCalObjects/interface/HGCalConfiguration.h"
@@ -37,6 +38,7 @@ class HGCalUnpacker {
3738
const HGCalMappingModuleIndexer& moduleIndexer,
3839
const HGCalConfiguration& config,
3940
hgcaldigi::HGCalDigiHost& digis,
41+
hgcaldigi::HGCalFEDPacketInfoHost& fedPacketInfo,
4042
hgcaldigi::HGCalECONDPacketInfoHost& econdPacketInfo,
4143
bool headerOnlyMode = false);
4244

EventFilter/HGCalRawToDigi/plugins/HGCalRawToDigi.cc

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class HGCalRawToDigi : public edm::stream::EDProducer<> {
3333
const HGCalMappingModuleIndexer& moduleIndexer,
3434
const HGCalConfiguration& config,
3535
hgcaldigi::HGCalDigiHost& digis,
36+
hgcaldigi::HGCalFEDPacketInfoHost& fedPacketInfo,
3637
hgcaldigi::HGCalECONDPacketInfoHost& econdPacketInfo);
3738
static void fillDescriptions(edm::ConfigurationDescriptions&);
3839

@@ -113,7 +114,7 @@ void HGCalRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
113114
if (fed_data.size() == 0)
114115
continue;
115116
fedPacketInfo.view()[fedId].FEDUnpackingFlag() =
116-
callUnpacker(fedId, fed_data, moduleIndexer, config, digis, econdPacketInfo);
117+
callUnpacker(fedId, fed_data, moduleIndexer, config, digis, fedPacketInfo, econdPacketInfo);
117118
}
118119
}
119120
//parallel unpacking calls
@@ -129,7 +130,7 @@ void HGCalRawToDigi::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
129130
if (fed_data.size() == 0)
130131
return;
131132
fedPacketInfo.view()[fedId].FEDUnpackingFlag() =
132-
callUnpacker(fedId, fed_data, moduleIndexer, config, digis, econdPacketInfo);
133+
callUnpacker(fedId, fed_data, moduleIndexer, config, digis, fedPacketInfo, econdPacketInfo);
133134
return;
134135
});
135136
});
@@ -147,9 +148,10 @@ uint16_t HGCalRawToDigi::callUnpacker(unsigned fedId,
147148
const HGCalMappingModuleIndexer& moduleIndexer,
148149
const HGCalConfiguration& config,
149150
hgcaldigi::HGCalDigiHost& digis,
151+
hgcaldigi::HGCalFEDPacketInfoHost& fedPacketInfo,
150152
hgcaldigi::HGCalECONDPacketInfoHost& econdPacketInfo) {
151-
uint16_t status =
152-
unpacker_.parseFEDData(fedId, fed_data, moduleIndexer, config, digis, econdPacketInfo, headersOnly_);
153+
uint16_t status = unpacker_.parseFEDData(
154+
fedId, fed_data, moduleIndexer, config, digis, fedPacketInfo, econdPacketInfo, headersOnly_);
153155
return status;
154156
}
155157

EventFilter/HGCalRawToDigi/src/HGCalUnpacker.cc

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
2424
const HGCalMappingModuleIndexer& moduleIndexer,
2525
const HGCalConfiguration& config,
2626
hgcaldigi::HGCalDigiHost& digis,
27+
hgcaldigi::HGCalFEDPacketInfoHost& fedPacketInfo,
2728
hgcaldigi::HGCalECONDPacketInfoHost& econdPacketInfo,
2829
bool headerOnlyMode) {
2930
// ReadoutSequence object for this FED
@@ -54,7 +55,20 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
5455
LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", nwords (64b) = " << std::distance(header, trailer);
5556
const auto* ptr = header;
5657

58+
// read L1A number from the SLink header
59+
uint64_t SLinkL1Amask = (uint64_t(BACKEND_FRAME::SLINK_GLOBAL_EVENTID_MSB_MASK) << 32) |
60+
uint64_t(BACKEND_FRAME::SLINK_GLOBAL_EVENTID_LSB_MASK);
61+
uint64_t L1ASLink = ((*(header + 1) >> BACKEND_FRAME::SLINK_GLOBAL_EVENTID_LSB_POS) & SLinkL1Amask);
62+
// read BX number and Orbit number from the SLink trailer
63+
uint16_t BXSLink = ((*(trailer - 1) >> BACKEND_FRAME::SLINK_BXID_POS) & BACKEND_FRAME::SLINK_BXID_MASK);
64+
uint32_t OrbitSLink = ((*(trailer - 2) >> (BACKEND_FRAME::SLINK_ORBID_POS + 32)) & BACKEND_FRAME::SLINK_ORBID_MASK);
65+
fedPacketInfo.view()[fedId].FEDL1A() = L1ASLink;
66+
fedPacketInfo.view()[fedId].FEDBX() = BXSLink;
67+
fedPacketInfo.view()[fedId].FEDOrbit() = OrbitSLink;
5768
#ifdef EDM_ML_DEBUG
69+
LogDebug("[HGCalUnpacker]") << "S-Link BX number:" << std::dec << BXSLink << ", L1A number:" << std::dec
70+
<< (int)L1ASLink << ", Orbit ID:" << std::dec << (int)OrbitSLink;
71+
5872
for (unsigned iword = 0; ptr < trailer; ++iword) {
5973
LogDebug("[HGCalUnpacker]") << std::setw(8) << iword << ": 0x" << std::hex << std::setfill('0') << std::setw(16)
6074
<< *ptr << " (" << std::setfill('0') << std::setw(8)
@@ -65,7 +79,6 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
6579
LogDebug("[HGCalUnpacker]") << "@@@\n";
6680
ptr = header;
6781
#endif
68-
6982
// check SLink header (128b)
7083
// sanity check
7184
auto slink_header = *(ptr + 1);
@@ -92,6 +105,7 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
92105
for (uint32_t captureblockIdx = 0; captureblockIdx < HGCalMappingModuleIndexer::maxCBperFED_ && ptr < trailer - 2;
93106
captureblockIdx++) {
94107
// check capture block header (64b)
108+
95109
LogDebug("[HGCalUnpacker]") << "@" << std::setw(8) << std::distance(header, ptr) << ": 0x" << std::hex
96110
<< std::setfill('0') << std::setw(16) << *ptr << std::dec;
97111
auto cb_header = *ptr;
@@ -126,11 +140,21 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
126140
<< " from 0x" << cb_header << ".";
127141
return (0x1 << hgcaldigi::FEDUnpackingFlags::ErrorCaptureBlockHeader);
128142
}
143+
uint16_t BXCaptureBlock =
144+
((cb_header >> (BACKEND_FRAME::CAPTUREBLOCK_BC_POS + 32)) & BACKEND_FRAME::CAPTUREBLOCK_BC_MASK);
145+
uint8_t L1ACaptureBlock =
146+
((cb_header >> (BACKEND_FRAME::CAPTUREBLOCK_EC_POS + 32)) & BACKEND_FRAME::CAPTUREBLOCK_EC_MASK);
147+
uint8_t OrbitCaptureBlock =
148+
((cb_header >> (BACKEND_FRAME::CAPTUREBLOCK_OC_POS + 32)) & BACKEND_FRAME::CAPTUREBLOCK_OC_MASK);
149+
LogDebug("[HGCalUnpacker]") << "CB BX number:" << std::dec << BXCaptureBlock << ", L1A number:" << std::dec
150+
<< (int)L1ACaptureBlock << ", Orbit number:" << std::dec << (int)OrbitCaptureBlock;
129151
++ptr;
130152

131153
// parse Capture Block body (ECON-Ds)
132154
for (uint32_t econdIdx = 0; econdIdx < HGCalMappingModuleIndexer::maxECONDperCB_; econdIdx++) {
133155
auto econd_pkt_status = (cb_header >> (3 * econdIdx)) & 0b111;
156+
LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx
157+
<< ", econdIdx = " << econdIdx << ", econd_pkt_status = " << econd_pkt_status;
134158
if (econd_pkt_status != backend::ECONDPacketStatus::InactiveECOND) {
135159
// always increment the global ECON-D index (unless inactive/unconnected)
136160
globalECONDIdx++;
@@ -157,6 +181,19 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
157181
econdPacketInfo.view()[ECONDdenseIdx].location() = (uint32_t)(ptr - header);
158182
const auto econd_payload_length = ((econd_headers[0] >> ECOND_FRAME::PAYLOAD_POS) & ECOND_FRAME::PAYLOAD_MASK);
159183

184+
// read BX, L1A, and Orbit number from the ECON-D header
185+
uint16_t BXECOND = ((econd_headers[1] >> ECOND_FRAME::BX_POS) & ECOND_FRAME::BX_MASK);
186+
uint8_t L1AECOND = ((econd_headers[1] >> ECOND_FRAME::L1A_POS) & ECOND_FRAME::L1A_MASK);
187+
uint8_t OrbitECOND = ((econd_headers[1] >> ECOND_FRAME::ORBIT_POS) & ECOND_FRAME::ORBIT_MASK);
188+
econdPacketInfo.view()[ECONDdenseIdx].BX() = BXECOND;
189+
econdPacketInfo.view()[ECONDdenseIdx].L1A() = L1AECOND;
190+
econdPacketInfo.view()[ECONDdenseIdx].Orbit() = OrbitECOND;
191+
econdPacketInfo.view()[ECONDdenseIdx].CBBX() = BXCaptureBlock;
192+
econdPacketInfo.view()[ECONDdenseIdx].CBL1A() = L1ACaptureBlock;
193+
econdPacketInfo.view()[ECONDdenseIdx].CBOrbit() = OrbitCaptureBlock;
194+
LogDebug("[HGCalUnpacker]") << "ECON-D BX number:" << std::dec << BXECOND << ", L1A number:" << std::dec
195+
<< (int)L1AECOND << ", Orbit number:" << std::dec << (int)OrbitECOND;
196+
// sanity check
160197
// ECON-D header marker check
161198
if (((econd_headers[0] >> ECOND_FRAME::HEADER_POS) & ECOND_FRAME::HEADER_MASK) !=
162199
fedConfig.econds[globalECONDIdx].headerMarker) {
@@ -213,7 +250,6 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
213250
<< ", E/B/O = 0b"
214251
<< std::bitset<2>((econd_headers[0] >> ECOND_FRAME::EBO_POS) & ECOND_FRAME::EBO_MASK)
215252
<< ", M = " << ((econd_headers[0] >> ECOND_FRAME::BITM_POS) & 0b1);
216-
217253
//quality check for ECON-D (check econd_pkt_status here for error in trailer CRC)
218254
if ((((econd_headers[0] >> ECOND_FRAME::HT_POS) & ECOND_FRAME::HT_MASK) >= 0b10) ||
219255
(((econd_headers[0] >> ECOND_FRAME::EBO_POS) & ECOND_FRAME::EBO_MASK) >= 0b10) ||
@@ -240,7 +276,6 @@ uint16_t HGCalUnpacker::parseFEDData(unsigned fedId,
240276
}
241277
LogDebug("[HGCalUnpacker]") << "fedId = " << fedId << ", captureblockIdx = " << captureblockIdx
242278
<< ", econdIdx = " << econdIdx << ", erxIdx = " << erxIdx;
243-
244279
econdPacketInfo.view()[ECONDdenseIdx].cm()(erxIdx, 0) =
245280
(econd_payload[iword] >> ECOND_FRAME::COMMONMODE0_POS) & ECOND_FRAME::COMMONMODE0_MASK;
246281
econdPacketInfo.view()[ECONDdenseIdx].cm()(erxIdx, 1) =

0 commit comments

Comments
 (0)