From 0f536d0e15d742e170a96496cf0408cafa8c571c Mon Sep 17 00:00:00 2001 From: Byeonghak Ko Date: Fri, 11 Mar 2022 09:12:08 +0100 Subject: [PATCH] Lumi-based status plots --- DQM/GEM/interface/GEMDAQStatusSource.h | 30 ++ DQM/GEM/plugins/BuildFile.xml | 2 + DQM/GEM/plugins/GEMDAQStatusSource.cc | 130 ++++++-- DQM/GEM/plugins/GEMDQMHarvester.cc | 399 +++++++++++++++++++++++-- DQM/GEM/test/decomposeStatus.py | 102 +++++++ 5 files changed, 604 insertions(+), 59 deletions(-) create mode 100644 DQM/GEM/test/decomposeStatus.py diff --git a/DQM/GEM/interface/GEMDAQStatusSource.h b/DQM/GEM/interface/GEMDAQStatusSource.h index 2b448ba1acd20..9a3ac39bcab4b 100644 --- a/DQM/GEM/interface/GEMDAQStatusSource.h +++ b/DQM/GEM/interface/GEMDAQStatusSource.h @@ -16,6 +16,9 @@ #include "Validation/MuonGEMHits/interface/GEMValidationUtils.h" +#include "CondFormats/DataRecord/interface/GEMeMapRcd.h" +#include "CondFormats/GEMObjects/interface/GEMeMap.h" +#include "CondFormats/GEMObjects/interface/GEMROMapping.h" #include "DataFormats/GEMDigi/interface/GEMDigiCollection.h" #include "DataFormats/GEMDigi/interface/GEMVFATStatusCollection.h" #include "DataFormats/GEMDigi/interface/GEMOHStatusCollection.h" @@ -35,6 +38,8 @@ class GEMDAQStatusSource : public GEMDQMBase { static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); protected: + void LoadROMap(edm::EventSetup const &iSetup); + void dqmBeginRun(edm::Run const &, edm::EventSetup const &) override{}; void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override; void analyze(edm::Event const &e, edm::EventSetup const &eSetup) override; @@ -44,6 +49,18 @@ class GEMDAQStatusSource : public GEMDQMBase { bErr = true; }; + void FillStatusSummaryPlot(std::map &mapChamber, + MonitorElement *h2Plot, + std::map *pmapSummary = nullptr) { + for (auto const &[key4, bFlag] : mapChamber) { // bFlag is not used + ME3IdsKey key3 = key4Tokey3(key4); + Int_t nChamber = keyToChamber(key4); + h2Plot->Fill(nChamber, mapStationToIdx_[key3]); + if (pmapSummary != nullptr) + (*pmapSummary)[key4] = true; + } + }; + private: int ProcessWithMEMap3(BookingHelper &bh, ME3IdsKey key) override; int ProcessWithMEMap3WithChamber(BookingHelper &bh, ME4IdsKey key) override; @@ -53,6 +70,10 @@ class GEMDAQStatusSource : public GEMDQMBase { void SetLabelOHStatus(MonitorElement *h2Status); void SetLabelVFATStatus(MonitorElement *h2Status); + edm::ESGetToken gemEMapToken_; + //std::shared_ptr gemROMap_; + const GEMeMap *gemEMap_; + edm::EDGetToken tagVFAT_; edm::EDGetToken tagOH_; edm::EDGetToken tagAMC_; @@ -72,10 +93,19 @@ class GEMDAQStatusSource : public GEMDQMBase { MonitorElement *h2SummaryStatusAll; MonitorElement *h2SummaryStatusWarning; MonitorElement *h2SummaryStatusError; + MonitorElement *h2SummaryStatusVFATWarning; + MonitorElement *h2SummaryStatusVFATError; + MonitorElement *h2SummaryStatusOHWarning; + MonitorElement *h2SummaryStatusOHError; + MonitorElement *h2SummaryStatusAMCWarning; + MonitorElement *h2SummaryStatusAMCError; + MonitorElement *h2SummaryStatusAMC13Error; Int_t nBXMin_, nBXMax_; std::map mapFEDIdToRe_; + std::map> mapAMC13ToListChamber_; + std::map, std::vector> mapAMCToListChamber_; Int_t nAMCSlots_; int nBitAMC13_ = 10; diff --git a/DQM/GEM/plugins/BuildFile.xml b/DQM/GEM/plugins/BuildFile.xml index b811f938f2f7d..e75eee2638ebd 100644 --- a/DQM/GEM/plugins/BuildFile.xml +++ b/DQM/GEM/plugins/BuildFile.xml @@ -3,5 +3,7 @@ + + diff --git a/DQM/GEM/plugins/GEMDAQStatusSource.cc b/DQM/GEM/plugins/GEMDAQStatusSource.cc index e20cf95c57bc0..dc702557bb2cf 100644 --- a/DQM/GEM/plugins/GEMDAQStatusSource.cc +++ b/DQM/GEM/plugins/GEMDAQStatusSource.cc @@ -10,6 +10,7 @@ GEMDAQStatusSource::GEMDAQStatusSource(const edm::ParameterSet &cfg) : GEMDQMBas tagAMC13_ = consumes(cfg.getParameter("AMC13InputLabel")); nAMCSlots_ = cfg.getParameter("AMCSlots"); + gemEMapToken_ = esConsumes(); } void GEMDAQStatusSource::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { @@ -25,6 +26,40 @@ void GEMDAQStatusSource::fillDescriptions(edm::ConfigurationDescriptions &descri descriptions.add("GEMDAQStatusSource", desc); } +void GEMDAQStatusSource::LoadROMap(edm::EventSetup const &iSetup) { + auto gemROMap = std::make_shared(); + //if (useDBEMap_) + if (true) { + const auto &eMap = iSetup.getData(gemEMapToken_); + auto gemEMap = std::make_unique(eMap); + gemEMap->convert(*gemROMap); + + for (auto imap : gemEMap->theChamberMap_) { + int nNumChamber = (int)imap.fedId.size(); + for (int i = 0; i < nNumChamber; i++) { + unsigned int fedId = imap.fedId[i]; + uint8_t amcNum = imap.amcNum[i]; + uint8_t gebId = imap.gebId[i]; + GEMROMapping::chamEC geb_ec{fedId, amcNum, gebId}; + GEMROMapping::chamDC geb_dc = gemROMap->chamberPos(geb_ec); + GEMDetId gemChId = geb_dc.detId; + + mapFEDIdToRe_[fedId] = gemChId.region(); + mapAMC13ToListChamber_[fedId].push_back(gemChId); + mapAMCToListChamber_[{fedId, amcNum}].push_back(gemChId); + } + } + + gemEMap.reset(); + } else { + // no EMap in DB, using dummy + // FIXME: How to add mapFEDIdToRe_ and mapDetIdToAMC_?? + auto gemEMap = std::make_unique(); + gemEMap->convertDummy(*gemROMap); + gemEMap.reset(); + } +} + void GEMDAQStatusSource::SetLabelAMC13Status(MonitorElement *h2Status) { unsigned int unBinPos = 1; h2Status->setBinLabel(unBinPos++, "Good", 2); @@ -91,6 +126,9 @@ void GEMDAQStatusSource::SetLabelVFATStatus(MonitorElement *h2Status) { } void GEMDAQStatusSource::bookHistograms(DQMStore::IBooker &ibooker, edm::Run const &, edm::EventSetup const &iSetup) { + LoadROMap(iSetup); + if (mapAMC13ToListChamber_.empty() || mapAMCToListChamber_.empty()) + return; initGeometry(iSetup); if (GEMGeometry_ == nullptr) return; @@ -145,10 +183,24 @@ void GEMDAQStatusSource::bookHistograms(DQMStore::IBooker &ibooker, edm::Run con h2SummaryStatusAll = CreateSummaryHist(ibooker, "chamberAllStatus"); h2SummaryStatusWarning = CreateSummaryHist(ibooker, "chamberWarnings"); h2SummaryStatusError = CreateSummaryHist(ibooker, "chamberErrors"); + h2SummaryStatusVFATWarning = CreateSummaryHist(ibooker, "chamberVFATWarnings"); + h2SummaryStatusVFATError = CreateSummaryHist(ibooker, "chamberVFATErrors"); + h2SummaryStatusOHWarning = CreateSummaryHist(ibooker, "chamberOHWarnings"); + h2SummaryStatusOHError = CreateSummaryHist(ibooker, "chamberOHErrors"); + h2SummaryStatusAMCWarning = CreateSummaryHist(ibooker, "chamberAMCWarnings"); + h2SummaryStatusAMCError = CreateSummaryHist(ibooker, "chamberAMCErrors"); + h2SummaryStatusAMC13Error = CreateSummaryHist(ibooker, "chamberAMC13Errors"); h2SummaryStatusAll->setTitle("Summary of all number of OH or VFAT status of each chambers"); - h2SummaryStatusWarning->setTitle("Summary of OH or VFAT warnings of each chambers"); - h2SummaryStatusError->setTitle("Summary of OH or VFAT errors of each chambers"); + h2SummaryStatusWarning->setTitle("Summary of all warnings of each chambers"); + h2SummaryStatusError->setTitle("Summary of all errors of each chambers"); + h2SummaryStatusVFATWarning->setTitle("Summary of VFAT warnings of each chambers"); + h2SummaryStatusVFATError->setTitle("Summary of VFAT errors of each chambers"); + h2SummaryStatusOHWarning->setTitle("Summary of OH warnings of each chambers"); + h2SummaryStatusOHError->setTitle("Summary of OH errors of each chambers"); + h2SummaryStatusAMCWarning->setTitle("Summary of AMC warnings of each chambers"); + h2SummaryStatusAMCError->setTitle("Summary of AMC errors of each chambers"); + h2SummaryStatusAMC13Error->setTitle("Summary of AMC13 errors of each chambers"); } int GEMDAQStatusSource::ProcessWithMEMap3(BookingHelper &bh, ME3IdsKey key) { @@ -204,6 +256,17 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const event.getByToken(tagAMC_, gemAMC); event.getByToken(tagAMC13_, gemAMC13); + std::map mapChamberAll; + std::map mapChamberWarning; + std::map mapChamberError; + std::map mapChamberVFATWarning; + std::map mapChamberVFATError; + std::map mapChamberOHWarning; + std::map mapChamberOHError; + std::map mapChamberAMCWarning; + std::map mapChamberAMCError; + std::map mapChamberAMC13Error; + for (auto amc13It = gemAMC13->begin(); amc13It != gemAMC13->end(); ++amc13It) { int fedId = (*amc13It).first; if (mapFEDIdToRe_.find(fedId) == mapFEDIdToRe_.end()) @@ -245,8 +308,16 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const if (errors.wrongFedId) FillWithRiseErr(h2AMC13Status_, nXBin, 10, bErr); - if (!bWarn && !bErr) + if (!bWarn && !bErr) { h2AMC13Status_->Fill(nXBin, 1); + } else { + auto &listChamber = mapAMC13ToListChamber_[fedId]; + for (auto gid : listChamber) { + ME4IdsKey key4Ch{gid.region(), gid.station(), gid.layer(), gid.chamber()}; + if (bErr) + mapChamberAMC13Error[key4Ch] = false; + } + } } } @@ -298,16 +369,21 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const if (errors.BC0locked) FillWithRiseErr(h2AMCStatus, nAMCNum, 12, bErr); - if (!bWarn && !bErr) + if (!bWarn && !bErr) { h2AMCStatus->Fill(nAMCNum, 1); + } else { + auto &listChamber = mapAMCToListChamber_[{fedId, nAMCNum}]; + for (auto gid : listChamber) { + ME4IdsKey key4Ch{gid.region(), gid.station(), gid.layer(), gid.chamber()}; + if (bErr) + mapChamberAMCError[key4Ch] = false; + if (bWarn) + mapChamberAMCWarning[key4Ch] = false; + } + } } } - // WARNING: ME4IdsKey for region, station, layer, chamber (not iEta) - std::map mapChamberAll; - std::map mapChamberWarning; - std::map mapChamberError; - for (auto ohIt = gemOH->begin(); ohIt != gemOH->end(); ++ohIt) { GEMDetId gid = (*ohIt).first; ME3IdsKey key3{gid.region(), gid.station(), gid.layer()}; @@ -356,9 +432,9 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const if (!bWarn && !bErr) mapStatusOH_.Fill(key3, gid.chamber(), 1); if (bWarn) - mapChamberWarning[key4] = false; + mapChamberOHWarning[key4] = false; if (bErr) - mapChamberError[key4] = false; + mapChamberOHError[key4] = false; mapChamberAll[key4] = true; } } @@ -407,9 +483,9 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const if (!bWarn && !bErr) mapStatusVFATPerCh_.Fill(key4Ch, nIdxVFAT, 1); if (bWarn) - mapChamberWarning[key4Ch] = false; + mapChamberVFATWarning[key4Ch] = false; if (bErr) - mapChamberError[key4Ch] = false; + mapChamberVFATError[key4Ch] = false; if (bWarn) mapStatusWarnVFATPerLayer_.Fill(key3, gid.chamber(), nIdxVFAT); if (bErr) @@ -425,21 +501,19 @@ void GEMDAQStatusSource::analyze(edm::Event const &event, edm::EventSetup const h2SummaryStatusAll->Fill(nChamber, mapStationToIdx_[key3]); } - // Summarizing the warning occupancy - for (auto const &[key4, bWarning] : mapChamberWarning) { - if (mapChamberError.find(key4) != mapChamberError.end()) // Avoiding any double-counting - continue; - ME3IdsKey key3 = key4Tokey3(key4); - Int_t nChamber = keyToChamber(key4); - h2SummaryStatusWarning->Fill(nChamber, mapStationToIdx_[key3]); - } - - // Summarizing the error occupancy - for (auto const &[key4, bErr] : mapChamberError) { - ME3IdsKey key3 = key4Tokey3(key4); - Int_t nChamber = keyToChamber(key4); - h2SummaryStatusError->Fill(nChamber, mapStationToIdx_[key3]); - } + // Summarizing all presence of status of each chamber + FillStatusSummaryPlot(mapChamberAll, h2SummaryStatusAll); + // Summarizing all the error and warning occupancy + FillStatusSummaryPlot(mapChamberVFATWarning, h2SummaryStatusVFATWarning, &mapChamberWarning); + FillStatusSummaryPlot(mapChamberVFATError, h2SummaryStatusVFATError, &mapChamberError); + FillStatusSummaryPlot(mapChamberOHWarning, h2SummaryStatusOHWarning, &mapChamberWarning); + FillStatusSummaryPlot(mapChamberOHError, h2SummaryStatusOHError, &mapChamberError); + FillStatusSummaryPlot(mapChamberAMCWarning, h2SummaryStatusAMCWarning, &mapChamberWarning); + FillStatusSummaryPlot(mapChamberAMCError, h2SummaryStatusAMCError, &mapChamberError); + FillStatusSummaryPlot(mapChamberAMC13Error, h2SummaryStatusAMC13Error, &mapChamberError); + + FillStatusSummaryPlot(mapChamberWarning, h2SummaryStatusWarning); + FillStatusSummaryPlot(mapChamberError, h2SummaryStatusError); } DEFINE_FWK_MODULE(GEMDAQStatusSource); diff --git a/DQM/GEM/plugins/GEMDQMHarvester.cc b/DQM/GEM/plugins/GEMDQMHarvester.cc index 43cba47203f89..d728fe1ad4fbe 100644 --- a/DQM/GEM/plugins/GEMDQMHarvester.cc +++ b/DQM/GEM/plugins/GEMDQMHarvester.cc @@ -27,19 +27,61 @@ class GEMDQMHarvester : public DQMEDHarvester { ~GEMDQMHarvester() override{}; static void fillDescriptions(edm::ConfigurationDescriptions &descriptions); + typedef std::tuple IdChamber; + typedef std::tuple IdVFAT; + typedef struct PreStatusInfo { + int nLumiStart; + int nLumiEnd; + int nStatus; + } StatusInfo; + + class NumStatus { + public: + NumStatus(Float_t fNumTotal = 0, + Float_t fNumOcc = 0, + Float_t fNumErrVFAT = 0, + Float_t fNumWarnVFAT = 0, + Float_t fNumErrOH = 0, + Float_t fNumWarnOH = 0, + Float_t fNumErrAMC = 0, + Float_t fNumWarnAMC = 0, + Float_t fNumErrAMC13 = 0) + : fNumTotal_(fNumTotal), + fNumOcc_(fNumOcc), + fNumErrVFAT_(fNumErrVFAT), + fNumWarnVFAT_(fNumWarnVFAT), + fNumErrOH_(fNumErrOH), + fNumWarnOH_(fNumWarnOH), + fNumErrAMC_(fNumErrAMC), + fNumWarnAMC_(fNumWarnAMC), + fNumErrAMC13_(fNumErrAMC13) {} + float fNumTotal_; + float fNumOcc_; + float fNumErrVFAT_; + float fNumWarnVFAT_; + float fNumErrOH_; + float fNumWarnOH_; + float fNumErrAMC_; + float fNumWarnAMC_; + float fNumErrAMC13_; + }; + protected: void dqmEndLuminosityBlock(DQMStore::IBooker &, DQMStore::IGetter &, - edm::LuminosityBlock const &, + edm::LuminosityBlock const &iLumi, edm::EventSetup const &) override; void dqmEndJob(DQMStore::IBooker &, DQMStore::IGetter &) override{}; // Cannot use; it is called after dqmSaver - void drawSummaryHistogram(edm::Service &store); + void drawSummaryHistogram(edm::Service &store, Int_t nLumiCurr); + void createTableWatchingSummary(); void copyLabels(MonitorElement *h2Src, MonitorElement *h2Dst); void createSummaryHist(edm::Service &store, MonitorElement *h2Src, MonitorElement *&h2Sum, - std::vector &listLayers); + std::vector &listLayers, + std::map &mapIdxLayer, + std::map &mapNumChPerChamber); void createSummaryVFAT(edm::Service &store, MonitorElement *h2Src, std::string strSuffix, @@ -47,16 +89,34 @@ class GEMDQMHarvester : public DQMEDHarvester { Float_t refineSummaryHistogram(std::string strName, MonitorElement *h2Sum, MonitorElement *h2SrcOcc, - MonitorElement *h2SrcAllNum, + MonitorElement *h2SrcStatusA, MonitorElement *h2SrcStatusE, - MonitorElement *h2SrcStatusW); + MonitorElement *h2SrcStatusW, + MonitorElement *h2SrcStatusEVFAT, + MonitorElement *h2SrcStatusWVFAT, + MonitorElement *h2SrcStatusEOH, + MonitorElement *h2SrcStatusWOH, + MonitorElement *h2SrcStatusEAMC, + MonitorElement *h2SrcStatusWAMC, + MonitorElement *h2SrcStatusEAMC13, + Int_t nLumiCurr); Int_t refineSummaryVFAT(std::string strName, MonitorElement *h2Sum, MonitorElement *h2SrcOcc, MonitorElement *h2SrcStatusE, - MonitorElement *h2SrcStatusW); + MonitorElement *h2SrcStatusW, + Int_t nLumiCurr, + Int_t nIdxLayer); Int_t assessOneBin( - std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumWarn, Float_t fNumErr); + std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumErr, Float_t fNumWarn); + + Int_t UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nLumiCurr, NumStatus numStatus); + Int_t UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nIdxVFAT, Int_t nLumiCurr, NumStatus numStatus); + Int_t UpdateStatusChamber(std::vector &listStatus, + NumStatus &numStatus, + Int_t nLumiCurr, + NumStatus numStatusNew); + void createLumiFuncHist(edm::Service &store, std::string strSuffix, Int_t nIdxLayer, Int_t nLumiCurr); Float_t fCutErr_, fCutLowErr_, fCutWarn_; @@ -64,16 +124,47 @@ class GEMDQMHarvester : public DQMEDHarvester { const std::string strDirRecHit_ = "GEM/RecHits"; const std::string strDirStatus_ = "GEM/DAQStatus"; + const Int_t nCodeFine_ = 1; + const Int_t nCodeError_ = 2; + const Int_t nCodeWarning_ = 3; + const Int_t nCodeLowError_ = 4; + + const Int_t nBitWarnVFAT_ = 7; + const Int_t nBitErrVFAT_ = 6; + const Int_t nBitWarnOH_ = 5; + const Int_t nBitErrOH_ = 4; + const Int_t nBitWarnAMC_ = 3; + const Int_t nBitErrAMC_ = 2; + const Int_t nBitErrAMC13_ = 1; + const Int_t nBitOcc_ = 0; + + const Int_t nNumVFATs_ = 24; + + const Int_t nMaxLumi_ = 6000; // From DQMServices/Components/plugins/DQMProvInfo.h + //const Int_t nResolutionLumi_ = 5; + Int_t nResolutionLumi_; + typedef std::vector> TableStatusOcc; typedef std::vector> TableStatusNum; + std::map> mapStatusChambersSummary_; + std::map> mapStatusVFATsSummary_; + std::map mapNumStatusChambersSummary_; + std::map mapNumStatusVFATsSummary_; + std::vector listLayer_; + std::map mapIdxLayer_; // All indices in the following objects start at 1 + std::map mapNumChPerChamber_; + std::map mapHistLumiFunc_; + Bool_t bIsStatusChambersInit_; }; GEMDQMHarvester::GEMDQMHarvester(const edm::ParameterSet &cfg) { fCutErr_ = cfg.getParameter("cutErr"); fCutLowErr_ = cfg.getParameter("cutLowErr"); fCutWarn_ = cfg.getParameter("cutWarn"); + nResolutionLumi_ = cfg.getParameter("resolutionLumi"); + bIsStatusChambersInit_ = false; } void GEMDQMHarvester::fillDescriptions(edm::ConfigurationDescriptions &descriptions) { @@ -81,24 +172,33 @@ void GEMDQMHarvester::fillDescriptions(edm::ConfigurationDescriptions &descripti desc.add("cutErr", 0.05); desc.add("cutLowErr", 0.00); desc.add("cutWarn", 0.05); + desc.add("resolutionLumi", 1); descriptions.add("GEMDQMHarvester", desc); } void GEMDQMHarvester::dqmEndLuminosityBlock(DQMStore::IBooker &, DQMStore::IGetter &, - edm::LuminosityBlock const &, + edm::LuminosityBlock const &iLumi, edm::EventSetup const &) { edm::Service store; - drawSummaryHistogram(store); + Int_t nLumiCurr = iLumi.id().luminosityBlock(); + drawSummaryHistogram(store, nLumiCurr); } -void GEMDQMHarvester::drawSummaryHistogram(edm::Service &store) { +void GEMDQMHarvester::drawSummaryHistogram(edm::Service &store, Int_t nLumiCurr) { Float_t fReportSummary = -1.0; std::string strSrcDigiOcc = "GEM/Digis/summaryOccDigi"; std::string strSrcStatusA = "GEM/DAQStatus/chamberAllStatus"; - std::string strSrcStatusW = "GEM/DAQStatus/chamberWarnings"; std::string strSrcStatusE = "GEM/DAQStatus/chamberErrors"; + std::string strSrcStatusW = "GEM/DAQStatus/chamberWarnings"; + std::string strSrcStatusEVFAT = "GEM/DAQStatus/chamberVFATErrors"; + std::string strSrcStatusWVFAT = "GEM/DAQStatus/chamberVFATWarnings"; + std::string strSrcStatusEOH = "GEM/DAQStatus/chamberOHErrors"; + std::string strSrcStatusWOH = "GEM/DAQStatus/chamberOHWarnings"; + std::string strSrcStatusEAMC = "GEM/DAQStatus/chamberAMCErrors"; + std::string strSrcStatusWAMC = "GEM/DAQStatus/chamberAMCWarnings"; + std::string strSrcStatusEAMC13 = "GEM/DAQStatus/chamberAMC13Errors"; std::string strSrcVFATOcc = "GEM/Digis/det"; std::string strSrcVFATStatusW = "GEM/DAQStatus/vfat_statusWarnSum"; @@ -108,18 +208,42 @@ void GEMDQMHarvester::drawSummaryHistogram(edm::Service &store) { MonitorElement *h2SrcDigiOcc = store->get(strSrcDigiOcc); MonitorElement *h2SrcStatusA = store->get(strSrcStatusA); - MonitorElement *h2SrcStatusW = store->get(strSrcStatusW); MonitorElement *h2SrcStatusE = store->get(strSrcStatusE); + MonitorElement *h2SrcStatusW = store->get(strSrcStatusW); + MonitorElement *h2SrcStatusEVFAT = store->get(strSrcStatusEVFAT); + MonitorElement *h2SrcStatusWVFAT = store->get(strSrcStatusWVFAT); + MonitorElement *h2SrcStatusEOH = store->get(strSrcStatusEOH); + MonitorElement *h2SrcStatusWOH = store->get(strSrcStatusWOH); + MonitorElement *h2SrcStatusEAMC = store->get(strSrcStatusEAMC); + MonitorElement *h2SrcStatusWAMC = store->get(strSrcStatusWAMC); + MonitorElement *h2SrcStatusEAMC13 = store->get(strSrcStatusEAMC13); std::string strTitleSummary = "summary"; - if (h2SrcDigiOcc != nullptr && h2SrcStatusA != nullptr && h2SrcStatusW != nullptr && h2SrcStatusE != nullptr) { + if (h2SrcDigiOcc != nullptr && h2SrcStatusA != nullptr && h2SrcStatusE != nullptr && h2SrcStatusW != nullptr && + h2SrcStatusEVFAT != nullptr && h2SrcStatusWVFAT != nullptr && h2SrcStatusEOH != nullptr && + h2SrcStatusWOH != nullptr && h2SrcStatusEAMC != nullptr && h2SrcStatusWAMC != nullptr && + h2SrcStatusEAMC13 != nullptr) { MonitorElement *h2Sum = nullptr; - createSummaryHist(store, h2SrcStatusE, h2Sum, listLayer_); - fReportSummary = - refineSummaryHistogram(strTitleSummary, h2Sum, h2SrcDigiOcc, h2SrcStatusA, h2SrcStatusE, h2SrcStatusW); + createSummaryHist(store, h2SrcStatusEOH, h2Sum, listLayer_, mapIdxLayer_, mapNumChPerChamber_); + createTableWatchingSummary(); + fReportSummary = refineSummaryHistogram(strTitleSummary, + h2Sum, + h2SrcDigiOcc, + h2SrcStatusA, + h2SrcStatusE, + h2SrcStatusW, + h2SrcStatusEVFAT, + h2SrcStatusWVFAT, + h2SrcStatusEOH, + h2SrcStatusWOH, + h2SrcStatusEAMC, + h2SrcStatusWAMC, + h2SrcStatusEAMC13, + nLumiCurr); for (const auto &strSuffix : listLayer_) { + auto nIdxLayer = mapIdxLayer_[strSuffix]; MonitorElement *h2SrcVFATOcc = store->get(strSrcVFATOcc + strSuffix); MonitorElement *h2SrcVFATStatusW = store->get(strSrcVFATStatusW + strSuffix); MonitorElement *h2SrcVFATStatusE = store->get(strSrcVFATStatusE + strSuffix); @@ -128,17 +252,37 @@ void GEMDQMHarvester::drawSummaryHistogram(edm::Service &store) { MonitorElement *h2SumVFAT = nullptr; createSummaryVFAT(store, h2SrcVFATStatusE, strSuffix, h2SumVFAT); - refineSummaryVFAT(strSuffix, h2SumVFAT, h2SrcVFATOcc, h2SrcVFATStatusE, h2SrcVFATStatusW); + refineSummaryVFAT(strSuffix, h2SumVFAT, h2SrcVFATOcc, h2SrcVFATStatusE, h2SrcVFATStatusW, nLumiCurr, nIdxLayer); TString strNewTitle = h2SrcVFATStatusE->getTitle(); h2SumVFAT->setTitle((const char *)strNewTitle.ReplaceAll("errors", "errors/warnings")); h2SumVFAT->setXTitle(h2SrcVFATStatusE->getAxisTitle(1)); h2SumVFAT->setYTitle(h2SrcVFATStatusE->getAxisTitle(2)); + + createLumiFuncHist(store, strSuffix, nIdxLayer, nLumiCurr); } } store->bookFloat("reportSummary")->Fill(fReportSummary); } +void GEMDQMHarvester::createTableWatchingSummary() { + if (bIsStatusChambersInit_) + return; + + for (const auto &[nIdxLayer, nNumCh] : mapNumChPerChamber_) { + for (Int_t i = 1; i <= nNumCh; i++) { + mapStatusChambersSummary_[{nIdxLayer, i}] = std::vector(); + mapNumStatusChambersSummary_[{nIdxLayer, i}] = NumStatus(); + for (Int_t j = 1; j <= nNumVFATs_; j++) { + mapStatusVFATsSummary_[{nIdxLayer, i, j}] = std::vector(); + mapNumStatusVFATsSummary_[{nIdxLayer, i, j}] = NumStatus(); + } + } + } + + bIsStatusChambersInit_ = true; +} + void GEMDQMHarvester::copyLabels(MonitorElement *h2Src, MonitorElement *h2Dst) { Int_t nBinX = h2Src->getNbinsX(), nBinY = h2Src->getNbinsY(); @@ -156,7 +300,9 @@ void GEMDQMHarvester::copyLabels(MonitorElement *h2Src, MonitorElement *h2Dst) { void GEMDQMHarvester::createSummaryHist(edm::Service &store, MonitorElement *h2Src, MonitorElement *&h2Sum, - std::vector &listLayers) { + std::vector &listLayers, + std::map &mapIdxLayer, + std::map &mapNumChPerChamber) { //store->setCurrentFolder(strDirSummary_); Int_t nBinX = h2Src->getNbinsX(), nBinY = h2Src->getNbinsY(); @@ -166,14 +312,21 @@ void GEMDQMHarvester::createSummaryHist(edm::Service &store, h2Sum->setYTitle("Layer"); listLayers.clear(); + mapIdxLayer.clear(); + mapNumChPerChamber.clear(); + for (Int_t i = 1; i <= nBinX; i++) h2Sum->setBinLabel(i, h2Src->getTH2F()->GetXaxis()->GetBinLabel(i), 1); for (Int_t i = 1; i <= nBinY; i++) { std::string strLabelFull = h2Src->getTH2F()->GetYaxis()->GetBinLabel(i); + Int_t nBinXActual = (Int_t)(h2Src->getBinContent(0, i) + 0.5); auto nPos = strLabelFull.find(';'); auto strLabel = strLabelFull.substr(0, nPos); + auto strLayer = strLabelFull.substr(nPos + 1); listLayers.push_back(strLabelFull.substr(nPos + 1)); h2Sum->setBinLabel(i, strLabel, 2); + mapIdxLayer[strLayer] = i; + mapNumChPerChamber[i] = nBinXActual; } } @@ -190,15 +343,15 @@ void GEMDQMHarvester::createSummaryVFAT(edm::Service &store, } Int_t GEMDQMHarvester::assessOneBin( - std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumWarn, Float_t fNumErr) { + std::string strName, Int_t nIdxX, Int_t nIdxY, Float_t fAll, Float_t fNumOcc, Float_t fNumErr, Float_t fNumWarn) { if (fNumErr > fCutErr_ * fAll) // The error status criterion - return 2; + return nCodeError_; else if (fNumErr > fCutLowErr_ * fAll) // The low-error status criterion - return 4; + return nCodeLowError_; else if (fNumWarn > fCutWarn_ * fAll) // The warning status criterion - return 3; + return nCodeWarning_; else if (fNumOcc > 0) - return 1; + return nCodeFine_; return 0; } @@ -209,7 +362,15 @@ Float_t GEMDQMHarvester::refineSummaryHistogram(std::string strName, MonitorElement *h2SrcOcc, MonitorElement *h2SrcStatusA, MonitorElement *h2SrcStatusE, - MonitorElement *h2SrcStatusW) { + MonitorElement *h2SrcStatusW, + MonitorElement *h2SrcStatusEVFAT, + MonitorElement *h2SrcStatusWVFAT, + MonitorElement *h2SrcStatusEOH, + MonitorElement *h2SrcStatusWOH, + MonitorElement *h2SrcStatusEAMC, + MonitorElement *h2SrcStatusWAMC, + MonitorElement *h2SrcStatusEAMC13, + Int_t nLumiCurr) { Int_t nBinY = h2Sum->getNbinsY(); Int_t nAllBin = 0, nFineBin = 0; for (Int_t j = 1; j <= nBinY; j++) { @@ -218,10 +379,27 @@ Float_t GEMDQMHarvester::refineSummaryHistogram(std::string strName, for (Int_t i = 1; i <= nBinX; i++) { Float_t fOcc = h2SrcOcc->getBinContent(i, j); Float_t fStatusAll = h2SrcStatusA->getBinContent(i, j); - Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j); Float_t fStatusErr = h2SrcStatusE->getBinContent(i, j); - - Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusWarn, fStatusErr); + Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j); + Float_t fStatusErrVFAT = h2SrcStatusEVFAT->getBinContent(i, j); + Float_t fStatusWarnVFAT = h2SrcStatusWVFAT->getBinContent(i, j); + Float_t fStatusErrOH = h2SrcStatusEOH->getBinContent(i, j); + Float_t fStatusWarnOH = h2SrcStatusWOH->getBinContent(i, j); + Float_t fStatusErrAMC = h2SrcStatusEAMC->getBinContent(i, j); + Float_t fStatusWarnAMC = h2SrcStatusWAMC->getBinContent(i, j); + Float_t fStatusErrAMC13 = h2SrcStatusEAMC13->getBinContent(i, j); + NumStatus numStatus(fStatusAll, + fOcc, + fStatusErrVFAT, + fStatusWarnVFAT, + fStatusErrOH, + fStatusWarnOH, + fStatusErrAMC, + fStatusWarnAMC, + fStatusErrAMC13); + UpdateStatusChamber(j, i, nLumiCurr, numStatus); + + Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusErr, fStatusWarn); if (nRes == 1) nFineBin++; @@ -237,17 +415,21 @@ Int_t GEMDQMHarvester::refineSummaryVFAT(std::string strName, MonitorElement *h2Sum, MonitorElement *h2SrcOcc, MonitorElement *h2SrcStatusE, - MonitorElement *h2SrcStatusW) { + MonitorElement *h2SrcStatusW, + Int_t nLumiCurr, + Int_t nIdxLayer) { Int_t nBinY = h2Sum->getNbinsY(); for (Int_t j = 1; j <= nBinY; j++) { Int_t nBinX = h2Sum->getNbinsX(); for (Int_t i = 1; i <= nBinX; i++) { Float_t fOcc = h2SrcOcc->getBinContent(i, j); - Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j); Float_t fStatusErr = h2SrcStatusE->getBinContent(i, j); - Float_t fStatusAll = fOcc + fStatusWarn + fStatusErr; + Float_t fStatusWarn = h2SrcStatusW->getBinContent(i, j); + Float_t fStatusAll = fOcc + fStatusErr + fStatusWarn; + NumStatus numStatus(fStatusAll, fOcc, fStatusErr, fStatusWarn, 0, 0, 0, 0, 0); + UpdateStatusChamber(nIdxLayer, i, j, nLumiCurr, numStatus); - Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusWarn, fStatusErr); + Int_t nRes = assessOneBin(strName, i, j, fStatusAll, fOcc, fStatusErr, fStatusWarn); h2Sum->setBinContent(i, j, (Float_t)nRes); } } @@ -255,4 +437,159 @@ Int_t GEMDQMHarvester::refineSummaryVFAT(std::string strName, return 0; } +Int_t GEMDQMHarvester::UpdateStatusChamber(Int_t nIdxLayer, Int_t nIdxCh, Int_t nLumiCurr, NumStatus numStatus) { + if (!bIsStatusChambersInit_) + return 0; + if (0 >= nIdxCh || nIdxCh > mapNumChPerChamber_[nIdxLayer]) + return 0; + auto &listStatus = mapStatusChambersSummary_[{nIdxLayer, nIdxCh}]; + auto &numStatusPrev = mapNumStatusChambersSummary_[{nIdxLayer, nIdxCh}]; + return UpdateStatusChamber(listStatus, numStatusPrev, nLumiCurr, numStatus); +} + +Int_t GEMDQMHarvester::UpdateStatusChamber( + Int_t nIdxLayer, Int_t nIdxCh, Int_t nIdxVFAT, Int_t nLumiCurr, NumStatus numStatus) { + if (!bIsStatusChambersInit_) + return 0; + if (0 >= nIdxCh || nIdxCh > mapNumChPerChamber_[nIdxLayer]) + return 0; + if (0 >= nIdxVFAT || nIdxVFAT > nNumVFATs_) + return 0; + auto &listStatus = mapStatusVFATsSummary_[{nIdxLayer, nIdxCh, nIdxVFAT}]; + auto &numStatusPrev = mapNumStatusVFATsSummary_[{nIdxLayer, nIdxCh, nIdxVFAT}]; + return UpdateStatusChamber(listStatus, numStatusPrev, nLumiCurr, numStatus); +} + +Int_t GEMDQMHarvester::UpdateStatusChamber(std::vector &listStatus, + NumStatus &numStatus, + Int_t nLumiCurr, + NumStatus numStatusNew) { + // First of all, the current lumi section will be assessed, of which the result will be stored in nStatus + Int_t nStatus = 0; + + Float_t fNumAddErrVFAT = numStatusNew.fNumErrVFAT_ - numStatus.fNumErrVFAT_; + Float_t fNumAddWarnVFAT = numStatusNew.fNumWarnVFAT_ - numStatus.fNumWarnVFAT_; + Float_t fNumAddErrOH = numStatusNew.fNumErrOH_ - numStatus.fNumErrOH_; + Float_t fNumAddWarnOH = numStatusNew.fNumWarnOH_ - numStatus.fNumWarnOH_; + Float_t fNumAddErrAMC = numStatusNew.fNumErrAMC_ - numStatus.fNumErrAMC_; + Float_t fNumAddWarnAMC = numStatusNew.fNumWarnAMC_ - numStatus.fNumWarnAMC_; + Float_t fNumAddErrAMC13 = numStatusNew.fNumErrAMC13_ - numStatus.fNumErrAMC13_; + + numStatus.fNumTotal_ = numStatusNew.fNumTotal_; + numStatus.fNumOcc_ = numStatusNew.fNumOcc_; + numStatus.fNumErrVFAT_ = numStatusNew.fNumErrVFAT_; + numStatus.fNumWarnVFAT_ = numStatusNew.fNumWarnVFAT_; + numStatus.fNumErrOH_ = numStatusNew.fNumErrOH_; + numStatus.fNumWarnOH_ = numStatusNew.fNumWarnOH_; + numStatus.fNumErrAMC_ = numStatusNew.fNumErrAMC_; + numStatus.fNumWarnAMC_ = numStatusNew.fNumWarnAMC_; + numStatus.fNumErrAMC13_ = numStatusNew.fNumErrAMC13_; + + nStatus = (numStatusNew.fNumOcc_ > 0 ? 1 << nBitOcc_ : 0) | (fNumAddErrAMC13 > 0 ? 1 << nBitErrAMC13_ : 0) | + (fNumAddErrAMC > 0 ? 1 << nBitErrAMC_ : 0) | (fNumAddWarnAMC > 0 ? 1 << nBitWarnAMC_ : 0) | + (fNumAddErrOH > 0 ? 1 << nBitErrOH_ : 0) | (fNumAddWarnOH > 0 ? 1 << nBitWarnOH_ : 0) | + (fNumAddErrVFAT > 0 ? 1 << nBitErrVFAT_ : 0) | (fNumAddWarnVFAT > 0 ? 1 << nBitWarnVFAT_ : 0); + + // Only used in the next if statement; See statusLast + StatusInfo statusNew; + statusNew.nLumiStart = nLumiCurr; + statusNew.nLumiEnd = nLumiCurr; + statusNew.nStatus = nStatus; + + if (listStatus.empty()) { + listStatus.push_back(statusNew); + } else { + auto &statusLastPre = listStatus.back(); + if (statusLastPre.nStatus == nStatus) { + statusLastPre.nLumiEnd = nLumiCurr; + } else { + listStatus.push_back(statusNew); + } + } + + return 0; +} + +void GEMDQMHarvester::createLumiFuncHist(edm::Service &store, + std::string strSuffix, + Int_t nIdxLayer, + Int_t nLumiCurr) { + auto &nNumCh = mapNumChPerChamber_[nIdxLayer]; + + MonitorElement *h2Summary; + + //Int_t nLumiCurrLowRes = ( ( nLumiCurr - 1 ) / nResolutionLumi_ ) * nResolutionLumi_; + Int_t nNumBinLumi = ((nLumiCurr - 1) / nResolutionLumi_) + 1; + Int_t nMaxBin = 0; + + // Creating or Summoning the corresponding histogram + if (mapHistLumiFunc_.find(nIdxLayer) == mapHistLumiFunc_.end()) { + store->setCurrentFolder(strDirSummary_); + h2Summary = store->book2S("chamberStatus_inLumi" + strSuffix, + "Chamber status on lumi-block " + strSuffix.substr(1), + nMaxLumi_ / nResolutionLumi_, + 1.0, + (Float_t)(nMaxLumi_ + 1), + //nNumBinLumi, 1.0, (Float_t)( nLumiCurr + 1 ), + nNumCh, + 0.5, + nNumCh + 0.5); + mapHistLumiFunc_[nIdxLayer] = h2Summary; + + h2Summary->setXTitle("Luminosity block"); + h2Summary->setYTitle("Chamber"); + for (Int_t i = 1; i <= nNumCh; i++) { + h2Summary->setBinLabel(i, Form("%i", i), 2); + } + } else { + h2Summary = mapHistLumiFunc_[nIdxLayer]; + } + + for (Int_t nIdxCh = 1; nIdxCh <= nNumCh; nIdxCh++) { + auto &listStatus = mapStatusChambersSummary_[{nIdxLayer, nIdxCh}]; + + Int_t nIdxStatus = 0; + for (Int_t nIdxLumi = 0; nIdxLumi < nNumBinLumi; nIdxLumi++) { + // Lumis covered by these values (nLumiStart <=, <= nLumiEnd) are counted for the current bin + Int_t nLumiStart = 1 + nIdxLumi * nResolutionLumi_; + Int_t nLumiEnd = (1 + nIdxLumi) * nResolutionLumi_; + if (nLumiEnd > nLumiCurr) + nLumiEnd = nLumiCurr; + + Int_t nStatusSum = 0; + while (true) { // No worries, nIdxStatus must increase and reach at listStatus.size() + // True: It was too past so that + // the lumi range of listStatus[ nIdxStatus ] is out of the coverage of the current bin + if (listStatus[nIdxStatus].nLumiEnd < nLumiStart) { + nIdxStatus++; + if (nIdxStatus >= (int)listStatus.size()) { + break; // For safety + } + continue; + } + + nStatusSum = listStatus[nIdxStatus].nStatus; + + // True: This is the last item of listStatus which is covered by the current bin + if (nIdxStatus + 1 >= (int)listStatus.size() || listStatus[nIdxStatus].nLumiEnd >= nLumiEnd) { + break; + } + + nIdxStatus++; + if (nIdxStatus >= (int)listStatus.size()) { + break; // For safety + } + } + + h2Summary->setBinContent(nIdxLumi + 1, nIdxCh, nStatusSum); + if (nMaxBin < nIdxLumi + 1) + nMaxBin = nIdxLumi + 1; + } + } + + for (Int_t nX = 1; nX <= nMaxBin; nX++) { + h2Summary->setBinContent(nX, 0, 1); + } +} + DEFINE_FWK_MODULE(GEMDQMHarvester); diff --git a/DQM/GEM/test/decomposeStatus.py b/DQM/GEM/test/decomposeStatus.py new file mode 100644 index 0000000000000..43a31755fcebb --- /dev/null +++ b/DQM/GEM/test/decomposeStatus.py @@ -0,0 +1,102 @@ +import ROOT +import os, sys +import argparse +import array + + +bitDigiOcc = 0 + +listBitConfFilter = [ + { "name": "AMC13", "error": 1, "warning": -1 }, + { "name": "AMC", "error": 2, "warning": 3 }, + { "name": "OH", "error": 4, "warning": 5 }, + { "name": "VFAT", "error": 6, "warning": 7 }, +] + + +parser = argparse.ArgumentParser() + +parser.add_argument("src", default="", help="") +parser.add_argument("dst", default="", help="") + +opts = parser.parse_args() + +fDQM = ROOT.TFile.Open(opts.src) +dirMain = None + +for k1 in fDQM.GetListOfKeys(): + d1 = fDQM.Get(k1.GetName()) + if not isinstance(d1, ROOT.TDirectoryFile): + continue + + for k2 in d1.GetListOfKeys(): + d2 = d1.Get(k2.GetName()) + if not isinstance(d1, ROOT.TDirectoryFile): + continue + + dirMain = d2 + break + + if dirMain: + break + +dirEventInfo = dirMain.Get("GEM/Run summary/EventInfo") +listHistLumi = [ k.GetName() for k in dirEventInfo.GetListOfKeys() ] +listHistLumi = [ s for s in listHistLumi if s.startswith("chamberStatus_inLumi") ] + +fOut = ROOT.TFile.Open(opts.dst, "RECREATE") + +for name in listHistLumi: + histCurr = dirEventInfo.Get(name) + + listFillLumi = [ histCurr.GetBinContent(i + 1, 0) for i in range(histCurr.GetNbinsX()) ] + numLumi = max([ i for i, x in enumerate(listFillLumi) if abs(x) > 0 ]) + 1 + + listBinLumi = [ histCurr.GetXaxis().GetBinLowEdge(i + 1) for i in range(numLumi + 1) ] + listBinY = [ histCurr.GetYaxis().GetBinLowEdge(i + 1) for i in range(histCurr.GetNbinsY() + 1) ] + + for dicConf in listBitConfFilter: + fOut.cd() + + numBinY = len(listBinY) - 1 + + histNew = ROOT.TH2S( + dicConf[ "name" ] + "_" + name, + histCurr.GetTitle() + " ({})".format(dicConf[ "name" ]), + numLumi, + array.array("d", listBinLumi), + numBinY, + array.array("d", listBinY), + ) + + histNew.GetXaxis().SetTitle(histCurr.GetXaxis().GetTitle()) + histNew.GetYaxis().SetTitle(histCurr.GetYaxis().GetTitle()) + + for i in range(len(listBinY) - 1): + histNew.GetYaxis().SetBinLabel(i + 1, histCurr.GetYaxis().GetBinLabel(i + 1)) + + for j in range(numBinY): + for i in range(numLumi): + val = int(histCurr.GetBinContent(i + 1, j + 1)) + occ = val & ( 1 << bitDigiOcc ) != 0 + err = val & ( 1 << dicConf[ "error" ] ) != 0 if dicConf[ "error" ] >= 0 else False + warn = val & ( 1 << dicConf[ "warning" ] ) != 0 if dicConf[ "warning" ] >= 0 else False + print(dicConf[ "name" ], val, occ, err, warn) + + out = 0 + if err: + out = 2 + elif warn: + out = 3 + elif occ: + out = 1 + + histNew.SetBinContent(i + 1, j + 1, out) + + histNew.Write() + +fOut.Write() +fOut.Close() +fDQM.Close() + +