35 : inputLabel_(iConfig.getParameter<
edm::
InputTag>(
"inputLabel")),
36 fedId_(iConfig.getUntrackedParameter<
int>(
"rctFedId",
FEDNumbering::MINRCTFEDID)),
37 verbose_(iConfig.getUntrackedParameter<
bool>(
"verbose",
false)) {
41 produces<L1CaloEmCollection>();
42 produces<L1CaloRegionCollection>();
74 if (rctRcd.
size() > 0) {
75 LogError(
"L1T") <<
"Cannot unpack: empty/invalid L1T raw data (size = " << rctRcd.
size() <<
") for ID "
76 <<
fedId_ <<
". Returning empty collections!";
88 LogError(
"L1T") <<
"Cannot unpack: no collection found";
95 const unsigned char*
data =
d.data();
103 LogDebug(
"L1T") <<
"Found SLink header:"
104 <<
" Trigger type " <<
header.triggerType() <<
" L1 event ID " <<
header.lvl1ID() <<
" BX Number "
105 <<
header.bxID() <<
" FED source " <<
header.sourceID() <<
" FED version " <<
header.version();
107 LogWarning(
"L1T") <<
"Did not find a valid SLink header!";
112 if (trailer.
check()) {
113 LogDebug(
"L1T") <<
"Found SLink trailer:"
114 <<
" Length " << trailer.
fragmentLength() <<
" CRC " << trailer.
crc() <<
" Status "
117 LogWarning(
"L1T") <<
"Did not find a SLink trailer!";
124 const unsigned block_id,
129 LogDebug(
"L1T") <<
"Block ID = " << block_id <<
" size = " <<
size;
131 CTP7Format ctp7Format;
132 RctDataDecoder rctDataDecoder;
133 uint32_t nBXTemp = 0;
134 uint32_t ctp7FWVersion;
135 uint32_t L1ID, L1aBCID;
136 std::vector<RCTInfo> allCrateRCTInfo[5];
139 L1aBCID =
data[5 + of] & 0x00000FFF;
140 nBXTemp = (
data[5 + of] & 0x00FF0000) >> 16;
141 ctp7FWVersion =
data[4 + of];
143 if (nBXTemp != 1 && nBXTemp != 3 && nBXTemp != 5)
146 const uint32_t nBX = nBXTemp;
148 LogDebug(
"L1T") <<
"CTP7 L1ID = " << L1ID <<
" L1A BCID = " << L1aBCID <<
" BXs in capture = " << nBX
149 <<
" CTP7 DAQ FW = " << ctp7FWVersion;
153 unsigned int crateID;
154 unsigned int ctp7LinkNumber;
155 std::vector<unsigned int>
uint;
159 link_data allLinks[5][36];
160 const uint32_t NLinks = ctp7Format.NLINKS;
164 uint32_t iDAQBuffer = 0;
167 for (
unsigned int iLink = 0; iLink < NLinks; iLink++) {
168 iDAQBuffer = of + ctp7Format.EVENT_HEADER_WORDS +
169 iLink * (ctp7Format.CHANNEL_HEADER_WORDS + nBX * ctp7Format.CHANNEL_DATA_WORDS_PER_BX);
172 uint32_t linkID =
data[iDAQBuffer++];
173 uint32_t
tmp =
data[iDAQBuffer++];
174 uint32_t CRCErrCnt =
tmp & 0x0000FFFF;
177 uint32_t crateID = 0;
178 uint32_t expectedCrateID = 0;
180 bool expectedEven =
false;
183 rctDataDecoder.getExpectedLinkID(iLink, expectedCrateID, expectedEven);
185 rctDataDecoder.decodeLinkID(linkID, crateID, even);
188 if (expectedCrateID != crateID || even != expectedEven) {
189 LogError(
"L1T") <<
"Expected Crate ID " << expectedCrateID <<
" expectedEven " << expectedEven
190 <<
"does not match actual Crate ID " << crateID <<
" even " << even;
194 LogError(
"L1T") <<
"WARNING CRC ErrorFound linkID " << linkID <<
" expected crateID " << expectedCrateID;
197 for (uint32_t iBX = 0; iBX < nBX; iBX++) {
198 allLinks[iBX][iLink].uint.reserve(6);
199 allLinks[iBX][iLink].ctp7LinkNumber = iLink;
200 allLinks[iBX][iLink].crateID = expectedCrateID;
201 allLinks[iBX][iLink].even = expectedEven;
204 for (
unsigned int iWord = 0; iWord < 6; iWord++) {
205 allLinks[iBX][iLink].uint.push_back(
data[iDAQBuffer + iWord + iBX * 6]);
211 uint32_t nCratesFound = 0;
212 for (
unsigned int iCrate = 0; iCrate < 18; iCrate++) {
213 bool foundEven =
false, foundOdd =
false;
217 for (
unsigned int iLink = 0; iLink < NLinks; iLink++) {
218 if ((allLinks[0][iLink].crateID == iCrate) && (allLinks[0][iLink].even ==
true)) {
220 for (
unsigned int iBX = 0; iBX < nBX; iBX++)
221 even[iBX] = allLinks[iBX][iLink];
222 }
else if ((allLinks[0][iLink].crateID == iCrate) && (allLinks[0][iLink].even ==
false)) {
224 for (
unsigned int iBX = 0; iBX < nBX; iBX++)
225 odd[iBX] = allLinks[iBX][iLink];
229 if (foundEven && foundOdd) {
233 for (
unsigned int iBX = 0; iBX < nBX; iBX++) {
235 std::vector<RCTInfo> rctInfoData;
236 rctDataDecoder.decodeLinks(even[iBX].
uint, odd[iBX].
uint, rctInfoData);
237 rctDataDecoder.setRCTInfoCrateID(rctInfoData, iCrate);
238 allCrateRCTInfo[iBX].push_back(rctInfoData.at(0));
245 if (nCratesFound != 18)
246 LogError(
"L1T") <<
"Warning -- only found " << nCratesFound <<
" valid crates";
259 for (uint32_t iBX = 0; iBX < nBX; iBX++, startBX++) {
260 for (
unsigned int iCrate = 0; iCrate < nCratesFound; iCrate++) {
261 RCTInfo rctInfo = allCrateRCTInfo[iBX].at(iCrate);
263 for (
int j = 0;
j < 4;
j++) {
266 colls->
rctEm()->push_back(em);
269 for (
int j = 0;
j < 4;
j++) {
272 colls->
rctEm()->push_back(em);
275 for (
int j = 0;
j < 7;
j++) {
276 for (
int k = 0;
k < 2;
k++) {
277 bool o = (((rctInfo.oBits >> (
j * 2 +
k)) & 0x1) == 0
x1);
278 bool t = (((rctInfo.tBits >> (
j * 2 +
k)) & 0x1) == 0
x1);
279 bool m = (((rctInfo.mBits >> (
j * 2 +
k)) & 0x1) == 0
x1);
280 bool q = (((rctInfo.qBits >> (
j * 2 +
k)) & 0x1) == 0
x1);
283 colls->
rctCalo()->push_back(rgn);
287 for (
int k = 0;
k < 4;
k++) {
288 for (
int j = 0;
j < 2;
j++) {
290 uint32_t
offset =
j * 2 +
k % 2 + (
k / 2) * 4;
291 bool fg = (((rctInfo.hfQBits >>
offset) & 0
x1) == 0x1);
294 colls->
rctCalo()->push_back(rgn);
302 for (
unsigned i = 0;
i <
size;
i++) {
313 std::ostringstream os;