CMS 3D CMS Logo

L1TRawToDigi.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EventFilter/L1TRawToDigi
4 // Class: L1TRawToDigi
5 //
13 //
14 // Original Author: Matthias Wolf
15 // Created: Mon, 10 Feb 2014 14:29:40 GMT
16 //
17 //
18 
19 // system include files
20 #include <iostream>
21 #include <iomanip>
22 #include <memory>
23 
24 // user include files
31 
36 
39 
40 #include "PackingSetupFactory.h"
41 
43 
44 namespace l1t {
46  public:
47  explicit L1TRawToDigi(const edm::ParameterSet&);
48  ~L1TRawToDigi() override;
49 
50  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
51 
52  private:
53  void produce(edm::Event&, const edm::EventSetup&) override;
54 
55  // ----------member data ---------------------------
57  std::vector<int> fedIds_;
58  unsigned int minFeds_;
59  unsigned int fwId_;
60  unsigned int dmxFwId_;
62 
63  std::unique_ptr<PackingSetup> prov_;
64 
65  // header and trailer sizes in chars
72 
73  bool tmtCheck_;
74 
75  bool ctp7_mode_;
76  bool mtf7_mode_;
77  bool debug_;
78  int warnsa_;
79  int warnsb_;
80  };
81 } // namespace l1t
82 
83 std::ostream& operator<<(std::ostream& o, const l1t::BlockHeader& h) {
84  o << "L1T Block Header " << h.getID() << " with size " << h.getSize();
85  return o;
86 };
87 
88 namespace l1t {
90  : fedIds_(config.getParameter<std::vector<int>>("FedIds")),
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")) {
98  fedData_ = consumes<FEDRawDataCollection>(config.getParameter<edm::InputTag>("InputLabel"));
99 
100  if (ctp7_mode_ and mtf7_mode_) {
101  throw cms::Exception("L1TRawToDigi") << "Can only use one unpacking mode concurrently!";
102  }
103 
104  prov_ = PackingSetupFactory::get()->make(config.getParameter<std::string>("Setup"));
105  prov_->registerProducts(producesCollector());
106 
107  slinkHeaderSize_ = config.getUntrackedParameter<int>("lenSlinkHeader");
108  slinkTrailerSize_ = config.getUntrackedParameter<int>("lenSlinkTrailer");
109  amcHeaderSize_ = config.getUntrackedParameter<int>("lenAMCHeader");
110  amcTrailerSize_ = config.getUntrackedParameter<int>("lenAMCTrailer");
111  amc13HeaderSize_ = config.getUntrackedParameter<int>("lenAMC13Header");
112  amc13TrailerSize_ = config.getUntrackedParameter<int>("lenAMC13Trailer");
113 
114  debug_ = config.getUntrackedParameter<bool>("debug");
115  warnsa_ = 0;
116  warnsb_ = 0;
117  }
118 
120 
121  //
122  // member functions
123  //
124 
125  // ------------ method called to produce the data ------------
127  using namespace edm;
128 
129  std::unique_ptr<UnpackerCollections> coll = prov_->getCollections(event);
130 
132  event.getByToken(fedData_, feds);
133 
134  if (!feds.isValid()) {
135  LogError("L1T") << "Cannot unpack: no FEDRawDataCollection found";
136  return;
137  }
138 
139  unsigned valid_count = 0;
140  for (const auto& fedId : fedIds_) {
141  const FEDRawData& l1tRcd = feds->FEDData(fedId);
142 
143  LogDebug("L1T") << "Found FEDRawDataCollection with ID " << fedId << " and size " << l1tRcd.size();
144 
147  if (l1tRcd.size() > 0) {
148  LogError("L1T") << "Cannot unpack: invalid L1T raw data (size = " << l1tRcd.size() << ") for ID " << fedId
149  << ". Returning empty collections!";
150  } else if (warnsa_ < 5) {
151  warnsa_++;
152  LogInfo("L1T") << "During unpacking, encountered empty L1T raw data (size = " << l1tRcd.size()
153  << ") for FED ID " << fedId << ".";
154  }
155  continue;
156  } else {
157  valid_count++;
158  }
159 
160  const unsigned char* data = l1tRcd.data();
162 
163  if (header.check()) {
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 "
167  << header.version();
168  } else {
169  LogWarning("L1T") << "Did not find a SLink header!";
170  }
171 
172  FEDTrailer trailer(data + (l1tRcd.size() - slinkTrailerSize_));
173 
174  if (trailer.check()) {
175  LogDebug("L1T") << "Found SLink trailer:"
176  << " Length " << trailer.fragmentLength() << " CRC " << trailer.crc() << " Status "
177  << trailer.evtStatus() << " Throttling bits " << trailer.ttsBits();
178  } else {
179  LogWarning("L1T") << "Did not find a SLink trailer!";
180  }
181 
182  // FIXME Hard-coded firmware version for first 74x MC campaigns.
183  // Will account for differences in the AMC payload, MP7 payload,
184  // and unpacker setup.
185  bool legacy_mc = fwOverride_ && ((fwId_ >> 24) == 0xff);
186 
187  amc13::Packet packet;
188  if (!packet.parse((const uint64_t*)data,
189  (const uint64_t*)(data + slinkHeaderSize_),
190  (l1tRcd.size() - slinkHeaderSize_ - slinkTrailerSize_) / 8,
191  header.lvl1ID(),
192  header.bxID(),
193  legacy_mc,
194  mtf7_mode_)) {
195  LogError("L1T") << "Could not extract AMC13 Packet.";
196  return;
197  }
198 
199  for (auto& amc : packet.payload()) {
200  if (amc.size() == 0)
201  continue;
202 
203  auto payload64 = amc.data();
204  const uint32_t* start = (const uint32_t*)payload64.get();
205  // Want to have payload size in 32 bit words, but AMC measures
206  // it in 64 bit words → factor 2.
207  const uint32_t* end = start + (amc.size() * 2);
208 
209  std::unique_ptr<Payload> payload;
210  if (ctp7_mode_) {
211  LogDebug("L1T") << "Using CTP7 mode";
212  // CTP7 uses userData in AMC header
213  payload = std::make_unique<CTP7Payload>(start, end, amc.header());
214  } else if (mtf7_mode_) {
215  LogDebug("L1T") << "Using MTF7 mode";
216  payload = std::make_unique<MTF7Payload>(start, end);
217  } else {
218  LogDebug("L1T") << "Using MP7 mode";
219  payload = std::make_unique<MP7Payload>(start, end, legacy_mc);
220  }
221  unsigned fw = payload->getAlgorithmFWVersion();
222  unsigned board = amc.blockHeader().getBoardID();
223  unsigned amc_no = amc.blockHeader().getAMCNumber();
224 
225  // Let parameterset value override FW version
226  if (fwOverride_) {
227  if (fedId == 1360)
228  fw = fwId_;
229  else if (fedId == 1366)
230  fw = dmxFwId_;
231  }
232 
233  auto unpackers = prov_->getUnpackers(fedId, board, amc_no, fw);
234 
235  // getBlock() returns a non-null unique_ptr on success
236  std::unique_ptr<Block> block;
237  while ((block = payload->getBlock()).get()) {
238  // only unpack the Calo Layer 2 MP TMT node if it has processed this BX
239  unsigned tmtId = board - l1t::stage2::layer2::mp::offsetBoardId + 1;
240  unsigned bxId = header.bxID();
241  unsigned unpackTMT = (!tmtCheck_ || ((tmtId - 1) == ((bxId - 1 + 3) % 9)));
242  unsigned isCaloL2TMT =
244 
245  if (!isCaloL2TMT || unpackTMT) {
246  if (debug_) {
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()
251  << ")" << std::dec << std::endl;
252  for (const auto& word : block->payload()) {
253  if (debug_)
254  std::cout << "data: " << std::hex << std::setw(8) << std::setfill('0') << word << std::dec
255  << std::endl;
256  }
257  }
258 
259  auto unpacker = unpackers.find(block->header().getID());
260 
261  block->amc(amc.header());
262 
263  if (unpacker == unpackers.end()) {
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;
268  // TODO Handle error
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 << "!";
272  // TODO Handle error
273  }
274  }
275  }
276  }
277  }
278  if (valid_count < minFeds_) {
279  if (warnsb_ < 5) {
280  warnsb_++;
281  LogWarning("L1T") << "Unpacked " << valid_count << " non-empty FED IDs but minimum is set to " << minFeds_
282  << "\n";
283  }
284  }
285  }
286 
287  namespace {
288  edm::ParameterSetDescription makeDesc(std::vector<int> const& fedIDs,
289  unsigned int fwid,
290  std::string const& setup,
291  edm::InputTag const& label) {
293  // These parameters are part of the L1T/HLT interface, avoid changing if possible:
294  desc.add<std::vector<int>>("FedIds", fedIDs)->setComment("required parameter: default value is invalid");
295  desc.add<std::string>("Setup", setup)->setComment("required parameter: default value is invalid");
296  // These parameters have well defined default values and are not currently
297  // part of the L1T/HLT interface. They can be cleaned up or updated at will:
298  desc.add<unsigned int>("FWId", fwid)
299  ->setComment(
300  "Ignored unless FWOverride is true. Calo Stage1: 32 bits: if the first eight bits are 0xff, will read "
301  "the "
302  "74x MC format.\n");
303  desc.add<unsigned int>("DmxFWId", 0)
304  ->setComment(
305  "Ignored unless FWOverride is true. Calo Stage1: 32 bits: if the first eight bits are 0xff, will read "
306  "the 74x MC format.\n");
307  desc.add<bool>("FWOverride", false)->setComment("Firmware version should be taken as FWId parameters");
308  desc.add<bool>("TMTCheck", true)->setComment("Flag for turning on/off Calo Layer 2 TMT node check");
309  desc.addUntracked<bool>("CTP7", false);
310  desc.addUntracked<bool>("MTF7", false);
311  desc.add<edm::InputTag>("InputLabel", label);
312  desc.addUntracked<int>("lenSlinkHeader", 8);
313  desc.addUntracked<int>("lenSlinkTrailer", 8);
314  desc.addUntracked<int>("lenAMCHeader", 8);
315  desc.addUntracked<int>("lenAMCTrailer", 0);
316  desc.addUntracked<int>("lenAMC13Header", 8);
317  desc.addUntracked<int>("lenAMC13Trailer", 8);
318  desc.addUntracked<bool>("debug", false)->setComment("turn on verbose output");
319  desc.add<unsigned int>("MinFeds", 0)
320  ->setComment("optional parameter: warn if less than MinFeds non-empty FED ids unpacked.");
321  return desc;
322  }
323  } // namespace
324 
325  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
327  descriptions.addDefault(makeDesc({}, 0, "", edm::InputTag("rawDataCollector")));
328  descriptions.add("l1tRawToDigi", makeDesc({1352}, 1, "stage2::CaloSetup", edm::InputTag("l1tDigiToRaw")));
329  }
330 } // namespace l1t
331 
332 using namespace l1t;
333 //define this as a plug-in
void produce(edm::Event &, const edm::EventSetup &) override
Definition: start.py:1
~L1TRawToDigi() override
uint8_t ttsBits() const
Current value of the Trigger Throttling System bits.
Definition: FEDTrailer.cc:19
unsigned int dmxFwId_
Definition: L1TRawToDigi.cc:60
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:48
delete x;
Definition: CaloConfig.h:22
Definition: config.py:1
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.
Definition: FEDTrailer.cc:13
char const * label
L1TRawToDigi(const edm::ParameterSet &)
Definition: L1TRawToDigi.cc:89
uint64_t word
void addDefault(ParameterSetDescription const &psetDescription)
std::vector< int > fedIds_
Definition: L1TRawToDigi.cc:57
uint16_t crc() const
Cyclic Redundancy Code of the event fragment including header and trailer.
Definition: FEDTrailer.cc:15
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
uint8_t evtStatus() const
Event fragment status information.
Definition: FEDTrailer.cc:17
std::ostream & operator<<(std::ostream &o, const l1t::BlockHeader &h)
Definition: L1TRawToDigi.cc:83
Log< level::Info, false > LogInfo
unsigned long long uint64_t
Definition: Time.h:13
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)
Definition: AMC13Spec.cc:60
unsigned int fwId_
Definition: L1TRawToDigi.cc:59
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const PackingSetupFactory * get()
unsigned int minFeds_
Definition: L1TRawToDigi.cc:58
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:80
std::unique_ptr< PackingSetup > prov_
Definition: L1TRawToDigi.cc:63
std::vector< amc::Packet > payload() const
Definition: AMC13Spec.h:92
edm::EDGetTokenT< FEDRawDataCollection > fedData_
Definition: L1TRawToDigi.cc:56
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
Log< level::Warning, false > LogWarning
Definition: AMCSpec.h:8
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
bool check() const
Check that the trailer is OK.
Definition: FEDTrailer.cc:45
Definition: event.py:1
#define LogDebug(id)