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