CMS 3D CMS Logo

MP7BufferDumpToRaw.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EventFilter/L1TRawToDigi
4 // Class: MP7BufferDumpToRaw
5 //
13 //
14 // Original Author: James Brooke
15 // Created: Tue, 11 Mar 2014 14:55:45 GMT
16 //
17 //
18 
19 // system include files
20 #include <memory>
21 
22 // user include files
30 
35 
37 
38 #include <fstream>
39 #include <iostream>
40 #include <sstream>
41 #include <string>
42 #include <iomanip>
43 #include <boost/algorithm/string.hpp>
44 
49 //#include "EventFilter/L1TRawToDigi/interface/PackingSetup.h"
50 //
51 // class declaration
52 //
53 
54 namespace l1t {
55 
57  public:
58  explicit MP7BufferDumpToRaw(const edm::ParameterSet&);
59  ~MP7BufferDumpToRaw() override;
60 
61  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
62 
63  private:
64  void beginJob() override;
65  void produce(edm::Event&, const edm::EventSetup&) override;
66  void endJob() override;
67 
68  std::vector<Block> getBlocks(int iAmc);
69 
70  void formatAMC(amc13::Packet& amc13, const std::vector<Block>& blocks, int iAmc);
71 
73 
74  //virtual void beginRun(edm::Run const&, edm::EventSetup const&) override;
75  //virtual void endRun(edm::Run const&, edm::EventSetup const&) override;
76  //virtual void beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override;
77  //virtual void endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) override;
78 
79  // ----------member data ---------------------------
80 
81  // file readers
84  std::vector<unsigned> rxIndex_;
85  std::vector<unsigned> txIndex_;
86 
87  // packet readers
90  // MP7PacketReader::PacketData::const_iter rxItr_;
91  // MP7PacketReader::PacketData txItr_;
92 
93  // formatting parameters
95 
96  // non packetised data parameters
97  unsigned nFramesPerEvent_;
98 
99  // packetised data parameters
100 
101  // hardware params
102  unsigned nBoard_;
103  unsigned iBoard_;
104  std::vector<int> boardId_;
105 
106  // board readout params
107  std::vector<std::vector<int> > rxBlockLength_;
108  std::vector<std::vector<int> > txBlockLength_;
109  bool mux_;
111 
112  // DAQ params
113  int fedId_;
114  int evType_;
115  int fwVer_;
116  int slinkHeaderSize_; // in 8-bit words
118  };
119 
120  //
121  // constants, enums and typedefs
122  //
123 
124  //
125  // static data member definitions
126  //
127 
128  //
129  // constructors and destructor
130  //
132  : rxFileReader_(iConfig.getUntrackedParameter<std::string>("rxFile", "rx_summary.txt")),
133  txFileReader_(iConfig.getUntrackedParameter<std::string>("txFile", "tx_summary.txt")),
134  rxPacketReader_(iConfig.getUntrackedParameter<std::string>("rxFile", "rx_summary.txt"),
135  iConfig.getUntrackedParameter<int>("rxHeaderFrames", 1),
136  0,
137  iConfig.getUntrackedParameter<int>("rxKeyLink", 0)),
138  txPacketReader_(iConfig.getUntrackedParameter<std::string>("txFile", "tx_summary.txt"),
139  iConfig.getUntrackedParameter<int>("txHeaderFrames", 1),
140  0,
141  iConfig.getUntrackedParameter<int>("txKeyLink", 0)),
142  packetisedData_(iConfig.getUntrackedParameter<bool>("packetisedData", true)),
143  nFramesPerEvent_(iConfig.getUntrackedParameter<int>("nFramesPerEvent", 6)),
144  iBoard_(iConfig.getUntrackedParameter<int>("boardOffset", 0)),
145  boardId_(iConfig.getUntrackedParameter<std::vector<int> >("boardId")),
146  mux_(iConfig.getUntrackedParameter<bool>("mux", false)),
147  fedId_(iConfig.getUntrackedParameter<int>("fedId", 1)),
148  evType_(iConfig.getUntrackedParameter<int>("eventType", 1)),
149  fwVer_(iConfig.getUntrackedParameter<int>("fwVersion", 1)),
150  slinkHeaderSize_(iConfig.getUntrackedParameter<int>("lenSlinkHeader", 8)),
151  slinkTrailerSize_(iConfig.getUntrackedParameter<int>("lenSlinkTrailer", 8)) {
152  produces<FEDRawDataCollection>();
153 
154  // check tx/rx file size consistency and number of boards
155  if (rxFileReader_.size() != txFileReader_.size()) {
156  edm::LogError("L1T") << "Different number of boards in Rx and Tx files";
157  }
159  LogDebug("L1T") << "# boards : " << nBoard_;
160 
161  // advance pointers for non packetised data
162  rxIndex_ = iConfig.getUntrackedParameter<std::vector<unsigned> >("nFramesOffset");
163  if (rxIndex_.size() != nBoard_) {
164  edm::LogError("L1T") << "Wrong number of boards in nFramesOffset " << rxIndex_.size();
165  }
166 
167  txIndex_ = iConfig.getUntrackedParameter<std::vector<unsigned> >("nFramesLatency");
168  if (txIndex_.size() != nBoard_) {
169  edm::LogError("L1T") << "Wrong number of boards in nFramesLatency " << txIndex_.size();
170  }
171 
172  // add latency to offset for Tx
173  for (unsigned i = 0; i < rxIndex_.size(); ++i)
174  txIndex_.at(i) += rxIndex_.at(i);
175 
176  // check board IDs
177  if (nBoard_ != boardId_.size()) {
178  edm::LogError("L1T") << "Found " << nBoard_ << " boards, but given " << boardId_.size() << " IDs";
179  }
180 
181  // block length PSet
182  std::vector<edm::ParameterSet> vpset = iConfig.getUntrackedParameter<std::vector<edm::ParameterSet> >("blocks");
183 
184  if (vpset.size() != nBoard_) {
185  edm::LogError("L1T") << "Wrong number of block specs " << vpset.size();
186  }
187 
188  rxBlockLength_.resize(nBoard_);
189  txBlockLength_.resize(nBoard_);
190 
191  for (unsigned i = 0; i < nBoard_; ++i) {
192  std::vector<int> rx = vpset.at(i).getUntrackedParameter<std::vector<int> >("rxBlockLength");
193 
194  rxBlockLength_.at(i).resize(rx.size());
195 
196  for (unsigned j = 0; j < rx.size(); ++j) {
197  rxBlockLength_.at(i).at(j) = rx.at(j);
198 
199  if (rx.at(j) != 0) {
200  // LogDebug("L1T") << "Block readout : board " << i << " Rx link " << j << " size " << rx.at(j);
201  }
202  }
203 
204  std::vector<int> tx = vpset.at(i).getUntrackedParameter<std::vector<int> >("txBlockLength");
205  txBlockLength_.at(i).resize(tx.size());
206 
207  for (unsigned j = 0; j < tx.size(); ++j) {
208  txBlockLength_.at(i).at(j) = tx.at(j);
209 
210  if (tx.at(j) != 0) {
211  // LogDebug("L1T") << "Block readout : board " << i << " Tx link " << j << " size " << tx.at(j);
212  }
213  }
214  }
215 
216  LogDebug("L1T") << "Board ID size " << boardId_.size();
217 
218  LogDebug("L1T") << "Frames per event " << nFramesPerEvent_;
219  }
220 
222  // do anything here that needs to be done at desctruction time
223  // (e.g. close files, deallocate resources etc.)
224  }
225 
226  //
227  // member functions
228  //
229 
230  // ------------ method called for each event ------------
232  using namespace edm;
233 
234  // AMC 13 packet
236 
237  // create AMC formatted data
238  if (mux_) {
239  std::vector<Block> blocks = getBlocks(iBoard_);
241  } else {
242  for (unsigned iBoard = 0; iBoard < nBoard_; ++iBoard) {
243  std::vector<Block> blocks = getBlocks(iBoard);
244  formatAMC(amc13, blocks, iBoard);
245  }
246  }
247 
248  LogDebug("L1T") << "AMC13 size " << amc13.size();
249 
250  // prepare the raw data collection
251  std::unique_ptr<FEDRawDataCollection> raw_coll(new FEDRawDataCollection());
252  FEDRawData& fed_data = raw_coll->FEDData(fedId_);
253 
254  formatRaw(iEvent, amc13, fed_data);
255 
256  LogDebug("L1T") << "Packing FED ID " << fedId_ << " size " << fed_data.size();
257 
258  // put the collection in the event
259  iEvent.put(std::move(raw_coll));
260 
261  //advance to next AMC for next event, if required...
262  if (mux_) {
263  iBoard_++;
264  iBoard_ = iBoard_ % nBoard_;
265  }
266  }
267 
268  std::vector<Block> MP7BufferDumpToRaw::getBlocks(int iBoard) {
269  LogDebug("L1T") << "Getting blocks from board " << iBoard << ", " << rxBlockLength_.at(iBoard).size()
270  << " Rx links, " << txBlockLength_.at(iBoard).size() << " Tx links";
271 
272  std::vector<Block> blocks;
273 
274  // Rx blocks first
275  for (unsigned link = 0; link < rxBlockLength_.at(iBoard).size(); ++link) {
276  unsigned id = link * 2;
277  unsigned size = rxBlockLength_.at(iBoard).at(link);
278 
279  if (size == 0)
280  continue;
281 
282  std::vector<uint32_t> data;
283  if (packetisedData_) {
284  const PacketData& p = rxPacketReader_.get(iBoard);
285  PacketData::const_iterator itr = p.begin();
286  for (unsigned i = 0; i < rxIndex_.at(iBoard); i++)
287  itr++;
288 
289  LogDebug("L1T") << "Found packet [" << itr->first_ << ", " << itr->last_ << "]";
290  LogDebug("L1T") << "Link " << link << " has " << itr->links_.find(link)->second.size() << " frames";
291 
292  for (unsigned iFrame = 0; iFrame < itr->links_.find(link)->second.size(); ++iFrame) {
293  uint64_t d = itr->links_.find(link)->second.at(iFrame);
294  data.push_back(d);
295  }
296  } else {
297  for (unsigned iFrame = rxIndex_.at(iBoard); iFrame < rxIndex_.at(iBoard) + size; ++iFrame) {
298  uint64_t d = rxFileReader_.get(iBoard).link(link).at(iFrame);
299  LogDebug("L1T") << "Frame " << iFrame << " : " << std::hex << d;
300  if ((d & 0x100000000) > 0)
301  data.push_back(d & 0xffffffff);
302  }
303  }
304 
305  LogDebug("L1T") << "Board " << iBoard << " block " << id << ", size " << data.size();
306 
307  Block block(id, data);
308  blocks.push_back(block);
309  }
310 
311  // then Tx blocks
312  for (unsigned link = 0; link < txBlockLength_.at(iBoard).size(); ++link) {
313  unsigned id = (link * 2) + 1;
314  unsigned size = txBlockLength_.at(iBoard).at(link);
315 
316  if (size == 0)
317  continue;
318 
319  LogDebug("L1T") << "Block " << id << " expecting size " << size;
320 
321  std::vector<uint32_t> data;
322  if (packetisedData_) {
323  const PacketData& p = txPacketReader_.get(iBoard);
324  PacketData::const_iterator itr = p.begin();
325  for (unsigned i = 0; i < txIndex_.at(iBoard); i++)
326  itr++;
327 
328  LogDebug("L1T") << "Found packet [" << itr->first_ << ", " << itr->last_ << "]";
329  LogDebug("L1T") << "Link " << link << " has " << itr->links_.find(link)->second.size() << " frames";
330 
331  for (unsigned iFrame = 0; iFrame < itr->links_.find(link)->second.size(); ++iFrame) {
332  uint64_t d = itr->links_.find(link)->second.at(iFrame);
333  data.push_back(d);
334  }
335 
336  } else {
337  for (unsigned iFrame = txIndex_.at(iBoard); iFrame < txIndex_.at(iBoard) + size; ++iFrame) {
338  uint64_t d = txFileReader_.get(iBoard).link(link).at(iFrame);
339  LogDebug("L1T") << "Frame " << iFrame << " : " << std::hex << d;
340  if ((d & 0x100000000) > 0)
341  data.push_back(d & 0xffffffff);
342  }
343  }
344 
345  LogDebug("L1T") << "Board " << iBoard << " block " << id << ", size " << data.size();
346 
347  Block block(id, data);
348 
349  blocks.push_back(block);
350  }
351 
352  if (packetisedData_) {
353  rxIndex_.at(iBoard)++;
354  txIndex_.at(iBoard)++;
355  } else {
356  rxIndex_.at(iBoard) += nFramesPerEvent_;
357  txIndex_.at(iBoard) += nFramesPerEvent_;
358  }
359 
360  LogDebug("L1T") << "Board " << iBoard << ", read " << blocks.size() << " blocks";
361 
362  return blocks;
363  }
364 
365  void MP7BufferDumpToRaw::formatAMC(amc13::Packet& amc13, const std::vector<Block>& blocks, int iBoard) {
366  LogDebug("L1T") << "Formatting Board " << iBoard;
367 
368  std::vector<uint32_t> load32;
369  // TODO this is an empty word to be replaced with a proper MP7
370  // header containing at least the firmware version
371  load32.push_back(0);
372  load32.push_back(fwVer_);
373 
374  for (const auto& block : blocks) {
375  LogDebug("L1T") << "Adding block " << block.header().getID() << " with size " << block.payload().size();
376  auto load = block.payload();
377 
378 #ifdef EDM_ML_DEBUG
379  std::stringstream s("");
380  s << "Block content:" << std::endl << std::hex << std::setfill('0');
381  for (const auto& word : load)
382  s << std::setw(8) << word << std::endl;
383  LogDebug("L1T") << s.str();
384 #endif
385 
386  load32.push_back(block.header().raw());
387  load32.insert(load32.end(), load.begin(), load.end());
388  }
389 
390  LogDebug("L1T") << "Converting payload " << iBoard;
391 
392  std::vector<uint64_t> load64;
393  for (unsigned int i = 0; i < load32.size(); i += 2) {
394  uint64_t word = load32[i];
395  if (i + 1 < load32.size())
396  word |= static_cast<uint64_t>(load32[i + 1]) << 32;
397  load64.push_back(word);
398  }
399 
400  LogDebug("L1T") << "Creating AMC packet " << iBoard;
401  // LogDebug("L1T") << iBoard << ", " << boardId_.at(iBoard) << ", " << load64.size();
402 
403  amc13.add(iBoard, boardId_.at(iBoard), 0, 0, 0, load64);
404  }
405 
407  unsigned int size = slinkHeaderSize_ + slinkTrailerSize_ + amc13.size() * 8;
408  fed_data.resize(size);
409  unsigned char* payload = fed_data.data();
410  unsigned char* payload_start = payload;
411 
412  auto bxId = iEvent.bunchCrossing();
413  auto evtId = iEvent.id().event();
414 
415  LogDebug("L1T") << "Creating FEDRawData ID " << fedId_ << ", size " << size;
416 
418  header.set(payload, evType_, evtId, bxId, fedId_);
419 
421 
423  payload += amc13.size() * 8;
424 
425  FEDTrailer trailer(payload);
426  trailer.set(payload, size / 8, evf::compute_crc(payload_start, size), 0, 0);
427  }
428 
429  // ------------ method called once each job just before starting event loop ------------
431 
432  // ------------ method called once each job just after ending the event loop ------------
434 
435  // ------------ method called when starting to processes a run ------------
436  /*
437 void
438 MP7BufferDumpToRaw::beginRun(edm::Run const&, edm::EventSetup const&)
439 {
440 }
441 */
442 
443  // ------------ method called when ending the processing of a run ------------
444  /*
445 void
446 MP7BufferDumpToRaw::endRun(edm::Run const&, edm::EventSetup const&)
447 {
448 }
449 */
450 
451  // ------------ method called when starting to processes a luminosity block ------------
452  /*
453 vvoid
454 MP7BufferDumpToRaw::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
455 {
456 }
457 */
458 
459  // ------------ method called when ending the processing of a luminosity block ------------
460  /*
461 void
462 MP7BufferDumpToRaw::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
463 {
464 }
465 */
466 
467  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
469  //The following says we do not know what parameters are allowed so do no validation
470  // Please change this to state exactly what you do use, even if it is no parameters
472  desc.setUnknown();
473  descriptions.addDefault(desc);
474  }
475 
476 } // namespace l1t
477 
478 using namespace l1t;
479 //define this as a plug-in
size
Write out results.
const std::vector< uint64_t > & link(uint32_t i) const
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
MP7PacketReader txPacketReader_
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
delete x;
Definition: CaloConfig.h:22
Log< level::Error, false > LogError
std::vector< Block > getBlocks(int iAmc)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
T getUntrackedParameter(std::string const &, T const &) const
const PacketData & get(size_t i)
uint64_t word
int iEvent
Definition: GenABIO.cc:224
void addDefault(ParameterSetDescription const &psetDescription)
static void set(unsigned char *trailer, uint32_t lenght, uint16_t crc, uint8_t evt_stat, uint8_t tts, bool moreTrailers=false)
Set all fields in the trailer.
Definition: FEDTrailer.cc:31
void resize(size_t newsize)
Definition: FEDRawData.cc:28
MP7BufferDumpToRaw(const edm::ParameterSet &)
void produce(edm::Event &, const edm::EventSetup &) override
std::vector< unsigned > rxIndex_
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:46
std::vector< std::vector< int > > rxBlockLength_
void formatAMC(amc13::Packet &amc13, const std::vector< Block > &blocks, int iAmc)
std::vector< std::vector< int > > txBlockLength_
d
Definition: ztail.py:151
std::vector< unsigned > txIndex_
unsigned long long uint64_t
Definition: Time.h:13
def load(fileName)
Definition: svgfig.py:547
size_t size() const
number of rawdata objects stored
Definition: MP7FileReader.h:71
std::vector< Packet >::const_iterator const_iterator
HLT enums.
char data[epos_bytes_allocation]
Definition: EPOS_Wrapper.h:79
std::vector< int > boardId_
const FileData & get(size_t k) const
data getter via index
MP7PacketReader rxPacketReader_
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
void formatRaw(edm::Event &iEvent, amc13::Packet &amc13, FEDRawData &fed_data)
def move(src, dest)
Definition: eostools.py:511
#define LogDebug(id)