File indexing completed on 2023-03-17 11:28:44
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0010 #include "FWCore/Framework/interface/Event.h"
0011 #include "FWCore/Framework/interface/EventSetup.h"
0012 #include "FWCore/Framework/interface/MakerMacros.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0015
0016
0017 #include "DQMServices/Core/interface/DQMStore.h"
0018 #include "FWCore/ServiceRegistry/interface/Service.h"
0019
0020
0021 #include "classlib/utils/RegexpMatch.h"
0022 #include "classlib/utils/Regexp.h"
0023
0024 #include <string>
0025 #include <vector>
0026 #include <map>
0027
0028 using namespace std;
0029
0030 class DQMHistNormalizer : public edm::one::EDAnalyzer<edm::one::SharedResources, edm::one::WatchRuns> {
0031 public:
0032 typedef dqm::legacy::DQMStore DQMStore;
0033 typedef dqm::legacy::MonitorElement MonitorElement;
0034
0035 explicit DQMHistNormalizer(const edm::ParameterSet&);
0036 ~DQMHistNormalizer() override;
0037 void analyze(const edm::Event&, const edm::EventSetup&) override;
0038 void beginRun(const edm::Run& r, const edm::EventSetup& c) override {}
0039 void endRun(const edm::Run& r, const edm::EventSetup& c) override;
0040
0041 private:
0042 lat::Regexp* buildRegex(const string& expr);
0043 vector<string> plotNamesToNormalize_;
0044 string reference_;
0045 };
0046
0047 DQMHistNormalizer::DQMHistNormalizer(const edm::ParameterSet& cfg)
0048 : plotNamesToNormalize_(cfg.getParameter<std::vector<string> >("plotNamesToNormalize")),
0049 reference_(cfg.getParameter<string>("reference")) {
0050 usesResource("DQMStore");
0051
0052 }
0053
0054 DQMHistNormalizer::~DQMHistNormalizer() {
0055
0056 }
0057
0058 void DQMHistNormalizer::analyze(const edm::Event&, const edm::EventSetup&) {
0059
0060 }
0061
0062 lat::Regexp* DQMHistNormalizer::buildRegex(const string& expr) {
0063 lat::Regexp* rx = nullptr;
0064 try {
0065 rx = new lat::Regexp(expr, 0, lat::Regexp::Wildcard);
0066 rx->study();
0067 } catch (lat::Error& e) {
0068 throw cms::Exception("DQMHistNormalizer")
0069 << "Invalid regular expression '" << expr.c_str() << "':" << e.explain().c_str();
0070 }
0071 return rx;
0072 }
0073
0074 void DQMHistNormalizer::endRun(const edm::Run& r, const edm::EventSetup& c) {
0075
0076
0077
0078 if (!edm::Service<DQMStore>().isAvailable()) {
0079 edm::LogError("endJob") << " Failed to access dqmStore --> histograms will NOT be plotted !!";
0080 return;
0081 }
0082
0083 DQMStore& dqmStore = (*edm::Service<DQMStore>());
0084
0085 vector<MonitorElement*> allOurMEs = dqmStore.getAllContents("RecoTauV/");
0086 lat::Regexp* refregex = buildRegex("*RecoTauV/*/" + reference_);
0087 vector<lat::Regexp*> toNormRegex;
0088 for (std::vector<string>::const_iterator toNorm = plotNamesToNormalize_.begin();
0089 toNorm != plotNamesToNormalize_.end();
0090 ++toNorm)
0091 toNormRegex.push_back(buildRegex("*RecoTauV/*/" + *toNorm));
0092
0093 map<string, MonitorElement*> refsMap;
0094 vector<MonitorElement*> toNormElements;
0095
0096 for (vector<MonitorElement*>::const_iterator element = allOurMEs.begin(); element != allOurMEs.end(); ++element) {
0097 string pathname = (*element)->getFullname();
0098
0099
0100 if (refregex->match(pathname)) {
0101
0102 string dir = pathname.substr(0, pathname.rfind('/'));
0103 if (refsMap.find(dir) != refsMap.end()) {
0104 edm::LogInfo("DQMHistNormalizer")
0105 << "DQMHistNormalizer::endRun: Warning! found multiple normalizing references for dir: " << dir << "!";
0106 edm::LogInfo("DQMHistNormalizer") << " " << (refsMap[dir])->getFullname();
0107 edm::LogInfo("DQMHistNormalizer") << " " << pathname;
0108 } else {
0109 refsMap[dir] = *element;
0110 }
0111 }
0112
0113
0114 for (vector<lat::Regexp*>::const_iterator reg = toNormRegex.begin(); reg != toNormRegex.end(); ++reg) {
0115 if ((*reg)->match(pathname)) {
0116
0117 toNormElements.push_back(*element);
0118
0119 }
0120 }
0121 }
0122
0123 delete refregex;
0124 for (vector<lat::Regexp*>::const_iterator reg = toNormRegex.begin(); reg != toNormRegex.end(); ++reg)
0125 delete *reg;
0126
0127 for (vector<MonitorElement*>::const_iterator matchingElement = toNormElements.begin();
0128 matchingElement != toNormElements.end();
0129 ++matchingElement) {
0130 string meName = (*matchingElement)->getFullname();
0131 string dir = meName.substr(0, meName.rfind('/'));
0132
0133 if (refsMap.find(dir) == refsMap.end()) {
0134 edm::LogInfo("DQMHistNormalizer") << "DQMHistNormalizer::endRun: Error! normalizing references for " << meName
0135 << " not found! Skipping...";
0136 continue;
0137 }
0138
0139 float norm = refsMap[dir]->getTH1()->GetEntries();
0140 TH1* hist = (*matchingElement)->getTH1();
0141 if (norm != 0.) {
0142 if (!hist->GetSumw2N())
0143 hist->Sumw2();
0144 hist->Scale(1 / norm);
0145 } else {
0146 edm::LogInfo("DQMHistNormalizer") << "DQMHistNormalizer::endRun: Error! Normalization failed in "
0147 << hist->GetTitle() << "!";
0148 }
0149
0150 }
0151 }
0152
0153 DEFINE_FWK_MODULE(DQMHistNormalizer);