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 debug_;
77  };
78 }
79 
80 std::ostream & operator<<(std::ostream& o, const l1t::BlockHeader& h) {
81  o << "L1T Block Header " << h.getID() << " with size " << h.getSize();
82  return o;
83 };
84 
85 namespace l1t {
87  fedIds_(config.getParameter<std::vector<int>>("FedIds")),
88  fwId_(-1),
89  fwOverride_(false),
90  ctp7_mode_(config.getUntrackedParameter<bool>("CTP7", false))
91  {
92  fedData_ = consumes<FEDRawDataCollection>(config.getParameter<edm::InputTag>("InputLabel"));
93 
94  fwId_ = config.getParameter<unsigned int>("FWId");
95  fwOverride_ = config.getParameter<bool>("FWOverride");
96 
98  prov_->registerProducts(*this);
99 
100  slinkHeaderSize_ = config.getUntrackedParameter<int>("lenSlinkHeader", 8);
101  slinkTrailerSize_ = config.getUntrackedParameter<int>("lenSlinkTrailer", 8);
102  amcHeaderSize_ = config.getUntrackedParameter<int>("lenAMCHeader", 8);
103  amcTrailerSize_ = config.getUntrackedParameter<int>("lenAMCTrailer", 0);
104  amc13HeaderSize_ = config.getUntrackedParameter<int>("lenAMC13Header", 8);
105  amc13TrailerSize_ = config.getUntrackedParameter<int>("lenAMC13Trailer", 8);
106 
107  debug_ = config.getUntrackedParameter<bool>("debug", false);
108  }
109 
110 
112  {
113  }
114 
115 
116  //
117  // member functions
118  //
119 
120  // ------------ method called to produce the data ------------
121  void
123  {
124  using namespace edm;
125 
126  std::unique_ptr<UnpackerCollections> coll = prov_->getCollections(event);
127 
129  event.getByToken(fedData_, feds);
130 
131  if (!feds.isValid()) {
132  LogError("L1T") << "Cannot unpack: no FEDRawDataCollection found";
133  return;
134  }
135 
136  for (const auto& fedId: fedIds_) {
137  const FEDRawData& l1tRcd = feds->FEDData(fedId);
138 
139  LogDebug("L1T") << "Found FEDRawDataCollection with ID " << fedId << " and size " << l1tRcd.size();
140 
142  LogError("L1T") << "Cannot unpack: empty/invalid L1T raw data (size = "
143  << l1tRcd.size() << ") for ID " << fedId << ". Returning empty collections!";
144  continue;
145  }
146 
147  const unsigned char *data = l1tRcd.data();
148  FEDHeader header(data);
149 
150  if (header.check()) {
151  LogDebug("L1T") << "Found SLink header:"
152  << " Trigger type " << header.triggerType()
153  << " L1 event ID " << header.lvl1ID()
154  << " BX Number " << header.bxID()
155  << " FED source " << header.sourceID()
156  << " FED version " << header.version();
157  } else {
158  LogWarning("L1T") << "Did not find a SLink header!";
159  }
160 
161  FEDTrailer trailer(data + (l1tRcd.size() - slinkTrailerSize_));
162 
163  if (trailer.check()) {
164  LogDebug("L1T") << "Found SLink trailer:"
165  << " Length " << trailer.lenght()
166  << " CRC " << trailer.crc()
167  << " Status " << trailer.evtStatus()
168  << " Throttling bits " << trailer.ttsBits();
169  } else {
170  LogWarning("L1T") << "Did not find a SLink trailer!";
171  }
172 
173  // FIXME Hard-coded firmware version for first 74x MC campaigns.
174  // Will account for differences in the AMC payload, MP7 payload,
175  // and unpacker setup.
176  bool legacy_mc = fwOverride_ && ((fwId_ >> 24) == 0xff);
177 
178  amc13::Packet packet;
179  if (!packet.parse(
180  (const uint64_t*) data,
181  (const uint64_t*) (data + slinkHeaderSize_),
182  (l1tRcd.size() - slinkHeaderSize_ - slinkTrailerSize_) / 8,
183  header.lvl1ID(),
184  header.bxID(),
185  legacy_mc)) {
186  LogError("L1T")
187  << "Could not extract AMC13 Packet.";
188  return;
189  }
190 
191  for (auto& amc: packet.payload()) {
192  auto payload64 = amc.data();
193  const uint32_t * start = (const uint32_t*) payload64.get();
194  // Want to have payload size in 32 bit words, but AMC measures
195  // it in 64 bit words → factor 2.
196  const uint32_t * end = start + (amc.size() * 2);
197 
198  std::auto_ptr<Payload> payload;
199  if (ctp7_mode_) {
200  LogDebug("L1T") << "Using CTP7 mode";
201  payload.reset(new CTP7Payload(start, end));
202  } else {
203  LogDebug("L1T") << "Using MP7 mode; legacy MC bit: " << legacy_mc;
204  payload.reset(new MP7Payload(start, end, legacy_mc));
205  }
206  unsigned fw = payload->getAlgorithmFWVersion();
207 
208  // Let parameterset value override FW version
209  if (fwOverride_)
210  fw = fwId_;
211 
212  unsigned board = amc.blockHeader().getBoardID();
213  unsigned amc_no = amc.blockHeader().getAMCNumber();
214 
215  auto unpackers = prov_->getUnpackers(fedId, board, amc_no, fw);
216 
217  // getBlock() returns a non-null auto_ptr on success
218  std::auto_ptr<Block> block;
219  while ((block = payload->getBlock()).get()) {
220  if (debug_) {
221  std::cout << ">>> block to unpack <<<" << std::endl
222  << "hdr: " << std::hex << std::setw(8) << std::setfill('0') << block->header().raw() << std::dec
223  << " (ID " << block->header().getID() << ", size " << block->header().getSize()
224  << ", CapID 0x" << std::hex << std::setw(2) << std::setfill('0') << block->header().getCapID()
225  << ")" << std::dec << std::endl;
226  for (const auto& word: block->payload()) {
227  std::cout << "data: " << std::hex << std::setw(8) << std::setfill('0') << word << std::dec << std::endl;
228  }
229  }
230 
231  auto unpacker = unpackers.find(block->header().getID());
232 
233  block->amc(amc.header());
234 
235  if (unpacker == unpackers.end()) {
236  LogDebug("L1T") << "Cannot find an unpacker for"
237  << "\n\tblock: ID " << block->header().getID() << ", size " << block->header().getSize()
238  << "\n\tAMC: # " << amc_no << ", board ID 0x" << std::hex << board << std::dec
239  << "\n\tFED ID " << fedId << ", and FW ID " << fw;
240  // TODO Handle error
241  } else if (!unpacker->second->unpack(*block, coll.get())) {
242  LogDebug("L1T") << "Error unpacking data for block ID "
243  << block->header().getID() << ", AMC # " << amc_no
244  << ", board ID " << board << ", FED ID " << fedId
245  << ", and FW ID " << fw << "!";
246  // TODO Handle error
247  }
248  }
249  }
250  }
251  }
252 
253  // ------------ method fills 'descriptions' with the allowed parameters for the module ------------
254  void
257  desc.add<unsigned int>("FWId",-1)->setComment("32 bits: if the first eight bits are 0xff, will read the 74x MC format - but need to have FWOverride=true");
258  desc.add<bool>("FWOverride", false);
259  desc.addUntracked<bool>("CTP7", false);
260  desc.add<edm::InputTag>("InputLabel",edm::InputTag("rawDataCollector"));
261  desc.add<std::vector<int>>("FedIds", {});
262  desc.add<std::string>("Setup", "");
263  desc.addUntracked<int>("lenSlinkHeader", 8);
264  desc.addUntracked<int>("lenSlinkTrailer", 8);
265  desc.addUntracked<int>("lenAMCHeader", 8);
266  desc.addUntracked<int>("lenAMCTrailer", 0);
267  desc.addUntracked<int>("lenAMC13Header", 8);
268  desc.addUntracked<int>("lenAMC13Trailer", 8);
269  desc.addUntracked<bool>("debug", false)->setComment("turn on verbose output");
270  descriptions.add("l1tRawToDigi", desc);
271  }
272 }
273 
274 using namespace l1t;
275 //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
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:86
int sourceID()
Identifier of the FED.
Definition: FEDHeader.cc:28
double amc
Definition: hdecay.h:20
std::vector< int > fedIds_
Definition: L1TRawToDigi.cc:61
The Signals That Services Can Subscribe To This is based on ActivityRegistry h
Helper function to determine trigger accepts.
Definition: Activities.doc:4
#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)
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:121
volatile std::atomic< bool > shutdown_flag false
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