63 std::unique_ptr<PackingSetup>
prov_;
84 o <<
"L1T Block Header " <<
h.getID() <<
" with size " <<
h.getSize();
91 minFeds_(
config.getParameter<unsigned
int>(
"MinFeds")),
92 fwId_(
config.getParameter<unsigned
int>(
"FWId")),
93 dmxFwId_(
config.getParameter<unsigned
int>(
"DmxFWId")),
94 fwOverride_(
config.getParameter<
bool>(
"FWOverride")),
95 tmtCheck_(
config.getParameter<
bool>(
"TMTCheck")),
96 ctp7_mode_(
config.getUntrackedParameter<
bool>(
"CTP7")),
97 mtf7_mode_(
config.getUntrackedParameter<
bool>(
"MTF7")) {
101 throw cms::Exception(
"L1TRawToDigi") <<
"Can only use one unpacking mode concurrently!";
105 prov_->registerProducts(producesCollector());
129 std::unique_ptr<UnpackerCollections> coll =
prov_->getCollections(
event);
134 if (!
feds.isValid()) {
135 LogError(
"L1T") <<
"Cannot unpack: no FEDRawDataCollection found";
139 unsigned valid_count = 0;
143 LogDebug(
"L1T") <<
"Found FEDRawDataCollection with ID " <<
fedId <<
" and size " << l1tRcd.
size();
147 if (l1tRcd.
size() > 0) {
148 LogError(
"L1T") <<
"Cannot unpack: invalid L1T raw data (size = " << l1tRcd.
size() <<
") for ID " <<
fedId 149 <<
". Returning empty collections!";
152 LogInfo(
"L1T") <<
"During unpacking, encountered empty L1T raw data (size = " << l1tRcd.
size()
153 <<
") for FED ID " <<
fedId <<
".";
160 const unsigned char*
data = l1tRcd.
data();
164 LogDebug(
"L1T") <<
"Found SLink header:" 165 <<
" Trigger type " <<
header.triggerType() <<
" L1 event ID " <<
header.lvl1ID()
166 <<
" BX Number " <<
header.bxID() <<
" FED source " <<
header.sourceID() <<
" FED version " 169 LogWarning(
"L1T") <<
"Did not find a SLink header!";
174 if (trailer.
check()) {
175 LogDebug(
"L1T") <<
"Found SLink trailer:" 176 <<
" Length " << trailer.
fragmentLength() <<
" CRC " << trailer.
crc() <<
" Status " 179 LogWarning(
"L1T") <<
"Did not find a SLink trailer!";
195 LogError(
"L1T") <<
"Could not extract AMC13 Packet.";
203 auto payload64 =
amc.data();
204 const uint32_t*
start = (
const uint32_t*)payload64.get();
207 const uint32_t* end =
start + (
amc.size() * 2);
209 std::unique_ptr<Payload>
payload;
211 LogDebug(
"L1T") <<
"Using CTP7 mode";
215 LogDebug(
"L1T") <<
"Using MTF7 mode";
218 LogDebug(
"L1T") <<
"Using MP7 mode";
219 payload = std::make_unique<MP7Payload>(
start, end, legacy_mc);
221 unsigned fw =
payload->getAlgorithmFWVersion();
222 unsigned board =
amc.blockHeader().getBoardID();
223 unsigned amc_no =
amc.blockHeader().getAMCNumber();
229 else if (
fedId == 1366)
236 std::unique_ptr<Block>
block;
240 unsigned bxId =
header.bxID();
241 unsigned unpackTMT = (!
tmtCheck_ || ((tmtId - 1) == ((bxId - 1 + 3) % 9)));
242 unsigned isCaloL2TMT =
245 if (!isCaloL2TMT || unpackTMT) {
247 std::cout <<
">>> block to unpack <<<" << std::endl
248 <<
"hdr: " << std::hex << std::setw(8) << std::setfill(
'0') <<
block->header().raw()
249 <<
std::dec <<
" (ID " <<
block->header().getID() <<
", size " <<
block->header().getSize()
250 <<
", CapID 0x" << std::hex << std::setw(2) << std::setfill(
'0') <<
block->header().getCapID()
252 for (
const auto&
word :
block->payload()) {
264 LogDebug(
"L1T") <<
"Cannot find an unpacker for" 265 <<
"\n\tblock: ID " <<
block->header().getID() <<
", size " <<
block->header().getSize()
266 <<
"\n\tAMC: # " << amc_no <<
", board ID 0x" << std::hex << board <<
std::dec 267 <<
"\n\tFED ID " <<
fedId <<
", and FW ID " <<
fw;
269 }
else if (!unpacker->second->unpack(*
block, coll.get())) {
270 LogDebug(
"L1T") <<
"Error unpacking data for block ID " <<
block->header().getID() <<
", AMC # " << amc_no
271 <<
", board ID " << board <<
", FED ID " <<
fedId <<
", and FW ID " <<
fw <<
"!";
281 LogWarning(
"L1T") <<
"Unpacked " << valid_count <<
" non-empty FED IDs but minimum is set to " <<
minFeds_ 291 desc.add<std::vector<int>>(
"FedIds", {})->setComment(
"required parameter: default value is invalid");
292 desc.add<
std::string>(
"Setup",
"")->setComment(
"required parameter: default value is invalid");
295 desc.add<
unsigned int>(
"FWId", 0)->setComment(
296 "Ignored unless FWOverride is true. Calo Stage1: 32 bits: if the first eight bits are 0xff, will read the " 298 desc.add<
unsigned int>(
"DmxFWId", 0)
300 "Ignored unless FWOverride is true. Calo Stage1: 32 bits: if the first eight bits are 0xff, will read " 301 "the 74x MC format.\n");
302 desc.add<
bool>(
"FWOverride",
false)->setComment(
"Firmware version should be taken as FWId parameters");
303 desc.add<
bool>(
"TMTCheck",
true)->setComment(
"Flag for turning on/off Calo Layer 2 TMT node check");
304 desc.addUntracked<
bool>(
"CTP7",
false);
305 desc.addUntracked<
bool>(
"MTF7",
false);
307 desc.addUntracked<
int>(
"lenSlinkHeader", 8);
308 desc.addUntracked<
int>(
"lenSlinkTrailer", 8);
309 desc.addUntracked<
int>(
"lenAMCHeader", 8);
310 desc.addUntracked<
int>(
"lenAMCTrailer", 0);
311 desc.addUntracked<
int>(
"lenAMC13Header", 8);
312 desc.addUntracked<
int>(
"lenAMC13Trailer", 8);
313 desc.addUntracked<
bool>(
"debug",
false)->setComment(
"turn on verbose output");
314 desc.add<
unsigned int>(
"MinFeds", 0)
315 ->setComment(
"optional parameter: warn if less than MinFeds non-empty FED ids unpacked.");
316 descriptions.
add(
"l1tRawToDigi",
desc);
void produce(edm::Event &, const edm::EventSetup &) override
uint8_t ttsBits() const
Current value of the Trigger Throttling System bits.
size_t size() const
Lenght of the data buffer in bytes.
std::unique_ptr< PackingSetup > make(const std::string &) const
Log< level::Error, false > LogError
uint32_t fragmentLength() const
The length of the event fragment counted in 64-bit words including header and trailer.
L1TRawToDigi(const edm::ParameterSet &)
const unsigned int offsetBoardId
std::vector< int > fedIds_
uint16_t crc() const
Cyclic Redundancy Code of the event fragment including header and trailer.
#define DEFINE_FWK_MODULE(type)
uint8_t evtStatus() const
Event fragment status information.
std::ostream & operator<<(std::ostream &o, const l1t::BlockHeader &h)
const unsigned int amcSlotNum
Log< level::Info, false > LogInfo
unsigned long long uint64_t
bool parse(const uint64_t *start, const uint64_t *data, unsigned int size, unsigned int lv1, unsigned int bx, bool legacy_mc=false, bool mtf7_mode=false)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const PackingSetupFactory * get()
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
char data[epos_bytes_allocation]
std::unique_ptr< PackingSetup > prov_
std::vector< amc::Packet > payload() const
edm::EDGetTokenT< FEDRawDataCollection > fedData_
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Log< level::Warning, false > LogWarning
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
bool check() const
Check that the trailer is OK.