CMS 3D CMS Logo

SiStripFEDMonitor.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: DQM/SiStripMonitorHardware
4 // Class: SiStripFEDMonitorPlugin
5 //
10 //
11 // Original Author: Nicholas Cripps
12 // Created: 2008/09/16
13 //
14 //Modified : Anne-Marie Magnan
15 // ---- 2009/04/21 : histogram management put in separate class
16 // struct helper to simplify arguments of functions
17 // ---- 2009/04/22 : add TkHistoMap with % of bad channels per module
18 // ---- 2009/04/27 : create FEDErrors class
19 
20 #include <sstream>
21 #include <memory>
22 #include <list>
23 #include <algorithm>
24 #include <cassert>
25 
37 
44 
47 
49 
50 #include "DQM/SiStripMonitorHardware/interface/FEDHistograms.hh"
51 #include "DQM/SiStripMonitorHardware/interface/FEDErrors.hh"
52 
54 
56 
57 //
58 // Class declaration
59 //
60 
61 //class SiStripFEDMonitorPlugin : public DQMOneLumiEDAnalyzer<> {
62 
63 namespace sifedmon {
64  struct LumiErrors {
65  std::vector<unsigned int> nTotal;
66  std::vector<unsigned int> nErrors;
67  };
68 } // namespace sifedmon
69 class SiStripFEDMonitorPlugin : public DQMOneEDAnalyzer<edm::LuminosityBlockCache<sifedmon::LumiErrors> > {
70 public:
72  ~SiStripFEDMonitorPlugin() override;
73 
74 private:
75  void analyze(const edm::Event&, const edm::EventSetup&) override;
76 
77  std::shared_ptr<sifedmon::LumiErrors> globalBeginLuminosityBlock(const edm::LuminosityBlock& lumi,
78  const edm::EventSetup& iSetup) const override;
79 
80  void globalEndLuminosityBlock(const edm::LuminosityBlock& lumi, const edm::EventSetup& iSetup) override;
81 
82  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
83 
84  //update the cabling if necessary
85  void updateCabling(const SiStripFedCablingRcd& cablingRcd);
86 
87  static bool pairComparison(const std::pair<unsigned int, unsigned int>& pair1,
88  const std::pair<unsigned int, unsigned int>& pair2);
89 
90  void getMajority(const std::vector<std::pair<unsigned int, unsigned int> >& aFeMajVec,
91  unsigned int& aMajorityCounter,
92  std::vector<unsigned int>& afedIds);
93 
94  //tag of FEDRawData collection
98 
99  //histogram helper class
100  FEDHistograms fedHists_;
101  //folder name for histograms in DQMStore
104  //book detailed histograms even if they will be empty (for merging)
106  //do histos vs time with time=event number. Default time = orbit number (s)
108  //print debug messages when problems are found: 1=error debug, 2=light debug, 3=full debug
109  unsigned int printDebug_;
110  //FED cabling
112 
117 
118  //add parameter to save computing time if TkHistoMap/Median/FeMajCheck are not enabled
122 
123  unsigned int nEvt_;
124 
125  //FED errors
126  //need class member for lumi histograms
127  FEDErrors fedErrors_;
128  unsigned int maxFedBufferSize_;
130 
133 };
134 
135 //
136 // Constructors and destructor
137 //
138 
140  : rawDataTag_(iConfig.getUntrackedParameter<edm::InputTag>("RawDataTag", edm::InputTag("source", ""))),
141  topFolderName_(iConfig.getUntrackedParameter<std::string>("TopFolderName", "SiStrip")),
142  fillAllDetailedHistograms_(iConfig.getUntrackedParameter<bool>("FillAllDetailedHistograms", false)),
143  fillWithEvtNum_(iConfig.getUntrackedParameter<bool>("FillWithEventNumber", false)),
144  printDebug_(iConfig.getUntrackedParameter<unsigned int>("PrintDebugMessages", 1)),
145  fedCablingWatcher_(this, &SiStripFEDMonitorPlugin::updateCabling),
146  fedCablingToken_(esConsumes<>()),
147  tTopoToken_(esConsumes<>()),
148  tkDetMapToken_(esConsumes<edm::Transition::BeginRun>()),
149  maxFedBufferSize_(0),
150  fullDebugMode_(iConfig.getUntrackedParameter<bool>("FullDebugMode", false)) {
151  std::string subFolderName = iConfig.getUntrackedParameter<std::string>("HistogramFolderName", "ReadoutView");
152  folderName_ = topFolderName_ + "/" + subFolderName;
153 
154  rawDataToken_ = consumes<FEDRawDataCollection>(rawDataTag_);
155  heToken_ = consumes<EventWithHistory>(edm::InputTag("consecutiveHEs"));
156 
157  if (iConfig.exists("ErrorFractionByLumiBlockHistogramConfig")) {
158  const edm::ParameterSet& ps =
159  iConfig.getUntrackedParameter<edm::ParameterSet>("ErrorFractionByLumiBlockHistogramConfig");
160  enableFEDerrLumi_ = (ps.exists("Enabled") ? ps.getUntrackedParameter<bool>("Enabled") : true);
161  }
162  //print config to debug log
163  std::ostringstream debugStream;
164  if (printDebug_ > 1) {
165  debugStream << "[SiStripFEDMonitorPlugin]Configuration for SiStripFEDMonitorPlugin: " << std::endl
166  << "[SiStripFEDMonitorPlugin]\tRawDataTag: " << rawDataTag_ << std::endl
167  << "[SiStripFEDMonitorPlugin]\tHistogramFolderName: " << folderName_ << std::endl
168  << "[SiStripFEDMonitorPlugin]\tFillAllDetailedHistograms? "
169  << (fillAllDetailedHistograms_ ? "yes" : "no") << std::endl
170  << "[SiStripFEDMonitorPlugin]\tFillWithEventNumber?" << (fillWithEvtNum_ ? "yes" : "no") << std::endl
171  << "[SiStripFEDMonitorPlugin]\tPrintDebugMessages? " << (printDebug_ ? "yes" : "no") << std::endl;
172  }
173 
174  //don;t generate debug mesages if debug is disabled
175  std::ostringstream* pDebugStream = (printDebug_ > 1 ? &debugStream : nullptr);
176 
177  fedHists_.initialise(iConfig, pDebugStream);
178 
179  doTkHistoMap_ = fedHists_.tkHistoMapEnabled();
180 
181  doMedHists_ = fedHists_.cmHistosEnabled();
182 
183  doFEMajorityCheck_ = fedHists_.feMajHistosEnabled();
184 
185  if (printDebug_) {
186  LogTrace("SiStripMonitorHardware") << debugStream.str();
187  }
188 
189  nEvt_ = 0;
190 }
191 
193 
194 //
195 // Member functions
196 //
197 
198 // ------------ method called to for each event ------------
200  const auto tTopo = &iSetup.getData(tTopoToken_);
201  fedCablingWatcher_.check(iSetup);
202 
203  //get raw data
204  edm::Handle<FEDRawDataCollection> rawDataCollectionHandle;
205  iEvent.getByToken(rawDataToken_, rawDataCollectionHandle);
206  const FEDRawDataCollection& rawDataCollection = *rawDataCollectionHandle;
207 
208  fedErrors_.initialiseEvent();
209 
210  //add the deltaBX value if the product exist
211 
213  iEvent.getByToken(heToken_, he);
214 
215  //get the fedErrors object for each LS
216  auto lumiErrors = luminosityBlockCache(iEvent.getLuminosityBlock().index());
217  auto& nToterr = lumiErrors->nTotal;
218  auto& nErr = lumiErrors->nErrors;
219 
220  if (he.isValid() && !he.failedToGet()) {
221  fedErrors_.fillEventProperties(he->deltaBX());
222  }
223 
224  //initialise map of fedId/bad channel number
225  std::map<unsigned int, std::pair<unsigned short, unsigned short> > badChannelFraction;
226 
227  unsigned int lNFEDMonitoring = 0;
228  unsigned int lNFEDUnpacker = 0;
229  unsigned int lNChannelMonitoring = 0;
230  unsigned int lNChannelUnpacker = 0;
231 
232  unsigned int lNTotBadFeds = 0;
233  unsigned int lNTotBadChannels = 0;
234  unsigned int lNTotBadActiveChannels = 0;
235 
236  std::vector<std::vector<std::pair<unsigned int, unsigned int> > > lFeMajFrac;
237  const unsigned int nParts = 4;
238  if (doFEMajorityCheck_) {
239  lFeMajFrac.resize(nParts);
240  //max nFE per partition
241  lFeMajFrac[0].reserve(912);
242  lFeMajFrac[1].reserve(1080);
243  lFeMajFrac[2].reserve(768);
244  lFeMajFrac[3].reserve(760);
245  }
246 
247  maxFedBufferSize_ = 0;
248 
249  //loop over siStrip FED IDs
251  fedId++) { //loop over FED IDs
252  unsigned int lNBadChannels_perFEDID = 0;
253  const FEDRawData& fedData = rawDataCollection.FEDData(fedId);
254 
255  //create an object to fill all errors
256  fedErrors_.initialiseFED(fedId, cabling_, tTopo);
257 
258  double aLumiSection = iEvent.orbitNumber() / 262144.0;
259 
260  //Do detailed check
261  //first check if data exists
262  bool lDataExist = fedErrors_.checkDataPresent(fedData);
263  if (!lDataExist) {
264  fedHists_.fillFEDHistograms(fedErrors_, 0, fullDebugMode_, aLumiSection, lNBadChannels_perFEDID);
265  continue;
266  }
267 
268  //check for problems and fill detailed histograms
269  fedErrors_.fillFEDErrors(fedData,
271  printDebug_,
272  lNChannelMonitoring,
273  lNChannelUnpacker,
274  doMedHists_,
275  fedHists_.cmHistPointer(false),
276  fedHists_.cmHistPointer(true),
278  lFeMajFrac);
279 
280  //check filled in previous method.
281  bool lFailUnpackerFEDcheck = fedErrors_.failUnpackerFEDCheck();
282 
283  fedErrors_.incrementFEDCounters();
284  unsigned int lSize = fedData.size();
285  if (lSize > maxFedBufferSize_) {
286  maxFedBufferSize_ = lSize;
287  }
288  //std::cout << " -- " << fedId << " " << lSize << std::endl;
289 
290  //fedHists_.fillFEDHistograms(fedErrors_,lSize,fullDebugMode_);
291 
292  bool lFailMonitoringFEDcheck = fedErrors_.failMonitoringFEDCheck();
293  if (lFailMonitoringFEDcheck)
294  lNTotBadFeds++;
295 
296  //sanity check: if something changed in the unpacking code
297  //but wasn't propagated here
298  //print only the summary, and more info if printDebug>1
299  if (lFailMonitoringFEDcheck != lFailUnpackerFEDcheck) {
300  if (printDebug_ > 1) {
301  std::ostringstream debugStream;
302  debugStream << " --- WARNING: FED " << fedId << std::endl << " ------ Monitoring FED check ";
303  if (lFailMonitoringFEDcheck)
304  debugStream << "failed." << std::endl;
305  else
306  debugStream << "passed." << std::endl;
307  debugStream << " ------ Unpacker FED check ";
308  if (lFailUnpackerFEDcheck)
309  debugStream << "failed." << std::endl;
310  else
311  debugStream << "passed." << std::endl;
312  edm::LogError("SiStripMonitorHardware") << debugStream.str();
313  }
314 
315  if (lFailMonitoringFEDcheck)
316  lNFEDMonitoring++;
317  else if (lFailUnpackerFEDcheck)
318  lNFEDUnpacker++;
319  }
320 
321  //Fill TkHistoMap:
322  //add an entry for all channels (good = 0),
323  //so that tkHistoMap knows which channels should be there.
324  if (doTkHistoMap_ && !fedHists_.tkHistoMapPointer()) {
325  edm::LogWarning("SiStripMonitorHardware")
326  << " -- Fedid " << fedId << ", TkHistoMap enabled but pointer is null." << std::endl;
327  }
328 
329  fedErrors_.fillBadChannelList(doTkHistoMap_,
330  fedHists_.tkHistoMapPointer(),
331  fedHists_.getFedvsAPVpointer(),
332  lNTotBadChannels,
333  lNTotBadActiveChannels,
334  lNBadChannels_perFEDID,
335  nToterr,
336  nErr);
337  fedHists_.fillFEDHistograms(fedErrors_, lSize, fullDebugMode_, aLumiSection, lNBadChannels_perFEDID);
338  } //loop over FED IDs
339 
340  if (doFEMajorityCheck_) {
341  for (unsigned int iP(0); iP < nParts; ++iP) {
342  //std::cout << " -- Partition " << iP << std::endl;
343  //std::cout << " --- Number of elements in vec = " << lFeMajFrac[iP].size() << std::endl;
344  if (lFeMajFrac[iP].empty())
345  continue;
346  std::sort(lFeMajFrac[iP].begin(), lFeMajFrac[iP].end(), SiStripFEDMonitorPlugin::pairComparison);
347 
348  unsigned int lMajorityCounter = 0;
349  std::vector<unsigned int> lfedIds;
350 
351  getMajority(lFeMajFrac[iP], lMajorityCounter, lfedIds);
352  //std::cout << " -- Found " << lfedIds.size() << " unique elements not matching the majority." << std::endl;
353  fedHists_.fillMajorityHistograms(iP, static_cast<float>(lMajorityCounter) / lFeMajFrac[iP].size(), lfedIds);
354  }
355  }
356 
357  if ((lNTotBadFeds > 0 || lNTotBadChannels > 0) && printDebug_ > 1) {
358  std::ostringstream debugStream;
359  debugStream << "[SiStripFEDMonitorPlugin] --- Total number of bad feds = " << lNTotBadFeds << std::endl
360  << "[SiStripFEDMonitorPlugin] --- Total number of bad channels = " << lNTotBadChannels << std::endl
361  << "[SiStripFEDMonitorPlugin] --- Total number of bad active channels = " << lNTotBadActiveChannels
362  << std::endl;
363  edm::LogInfo("SiStripMonitorHardware") << debugStream.str();
364  }
365 
366  if ((lNFEDMonitoring > 0 || lNFEDUnpacker > 0 || lNChannelMonitoring > 0 || lNChannelUnpacker > 0) && printDebug_) {
367  std::ostringstream debugStream;
368  debugStream
369  << "[SiStripFEDMonitorPlugin]-------------------------------------------------------------------------"
370  << std::endl
371  << "[SiStripFEDMonitorPlugin]-------------------------------------------------------------------------"
372  << std::endl
373  << "[SiStripFEDMonitorPlugin]-- Summary of differences between unpacker and monitoring at FED level : "
374  << std::endl
375  << "[SiStripFEDMonitorPlugin] ---- Number of times monitoring fails but not unpacking = " << lNFEDMonitoring
376  << std::endl
377  << "[SiStripFEDMonitorPlugin] ---- Number of times unpacking fails but not monitoring = " << lNFEDUnpacker
378  << std::endl
379  << "[SiStripFEDMonitorPlugin]-------------------------------------------------------------------------"
380  << std::endl
381  << "[SiStripFEDMonitorPlugin]-- Summary of differences between unpacker and monitoring at Channel level : "
382  << std::endl
383  << "[SiStripFEDMonitorPlugin] ---- Number of times monitoring fails but not unpacking = " << lNChannelMonitoring
384  << std::endl
385  << "[SiStripFEDMonitorPlugin] ---- Number of times unpacking fails but not monitoring = " << lNChannelUnpacker
386  << std::endl
387  << "[SiStripFEDMonitorPlugin]-------------------------------------------------------------------------"
388  << std::endl
389  << "[SiStripFEDMonitorPlugin]-------------------------------------------------------------------------"
390  << std::endl;
391  edm::LogError("SiStripMonitorHardware") << debugStream.str();
392  }
393 
394  fedErrors_.getFEDErrorsCounters().nTotalBadChannels = lNTotBadChannels;
395  fedErrors_.getFEDErrorsCounters().nTotalBadActiveChannels = lNTotBadActiveChannels;
396 
397  //time in seconds since beginning of the run or event number
398  if (fillWithEvtNum_) {
399  // explicitely casting the event number unsigned long long to double here
400  double eventNumber = static_cast<double>(iEvent.id().event());
401  fedHists_.fillCountersHistograms(
402  fedErrors_.getFEDErrorsCounters(), fedErrors_.getChannelErrorsCounters(), maxFedBufferSize_, eventNumber);
403  } else {
404  double aTime = iEvent.orbitNumber() / 11223.;
405  fedHists_.fillCountersHistograms(
406  fedErrors_.getFEDErrorsCounters(), fedErrors_.getChannelErrorsCounters(), maxFedBufferSize_, aTime);
407  }
408 
409  nEvt_++;
410 
411 } //analyze method
412 
413 bool SiStripFEDMonitorPlugin::pairComparison(const std::pair<unsigned int, unsigned int>& pair1,
414  const std::pair<unsigned int, unsigned int>& pair2) {
415  return (pair1.second < pair2.second);
416 }
417 
418 void SiStripFEDMonitorPlugin::getMajority(const std::vector<std::pair<unsigned int, unsigned int> >& aFeMajVec,
419  unsigned int& aMajorityCounter,
420  std::vector<unsigned int>& afedIds) {
421  unsigned int lMajAddress = 0;
422  std::vector<std::pair<unsigned int, unsigned int> >::const_iterator lIter = aFeMajVec.begin();
423  unsigned int lMajAddr = (*lIter).second;
424  unsigned int lCounter = 0;
425 
426  //std::cout << " --- First element: addr = " << lMajAddr << " counter = " << lCounter << std::endl;
427  unsigned int iele = 0;
428  //bool foundMaj = false;
429  for (; lIter != aFeMajVec.end(); ++lIter, ++iele) {
430  //std::cout << " ---- Ele " << iele << " " << (*lIter).first << " " << (*lIter).second << " ref " << lMajAddr << std::endl;
431  if ((*lIter).second == lMajAddr) {
432  ++lCounter;
433  //std::cout << " ----- =ref: Counter = " << lCounter << std::endl;
434  } else {
435  //std::cout << " ----- !=ref: Counter = " << lCounter << " Majority = " << aMajorityCounter << std::endl;
436  if (lCounter > aMajorityCounter) {
437  //std::cout << " ------ >Majority: " << std::endl;
438  aMajorityCounter = lCounter;
439  // AV bug here??
440  lMajAddress = lMajAddr;
441  // lMajAddress = (*lIter).second;
442  //foundMaj=true;
443  }
444  lCounter = 0;
445  lMajAddr = (*lIter).second;
446  --lIter;
447  --iele;
448  }
449  }
450  // AV Bug here? The check has to be done regardless foundMaj == false or true
451  // if (!foundMaj) {
452  if (lCounter > aMajorityCounter) {
453  //std::cout << " ------ >Majority: " << std::endl;
454  aMajorityCounter = lCounter;
455  lMajAddress = lMajAddr;
456  }
457  // }
458  //std::cout << " -- found majority value for " << aMajorityCounter << " elements out of " << aFeMajVec.size() << "." << std::endl;
459  //get list of feds with address different from majority in partition:
460  lIter = aFeMajVec.begin();
461  afedIds.reserve(135);
462  for (; lIter != aFeMajVec.end(); ++lIter) {
463  if ((*lIter).second != lMajAddress) {
464  afedIds.push_back((*lIter).first);
465  } else {
466  lIter += aMajorityCounter - 1;
467  if (lIter >= aFeMajVec.end()) {
468  std::cout << "Here it is a bug: " << aMajorityCounter << " " << aFeMajVec.size() << " "
469  << lIter - aFeMajVec.end() << std::endl;
470  }
471  }
472  }
473  //std::cout << " -- Found " << lfedIds.size() << " elements not matching the majority." << std::endl;
474  if (!afedIds.empty()) {
475  std::sort(afedIds.begin(), afedIds.end());
476  std::vector<unsigned int>::iterator lIt = std::unique(afedIds.begin(), afedIds.end());
477  afedIds.erase(lIt, afedIds.end());
478  }
479 }
480 
482  const edm::Run& run,
483  const edm::EventSetup& eSetup) {
484  ibooker.setCurrentFolder(folderName_);
485 
486  const auto tkDetMap = &eSetup.getData(tkDetMapToken_);
487  fedHists_.bookTopLevelHistograms(ibooker, tkDetMap);
488 
490  fedHists_.bookAllFEDHistograms(ibooker, fullDebugMode_);
491 
492  if (enableFEDerrLumi_) {
493  ibooker.cd();
494  ibooker.setCurrentFolder("SiStrip/ReadoutView/PerLumiSection");
495  {
496  auto scope = DQMStore::IBooker::UseRunScope(ibooker);
497  lumiErrfac_ =
498  ibooker.book1D("lumiErrorFraction", "Fraction of error per lumi section vs subdetector", 6, 0.5, 6.5);
499  lumiErrfac_->setAxisTitle("SubDetId", 1);
500  lumiErrfac_->setBinLabel(1, "TECB");
501  lumiErrfac_->setBinLabel(2, "TECF");
502  lumiErrfac_->setBinLabel(3, "TIB");
503  lumiErrfac_->setBinLabel(4, "TIDB");
504  lumiErrfac_->setBinLabel(5, "TIDF");
505  lumiErrfac_->setBinLabel(6, "TOB");
506  }
507  } else {
508  lumiErrfac_ = nullptr;
509  }
510 }
511 
512 std::shared_ptr<sifedmon::LumiErrors> SiStripFEDMonitorPlugin::globalBeginLuminosityBlock(
513  const edm::LuminosityBlock& lumi, const edm::EventSetup& iSetup) const {
514  auto lumiErrors = std::make_shared<sifedmon::LumiErrors>();
515  lumiErrors->nTotal.resize(6, 0);
516  lumiErrors->nErrors.resize(6, 0);
517  return lumiErrors;
518 }
519 
521  const edm::EventSetup& iSetup) {
522  auto lumiErrors = luminosityBlockCache(lumi.index());
524  for (unsigned int iD(0); iD < lumiErrors->nTotal.size(); iD++) {
525  if (lumiErrors->nTotal[iD] > 0)
526  lumiErrfac_->Fill(iD + 1, static_cast<float>(lumiErrors->nErrors[iD]) / lumiErrors->nTotal[iD]);
527  }
528  }
529 }
530 
532  cabling_ = &cablingRcd.get(fedCablingToken_);
533 }
534 
535 //
536 // Define as a plug-in
537 //
538 
size
Write out results.
edm::EDGetTokenT< FEDRawDataCollection > rawDataToken_
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
virtual void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:36
const SiStripFedCabling * cabling_
void updateCabling(const SiStripFedCablingRcd &cablingRcd)
bool exists(std::string const &parameterName) const
checks if a parameter exists
void analyze(const edm::Event &, const edm::EventSetup &) override
void getMajority(const std::vector< std::pair< unsigned int, unsigned int > > &aFeMajVec, unsigned int &aMajorityCounter, std::vector< unsigned int > &afedIds)
size_t size() const
Lenght of the data buffer in bytes.
Definition: FEDRawData.h:45
void globalEndLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &iSetup) override
edm::ESGetToken< TrackerTopology, TrackerTopologyRcd > tTopoToken_
std::shared_ptr< sifedmon::LumiErrors > globalBeginLuminosityBlock(const edm::LuminosityBlock &lumi, const edm::EventSetup &iSetup) const override
Log< level::Error, false > LogError
#define LogTrace(id)
T getUntrackedParameter(std::string const &, T const &) const
void Fill(long long x)
int iEvent
Definition: GenABIO.cc:224
PRODUCT const & get(ESGetToken< PRODUCT, T > const &iToken) const
SiStripFEDMonitorPlugin(const edm::ParameterSet &)
def unique(seq, keepstr=True)
Definition: tier0.py:24
MonitorElement * lumiErrfac_
Transition
Definition: Transition.h:12
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
edm::ESGetToken< TkDetMap, TrackerTopologyRcd > tkDetMapToken_
const FEDRawData & FEDData(int fedid) const
retrieve data for fed
Log< level::Info, false > LogInfo
std::vector< unsigned int > nTotal
std::vector< unsigned int > nErrors
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
bool check(const edm::EventSetup &iSetup)
Definition: ESWatcher.h:57
HLT enums.
static bool pairComparison(const std::pair< unsigned int, unsigned int > &pair1, const std::pair< unsigned int, unsigned int > &pair2)
edm::ESWatcher< SiStripFedCablingRcd > fedCablingWatcher_
Log< level::Warning, false > LogWarning
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX, FUNC onbooking=NOOP())
Definition: DQMStore.h:98
edm::EDGetTokenT< EventWithHistory > heToken_
UseScope< MonitorElementData::Scope::RUN > UseRunScope
Definition: DQMStore.h:541
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
edm::ESGetToken< SiStripFedCabling, SiStripFedCablingRcd > fedCablingToken_
Definition: Run.h:45
virtual void setAxisTitle(const std::string &title, int axis=1)
set x-, y- or z-axis title (axis=1, 2, 3 respectively)