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 #define EDM_ML_DEBUG 1
25 
26 // user include files
33 
38 
42 
43 namespace l1t {
45  public:
46  explicit L1TRawToDigi(const edm::ParameterSet&);
47  ~L1TRawToDigi();
48 
49  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
50 
51  private:
52  virtual void produce(edm::Event&, const edm::EventSetup&) override;
53 
54  virtual void beginRun(edm::Run const&, edm::EventSetup const&) override {};
55  virtual void endRun(edm::Run const&, edm::EventSetup const&) override {};
56  virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override {};
57  virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override {};
58 
59  // ----------member data ---------------------------
61  std::vector<int> fedIds_;
62  unsigned int fwId_;
64 
65  std::auto_ptr<PackingSetup> prov_;
66 
67  // header and trailer sizes in chars
74 
75  bool ctp7_mode_;
76  bool mtf7_mode_;
77  bool debug_;
78  };
79 }
80 
81 std::ostream & operator<<(std::ostream& o, const l1t::BlockHeader& h) {
82  o << "L1T Block Header " << h.getID() << " with size " << h.getSize();
83  return o;
84 };
85 
86 namespace l1t {
88  fedIds_(config.getParameter<std::vector<int>>("FedIds")),
89  fwId_(config.getParameter<unsigned int>("FWId")),
90  fwOverride_(config.getParameter<bool>("FWOverride")),
91  ctp7_mode_(config.getUntrackedParameter<bool>("CTP7")),
92  mtf7_mode_(config.getUntrackedParameter<bool>("MTF7"))
93  {
94  fedData_ = consumes<FEDRawDataCollection>(config.getParameter<edm::InputTag>("InputLabel"));
95 
96  if (ctp7_mode_ and mtf7_mode_) {
97  throw cms::Exception("L1TRawToDigi") << "Can only use one unpacking mode concurrently!";
98  }
99 
101  prov_->registerProducts(*this);
102 
103  slinkHeaderSize_ = config.getUntrackedParameter<int>("lenSlinkHeader");
104  slinkTrailerSize_ = config.getUntrackedParameter<int>("lenSlinkTrailer");
105  amcHeaderSize_ = config.getUntrackedParameter<int>("lenAMCHeader");
106  amcTrailerSize_ = config.getUntrackedParameter<int>("lenAMCTrailer");
107  amc13HeaderSize_ = config.getUntrackedParameter<int>("lenAMC13Header");
108  amc13TrailerSize_ = config.getUntrackedParameter<int>("lenAMC13Trailer");
109 
110  debug_ = config.getUntrackedParameter<bool>("debug");
111  }
112 
113 
115  {
116  }
117 
118 
119  //
120  // member functions
121  //
122 
123  // ------------ method called to produce the data ------------
124  void
126  {
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  for (const auto& fedId: fedIds_) {
140  const FEDRawData& l1tRcd = feds->FEDData(fedId);
141 
142  LogDebug("L1T") << "Found FEDRawDataCollection with ID " << fedId << " and size " << l1tRcd.size();
143 
145  LogError("L1T") << "Cannot unpack: empty/invalid L1T raw data (size = "
146  << l1tRcd.size() << ") for ID " << fedId << ". Returning empty collections!";
147  continue;
148  }
149 
150  const unsigned char *data = l1tRcd.data();
151  FEDHeader header(data);
152 
153  if (header.check()) {
154  LogDebug("L1T") << "Found SLink header:"
155  << " Trigger type " << header.triggerType()
156  << " L1 event ID " << header.lvl1ID()
157  << " BX Number " << header.bxID()
158  << " FED source " << header.sourceID()
159  << " FED version " << header.version();
160  } else {
161  LogWarning("L1T") << "Did not find a SLink header!";
162  }
163 
164  FEDTrailer trailer(data + (l1tRcd.size() - slinkTrailerSize_));
165 
166  if (trailer.check()) {
167  LogDebug("L1T") << "Found SLink trailer:"
168  << " Length " << trailer.lenght()
169  << " CRC " << trailer.crc()
170  << " Status " << trailer.evtStatus()
171  << " Throttling bits " << trailer.ttsBits();
172  } else {
173  LogWarning("L1T") << "Did not find a SLink trailer!";
174  }
175 
176  // FIXME Hard-coded firmware version for first 74x MC campaigns.
177  // Will account for differences in the AMC payload, MP7 payload,
178  // and unpacker setup.
179  bool legacy_mc = fwOverride_ && ((fwId_ >> 24) == 0xff);
180 
181  amc13::Packet packet;
182  if (!packet.parse(
183  (const uint64_t*) data,
184  (const uint64_t*) (data + slinkHeaderSize_),
185  (l1tRcd.size() - slinkHeaderSize_ - slinkTrailerSize_) / 8,
186  header.lvl1ID(),
187  header.bxID(),
188  legacy_mc)) {
189  LogError("L1T")
190  << "Could not extract AMC13 Packet.";
191  return;
192  }
193 
194  for (auto& amc: packet.payload()) {
195  if (amc.size() == 0)
196  continue;
197 
198  auto payload64 = amc.data();
199  const uint32_t * start = (const uint32_t*) payload64.get();
200  // Want to have payload size in 32 bit words, but AMC measures
201  // it in 64 bit words → factor 2.
202  const uint32_t * end = start + (amc.size() * 2);
203 
204  std::auto_ptr<Payload> payload;
205  if (ctp7_mode_) {
206  LogDebug("L1T") << "Using CTP7 mode";
207  payload.reset(new CTP7Payload(start, end));
208  } else if (mtf7_mode_) {
209  LogDebug("L1T") << "Using MTF7 mode";
210  payload.reset(new MTF7Payload(start, end));
211  } else {
212  LogDebug("L1T") << "Using MP7 mode";
213  payload.reset(new MP7Payload(start, end, legacy_mc));
214  }
215  unsigned fw = payload->getAlgorithmFWVersion();
216 
217  // Let parameterset value override FW version
218  if (fwOverride_)
219  fw = fwId_;
220 
221  unsigned board = amc.blockHeader().getBoardID();
222  unsigned amc_no = amc.blockHeader().getAMCNumber();
223 
224  auto unpackers = prov_->getUnpackers(fedId, board, amc_no, fw);
225 
226  // getBlock() returns a non-null auto_ptr on success
227  std::auto_ptr<Block> block;
228  while ((block = payload->getBlock()).get()) {
229  if (debug_) {
230  std::cout << ">>> block to unpack <<<" << std::endl
231  << "hdr: " << std::hex << std::setw(8) << std::setfill('0') << block->header().raw() << std::dec
232  << " (ID " << block->header().getID() << ", size " << block->header().getSize()
233  << ", CapID 0x" << std::hex << std::setw(2) << std::setfill('0') << block->header().getCapID()
234  << ")" << std::dec << std::endl;
235  for (const auto& word: block->payload()) {
236  if (debug_)
237  std::cout << "data: " << std::hex << std::setw(8) << std::setfill('0') << word << std::dec << std::endl;
238  }
239  }
240 
241  auto unpacker = unpackers.find(block->header().getID());
242 
243  block->amc(amc.header());
244 
245  if (unpacker == unpackers.end()) {
246  LogDebug("L1T") << "Cannot find an unpacker for"
247  << "\n\tblock: ID " << block->header().getID() << ", size " << block->header().getSize()
248  << "\n\tAMC: # " << amc_no << ", board ID 0x" << std::hex << board << std::dec
249  << "\n\tFED ID " << fedId << ", and FW ID " << fw;
250  // TODO Handle error
251  } else if (!unpacker->second->unpack(*block, coll.get())) {
252  LogDebug("L1T") << "Error unpacking data for block ID "
253  << block->header().getID() << ", AMC # " << amc_no
254  << ", board ID " << board << ", FED ID " << fedId
255  << ", and FW ID " << fw << "!";
256  // TODO Handle error
257  }
258  }
259  }
260  }
261  }
262 
263  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
264  void
267  // These parameters are part of the L1T/HLT interface, avoid changing if possible:
268  desc.add<std::vector<int>>("FedIds", {})->setComment("required parameter: default value is invalid");
269  desc.add<std::string>("Setup", "")->setComment("required parameter: default value is invalid");
270  // These parameters have well defined default values and are not currently
271  // part of the L1T/HLT interface. They can be cleaned up or updated at will:
272  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");
273  desc.add<bool>("FWOverride", false)->setComment("Firmware version should be taken as FWId parameters");
274  desc.addUntracked<bool>("CTP7", false);
275  desc.addUntracked<bool>("MTF7", false);
276  desc.add<edm::InputTag>("InputLabel",edm::InputTag("rawDataCollector"));
277  desc.addUntracked<int>("lenSlinkHeader", 8);
278  desc.addUntracked<int>("lenSlinkTrailer", 8);
279  desc.addUntracked<int>("lenAMCHeader", 8);
280  desc.addUntracked<int>("lenAMCTrailer", 0);
281  desc.addUntracked<int>("lenAMC13Header", 8);
282  desc.addUntracked<int>("lenAMC13Trailer", 8);
283  desc.addUntracked<bool>("debug", false)->setComment("turn on verbose output");
284  descriptions.add("l1tRawToDigi", desc);
285  }
286 }
287 
288 using namespace l1t;
289 //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:65
#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:87
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:28
double amc
Definition: hdecay.h:20
std::vector< int > fedIds_
Definition: L1TRawToDigi.cc:61
#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
int bxID()
The bunch crossing number.
Definition: FEDHeader.cc:24
virtual void beginLuminosityBlock(edm::LuminosityBlock const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:56
unsigned int fwId_
Definition: L1TRawToDigi.cc:62
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const PackingSetupFactory * get()
Definition: PackingSetup.h:52
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:82
edm::EDGetTokenT< FEDRawDataCollection > fedData_
Definition: L1TRawToDigi.cc:57
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
bool parse(const uint64_t *start, const uint64_t *data, unsigned int size, unsigned int lv1, unsigned int bx, bool legacy_mc=false)
Definition: AMC13Spec.cc:70
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:55
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:57
int triggerType()
Event Trigger type identifier.
Definition: FEDHeader.cc:16
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
Definition: Run.h:43
virtual void beginRun(edm::Run const &, edm::EventSetup const &) override
Definition: L1TRawToDigi.cc:54