CMS 3D CMS Logo

SiStripPopConFEDErrorsDQM.cc
Go to the documentation of this file.
5 
13 public:
16 
19  // interface methods: implemented in template
20  void initES(const edm::EventSetup& iSetup) override;
21  void dqmEndJob(DQMStore::IBooker& booker, DQMStore::IGetter& getter) override;
22  SiStripBadStrip* getObj() const override;
23 
24 private:
25  void readHistogram(MonitorElement* aMe, unsigned int& aCounter, const float aNorm, const unsigned int aFedId);
26 
27  void addBadAPV(const FedChannelConnection& aConnection,
28  const unsigned short aAPVNumber,
29  const unsigned short aFlag,
30  unsigned int& aCounter);
31 
32  void addBadStrips(const FedChannelConnection& aConnection,
33  const unsigned int aDetId,
34  const unsigned short aApvNum,
35  const unsigned short aFlag,
36  unsigned int& aCounter);
37 
39  void addErrors();
40 
41 private:
43  double threshold_;
44  unsigned int debug_;
45  uint32_t cablingCacheId_;
48  std::map<uint32_t, std::vector<unsigned int> > detIdErrors_;
49 };
50 
58 
61  fp_(iConfig.getUntrackedParameter<edm::FileInPath>(
62  "file", edm::FileInPath("CalibTracker/SiStripCommon/data/SiStripDetInfo.dat"))),
63  threshold_(iConfig.getUntrackedParameter<double>("Threshold", 0)),
64  debug_(iConfig.getUntrackedParameter<unsigned int>("Debug", 0)),
65  cablingCacheId_(0) {
66  edm::LogInfo("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::SiStripFEDErrorsDQM()]";
67 }
68 
70  edm::LogInfo("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::~SiStripFEDErrorsDQM]";
71 }
72 
74  uint32_t currentCacheId = iSetup.get<SiStripFedCablingRcd>().cacheIdentifier();
75  if (cablingCacheId_ != currentCacheId) {
77  iSetup.get<SiStripFedCablingRcd>().get(cablingHandle);
78  cabling_ = cablingHandle.product();
79  cablingCacheId_ = currentCacheId;
80  }
81 }
82 
85 
87 
88  std::ostringstream lPath;
89  lPath << "Run " << getRunNumber() << "/SiStrip/Run summary/ReadoutView/";
90  const std::string lBaseDir = lPath.str();
91 
92  getter.setCurrentFolder(lBaseDir);
93  LogTrace("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readBadAPVs] Now in " << lBaseDir << std::endl;
94 
95  std::vector<std::pair<std::string, unsigned int> > lFedsFolder;
96  //for FED errors, use summary folder and fedId=0
97  //do not put a slash or "goToDir" won't work...
98  lFedsFolder.push_back(std::pair<std::string, unsigned int>("FedMonitoringSummary", 0));
99 
100  //for FE/channel/APV errors, they are written in a folder per FED,
101  //if there was at least one error.
102  //So just loop on folders and see which ones exist.
103  for (unsigned int ifed(FEDNumbering::MINSiStripFEDID); ifed <= FEDNumbering::MAXSiStripFEDID;
104  ifed++) { //loop on FEDs
105 
106  std::ostringstream lFedDir;
107  lFedDir << "FrontEndDriver" << ifed;
108  if (!getter.dirExists(lFedDir.str()))
109  continue;
110  else {
111  if (debug_)
112  LogTrace("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readBadAPVs] - Errors detected for FED " << ifed
113  << std::endl;
114  lFedsFolder.push_back(std::pair<std::string, unsigned int>(lFedDir.str(), ifed));
115  }
116  }
117  getter.cd();
118 
119  unsigned int nAPVsTotal = 0;
120  //retrieve total number of APVs valid and connected from cabling:
121  if (!cabling_) {
122  edm::LogError("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readBadAPVs] cabling not filled, return false "
123  << std::endl;
124  return;
125  }
126  auto lFedVec = cabling_->fedIds();
127  for (unsigned int iFed(0); iFed < lFedVec.size(); iFed++) {
128  if (*(lFedVec.begin() + iFed) < sistrip::FED_ID_MIN || *(lFedVec.begin() + iFed) > sistrip::FED_ID_MAX) {
129  edm::LogError("SiStripFEDErrorsDQM")
130  << "[SiStripFEDErrorsDQM::readBadAPVs] Invalid fedid : " << *(lFedVec.begin() + iFed) << std::endl;
131  continue;
132  }
133  auto lConnVec = cabling_->fedConnections(*(lFedVec.begin() + iFed));
134  for (unsigned int iConn(0); iConn < lConnVec.size(); iConn++) {
135  const FedChannelConnection& lConnection = *(lConnVec.begin() + iConn);
136  if (!lConnection.isConnected())
137  continue;
138  unsigned int lDetid = lConnection.detId();
139  if (!lDetid || lDetid == sistrip::invalid32_)
140  continue;
141  //2 APVs per channel....
142  nAPVsTotal += 2;
143  }
144  }
145 
146  edm::LogInfo("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readBadAPVs] Total number of APVs found : "
147  << nAPVsTotal << std::endl;
148 
149  unsigned int nAPVsWithErrorTotal = 0;
150  unsigned int nFolders = 0;
151  float lNorm = 0;
152  for (const auto& iFolder : lFedsFolder) {
153  const std::string lDirName = lBaseDir + "/" + iFolder.first;
154  const unsigned int lFedId = iFolder.second;
155 
156  if (!getter.dirExists(lDirName))
157  continue;
158 
159  std::vector<MonitorElement*> lMeVec = getter.getContents(lDirName);
160 
161  if (nFolders == 0) {
162  for (auto iMe : lMeVec) { //loop on ME found in directory
163  std::string lMeName = iMe->getName();
164  if (lMeName.find("nFEDErrors") != lMeName.npos) {
165  lNorm = iMe->getEntries();
166  }
167  }
168  //if norm histo has not been found, no point in continuing....
169  if (lNorm < 1) {
170  edm::LogError("SiStripFEDErrorsDQM")
171  << "[SiStripFEDErrorsDQM::readBadAPVs] nFEDErrors not found, norm is " << lNorm << std::endl;
172  return;
173  }
174  }
175 
176  unsigned int nAPVsWithError = 0;
177  for (auto iMe : lMeVec) { //loop on ME found in directory
178  if (iMe->getEntries() == 0)
179  continue;
180  const std::string lMeName = iMe->getName();
181 
182  bool lookForErrors = false;
183  if (nFolders == 0) {
184  //for the first element of lFedsFolder: this is FED errors
185  lookForErrors = lMeName.find("DataMissing") != lMeName.npos || lMeName.find("AnyFEDErrors") != lMeName.npos ||
186  (lMeName.find("CorruptBuffer") != lMeName.npos && lMeName.find("nFED") == lMeName.npos);
187  } else {
188  //for the others, it is channel or FE errors.
189  lookForErrors = lMeName.find("APVAddressError") != lMeName.npos || lMeName.find("APVError") != lMeName.npos ||
190  lMeName.find("BadMajorityAddresses") != lMeName.npos ||
191  lMeName.find("FEMissing") != lMeName.npos || lMeName.find("OOSBits") != lMeName.npos ||
192  lMeName.find("UnlockedBits") != lMeName.npos;
193  }
194 
195  if (lookForErrors)
196  readHistogram(iMe, nAPVsWithError, lNorm, lFedId);
197 
198  } //loop on ME found in directory
199 
200  nAPVsWithErrorTotal += nAPVsWithError;
201  ++nFolders;
202  } //loop on lFedsFolders
203 
204  edm::LogInfo("SiStripFEDErrorsDQM")
205  << "[SiStripFEDErrorsDQM::readBadAPVs] Total APVs with error found above threshold = " << nAPVsWithErrorTotal
206  << std::endl;
207 
208  getter.cd();
209 
210  addErrors();
211 }
212 
214 
216  unsigned int& aCounter,
217  const float aNorm,
218  const unsigned int aFedId) {
219  unsigned short lFlag = 0;
220  std::string lMeName = aMe->getName();
221  if (lMeName.find("DataMissing") != lMeName.npos) {
222  lFlag = 0;
223  } else if (lMeName.find("AnyFEDErrors") != lMeName.npos) {
224  lFlag = 1;
225  } else if (lMeName.find("CorruptBuffer") != lMeName.npos && lMeName.find("nFED") == lMeName.npos) {
226  lFlag = 2;
227  } else if (lMeName.find("FEMissing") != lMeName.npos) {
228  lFlag = 3;
229  } else if (lMeName.find("BadMajorityAddresses") != lMeName.npos) {
230  lFlag = 4;
231  } else if (lMeName.find("UnlockedBits") != lMeName.npos) {
232  lFlag = 5;
233  } else if (lMeName.find("OOSBits") != lMeName.npos) {
234  lFlag = 6;
235  } else if (lMeName.find("APVAddressError") != lMeName.npos) {
236  lFlag = 7;
237  } else if (lMeName.find("APVError") != lMeName.npos) {
238  lFlag = 8;
239  } else {
240  edm::LogError("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readHistogramError] Shouldn't be here ..."
241  << std::endl;
242  return;
243  }
244 
245  if (debug_) {
246  LogTrace("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readHistogramError] Reading histo : " << lMeName
247  << ", flag = " << lFlag << std::endl;
248  }
249 
250  unsigned int lNBins = aMe->getNbinsX();
251  int lBinShift = 0;
252  bool lIsFedHist = false;
253  bool lIsAPVHist = false;
254  bool lIsFeHist = false;
255  bool lIsChHist = false;
256 
257  if (lNBins > 200) {
258  lBinShift = FEDNumbering::MINSiStripFEDID - 1; //shift for FED ID from bin number
259  lIsFedHist = true;
260  } else {
261  lBinShift = -1; //shift for channel/APV/FE id from bin number
262  if (lNBins > 100)
263  lIsAPVHist = true;
264  else if (lNBins < 10)
265  lIsFeHist = true;
266  else
267  lIsChHist = true;
268  }
269 
270  if (debug_) {
271  LogTrace("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::readHistogramError] lIsFedHist: " << lIsFedHist
272  << std::endl
273  << "[SiStripFEDErrorsDQM::readHistogramError] lIsAPVHist: " << lIsAPVHist
274  << std::endl
275  << "[SiStripFEDErrorsDQM::readHistogramError] lIsFeHist : " << lIsFeHist
276  << std::endl
277  << "[SiStripFEDErrorsDQM::readHistogramError] lIsChHist : " << lIsChHist
278  << std::endl;
279  }
280 
281  for (unsigned int ibin(1); ibin < lNBins + 1; ibin++) {
282  if (aMe->getBinContent(ibin) > 0) {
283  float lStat = aMe->getBinContent(ibin) * 1. / aNorm;
284  if (lStat <= threshold_) {
285  if (debug_)
286  LogTrace("SiStripFEDErrorsDQM")
287  << "[SiStripFEDErrorsDQM::readHistogramError] ---- Below threshold : " << lStat << std::endl;
288  continue;
289  }
290  if (lIsFedHist) {
291  unsigned int lFedId = ibin + lBinShift;
292  //loop on all enabled channels of this FED....
293  for (unsigned int iChId = 0; iChId < sistrip::FEDCH_PER_FED; iChId++) { //loop on channels
294  const FedChannelConnection& lConnection = cabling_->fedConnection(lFedId, iChId);
295  if (!lConnection.isConnected())
296  continue;
297  addBadAPV(lConnection, 0, lFlag, aCounter);
298  }
299  } else {
300  if (lIsFeHist) {
301  unsigned int iFeId = ibin + lBinShift;
302  //loop on all enabled channels of this FE....
303  for (unsigned int iFeCh = 0; iFeCh < sistrip::FEDCH_PER_FEUNIT; iFeCh++) { //loop on channels
304  unsigned int iChId = sistrip::FEDCH_PER_FEUNIT * iFeId + iFeCh;
305  const FedChannelConnection& lConnection = cabling_->fedConnection(aFedId, iChId);
306  if (!lConnection.isConnected())
307  continue;
308  addBadAPV(lConnection, 0, lFlag, aCounter);
309  }
310  } else {
311  unsigned int iChId = ibin + lBinShift;
312  if (lIsAPVHist) {
313  unsigned int iAPVid = iChId % 2 + 1;
314  iChId = static_cast<unsigned int>(iChId / 2.);
315  const FedChannelConnection& lConnection = cabling_->fedConnection(aFedId, iChId);
316  addBadAPV(lConnection, iAPVid, lFlag, aCounter);
317 
318  } //ifAPVhists
319  else {
320  const FedChannelConnection& lConnection = cabling_->fedConnection(aFedId, iChId);
321  addBadAPV(lConnection, 0, lFlag, aCounter);
322  }
323  } //if not FE hist
324  } //if not FED hist
325  } //if entries in histo
326  } //loop on bins
327 } //method readHistogram
328 
330  const unsigned short aAPVNumber,
331  const unsigned short aFlag,
332  unsigned int& aCounter) {
333  if (!aConnection.isConnected()) {
334  edm::LogWarning("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::addBadAPV] Warning, incompatible cabling ! "
335  "Channel is not connected, but entry found in histo ... "
336  << std::endl;
337  return;
338  }
339  unsigned int lDetid = aConnection.detId();
340  if (!lDetid || lDetid == sistrip::invalid32_) {
341  edm::LogWarning("SiStripFEDErrorsDQM")
342  << "[SiStripFEDErrorsDQM::addBadAPV] Warning, DetId is invalid: " << lDetid << std::endl;
343  return;
344  }
345  //unsigned short nChInModule = aConnection.nApvPairs();
346  unsigned short lApvNum = 0;
347  if (aAPVNumber < 2) {
348  lApvNum = 2 * aConnection.apvPairNumber();
349  addBadStrips(aConnection, lDetid, lApvNum, aFlag, aCounter);
350  }
351  if (aAPVNumber == 0 || aAPVNumber == 2) {
352  lApvNum = 2 * aConnection.apvPairNumber() + 1;
353  addBadStrips(aConnection, lDetid, lApvNum, aFlag, aCounter);
354  }
355 }
356 
358  const unsigned int aDetId,
359  const unsigned short aApvNum,
360  const unsigned short aFlag,
361  unsigned int& aCounter) {
362  // std::vector<unsigned int> lStripVector;
363  const unsigned short lFirstBadStrip = aApvNum * 128;
364  const unsigned short lConsecutiveBadStrips = 128;
365 
366  unsigned int lBadStripRange = obj_.encode(lFirstBadStrip, lConsecutiveBadStrips, aFlag);
367 
368  LogTrace("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::addBadStrips] ---- Adding : detid " << aDetId << " (FED "
369  << aConnection.fedId() << ", Ch " << aConnection.fedCh() << ")"
370  << ", APV " << aApvNum << ", flag " << aFlag << std::endl;
371 
372  detIdErrors_[aDetId].push_back(lBadStripRange);
373 
374  // lStripVector.push_back(lBadStripRange);
375  // SiStripBadStrip::Range lRange(lStripVector.begin(),lStripVector.end());
376  // if ( !obj.put(aDetId,lRange) ) {
377  // edm::LogError("SiStripFEDErrorsDQM")<<"[SiStripFEDErrorsDQM::addBadStrips] detid already exists." << std::endl;
378  // }
379 
380  aCounter++;
381 }
382 
383 namespace {
384  // set corresponding bit to 1 in flag
385  inline void setFlagBit(unsigned short& aFlag, const unsigned short aBit) { aFlag = aFlag | (0x1 << aBit); }
386 } // namespace
387 
389  for (const auto& it : detIdErrors_) {
390  const std::vector<uint32_t>& lList = it.second;
391 
392  //map of first strip number and flag
393  //purpose is to encode all existing flags into a unique one...
394  std::map<unsigned short, unsigned short> lAPVMap;
395  for (auto cCont : lList) {
396  SiStripBadStrip::data lData = obj_.decode(cCont);
397  unsigned short lFlag = 0;
398  setFlagBit(lFlag, lData.flag);
399 
400  //std::cout << " -- Detid " << it.first << ", strip " << lData.firstStrip << ", flag " << lData.flag << std::endl;
401 
402  auto lInsert = lAPVMap.emplace(lData.firstStrip, lFlag);
403  if (!lInsert.second) {
404  //std::cout << " ---- Adding bit : " << lData.flag << " to " << lInsert.first->second << ": ";
405  setFlagBit(lInsert.first->second, lData.flag);
406  //std::cout << lInsert.first->second << std::endl;
407  }
408  }
409 
410  //encode the new flag
411  std::vector<unsigned int> lStripVector;
412  const unsigned short lConsecutiveBadStrips = 128;
413  for (const auto& lIter : lAPVMap) {
414  lStripVector.push_back(obj_.encode(lIter.first, lConsecutiveBadStrips, lIter.second));
415  }
416 
417  SiStripBadStrip::Range lRange(lStripVector.begin(), lStripVector.end());
418  if (!obj_.put(it.first, lRange)) {
419  edm::LogError("SiStripFEDErrorsDQM") << "[SiStripFEDErrorsDQM::addBadStrips] detid already exists." << std::endl;
420  }
421  }
422 }
423 
void addBadStrips(const FedChannelConnection &aConnection, const unsigned int aDetId, const unsigned short aApvNum, const unsigned short aFlag, unsigned int &aCounter)
static const uint16_t FED_ID_MIN
FedChannelConnection fedConnection(uint16_t fed_id, uint16_t fed_ch) const
const uint16_t & fedCh() const
static const uint32_t invalid32_
Definition: Constants.h:15
void dqmEndJob(DQMStore::IBooker &booker, DQMStore::IGetter &getter) override
std::vector< MonitorElement * > getContents(Args &&...args)
Definition: DQMStore.h:246
uint16_t apvPairNumber() const
const std::string & getName() const
get name of ME
const uint16_t & fedId() const
void initES(const edm::EventSetup &iSetup) override
SiStripBadStrip * getObj() const override
bool dirExists(std::string const &path)
Definition: DQMStore.cc:461
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::map< uint32_t, std::vector< unsigned int > > detIdErrors_
virtual int getNbinsX() const
get # of bins in X-axis
const uint32_t & detId() const
Class containning control, module, detector and connection information, at the level of a FED channel...
FedsConstIterRange fedIds() const
virtual double getBinContent(int binx) const
get content of bin (1-D)
#define LogTrace(id)
void addErrors()
Writes the errors to the db.
void addBadAPV(const FedChannelConnection &aConnection, const unsigned short aAPVNumber, const unsigned short aFlag, unsigned int &aCounter)
unsigned short firstStrip
static const uint16_t FEDCH_PER_FEUNIT
void readHistogram(MonitorElement *aMe, unsigned int &aCounter, const float aNorm, const unsigned int aFedId)
ConnsConstIterRange fedConnections(uint16_t fed_id) const
Contains cabling info at the device level, including DetId, APV pair numbers, hardware addresses...
HLT enums.
static const uint16_t FEDCH_PER_FED
std::pair< ContainerIterator, ContainerIterator > Range
T get() const
Definition: EventSetup.h:73
std::string fullPath() const
Definition: FileInPath.cc:163
static const uint16_t FED_ID_MAX
SiStripPopConFEDErrorsHandlerFromDQM(const edm::ParameterSet &iConfig)
bool put(const uint32_t &detID, const InputVector &vect)
T const * product() const
Definition: ESHandle.h:86
unsigned int encode(const unsigned short &first, const unsigned short &NconsecutiveBadStrips, const unsigned short &flag=0)
data decode(const unsigned int &value) const
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:424