1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
/**
* \file L1TEfficiencyHarvesting.cc
*
* \author J. Pela, C. Battilana
*
*/
// L1TMonitor includes
#include "DQMOffline/L1Trigger/interface/L1TEfficiencyHarvesting.h"
#include "FWCore/Framework/interface/MakerMacros.h"
using namespace edm;
using namespace std;
namespace dqmoffline {
namespace l1t {
L1TEfficiencyPlotHandler::L1TEfficiencyPlotHandler(const ParameterSet &ps, std::string plotName)
: numeratorDir_(ps.getUntrackedParameter<std::string>("numeratorDir")),
denominatorDir_(ps.getUntrackedParameter<std::string>("denominatorDir", numeratorDir_)),
outputDir_(ps.getUntrackedParameter<std::string>("outputDir", numeratorDir_)),
plotName_(plotName),
numeratorSuffix_(ps.getUntrackedParameter<std::string>("numeratorSuffix", "Num")),
denominatorSuffix_(ps.getUntrackedParameter<std::string>("denominatorSuffix", "Den")),
h_efficiency_() {}
L1TEfficiencyPlotHandler::L1TEfficiencyPlotHandler(const L1TEfficiencyPlotHandler &handler)
: numeratorDir_(handler.numeratorDir_),
denominatorDir_(handler.denominatorDir_),
outputDir_(handler.outputDir_),
plotName_(handler.plotName_),
numeratorSuffix_(handler.numeratorSuffix_),
denominatorSuffix_(handler.denominatorSuffix_),
h_efficiency_(handler.h_efficiency_) {}
void L1TEfficiencyPlotHandler::book(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
edm::LogInfo("L1TEfficiencyPlotHandler")
<< "Booking efficiency histogram for " << outputDir_ << " and " << plotName_ << endl;
std::string numeratorName = numeratorDir_ + "/" + plotName_ + numeratorSuffix_;
std::string denominatorName = denominatorDir_ + "/" + plotName_ + denominatorSuffix_;
MonitorElement *num = igetter.get(numeratorName);
MonitorElement *den = igetter.get(denominatorName);
if (!num || !den) {
edm::LogWarning("L1TEfficiencyPlotHandler") << (!num && !den ? numeratorName + " && " + denominatorName
: !num ? numeratorName
: denominatorName)
<< " not gettable. Quitting booking" << endl;
return;
}
TH1 *numH = num->getTH1();
TH1 *denH = den->getTH1();
if (!numH || !denH) {
edm::LogWarning("L1TEfficiencyPlotHandler") << (!numH && !denH ? numeratorName + " && " + denominatorName
: !num ? numeratorName
: denominatorName)
<< " is not TH1F. Quitting booking" << endl;
return;
}
if (numH->GetNbinsX() != denH->GetNbinsX()) {
edm::LogWarning("L1TEfficiencyPlotHandler") << " # X bins in " << numeratorName << " and " << denominatorName
<< " are different. Quitting booking" << endl;
return;
}
MonitorElement::Kind kind = num->kind();
bool is1D = kind == MonitorElement::Kind::TH1F || kind == MonitorElement::Kind::TH1D;
bool is2D = kind == MonitorElement::Kind::TH2F || kind == MonitorElement::Kind::TH2D;
if (is2D) {
if (numH->GetNbinsY() != denH->GetNbinsY()) {
edm::LogWarning("L1TEfficiencyPlotHandler") << " # Y bins in " << numeratorName << " and " << denominatorName
<< " are different. Quitting booking" << endl;
return;
}
}
ibooker.setCurrentFolder(outputDir_);
if (is1D) {
h_efficiency_ = ibooker.book1D(plotName_, den->getTH1F());
} else if (is2D) {
h_efficiency_ = ibooker.book2D(plotName_, den->getTH2F());
}
h_efficiency_->setEfficiencyFlag();
}
void L1TEfficiencyPlotHandler::computeEfficiency(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
if (!h_efficiency_)
return;
edm::LogInfo("L1TEfficiencyPlotHandler") << " Computing efficiency for " << plotName_ << endl;
MonitorElement *num = igetter.get(numeratorDir_ + "/" + plotName_ + numeratorSuffix_);
MonitorElement *den = igetter.get(denominatorDir_ + "/" + plotName_ + denominatorSuffix_);
TH1 *numH = num->getTH1();
TH1 *denH = den->getTH1();
TH1 *effH = h_efficiency_->getTH1();
effH->Divide(numH, denH, 1.0, 1.0, "B");
}
//___________DQM_analyzer_class________________________________________
L1TEfficiencyHarvesting::L1TEfficiencyHarvesting(const ParameterSet &ps)
: verbose_(ps.getUntrackedParameter<bool>("verbose")), plotHandlers_() {
if (verbose_) {
edm::LogInfo("L1TEfficiencyHarvesting") << "____________ Storage initialization ____________ " << endl;
}
for (const auto &plotConfig : ps.getUntrackedParameter<std::vector<edm::ParameterSet>>("plotCfgs")) {
vector<string> plots = plotConfig.getUntrackedParameter<vector<string>>("plots");
for (const auto &plot : plots) {
plotHandlers_.push_back(L1TEfficiencyPlotHandler(plotConfig, plot));
}
}
}
//_____________________________________________________________________
L1TEfficiencyHarvesting::~L1TEfficiencyHarvesting() {}
//_____________________________________________________________________
void L1TEfficiencyHarvesting::dqmEndJob(DQMStore::IBooker &ibooker, DQMStore::IGetter &igetter) {
if (verbose_) {
edm::LogInfo("L1TEfficiencyHarvesting") << "Called endRun." << endl;
}
for (auto plotHandler : plotHandlers_) {
plotHandler.book(ibooker, igetter);
plotHandler.computeEfficiency(ibooker, igetter);
}
}
//define this as a plug-in
DEFINE_FWK_MODULE(L1TEfficiencyHarvesting);
} // namespace l1t
} // namespace dqmoffline
|