CMS 3D CMS Logo

HltComparator.cc
Go to the documentation of this file.
1 // Originally written by James Jackson
2 // modified by Peter Wittich
3 
4 // user include files
7 //#include "FWCore/Utilities/interface/Exception.h"
8 
9 //#include "FWCore/MessageLogger/interface/MessageLogger.h"
12 
13 #include <TH1.h>
14 #include <iostream>
15 #include <vector>
16 #include <string>
17 
18 
19 typedef std::vector<std::string> StringCollection;
20 
21 
22 // types of outcomes possible.
23 // only some are errors
24 enum {
28 };
29 
30 
31 // Analyser constructor
33  hltOnlineResults_(consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("OnlineResults"))),
34  hltOfflineResults_(consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("OfflineResults"))),
35  init_(false),
36  verbose_(iConfig.getUntrackedParameter<bool>("verbose")),
37  skipPathList_(iConfig.getUntrackedParameter<std::vector<std::string> >("skipPaths")),
38  usePathList_(iConfig.getUntrackedParameter<std::vector<std::string> >("usePaths"))
39 {
40  //std::cout << " HERE I AM " << std::endl;
41  produces<StringCollection >("failedTriggerDescription");
42  //std::cout << " HERE I GO " << std::endl;
43 }
44 
45 
47 {
48 }
49 
50 // Initialises online --> offline trigger bit mappings and histograms
51 void
53  const edm::TriggerResults & offlineResults,
54  edm::Event& e)
55 {
56  init_ = true;
57 
58  // Get trigger names
59  const edm::TriggerNames & onlineTriggerNames = e.triggerNames(onlineResults);
60  const edm::TriggerNames & offlineTriggerNames = e.triggerNames(offlineResults);
61  onlineActualNames_ = onlineTriggerNames.triggerNames();
62  offlineActualNames_ = offlineTriggerNames.triggerNames();
64 
65  // do we need to throw? I guess the whole job is crap if this happens.
66  // sort of assumes we're the only game in town.
67  if (numTriggers_ != offlineActualNames_.size()) {
68  throw cms::Exception("IncorrectTriggers") << "Online had "
69  << numTriggers_ << "triggers, "
70  << "Offline had "
71  << offlineActualNames_.size()
72  << "triggers";
73  }
74 
75  // Create bit mappings
76  std::map<std::string, unsigned int >offlineNameBitMap;
77  for (unsigned int i = 0; i < numTriggers_; ++i) {
78  offlineNameBitMap[offlineActualNames_[i]] = i;
79  }
80  for (unsigned int i = 0; i < numTriggers_; ++i) {
81  // Find offline position for fixed online bit
82  std::map<std::string, unsigned int >::iterator it =
83  offlineNameBitMap.find(onlineActualNames_[i]);
84  if (it != offlineNameBitMap.end()) {
85  onlineToOfflineBitMappings_.push_back(it->second);
86  }
87  else {
88  throw cms:: Exception("IncorrectTriggers") << "Online trigger path "
90  << " not found in Offline "
91  "processing";
92  }
93  }
94 
95  // Create histograms
97  for (std::vector<std::string>::iterator it = onlineActualNames_.begin();
98  it != onlineActualNames_.end(); ++it) {
99  // Bin descriptions: OnOfPass, OnOffFail, OnPassOffFail, OnFailOffPass,
100  // OnOffError, OnRunOffError, OnErrorOffRun, OnRunOffNot OnNotOffRun
101  // OnNotOffNot
102  TH1F *h = fs->make<TH1F>(it->c_str(), it->c_str(), 10, 0, 10);
103  TAxis *a = h->GetXaxis();
104  a->SetBinLabel(1, "OnPass_OffPass");
105  a->SetBinLabel(2, "OnFail_OffFail");
106  a->SetBinLabel(3, "OnPass_OffFail");
107  a->SetBinLabel(4, "OnFail_OffPass");
108  a->SetBinLabel(5, "OnError_OffError");
109  a->SetBinLabel(6, "OnRun_OffError");
110  a->SetBinLabel(7, "OnError_OffRun");
111  a->SetBinLabel(8, "OnRun_OffNotRun");
112  a->SetBinLabel(9, "OnNotRun_OffRun");
113  a->SetBinLabel(10, "OnNotRun_OffNotRun");
114  comparisonHists_.push_back(h);
115  }
116 }
117 
118 // Format a comparison result
120 {
121  switch (i) {
122  case 0:
123  return std::string("OnPass_OffPass");
124  break;
125  case 1:
126  return std::string("OnFail_OffFail");
127  break;
128  case 2:
129  return std::string("OnPass_OffFail");
130  break;
131  case 3:
132  return std::string("OnFail_OffPass");
133  break;
134  case 4:
135  return std::string("OnError_OffError");
136  break;
137  case 5:
138  return std::string("OnRun_OffError");
139  break;
140  case 6:
141  return std::string("OnError_OffRun");
142  break;
143  case 7:
144  return std::string("OnRun_OffNotRun");
145  break;
146  case 8:
147  return std::string("OnNotRun_OffRun");
148  break;
149  case 9:
150  return std::string("OnNotRun_OffNotRun");
151  break;
152  }
153  return std::string("CODE NOT KNOWN");
154 }
155 
156 bool
158  const edm::EventSetup & iSetup)
159 {
160  //std::cout << "top of the filter " << std::endl;
161  // Get trigger results
162  edm::Handle<edm::TriggerResults> onlineResults;
163  edm::Handle<edm::TriggerResults> offlineResults;
164  event.getByToken(hltOnlineResults_, onlineResults);
165  event.getByToken(hltOfflineResults_, offlineResults);
166 
167  std::unique_ptr<StringCollection> resultDescription(new StringCollection);
168 
169  // Initialise comparator if required
170  if (!init_) {
171  initialise(*onlineResults, *offlineResults, event);
172  }
173 
174  // Perform trigger checks
175  bool hasDisagreement = false;
176  for (unsigned int i = 0; i < numTriggers_; ++i) {
177  unsigned int offlineTriggerBit = onlineToOfflineBitMappings_[i];
178 
179  bool onRun = onlineResults->wasrun(i);
180  bool offRun = offlineResults->wasrun(offlineTriggerBit);
181  bool onAccept = onlineResults->accept(i);
182  bool offAccept = offlineResults->accept(offlineTriggerBit);
183  bool onError = onlineResults->error(i);
184  bool offError = offlineResults->error(offlineTriggerBit);
185 
186  int result = -1;
187  if (onError || offError) {
188  if (onError && offError) {
189  result = 4;
190  }
191  else if (onError) {
192  result = 6;
193  }
194  else {
195  result = 5;
196  }
197  }
198  else if ((!onRun) || (!offRun)) {
199  if ((!onRun) && (!offRun)) {
200  result = 9;
201  }
202  else if (!onRun) {
203  result = 8;
204  }
205  else {
206  result = 7;
207  }
208  }
209  else {
210  if (onAccept && offAccept) {
211  result = 0;
212  }
213  else if ((!onAccept) && (!offAccept)) {
214  result = 1;
215  }
216  else if (onAccept) {
217  result = 2;
218  }
219  else {
220  result = 3;
221  }
222  }
223 
224  // Fill the results histogram
225  comparisonHists_[i]->Fill(result);
226 
227  // if the online-offline comparison results in a failure, we
228  // want to send the result to a special stream. Hence we _pass_ the filter.
229  // If it all worked as expected the filter fails and the event doesn't go
230  // to the output stream.
231  if ( (result == kOnPassOffFail) || ( result == kOnFailOffPass ) ||
232  (result == kOnRunOffError) || ( result == kOnErrorOffRun ) ||
233  (result == kOnRunOffNot) || ( result == kOnNotOffRun ) ) {
234  // is this one we should ignore? check the skip list
235  if ( verbose() ) {
236  std::cout << "Found disagreemenet " << result << ", name is "
238  << std::endl;
239  }
240  std::ostringstream desc;
241  desc << onlineActualNames_[i] << ":" << formatResult(result);
242  resultDescription->push_back(desc.str());
243  if ( std::find(skipPathList_.begin(), skipPathList_.end(),
244  onlineActualNames_[i]) == skipPathList_.end() ) {
245 
246  if (!usePathList_.empty()){
247  //only use specified paths to debug
248  if (std::find(usePathList_.begin(), usePathList_.end(),
249  onlineActualNames_[i]) != usePathList_.end() )
250  hasDisagreement = true;
251  }
252  else
253  hasDisagreement = true;
254  }
255  }
256 
257  // Record the trigger error code
258  // I think this should be result > 2? (pw)
259  if (verbose() && (result > 1)) {
260  std::cout << "HLT-Compare: Event " << event.id().event()
261  << " Path " << onlineActualNames_[i] << " "
262  << formatResult(result) << std::endl;
263 #ifdef NOTDEF
264  triggerComparisonErrors_[event.id().event()][onlineActualNames_[i]] = result;
265 #endif // NOTDEF
266  }
267  }
268 
269  //std::cout << " HERE I STAY " << std::endl;
270  event.put(std::move(resultDescription),"failedTriggerDescription");
271  //std::cout << " HERE I WENT " << std::endl;
272 
273  if ( hasDisagreement )
274  return true;
275  else
276  return false;
277 }
278 
279 
280 void
282 {
283 }
284 
285 // Print the trigger results
286 void
288 {
289 #ifdef NOTDEF
290  std::cout << "HLT-Compare ---------- Trigger Comparison Summary ----------" << std::endl;
291  std::cout << "HLT-Compare The following events had trigger mismatches:" << std::endl;
292  std::map<unsigned int, std::map<std::string, unsigned int> >::iterator it;
293  for(it = triggerComparisonErrors_.begin(); it != triggerComparisonErrors_.end(); ++it) {
294  std::cout << "HLT-Compare Event: " << it->first << std::endl;
295  std::map<std::string, unsigned int>::iterator jt;
296  for(jt = it->second.begin(); jt != it->second.end(); ++jt) {
297  std::cout << "HLT-Compare Path: " << jt->first << " : " << formatResult(jt->second) << std::endl;
298  }
299  }
300  std::cout << "HLT-Compare ------------ End Trigger Comparison ------------" << std::endl;
301 #endif //NOTDEF
302 }
303 
bool wasrun() const
Was at least one path run?
unsigned int numTriggers_
Definition: HltComparator.h:39
std::vector< unsigned int > onlineToOfflineBitMappings_
Definition: HltComparator.h:27
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
bool accept() const
Has at least one path accepted the event?
T * make(const Args &...args) const
make new ROOT object
Definition: TFileService.h:64
edm::EDGetTokenT< edm::TriggerResults > hltOnlineResults_
Definition: HltComparator.h:22
bool filter(edm::Event &, const edm::EventSetup &) override
void find(edm::Handle< EcalRecHitCollection > &hits, DetId thisDet, std::vector< EcalRecHitCollection::const_iterator > &hit, bool debug=false)
Definition: FindCaloHit.cc:20
Strings const & triggerNames() const
Definition: TriggerNames.cc:24
HltComparator(const edm::ParameterSet &)
std::vector< TH1F * > comparisonHists_
Definition: HltComparator.h:29
bool verbose() const
Definition: HltComparator.h:34
edm::EDGetTokenT< edm::TriggerResults > hltOfflineResults_
Definition: HltComparator.h:23
std::vector< std::string > onlineActualNames_
Definition: HltComparator.h:25
std::vector< std::string > usePathList_
Definition: HltComparator.h:37
void endJob() override
std::vector< std::string > offlineActualNames_
Definition: HltComparator.h:26
bool error() const
Has any path encountered an error (exception)
void initialise(const edm::TriggerResults &, const edm::TriggerResults &, edm::Event &e)
void beginJob() override
~HltComparator() override
std::string formatResult(const unsigned int)
std::vector< std::string > skipPathList_
Definition: HltComparator.h:36
HLT enums.
double a
Definition: hdecay.h:121
std::vector< std::string > StringCollection
std::map< unsigned int, std::map< std::string, unsigned int > > triggerComparisonErrors_
Definition: HltComparator.h:30
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:301
def move(src, dest)
Definition: eostools.py:510
Definition: event.py:1