CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
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 
40 
41 namespace l1t {
43  public:
44  explicit L1TRawToDigi(const edm::ParameterSet&);
45  ~L1TRawToDigi();
46 
47  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
48 
49  private:
50  virtual void produce(edm::Event&, const edm::EventSetup&) override;
51 
52  virtual void beginRun(edm::Run const&, edm::EventSetup const&) override {};
53  virtual void endRun(edm::Run const&, edm::EventSetup const&) override {};
54  virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override {};
55  virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override {};
56 
57  // ----------member data ---------------------------
59  std::vector<int> fedIds_;
60  unsigned int minFeds_;
61  unsigned int fwId_;
63 
64  std::auto_ptr<PackingSetup> prov_;
65 
66  // header and trailer sizes in chars
73 
74  bool ctp7_mode_;
75  bool mtf7_mode_;
76  bool debug_;
77  int warnsa_;
78  int warnsb_;
79  };
80 }
81 
82 std::ostream & operator<<(std::ostream& o, const l1t::BlockHeader& h) {
83  o << "L1T Block Header " << h.getID() << " with size " << h.getSize();
84  return o;
85 };
86 
87 namespace l1t {
89  fedIds_(config.getParameter<std::vector<int>>("FedIds")),
90  minFeds_(config.getParameter<unsigned int>("MinFeds")),
91  fwId_(config.getParameter<unsigned int>("FWId")),
92  fwOverride_(config.getParameter<bool>("FWOverride")),
93  ctp7_mode_(config.getUntrackedParameter<bool>("CTP7")),
94  mtf7_mode_(config.getUntrackedParameter<bool>("MTF7"))
95  {
96  fedData_ = consumes<FEDRawDataCollection>(config.getParameter<edm::InputTag>("InputLabel"));
97 
98  if (ctp7_mode_ and mtf7_mode_) {
99  throw cms::Exception("L1TRawToDigi") << "Can only use one unpacking mode concurrently!";
100  }
101 
103  prov_->registerProducts(*this);
104 
105  slinkHeaderSize_ = config.getUntrackedParameter<int>("lenSlinkHeader");
106  slinkTrailerSize_ = config.getUntrackedParameter<int>("lenSlinkTrailer");
107  amcHeaderSize_ = config.getUntrackedParameter<int>("lenAMCHeader");
108  amcTrailerSize_ = config.getUntrackedParameter<int>("lenAMCTrailer");
109  amc13HeaderSize_ = config.getUntrackedParameter<int>("lenAMC13Header");
110  amc13TrailerSize_ = config.getUntrackedParameter<int>("lenAMC13Trailer");
111 
112  debug_ = config.getUntrackedParameter<bool>("debug");
113  warnsa_ = 0;
114  warnsb_ = 0;
115  }
116 
117 
119  {
120  }
121 
122 
123  //
124  // member functions
125  //
126 
127  // ------------ method called to produce the data ------------
128  void
130  {
131  using namespace edm;
132 
133  std::unique_ptr<UnpackerCollections> coll = prov_->getCollections(event);
134 
136  event.getByToken(fedData_, feds);
137 
138  if (!feds.isValid()) {
139  LogError("L1T") << "Cannot unpack: no FEDRawDataCollection found";
140  return;
141  }
142 
143  unsigned valid_count = 0;
144  for (const auto& fedId: fedIds_) {
145  const FEDRawData& l1tRcd = feds->FEDData(fedId);
146 
147  LogDebug("L1T") << "Found FEDRawDataCollection with ID " << fedId << " and size " << l1tRcd.size();
148 
150  if (l1tRcd.size() > 0) {
151  LogError("L1T") << "Cannot unpack: invalid L1T raw data (size = "
152  << l1tRcd.size() << ") for ID " << fedId << ". Returning empty collections!";
153  } else if (warnsa_ < 5){
154  warnsa_++;
155  LogInfo("L1T") << "During unpacking, encountered empty L1T raw data (size = "
156  << l1tRcd.size() << ") for FED ID " << fedId << ".";
157  }
158  continue;
159  } else {
160  valid_count++;
161  }
162 
163  const unsigned char *data = l1tRcd.data();
164  FEDHeader header(data);
165 
166  if (header.check()) {
167  LogDebug("L1T") << "Found SLink header:"
168  << " Trigger type " << header.triggerType()
169  << " L1 event ID " << header.lvl1ID()
170  << " BX Number " << header.bxID()
171  << " FED source " << header.sourceID()
172  << " FED version " << header.version();
173  } else {
174  LogWarning("L1T") << "Did not find a SLink header!";
175  }
176 
177  FEDTrailer trailer(data + (l1tRcd.size() - slinkTrailerSize_));
178 
179  if (trailer.check()) {
180  LogDebug("L1T") << "Found SLink trailer:"
181  << " Length " << trailer.lenght()
182  << " CRC " << trailer.crc()
183  << " Status " << trailer.evtStatus()
184  << " Throttling bits " << trailer.ttsBits();
185  } else {
186  LogWarning("L1T") << "Did not find a SLink trailer!";
187  }
188 
189  // FIXME Hard-coded firmware version for first 74x MC campaigns.
190  // Will account for differences in the AMC payload, MP7 payload,
191  // and unpacker setup.
192  bool legacy_mc = fwOverride_ && ((fwId_ >> 24) == 0xff);
193 
194  amc13::Packet packet;
195  if (!packet.parse(
196  (const uint64_t*) data,
197  (const uint64_t*) (data + slinkHeaderSize_),
198  (l1tRcd.size() - slinkHeaderSize_ - slinkTrailerSize_) / 8,
199  header.lvl1ID(),
200  header.bxID(),
201  legacy_mc,
202  mtf7_mode_)) {
203  LogError("L1T")
204  << "Could not extract AMC13 Packet.";
205  return;
206  }
207 
208  for (auto& amc: packet.payload()) {
209  if (amc.size() == 0)
210  continue;
211 
212  auto payload64 = amc.data();
213  const uint32_t * start = (const uint32_t*) payload64.get();
214  // Want to have payload size in 32 bit words, but AMC measures
215  // it in 64 bit words → factor 2.
216  const uint32_t * end = start + (amc.size() * 2);
217 
218  std::auto_ptr<Payload> payload;
219  if (ctp7_mode_) {
220  LogDebug("L1T") << "Using CTP7 mode";
221  payload.reset(new CTP7Payload(start, end));
222  } else if (mtf7_mode_) {
223  LogDebug("L1T") << "Using MTF7 mode";
224  payload.reset(new MTF7Payload(start, end));
225  } else {
226  LogDebug("L1T") << "Using MP7 mode";
227  payload.reset(new MP7Payload(start, end, legacy_mc));
228  }
229  unsigned fw = payload->getAlgorithmFWVersion();
230 
231  // Let parameterset value override FW version
232  if (fwOverride_)
233  fw = fwId_;
234 
235  unsigned board = amc.blockHeader().getBoardID();
236  unsigned amc_no = amc.blockHeader().getAMCNumber();
237 
238  auto unpackers = prov_->getUnpackers(fedId, board, amc_no, fw);
239 
240  // getBlock() returns a non-null auto_ptr on success
241  std::auto_ptr<Block> block;
242  while ((block = payload->getBlock()).get()) {
243  if (debug_) {
244  std::cout << ">>> block to unpack <<<" << std::endl
245  << "hdr: " << std::hex << std::setw(8) << std::setfill('0') << block->header().raw() << std::dec
246  << " (ID " << block->header().getID() << ", size " << block->header().getSize()
247  << ", CapID 0x" << std::hex << std::setw(2) << std::setfill('0') << block->header().getCapID()
248  << ")" << std::dec << std::endl;
249  for (const auto& word: block->payload()) {
250  if (debug_)
251  std::cout << "data: " << std::hex << std::setw(8) << std::setfill('0') << word << std::dec << std::endl;
252  }
253  }
254 
255  auto unpacker = unpackers.find(block->header().getID());
256 
257  block->amc(amc.header());
258 
259  if (unpacker == unpackers.end()) {
260  LogDebug("L1T") << "Cannot find an unpacker for"
261  << "\n\tblock: ID " << block->header().getID() << ", size " << block->header().getSize()
262  << "\n\tAMC: # " << amc_no << ", board ID 0x" << std::hex << board << std::dec
263  << "\n\tFED ID " << fedId << ", and FW ID " << fw;
264  // TODO Handle error
265  } else if (!unpacker->second->unpack(*block, coll.get())) {
266  LogDebug("L1T") << "Error unpacking data for block ID "
267  << block->header().getID() << ", AMC # " << amc_no
268  << ", board ID " << board << ", FED ID " << fedId
269  << ", and FW ID " << fw << "!";
270  // TODO Handle error
271  }
272  }
273  }
274  }
275  if (valid_count < minFeds_){
276  if (warnsb_ < 5){
277  warnsb_++;
278  LogWarning("L1T") << "Unpacked " << valid_count << " non-empty FED IDs but minimum is set to " << minFeds_ << "\n";
279  }
280  }
281  }
282 
283  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
284  void
287  // These parameters are part of the L1T/HLT interface, avoid changing if possible:
288  desc.add<std::vector<int>>("FedIds", {})->setComment("required parameter: default value is invalid");
289  desc.add<std::string>("Setup", "")->setComment("required parameter: default value is invalid");
290  // These parameters have well defined default values and are not currently
291  // part of the L1T/HLT interface. They can be cleaned up or updated at will:
292  desc.add<unsigned int>("FWId",0)->setComment("Ignored unless FWOverride is true. Calo Stage1: 32 bits: if the first eight bits are 0xff, will read the 74x MC format.\n");
293  desc.add<bool>("FWOverride", false)->setComment("Firmware version should be taken as FWId parameters");
294  desc.addUntracked<bool>("CTP7", false);
295  desc.addUntracked<bool>("MTF7", false);
296  desc.add<edm::InputTag>("InputLabel",edm::InputTag("rawDataCollector"));
297  desc.addUntracked<int>("lenSlinkHeader", 8);
298  desc.addUntracked<int>("lenSlinkTrailer", 8);
299  desc.addUntracked<int>("lenAMCHeader", 8);
300  desc.addUntracked<int>("lenAMCTrailer", 0);
301  desc.addUntracked<int>("lenAMC13Header", 8);
302  desc.addUntracked<int>("lenAMC13Trailer", 8);
303  desc.addUntracked<bool>("debug", false)->setComment("turn on verbose output");
304  desc.add<unsigned int>("MinFeds", 0)->setComment("optional parameter: warn if less than MinFeds non-empty FED ids unpacked.");
305  descriptions.add("l1tRawToDigi", desc);
306  }
307 }
308 
309 using namespace l1t;
310 //define this as a plug-in
#define LogDebug(id)
virtual void produce(edm::Event &, const edm::EventSetup &) override
std::vector< amc::Packet > payload() const
Definition: AMC13Spec.h:80
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
tuple start
Check for commandline option errors.
Definition: dqm_diff.py:58
bool check()
Definition: FEDTrailer.cc:64
int version()
Version identifier of the FED data format.
Definition: FEDHeader.cc:32
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
unsigned int getID() const
Definition: Block.h:22
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
std::auto_ptr< PackingSetup > prov_
Definition: L1TRawToDigi.cc:64
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:17
std::auto_ptr< PackingSetup > make(const std::string &) const
Definition: PackingSetup.cc:12
int evtStatus()
Event fragment status information.
Definition: FEDTrailer.cc:27
std::ostream & operator<<(std::ostream &out, const ALILine &li)
Definition: ALILine.cc:187
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:47
L1TRawToDigi(const edm::ParameterSet &)
Definition: L1TRawToDigi.cc:88
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:28
double amc
Definition: hdecay.h:20
std::vector< int > fedIds_
Definition: L1TRawToDigi.cc:59
#define end
Definition: vmac.h:37
ParameterDescriptionBase * add(U const &iLabel, T const &value)
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
int ttsBits()
Current value of the Trigger Throttling System bitsAQ).
Definition: FEDTrailer.cc:32
bool check()
Check that the header is OK.
Definition: FEDHeader.cc:64
JetCorrectorParametersCollection coll
Definition: classes.h:10
unsigned long long uint64_t
Definition: Time.h:15
int lenght()
The length of the event fragment counted in 64-bit words including header and trailer.
Definition: FEDTrailer.cc:17
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:70
int bxID()
The bunch crossing number.
Definition: FEDHeader.cc:24
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:54
unsigned int fwId_
Definition: L1TRawToDigi.cc:61
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const PackingSetupFactory * get()
Definition: PackingSetup.h:52
unsigned int minFeds_
Definition: L1TRawToDigi.cc:60
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
edm::EDGetTokenT< FEDRawDataCollection > fedData_
Definition: L1TRawToDigi.cc:55
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:28
unsigned int getSize() const
Definition: Block.h:23
int crc()
Cyclic Redundancy Code of the event fragment including header and trailer.
Definition: FEDTrailer.cc:22
virtual void endRun(edm::Run const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:53
tuple cout
Definition: gather_cfg.py:145
int lvl1ID()
Level-1 event number generated by the TTC system.
Definition: FEDHeader.cc:20
virtual void endLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:55
int triggerType()
Event Trigger type identifier.
Definition: FEDHeader.cc:16
Definition: Run.h:43
virtual void beginRun(edm::Run const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:52