Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-11-06 06:06:33

0001 #include "DQM/TrackingMonitorClient/interface/TrackingQualityChecker.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 "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0008 
0009 #include "DQM/TrackingMonitorClient/interface/TrackingUtility.h"
0010 
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013 
0014 #include <iomanip>
0015 //
0016 // -- Constructor
0017 //
0018 TrackingQualityChecker::TrackingQualityChecker(edm::ParameterSet const& ps)
0019     : pSet_(ps), verbose_(pSet_.getUntrackedParameter<bool>("verbose", false)) {
0020   edm::LogInfo("TrackingQualityChecker") << " Creating TrackingQualityChecker "
0021                                          << "\n";
0022 
0023   bookedTrackingGlobalStatus_ = false;
0024   bookedTrackingLSStatus_ = false;
0025 
0026   TopFolderName_ = pSet_.getUntrackedParameter<std::string>("TopFolderName", "Tracking");
0027 
0028   TrackingMEs tracking_mes;
0029   std::vector<edm::ParameterSet> TrackingGlobalQualityMEs =
0030       pSet_.getParameter<std::vector<edm::ParameterSet> >("TrackingGlobalQualityPSets");
0031   for (const auto& meQTset : TrackingGlobalQualityMEs) {
0032     std::string QTname = meQTset.getParameter<std::string>("QT");
0033     tracking_mes.HistoDir = meQTset.getParameter<std::string>("dir");
0034     tracking_mes.HistoName = meQTset.getParameter<std::string>("name");
0035     if (verbose_)
0036       edm::LogInfo("TrackingQualityChecker") << " inserting " << QTname << " in TrackingMEsMap" << std::endl;
0037     TrackingMEsMap.insert(std::pair<std::string, TrackingMEs>(QTname, tracking_mes));
0038   }
0039   if (verbose_)
0040     edm::LogInfo("TrackingQualityChecker") << " created TrackingMEsMap" << std::endl;
0041 
0042   TrackingLSMEs tracking_ls_mes;
0043   std::vector<edm::ParameterSet> TrackingLSQualityMEs =
0044       pSet_.getParameter<std::vector<edm::ParameterSet> >("TrackingLSQualityPSets");
0045   for (const auto& meQTset : TrackingLSQualityMEs) {
0046     std::string QTname = meQTset.getParameter<std::string>("QT");
0047     tracking_ls_mes.HistoLSDir = meQTset.exists("LSdir") ? meQTset.getParameter<std::string>("LSdir") : "";
0048     tracking_ls_mes.HistoLSName = meQTset.exists("LSname") ? meQTset.getParameter<std::string>("LSname") : "";
0049     tracking_ls_mes.HistoLSLowerCut = meQTset.exists("LSlowerCut") ? meQTset.getParameter<double>("LSlowerCut") : -1.;
0050     tracking_ls_mes.HistoLSUpperCut = meQTset.exists("LSupperCut") ? meQTset.getParameter<double>("LSupperCut") : -1.;
0051     tracking_ls_mes.TrackingFlag = nullptr;
0052 
0053     if (verbose_)
0054       edm::LogInfo("TrackingQualityChecker") << " inserting " << QTname << " in TrackingMEsMap" << std::endl;
0055     TrackingLSMEsMap.insert(std::pair<std::string, TrackingLSMEs>(QTname, tracking_ls_mes));
0056   }
0057   if (verbose_)
0058     edm::LogInfo("TrackingQualityChecker") << " created TrackingLSMEsMap" << std::endl;
0059 }
0060 //
0061 // --  Destructor
0062 //
0063 TrackingQualityChecker::~TrackingQualityChecker() {
0064   edm::LogInfo("TrackingQualityChecker") << " Deleting TrackingQualityChecker "
0065                                          << "\n";
0066 }
0067 //
0068 // -- create reportSummary MEs
0069 //
0070 void TrackingQualityChecker::bookGlobalStatus(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0071   if (verbose_)
0072     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookGlobalStatus] already booked ? "
0073                                            << (bookedTrackingGlobalStatus_ ? "yes" : "nope") << std::endl;
0074 
0075   if (!bookedTrackingGlobalStatus_) {
0076     ibooker.cd();
0077     edm::LogInfo("TrackingQualityChecker") << " booking TrackingQualityStatus"
0078                                            << "\n";
0079 
0080     std::string tracking_dir = "";
0081     TrackingUtility::getTopFolderPath(ibooker, igetter, TopFolderName_, tracking_dir);
0082     ibooker.setCurrentFolder(TopFolderName_ + "/EventInfo");
0083 
0084     TrackGlobalSummaryReportGlobal = ibooker.bookFloat("reportSummary");
0085 
0086     std::string hname, htitle;
0087     hname = "reportSummaryMap";
0088     htitle = "Tracking Report Summary Map";
0089 
0090     size_t nQT = TrackingMEsMap.size();
0091     if (verbose_)
0092       edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookGlobalStatus] nQT: " << nQT << std::endl;
0093     TrackGlobalSummaryReportMap = ibooker.book2D(hname, htitle, nQT, 0.5, float(nQT) + 0.5, 1, 0.5, 1.5);
0094     TrackGlobalSummaryReportMap->setAxisTitle("Track Quality Type", 1);
0095     TrackGlobalSummaryReportMap->setAxisTitle("QTest Flag", 2);
0096     size_t ibin = 0;
0097     for (const auto& meQTset : TrackingMEsMap) {
0098       TrackGlobalSummaryReportMap->setBinLabel(ibin + 1, meQTset.first);
0099       ibin++;
0100     }
0101 
0102     ibooker.setCurrentFolder(TopFolderName_ + "/EventInfo/reportSummaryContents");
0103 
0104     for (std::map<std::string, TrackingMEs>::iterator it = TrackingMEsMap.begin(); it != TrackingMEsMap.end(); it++) {
0105       std::string meQTname = it->first;
0106       it->second.TrackingFlag = ibooker.bookFloat("Track" + meQTname);
0107       if (verbose_)
0108         edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookGlobalStatus] " << it->first
0109                                                << " exists ? " << it->second.TrackingFlag << std::endl;
0110       if (verbose_)
0111         edm::LogInfo("TrackingQualityChecker")
0112             << "[TrackingQualityChecker::bookGlobalStatus] DONE w/ TrackingMEsMap" << std::endl;
0113     }
0114 
0115     bookedTrackingGlobalStatus_ = true;
0116     ibooker.cd();
0117   }
0118 }
0119 
0120 void TrackingQualityChecker::bookLSStatus(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0121   if (verbose_)
0122     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookLSStatus] already booked ? "
0123                                            << (bookedTrackingLSStatus_ ? "yes" : "nope") << std::endl;
0124 
0125   if (!bookedTrackingLSStatus_) {
0126     ibooker.cd();
0127     edm::LogInfo("TrackingQualityChecker") << " booking TrackingQualityStatus"
0128                                            << "\n";
0129 
0130     std::string tracking_dir = "";
0131     TrackingUtility::getTopFolderPath(ibooker, igetter, TopFolderName_, tracking_dir);
0132     ibooker.setCurrentFolder(TopFolderName_ + "/EventInfo");
0133 
0134     TrackLSSummaryReportGlobal = ibooker.bookFloat("reportSummary");
0135 
0136     std::string hname, htitle;
0137     hname = "reportSummaryMap";
0138     htitle = "Tracking Report Summary Map";
0139 
0140     if (verbose_) {
0141       size_t nQT = TrackingLSMEsMap.size();
0142       edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookLSStatus] nQT: " << nQT << std::endl;
0143     }
0144 
0145     ibooker.setCurrentFolder(TopFolderName_ + "/EventInfo/reportSummaryContents");
0146     for (std::map<std::string, TrackingLSMEs>::iterator it = TrackingLSMEsMap.begin(); it != TrackingLSMEsMap.end();
0147          it++) {
0148       std::string meQTname = it->first;
0149       it->second.TrackingFlag = ibooker.bookFloat("Track" + meQTname);
0150       if (verbose_)
0151         edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::bookLSStatus] " << it->first << " exists ? "
0152                                                << it->second.TrackingFlag << std::endl;
0153       if (verbose_)
0154         edm::LogInfo("TrackingQualityChecker")
0155             << "[TrackingQualityChecker::bookLSStatus] DONE w/ TrackingLSMEsMap" << std::endl;
0156     }
0157 
0158     bookedTrackingLSStatus_ = true;
0159     ibooker.cd();
0160   }
0161 }
0162 
0163 //
0164 // -- Fill Dummy  Status
0165 //
0166 void TrackingQualityChecker::fillDummyGlobalStatus() {
0167   if (verbose_)
0168     edm::LogInfo("TrackingQualityChecker")
0169         << "[TrackingQualityChecker::fillDummyGlobalStatus] starting ..." << std::endl;
0170 
0171   resetGlobalStatus();
0172   if (verbose_)
0173     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillDummyGlobalStatus] already booked ? "
0174                                            << (bookedTrackingGlobalStatus_ ? "yes" : "nope") << std::endl;
0175   if (bookedTrackingGlobalStatus_) {
0176     TrackGlobalSummaryReportGlobal->Fill(-1.0);
0177 
0178     for (int ibin = 1; ibin < TrackGlobalSummaryReportMap->getNbinsX() + 1; ibin++) {
0179       fillStatusHistogram(TrackGlobalSummaryReportMap, ibin, 1, -1.0);
0180     }
0181 
0182     for (std::map<std::string, TrackingMEs>::iterator it = TrackingMEsMap.begin(); it != TrackingMEsMap.end(); it++)
0183       it->second.TrackingFlag->Fill(-1.0);
0184     if (verbose_)
0185       edm::LogInfo("TrackingQualityChecker")
0186           << "[TrackingQualityChecker::fillDummyGlobalStatus] DONE w/ TrackingMEsMap" << std::endl;
0187   }
0188 }
0189 void TrackingQualityChecker::fillDummyLSStatus() {
0190   if (verbose_)
0191     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillDummyLSStatus] starting ..." << std::endl;
0192 
0193   resetLSStatus();
0194   if (verbose_)
0195     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillDummyLSStatus] already booked ? "
0196                                            << (bookedTrackingLSStatus_ ? "yes" : "nope") << std::endl;
0197   if (bookedTrackingLSStatus_) {
0198     TrackLSSummaryReportGlobal->Fill(-1.0);
0199     for (std::map<std::string, TrackingLSMEs>::iterator it = TrackingLSMEsMap.begin(); it != TrackingLSMEsMap.end();
0200          it++)
0201       it->second.TrackingFlag->Fill(-1.0);
0202     if (verbose_)
0203       edm::LogInfo("TrackingQualityChecker")
0204           << "[TrackingQualityChecker::fillDummyLSStatus] DONE w/ TrackingLSMEsMap" << std::endl;
0205   }
0206 }
0207 
0208 //
0209 // -- Reset Status
0210 //
0211 void TrackingQualityChecker::resetGlobalStatus() {
0212   if (verbose_)
0213     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::resetGlobalStatus] already booked ? "
0214                                            << (bookedTrackingGlobalStatus_ ? "yes" : "nope") << std::endl;
0215   if (bookedTrackingGlobalStatus_) {
0216     TrackGlobalSummaryReportGlobal->Reset();
0217     TrackGlobalSummaryReportMap->Reset();
0218 
0219     for (std::map<std::string, TrackingMEs>::iterator it = TrackingMEsMap.begin(); it != TrackingMEsMap.end(); it++) {
0220       MonitorElement* me = it->second.TrackingFlag;
0221       if (verbose_)
0222         edm::LogInfo("TrackingQualityChecker")
0223             << "[TrackingQualityChecker::resetGlobalStatus] " << it->second.HistoName << " exist ? "
0224             << (it->second.TrackingFlag == nullptr ? "nope" : "yes") << " ---> " << me << std::endl;
0225       me->Reset();
0226     }
0227     if (verbose_)
0228       edm::LogInfo("TrackingQualityChecker")
0229           << "[TrackingQualityChecker::resetGlobalStatus] DONE w/ TrackingMEsMap" << std::endl;
0230   }
0231 }
0232 void TrackingQualityChecker::resetLSStatus() {
0233   if (verbose_)
0234     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::resetLSStatus] already booked ? "
0235                                            << (bookedTrackingLSStatus_ ? "yes" : "nope") << std::endl;
0236   if (bookedTrackingLSStatus_) {
0237     TrackLSSummaryReportGlobal->Reset();
0238     for (std::map<std::string, TrackingLSMEs>::iterator it = TrackingLSMEsMap.begin(); it != TrackingLSMEsMap.end();
0239          it++) {
0240       MonitorElement* me = it->second.TrackingFlag;
0241       if (verbose_)
0242         edm::LogInfo("TrackingQualityChecker")
0243             << "[TrackingQualityChecker::resetLSStatus] " << it->second.HistoLSName << " exist ? "
0244             << (it->second.TrackingFlag == nullptr ? "nope" : "yes") << " ---> " << me << std::endl;
0245       me->Reset();
0246     }
0247     if (verbose_)
0248       edm::LogInfo("TrackingQualityChecker")
0249           << "[TrackingQualityChecker::resetLSStatus] DONE w/ TrackingLSMEsMap" << std::endl;
0250   }
0251 }
0252 
0253 //
0254 // -- Fill Status
0255 //
0256 void TrackingQualityChecker::fillGlobalStatus(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0257   if (verbose_)
0258     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillGlobalStatus] already booked ? "
0259                                            << (bookedTrackingGlobalStatus_ ? "yes" : "nope") << std::endl;
0260   if (!bookedTrackingGlobalStatus_)
0261     bookGlobalStatus(ibooker, igetter);
0262 
0263   fillDummyGlobalStatus();
0264   fillTrackingStatus(ibooker, igetter);
0265   if (verbose_)
0266     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillGlobalStatus] DONE" << std::endl;
0267   ibooker.cd();
0268 }
0269 
0270 void TrackingQualityChecker::fillLSStatus(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0271   if (verbose_)
0272     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillLSStatus] already booked ? "
0273                                            << (bookedTrackingLSStatus_ ? "yes" : "nope") << std::endl;
0274   if (!bookedTrackingLSStatus_)
0275     bookLSStatus(ibooker, igetter);
0276 
0277   fillDummyLSStatus();
0278   fillTrackingStatusAtLumi(ibooker, igetter);
0279   if (verbose_)
0280     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillLSStatus] DONE" << std::endl;
0281   ibooker.cd();
0282 }
0283 
0284 //
0285 // -- Fill Tracking Status
0286 //
0287 void TrackingQualityChecker::fillTrackingStatus(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0288   float gstatus = 0.0;
0289 
0290   ibooker.cd();
0291   if (!TrackingUtility::goToDir(ibooker, igetter, TopFolderName_))
0292     return;
0293 
0294   int ibin = 0;
0295   for (std::map<std::string, TrackingMEs>::iterator it = TrackingMEsMap.begin(); it != TrackingMEsMap.end(); it++) {
0296     if (verbose_)
0297       edm::LogInfo("TrackingQualityChecker")
0298           << "fillTrackingStatus ME: " << it->first << " [" << it->second.TrackingFlag->getFullname()
0299           << "] flag: " << it->second.TrackingFlag->getFloatValue() << std::endl;
0300 
0301     ibin++;
0302 
0303     std::string localMEdirpath = it->second.HistoDir;
0304     std::string MEname = it->second.HistoName;
0305 
0306     std::vector<MonitorElement*> tmpMEvec = igetter.getContents(ibooker.pwd() + "/" + localMEdirpath);
0307     //SeedNStrip and SeedNPixel DQM plots are in SiStrip folder (not inside Tracking folder)
0308     if (it->first == "SeedNStrip" or it->first == "SeedNPixel") {
0309       tmpMEvec = igetter.getContents(localMEdirpath);
0310     }
0311     if (verbose_)
0312       edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus tmpMEvec: " << tmpMEvec.size() << std::endl;
0313     MonitorElement* me = nullptr;
0314 
0315     size_t nMEs = 0;
0316     for (auto ime : tmpMEvec) {
0317       std::string name = ime->getName();
0318       if (verbose_)
0319         edm::LogInfo("TrackingQualityChecker") << "name: " << name << " <-- --> " << MEname << std::endl;
0320       if (name.find(MEname) != std::string::npos) {
0321         me = ime;
0322         nMEs++;
0323       }
0324     }
0325     // only one ME found
0326     if (verbose_)
0327       edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus nMEs: " << nMEs << std::endl;
0328     if (nMEs == 1) {
0329       float status = 0.;
0330       for (auto ime : tmpMEvec) {
0331         std::string name = ime->getName();
0332         if (verbose_)
0333           edm::LogInfo("TrackingQualityChecker") << "name: " << name << " [" << MEname << "]" << std::endl;
0334         if (name.find(MEname) != std::string::npos) {
0335           me = ime;
0336           if (verbose_)
0337             edm::LogInfo("TrackingQualityChecker") << "inside the loop nQTme: " << me->getQReports().size() << "["
0338                                                    << ime->getFullname() << "]" << std::endl;
0339         }
0340       }
0341       if (verbose_)
0342         edm::LogInfo("TrackingQualityChecker")
0343             << "me: " << me << "[" << me->getName() << ", " << me->getFullname() << "]" << std::endl;
0344       if (!me)
0345         continue;
0346       if (verbose_)
0347         edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus status: " << status << std::endl;
0348       std::vector<QReport*> qt_reports = me->getQReports();
0349       size_t nQTme = qt_reports.size();
0350       if (verbose_)
0351         edm::LogInfo("TrackingQualityChecker") << "nQTme: " << nQTme << std::endl;
0352       if (nQTme != 0) {
0353         if (verbose_)
0354           edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus qt_reports: " << qt_reports.size() << std::endl;
0355         // loop on possible QTs
0356         for (auto iQT : qt_reports) {
0357           status += iQT->getQTresult();
0358           if (verbose_)
0359             edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus iQT: " << iQT->getQRName() << std::endl;
0360           if (verbose_)
0361             edm::LogInfo("TrackingQualityChecker")
0362                 << "fillTrackingStatus MEname: " << MEname << " status: " << iQT->getQTresult() << " exists ? "
0363                 << (it->second.TrackingFlag ? "yes " : "no ") << it->second.TrackingFlag << std::endl;
0364           if (verbose_)
0365             edm::LogInfo("TrackingQualityChecker")
0366                 << "fillTrackingStatus iQT message: " << iQT->getMessage() << std::endl;
0367           if (verbose_)
0368             edm::LogInfo("TrackingQualityChecker")
0369                 << "fillTrackingStatus iQT status: " << iQT->getStatus() << std::endl;
0370         }
0371         status = status / float(nQTme);
0372         if (verbose_)
0373           edm::LogInfo("TrackingQualityChecker")
0374               << "fillTrackingStatus MEname: " << MEname << " status: " << status << std::endl;
0375         it->second.TrackingFlag->Fill(status);
0376         if (verbose_)
0377           edm::LogInfo("TrackingQualityChecker")
0378               << "fillTrackingStatus TrackGlobalSummaryReportMap: " << TrackGlobalSummaryReportMap << std::endl;
0379         fillStatusHistogram(TrackGlobalSummaryReportMap, ibin, 1, status);
0380       }
0381 
0382       if (verbose_)
0383         edm::LogInfo("TrackingQualityChecker")
0384             << "fillTrackingStatus gstatus: " << gstatus << " x status: " << status << std::endl;
0385       if (status < 0.)
0386         gstatus = -1.;
0387       else
0388         gstatus += status;
0389       if (verbose_)
0390         edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus ===> gstatus: " << gstatus << std::endl;
0391       if (verbose_)
0392         edm::LogInfo("TrackingQualityChecker")
0393             << "fillTrackingStatus ME: " << it->first << " [" << it->second.TrackingFlag->getFullname()
0394             << "] flag: " << it->second.TrackingFlag->getFloatValue() << std::endl;
0395 
0396     } else {  // more than 1 ME w/ the same root => they need to be considered together
0397       float status = 1.;
0398       for (auto ime : tmpMEvec) {
0399         float tmp_status = 1.;
0400         std::string name = ime->getName();
0401         if (name.find(MEname) != std::string::npos) {
0402           me = ime;
0403 
0404           if (verbose_)
0405             edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus status: " << status << std::endl;
0406           std::vector<QReport*> qt_reports = me->getQReports();
0407           size_t nQTme = qt_reports.size();
0408           if (verbose_)
0409             edm::LogInfo("TrackingQualityChecker")
0410                 << "nQTme: " << nQTme << "[" << name << ", " << ime->getFullname() << "]" << std::endl;
0411           if (nQTme != 0) {
0412             if (verbose_)
0413               edm::LogInfo("TrackingQualityChecker")
0414                   << "fillTrackingStatus qt_reports: " << qt_reports.size() << std::endl;
0415             // loop on possible QTs
0416             for (auto iQT : qt_reports) {
0417               tmp_status = 0;  // reset status
0418               tmp_status += iQT->getQTresult();
0419               if (verbose_)
0420                 edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus iQT: " << iQT->getQRName() << std::endl;
0421               if (verbose_)
0422                 edm::LogInfo("TrackingQualityChecker")
0423                     << "fillTrackingStatus MEname: " << MEname << " status: " << iQT->getQTresult() << " exists ? "
0424                     << (it->second.TrackingFlag ? "yes " : "no ") << it->second.TrackingFlag << std::endl;
0425               if (verbose_)
0426                 edm::LogInfo("TrackingQualityChecker")
0427                     << "fillTrackingStatus iQT message: " << iQT->getMessage() << std::endl;
0428               if (verbose_)
0429                 edm::LogInfo("TrackingQualityChecker")
0430                     << "fillTrackingStatus iQT status: " << iQT->getStatus() << std::endl;
0431             }
0432             tmp_status = tmp_status / float(nQTme);
0433           }
0434         }
0435         status = fminf(tmp_status, status);
0436       }
0437       if (status < 0.)
0438         gstatus = -1.;
0439       else
0440         gstatus += status;
0441       if (verbose_)
0442         edm::LogInfo("TrackingQualityChecker")
0443             << "fillTrackingStatus MEname: " << MEname << " status: " << status << std::endl;
0444       it->second.TrackingFlag->Fill(status);
0445       if (verbose_)
0446         edm::LogInfo("TrackingQualityChecker")
0447             << "fillTrackingStatus TrackGlobalSummaryReportMap: " << TrackGlobalSummaryReportMap << std::endl;
0448 
0449       fillStatusHistogram(TrackGlobalSummaryReportMap, ibin, 1, status);
0450     }
0451   }
0452 
0453   // After harvesting, all per-lumi MEs are reset, to make sure we only get
0454   // events of the new lumisection next time.
0455   for (std::map<std::string, TrackingMEs>::iterator it = TrackingMEsMap.begin(); it != TrackingMEsMap.end(); it++) {
0456     std::string localMEdirpath = it->second.HistoDir;
0457     std::vector<MonitorElement*> tmpMEvec = igetter.getContents(ibooker.pwd() + "/" + localMEdirpath);
0458     for (auto ime : tmpMEvec) {
0459       if (ime->getLumiFlag()) {
0460         ime->Reset();
0461       }
0462     }
0463   }
0464 
0465   if (verbose_)
0466     edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus gstatus: " << gstatus << std::endl;
0467   size_t nQT = TrackingMEsMap.size();
0468   if (gstatus < 1.)
0469     gstatus = -1.;
0470   else
0471     gstatus = gstatus / float(nQT);
0472 
0473   if (verbose_)
0474     edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus ===> gstatus: " << gstatus << std::endl;
0475   TrackGlobalSummaryReportGlobal->Fill(gstatus);
0476   ibooker.cd();
0477 
0478   if (verbose_)
0479     edm::LogInfo("TrackingQualityChecker") << "fillTrackingStatus DONE" << std::endl;
0480 }
0481 
0482 //
0483 // -- Fill Report Summary Map
0484 //
0485 void TrackingQualityChecker::fillStatusHistogram(MonitorElement* me, int xbin, int ybin, float val) {
0486   if (me && me->kind() == MonitorElement::Kind::TH2F) {
0487     TH2F* th2d = me->getTH2F();
0488     th2d->SetBinContent(xbin, ybin, val);
0489   }
0490 }
0491 
0492 // Fill Tracking Status MEs at the Lumi block
0493 //
0494 void TrackingQualityChecker::fillTrackingStatusAtLumi(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0495   if (verbose_)
0496     edm::LogInfo("TrackingQualityChecker")
0497         << "[TrackingQualityChecker::fillTrackingStatusAtLumi] starting .. " << std::endl;
0498   float gstatus = 1.0;
0499 
0500   ibooker.cd();
0501   if (!TrackingUtility::goToDir(ibooker, igetter, TopFolderName_))
0502     return;
0503 
0504   for (std::map<std::string, TrackingLSMEs>::iterator it = TrackingLSMEsMap.begin(); it != TrackingLSMEsMap.end();
0505        it++) {
0506     if (verbose_)
0507       edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillTrackingStatusAtLumi] ME: " << it->first
0508                                              << " [" << it->second.TrackingFlag->getFullname()
0509                                              << "] flag: " << it->second.TrackingFlag->getFloatValue() << std::endl;
0510 
0511     std::string localMEdirpath = it->second.HistoLSDir;
0512     std::string MEname = it->second.HistoLSName;
0513     float lower_cut = it->second.HistoLSLowerCut;
0514     float upper_cut = it->second.HistoLSUpperCut;
0515 
0516     float status = 1.0;
0517 
0518     std::vector<MonitorElement*> tmpMEvec = igetter.getContents(ibooker.pwd() + "/" + localMEdirpath);
0519     if (verbose_)
0520       edm::LogInfo("TrackingQualityChecker")
0521           << "[TrackingQualityChecker::fillTrackingStatusAtLumi] tmpMEvec: " << tmpMEvec.size() << std::endl;
0522 
0523     MonitorElement* me = nullptr;
0524 
0525     size_t nMEs = 0;
0526     for (auto ime : tmpMEvec) {
0527       std::string name = ime->getName();
0528       if (name.find(MEname) != std::string::npos) {
0529         me = ime;
0530         nMEs++;
0531       }
0532     }
0533     // only one ME found
0534     if (nMEs == 1) {
0535       for (auto ime : tmpMEvec) {
0536         std::string name = ime->getName();
0537         if (name.find(MEname) != std::string::npos) {
0538           me = ime;
0539         }
0540       }
0541       if (!me)
0542         continue;
0543 
0544       if (me->kind() == MonitorElement::Kind::TH1F) {
0545         float x_mean = me->getMean();
0546         if (verbose_)
0547           edm::LogInfo("TrackingQualityChecker")
0548               << "[TrackingQualityChecker::fillTrackingStatusAtLumi] MEname: " << MEname << " x_mean: " << x_mean
0549               << std::endl;
0550         if (x_mean <= lower_cut || x_mean > upper_cut)
0551           status = 0.0;
0552         else
0553           status = 1.0;
0554       }
0555     } else {  // more than 1 ME w/ the same root => they need to be considered together
0556       for (auto ime : tmpMEvec) {
0557         float tmp_status = 1.;
0558         std::string name = ime->getName();
0559         if (name.find(MEname) != std::string::npos) {
0560           me = ime;
0561           if (!me)
0562             continue;
0563 
0564           if (me->kind() == MonitorElement::Kind::TH1F) {
0565             float x_mean = me->getMean();
0566             if (verbose_)
0567               edm::LogInfo("TrackingQualityChecker")
0568                   << "[TrackingQualityChecker::fillTrackingStatusAtLumi] MEname: " << MEname << "[" << me->getName()
0569                   << "]  x_mean: " << x_mean << std::endl;
0570             if (x_mean <= lower_cut || x_mean > upper_cut)
0571               tmp_status = 0.0;
0572             else
0573               tmp_status = 1.0;
0574             if (verbose_)
0575               edm::LogInfo("TrackingQualityChecker")
0576                   << "[TrackingQualityChecker::fillTrackingStatusAtLumi] tmp_status: " << tmp_status << std::endl;
0577           }
0578         }
0579         status = fminf(tmp_status, status);
0580         if (verbose_)
0581           edm::LogInfo("TrackingQualityChecker")
0582               << "[TrackingQualityChecker::fillTrackingStatusAtLumi] ==> status: " << status << std::endl;
0583       }  // loop on tmpMEvec
0584     }
0585     it->second.TrackingFlag->Fill(status);
0586     if (verbose_)
0587       edm::LogInfo("TrackingQualityChecker")
0588           << "[TrackingQualityChecker::fillTrackingStatusAtLumi] ===> status: " << status << " [" << gstatus << "]"
0589           << std::endl;
0590     if (status == 0.0)
0591       gstatus = -1.0;
0592     else
0593       gstatus = gstatus * status;
0594     if (verbose_)
0595       edm::LogInfo("TrackingQualityChecker")
0596           << "[TrackingQualityChecker::fillTrackingStatusAtLumi] ===> gstatus: " << gstatus << std::endl;
0597     if (verbose_)
0598       edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillTrackingStatusAtLumi] ME: " << it->first
0599                                              << " [" << it->second.TrackingFlag->getFullname()
0600                                              << "] flag: " << it->second.TrackingFlag->getFloatValue() << std::endl;
0601   }
0602   TrackLSSummaryReportGlobal->Fill(gstatus);
0603   ibooker.cd();
0604 
0605   if (verbose_)
0606     edm::LogInfo("TrackingQualityChecker") << "[TrackingQualityChecker::fillTrackingStatusAtLumi] DONE" << std::endl;
0607 }