File indexing completed on 2024-09-07 04:35:28
0001 #include "CondCore/Utilities/interface/PayloadInspectorModule.h"
0002 #include "CondCore/Utilities/interface/PayloadInspector.h"
0003 #include "DataFormats/EcalDetId/interface/EBDetId.h"
0004 #include "DataFormats/EcalDetId/interface/EEDetId.h"
0005 #include "CondCore/EcalPlugins/plugins/EcalDrawUtils.h"
0006 #include "CondCore/EcalPlugins/plugins/EcalBadCrystalsCount.h"
0007
0008 #include "CondFormats/EcalObjects/interface/EcalTPGCrystalStatus.h"
0009
0010 #include "TH2F.h"
0011 #include "TCanvas.h"
0012 #include "TStyle.h"
0013 #include "TLine.h"
0014 #include "TLatex.h"
0015
0016 #include <string>
0017 #include <memory>
0018 #include <array>
0019
0020 namespace {
0021 enum { kEBChannels = 61200, kEEChannels = 14648, kSides = 2 };
0022 enum { MIN_IETA = 1, MIN_IPHI = 1, MAX_IETA = 85, MAX_IPHI = 360 };
0023 enum { IX_MIN = 1, IY_MIN = 1, IX_MAX = 100, IY_MAX = 100 };
0024
0025
0026
0027
0028 class EcalTPGCrystalStatusPlot : public cond::payloadInspector::PlotImage<EcalTPGCrystalStatus> {
0029 public:
0030 EcalTPGCrystalStatusPlot()
0031 : cond::payloadInspector::PlotImage<EcalTPGCrystalStatus>("ECAL TPGCrystalStatus - map ") {
0032 setSingleIov(true);
0033 }
0034
0035 bool fill(const std::vector<std::tuple<cond::Time_t, cond::Hash>>& iovs) override {
0036 TH2F* barrel = new TH2F("EB", "EB TPG Crystal Status", MAX_IPHI, 0, MAX_IPHI, 2 * MAX_IETA, -MAX_IETA, MAX_IETA);
0037 TH2F* endc_p = new TH2F("EE+", "EE+ TPG Crystal Status", IX_MAX, IX_MIN, IX_MAX + 1, IY_MAX, IY_MIN, IY_MAX + 1);
0038 TH2F* endc_m = new TH2F("EE-", "EE- TPG Crystal Status", IX_MAX, IX_MIN, IX_MAX + 1, IY_MAX, IY_MIN, IY_MAX + 1);
0039 int EBstat = 0, EEstat[2] = {0, 0};
0040
0041 auto iov = iovs.front();
0042 std::shared_ptr<EcalTPGCrystalStatus> payload = fetchPayload(std::get<1>(iov));
0043 unsigned int run = std::get<0>(iov);
0044 if (payload.get()) {
0045 for (int ieta = -MAX_IETA; ieta <= MAX_IETA; ieta++) {
0046 Double_t eta = (Double_t)ieta;
0047 if (ieta == 0)
0048 continue;
0049 else if (ieta > 0.)
0050 eta = eta - 0.5;
0051 else
0052 eta = eta + 0.5;
0053 for (int iphi = 1; iphi <= MAX_IPHI; iphi++) {
0054 Double_t phi = (Double_t)iphi - 0.5;
0055 EBDetId id(ieta, iphi);
0056 double val = (*payload)[id.rawId()].getStatusCode();
0057 barrel->Fill(phi, eta, val);
0058 if (val > 0)
0059 EBstat++;
0060 }
0061 }
0062
0063 for (int sign = 0; sign < kSides; sign++) {
0064 int thesign = sign == 1 ? 1 : -1;
0065 for (int ix = 1; ix <= IX_MAX; ix++) {
0066 for (int iy = 1; iy <= IY_MAX; iy++) {
0067 if (!EEDetId::validDetId(ix, iy, thesign))
0068 continue;
0069 EEDetId id(ix, iy, thesign);
0070 double val = (*payload)[id.rawId()].getStatusCode();
0071 if (thesign == 1) {
0072 endc_p->Fill(ix, iy, val);
0073 if (val > 0)
0074 EEstat[1]++;
0075 } else {
0076 endc_m->Fill(ix, iy, val);
0077 if (val > 0)
0078 EEstat[0]++;
0079 }
0080 }
0081 }
0082 }
0083 }
0084
0085 gStyle->SetPalette(1);
0086 gStyle->SetOptStat(0);
0087
0088 Double_t w = 1200;
0089 Double_t h = 1400;
0090 TCanvas canvas("c", "c", w, h);
0091 canvas.SetWindowSize(w + (w - canvas.GetWw()), h + (h - canvas.GetWh()));
0092
0093 TLatex t1;
0094 t1.SetNDC();
0095 t1.SetTextAlign(26);
0096 t1.SetTextSize(0.05);
0097 t1.DrawLatex(0.5, 0.96, Form("Ecal TPGCrystalStatus, IOV %i", run));
0098
0099
0100
0101 float xmi[3] = {0.0, 0.0, 0.5};
0102 float xma[3] = {1.0, 0.5, 1.0};
0103 float ymi[3] = {0.47, 0.0, 0.0};
0104 float yma[3] = {0.94, 0.47, 0.47};
0105 std::array<std::unique_ptr<TPad>, 3> pad;
0106 for (int obj = 0; obj < 3; obj++) {
0107 pad[obj] = std::make_unique<TPad>(Form("p_%i", obj), Form("p_%i", obj), xmi[obj], ymi[obj], xma[obj], yma[obj]);
0108 pad[obj]->Draw();
0109 }
0110
0111 pad[0]->cd();
0112 DrawEB(barrel, 0., 1.);
0113 t1.DrawLatex(0.2, 0.94, Form("%i crystals", EBstat));
0114 pad[1]->cd();
0115 DrawEE(endc_m, 0., 1.);
0116 t1.DrawLatex(0.15, 0.92, Form("%i crystals", EEstat[0]));
0117 pad[2]->cd();
0118 DrawEE(endc_p, 0., 1.);
0119 t1.DrawLatex(0.15, 0.92, Form("%i crystals", EEstat[1]));
0120
0121 std::string ImageName(m_imageFileName);
0122 canvas.SaveAs(ImageName.c_str());
0123 return true;
0124 }
0125 };
0126
0127
0128
0129
0130 template <cond::payloadInspector::IOVMultiplicity nIOVs, int ntags>
0131 class EcalTPGCrystalStatusDiffBase : public cond::payloadInspector::PlotImage<EcalTPGCrystalStatus, nIOVs, ntags> {
0132 public:
0133 EcalTPGCrystalStatusDiffBase()
0134 : cond::payloadInspector::PlotImage<EcalTPGCrystalStatus, nIOVs, ntags>("ECAL TPGCrystalStatus difference") {}
0135
0136 bool fill() override {
0137 TH2F* barrel = new TH2F("EB", "EB difference", MAX_IPHI, 0, MAX_IPHI, 2 * MAX_IETA, -MAX_IETA, MAX_IETA);
0138 TH2F* endc_p = new TH2F("EE+", "EE+ difference", IX_MAX, IX_MIN, IX_MAX + 1, IY_MAX, IY_MIN, IY_MAX + 1);
0139 TH2F* endc_m = new TH2F("EE-", "EE- difference", IX_MAX, IX_MIN, IX_MAX + 1, IY_MAX, IY_MIN, IY_MAX + 1);
0140 int EBstat = 0, EEstat[2] = {0, 0};
0141
0142 unsigned int run[2] = {0, 0};
0143 float vEB[kEBChannels], vEE[kEEChannels];
0144 std::string l_tagname[2];
0145 auto iovs = cond::payloadInspector::PlotBase::getTag<0>().iovs;
0146 l_tagname[0] = cond::payloadInspector::PlotBase::getTag<0>().name;
0147 auto firstiov = iovs.front();
0148 run[0] = std::get<0>(firstiov);
0149 std::tuple<cond::Time_t, cond::Hash> lastiov;
0150 if (ntags == 2) {
0151 auto tag2iovs = cond::payloadInspector::PlotBase::getTag<1>().iovs;
0152 l_tagname[1] = cond::payloadInspector::PlotBase::getTag<1>().name;
0153 lastiov = tag2iovs.front();
0154 } else {
0155 lastiov = iovs.back();
0156 l_tagname[1] = l_tagname[0];
0157 }
0158 run[1] = std::get<0>(lastiov);
0159 for (int irun = 0; irun < nIOVs; irun++) {
0160 std::shared_ptr<EcalTPGCrystalStatus> payload;
0161 if (irun == 0) {
0162 payload = this->fetchPayload(std::get<1>(firstiov));
0163 } else {
0164 payload = this->fetchPayload(std::get<1>(lastiov));
0165 }
0166 if (payload.get()) {
0167 for (int ieta = -MAX_IETA; ieta <= MAX_IETA; ieta++) {
0168 Double_t eta = (Double_t)ieta;
0169 if (ieta == 0)
0170 continue;
0171 else if (ieta > 0.)
0172 eta = eta - 0.5;
0173 else
0174 eta = eta + 0.5;
0175 for (int iphi = 1; iphi <= MAX_IPHI; iphi++) {
0176 Double_t phi = (Double_t)iphi - 0.5;
0177 EBDetId id(ieta, iphi);
0178 int channel = id.hashedIndex();
0179 double val = (*payload)[id.rawId()].getStatusCode();
0180 if (irun == 0)
0181 vEB[channel] = val;
0182 else {
0183 double diff = val - vEB[channel];
0184 barrel->Fill(phi, eta, diff);
0185 if (diff != 0)
0186 EBstat++;
0187
0188 }
0189 }
0190 }
0191
0192 for (int sign = 0; sign < kSides; sign++) {
0193 int thesign = sign == 1 ? 1 : -1;
0194 for (int ix = 1; ix <= IX_MAX; ix++) {
0195 for (int iy = 1; iy <= IY_MAX; iy++) {
0196 if (!EEDetId::validDetId(ix, iy, thesign))
0197 continue;
0198 EEDetId id(ix, iy, thesign);
0199 int channel = id.hashedIndex();
0200 double val = (*payload)[id.rawId()].getStatusCode();
0201 if (irun == 0)
0202 vEE[channel] = val;
0203 else {
0204 double diff = val - vEE[channel];
0205 if (thesign == 1) {
0206 endc_p->Fill(ix, iy, diff);
0207 if (diff != 0)
0208 EEstat[1]++;
0209 } else {
0210 endc_m->Fill(ix, iy, diff);
0211 if (diff != 0)
0212 EEstat[0]++;
0213 }
0214 }
0215 }
0216 }
0217 }
0218 }
0219 else
0220 return false;
0221 }
0222
0223 gStyle->SetPalette(1);
0224 gStyle->SetOptStat(0);
0225 Double_t w = 1200;
0226 Double_t h = 1400;
0227 TCanvas canvas("c", "c", w, h);
0228 canvas.SetWindowSize(w + (w - canvas.GetWw()), h + (h - canvas.GetWh()));
0229
0230 TLatex t1;
0231 t1.SetNDC();
0232 t1.SetTextAlign(26);
0233 int len = l_tagname[0].length() + l_tagname[1].length();
0234 if (ntags == 2) {
0235 if (len < 80) {
0236 t1.SetTextSize(0.03);
0237 t1.DrawLatex(0.5, 0.96, Form("%s %i - %s %i", l_tagname[1].c_str(), run[1], l_tagname[0].c_str(), run[0]));
0238 } else {
0239 t1.SetTextSize(0.05);
0240 t1.DrawLatex(0.5, 0.96, Form("Ecal TPGCrystalStatus, IOV %i - %i", run[1], run[0]));
0241 }
0242 } else {
0243 t1.SetTextSize(0.03);
0244 t1.DrawLatex(0.5, 0.96, Form("%s, IOV %i - %i", l_tagname[0].c_str(), run[1], run[0]));
0245 }
0246
0247
0248
0249 float xmi[3] = {0.0, 0.0, 0.5};
0250 float xma[3] = {1.0, 0.5, 1.0};
0251 float ymi[3] = {0.47, 0.0, 0.0};
0252 float yma[3] = {0.94, 0.47, 0.47};
0253 std::vector<std::unique_ptr<TPad>> pad;
0254 for (int obj = 0; obj < 3; obj++) {
0255 pad.emplace_back(new TPad(Form("p_%i", obj), Form("p_%i", obj), xmi[obj], ymi[obj], xma[obj], yma[obj]));
0256 pad[obj]->Draw();
0257 }
0258
0259 pad[0]->cd();
0260 DrawEB(barrel, -1., 1.);
0261 t1.DrawLatex(0.2, 0.94, Form("%i differences", EBstat));
0262 pad[1]->cd();
0263 DrawEE(endc_m, -1., 1.);
0264 t1.DrawLatex(0.15, 0.92, Form("%i differences", EEstat[0]));
0265 pad[2]->cd();
0266 DrawEE(endc_p, -1., 1.);
0267 t1.DrawLatex(0.15, 0.92, Form("%i differences", EEstat[1]));
0268
0269 std::string ImageName(this->m_imageFileName);
0270 canvas.SaveAs(ImageName.c_str());
0271 return true;
0272 }
0273 };
0274 using EcalTPGCrystalStatusDiffOneTag = EcalTPGCrystalStatusDiffBase<cond::payloadInspector::SINGLE_IOV, 1>;
0275 using EcalTPGCrystalStatusDiffTwoTags = EcalTPGCrystalStatusDiffBase<cond::payloadInspector::SINGLE_IOV, 2>;
0276
0277
0278
0279
0280 class EcalTPGCrystalStatusSummaryPlot : public cond::payloadInspector::PlotImage<EcalTPGCrystalStatus> {
0281 public:
0282 EcalTPGCrystalStatusSummaryPlot()
0283 : cond::payloadInspector::PlotImage<EcalTPGCrystalStatus>("Ecal TPGCrystal Status Error Summary - map ") {
0284 setSingleIov(true);
0285 }
0286
0287 bool fill(const std::vector<std::tuple<cond::Time_t, cond::Hash>>& iovs) override {
0288 auto iov = iovs.front();
0289 std::shared_ptr<EcalTPGCrystalStatus> payload =
0290 fetchPayload(std::get<1>(iov));
0291 unsigned int run = std::get<0>(iov);
0292 TH2F* align;
0293
0294 int NbRows = 3;
0295 int NbColumns = 3;
0296
0297 if (payload.get()) {
0298
0299 align = new TH2F("Ecal TPGCrystal Status Error Summary",
0300 "EB/EE-/EE+ ErrorCount Total Number",
0301 NbColumns,
0302 0,
0303 NbColumns,
0304 NbRows,
0305 0,
0306 NbRows);
0307
0308 long unsigned int ebErrorCount = 0;
0309 long unsigned int ee1ErrorCount = 0;
0310 long unsigned int ee2ErrorCount = 0;
0311
0312 long unsigned int ebTotal = (payload->barrelItems()).size();
0313 long unsigned int ee1Total = 0;
0314 long unsigned int ee2Total = 0;
0315
0316 getBarrelErrorSummary<EcalTPGCrystalStatusCode>(payload->barrelItems(), ebErrorCount);
0317 getEndCapErrorSummary<EcalTPGCrystalStatusCode>(
0318 payload->endcapItems(), ee1ErrorCount, ee2ErrorCount, ee1Total, ee2Total);
0319
0320 double row = NbRows - 0.5;
0321
0322
0323 align->Fill(0.5, row, 1);
0324 align->Fill(1.5, row, ebErrorCount);
0325 align->Fill(2.5, row, ebTotal);
0326
0327 row--;
0328
0329 align->Fill(0.5, row, 2);
0330 align->Fill(1.5, row, ee1ErrorCount);
0331 align->Fill(2.5, row, ee1Total);
0332
0333 row--;
0334
0335
0336 align->Fill(0.5, row, 3);
0337 align->Fill(1.5, row, ee2ErrorCount);
0338 align->Fill(2.5, row, ee2Total);
0339
0340 }
0341 else
0342 return false;
0343
0344 gStyle->SetPalette(1);
0345 gStyle->SetOptStat(0);
0346 TCanvas canvas("CC map", "CC map", 1000, 1000);
0347 TLatex t1;
0348 t1.SetNDC();
0349 t1.SetTextAlign(26);
0350 t1.SetTextSize(0.04);
0351 t1.SetTextColor(2);
0352 t1.DrawLatex(0.5, 0.96, Form("EcalTPGCrystalStatus Error Summary, IOV %i", run));
0353
0354 TPad pad("pad", "pad", 0.0, 0.0, 1.0, 0.94);
0355 pad.Draw();
0356 pad.cd();
0357 align->Draw("TEXT");
0358
0359 drawTable(NbRows, NbColumns);
0360
0361 align->GetXaxis()->SetTickLength(0.);
0362 align->GetXaxis()->SetLabelSize(0.);
0363 align->GetYaxis()->SetTickLength(0.);
0364 align->GetYaxis()->SetLabelSize(0.);
0365
0366 std::string ImageName(m_imageFileName);
0367 canvas.SaveAs(ImageName.c_str());
0368 return true;
0369 }
0370 };
0371
0372 }
0373
0374
0375 PAYLOAD_INSPECTOR_MODULE(EcalTPGCrystalStatus) {
0376 PAYLOAD_INSPECTOR_CLASS(EcalTPGCrystalStatusPlot);
0377 PAYLOAD_INSPECTOR_CLASS(EcalTPGCrystalStatusDiffOneTag);
0378 PAYLOAD_INSPECTOR_CLASS(EcalTPGCrystalStatusDiffTwoTags);
0379 PAYLOAD_INSPECTOR_CLASS(EcalTPGCrystalStatusSummaryPlot);
0380 }