File indexing completed on 2024-04-06 12:07:04
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include "DQM/DTMonitorClient/src/DTLocalTriggerEfficiencyTest.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
0019 #include "DQM/DTMonitorModule/interface/DTTrigGeomUtils.h"
0020 #include "Geometry/Records/interface/MuonGeometryRecord.h"
0021 #include "Geometry/DTGeometry/interface/DTGeometry.h"
0022
0023
0024 #include "TF1.h"
0025 #include "TProfile.h"
0026
0027
0028 #include <iostream>
0029 #include <sstream>
0030
0031 using namespace edm;
0032 using namespace std;
0033
0034 DTLocalTriggerEfficiencyTest::DTLocalTriggerEfficiencyTest(const edm::ParameterSet& ps) : trigGeomUtils(nullptr) {
0035 setConfig(ps, "DTLocalTriggerEfficiency");
0036 baseFolderTM = "DT/03-LocalTrigger-TM/";
0037
0038 bookingdone = false;
0039 }
0040
0041 DTLocalTriggerEfficiencyTest::~DTLocalTriggerEfficiencyTest() {
0042 if (trigGeomUtils) {
0043 delete trigGeomUtils;
0044 }
0045 }
0046
0047 void DTLocalTriggerEfficiencyTest::beginRun(const edm::Run& r, const edm::EventSetup& c) {
0048 DTLocalTriggerBaseTest::beginRun(r, c);
0049 trigGeomUtils = new DTTrigGeomUtils(muonGeom);
0050 }
0051
0052 void DTLocalTriggerEfficiencyTest::Bookings(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0053 vector<string>::const_iterator iTr = trigSources.begin();
0054 vector<string>::const_iterator trEnd = trigSources.end();
0055 vector<string>::const_iterator iHw = hwSources.begin();
0056 vector<string>::const_iterator hwEnd = hwSources.end();
0057
0058
0059 if (parameters.getUntrackedParameter<bool>("staticBooking", true)) {
0060 for (; iTr != trEnd; ++iTr) {
0061 trigSource = (*iTr);
0062 for (; iHw != hwEnd; ++iHw) {
0063 hwSource = (*iHw);
0064
0065 for (int wh = -2; wh <= 2; ++wh) {
0066 for (int sect = 1; sect <= 12; ++sect) {
0067 for (int stat = 1; stat <= 4; ++stat) {
0068 DTChamberId chId(wh, stat, sect);
0069 bookChambHistos(ibooker, chId, "TrigEffPosvsAnglePhi");
0070 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleHHHLPhi");
0071 bookChambHistos(ibooker, chId, "TrigEffPosPhi");
0072 bookChambHistos(ibooker, chId, "TrigEffPosHHHLPhi");
0073 bookChambHistos(ibooker, chId, "TrigEffAnglePhi");
0074 bookChambHistos(ibooker, chId, "TrigEffAngleHHHLPhi");
0075 if (stat <= 3) {
0076 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleTheta");
0077 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleHTheta");
0078 bookChambHistos(ibooker, chId, "TrigEffPosTheta");
0079 bookChambHistos(ibooker, chId, "TrigEffPosHTheta");
0080 bookChambHistos(ibooker, chId, "TrigEffAngleTheta");
0081 bookChambHistos(ibooker, chId, "TrigEffAngleHTheta");
0082 }
0083 }
0084
0085 bookSectorHistos(ibooker, wh, sect, "TrigEffPhi");
0086 bookSectorHistos(ibooker, wh, sect, "TrigEffTheta");
0087 }
0088
0089 bookWheelHistos(ibooker, wh, "TrigEffPhi");
0090 bookWheelHistos(ibooker, wh, "TrigEffHHHLPhi");
0091 bookWheelHistos(ibooker, wh, "TrigEffTheta");
0092 bookWheelHistos(ibooker, wh, "TrigEffHTheta");
0093 }
0094 }
0095 }
0096 }
0097
0098 bookingdone = true;
0099 }
0100
0101 void DTLocalTriggerEfficiencyTest::runClientDiagnostic(DQMStore::IBooker& ibooker, DQMStore::IGetter& igetter) {
0102 if (!bookingdone)
0103 Bookings(ibooker, igetter);
0104
0105
0106 for (vector<string>::const_iterator iTr = trigSources.begin(); iTr != trigSources.end(); ++iTr) {
0107 trigSource = (*iTr);
0108 for (vector<string>::const_iterator iHw = hwSources.begin(); iHw != hwSources.end(); ++iHw) {
0109 hwSource = (*iHw);
0110
0111 for (int stat = 1; stat <= 4; ++stat) {
0112 for (int wh = -2; wh <= 2; ++wh) {
0113 for (int sect = 1; sect <= 12; ++sect) {
0114 DTChamberId chId(wh, stat, sect);
0115 int sector_id = (wh + wheelArrayShift) + (sect - 1) * 5;
0116 uint32_t indexCh = chId.rawId();
0117
0118 TH2F* TrackPosvsAngle = getHisto<TH2F>(igetter.get(getMEName("TrackPosvsAngle", "Segment", chId)));
0119 TH2F* TrackPosvsAngleandTrig =
0120 getHisto<TH2F>(igetter.get(getMEName("TrackPosvsAngleandTrig", "Segment", chId)));
0121 TH2F* TrackPosvsAngleandTrigHHHL =
0122 getHisto<TH2F>(igetter.get(getMEName("TrackPosvsAngleandTrigHHHL", "Segment", chId)));
0123
0124 if (TrackPosvsAngle && TrackPosvsAngleandTrig && TrackPosvsAngleandTrigHHHL &&
0125 TrackPosvsAngle->GetEntries() > 1) {
0126 if (chambME[indexCh].find(fullName("TrigEffAnglePhi")) == chambME[indexCh].end()) {
0127 bookChambHistos(ibooker, chId, "TrigEffPosvsAnglePhi");
0128 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleHHHLPhi");
0129 bookChambHistos(ibooker, chId, "TrigEffPosPhi");
0130 bookChambHistos(ibooker, chId, "TrigEffPosHHHLPhi");
0131 bookChambHistos(ibooker, chId, "TrigEffAnglePhi");
0132 bookChambHistos(ibooker, chId, "TrigEffAngleHHHLPhi");
0133 }
0134 if (secME[sector_id].find(fullName("TrigEffPhi")) == secME[sector_id].end()) {
0135 bookSectorHistos(ibooker, wh, sect, "TrigEffPhi");
0136 }
0137 if (whME[wh].find(fullName("TrigEffPhi")) == whME[wh].end()) {
0138 bookWheelHistos(ibooker, wh, "TrigEffPhi");
0139 bookWheelHistos(ibooker, wh, "TrigEffHHHLPhi");
0140 }
0141
0142 std::map<std::string, MonitorElement*>* innerME = &(secME[sector_id]);
0143 TH1D* TrackPos = TrackPosvsAngle->ProjectionY();
0144 TH1D* TrackAngle = TrackPosvsAngle->ProjectionX();
0145 TH1D* TrackPosandTrig = TrackPosvsAngleandTrig->ProjectionY();
0146 TH1D* TrackAngleandTrig = TrackPosvsAngleandTrig->ProjectionX();
0147 TH1D* TrackPosandTrigHHHL = TrackPosvsAngleandTrigHHHL->ProjectionY();
0148 TH1D* TrackAngleandTrigHHHL = TrackPosvsAngleandTrigHHHL->ProjectionX();
0149 float binEff = float(TrackPosandTrig->GetEntries()) / TrackPos->GetEntries();
0150 float binEffHHHL = float(TrackPosandTrigHHHL->GetEntries()) / TrackPos->GetEntries();
0151 float binErr = sqrt(binEff * (1 - binEff) / TrackPos->GetEntries());
0152 float binErrHHHL = sqrt(binEffHHHL * (1 - binEffHHHL) / TrackPos->GetEntries());
0153
0154 MonitorElement* globalEff = innerME->find(fullName("TrigEffPhi"))->second;
0155 globalEff->setBinContent(stat, binEff);
0156 globalEff->setBinError(stat, binErr);
0157
0158 innerME = &(whME[wh]);
0159 globalEff = innerME->find(fullName("TrigEffPhi"))->second;
0160 globalEff->setBinContent(sect, stat, binEff);
0161 globalEff->setBinError(sect, stat, binErr);
0162 globalEff = innerME->find(fullName("TrigEffHHHLPhi"))->second;
0163 globalEff->setBinContent(sect, stat, binEffHHHL);
0164 globalEff->setBinError(sect, stat, binErrHHHL);
0165
0166 innerME = &(chambME[indexCh]);
0167 makeEfficiencyME(TrackPosandTrig, TrackPos, innerME->find(fullName("TrigEffPosPhi"))->second);
0168 makeEfficiencyME(TrackPosandTrigHHHL, TrackPos, innerME->find(fullName("TrigEffPosHHHLPhi"))->second);
0169 makeEfficiencyME(TrackAngleandTrig, TrackAngle, innerME->find(fullName("TrigEffAnglePhi"))->second);
0170 makeEfficiencyME(
0171 TrackAngleandTrigHHHL, TrackAngle, innerME->find(fullName("TrigEffAngleHHHLPhi"))->second);
0172 makeEfficiencyME2D(
0173 TrackPosvsAngleandTrig, TrackPosvsAngle, innerME->find(fullName("TrigEffPosvsAnglePhi"))->second);
0174 makeEfficiencyME2D(TrackPosvsAngleandTrigHHHL,
0175 TrackPosvsAngle,
0176 innerME->find(fullName("TrigEffPosvsAngleHHHLPhi"))->second);
0177 }
0178
0179
0180 TH2F* TrackThetaPosvsAngle =
0181 getHisto<TH2F>(igetter.get(getMEName("TrackThetaPosvsAngle", "Segment", chId)));
0182 TH2F* TrackThetaPosvsAngleandTrig =
0183 getHisto<TH2F>(igetter.get(getMEName("TrackThetaPosvsAngleandTrig", "Segment", chId)));
0184 TH2F* TrackThetaPosvsAngleandTrigH =
0185 getHisto<TH2F>(igetter.get(getMEName("TrackThetaPosvsAngleandTrigH", "Segment", chId)));
0186
0187 if (TrackThetaPosvsAngle && TrackThetaPosvsAngleandTrig && TrackThetaPosvsAngleandTrigH &&
0188 TrackThetaPosvsAngle->GetEntries() > 1) {
0189 if (chambME[indexCh].find(fullName("TrigEffAngleTheta")) == chambME[indexCh].end()) {
0190 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleTheta");
0191 bookChambHistos(ibooker, chId, "TrigEffPosvsAngleHTheta");
0192 bookChambHistos(ibooker, chId, "TrigEffPosTheta");
0193 bookChambHistos(ibooker, chId, "TrigEffPosHTheta");
0194 bookChambHistos(ibooker, chId, "TrigEffAngleTheta");
0195 bookChambHistos(ibooker, chId, "TrigEffAngleHTheta");
0196 }
0197 if (secME[sector_id].find(fullName("TrigEffTheta")) == secME[sector_id].end()) {
0198 bookSectorHistos(ibooker, wh, sect, "TrigEffTheta");
0199 }
0200 if (whME[wh].find(fullName("TrigEffTheta")) == whME[wh].end()) {
0201 bookWheelHistos(ibooker, wh, "TrigEffTheta");
0202 bookWheelHistos(ibooker, wh, "TrigEffHTheta");
0203 }
0204
0205 std::map<std::string, MonitorElement*>* innerME = &(secME[sector_id]);
0206 TH1D* TrackThetaPos = TrackThetaPosvsAngle->ProjectionY();
0207 TH1D* TrackThetaAngle = TrackThetaPosvsAngle->ProjectionX();
0208 TH1D* TrackThetaPosandTrig = TrackThetaPosvsAngleandTrig->ProjectionY();
0209 TH1D* TrackThetaAngleandTrig = TrackThetaPosvsAngleandTrig->ProjectionX();
0210 TH1D* TrackThetaPosandTrigH = TrackThetaPosvsAngleandTrigH->ProjectionY();
0211 TH1D* TrackThetaAngleandTrigH = TrackThetaPosvsAngleandTrigH->ProjectionX();
0212 float binEff = float(TrackThetaPosandTrig->GetEntries()) / TrackThetaPos->GetEntries();
0213 float binErr = sqrt(binEff * (1 - binEff) / TrackThetaPos->GetEntries());
0214 float binEffH = float(TrackThetaPosandTrigH->GetEntries()) / TrackThetaPos->GetEntries();
0215 float binErrH = sqrt(binEffH * (1 - binEffH) / TrackThetaPos->GetEntries());
0216
0217 MonitorElement* globalEff = innerME->find(fullName("TrigEffTheta"))->second;
0218 globalEff->setBinContent(stat, binEff);
0219 globalEff->setBinError(stat, binErr);
0220
0221 innerME = &(whME[wh]);
0222 globalEff = innerME->find(fullName("TrigEffTheta"))->second;
0223 globalEff->setBinContent(sect, stat, binEff);
0224 globalEff->setBinError(sect, stat, binErr);
0225 globalEff = innerME->find(fullName("TrigEffHTheta"))->second;
0226 globalEff->setBinContent(sect, stat, binEffH);
0227 globalEff->setBinError(sect, stat, binErrH);
0228
0229 innerME = &(chambME[indexCh]);
0230 makeEfficiencyME(TrackThetaPosandTrig, TrackThetaPos, innerME->find(fullName("TrigEffPosTheta"))->second);
0231 makeEfficiencyME(
0232 TrackThetaPosandTrigH, TrackThetaPos, innerME->find(fullName("TrigEffPosHTheta"))->second);
0233 makeEfficiencyME(
0234 TrackThetaAngleandTrig, TrackThetaAngle, innerME->find(fullName("TrigEffAngleTheta"))->second);
0235 makeEfficiencyME(
0236 TrackThetaAngleandTrigH, TrackThetaAngle, innerME->find(fullName("TrigEffAngleHTheta"))->second);
0237 makeEfficiencyME2D(TrackThetaPosvsAngleandTrig,
0238 TrackThetaPosvsAngle,
0239 innerME->find(fullName("TrigEffPosvsAngleTheta"))->second);
0240 makeEfficiencyME2D(TrackThetaPosvsAngleandTrigH,
0241 TrackThetaPosvsAngle,
0242 innerME->find(fullName("TrigEffPosvsAngleHTheta"))->second);
0243 }
0244 }
0245 }
0246 }
0247 }
0248 }
0249 }
0250
0251 void DTLocalTriggerEfficiencyTest::makeEfficiencyME(TH1D* numerator, TH1D* denominator, MonitorElement* result) {
0252 TH1F* efficiency = result->getTH1F();
0253 efficiency->Divide(numerator, denominator, 1, 1, "");
0254
0255 int nbins = efficiency->GetNbinsX();
0256 for (int bin = 1; bin <= nbins; ++bin) {
0257 float error = 0;
0258 float bineff = efficiency->GetBinContent(bin);
0259
0260 if (denominator->GetBinContent(bin)) {
0261 error = sqrt(bineff * (1 - bineff) / denominator->GetBinContent(bin));
0262 } else {
0263 error = 1;
0264 efficiency->SetBinContent(bin, 1.);
0265 }
0266
0267 efficiency->SetBinError(bin, error);
0268 }
0269 }
0270
0271 void DTLocalTriggerEfficiencyTest::makeEfficiencyME2D(TH2F* numerator, TH2F* denominator, MonitorElement* result) {
0272 TH2F* efficiency = result->getTH2F();
0273 efficiency->Divide(numerator, denominator, 1, 1, "");
0274
0275 int nbinsx = efficiency->GetNbinsX();
0276 int nbinsy = efficiency->GetNbinsY();
0277 for (int binx = 1; binx <= nbinsx; ++binx) {
0278 for (int biny = 1; biny <= nbinsy; ++biny) {
0279 float error = 0;
0280 float bineff = efficiency->GetBinContent(binx, biny);
0281
0282 if (denominator->GetBinContent(binx, biny)) {
0283 error = sqrt(bineff * (1 - bineff) / denominator->GetBinContent(binx, biny));
0284 } else {
0285 error = 1;
0286 efficiency->SetBinContent(binx, biny, 0.);
0287 }
0288
0289 efficiency->SetBinError(binx, biny, error);
0290 }
0291 }
0292 }
0293
0294 void DTLocalTriggerEfficiencyTest::bookChambHistos(DQMStore::IBooker& ibooker, DTChamberId chambId, string htype) {
0295 stringstream wheel;
0296 wheel << chambId.wheel();
0297 stringstream station;
0298 station << chambId.station();
0299 stringstream sector;
0300 sector << chambId.sector();
0301
0302 string fullType = fullName(htype);
0303 string HistoName = fullType + "_W" + wheel.str() + "_Sec" + sector.str() + "_St" + station.str();
0304
0305 ibooker.setCurrentFolder(topFolder() + "Wheel" + wheel.str() + "/Sector" + sector.str() + "/Station" + station.str() +
0306 "/Segment");
0307
0308 LogTrace(category()) << "[" << testName << "Test]: booking " + topFolder() + "Wheel" << wheel.str() << "/Sector"
0309 << sector.str() << "/Station" << station.str() << "/Segment/" << HistoName;
0310
0311 uint32_t indexChId = chambId.rawId();
0312 if (htype.find("TrigEffAnglePhi") == 0) {
0313 chambME[indexChId][fullType] =
0314 ibooker.book1D(HistoName.c_str(), "Trigger efficiency vs angle of incidence (Phi)", 16, -40., 40.);
0315 } else if (htype.find("TrigEffAngleHHHLPhi") == 0) {
0316 chambME[indexChId][fullType] =
0317 ibooker.book1D(HistoName.c_str(), "Trigger efficiency (HH/HL) vs angle of incidence (Phi)", 16, -40., 40.);
0318 } else if (htype.find("TrigEffAngleTheta") == 0) {
0319 chambME[indexChId][fullType] =
0320 ibooker.book1D(HistoName.c_str(), "Trigger efficiency vs angle of incidence (Theta)", 16, -40., 40.);
0321 } else if (htype.find("TrigEffAngleHTheta") == 0) {
0322 chambME[indexChId][fullType] =
0323 ibooker.book1D(HistoName.c_str(), "Trigger efficiency (H) vs angle of incidence (Theta)", 16, -40., 40.);
0324 } else if (htype.find("TrigEffPosPhi") == 0) {
0325 float min, max;
0326 int nbins;
0327 trigGeomUtils->phiRange(chambId, min, max, nbins);
0328 chambME[indexChId][fullType] =
0329 ibooker.book1D(HistoName.c_str(), "Trigger efficiency vs position (Phi)", nbins, min, max);
0330 } else if (htype.find("TrigEffPosvsAnglePhi") == 0) {
0331 float min, max;
0332 int nbins;
0333 trigGeomUtils->phiRange(chambId, min, max, nbins);
0334 chambME[indexChId][fullType] =
0335 ibooker.book2D(HistoName.c_str(), "Trigger efficiency position vs angle (Phi)", 16, -40., 40., nbins, min, max);
0336 } else if (htype.find("TrigEffPosvsAngleHHHLPhi") == 0) {
0337 float min, max;
0338 int nbins;
0339 trigGeomUtils->phiRange(chambId, min, max, nbins);
0340 chambME[indexChId][fullType] = ibooker.book2D(
0341 HistoName.c_str(), "Trigger efficiency (HH/HL) pos vs angle (Phi)", 16, -40., 40., nbins, min, max);
0342 } else if (htype.find("TrigEffPosHHHLPhi") == 0) {
0343 float min, max;
0344 int nbins;
0345 trigGeomUtils->phiRange(chambId, min, max, nbins);
0346 chambME[indexChId][fullType] =
0347 ibooker.book1D(HistoName.c_str(), "Trigger efficiency (HH/HL) vs position (Phi)", nbins, min, max);
0348 } else if (htype.find("TrigEffPosTheta") == 0) {
0349 float min, max;
0350 int nbins;
0351 trigGeomUtils->thetaRange(chambId, min, max, nbins);
0352 chambME[indexChId][fullType] =
0353 ibooker.book1D(HistoName.c_str(), "Trigger efficiency vs position (Theta)", nbins, min, max);
0354 } else if (htype.find("TrigEffPosHTheta") == 0) {
0355 float min, max;
0356 int nbins;
0357 trigGeomUtils->thetaRange(chambId, min, max, nbins);
0358 chambME[indexChId][fullType] =
0359 ibooker.book1D(HistoName.c_str(), "Trigger efficiency (H) vs position (Theta)", nbins, min, max);
0360 } else if (htype.find("TrigEffPosvsAngleTheta") == 0) {
0361 float min, max;
0362 int nbins;
0363 trigGeomUtils->thetaRange(chambId, min, max, nbins);
0364 chambME[indexChId][fullType] =
0365 ibooker.book2D(HistoName.c_str(), "Trigger efficiency pos vs angle (Theta)", 16, -40., 40., nbins, min, max);
0366 } else if (htype.find("TrigEffPosvsAngleHTheta") == 0) {
0367 float min, max;
0368 int nbins;
0369 trigGeomUtils->thetaRange(chambId, min, max, nbins);
0370 chambME[indexChId][fullType] = ibooker.book2D(
0371 HistoName.c_str(), "Trigger efficiency (H) pos vs angle (Theta)", 16, -40., 40., nbins, min, max);
0372 }
0373 }