File indexing completed on 2024-04-06 12:08:52
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include "CalibFormats/SiStripObjects/interface/SiStripDetCabling.h"
0021 #include "CalibFormats/SiStripObjects/interface/SiStripQuality.h"
0022 #include "CalibTracker/Records/interface/SiStripDetCablingRcd.h"
0023 #include "CalibTracker/Records/interface/SiStripQualityRcd.h"
0024 #include "DQM/SiStripCommon/interface/SiStripFolderOrganizer.h"
0025 #include "DQM/SiStripCommon/interface/SiStripHistoId.h"
0026 #include "DQM/SiStripMonitorPedestals/interface/SiStripMonitorQuality.h"
0027 #include "DQMServices/Core/interface/DQMStore.h"
0028 #include "FWCore/Framework/interface/EventSetup.h"
0029 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0030 #include "FWCore/ServiceRegistry/interface/Service.h"
0031 #include "Geometry/Records/interface/TrackerTopologyRcd.h"
0032
0033
0034 #include <algorithm>
0035 #include <cmath>
0036 #include <cstdlib>
0037 #include <numeric>
0038
0039 SiStripMonitorQuality::SiStripMonitorQuality(edm::ParameterSet const &iConfig)
0040 : dqmStore_(edm::Service<DQMStore>().operator->()),
0041 conf_(iConfig),
0042 tTopoToken_(esConsumes<edm::Transition::BeginRun>()),
0043 detCablingToken_(esConsumes<edm::Transition::BeginRun>()),
0044 qualityToken_(esConsumes<edm::Transition::BeginRun>(
0045 edm::ESInputTag{"", iConfig.getParameter<std::string>("StripQualityLabel")})) {
0046 edm::LogInfo("SiStripMonitorQuality") << "SiStripMonitorQuality "
0047 << " Constructing....... ";
0048 }
0049
0050 SiStripMonitorQuality::~SiStripMonitorQuality() {
0051 edm::LogInfo("SiStripMonitorQuality") << "SiStripMonitorQuality "
0052 << " Destructing....... ";
0053 }
0054
0055 void SiStripMonitorQuality::bookHistograms(DQMStore::IBooker &ibooker,
0056 const edm::Run &run,
0057 const edm::EventSetup &eSetup) {
0058 if (!qualityWatcher_.check(eSetup))
0059 return;
0060
0061 const auto tTopo = &eSetup.getData(tTopoToken_);
0062
0063 stripQuality_ = &eSetup.getData(qualityToken_);
0064 detCabling_ = &eSetup.getData(detCablingToken_);
0065
0066 edm::LogInfo("SiStripMonitorQuality") << "SiStripMonitorQuality::analyze: "
0067 << " Reading SiStripQuality " << std::endl;
0068
0069 SiStripBadStrip::RegistryIterator rbegin = stripQuality_->getRegistryVectorBegin();
0070 SiStripBadStrip::RegistryIterator rend = stripQuality_->getRegistryVectorEnd();
0071 uint32_t detid;
0072
0073 if (rbegin == rend)
0074 return;
0075
0076 for (SiStripBadStrip::RegistryIterator rp = rbegin; rp != rend; ++rp) {
0077 detid = rp->detid;
0078
0079 if (detid == 0 || detid == 0xFFFFFFFF) {
0080 edm::LogError("SiStripMonitorQuality") << "SiStripMonitorQuality::bookHistograms : "
0081 << "Wrong DetId !!!!!! " << detid << " Neglecting !!!!!! ";
0082 continue;
0083 }
0084
0085 if (!detCabling_->IsConnected(detid)) {
0086 edm::LogError("SiStripMonitorQuality") << "SiStripMonitorQuality::bookHistograms : "
0087 << " DetId " << detid << " not connected, Neglecting !!!!!! ";
0088 continue;
0089 }
0090
0091 MonitorElement *det_me;
0092
0093 int nStrip = detCabling_->nApvPairs(detid) * 256;
0094
0095
0096 SiStripHistoId hidmanager;
0097
0098 SiStripFolderOrganizer folder_organizer;
0099
0100 folder_organizer.setDetectorFolder(detid,
0101 tTopo);
0102
0103 std::string hid;
0104 hid = hidmanager.createHistoId("StripQualityFromCondDB", "det", detid);
0105
0106 det_me = ibooker.book1D(hid, hid, nStrip, 0.5, nStrip + 0.5);
0107 det_me->setAxisTitle("Strip Number", 1);
0108 det_me->setAxisTitle("Quality Flag from CondDB ", 2);
0109 QualityMEs.insert(std::make_pair(detid, det_me));
0110 }
0111 }
0112
0113
0114 void SiStripMonitorQuality::analyze(edm::Event const &iEvent, edm::EventSetup const &eSetup) {
0115 if (!qualityWatcher_.check(eSetup))
0116 return;
0117
0118 const auto tTopo = &eSetup.getData(tTopoToken_);
0119 stripQuality_ = &eSetup.getData(qualityToken_);
0120 detCabling_ = &eSetup.getData(detCablingToken_);
0121
0122 edm::LogInfo("SiStripMonitorQuality") << "SiStripMonitorQuality::analyze: "
0123 << " Reading SiStripQuality " << std::endl;
0124
0125 SiStripBadStrip::RegistryIterator rbegin = stripQuality_->getRegistryVectorBegin();
0126 SiStripBadStrip::RegistryIterator rend = stripQuality_->getRegistryVectorEnd();
0127 uint32_t detid;
0128
0129 if (rbegin == rend)
0130 return;
0131
0132 for (SiStripBadStrip::RegistryIterator rp = rbegin; rp != rend; ++rp) {
0133 detid = rp->detid;
0134
0135 if (detid == 0 || detid == 0xFFFFFFFF) {
0136 edm::LogError("SiStripMonitorQuality") << "SiStripMonitorQuality::analyze : "
0137 << "Wrong DetId !!!!!! " << detid << " Neglecting !!!!!! ";
0138 continue;
0139 }
0140
0141 if (!detCabling_->IsConnected(detid)) {
0142 edm::LogError("SiStripMonitorQuality") << "SiStripMonitorQuality::analyze : "
0143 << " DetId " << detid << " not connected, Neglecting !!!!!! ";
0144 continue;
0145 }
0146 MonitorElement *me = getQualityME(detid, tTopo);
0147 SiStripBadStrip::Range range = SiStripBadStrip::Range(stripQuality_->getDataVectorBegin() + rp->ibegin,
0148 stripQuality_->getDataVectorBegin() + rp->iend);
0149 SiStripBadStrip::ContainerIterator it = range.first;
0150 for (; it != range.second; ++it) {
0151 unsigned int value = (*it);
0152 short str_start = stripQuality_->decode(value).firstStrip;
0153 short str_end = str_start + stripQuality_->decode(value).range;
0154 for (short isr = str_start; isr < str_end + 1; isr++) {
0155 if (isr <= (me->getNbinsX() - 1))
0156 me->Fill(isr + 1, 1.0);
0157 }
0158 }
0159 }
0160 }
0161
0162
0163
0164 void SiStripMonitorQuality::dqmEndRun(edm::Run const &run, edm::EventSetup const &eSetup) {
0165 bool outputMEsInRootFile = conf_.getParameter<bool>("OutputMEsInRootFile");
0166 std::string outputFileName = conf_.getParameter<std::string>("OutputFileName");
0167 if (outputMEsInRootFile) {
0168 dqmStore_->save(outputFileName);
0169 }
0170 }
0171
0172
0173
0174 void SiStripMonitorQuality::endJob(void) {
0175 edm::LogInfo("SiStripMonitorQuality") << "SiStripMonitorQuality::EndJob: "
0176 << " Finishing!! ";
0177 }
0178
0179
0180
0181 SiStripMonitorQuality::MonitorElement *SiStripMonitorQuality::getQualityME(uint32_t idet,
0182 const TrackerTopology *tTopo) {
0183 std::map<uint32_t, MonitorElement *>::iterator pos = QualityMEs.find(idet);
0184 MonitorElement *det_me = nullptr;
0185 if (pos != QualityMEs.end()) {
0186 det_me = pos->second;
0187 det_me->Reset();
0188 } else {
0189
0190 edm::LogError("SiStripMonitorQuality") << "SiStripMonitorQuality::getQualityME : "
0191 << "Wrong DetId !!!!!! " << idet << " No ME found!";
0192 }
0193 return det_me;
0194 }
0195 DEFINE_FWK_MODULE(SiStripMonitorQuality);