File indexing completed on 2024-04-06 12:07:06
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "DQM/DTMonitorClient/src/DTTriggerLutTest.h"
0012
0013
0014 #include "FWCore/Framework/interface/EventSetup.h"
0015 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0016 #include "DQMServices/Core/interface/DQMStore.h"
0017
0018 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0019 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0020
0021
0022 #include "TF1.h"
0023
0024
0025
0026 #include <iostream>
0027 #include <sstream>
0028
0029 using namespace edm;
0030 using namespace std;
0031
0032 DTTriggerLutTest::DTTriggerLutTest(const edm::ParameterSet& ps) {
0033 setConfig(ps, "DTTriggerLut");
0034 baseFolderTM = "DT/03-LocalTrigger-TM/";
0035 thresholdWarnPhi = ps.getUntrackedParameter<double>("thresholdWarnPhi");
0036 thresholdErrPhi = ps.getUntrackedParameter<double>("thresholdErrPhi");
0037 thresholdWarnPhiB = ps.getUntrackedParameter<double>("thresholdWarnPhiB");
0038 thresholdErrPhiB = ps.getUntrackedParameter<double>("thresholdErrPhiB");
0039 validRange = ps.getUntrackedParameter<double>("validRange");
0040 detailedAnalysis = ps.getUntrackedParameter<bool>("detailedAnalysis");
0041
0042 bookingdone = false;
0043 }
0044
0045 DTTriggerLutTest::~DTTriggerLutTest() {}
0046
0047 void DTTriggerLutTest::Bookings(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0048 bookingdone = true;
0049
0050 vector<string>::const_iterator iTr = trigSources.begin();
0051 vector<string>::const_iterator trEnd = trigSources.end();
0052 vector<string>::const_iterator iHw = hwSources.begin();
0053 vector<string>::const_iterator hwEnd = hwSources.end();
0054
0055
0056 if (parameters.getUntrackedParameter<bool>("staticBooking")) {
0057 for (; iTr != trEnd; ++iTr) {
0058 trigSource = (*iTr);
0059 for (; iHw != hwEnd; ++iHw) {
0060 hwSource = (*iHw);
0061
0062 for (int wh = -2; wh <= 2; ++wh) {
0063 if (detailedAnalysis) {
0064 bookWheelHistos(ibooker, wh, "PhiResidualPercentage");
0065 bookWheelHistos(ibooker, wh, "PhibResidualPercentage");
0066 }
0067
0068 bookWheelHistos(ibooker, wh, "PhiLutSummary", "Summaries");
0069 bookWheelHistos(ibooker, wh, "PhibLutSummary", "Summaries");
0070
0071 if (detailedAnalysis) {
0072 bookWheelHistos(ibooker, wh, "PhiResidualMean");
0073 bookWheelHistos(ibooker, wh, "PhiResidualRMS");
0074 bookWheelHistos(ibooker, wh, "PhibResidualMean");
0075 bookWheelHistos(ibooker, wh, "PhibResidualRMS");
0076 bookWheelHistos(ibooker, wh, "CorrelationFactorPhi");
0077 bookWheelHistos(ibooker, wh, "CorrelationFactorPhib");
0078 bookWheelHistos(ibooker, wh, "DoublePeakFlagPhib");
0079 }
0080 }
0081
0082 bookCmsHistos(ibooker, "TrigLutSummary", "", true);
0083 bookCmsHistos(ibooker, "PhiLutSummary");
0084 bookCmsHistos(ibooker, "PhibLutSummary");
0085 if (detailedAnalysis) {
0086 bookCmsHistos1d(ibooker, "PhiPercentageSummary");
0087 bookCmsHistos1d(ibooker, "PhibPercentageSummary");
0088 }
0089 }
0090 }
0091 }
0092 }
0093
0094 void DTTriggerLutTest::beginRun(const edm::Run& r, const edm::EventSetup& c) { DTLocalTriggerBaseTest::beginRun(r, c); }
0095
0096 void DTTriggerLutTest::runClientDiagnostic(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0097 if (!bookingdone)
0098 Bookings(ibooker, igetter);
0099
0100
0101 if (detailedAnalysis) {
0102 cmsME.find(fullName("PhiPercentageSummary"))->second->Reset();
0103 cmsME.find(fullName("PhibPercentageSummary"))->second->Reset();
0104 }
0105
0106
0107 for (vector<string>::const_iterator iTr = trigSources.begin(); iTr != trigSources.end(); ++iTr) {
0108 trigSource = (*iTr);
0109 for (vector<string>::const_iterator iHw = hwSources.begin(); iHw != hwSources.end(); ++iHw) {
0110 hwSource = (*iHw);
0111 vector<const DTChamber*>::const_iterator chIt = muonGeom->chambers().begin();
0112 vector<const DTChamber*>::const_iterator chEnd = muonGeom->chambers().end();
0113 for (; chIt != chEnd; ++chIt) {
0114 DTChamberId chId((*chIt)->id());
0115 int wh = chId.wheel();
0116 int sect = chId.sector();
0117 int stat = chId.station();
0118
0119 std::map<std::string, MonitorElement*>& innerME = whME[wh];
0120
0121
0122 TH1F* PhiResidual = getHisto<TH1F>(igetter.get(getMEName("PhiResidual", "Segment", chId)));
0123 int phiSummary = 1;
0124 if (PhiResidual && PhiResidual->GetEntries() > 10) {
0125 if (innerME.find(fullName("PhiResidualPercentage")) == innerME.end()) {
0126 bookWheelHistos(ibooker, wh, "PhiResidualPercentage");
0127 }
0128
0129 float rangeBin = validRange / (PhiResidual->GetBinWidth(1));
0130 float center = (PhiResidual->GetNbinsX()) / 2.;
0131 float perc =
0132 (PhiResidual->Integral(floor(center - rangeBin), ceil(center + rangeBin))) / (PhiResidual->Integral());
0133 fillWhPlot(innerME.find(fullName("PhiResidualPercentage"))->second, sect, stat, perc, false);
0134 phiSummary = performLutTest(perc, thresholdWarnPhi, thresholdErrPhi);
0135 if (detailedAnalysis)
0136 cmsME.find(fullName("PhiPercentageSummary"))->second->Fill(perc);
0137 }
0138
0139 fillWhPlot(innerME.find(fullName("PhiLutSummary"))->second, sect, stat, phiSummary);
0140
0141 if (detailedAnalysis) {
0142 if ((phiSummary == 0) || (phiSummary == 3)) {
0143
0144 if (innerME.find(fullName("PhiResidualMean")) == innerME.end()) {
0145 bookWheelHistos(ibooker, wh, "PhiResidualMean");
0146 bookWheelHistos(ibooker, wh, "PhiResidualRMS");
0147 }
0148
0149 float center = (PhiResidual->GetNbinsX()) / 2.;
0150 float rangeBin = validRange / (PhiResidual->GetBinWidth(1));
0151 PhiResidual->GetXaxis()->SetRange(floor(center - rangeBin), ceil(center + rangeBin));
0152 float max = PhiResidual->GetMaximumBin();
0153 float maxBin = PhiResidual->GetXaxis()->FindBin(max);
0154 float nBinMax = 0.5 / (PhiResidual->GetBinWidth(1));
0155 PhiResidual->GetXaxis()->SetRange(floor(maxBin - nBinMax), ceil(maxBin + nBinMax));
0156 float Mean = PhiResidual->GetMean();
0157 float rms = PhiResidual->GetRMS();
0158
0159 fillWhPlot(innerME.find(fullName("PhiResidualMean"))->second, sect, stat, Mean);
0160 fillWhPlot(innerME.find(fullName("PhiResidualRMS"))->second, sect, stat, rms);
0161 }
0162
0163 TH2F* TrackPhitkvsPhitrig = getHisto<TH2F>(igetter.get(getMEName("PhitkvsPhitrig", "Segment", chId)));
0164
0165 if (TrackPhitkvsPhitrig && TrackPhitkvsPhitrig->GetEntries() > 100) {
0166 float corr = TrackPhitkvsPhitrig->GetCorrelationFactor();
0167 if (innerME.find(fullName("CorrelationFactorPhi")) == innerME.end()) {
0168 bookWheelHistos(ibooker, wh, "CorrelationFactorPhi");
0169 }
0170 fillWhPlot(innerME.find(fullName("CorrelationFactorPhi"))->second, sect, stat, corr, false);
0171 }
0172 }
0173
0174
0175 TH1F* PhibResidual = getHisto<TH1F>(igetter.get(getMEName("PhibResidual", "Segment", chId)));
0176 int phibSummary = stat == 3 ? -1 : 1;
0177
0178 if (stat != 3 && PhibResidual &&
0179 PhibResidual->GetEntries() > 10) {
0180
0181 if (innerME.find(fullName("PhibResidualPercentage")) == innerME.end()) {
0182 bookWheelHistos(ibooker, wh, "PhibResidualPercentage");
0183 }
0184
0185 float rangeBin = validRange / (PhibResidual->GetBinWidth(1));
0186 float center = (PhibResidual->GetNbinsX()) / 2.;
0187 float perc =
0188 (PhibResidual->Integral(floor(center - rangeBin), ceil(center + rangeBin))) / (PhibResidual->Integral());
0189
0190 fillWhPlot(innerME.find(fullName("PhibResidualPercentage"))->second, sect, stat, perc, false);
0191 phibSummary = performLutTest(perc, thresholdWarnPhiB, thresholdErrPhiB);
0192 if (detailedAnalysis)
0193 cmsME.find(fullName("PhibPercentageSummary"))->second->Fill(perc);
0194 }
0195
0196 fillWhPlot(innerME.find(fullName("PhibLutSummary"))->second, sect, stat, phibSummary);
0197
0198 if (detailedAnalysis) {
0199 if ((phibSummary == 0) || (phibSummary == 3)) {
0200 if (innerME.find(fullName("PhibResidualMean")) == innerME.end()) {
0201 bookWheelHistos(ibooker, wh, "PhibResidualMean");
0202 bookWheelHistos(ibooker, wh, "PhibResidualRMS");
0203 }
0204
0205 float center = (PhibResidual->GetNbinsX()) / 2.;
0206 float rangeBin = validRange / (PhibResidual->GetBinWidth(1));
0207 PhibResidual->GetXaxis()->SetRange(floor(center - rangeBin), ceil(center + rangeBin));
0208 float max = PhibResidual->GetMaximumBin();
0209 float maxBin = PhibResidual->GetXaxis()->FindBin(max);
0210 float nBinMax = 0.5 / (PhibResidual->GetBinWidth(1));
0211 PhibResidual->GetXaxis()->SetRange(floor(maxBin - nBinMax), ceil(maxBin + nBinMax));
0212 float Mean = PhibResidual->GetMean();
0213 float rms = PhibResidual->GetRMS();
0214
0215 fillWhPlot(innerME.find(fullName("PhibResidualMean"))->second, sect, stat, Mean);
0216 fillWhPlot(innerME.find(fullName("PhibResidualRMS"))->second, sect, stat, rms);
0217 }
0218
0219 TH2F* TrackPhibtkvsPhibtrig = getHisto<TH2F>(igetter.get(getMEName("PhibtkvsPhibtrig", "Segment", chId)));
0220 if (TrackPhibtkvsPhibtrig && TrackPhibtkvsPhibtrig->GetEntries() > 100) {
0221 float corr = TrackPhibtkvsPhibtrig->GetCorrelationFactor();
0222 if (innerME.find(fullName("CorrelationFactorPhib")) == innerME.end()) {
0223 bookWheelHistos(ibooker, wh, "CorrelationFactorPhib");
0224 }
0225
0226 fillWhPlot(innerME.find(fullName("CorrelationFactorPhib"))->second, sect, stat, corr, false);
0227 }
0228 }
0229 }
0230 }
0231 }
0232
0233
0234 for (vector<string>::const_iterator iTr = trigSources.begin(); iTr != trigSources.end(); ++iTr) {
0235 trigSource = (*iTr);
0236 for (vector<string>::const_iterator iHw = hwSources.begin(); iHw != hwSources.end(); ++iHw) {
0237 hwSource = (*iHw);
0238 for (int wh = -2; wh <= 2; ++wh) {
0239 std::map<std::string, MonitorElement*>* innerME = &(whME[wh]);
0240
0241 TH2F* phiWhSummary = getHisto<TH2F>(innerME->find(fullName("PhiLutSummary"))->second);
0242 TH2F* phibWhSummary = getHisto<TH2F>(innerME->find(fullName("PhibLutSummary"))->second);
0243
0244 for (int sect = 1; sect <= 12; ++sect) {
0245 int phiSectorTotal = 0;
0246 int phibSectorTotal = 0;
0247 int nullphi = 0;
0248 int nullphib = 0;
0249 int phiStatus = 5;
0250 int phibStatus = 5;
0251 int glbStatus = 0;
0252
0253 for (int stat = 1; stat <= 4; ++stat) {
0254 if (phiWhSummary->GetBinContent(sect, stat) == 2) {
0255 phiSectorTotal += 1;
0256 glbStatus += 1;
0257 }
0258 if (phiWhSummary->GetBinContent(sect, stat) == 1)
0259 nullphi += 1;
0260 if (phibWhSummary->GetBinContent(sect, stat) == 2) {
0261 phibSectorTotal += 1;
0262 glbStatus += 1;
0263 }
0264 if (phibWhSummary->GetBinContent(sect, stat) == 1)
0265 nullphib += 1;
0266 }
0267 if (nullphi != 4)
0268 phiStatus = phiSectorTotal;
0269 else
0270 phiStatus = 5;
0271 if (nullphib != 3)
0272 phibStatus = phibSectorTotal;
0273 else
0274 phibStatus = 5;
0275
0276 cmsME.find("TrigLutSummary")->second->setBinContent(sect, wh + wheelArrayShift, glbStatus);
0277 cmsME.find(fullName("PhiLutSummary"))->second->setBinContent(sect, wh + wheelArrayShift, phiStatus);
0278 cmsME.find(fullName("PhibLutSummary"))->second->setBinContent(sect, wh + wheelArrayShift, phibStatus);
0279 }
0280 }
0281 }
0282 }
0283 }
0284
0285 int DTTriggerLutTest::performLutTest(double perc, double thresholdWarn, double thresholdErr) {
0286 bool isInWarn = perc < thresholdWarn;
0287 bool isInErr = perc < thresholdErr;
0288
0289 int result = isInErr ? 2 : isInWarn ? 3 : 0;
0290
0291 return result;
0292 }
0293
0294 void DTTriggerLutTest::bookCmsHistos1d(DQMStore::IBooker& ibooker, string hTag, string folder) {
0295 string basedir = topFolder();
0296 if (!folder.empty()) {
0297 basedir += folder + "/";
0298 }
0299 ibooker.setCurrentFolder(basedir);
0300
0301 string hName = fullName(hTag);
0302 LogTrace(category()) << "[" << testName << "Test]: booking " << basedir << hName;
0303
0304 MonitorElement* me = ibooker.book1D(hName.c_str(), hName.c_str(), 101, -0.005, 1.005);
0305 me->setAxisTitle("Percentage", 1);
0306 cmsME[hName] = me;
0307 }
0308
0309 void DTTriggerLutTest::fillWhPlot(MonitorElement* plot, int sect, int stat, float value, bool lessIsBest) {
0310 if (sect > 12) {
0311 int scsect = sect == 13 ? 4 : 10;
0312 if ((value > plot->getBinContent(scsect, stat)) == lessIsBest) {
0313 plot->setBinContent(scsect, stat, value);
0314 }
0315 } else {
0316 plot->setBinContent(sect, stat, value);
0317 }
0318
0319 return;
0320 }