CMS 3D CMS Logo

EgHLTOfflineSummaryClient.cc
Go to the documentation of this file.
2 
7 
9 
11 
14 #include <boost/algorithm/string.hpp>
15 #include <fnmatch.h>
16 
18  : egHLTSumHistName_("egHLTTrigSum"), isSetup_(false) {
19  usesResource("DQMStore");
21  "DQMDirName"); //only one chance to get this, if we every have another shot, remember to check isSetup is okay
23  if (!dbe_) {
24  edm::LogError("EgHLTOfflineSummaryClient")
25  << "unable to get DQMStore service, no summary histograms will be produced";
26  } else {
28  }
29 
30  eleHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("eleHLTFilterNames");
31  phoHLTFilterNames_ = iConfig.getParameter<std::vector<std::string> >("phoHLTFilterNames");
32  eleHLTFilterNamesForSumBit_ = iConfig.getParameter<std::vector<std::string> >("eleHLTFilterNamesForSumBit");
33  phoHLTFilterNamesForSumBit_ = iConfig.getParameter<std::vector<std::string> >("phoHLTFilterNamesForSumBit");
34 
35  filterInactiveTriggers_ = iConfig.getParameter<bool>("filterInactiveTriggers");
36  hltTag_ = iConfig.getParameter<std::string>("hltTag");
37 
38  usePathNames_ = iConfig.getParameter<bool>("usePathNames");
39 
40  //std::vector<std::string> egHLTSumQTests = iConfig.getParameter<std::vector<std::string> >("egHLTSumQTests");
41  // splitStringsToPairs_(egHLTSumQTests,egHLTSumHistXBins_);
42 
43  fillQTestData_(iConfig, egHLTSumHistXBins_, "egHLTSumQTests");
44  fillQTestData_(iConfig, eleQTestsForSumBit_, "egHLTEleQTestsForSumBit");
45  fillQTestData_(iConfig, phoQTestsForSumBit_, "egHLTPhoQTestsForSumBit");
46 
47  runClientEndLumiBlock_ = iConfig.getParameter<bool>("runClientEndLumiBlock");
48  runClientEndRun_ = iConfig.getParameter<bool>("runClientEndRun");
49  runClientEndJob_ = iConfig.getParameter<bool>("runClientEndJob");
50 
51  //egHLTSumHistXBins_.push_back(std::make_pair("Ele Rel Trig Eff",&EgHLTOfflineSummaryClient::eleTrigRelEffQTestResult_));
52  //egHLTSumHistXBins_.push_back(std::make_pair("Pho Rel Trig Eff",&EgHLTOfflineSummaryClient::phoTrigRelEffQTestResult_));
53  //egHLTSumHistXBins_.push_back(std::make_pair("Ele T&P Trig Eff",&EgHLTOfflineSummaryClient::eleTrigTPEffQTestResult_));
54  //egHLTSumHistXBins_.push_back(std::make_pair("Triggered Ele",&EgHLTOfflineSummaryClient::trigEleQTestResult_));
55  //egHLTSumHistXBins_.push_back(std::make_pair("Triggered Pho",&EgHLTOfflineSummaryClient::trigPhoQTestResult_));
56 }
57 
59 
61 
63  if (runClientEndJob_)
64  runClient_();
65 }
66 
68  if (!isSetup_) {
69  bool changed;
71  hltConfig.init(run, c, hltTag_, changed);
73  std::vector<std::string> activeFilters;
74  std::vector<std::string> activeEleFilters;
75  std::vector<std::string> activeEle2LegFilters;
76  std::vector<std::string> activePhoFilters;
77  std::vector<std::string> activePho2LegFilters;
78 
80  hltConfig, activeFilters, activeEleFilters, activeEle2LegFilters, activePhoFilters, activePho2LegFilters);
81 
86  }
88 
89  if (usePathNames_)
91  isSetup_ = true;
92  }
93 }
94 
96  if (runClientEndRun_)
97  runClient_();
98 }
99 
100 //dummy analysis function
102 
105  runClient_();
106 }
107 
109  MonitorElement* egHLTSumME = getEgHLTSumHist_();
110 
111  for (size_t filterNr = 0; filterNr < egHLTFiltersToMon_.size(); filterNr++) {
112  for (size_t xBinNr = 0; xBinNr < egHLTSumHistXBins_.size(); xBinNr++) {
113  //egHLTSumHist->setBinContent(xBinNr+1,filterNr+1,(*egHLTSumHistXBins_[xBinNr].second)(egHLTFiltersToMon_[filterNr].c_str()));
114  egHLTSumME->setBinContent(
115  xBinNr + 1,
116  filterNr + 1,
117  getQTestResults_(egHLTFiltersToMon_[filterNr], egHLTSumHistXBins_[xBinNr].qTestPatterns));
118  }
119  }
120 
121  MonitorElement* hltEleSumBit = dbe_->get("HLT/EventInfo/reportSummaryContents/HLT_Electron");
122  MonitorElement* hltPhoSumBit = dbe_->get("HLT/EventInfo/reportSummaryContents/HLT_Photon");
123  dbe_->setCurrentFolder("HLT/EventInfo/reportSummaryContents/");
124  if (hltEleSumBit == nullptr)
125  hltEleSumBit = dbe_->bookFloat("HLT_Electron");
126  if (hltPhoSumBit == nullptr)
127  hltPhoSumBit = dbe_->bookFloat("HLT_Photon");
128 
129  float eleSumBit = 1.;
130  for (size_t filterNr = 0; filterNr < eleHLTFilterNamesForSumBit_.size() && eleSumBit == 1;
131  filterNr++) { //breaks as soon as a test fails
132  for (size_t testNr = 0; testNr < eleQTestsForSumBit_.size() && eleSumBit == 1; testNr++) {
133  if (getQTestResults_(eleHLTFilterNamesForSumBit_[filterNr], eleQTestsForSumBit_[testNr].qTestPatterns) == 0)
134  eleSumBit = 0;
135  }
136  }
137  hltEleSumBit->Fill(eleSumBit);
138 
139  float phoSumBit = 1.;
140  for (size_t filterNr = 0; filterNr < phoHLTFilterNamesForSumBit_.size() && phoSumBit == 1;
141  filterNr++) { //breaks as soon as a test fails
142  for (size_t testNr = 0; testNr < phoQTestsForSumBit_.size() && phoSumBit == 1; testNr++) {
143  if (getQTestResults_(phoHLTFilterNamesForSumBit_[filterNr], phoQTestsForSumBit_[testNr].qTestPatterns) == 0)
144  phoSumBit = 0;
145  }
146  }
147  hltPhoSumBit->Fill(phoSumBit);
148 }
149 void EgHLTOfflineSummaryClient::splitStringsToPairs_(const std::vector<std::string>& stringsToSplit,
150  std::vector<std::pair<std::string, std::string> >& splitStrings) {
151  splitStrings.clear();
152  splitStrings.reserve(stringsToSplit.size());
153  for (auto const& stringNr : stringsToSplit) {
154  std::vector<std::string> tempSplitStrings;
155  boost::split(tempSplitStrings, stringNr, boost::is_any_of(std::string(":")));
156  if (tempSplitStrings.size() == 2) {
157  splitStrings.push_back(std::make_pair(tempSplitStrings[0], tempSplitStrings[1]));
158  } else {
159  edm::LogWarning("EgHLTOfflineSummaryClient")
160  << " Error : entry " << stringNr
161  << " is not of form A:B, ignoring (ie this quailty test isnt being included in the sumamry hist) ";
162  }
163  }
164 }
165 
167  MonitorElement* egHLTSumHist = dbe_->get(dirName_ + "/" + egHLTSumHistName_);
168  if (egHLTSumHist == nullptr) {
169  auto* hist = new TH2F(egHLTSumHistName_.c_str(),
170  "E/g HLT Offline Summary",
171  egHLTSumHistXBins_.size(),
172  0.,
173  1.,
174  egHLTFiltersToMon_.size(),
175  0.,
176  1.);
177  for (size_t xBinNr = 0; xBinNr < egHLTSumHistXBins_.size(); xBinNr++) {
178  hist->GetXaxis()->SetBinLabel(xBinNr + 1, egHLTSumHistXBins_[xBinNr].name.c_str());
179  }
180 
181  for (size_t yBinNr = 0; yBinNr < egHLTFiltersToMon_.size(); yBinNr++) {
182  if (usePathNames_ && egHLTFiltersToMonPaths_.size() == egHLTFiltersToMon_.size()) {
183  hist->GetYaxis()->SetBinLabel(yBinNr + 1, egHLTFiltersToMonPaths_[yBinNr].c_str());
184  } else {
185  hist->GetYaxis()->SetBinLabel(yBinNr + 1, egHLTFiltersToMon_[yBinNr].c_str());
186  }
187  }
188  for (size_t xBinNr = 0; xBinNr < egHLTSumHistXBins_.size(); xBinNr++) {
189  for (size_t yBinNr = 0; yBinNr < egHLTFiltersToMon_.size(); yBinNr++) {
190  hist->SetBinContent(xBinNr + 1, yBinNr + 1, -2);
191  }
192  }
193 
195  egHLTSumHist = dbe_->book2D(egHLTSumHistName_, hist);
196  }
197  return egHLTSumHist;
198 }
199 
200 //this function puts every e/g trigger monitored in a std::vector
201 //this is *very* similar to EgHLTOfflineSource::getHLTFilterNamesUsed but
202 //it differs in the fact it only gets the E/g primary triggers not the backups
203 //due to the design, to ensure we get every filter, filters will be inserted multiple times
204 //eg electron filters will contain photon triggers which are also in the photon filters
205 //but only want one copy in the vector
206 //this function is intended to be called once per job so some inefficiency can can be tolerated
207 //therefore we will use a std::set to ensure ensure that each filtername is only inserted once
208 //and then convert to a std::vector
209 void EgHLTOfflineSummaryClient::getEgHLTFiltersToMon_(std::vector<std::string>& filterNames) const {
210  std::set<std::string> filterNameSet;
211  for (auto const& eleHLTFilterName : eleHLTFilterNames_)
212  filterNameSet.insert(eleHLTFilterName);
213  for (auto const& phoHLTFilterName : phoHLTFilterNames_)
214  filterNameSet.insert(phoHLTFilterName);
215 
216  //right all the triggers are inserted once and only once in the set, convert to vector
217  //very lazy, create a new vector so can use the constructor and then use swap to transfer
218  std::vector<std::string>(filterNameSet.begin(), filterNameSet.end()).swap(filterNames);
219 }
220 
221 //only returns 0 or 1, 0 is bad, one is good and if the test is not found defaults to good
222 //(this is because its a dumb algorithm, photon tests are run for electron triggers which unsurprisingly are not found)
224  const std::vector<std::string>& patterns) const {
225  int nrFail = 0;
226  int nrQTests = 0;
227  for (auto const& pattern : patterns) {
228  auto filterpattern = filterName + pattern;
229  std::vector<MonitorElement*> monElems = dbe_->getAllContents(dirName_);
230  // std::cout <<"mon elem "<<dirName_+"/"+filterName+patterns[patternNr]<<"nr monElems "<<monElems.size()<<std::endl;
231  for (auto& monElem : monElems) {
232  const auto& name = monElem->getName();
233  int match = fnmatch(filterpattern.c_str(), name.c_str(), 0);
234  if (match == FNM_NOMATCH)
235  continue;
236 
237  std::vector<QReport*> qTests = monElem->getQReports();
238  nrQTests += qTests.size();
239  // std::cout <<monElems[monElemNr]->getName()<<" "<<monElems[monElemNr]->hasError()<<" nr test "<<qTests.size()<<std::endl;
240  if (monElem->hasError())
241  nrFail++;
242  }
243  }
244  if (nrQTests == 0)
245  return -1;
246  else if (nrFail == 0)
247  return 1;
248  else
249  return 0;
250 }
251 
253  std::vector<SumHistBinData>& qTests,
254  const std::string& label) {
255  std::vector<edm::ParameterSet> qTestPara = iConfig.getParameter<std::vector<edm::ParameterSet> >(label);
256  qTests.resize(qTestPara.size());
257  for (size_t testNr = 0; testNr < qTestPara.size(); testNr++) {
258  qTests[testNr].name = qTestPara[testNr].getParameter<std::string>("name");
259  qTests[testNr].qTestPatterns = qTestPara[testNr].getParameter<std::vector<std::string> >("qTestsToCheck");
260  }
261 }
262 
263 // int EgHLTOfflineSummaryClient::eleTrigRelEffQTestResult_(const std::string& filterName)const
264 // {
265 
266 // }
267 
268 // int EgHLTOfflineSummaryClient::phoTrigRelEffQTestResult_(const std::string& filterName)const
269 // {
270 
271 // }
272 
273 // int EgHLTOfflineSummaryClient::eleTrigTPEffQTestResult_(const std::string& filterName)const
274 // {
275 
276 // }
277 
278 // int EgHLTOfflineSummaryClient::trigEleQTestResult_(const std::string& filterName)const
279 // {
280 
281 // }
282 
283 // int EgHLTOfflineSummaryClient::trigPhoQTestResult_(const std::string& filterName)const
284 // {
285 
286 // }
287 
std::vector< std::string > phoHLTFilterNamesForSumBit_
T getParameter(std::string const &) const
Definition: ParameterSet.h:303
MonitorElement * bookFloat(TString const &name, FUNC onbooking=NOOP())
Definition: DQMStore.h:80
void splitStringsToPairs_(const std::vector< std::string > &stringsToSplit, std::vector< std::pair< std::string, std::string > > &splitStrings)
std::vector< std::string > egHLTFiltersToMonPaths_
std::vector< std::string > eleHLTFilterNamesForSumBit_
void setCurrentFolder(std::string const &fullpath) override
Definition: DQMStore.h:646
std::vector< SumHistBinData > egHLTSumHistXBins_
std::vector< std::string > eleHLTFilterNames_
std::vector< SumHistBinData > eleQTestsForSumBit_
std::vector< std::string > egHLTFiltersToMon_
void endLuminosityBlock(const edm::LuminosityBlock &lumiSeg, const edm::EventSetup &c) override
Log< level::Error, false > LogError
int getQTestResults_(const std::string &filterName, const std::vector< std::string > &pattern) const
void swap(Association< C > &lhs, Association< C > &rhs)
Definition: Association.h:117
void endRun(const edm::Run &run, const edm::EventSetup &c) override
void Fill(long long x)
char const * label
void beginRun(const edm::Run &run, const edm::EventSetup &c) override
void analyze(const edm::Event &, const edm::EventSetup &) override
int iEvent
Definition: GenABIO.cc:224
virtual std::vector< dqm::harvesting::MonitorElement * > getAllContents(std::string const &path) const
Definition: DQMStore.cc:641
~EgHLTOfflineSummaryClient() override
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
std::vector< SumHistBinData > phoQTestsForSumBit_
virtual void setBinContent(int binx, double content)
set content of bin (1-D)
void getActiveFilters(const HLTConfigProvider &hltConfig, std::vector< std::string > &activeFilters, std::vector< std::string > &activeEleFilters, std::vector< std::string > &activeEle2LegFilters, std::vector< std::string > &activePhoFilters, std::vector< std::string > &activePho2LegFilters)
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY, FUNC onbooking=NOOP())
Definition: DQMStore.h:212
virtual MonitorElement * get(std::string const &fullpath) const
Definition: DQMStore.cc:712
std::vector< std::string > phoHLTFilterNames_
void getEgHLTFiltersToMon_(std::vector< std::string > &filterNames) const
void filterInactiveTriggers(std::vector< std::string > &namesToFilter, std::vector< std::string > &activeFilters)
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
EgHLTOfflineSummaryClient(const EgHLTOfflineSummaryClient &rhs)
Log< level::Warning, false > LogWarning
void translateFiltersToPathNames(const HLTConfigProvider &hltConfig, const std::vector< std::string > &filters, std::vector< std::string > &paths)
Definition: Run.h:45
static void fillQTestData_(const edm::ParameterSet &iConfig, std::vector< SumHistBinData > &qTests, const std::string &label)