CMS 3D CMS Logo

L1TDigiToRaw.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: EventFilter/L1TRawToDigi
4 // Class: L1TDigiToRaw
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 <iomanip>
21 #include <memory>
22 
23 #define EDM_ML_DEBUG 1
24 
25 // user include files
30 
37 
39 
41 
43 
44 #include "PackingSetupFactory.h"
45 
46 namespace l1t {
48  public:
49  explicit L1TDigiToRaw(const edm::ParameterSet&);
50 
51  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
52 
53  private:
54  void produce(edm::Event&, const edm::EventSetup&) override;
55 
56  // ----------member data ---------------------------
57  int evtType_;
58  int fedId_;
59  unsigned fwId_;
60 
61  // header and trailer sizes in chars
64 
65  std::unique_ptr<PackingSetup> setup_;
66  std::unique_ptr<PackerTokens> tokens_;
67 
68  bool ctp7_mode_;
69  };
70 } // namespace l1t
71 
72 namespace l1t {
74  : fedId_(config.getParameter<int>("FedId")), ctp7_mode_(config.getUntrackedParameter<bool>("CTP7")) {
75  // Register products
76  produces<FEDRawDataCollection>();
77 
78  fwId_ = config.getParameter<unsigned int>("FWId");
79  evtType_ = config.getUntrackedParameter<int>("eventType", 1);
80 
81  auto cc = edm::ConsumesCollector(consumesCollector());
82 
83  setup_ = PackingSetupFactory::get()->make(config.getParameter<std::string>("Setup"));
84  tokens_ = setup_->registerConsumes(config, cc);
85 
86  slinkHeaderSize_ = config.getUntrackedParameter<int>("lenSlinkHeader", 8);
87  slinkTrailerSize_ = config.getUntrackedParameter<int>("lenSlinkTrailer", 8);
88  }
89 
90  // ------------ method called to produce the data ------------
92  using namespace edm;
93 
94  LogDebug("L1T") << "Packing data with FED ID " << fedId_;
95 
97 
98  auto bxId = event.bunchCrossing();
99  // Note: L1ID != event ID
100  // See e.g. triggerCount vs. eventNumber
101  // in EventFilter/FEDInterface/interface/FED1024.h
102  // But the trigger count is not stored in cmssw event class
103  auto evtId = event.id().event();
104  auto orbit = event.eventAuxiliary().orbitNumber();
105  LogDebug("L1T") << "Forming FED with metadata bxId=" << bxId << ", l1ID=" << evtId << ", orbit=" << orbit;
106 
107  // Create all the AMC payloads to pack into the AMC13
108  for (const auto& item : setup_->getPackers(fedId_, fwId_)) {
109  auto amc_no = item.first.first;
110  auto board = item.first.second;
111  auto packers = item.second;
112 
113  Blocks block_load;
114  for (const auto& packer : packers) {
115  LogDebug("L1T") << "Adding packed blocks";
116  packer->setBoard(board);
117  auto blocks = packer->pack(event, tokens_.get());
118  block_load.insert(block_load.end(), blocks.begin(), blocks.end());
119  }
120 
121  std::sort(block_load.begin(), block_load.end());
122 
123  LogDebug("L1T") << "Concatenating blocks";
124 
125  std::vector<uint32_t> load32;
126  // CTP7 stores this info in AMC user header
127  if (not ctp7_mode_) {
128  // TODO Infrastructure firmware version. Currently not used.
129  // Would change the way the payload has to be unpacked.
130  load32.push_back(0);
131  load32.push_back(fwId_);
132  }
133  for (const auto& block : block_load) {
134  LogDebug("L1T") << "Adding block " << block.header().getID() << " with size " << block.payload().size();
135  auto load = block.payload();
136 
137 #ifdef EDM_ML_DEBUG
138  std::stringstream s("");
139  s << "Block content:" << std::endl << std::hex << std::setfill('0');
140  for (const auto& word : load)
141  s << std::setw(8) << word << std::endl;
142  LogDebug("L1T") << s.str();
143 #endif
144 
145  if (block.header().getType() == CTP7) {
146  // Header is two words for CTP7, first word is just a magic
147  load32.push_back(0xA110CA7E);
148  }
149  load32.push_back(block.header().raw());
150  load32.insert(load32.end(), load.begin(), load.end());
151  }
152 
153  LogDebug("L1T") << "Converting payload";
154 
155  std::vector<uint64_t> load64;
156  for (unsigned int i = 0; i < load32.size(); i += 2) {
157  uint64_t word = load32[i];
158  if (i + 1 < load32.size()) {
159  word |= static_cast<uint64_t>(load32[i + 1]) << 32;
160  } else {
161  word |= static_cast<uint64_t>(0xffffffff) << 32;
162  }
163  load64.push_back(word);
164  }
165 
166  LogDebug("L1T") << "Creating AMC packet";
167 
168  unsigned amc_user_header = 0;
169  if (ctp7_mode_)
170  amc_user_header = fwId_;
171  amc13.add(amc_no, board, evtId, orbit, bxId, load64, amc_user_header);
172  }
173 
174  std::unique_ptr<FEDRawDataCollection> raw_coll(new FEDRawDataCollection());
175  FEDRawData& fed_data = raw_coll->FEDData(fedId_);
176 
177  unsigned int size = slinkHeaderSize_ + slinkTrailerSize_ + amc13.size() * 8;
178  fed_data.resize(size);
179  unsigned char* payload = fed_data.data();
180  unsigned char* payload_start = payload;
181 
183  header.set(payload, evtType_, evtId, bxId, fedId_);
184 
186 
188  payload += amc13.size() * 8;
189 
190  FEDTrailer trailer(payload);
191  trailer.set(payload, size / 8, evf::compute_crc(payload_start, size), 0, 0);
192 
193  event.put(std::move(raw_coll));
194  }
195 
196  // ------------ method called when starting to processes a run ------------
197  /*
198  void
199  L1TDigiToRaw::beginRun(edm::Run const&, edm::EventSetup const&)
200  {
201  }
202  */
203 
204  // ------------ method called when ending the processing of a run ------------
205  /*
206  void
207  L1TDigiToRaw::endRun(edm::Run const&, edm::EventSetup const&)
208  {
209  }
210  */
211 
212  // ------------ method called when starting to processes a luminosity block ------------
213  /*
214  void
215  L1TDigiToRaw::beginLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
216  {
217  }
218  */
219 
220  // ------------ method called when ending the processing of a luminosity block ------------
221  /*
222  void
223  L1TDigiToRaw::endLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&)
224  {
225  }
226  */
227 
228  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
231  desc.add<unsigned int>("FWId", -1);
232  desc.add<int>("FedId");
233  desc.addUntracked<int>("eventType", 1);
234  desc.add<std::string>("Setup");
235  desc.addOptional<edm::InputTag>("InputLabel", edm::InputTag(""));
236  desc.addOptional<edm::InputTag>("InputLabel2", edm::InputTag(""));
237  desc.addUntracked<int>("lenSlinkHeader", 8);
238  desc.addUntracked<int>("lenSlinkTrailer", 8);
239  desc.addUntracked<bool>("CTP7", false);
240 
242 
243  descriptions.add("l1tDigiToRaw", desc);
244  }
245 } // namespace l1t
246 
247 using namespace l1t;
248 //define this as a plug-in
std::unique_ptr< PackerTokens > tokens_
Definition: L1TDigiToRaw.cc:66
std::unique_ptr< PackingSetup > setup_
Definition: L1TDigiToRaw.cc:65
uint32_t cc[maxCellsPerHit]
Definition: gpuFishbone.h:49
delete x;
Definition: CaloConfig.h:22
Definition: config.py:1
std::unique_ptr< PackingSetup > make(const std::string &) const
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
uint64_t word
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 produce(edm::Event &, const edm::EventSetup &) override
Definition: L1TDigiToRaw.cc:91
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
Definition: CRC16.h:46
std::vector< Block > Blocks
Definition: Block.h:99
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
L1TDigiToRaw(const edm::ParameterSet &)
Definition: L1TDigiToRaw.cc:73
unsigned long long uint64_t
Definition: Time.h:13
def load(fileName)
Definition: svgfig.py:547
void resize(size_t newsize, size_t wordsize=8)
Definition: FEDRawData.cc:28
void add(std::string const &label, ParameterSetDescription const &psetDescription)
static const PackingSetupFactory * get()
HLT enums.
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
void fillDescription(edm::ParameterSetDescription &) const
def move(src, dest)
Definition: eostools.py:511
Definition: event.py:1
#define LogDebug(id)