File indexing completed on 2024-04-06 12:08:43
0001 #include "DQM/SiStripMonitorClient/interface/SiStripQualityChecker.h"
0002 #include "FWCore/ServiceRegistry/interface/Service.h"
0003 #include "DQMServices/Core/interface/DQMStore.h"
0004
0005 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
0006
0007 #include "CalibTracker/SiStripCommon/interface/TkDetMap.h"
0008
0009 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0010 #include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
0011 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0012
0013 #include "DQM/SiStripCommon/interface/SiStripFolderOrganizer.h"
0014 #include "DQM/SiStripMonitorClient/interface/SiStripUtility.h"
0015
0016 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0017 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0018
0019 #include <iomanip>
0020
0021 SiStripQualityChecker::SiStripQualityChecker(edm::ParameterSet const& ps) : pSet_{ps} {
0022 edm::LogInfo("SiStripQualityChecker") << " Creating SiStripQualityChecker "
0023 << "\n";
0024
0025 SubDetFolderMap.emplace("TIB", "TIB");
0026 SubDetFolderMap.emplace("TOB", "TOB");
0027 SubDetFolderMap.emplace("TECF", "TEC/PLUS");
0028 SubDetFolderMap.emplace("TECB", "TEC/MINUS");
0029 SubDetFolderMap.emplace("TIDF", "TID/PLUS");
0030 SubDetFolderMap.emplace("TIDB", "TID/MINUS");
0031 }
0032
0033 SiStripQualityChecker::~SiStripQualityChecker() {
0034 edm::LogInfo("SiStripQualityChecker") << " Deleting SiStripQualityChecker "
0035 << "\n";
0036 }
0037
0038
0039
0040 void SiStripQualityChecker::bookStatus(DQMStore& dqm_store) {
0041 if (bookedStripStatus_)
0042 return;
0043
0044 dqm_store.cd();
0045 std::string strip_dir = "";
0046 SiStripUtility::getTopFolderPath(dqm_store, "SiStrip", strip_dir);
0047 if (strip_dir.empty())
0048 strip_dir = "SiStrip";
0049
0050
0051
0052 dqm_store.setCurrentFolder(strip_dir + "/MechanicalView");
0053
0054 std::string hname, htitle;
0055 hname = "detFractionReportMap";
0056 htitle = "SiStrip Report for Good Detector Fraction";
0057 DetFractionReportMap = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0058 DetFractionReportMap->setAxisTitle("Sub Detector Type", 1);
0059 DetFractionReportMap->setAxisTitle("Layer/Disc Number", 2);
0060
0061 hname = "detFractionReportMap_hasBadChan";
0062 htitle = "SiStrip Report for Good Detector Fraction due to bad channels";
0063 DetFractionReportMap_hasBadChan = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0064 DetFractionReportMap_hasBadChan->setAxisTitle("Sub Detector Type", 1);
0065 DetFractionReportMap_hasBadChan->setAxisTitle("Layer/Disc Number", 2);
0066 hname = "detFractionReportMap_hasTooManyDigis";
0067 htitle = "SiStrip Report for Good Detector Fraction due to too many digis";
0068 DetFractionReportMap_hasTooManyDigis = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0069 DetFractionReportMap_hasTooManyDigis->setAxisTitle("Sub Detector Type", 1);
0070 DetFractionReportMap_hasTooManyDigis->setAxisTitle("Layer/Disc Number", 2);
0071 hname = "detFractionReportMap_hasTooManyClu";
0072 htitle = "SiStrip Report for Good Detector Fraction due to too many clusters";
0073 DetFractionReportMap_hasTooManyClu = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0074 DetFractionReportMap_hasTooManyClu->setAxisTitle("Sub Detector Type", 1);
0075 DetFractionReportMap_hasTooManyClu->setAxisTitle("Layer/Disc Number", 2);
0076 hname = "detFractionReportMap_hasExclFed";
0077 htitle = "SiStrip Report for Good Detector Fraction due to excluded FEDs";
0078 DetFractionReportMap_hasExclFed = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0079 DetFractionReportMap_hasExclFed->setAxisTitle("Sub Detector Type", 1);
0080 DetFractionReportMap_hasExclFed->setAxisTitle("Layer/Disc Number", 2);
0081 hname = "detFractionReportMap_hasDcsErr";
0082 htitle = "SiStrip Report for Good Detector Fraction due to DCS errors";
0083 DetFractionReportMap_hasDcsErr = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0084 DetFractionReportMap_hasDcsErr->setAxisTitle("Sub Detector Type", 1);
0085 DetFractionReportMap_hasDcsErr->setAxisTitle("Layer/Disc Number", 2);
0086
0087 hname = "sToNReportMap";
0088 htitle = "SiStrip Report for Signal-to-Noise";
0089 SToNReportMap = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0090 SToNReportMap->setAxisTitle("Sub Detector Type", 1);
0091 SToNReportMap->setAxisTitle("Layer/Disc Number", 2);
0092
0093
0094 dqm_store.setCurrentFolder(strip_dir + "/EventInfo");
0095
0096 hname = "reportSummaryMap";
0097 htitle = "SiStrip Report Summary Map";
0098 SummaryReportMap = dqm_store.book2D(hname, htitle, 6, 0.5, 6.5, 9, 0.5, 9.5);
0099 SummaryReportMap->setAxisTitle("Sub Detector Type", 1);
0100 SummaryReportMap->setAxisTitle("Layer/Disc Number", 2);
0101
0102 SummaryReportGlobal = dqm_store.bookFloat("reportSummary");
0103 int ibin = 0;
0104
0105 dqm_store.setCurrentFolder(strip_dir + "/EventInfo/reportSummaryContents");
0106 for (auto const& [det, label] : SubDetFolderMap) {
0107 ibin++;
0108 DetFractionReportMap->setBinLabel(ibin, label);
0109 DetFractionReportMap_hasBadChan->setBinLabel(ibin, label);
0110 DetFractionReportMap_hasTooManyDigis->setBinLabel(ibin, label);
0111 DetFractionReportMap_hasTooManyClu->setBinLabel(ibin, label);
0112 DetFractionReportMap_hasExclFed->setBinLabel(ibin, label);
0113 DetFractionReportMap_hasDcsErr->setBinLabel(ibin, label);
0114 SToNReportMap->setBinLabel(ibin, label);
0115 SummaryReportMap->setBinLabel(ibin, label);
0116
0117 SubDetMEs local_mes;
0118
0119 if (det == "TECF")
0120 local_mes.detectorTag = "TEC+";
0121 else if (det == "TECB")
0122 local_mes.detectorTag = "TEC-";
0123 else if (det == "TIDF")
0124 local_mes.detectorTag = "TID+";
0125 else if (det == "TIDB")
0126 local_mes.detectorTag = "TID-";
0127 else
0128 local_mes.detectorTag = det;
0129
0130 std::string me_name;
0131 me_name = "SiStrip_" + det;
0132 local_mes.SummaryFlag = dqm_store.bookFloat(me_name);
0133
0134 me_name = "SiStrip_DetFraction_" + det;
0135 local_mes.DetFraction = dqm_store.bookFloat(me_name);
0136
0137 me_name = "SiStrip_SToNFlag_" + det;
0138 local_mes.SToNFlag = dqm_store.bookFloat(me_name);
0139 SubDetMEsMap.insert(std::pair<std::string, SubDetMEs>(det, local_mes));
0140 }
0141 bookedStripStatus_ = true;
0142 }
0143
0144 void SiStripQualityChecker::fillDummyStatus() {
0145 resetStatus();
0146 if (bookedStripStatus_) {
0147 for (auto& pr : SubDetMEsMap) {
0148 auto& local_mes = pr.second;
0149 local_mes.SummaryFlag->Fill(-1.0);
0150 local_mes.DetFraction->Fill(-1.0);
0151 local_mes.SToNFlag->Fill(-1.0);
0152 }
0153
0154 for (int xbin = 1; xbin < SummaryReportMap->getNbinsX() + 1; xbin++) {
0155 for (int ybin = 1; ybin < SummaryReportMap->getNbinsY() + 1; ybin++) {
0156 SummaryReportMap->Fill(xbin, ybin, -1.0);
0157 DetFractionReportMap->Fill(xbin, ybin, -1.0);
0158 DetFractionReportMap_hasBadChan->Fill(xbin, ybin, -1.0);
0159 DetFractionReportMap_hasTooManyDigis->Fill(xbin, ybin, -1.0);
0160 DetFractionReportMap_hasTooManyClu->Fill(xbin, ybin, -1.0);
0161 DetFractionReportMap_hasExclFed->Fill(xbin, ybin, -1.0);
0162 DetFractionReportMap_hasDcsErr->Fill(xbin, ybin, -1.0);
0163 SToNReportMap->Fill(xbin, ybin, -1.0);
0164 }
0165 }
0166 SummaryReportGlobal->Fill(-1.0);
0167 }
0168 }
0169
0170
0171
0172 void SiStripQualityChecker::resetStatus() {
0173 if (bookedStripStatus_) {
0174 for (auto& pr : SubDetMEsMap) {
0175 auto& local_mes = pr.second;
0176 local_mes.DetFraction->Reset();
0177 local_mes.SummaryFlag->Reset();
0178 local_mes.SToNFlag->Reset();
0179 }
0180 SummaryReportMap->Reset();
0181 DetFractionReportMap->Reset();
0182 DetFractionReportMap_hasBadChan->Reset();
0183 DetFractionReportMap_hasTooManyDigis->Reset();
0184 DetFractionReportMap_hasTooManyClu->Reset();
0185 DetFractionReportMap_hasExclFed->Reset();
0186 DetFractionReportMap_hasDcsErr->Reset();
0187 SToNReportMap->Reset();
0188
0189 SummaryReportGlobal->Reset();
0190 }
0191 }
0192
0193
0194
0195 void SiStripQualityChecker::fillStatus(DQMStore& dqm_store,
0196 const SiStripDetCabling* cabling,
0197 const TkDetMap* tkDetMap,
0198 const TrackerTopology* tTopo) {
0199 if (!bookedStripStatus_)
0200 bookStatus(dqm_store);
0201
0202 tkDetMap_ = tkDetMap;
0203
0204 fillDummyStatus();
0205 fillDetectorStatus(dqm_store, cabling);
0206
0207 int faulty_moduleflag = pSet_.getUntrackedParameter<bool>("PrintFaultyModuleList", false);
0208 if (faulty_moduleflag)
0209 fillFaultyModuleStatus(dqm_store, tTopo);
0210 }
0211
0212
0213
0214 void SiStripQualityChecker::fillDetectorStatus(DQMStore& dqm_store, const SiStripDetCabling* cabling) {
0215 unsigned int xbin = 0;
0216 float global_flag = 0;
0217 dqm_store.cd();
0218 std::string mdir = "MechanicalView";
0219 if (!SiStripUtility::goToDir(dqm_store, mdir))
0220 return;
0221 std::string mechanicalview_dir = dqm_store.pwd();
0222
0223 initialiseBadModuleList();
0224 for (auto& [det, local_mes] : SubDetMEsMap) {
0225 auto cPos = SubDetFolderMap.find(det);
0226 if (cPos == SubDetFolderMap.end())
0227 continue;
0228 std::string dname = mechanicalview_dir + "/" + cPos->second;
0229 if (!dqm_store.dirExists(dname))
0230 continue;
0231 dqm_store.cd(dname);
0232 ++xbin;
0233 float flag = 0;
0234 fillSubDetStatus(dqm_store, cabling, local_mes, xbin, flag);
0235 global_flag += flag;
0236 }
0237 global_flag = global_flag / xbin * 1.0;
0238 if (SummaryReportGlobal)
0239 SummaryReportGlobal->Fill(global_flag);
0240 dqm_store.cd();
0241 }
0242
0243
0244
0245 void SiStripQualityChecker::fillSubDetStatus(
0246 DQMStore& dqm_store, const SiStripDetCabling* cabling, SubDetMEs& mes, unsigned int xbin, float& gflag) {
0247 int status_flag = pSet_.getUntrackedParameter<int>("GlobalStatusFilling", 1);
0248 if (status_flag < 1)
0249 return;
0250
0251 auto const subDirVec = dqm_store.getSubdirs();
0252
0253 unsigned int ybin = 0;
0254 int tot_ndet = 0;
0255 int tot_errdet = 0;
0256 float tot_ston_stat = 0;
0257
0258 for (auto const& dname : subDirVec) {
0259 if (dname.find("BadModuleList") != std::string::npos)
0260 continue;
0261 if (dname.find("ring") != std::string::npos)
0262 continue;
0263 std::vector<MonitorElement*> meVec;
0264
0265 ybin++;
0266 dqm_store.cd(dname);
0267 meVec = dqm_store.getContents(dname);
0268 uint16_t ndet = 100;
0269 int errdet = 0;
0270 int errdet_hasBadChan = 0;
0271 int errdet_hasTooManyDigis = 0;
0272 int errdet_hasTooManyClu = 0;
0273 int errdet_hasExclFed = 0;
0274 int errdet_hasDcsErr = 0;
0275
0276 int ston_stat = 1;
0277 int lnum = atoi(dname.substr(dname.find_last_of('_') + 1).c_str());
0278 ndet = cabling->connectedNumber(mes.detectorTag, lnum);
0279
0280 getModuleStatus(dqm_store,
0281 meVec,
0282 errdet,
0283 errdet_hasBadChan,
0284 errdet_hasTooManyDigis,
0285 errdet_hasTooManyClu,
0286 errdet_hasExclFed,
0287 errdet_hasDcsErr);
0288
0289 for (auto const* me : meVec) {
0290 if (!me)
0291 continue;
0292 std::vector<QReport*> reports = me->getQReports();
0293
0294 if (reports.empty())
0295 continue;
0296 std::string name = me->getName();
0297
0298 if (name.find("Summary_ClusterStoNCorr__OnTrack") != std::string::npos) {
0299 int istat = SiStripUtility::getMEStatus(me);
0300 if (reports[0]->getQTresult() == -1) {
0301 ston_stat = -1;
0302 } else {
0303 if (istat == dqm::qstatus::ERROR)
0304 ston_stat = 0;
0305 else if (istat == dqm::qstatus::STATUS_OK)
0306 ston_stat = 1;
0307 }
0308 }
0309 }
0310 if (ndet > 0) {
0311 float eff_fac = 1 - (errdet * 1.0 / ndet);
0312 float eff_fac_hasBadChan = 1 - (errdet_hasBadChan * 1.0 / ndet);
0313 float eff_fac_hasTooManyDigis = 1 - (errdet_hasTooManyDigis * 1.0 / ndet);
0314 float eff_fac_hasTooManyClu = 1 - (errdet_hasTooManyClu * 1.0 / ndet);
0315 float eff_fac_hasExclFed = 1 - (errdet_hasExclFed * 1.0 / ndet);
0316 float eff_fac_hasDcsErr = 1 - (errdet_hasDcsErr * 1.0 / ndet);
0317 fillStatusHistogram(SToNReportMap, xbin, ybin, ston_stat);
0318 fillStatusHistogram(DetFractionReportMap, xbin, ybin, eff_fac);
0319 fillStatusHistogram(DetFractionReportMap_hasBadChan, xbin, ybin, eff_fac_hasBadChan);
0320 fillStatusHistogram(DetFractionReportMap_hasTooManyDigis, xbin, ybin, eff_fac_hasTooManyDigis);
0321 fillStatusHistogram(DetFractionReportMap_hasTooManyClu, xbin, ybin, eff_fac_hasTooManyClu);
0322 fillStatusHistogram(DetFractionReportMap_hasExclFed, xbin, ybin, eff_fac_hasExclFed);
0323 fillStatusHistogram(DetFractionReportMap_hasDcsErr, xbin, ybin, eff_fac_hasDcsErr);
0324 if (ston_stat < 0)
0325 fillStatusHistogram(SummaryReportMap, xbin, ybin, eff_fac);
0326 else
0327 fillStatusHistogram(SummaryReportMap, xbin, ybin, ston_stat * eff_fac);
0328
0329 tot_ndet += ndet;
0330 tot_errdet += errdet;
0331 tot_ston_stat += ston_stat;
0332 }
0333 dqm_store.cd(dname);
0334 }
0335 if (tot_ndet > 0) {
0336 float tot_eff_fac = 1 - (tot_errdet * 1.0 / tot_ndet);
0337 if (mes.DetFraction)
0338 mes.DetFraction->Fill(tot_eff_fac);
0339 float tot_ston_fac = tot_ston_stat / ybin;
0340 if (mes.SToNFlag)
0341 mes.SToNFlag->Fill(tot_ston_fac);
0342 if (tot_ston_fac < 0) {
0343 gflag = tot_eff_fac;
0344 } else {
0345 gflag = std::min(tot_eff_fac, tot_ston_fac);
0346 }
0347 if (mes.SummaryFlag)
0348 mes.SummaryFlag->Fill(gflag);
0349 }
0350 }
0351
0352
0353
0354 void SiStripQualityChecker::printStatusReport() {
0355 std::ostringstream det_summary_str;
0356 for (std::map<std::string, SubDetMEs>::const_iterator it = SubDetMEsMap.begin(); it != SubDetMEsMap.end(); it++) {
0357 std::string det = it->first;
0358 det_summary_str << std::setprecision(4);
0359 det_summary_str << std::setiosflags(std::ios::fixed);
0360
0361 det_summary_str << " Printing Status for " << det << " : " << std::endl;
0362 SubDetMEs local_mes = it->second;
0363
0364 std::string sval;
0365 float fval1, fval2, fval3;
0366 fval1 = fval2 = fval3 = -1.0;
0367
0368 SiStripUtility::getMEValue(local_mes.DetFraction, sval);
0369 if (!sval.empty())
0370 fval1 = atof(sval.c_str());
0371 SiStripUtility::getMEValue(local_mes.SToNFlag, sval);
0372 if (!sval.empty())
0373 fval2 = atof(sval.c_str());
0374 SiStripUtility::getMEValue(local_mes.SummaryFlag, sval);
0375 if (!sval.empty())
0376 fval3 = atof(sval.c_str());
0377
0378 det_summary_str << std::setw(7) << " % of good detectors " << fval1 << " SToN Flag " << fval2
0379 << " Summary Flag " << fval3 << std::endl;
0380 }
0381 }
0382
0383
0384
0385 void SiStripQualityChecker::getModuleStatus(DQMStore& dqm_store,
0386 std::vector<MonitorElement*>& layer_mes,
0387 int& errdet,
0388 int& errdet_hasBadChan,
0389 int& errdet_hasTooManyDigis,
0390 int& errdet_hasTooManyClu,
0391 int& errdet_hasExclFed,
0392 int& errdet_hasDcsErr) {
0393 std::string lname;
0394 std::map<uint32_t, uint16_t> bad_modules;
0395 for (std::vector<MonitorElement*>::const_iterator it = layer_mes.begin(); it != layer_mes.end(); it++) {
0396 MonitorElement* me = (*it);
0397 if (!me)
0398 continue;
0399 std::vector<QReport*> qreports = me->getQReports();
0400 if (qreports.empty())
0401 continue;
0402 std::string name = me->getName();
0403 std::vector<DQMChannel> bad_channels_me;
0404 if (me->kind() == MonitorElement::Kind::TPROFILE) {
0405 bad_channels_me = qreports[0]->getBadChannels();
0406 lname = "";
0407 } else if (me->kind() == MonitorElement::Kind::TPROFILE2D && name.find("TkHMap") != std::string::npos) {
0408 bad_channels_me = qreports[0]->getBadChannels();
0409 lname = name.substr(name.find("TkHMap_") + 7);
0410 lname = lname.substr(lname.find("_T") + 1);
0411 }
0412 for (std::vector<DQMChannel>::iterator it = bad_channels_me.begin(); it != bad_channels_me.end(); it++) {
0413 int xval = (*it).getBinX();
0414 int yval = (*it).getBinY();
0415 uint32_t detId = tkDetMap_->getDetFromBin(lname, xval, yval);
0416 std::map<uint32_t, uint16_t>::iterator iPos = bad_modules.find(detId);
0417 uint16_t flag;
0418 if (iPos != bad_modules.end()) {
0419 flag = iPos->second;
0420 SiStripUtility::setBadModuleFlag(name, flag);
0421 iPos->second = flag;
0422 } else {
0423
0424
0425
0426 std::ostringstream detid_str;
0427 detid_str << detId;
0428
0429 const std::string& currentdir = dqm_store.pwd();
0430 std::string thisMEpath = currentdir.substr(0, currentdir.rfind('/')) + "/BadModuleList/" + detid_str.str();
0431
0432 MonitorElement* meBadModule = dqm_store.get(thisMEpath);
0433 if (meBadModule) {
0434 std::string val_str;
0435 SiStripUtility::getMEValue(meBadModule, val_str);
0436 flag = atoi(val_str.c_str());
0437 } else
0438 flag = 0;
0439
0440 SiStripUtility::setBadModuleFlag(name, flag);
0441 bad_modules.insert(std::pair<uint32_t, uint16_t>(detId, flag));
0442 }
0443 }
0444 }
0445 for (std::map<uint32_t, uint16_t>::const_iterator it = bad_modules.begin(); it != bad_modules.end(); it++) {
0446 uint32_t detId = it->first;
0447 uint16_t flag = it->second;
0448 if (((flag >> 0) & 0x1) > 0)
0449 errdet_hasBadChan++;
0450 if (((flag >> 1) & 0x1) > 0)
0451 errdet_hasTooManyDigis++;
0452 if (((flag >> 2) & 0x1) > 0)
0453 errdet_hasTooManyClu++;
0454 if (((flag >> 3) & 0x1) > 0)
0455 errdet_hasExclFed++;
0456 if (((flag >> 4) & 0x1) > 0)
0457 errdet_hasDcsErr++;
0458 std::map<uint32_t, uint16_t>::iterator iPos = badModuleList.find(detId);
0459 if (iPos != badModuleList.end()) {
0460 iPos->second = flag;
0461 } else {
0462 badModuleList.insert(std::pair<uint32_t, uint16_t>(detId, flag));
0463 }
0464 }
0465 errdet = bad_modules.size();
0466 }
0467
0468
0469
0470 void SiStripQualityChecker::fillStatusHistogram(MonitorElement const* me,
0471 int const xbin,
0472 int const ybin,
0473 float const val) {
0474 if (me && me->kind() == MonitorElement::Kind::TH2F) {
0475 auto th2d = me->getTH2F();
0476 th2d->SetBinContent(xbin, ybin, val);
0477 }
0478 }
0479
0480
0481
0482 void SiStripQualityChecker::fillFaultyModuleStatus(DQMStore& dqm_store, const TrackerTopology* tTopo) {
0483 if (badModuleList.empty())
0484 return;
0485
0486 dqm_store.cd();
0487 std::string mdir = "MechanicalView";
0488 if (!SiStripUtility::goToDir(dqm_store, mdir))
0489 return;
0490 std::string mechanical_dir = dqm_store.pwd();
0491
0492 SiStripFolderOrganizer folder_organizer;
0493 for (auto const [detId, value] : badModuleList) {
0494 std::string subdet_folder;
0495 folder_organizer.getSubDetFolder(detId, tTopo, subdet_folder);
0496 if (!dqm_store.dirExists(subdet_folder)) {
0497 subdet_folder = mechanical_dir + subdet_folder.substr(subdet_folder.find("MechanicalView") + 14);
0498 if (!dqm_store.dirExists(subdet_folder))
0499 continue;
0500 }
0501 std::string bad_module_folder = subdet_folder + "/" + "BadModuleList";
0502 dqm_store.setCurrentFolder(bad_module_folder);
0503
0504 std::ostringstream detid_str;
0505 detid_str << detId;
0506 std::string full_path = bad_module_folder + "/" + detid_str.str();
0507 MonitorElement* me = dqm_store.get(full_path);
0508 if (me)
0509 me->Reset();
0510 else
0511 me = dqm_store.bookInt(detid_str.str());
0512 me->Fill(value);
0513 }
0514 dqm_store.cd();
0515 }
0516
0517 void SiStripQualityChecker::initialiseBadModuleList() {
0518 for (auto& badMod : badModuleList) {
0519 badMod.second = 0;
0520 }
0521 }
0522
0523
0524
0525
0526 void SiStripQualityChecker::fillStatusAtLumi(DQMStore& dqm_store) {
0527 if (!bookedStripStatus_)
0528 bookStatus(dqm_store);
0529 fillDummyStatus();
0530 fillDetectorStatusAtLumi(dqm_store);
0531 }
0532
0533
0534
0535 void SiStripQualityChecker::fillDetectorStatusAtLumi(DQMStore& dqm_store) {
0536 dqm_store.cd();
0537 std::string rdir = "ReadoutView";
0538 if (!SiStripUtility::goToDir(dqm_store, rdir))
0539 return;
0540 std::string fullpath = dqm_store.pwd() + "/PerLumiSection/" + "lumiErrorFraction";
0541 MonitorElement* me = dqm_store.get(fullpath);
0542 if (me && me->kind() == MonitorElement::Kind::TH1F) {
0543 TH1F* th1 = me->getTH1F();
0544 float global_fraction = 0.0;
0545 float dets = 0.0;
0546 for (int ibin = 1; ibin <= th1->GetNbinsX(); ibin++) {
0547 std::string label = th1->GetXaxis()->GetBinLabel(ibin);
0548 std::map<std::string, SubDetMEs>::iterator iPos = SubDetMEsMap.find(label);
0549 if (iPos != SubDetMEsMap.end()) {
0550 float fraction = 1.0 - th1->GetBinContent(ibin);
0551 global_fraction += fraction;
0552 dets++;
0553 iPos->second.DetFraction->Fill(fraction);
0554 iPos->second.SToNFlag->Fill(-1.0);
0555 iPos->second.SummaryFlag->Fill(fraction);
0556 }
0557 }
0558 global_fraction = global_fraction / dets;
0559 if (SummaryReportGlobal)
0560 SummaryReportGlobal->Fill(global_fraction);
0561 }
0562 dqm_store.cd();
0563 }