File indexing completed on 2024-04-06 12:08:12
0001
0002 #include "DQM/RPCMonitorClient/interface/RPCEventSummary.h"
0003 #include "DQM/RPCMonitorClient/interface/RPCSummaryMapHisto.h"
0004
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006 #include "FWCore/Framework/interface/EventSetup.h"
0007 #include "FWCore/Framework/interface/ESHandle.h"
0008
0009 RPCEventSummary::RPCEventSummary(const edm::ParameterSet& ps) {
0010 edm::LogVerbatim("rpceventsummary") << "[RPCEventSummary]: Constructor";
0011
0012 enableReportSummary_ = ps.getUntrackedParameter<bool>("EnableSummaryReport", true);
0013 prescaleFactor_ = ps.getUntrackedParameter<int>("PrescaleFactor", 1);
0014 eventInfoPath_ = ps.getUntrackedParameter<std::string>("EventInfoPath", "RPC/EventInfo");
0015
0016 std::string subsystemFolder = ps.getUntrackedParameter<std::string>("RPCFolder", "RPC");
0017 std::string recHitTypeFolder = ps.getUntrackedParameter<std::string>("RecHitTypeFolder", "AllHits");
0018 std::string summaryFolder = ps.getUntrackedParameter<std::string>("SummaryFolder", "SummaryHistograms");
0019
0020 globalFolder_ = subsystemFolder + "/" + recHitTypeFolder + "/" + summaryFolder;
0021 prefixFolder_ = subsystemFolder + "/" + recHitTypeFolder;
0022
0023 minimumEvents_ = ps.getUntrackedParameter<int>("MinimumRPCEvents", 10000);
0024 numberDisk_ = ps.getUntrackedParameter<int>("NumberOfEndcapDisks", 4);
0025 doEndcapCertification_ = ps.getUntrackedParameter<bool>("EnableEndcapSummary", false);
0026
0027 FEDRange_.first = ps.getUntrackedParameter<unsigned int>("MinimumRPCFEDId", 790);
0028 FEDRange_.second = ps.getUntrackedParameter<unsigned int>("MaximumRPCFEDId", 792);
0029
0030 NumberOfFeds_ = FEDRange_.second - FEDRange_.first + 1;
0031
0032 offlineDQM_ = ps.getUntrackedParameter<bool>("OfflineDQM", true);
0033
0034 runInfoToken_ = esConsumes<edm::Transition::EndLuminosityBlock>();
0035 }
0036
0037 RPCEventSummary::~RPCEventSummary() { edm::LogVerbatim("rpceventsummary") << "[RPCEventSummary]: Destructor "; }
0038
0039 void RPCEventSummary::beginJob() {
0040 edm::LogVerbatim("rpceventsummary") << "[RPCEventSummary]: Begin job ";
0041 init_ = false;
0042 }
0043
0044 void RPCEventSummary::dqmEndLuminosityBlock(DQMStore::IBooker& ibooker,
0045 DQMStore::IGetter& igetter,
0046 edm::LuminosityBlock const& lb,
0047 edm::EventSetup const& setup) {
0048 edm::LogVerbatim("rpceventsummary") << "[RPCEventSummary]: Begin run";
0049
0050 if (!init_) {
0051 lumiCounter_ = prescaleFactor_;
0052
0053 edm::eventsetup::EventSetupRecordKey recordKey(
0054 edm::eventsetup::EventSetupRecordKey::TypeTag::findType("RunInfoRcd"));
0055
0056 int defaultValue = 1;
0057 isIn_ = true;
0058
0059 if (auto runInfoRec = setup.tryToGet<RunInfoRcd>()) {
0060 defaultValue = -1;
0061
0062 auto sumFED = runInfoRec->get(runInfoToken_);
0063 const std::vector<int> FedsInIds = sumFED.m_fed_in;
0064 unsigned int f = 0;
0065 isIn_ = false;
0066 while (!isIn_ && f < FedsInIds.size()) {
0067 int fedID = FedsInIds[f];
0068
0069 if (fedID >= FEDRange_.first && fedID <= FEDRange_.second) {
0070 defaultValue = 1;
0071 isIn_ = true;
0072 }
0073 f++;
0074 }
0075 }
0076
0077 ibooker.setCurrentFolder(eventInfoPath_);
0078
0079
0080
0081 MonitorElement* meSummary = ibooker.bookFloat("reportSummary");
0082 meSummary->Fill(defaultValue);
0083
0084
0085 MonitorElement* me = RPCSummaryMapHisto::book(ibooker, "reportSummaryMap", "RPC Report Summary Map");
0086 MonitorElement* me2 = RPCSummaryMapHisto::book(ibooker, "noisySummaryMap", "RPC Noisy Chamber Summary Map");
0087 RPCSummaryMapHisto::setBinsBarrel(me, defaultValue);
0088 RPCSummaryMapHisto::setBinsEndcap(me, defaultValue);
0089 RPCSummaryMapHisto::setBinsBarrel(me2, defaultValue);
0090 RPCSummaryMapHisto::setBinsEndcap(me2, defaultValue);
0091
0092
0093
0094 ibooker.setCurrentFolder(eventInfoPath_ + "/reportSummaryContents");
0095
0096 std::vector<std::string> segmentNames;
0097 for (int i = -2; i <= 2; i++) {
0098 const std::string segName = fmt::format("RPC_Wheel{}", i);
0099 segmentNames.push_back(segName);
0100 }
0101
0102 for (int i = -numberDisk_; i <= numberDisk_; i++) {
0103 if (i == 0)
0104 continue;
0105 const std::string segName = fmt::format("RPC_Disk{}", i);
0106 segmentNames.push_back(segName);
0107 }
0108
0109 for (const auto& segmentName : segmentNames) {
0110 MonitorElement* me3 = ibooker.bookFloat(segmentName);
0111 me3->Fill(defaultValue);
0112 }
0113
0114 lumiCounter_ = prescaleFactor_;
0115 init_ = true;
0116 }
0117
0118 if (isIn_ && !offlineDQM_ && lumiCounter_ % prescaleFactor_ == 0) {
0119 this->clientOperation(igetter);
0120 }
0121
0122 ++lumiCounter_;
0123 }
0124
0125 void RPCEventSummary::dqmEndJob(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0126 if (isIn_) {
0127 this->clientOperation(igetter);
0128 }
0129 }
0130
0131 void RPCEventSummary::clientOperation(DQMStore::IGetter& igetter) {
0132 float rpcevents = minimumEvents_;
0133 MonitorElement* RPCEvents = igetter.get(prefixFolder_ + "/RPCEvents");
0134
0135 if (RPCEvents) {
0136 rpcevents = RPCEvents->getBinContent(1);
0137 }
0138
0139 if (rpcevents < minimumEvents_)
0140 return;
0141
0142 MonitorElement* reportMe = igetter.get(eventInfoPath_ + "/reportSummaryMap");
0143 MonitorElement* reportMe2 = igetter.get(eventInfoPath_ + "/noisySummaryMap");
0144
0145
0146 float barrelFactor = 0;
0147
0148 for (int w = -2; w < 3; w++) {
0149 const std::string meName1 = fmt::format("{}/DeadChannelFraction_Roll_vs_Sector_Wheel{}", globalFolder_, w);
0150 const std::string meName2 = fmt::format("{}/RPCNoisyStrips_Roll_vs_Sector_Wheel{}", globalFolder_, w);
0151 MonitorElement* myMe1 = igetter.get(meName1);
0152 MonitorElement* myMe2 = igetter.get(meName2);
0153
0154 if (myMe1 && myMe2) {
0155 float wheelFactor = 0;
0156
0157 for (int s = 1; s <= myMe1->getNbinsX(); s++) {
0158 float sectorFactor = 0;
0159 float sectorFactor2 = 0;
0160 int rollInSector = 0;
0161
0162 for (int r = 1; r <= myMe1->getNbinsY(); r++) {
0163 if ((s != 4 && r > 17) || ((s == 9 || s == 11) && r > 15))
0164 continue;
0165 rollInSector++;
0166 sectorFactor += 1 - myMe1->getBinContent(s, r);
0167 sectorFactor2 += myMe2->getBinContent(s, r);
0168 }
0169
0170 if (rollInSector != 0) {
0171 sectorFactor = sectorFactor / rollInSector;
0172 sectorFactor2 = sectorFactor2 / rollInSector;
0173 }
0174
0175 if (reportMe)
0176 reportMe->setBinContent(w + 8, s, sectorFactor);
0177 if (reportMe2)
0178 reportMe2->setBinContent(w + 8, s, sectorFactor2);
0179 wheelFactor += sectorFactor;
0180
0181 }
0182
0183 wheelFactor = wheelFactor / myMe1->getNbinsX();
0184
0185 const std::string globalMEName = fmt::format("{}/reportSummaryContents/RPC_Wheel{}", eventInfoPath_, w);
0186 MonitorElement* globalMe = igetter.get(globalMEName);
0187 if (globalMe)
0188 globalMe->Fill(wheelFactor);
0189
0190 barrelFactor += wheelFactor;
0191 }
0192 }
0193
0194 barrelFactor = barrelFactor / 5;
0195
0196 float endcapFactor = 0;
0197
0198 if (doEndcapCertification_) {
0199
0200 for (int d = -numberDisk_; d <= numberDisk_; d++) {
0201 if (d == 0)
0202 continue;
0203
0204 const std::string meName1 = fmt::format("{}/DeadChannelFraction_Ring_vs_Segment_Disk{}", globalFolder_, d);
0205 const std::string meName2 = fmt::format("{}/RPCNoisyStrips_Ring_vs_Segment_Disk{}", globalFolder_, d);
0206 MonitorElement* myMe1 = igetter.get(meName1);
0207 MonitorElement* myMe2 = igetter.get(meName2);
0208
0209 if (myMe1 && myMe2) {
0210 float diskFactor = 0;
0211
0212 float sectorFactor[6] = {0, 0, 0, 0, 0, 0};
0213 float sectorFactor2[6] = {0, 0, 0, 0, 0, 0};
0214
0215 for (int i = 0; i < 6; i++) {
0216 int firstSeg = (i * 6) + 1;
0217 int lastSeg = firstSeg + 6;
0218 int rollInSector = 0;
0219 for (int seg = firstSeg; seg < lastSeg; seg++) {
0220 for (int y = 1; y <= myMe1->getNbinsY(); y++) {
0221 rollInSector++;
0222 sectorFactor[i] += 1 - myMe1->getBinContent(seg, y);
0223 sectorFactor2[i] += myMe2->getBinContent(seg, y);
0224 }
0225 }
0226 sectorFactor[i] = sectorFactor[i] / rollInSector;
0227 sectorFactor2[i] = sectorFactor2[i] / rollInSector;
0228 }
0229
0230 for (int sec = 0; sec < 6; sec++) {
0231 diskFactor += sectorFactor[sec];
0232 if (reportMe) {
0233 if (d < 0)
0234 reportMe->setBinContent(d + 5, sec + 1, sectorFactor[sec]);
0235 else
0236 reportMe->setBinContent(d + 11, sec + 1, sectorFactor[sec]);
0237 }
0238 if (reportMe2) {
0239 if (d < 0)
0240 reportMe2->setBinContent(d + 5, sec + 1, sectorFactor2[sec]);
0241 else
0242 reportMe2->setBinContent(d + 11, sec + 1, sectorFactor2[sec]);
0243 }
0244 }
0245
0246 diskFactor = diskFactor / 6;
0247
0248 const std::string globalMEName = fmt::format("{}/reportSummaryContents/RPC_Disk{}", eventInfoPath_, d);
0249 MonitorElement* globalMe = igetter.get(globalMEName);
0250 if (globalMe)
0251 globalMe->Fill(diskFactor);
0252
0253 endcapFactor += diskFactor;
0254 }
0255 }
0256
0257 endcapFactor = endcapFactor / (numberDisk_ * 2);
0258 }
0259
0260
0261 float rpcFactor = barrelFactor;
0262 if (doEndcapCertification_) {
0263 rpcFactor = (barrelFactor + endcapFactor) / 2;
0264 }
0265
0266 MonitorElement* globalMe = igetter.get(eventInfoPath_ + "/reportSummary");
0267 if (globalMe)
0268 globalMe->Fill(rpcFactor);
0269 }