CMS 3D CMS Logo

SiStripFEDDataCheck.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: DQM/SiStripMonitorHardware
4 // Class: SiStripFEDCheckPlugin
5 //
10 //
11 // Original Author: Nicholas Cripps
12 // Created: 2008/09/16
13 //
14 //
15 #include <memory>
16 
30 
37 
40 
42 
44 
45 #include "DQM/SiStripMonitorHardware/interface/FEDErrors.hh"
46 
48 
49 //
50 // Class declaration
51 //
52 
54 public:
56  ~SiStripFEDCheckPlugin() override;
57  static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
58 
59 private:
60  void analyze(const edm::Event&, const edm::EventSetup&) override;
61  void dqmEndRun(edm::Run const&, edm::EventSetup const&) override;
62 
63  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
64 
65  bool hasFatalError(const FEDRawData& fedData, unsigned int fedId) const;
66  bool hasNonFatalError(const FEDRawData& fedData, unsigned int fedId) const;
67  void updateCabling(const edm::EventSetup& eventSetup);
68 
69  inline void fillPresent(unsigned int fedId, bool present);
70  inline void fillFatalError(unsigned int fedId, bool fatalError);
71  inline void fillNonFatalError(unsigned int fedId, float nonFatalError);
72 
73  void doUpdateIfNeeded();
74  void updateHistograms();
75 
80 
81  //Histograms
87 
90 
91  //For histogram cache
92  unsigned int
93  updateFrequency_; //Update histograms with cached values every n events. If zero then fill normally every event
94  //cache values
95  std::vector<unsigned int> fedsPresentBinContents_;
96  std::vector<unsigned int> fedFatalErrorBinContents_;
97  std::vector<unsigned int> fedNonFatalErrorBinContents_;
98  unsigned int eventCount_; //incremented by doUpdateIfNeeded()
99 
100  //Fine grained control of tests
102 
103  //Cabling
104  uint32_t cablingCacheId_;
106 
107  unsigned int siStripFedIdMin_;
108  unsigned int siStripFedIdMax_;
109 
111 };
112 
113 //
114 // Constructors and destructor
115 //
116 
118  : rawDataTag_(iConfig.getParameter<edm::InputTag>("RawDataTag")),
119  dirName_(iConfig.getUntrackedParameter<std::string>("DirName", "SiStrip/FEDIntegrity/")),
120  printDebug_(iConfig.getUntrackedParameter<bool>("PrintDebugMessages", false)),
121  doPLOTfedsPresent_(iConfig.getParameter<bool>("doPLOTfedsPresent")),
122  doPLOTfedFatalErrors_(iConfig.getParameter<bool>("doPLOTfedFatalErrors")),
123  doPLOTfedNonFatalErrors_(iConfig.getParameter<bool>("doPLOTfedNonFatalErrors")),
124  doPLOTnFEDinVsLS_(iConfig.getParameter<bool>("doPLOTnFEDinVsLS")),
125  doPLOTnFEDinWdataVsLS_(iConfig.getParameter<bool>("doPLOTnFEDinWdataVsLS")),
131  updateFrequency_(iConfig.getUntrackedParameter<unsigned int>("HistogramUpdateFrequency", 0)),
132  fedsPresentBinContents_(FEDNumbering::MAXSiStripFEDID + 1, 0),
133  fedFatalErrorBinContents_(FEDNumbering::MAXSiStripFEDID + 1, 0),
134  fedNonFatalErrorBinContents_(FEDNumbering::MAXSiStripFEDID + 1, 0),
135  eventCount_(0),
136  doPayloadChecks_(iConfig.getUntrackedParameter<bool>("DoPayloadChecks", true)),
137  checkChannelLengths_(iConfig.getUntrackedParameter<bool>("CheckChannelLengths", true)),
138  checkPacketCodes_(iConfig.getUntrackedParameter<bool>("CheckChannelPacketCodes", true)),
139  checkFELengths_(iConfig.getUntrackedParameter<bool>("CheckFELengths", true)),
140  checkChannelStatusBits_(iConfig.getUntrackedParameter<bool>("CheckChannelStatus", true)),
141  verbose_(iConfig.getUntrackedParameter<bool>("verbose", false)),
142  cablingCacheId_(0) {
143  rawDataToken_ = consumes<FEDRawDataCollection>(rawDataTag_);
145  std::stringstream ss;
146  ss << "Payload checks are disabled but individual payload checks have been enabled. The following payload checks "
147  "will be skipped: ";
149  ss << "Channel length check, ";
150  if (checkPacketCodes_)
151  ss << "Channel packet code check, ";
153  ss << "Cabled channel status bits checks, ";
154  if (checkFELengths_)
155  ss << "FE Unit legnth check";
156  edm::LogWarning("SiStripFEDCheck") << ss.str();
157  }
158 
161 
162  conf_ = iConfig;
163 }
164 
166 
167 //
168 // Member functions
169 //
170 
171 // ------------ method called to for each event ------------
173  //Retrieve tracker topology from geometry
174  edm::ESHandle<TrackerTopology> tTopoHandle;
175  iSetup.get<TrackerTopologyRcd>().get(tTopoHandle);
176  const TrackerTopology* const tTopo = tTopoHandle.product();
177 
178  //update cabling
179  updateCabling(iSetup);
180 
181  //get raw data
182  edm::Handle<FEDRawDataCollection> rawDataCollectionHandle;
183  const bool gotData = iEvent.getByToken(rawDataToken_, rawDataCollectionHandle);
184  if (verbose_)
185  std::cout << "[SiStripFEDCheckPlugin::analyze] gotData ? " << (gotData ? "YES" : "NOPE") << std::endl;
186  if (!gotData) {
187  //module is required to silently do nothing when data is not present
188  return;
189  }
190  const FEDRawDataCollection& rawDataCollection = *rawDataCollectionHandle;
191 
192  //FED errors
193  FEDErrors lFedErrors;
194 
195  //loop over siStrip FED IDs
196  size_t nFEDin = 0;
197  size_t nFEDinWdata = 0;
198  for (unsigned int fedId = siStripFedIdMin_; fedId <= siStripFedIdMax_; fedId++) {
199  const FEDRawData& fedData = rawDataCollection.FEDData(fedId);
200 
201  //create an object to fill all errors
202  //third param to false:save time by not initialising anything not used here
203  lFedErrors.initialiseFED(fedId, cabling_, tTopo, false);
204 
205  //check data exists
206  if (!fedData.size() || !fedData.data()) {
207  fillPresent(fedId, false);
208  continue;
209  }
210  if (verbose_)
211  std::cout << "FED " << fedId;
212  if (verbose_)
213  std::cout << " fedData.size(): " << fedData.size();
214  if (verbose_)
215  std::cout << " fedData.data(): " << fedData.data() << std::endl;
216  if (fedData.size())
217  nFEDin++;
218  if (fedData.size() && fedData.data())
219  nFEDinWdata++;
220 
221  //fill buffer present histogram
222  fillPresent(fedId, true);
223 
224  //check for fatal errors
225  //no need for debug output
226  bool hasFatalErrors = false;
227  float rateNonFatal = 0;
228 
229  std::unique_ptr<const sistrip::FEDBuffer> buffer;
230 
231  if (!lFedErrors.fillFatalFEDErrors(fedData, 0)) {
232  hasFatalErrors = true;
233  } else {
234  //need to construct full object to go any further
236  buffer.reset(new sistrip::FEDBuffer(fedData.data(), fedData.size(), true));
237  if (doPayloadChecks_) {
238  bool channelLengthsOK = checkChannelLengths_ ? buffer->checkChannelLengthsMatchBufferLength() : true;
239  bool channelPacketCodesOK = checkPacketCodes_ ? buffer->checkChannelPacketCodes() : true;
240  bool feLengthsOK = checkFELengths_ ? buffer->checkFEUnitLengths() : true;
241  if (!channelLengthsOK || !channelPacketCodesOK || !feLengthsOK) {
242  hasFatalErrors = true;
243  }
244  }
246  rateNonFatal = lFedErrors.fillNonFatalFEDErrors(buffer.get(), cabling_);
247  }
248  }
249 
250  if (hasFatalErrors) {
251  fillFatalError(fedId, true);
252  if (printDebug_) {
253  if (!buffer.get())
254  buffer.reset(new sistrip::FEDBuffer(fedData.data(), fedData.size(), true));
255  edm::LogInfo("SiStripFEDCheck") << "Fatal error with FED ID " << fedId << ". Check summary: " << std::endl
256  << buffer->checkSummary() << std::endl;
257  std::stringstream ss;
258  buffer->dump(ss);
259  edm::LogInfo("SiStripFEDCheck") << ss.str();
260  }
261  } else {
262  fillFatalError(fedId, false);
263  //fill non-fatal errors histogram if there were no fatal errors
264  fillNonFatalError(fedId, rateNonFatal);
265  if (printDebug_ && rateNonFatal > 0) {
266  if (!buffer.get())
267  buffer.reset(new sistrip::FEDBuffer(fedData.data(), fedData.size(), true));
268  edm::LogInfo("SiStripFEDCheck") << "Non-fatal error with FED ID " << fedId << " for " << rateNonFatal
269  << " of the channels. Check summary: " << std::endl
270  << buffer->checkSummary() << std::endl;
271  std::stringstream ss;
272  buffer->dump(ss);
273  edm::LogInfo("SiStripFEDCheck") << ss.str();
274  }
275  }
276  } //loop over FED IDs
277  if (verbose_)
278  std::cout << "nFEDin: " << nFEDin << " nFEDinWdata: " << nFEDinWdata << std::endl;
279  if (doPLOTnFEDinVsLS_)
280  nFEDinVsLS_->Fill(static_cast<double>(iEvent.id().luminosityBlock()), nFEDin);
282  nFEDinWdataVsLS_->Fill(static_cast<double>(iEvent.id().luminosityBlock()), nFEDinWdata);
283 
284  //update histograms if needed
286 }
287 
288 // ------------ method called once each job just before starting event loop ------------
290  const edm::Run& run,
291  const edm::EventSetup& eSetup) {
292  size_t nFED = siStripFedIdMax_ - siStripFedIdMin_ + 1;
293  double xFEDmin = siStripFedIdMin_ - 0.5;
294  double xFEDmax = siStripFedIdMax_ + 0.5;
295 
296  //get DQM store
297  ibooker.setCurrentFolder(dirName_);
298  //book histograms
299  if (doPLOTfedsPresent_) {
300  fedsPresent_ =
301  ibooker.book1D("FEDEntries", "Number of times FED buffer is present in data", nFED, xFEDmin, xFEDmax);
302  fedsPresent_->setAxisTitle("FED-ID", 1);
303  }
304 
305  if (doPLOTfedFatalErrors_) {
306  fedFatalErrors_ = ibooker.book1D("FEDFatal", "Number of fatal errors in FED buffer", nFED, xFEDmin, xFEDmax);
307  fedFatalErrors_->setAxisTitle("FED-ID", 1);
308  }
309 
312  ibooker.book1D("FEDNonFatal", "Number of non fatal errors in FED buffer", nFED, xFEDmin, xFEDmax);
313  fedNonFatalErrors_->setAxisTitle("FED-ID", 1);
314  }
315 
316  int LSBin = conf_.getParameter<int>("LSBin");
317  double LSMin = conf_.getParameter<double>("LSMin");
318  double LSMax = conf_.getParameter<double>("LSMax");
319 
320  if (doPLOTnFEDinVsLS_) {
321  nFEDinVsLS_ =
322  ibooker.bookProfile("nFEDinVsLS", "number of FED in Vs LS", LSBin, LSMin, LSMax, nFED, xFEDmin, xFEDmax);
323  nFEDinVsLS_->setAxisTitle("LS", 1);
324  nFEDinVsLS_->setAxisTitle("FED-ID", 2);
325  }
326 
328  nFEDinWdataVsLS_ = ibooker.bookProfile(
329  "nFEDinWdataVsLS", "number of FED in (with data) Vs LS", LSBin, LSMin, LSMax, nFED, xFEDmin, xFEDmax);
330  nFEDinWdataVsLS_->setAxisTitle("LS", 1);
331  nFEDinWdataVsLS_->setAxisTitle("FED-ID", 2);
332  }
333 }
334 
335 // ------------ method called once each run just after ending the event loop ------------
337 
339  uint32_t currentCacheId = eventSetup.get<SiStripFedCablingRcd>().cacheIdentifier();
340  if (cablingCacheId_ != currentCacheId) {
341  edm::ESHandle<SiStripFedCabling> cablingHandle;
342  eventSetup.get<SiStripFedCablingRcd>().get(cablingHandle);
343  cabling_ = cablingHandle.product();
344  cablingCacheId_ = currentCacheId;
345  }
346 }
347 
348 void SiStripFEDCheckPlugin::fillPresent(unsigned int fedId, bool present) {
349  if (present) {
350  if (updateFrequency_)
352  else if (doPLOTfedsPresent_)
353  fedsPresent_->Fill(fedId);
354  }
355 }
356 
357 void SiStripFEDCheckPlugin::fillFatalError(unsigned int fedId, bool fatalError) {
358  if (updateFrequency_) {
359  if (fatalError)
361  } else {
362  //fedFatalErrors_->Fill( fatalError ? 1 : 0 );
363  if (fatalError)
365  fedFatalErrors_->Fill(fedId);
366  }
367 }
368 
369 void SiStripFEDCheckPlugin::fillNonFatalError(unsigned int fedId, float nonFatalError) {
370  if (updateFrequency_) {
371  if (nonFatalError > 0)
372  fedNonFatalErrorBinContents_[fedId]++; //nonFatalError;
373  } else {
374  if (nonFatalError > 0)
376  fedNonFatalErrors_->Fill(fedId);
377  }
378 }
379 
381  eventCount_++;
384  }
385 }
386 
388  //if the cache is not being used then do nothing
389  if (!updateFrequency_)
390  return;
391  unsigned int entriesFedsPresent = 0;
392  unsigned int entriesFatalErrors = 0;
393  unsigned int entriesNonFatalErrors = 0;
394  for (unsigned int fedId = siStripFedIdMin_, bin = 1; fedId < siStripFedIdMax_ + 1; fedId++, bin++) {
395  unsigned int fedsPresentBin = fedsPresentBinContents_[fedId];
396  if (doPLOTfedsPresent_)
397  fedsPresent_->getTH1()->SetBinContent(bin, fedsPresentBin);
398  entriesFedsPresent += fedsPresentBin;
399  unsigned int fedFatalErrorsBin = fedFatalErrorBinContents_[fedId];
401  fedFatalErrors_->getTH1()->SetBinContent(bin, fedFatalErrorsBin);
402  entriesFatalErrors += fedFatalErrorsBin;
403  unsigned int fedNonFatalErrorsBin = fedNonFatalErrorBinContents_[fedId];
405  fedNonFatalErrors_->getTH1()->SetBinContent(bin, fedNonFatalErrorsBin);
406  entriesNonFatalErrors += fedNonFatalErrorsBin;
407  }
408  if (doPLOTfedsPresent_)
409  fedsPresent_->getTH1()->SetEntries(entriesFedsPresent);
411  fedFatalErrors_->getTH1()->SetEntries(entriesFatalErrors);
413  fedNonFatalErrors_->getTH1()->SetEntries(entriesNonFatalErrors);
414 }
417 
418  // Directory to book histograms in
419  desc.addUntracked<std::string>("DirName", "SiStrip/FEDIntegrity/");
420  // Raw data collection
421  desc.add<edm::InputTag>("RawDataTag", edm::InputTag("source"));
422  // Number of events to cache info before updating histograms
423  // (set to zero to disable cache)
424  // HistogramUpdateFrequency = cms.untracked.uint32(0),
425  desc.addUntracked<unsigned int>("HistogramUpdateFrequency", 1000);
426  // Print info about errors buffer dumps to LogInfo(SiStripFEDCheck)
427  desc.addUntracked<bool>("PrintDebugMessages", false);
428  desc.add<bool>("doPLOTfedsPresent", true);
429  desc.add<bool>("doPLOTfedFatalErrors", true);
430  desc.add<bool>("doPLOTfedNonFatalErrors", true);
431  desc.add<bool>("doPLOTnFEDinVsLS", false);
432  desc.add<bool>("doPLOTnFEDinWdataVsLS", false);
433  // Write the DQM store to a file (DQMStore.root) at the end of the run
434  desc.addUntracked<bool>("WriteDQMStore", false);
435  // Use to disable all payload (non-fatal) checks
436  desc.addUntracked<bool>("DoPayloadChecks", true);
437  // Use to disable check on channel lengths
438  desc.addUntracked<bool>("CheckChannelLengths", true);
439  // Use to disable check on channel packet codes
440  desc.addUntracked<bool>("CheckChannelPacketCodes", true);
441  // Use to disable check on FE unit lengths in full debug header
442  desc.addUntracked<bool>("CheckFELengths", true);
443  // Use to disable check on channel status bits
444  desc.addUntracked<bool>("CheckChannelStatus", true);
445  desc.add<int>("LSBin", 5000);
446  desc.add<double>("LSMin", 0.5);
447  desc.add<double>("LSMax", 5000.5);
448 
449  descriptions.addDefault(desc);
450 }
451 
452 //
453 // Define as a plug-in
454 //
455 
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
T getParameter(std::string const &) const
void dqmEndRun(edm::Run const &, edm::EventSetup const &) override
MonitorElement * nFEDinWdataVsLS_
ParameterDescriptionBase * addUntracked(U const &iLabel, T const &value)
void fillFatalError(unsigned int fedId, bool fatalError)
edm::EDGetTokenT< FEDRawDataCollection > rawDataToken_
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
const SiStripFedCabling * cabling_
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
#define nullptr
bool hasNonFatalError(const FEDRawData &fedData, unsigned int fedId) const
MonitorElement * fedNonFatalErrors_
LuminosityBlockNumber_t luminosityBlock() const
Definition: EventID.h:39
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
void Fill(long long x)
static void fillDescriptions(edm::ConfigurationDescriptions &descriptions)
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
void addDefault(ParameterSetDescription const &psetDescription)
void analyze(const edm::Event &, const edm::EventSetup &) override
MonitorElement * bookProfile(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, char const *option="s")
Definition: DQMStore.cc:333
ParameterDescriptionBase * add(U const &iLabel, T const &value)
std::vector< unsigned int > fedFatalErrorBinContents_
std::vector< unsigned int > fedsPresentBinContents_
Constants and enumerated types for FED/FEC systems.
MonitorElement * nFEDinVsLS_
bool hasFatalError(const FEDRawData &fedData, unsigned int fedId) const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
edm::EventID id() const
Definition: EventBase.h:59
SiStripFEDCheckPlugin(const edm::ParameterSet &)
HLT enums.
T get() const
Definition: EventSetup.h:73
const unsigned char * data() const
Return a const pointer to the beginning of the data buffer.
Definition: FEDRawData.cc:24
void updateCabling(const edm::EventSetup &eventSetup)
MonitorElement * fedFatalErrors_
MonitorElement * fedsPresent_
void fillNonFatalError(unsigned int fedId, float nonFatalError)
T const * product() const
Definition: ESHandle.h:86
std::vector< unsigned int > fedNonFatalErrorBinContents_
Definition: Run.h:45
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void fillPresent(unsigned int fedId, bool present)
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)