CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TopSingleLeptonHLTOfflineDQM.cc
Go to the documentation of this file.
7 
11 #include <iostream>
12 
16 
18 
20 
21 #include <cassert>
22 
23 /*Originally from DQM/Physics by R. Wolf and J. Andrea*/
24 using namespace std;
25 namespace HLTOfflineDQMTopSingleLepton {
26 
27  // maximal number of leading jets
28  // to be used for top mass estimate
29  static const unsigned int MAXJETS = 4;
30  // nominal mass of the W boson to
31  // be used for the top mass estimate
32  static const double WMASS = 80.4;
33  // maximal Delta to consider
34  // hlt and reco objects matched
35  static const double DRMIN = 0.05;
36 
37  MonitorSingleLepton::MonitorSingleLepton(const char* label, const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC) :
38  label_(label), elecIso_(0), elecSelect_(0), pvSelect_(0), muonIso_(0), muonSelect_(0), jetIDSelect_(0), includeBTag_(false), lowerEdge_(-1.), upperEdge_(-1.), logged_(0)
39  {
40  // sources have to be given; this PSet is not optional
41  edm::ParameterSet sources=cfg.getParameter<edm::ParameterSet>("sources");
42  muons_= iC.consumes< edm::View<reco::Muon> >(sources.getParameter<edm::InputTag>("muons"));
43  elecs_= iC.consumes< edm::View<reco::GsfElectron> >(sources.getParameter<edm::InputTag>("elecs"));
44  jets_ = iC.consumes< edm::View<reco::Jet> >(sources.getParameter<edm::InputTag>("jets" ));
45 
46  const auto& mets = sources.getParameter<std::vector<edm::InputTag>>("mets");
47  for (const auto& met: mets) {
48  mets_.push_back(iC.consumes<edm::View<reco::MET>>(met));
49  }
50 
51  pvs_ = iC.consumes< edm::View<reco::Vertex> >(sources.getParameter<edm::InputTag>("pvs" ));
52 
53  // electronExtras are optional; they may be omitted or
54  // empty
55  if( cfg.existsAs<edm::ParameterSet>("elecExtras") ){
56  edm::ParameterSet elecExtras=cfg.getParameter<edm::ParameterSet>("elecExtras");
57  // select is optional; in case it's not found no
58  // selection will be applied
59  if( elecExtras.existsAs<std::string>("select") ){
61  }
62  // isolation is optional; in case it's not found no
63  // isolation will be applied
64  if( elecExtras.existsAs<std::string>("isolation") ){
66  }
67  // electronId is optional; in case it's not found the
68  // InputTag will remain empty
69  if( elecExtras.existsAs<edm::ParameterSet>("electronId") ){
70  edm::ParameterSet elecId=elecExtras.getParameter<edm::ParameterSet>("electronId");
71  electronId_= iC.consumes< edm::ValueMap<float> >(elecId.getParameter<edm::InputTag>("src"));
72  eidPattern_= elecId.getParameter<int>("pattern");
73  }
74  }
75  // pvExtras are optional; they may be omitted or empty
76  if(cfg.existsAs<edm::ParameterSet>("pvExtras")){
77  edm::ParameterSet pvExtras=cfg.getParameter<edm::ParameterSet>("pvExtras");
78  // select is optional; in case it's not found no
79  // selection will be applied
80  if( pvExtras.existsAs<std::string>("select") ){
82  }
83  }
84  // muonExtras are optional; they may be omitted or empty
85  if( cfg.existsAs<edm::ParameterSet>("muonExtras") ){
86  edm::ParameterSet muonExtras=cfg.getParameter<edm::ParameterSet>("muonExtras");
87  // select is optional; in case it's not found no
88  // selection will be applied
89  if( muonExtras.existsAs<std::string>("select") ){
91  }
92  // isolation is optional; in case it's not found no
93  // isolation will be applied
94  if( muonExtras.existsAs<std::string>("isolation") ){
96  }
97  }
98 
99  // jetExtras are optional; they may be omitted or
100  // empty
101  if( cfg.existsAs<edm::ParameterSet>("jetExtras") ){
102  edm::ParameterSet jetExtras=cfg.getParameter<edm::ParameterSet>("jetExtras");
103  // jetCorrector is optional; in case it's not found
104  // the InputTag will remain empty
105  if( jetExtras.existsAs<std::string>("jetCorrector") ){
106  jetCorrector_= jetExtras.getParameter<std::string>("jetCorrector");
107  }
108  // read jetID information if it exists
109  if(jetExtras.existsAs<edm::ParameterSet>("jetID")){
110  edm::ParameterSet jetID=jetExtras.getParameter<edm::ParameterSet>("jetID");
111  jetIDLabel_ = iC.consumes< reco::JetIDValueMap >(jetID.getParameter<edm::InputTag>("label"));
113  }
114  // select is optional; in case it's not found no
115  // selection will be applied (only implemented for
116  // CaloJets at the moment)
117  if( jetExtras.existsAs<std::string>("select") ){
118  jetSelect_= jetExtras.getParameter<std::string>("select");
119  }
120  // jetBDiscriminators are optional; in case they are
121  // not found the InputTag will remain empty; they
122  // consist of pairs of edm::JetFlavorAssociation's &
123  // corresponding working points
124  includeBTag_=jetExtras.existsAs<edm::ParameterSet>("jetBTaggers");
125  if( includeBTag_ ){
126  edm::ParameterSet btagEff=jetExtras.getParameter<edm::ParameterSet>("jetBTaggers").getParameter<edm::ParameterSet>("trackCountingEff");
127  btagEff_= iC.consumes< reco::JetTagCollection >(btagEff.getParameter<edm::InputTag>("label")); btagEffWP_= btagEff.getParameter<double>("workingPoint");
128  edm::ParameterSet btagPur=jetExtras.getParameter<edm::ParameterSet>("jetBTaggers").getParameter<edm::ParameterSet>("trackCountingPur");
129  btagPur_= iC.consumes< reco::JetTagCollection >(btagPur.getParameter<edm::InputTag>("label")); btagPurWP_= btagPur.getParameter<double>("workingPoint");
130  edm::ParameterSet btagVtx=jetExtras.getParameter<edm::ParameterSet>("jetBTaggers").getParameter<edm::ParameterSet>("secondaryVertex" );
131  btagVtx_= iC.consumes< reco::JetTagCollection >(btagVtx.getParameter<edm::InputTag>("label")); btagVtxWP_= btagVtx.getParameter<double>("workingPoint");
132  }
133  }
134 
135  // triggerExtras are optional; they may be omitted or empty
136  processName_ = "HLT";
137  if( cfg.existsAs<edm::ParameterSet>("triggerExtras") ){
138  edm::ParameterSet triggerExtras=cfg.getParameter<edm::ParameterSet>("triggerExtras");
139  triggerTable_= iC.consumes< edm::TriggerResults >(triggerExtras.getParameter<edm::InputTag>("src"));
140  processName_ = triggerExtras.getParameter<edm::InputTag>("src").process();
141  triggerPaths_=triggerExtras.getParameter<std::vector<std::string> >("paths");
142  }
143 
144  // massExtras is optional; in case it's not found no mass
145  // window cuts are applied for the same flavor monitor
146  // histograms
147  if( cfg.existsAs<edm::ParameterSet>("massExtras") ){
148  edm::ParameterSet massExtras=cfg.getParameter<edm::ParameterSet>("massExtras");
149  lowerEdge_= massExtras.getParameter<double>("lowerEdge");
150  upperEdge_= massExtras.getParameter<double>("upperEdge");
151  }
152 
153  // and don't forget to do the histogram booking
154  folder_=cfg.getParameter<std::string>("directory");
155 
156  triggerEventWithRefsTag_ = iC.consumes< trigger::TriggerEventWithRefs >(edm::InputTag("hltTriggerSummaryRAW","",processName_));
157 
158  }
159 
160  void
162  {
163  //set up the current directory path
164  std::string current(folder_); current+=label_;
165  store_.setCurrentFolder(current);
166 
167  // determine number of bins for trigger monitoring
168  unsigned int nPaths=triggerPaths_.size();
169 
170  // number of selected primary vertices
171  hists_["pvMult_" ] = store_.book1D("PvMult" , "N_{pvs}" , 100, 0., 100.);
172  // multiplicity of jets with pt>20 (corrected to L2+L3)
173  hists_["jetMult_" ] = store_.book1D("JetMult" , "N_{20}(jet)" , 10, 0., 10.);
174  // // trigger efficiency estimates for single lepton triggers
175  // hists_["triggerEff_" ] = store_.book1D("TriggerEff" , "Eff(trigger)" , nPaths, 0., nPaths);
176  // monitored trigger occupancy for single lepton triggers
177  hists_["triggerMon_" ] = store_.book1D("TriggerMon" , "Mon(trigger)" , nPaths, 0., nPaths);
178  // W mass estimate
179  hists_["massW_" ] = store_.book1D("MassW" , "M(W)" , 60, 0., 300.);
180  // Top mass estimate
181  hists_["massTop_" ] = store_.book1D("MassTop" , "M(Top)" , 50, 0., 500.);
182  // Mlb mu
183  hists_["mMub_" ] = store_.book1D("mMub" , "m_{#mub}" , 50, 0., 500.);
184  // W mass transverse estimate mu
185  hists_["MTWm_" ] = store_.book1D("MTWm" , "M_{T}^{W}(#mu)" , 60, 0., 300.);
186  // Top mass transverse estimate mu
187  hists_["mMTT_" ] = store_.book1D("mMTT" , "M_{T}^{t}(#mu)" , 50, 0., 500.);
188  // Mlb e
189  hists_["mEb_" ] = store_.book1D("mEb" , "m_{eb}" , 50, 0., 500.);
190  // W mass transverse estimate e
191  hists_["MTWe_" ] = store_.book1D("MTWe" , "M_{T}^{W}(e)" , 60, 0., 300.);
192  // Top mass transverse estimate e
193  hists_["eMTT_" ] = store_.book1D("eMTT" , "M_{T}^{t}(e)" , 50, 0., 500.);
194  // set bin labels for trigger monitoring
196  // multiplicity of btagged jets (for track counting high efficiency) with pt(L2L3)>20
197  hists_["jetMultBEff_"] = store_.book1D("JetMultBProb", "N_{20}(b/prob)" , 10, 0., 10.);
198  // btag discriminator for track counting high efficiency for jets with pt(L2L3)>20
199  hists_["jetBDiscEff_"] = store_.book1D("JetBDiscProb", "Disc_{b/prob}(jet)", 25, 0., 2.5);
200  // multiplicity of btagged jets (for track counting high purity) with pt(L2L3)>20
201  hists_["jetMultBPur_"] = store_.book1D("JetMultBPur", "N_{20}(b/pur)" , 10, 0., 10.);
202  // btag discriminator for track counting high purity
203  hists_["jetBDiscPur_"] = store_.book1D("JetBDiscPur", "Disc_{b/pur}(Jet)", 100, 0., 10.);
204  // multiplicity of btagged jets (for simple secondary vertex) with pt(L2L3)>20
205  hists_["jetMultBVtx_"] = store_.book1D("JetMultBVtx", "N_{20}(b/vtx)" , 10, 0., 10.);
206  // btag discriminator for simple secondary vertex
207  hists_["jetBDiscVtx_"] = store_.book1D("JetBDiscVtx", "Disc_{b/vtx}(Jet)", 35, -1., 6.);
208  // selected events
209  hists_["eventLogger_"] = store_.book2D("EventLogger", "Logged Events" , 3, 0., 3., 4, 0., 4.);
210  // set axes titles for selected events
211  hists_["eventLogger_"]->getTH1()->SetOption("TEXT");
212  hists_["eventLogger_"]->setBinLabel( 1 , "Run" , 1);
213  hists_["eventLogger_"]->setBinLabel( 2 , "Block" , 1);
214  hists_["eventLogger_"]->setBinLabel( 3 , "Event" , 1);
215  hists_["eventLogger_"]->setAxisTitle("logged evts" , 2);
216 
217  // deltaR min between hlt iso lepton and reco iso lepton wrt eta
218  hists_["leptDeltaREta_"] = store_.book2D("DeltaRMinEtaLepton", "#Delta R_{min}(leptons) wrt #eta", 30, -3, 3, 10, 0., 0.1);
219  // deltaR min between hlt jets and reco jets wrt eta
220  hists_["jetDeltaREta_"] = store_.book2D("DeltaRMinEtaJet", "#Delta R_{min}(jets) wrt #eta", 30, -3, 3, 10, 0., 0.1);
221  // resolution in pT for matched isolated leptons
222  hists_["leptResolution_"] = store_.book1D("ResIsoLeptons", "#Delta p_{T}/p_{T}(matched leptons)", 20, 0., 0.1);
223  // resolution in pT for matched jets
224  hists_["jetResolution_"] = store_.book1D("ResIsoJets", "#Delta p_{T}/p_{T}(matched jets)", 20, 0., 0.1);
225  // matching monitoring
226  hists_["matchingMon_"] = store_.book1D("MatchingMon", "Mon(matching)", 5, 0., 5.);
227  // set axes titles for matching monitoring
228  hists_["matchingMon_"]->setBinLabel( 1 , "iso lepton" );
229  hists_["matchingMon_"]->setBinLabel( 2 , "1st jet" );
230  hists_["matchingMon_"]->setBinLabel( 3 , "2nd jet" );
231  hists_["matchingMon_"]->setBinLabel( 4 , "3rd jet" );
232  hists_["matchingMon_"]->setBinLabel( 5 , "all " );
233 
234  return;
235  }
236 
237  void
239  {
240  // fetch trigger event if configured such
243  if( !event.getByToken(triggerTable_, triggerTable) ) return;
244  }
245 
246  /*
247  ------------------------------------------------------------
248 
249  Primary Vertex Monitoring
250 
251  ------------------------------------------------------------
252  */
253  // fill monitoring plots for primary verices
255  if( !event.getByToken(pvs_, pvs) ) {
256  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
257  << "Vertex collection not found \n";
258  return;
259  }
260  unsigned int pvMult = 0;
261  for(edm::View<reco::Vertex>::const_iterator pv=pvs->begin(); pv!=pvs->end(); ++pv){
262  if(!pvSelect_ || (*pvSelect_)(*pv))
263  pvMult++;
264  }
265  fill("pvMult_", pvMult );
266 
267  /*
268  ------------------------------------------------------------
269 
270  Electron Monitoring
271 
272  ------------------------------------------------------------
273  */
274 
275  // fill monitoring plots for electrons
277  if( !event.getByToken(elecs_, elecs) ) {
278  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
279  << "Electron collection not found \n";
280  return;
281  }
282 
283  // check availability of electron id
284  edm::Handle<edm::ValueMap<float> > electronId;
286  if( !event.getByToken(electronId_, electronId) ) return;
287  }
288 
289  // loop electron collection
290  unsigned int eMultIso=0;
291  std::vector<const reco::GsfElectron*> isoElecs;
293  for(edm::View<reco::GsfElectron>::const_iterator elec=elecs->begin(); elec!=elecs->end(); ++elec){
294  unsigned int idx = elec-elecs->begin();
295  // restrict to electrons with good electronId
296  if( electronId_.isUninitialized() ? true : ((int)(*electronId)[elecs->refAt(idx)] & eidPattern_) ){
297  if(!elecSelect_ || (*elecSelect_)(*elec)){
298  if(!elecIso_ || (*elecIso_)(*elec)){ if(eMultIso == 0) e = *elec; isoElecs.push_back(&(*elec)); ++eMultIso;}
299  }
300  }
301  }
302 
303  /*
304  ------------------------------------------------------------
305 
306  Muon Monitoring
307 
308  ------------------------------------------------------------
309  */
310 
311  // fill monitoring plots for muons
312  unsigned int mMultIso=0;
314  std::vector<const reco::Muon*> isoMuons;
315  if( !event.getByToken(muons_, muons) ) {
316  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
317  << "Muon collection not found \n";
318  return;
319  }
320  reco::Muon mu;
321  for(edm::View<reco::Muon>::const_iterator muon=muons->begin(); muon!=muons->end(); ++muon){
322  // restrict to globalMuons
323  if( muon->isGlobalMuon() ){
324  // apply preselection
325  if(!muonSelect_ || (*muonSelect_)(*muon)){
326  if(!muonIso_ || (*muonIso_)(*muon)) {if(mMultIso == 0) mu = *muon; isoMuons.push_back(&(*muon)); ++mMultIso;}
327  }
328  }
329  }
330 
331  /*
332  ------------------------------------------------------------
333 
334  Jet Monitoring
335 
336  ------------------------------------------------------------
337  */
338 
339  // check availability of the btaggers
340  edm::Handle<reco::JetTagCollection> btagEff, btagPur, btagVtx;
341  if( includeBTag_ ){
342  if( !event.getByToken(btagEff_, btagEff) ) return;
343  if( !event.getByToken(btagPur_, btagPur) ) return;
344  if( !event.getByToken(btagVtx_, btagVtx) ) return;
345  }
346  // load jet corrector if configured such
347  const JetCorrector* corrector=0;
348  if(!jetCorrector_.empty()){
349  // check whether a jet corrector is in the event setup or not
350  if(setup.find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
351  corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
352  }
353  else{
354  edm::LogVerbatim( "TopSingleLeptonHLTOfflineDQM" )
355  << "\n"
356  << "------------------------------------------------------------------------------------- \n"
357  << " No JetCorrectionsRecord available from EventSetup: \n"
358  << " - Jets will not be corrected. \n"
359  << " - If you want to change this add the following lines to your cfg file: \n"
360  << " \n"
361  << " ## load jet corrections \n"
362  << " process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
363  << " process.prefer(\"ak5CaloL2L3\") \n"
364  << " \n"
365  << "------------------------------------------------------------------------------------- \n";
366  }
367  }
368 
369  // loop jet collection
370  std::vector<reco::Jet> correctedJets;
371  unsigned int mult=0, multBEff=0, multBPur=0, multBVtx=0;
372 
374  if( !event.getByToken(jets_, jets) ) {
375  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
376  << "Jet collection not found \n";
377  return;
378  }
379 
381  if(jetIDSelect_){
382  if( !event.getByToken(jetIDLabel_, jetID) ) return;
383  }
384  reco::Jet bJetCand;
385  for(edm::View<reco::Jet>::const_iterator jet=jets->begin(); jet!=jets->end(); ++jet){
386  // check jetID for calo jets
387  unsigned int idx = jet-jets->begin();
388  if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())){
389  if(!(*jetIDSelect_)((*jetID)[jets->refAt(idx)])) continue;
390  }
391  // chekc additional jet selection for calo, pf and bare reco jets
392  if(dynamic_cast<const reco::CaloJet*>(&*jet)){
393  reco::CaloJet sel = dynamic_cast<const reco::CaloJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
394  StringCutObjectSelector<reco::CaloJet> jetSelect(jetSelect_); if(!jetSelect(sel)){ continue;}
395  }
396  else if(dynamic_cast<const reco::PFJet*>(&*jet)){
397  reco::PFJet sel= dynamic_cast<const reco::PFJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
398  StringCutObjectSelector<reco::PFJet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
399  }
400  else{
401  reco::Jet sel = *jet; sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
402  StringCutObjectSelector<reco::Jet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
403  }
404 
405  // prepare jet to fill monitor histograms
406  reco::Jet monitorJet = *jet; monitorJet.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
407  correctedJets.push_back(monitorJet);
408  ++mult; // determine jet multiplicity
409  if( includeBTag_ ){
410  // fill b-discriminators
411  edm::RefToBase<reco::Jet> jetRef = jets->refAt(idx);
412  // for the btagEff collection
413  double btagEffDisc = (*btagEff)[jetRef];
414  fill("jetBDiscEff_", btagEffDisc);
415  if( (*btagEff)[jetRef]>btagEffWP_ ) ++multBEff;
416  // for the btagPur collection
417  double btagPurDisc = (*btagPur)[jetRef];
418  fill("jetBDiscPur_", btagPurDisc);
419  if( (*btagPur)[jetRef]>btagPurWP_ ) {if(multBPur == 0) bJetCand = *jet; ++multBPur;}
420  // for the btagVtx collection
421  double btagVtxDisc = (*btagVtx)[jetRef];
422  fill("jetBDiscVtx_", btagVtxDisc);
423  if( (*btagVtx)[jetRef]>btagVtxWP_ ) ++multBVtx;
424  }
425  }
426  fill("jetMult_" , mult );
427  fill("jetMultBEff_", multBEff);
428  fill("jetMultBPur_", multBPur);
429  fill("jetMultBVtx_", multBVtx);
430 
431  /*
432  ------------------------------------------------------------
433 
434  MET Monitoring
435 
436  ------------------------------------------------------------
437  */
438 
439  // fill monitoring histograms for met
440  reco::MET mET;
441  for(std::vector< edm::EDGetTokenT< edm::View<reco::MET> > >::const_iterator met_=mets_.begin(); met_!=mets_.end(); ++met_){
443  if( !event.getByToken(*met_, met) ) continue;
444  if(met->begin()!=met->end()){
445  mET = *(met->begin());
446  }
447  }
448 
449  /*
450  ------------------------------------------------------------
451 
452  Event Monitoring
453 
454  ------------------------------------------------------------
455  */
456 
457  // fill W boson and top mass estimates
458  CalculateHLT eventKinematics(MAXJETS, WMASS);
459  double wMass = eventKinematics.massWBoson (correctedJets);
460  double topMass = eventKinematics.massTopQuark(correctedJets);
461  if(wMass>=0 && topMass>=0) {fill("massW_" , wMass ); fill("massTop_" , topMass);}
462  // fill plots for trigger monitoring
463  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<wMass && wMass<upperEdge_) ){
464  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "trigger", triggerPaths_);
465  if(logged_<=hists_.find("eventLogger_")->second->getNbinsY()){
466  // log runnumber, lumi block, event number & some
467  // more pysics infomation for interesting events
468  // We're doing a static_cast here to denote the explicity of the cast
469  double runID = static_cast<double>(event.eventAuxiliary().run());
470  double luminosityBlockID = static_cast<double>(event.eventAuxiliary().luminosityBlock());
471  double eventID = static_cast<double>(event.eventAuxiliary().event());
472  fill("eventLogger_", 0.5, logged_+0.5, runID);
473  fill("eventLogger_", 1.5, logged_+0.5, luminosityBlockID);
474  fill("eventLogger_", 2.5, logged_+0.5, eventID);
475  ++logged_;
476  }
477  }
478  if(multBPur != 0 && mMultIso == 1 ){
479  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW) fill("MTWm_",mtW);
480  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mMub_", Mlb);
481  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("mMTT_", MTT);
482  }
483 
484  if(multBPur != 0 && eMultIso == 1 ){
485  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW)fill("MTWe_",mtW);
486  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mEb_", Mlb);
487  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("eMTT_", MTT);
488  }
489 
490 
491  /*
492  ------------------------------------------------------------
493 
494  HLT Objects Monitoring
495 
496  ------------------------------------------------------------
497  */
498 
499  edm::Handle<trigger::TriggerEventWithRefs> triggerEventWithRefsHandle;
500  if(event.getByToken(triggerEventWithRefsTag_,triggerEventWithRefsHandle)) {
501 
502  const edm::TriggerNames& triggerNames = event.triggerNames(*triggerTable);
503  // loop over trigger paths
504  for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
505  // consider only path from triggerPaths
506  string name = triggerNames.triggerNames()[i];
507  bool isInteresting = false;
508  for (unsigned int j=0; j<triggerPaths.size(); j++) {
509  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase)) isInteresting = true;
510  }
511  if (!isInteresting) continue;
512  // dump infos on the considered trigger path
513  const unsigned int triggerIndex = triggerNames.triggerIndex(name);
514  // get modules for the considered trigger path
515  const vector<string>& moduleLabels(hltConfig.moduleLabels(triggerIndex));
516  const unsigned int moduleIndex(triggerTable->index(triggerIndex));
517  // Results from TriggerEventWithRefs product
518  electronIds_.clear(); electronRefs_.clear();
519  muonIds_.clear(); muonRefs_.clear();
520  pfjetIds_.clear(); pfjetRefs_.clear();
521  // look only for modules actually run in this path
522  unsigned int kElec=0;
523  unsigned int kMuon=0;
524  unsigned int kJet=0;
525  for (unsigned int k=0; k<=moduleIndex; ++k) {
526  const string& moduleLabel(moduleLabels[k]);
527  const string moduleType(hltConfig.moduleType(moduleLabel));
528  // check whether the module is packed up in TriggerEventWithRef product
529  const unsigned int filterIndex(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
530  if (filterIndex<triggerEventWithRefsHandle->size()) {
531  triggerEventWithRefsHandle->getObjects(filterIndex,electronIds_,electronRefs_);
532  const unsigned int nElectrons(electronIds_.size());
533  if (nElectrons>0) kElec = k;
534 
535  triggerEventWithRefsHandle->getObjects(filterIndex,muonIds_,muonRefs_);
536  const unsigned int nMuons(muonIds_.size());
537  if (nMuons>0) kMuon = k;
538 
539  triggerEventWithRefsHandle->getObjects(filterIndex,pfjetIds_,pfjetRefs_);
540  const unsigned int nPFJets(pfjetIds_.size());
541  if (nPFJets>0) kJet = k;
542  }
543  }
544  bool isMatched = true;
545  bool lMatched = false;
546  bool j1Matched = false;
547  bool j2Matched = false;
548  bool j3Matched = false;
549  // access to hlt elecs
550  double eDeltaRMin = 500.;
551  unsigned int eIndMatched = 500;
552  electronIds_.clear(); electronRefs_.clear();
553  if (kElec > 0) {
554  const string& moduleLabelElec(moduleLabels[kElec]);
555  const string moduleTypeElec(hltConfig.moduleType(moduleLabelElec));
556  const unsigned int filterIndexElec(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
557  triggerEventWithRefsHandle->getObjects(filterIndexElec,electronIds_,electronRefs_);
558  for (unsigned int inde = 0; inde < isoElecs.size(); inde++) {
559  double deltar = deltaR(*electronRefs_[0],*isoElecs[inde]);
560  if (deltar < eDeltaRMin) {
561  eDeltaRMin = deltar;
562  eIndMatched = inde;
563  }
564  }
565  if (eDeltaRMin < DRMIN) lMatched = true;
566  }
567  // access to hlt muons
568  muonIds_.clear(); muonRefs_.clear();
569  double mDeltaRMin = 500.;
570  unsigned int mIndMatched = 500;
571  if (kMuon > 0) {
572  const string& moduleLabelMuon(moduleLabels[kMuon]);
573  const string moduleTypeMuon(hltConfig.moduleType(moduleLabelMuon));
574  const unsigned int filterIndexMuon(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
575  triggerEventWithRefsHandle->getObjects(filterIndexMuon,muonIds_,muonRefs_);
576  for (unsigned int indm = 0; indm < isoMuons.size(); indm++) {
577  double deltar = deltaR(*muonRefs_[0],*isoMuons[indm]);
578  if (deltar < mDeltaRMin) {
579  mDeltaRMin = deltar;
580  mIndMatched = indm;
581  }
582  }
583  if (mDeltaRMin < DRMIN) lMatched = true;
584  }
585  // access to hlt pf jets
586  const unsigned int nPFJets(pfjetIds_.size());
587  pfjetIds_.clear(); pfjetRefs_.clear();
588  double j1DeltaRMin = 500.;
589  double j2DeltaRMin = 500.;
590  double j3DeltaRMin = 500.;
591  unsigned int j1IndMatched = 500;
592  unsigned int j2IndMatched = 500;
593  unsigned int j3IndMatched = 500;
594  if (kJet > 0) {
595  const string& moduleLabelJet(moduleLabels[kJet]);
596  const string moduleTypeJet(hltConfig.moduleType(moduleLabelJet));
597  const unsigned int filterIndexJet(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
598  triggerEventWithRefsHandle->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
599  for (unsigned int indj = 0; indj < correctedJets.size(); indj++) {
600  double deltar1 = deltaR(*pfjetRefs_[0],correctedJets[indj]);
601  if (deltar1 < j1DeltaRMin) {j1DeltaRMin = deltar1; j1IndMatched = indj;}
602  if (nPFJets > 1) {
603  double deltar2 = deltaR(*pfjetRefs_[1],correctedJets[indj]);
604  if (deltar2 < j2DeltaRMin) {j2DeltaRMin = deltar2; j2IndMatched = indj;}
605  if (nPFJets > 2) {
606  double deltar3 = deltaR(*pfjetRefs_[2],correctedJets[indj]);
607  if (deltar3 < j3DeltaRMin) {j3DeltaRMin = deltar3; j3IndMatched = indj;}
608  }
609  }
610  }
611  if (nPFJets > 0 && j1DeltaRMin < DRMIN) j1Matched = true;
612  if (nPFJets > 1 && j2DeltaRMin < DRMIN) j2Matched = true;
613  if (nPFJets > 2 && j3DeltaRMin < DRMIN) j3Matched = true;
614  }
615  if (eIndMatched < 500) {
616  fill("leptDeltaREta_", isoElecs[eIndMatched]->eta(), eDeltaRMin);
617  if (lMatched) fill("leptResolution_", fabs(isoElecs[eIndMatched]->pt()-electronRefs_[0]->pt())/isoElecs[eIndMatched]->pt() );
618  }
619  if (mIndMatched < 500) {
620  fill("leptDeltaREta_", isoMuons[mIndMatched]->eta(), mDeltaRMin);
621  if (lMatched) fill("leptResolution_", fabs(isoMuons[mIndMatched]->pt()-muonRefs_[0]->pt())/isoMuons[mIndMatched]->pt() );
622  }
623  if (lMatched) fill("matchingMon_", 0.5 );
624  else isMatched = false;
625  if (j1IndMatched < 500) {
626  fill("jetDeltaREta_", correctedJets[j1IndMatched].eta(), j1DeltaRMin);
627  if (j1Matched) {
628  fill("jetResolution_", fabs(correctedJets[j1IndMatched].pt()-pfjetRefs_[0]->pt())/correctedJets[j1IndMatched].pt() );
629  fill("matchingMon_", 1.5 );
630  }
631  else isMatched = false;
632  if (j2IndMatched < 500) {
633  fill("jetDeltaREta_", correctedJets[j2IndMatched].eta(), j2DeltaRMin);
634  if (j2Matched) {
635  fill("jetResolution_", fabs(correctedJets[j2IndMatched].pt()-pfjetRefs_[1]->pt())/correctedJets[j2IndMatched].pt() );
636  fill("matchingMon_", 2.5 );
637  }
638  else isMatched = false;
639  if (j3IndMatched < 500) {
640  fill("jetDeltaREta_", correctedJets[j3IndMatched].eta(), j3DeltaRMin);
641  if (j3Matched) {
642  fill("jetResolution_", fabs(correctedJets[j3IndMatched].pt()-pfjetRefs_[2]->pt())/correctedJets[j3IndMatched].pt() );
643  fill("matchingMon_", 3.5 );
644  }
645  else isMatched = false;
646  }
647  }
648  }
649  if (isMatched) fill("matchingMon_", 4.5 );
650 
651  }
652 
653  }
654  }
655 
656 }
657 
659 
661 {
662  // configure preselection
663  edm::ParameterSet presel=cfg.getParameter<edm::ParameterSet>("preselection");
664  if( presel.existsAs<edm::ParameterSet>("trigger") ){
665  edm::ParameterSet trigger=presel.getParameter<edm::ParameterSet>("trigger");
666  triggerTable_= consumes< edm::TriggerResults >(trigger.getParameter<edm::InputTag>("src"));
667  triggerPaths_=trigger.getParameter<std::vector<std::string> >("select");
668  }
669  if( presel.existsAs<edm::ParameterSet>("vertex" ) ){
670  edm::ParameterSet vertex=presel.getParameter<edm::ParameterSet>("vertex");
671  vertex_= consumes< std::vector<reco::Vertex> >(vertex.getParameter<edm::InputTag>("src"));
673  }
674  if( presel.existsAs<edm::ParameterSet>("beamspot" ) ){
676  beamspot_= consumes< reco::BeamSpot >(beamspot.getParameter<edm::InputTag>("src"));
678  }
679 
680  // configure the selection
681  std::vector<edm::ParameterSet> sel=cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
682  for(unsigned int i=0; i<sel.size(); ++i){
683  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
685  }
686 
687  for (const std::string& s: selectionOrder_) {
689 
690  if (selection_.find(key) == selection_.end())
691  continue;
692 
693  if (type == "muons"){
695  }
696  if (type == "elecs"){
698  }
699  if (type == "jets"){
701  }
702  if (type == "jets/pf"){
704  }
705  if (type == "jets/calo"){
707  }
708  if (type == "met"){
710  }
711  }
712 }
713 
714  void
716 {
717  using namespace std;
718  using namespace edm;
719 
720  bool changed(true);
721  if (!hltConfig_.init(iRun,iSetup,"*",changed)) {
722  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
723  << "Config extraction failure with process name "
725  << "\n";
726  return;
727  }
728 }
729 
730  void
732 {
735  if( !event.getByToken(triggerTable_, triggerTable) ) return;
736  if(!acceptHLT(event, *triggerTable, triggerPaths_)) return;
737  }
738  if(!vertex_.isUninitialized()){
740  if( !event.getByToken(vertex_, vertex) ) return;
741  if(vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
742  }
743  if(!beamspot_.isUninitialized()){
745  if( !event.getByToken(beamspot_, beamspot) ) return;
746  if(!(*beamspotSelect_)(*beamspot)) return;
747  }
748  // apply selection steps
749  for(std::vector<std::string>::const_iterator selIt=selectionOrder_.begin(); selIt!=selectionOrder_.end(); ++selIt){
750  std::string key = selectionStep(*selIt), type = objectType(*selIt);
751  if(selection_.find(key)!=selection_.end()){
752 
753  if(type=="empty"){
754  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
755  continue;
756  }
757  if(type=="Hlt" ){
758  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
759  continue;
760  }
761 
762  bool passSel = true;
763 
764  for(std::vector<std::string>::const_iterator selIt2=selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
765  std::string key2 = selectionStep(*selIt2), type2 = objectType(*selIt2);
766  if(selection_.find(key2)==selection_.end()) continue;
767 
768  if(type2=="Hlt" || type2=="empty" ) continue;
769  if (!selectmap_[type2]->select(event)) passSel=false;
770 
771  } // end 2nd loop
772 
773  // Apply cumulative event selection
774  if ( !passSel ) continue;
775 
776  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
777 
778  }
779  }
780 }
781 
782  void
784 {
785  for (auto& sel: selection_) {
786  sel.second.second->book(i);
787  }
788 }
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
tuple cfg
Definition: looper.py:293
const std::string moduleType(const std::string &module) const
C++ class name of module.
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:186
Jets made from CaloTowers.
Definition: CaloJet.h:29
virtual void scaleEnergy(double fScale)
scale energy of the jet
StringCutObjectSelector< reco::JetID > * jetIDSelect_
extra jetID selection on calo jets
std::map< std::string, SelectionStepHLTBase * > selectmap_
StringCutObjectSelector< reco::GsfElectron > * elecSelect_
extra selection on electrons
double masslb(reco::RecoCandidate *mu, const reco::MET &met, const reco::Jet &b)
calculate mlb estimate
double massTopQuark(const std::vector< reco::Jet > &jets)
calculate top quark mass estimate
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:462
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup)
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
virtual double correction(const LorentzVector &fJet) const =0
get correction using Jet information only
Base class for all types of Jets.
Definition: Jet.h:20
double tmassTopQuark(reco::RecoCandidate *mu, const reco::MET &met, const reco::Jet &b)
calculate top quark transverse mass estimate
StringCutObjectSelector< reco::Vertex > * pvSelect_
extra selection on primary vertices; meant to investigate the pile-up effect
std::map< std::string, MonitorElement * > hists_
histogram container
double massWBoson(const std::vector< reco::Jet > &jets)
calculate W boson mass estimate
edm::EDGetTokenT< reco::JetTagCollection > btagPur_
edm::EDGetTokenT< edm::View< reco::GsfElectron > > elecs_
input sources for monitoring
std::string selectionStep(const std::string &label)
edm::EDGetTokenT< reco::JetIDValueMap > jetIDLabel_
jetID as an extra selection type
std::vector< edm::EDGetTokenT< edm::View< reco::MET > > > mets_
considers a vector of METs
void book(DQMStore::IBooker &store_)
book histograms in subdirectory directory
std::vector< std::string > selectionOrder_
Strings const & triggerNames() const
Definition: TriggerNames.cc:24
Jets made from PFObjects.
Definition: PFJet.h:21
#define MAXJETS
Definition: myFastSimVal.cc:30
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
Definition: EventSetup.cc:91
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerEventWithRefsTag_
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
unsigned int triggerIndex(std::string const &name) const
Definition: TriggerNames.cc:32
edm::EDGetTokenT< std::vector< reco::Vertex > > vertex_
primary vertex
void fill(const edm::Event &event, const edm::EventSetup &setup, const HLTConfigProvider &hltConfig, const std::vector< std::string > triggerPaths)
fill monitor histograms with electronId and jetCorrections
tuple corrector
Definition: mvaPFMET_cff.py:86
Definition: MET.h:42
StringCutObjectSelector< reco::BeamSpot > * beamspotSelect_
string cut selector
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
edm::EDGetTokenT< edm::View< reco::Muon > > muons_
std::map< std::string, std::pair< edm::ParameterSet, HLTOfflineDQMTopSingleLepton::MonitorSingleLepton * > > selection_
vector< PseudoJet > jets
edm::EDGetTokenT< reco::JetTagCollection > btagEff_
btag discriminator labels
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:115
int j
Definition: DBlmapReader.cc:9
bool isMatched(TrackingRecHit const &hit)
void triggerBinLabels(std::string channel, const std::vector< std::string > &labels)
set configurable labels for trigger monitoring histograms
const int mu
Definition: Constants.h:22
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger but the state exists so we define the behavior If all triggers are the negative crieriion will lead to accepting the event(this again matches the behavior of"!*"before the partial wildcard feature was incorporated).The per-event"cost"of each negative criterion with multiple relevant triggers is about the same as!*was in the past
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
edm::EDGetTokenT< edm::View< reco::Vertex > > pvs_
double tmassWBoson(reco::RecoCandidate *mu, const reco::MET &met, const reco::Jet &b)
calculate W boson transverse mass estimate
const std::string & processName() const
process name
std::vector< std::string > triggerPaths_
trigger paths
virtual void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c)
do this during the event loop
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
double deltaR(double eta1, double eta2, double phi1, double phi2)
Definition: TreeUtility.cc:17
StringCutObjectSelector< reco::Muon > * muonIso_
extra isolation criterion on muon
StringCutObjectSelector< reco::Vertex > * vertexSelect_
string cut selector
StringCutObjectSelector< reco::GsfElectron > * elecIso_
extra isolation criterion on electron
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:273
edm::EDGetTokenT< reco::BeamSpot > beamspot_
beamspot
bool acceptHLT(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:133
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
static const JetCorrector * getJetCorrector(const std::string &fName, const edm::EventSetup &fSetup)
retrieve corrector from the event setup. troughs exception if something is missing ...
Definition: JetCorrector.cc:50
edm::EDGetTokenT< edm::View< reco::Jet > > jets_
std::string objectType(const std::string &label)
TopSingleLeptonHLTOfflineDQM(const edm::ParameterSet &cfg)
default constructor
tuple muons
Definition: patZpeak.py:38
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
bool isUninitialized() const
Definition: EDGetToken.h:73
edm::EDGetTokenT< reco::JetTagCollection > btagVtx_
edm::EDGetTokenT< edm::ValueMap< float > > electronId_
electronId label
volatile std::atomic< bool > shutdown_flag false
StringCutObjectSelector< reco::Muon > * muonSelect_
extra selection on muons
tuple process
Definition: LaserDQM_cfg.py:3
static std::string const triggerPaths
Definition: EdmProvDump.cc:42
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
Definition: Run.h:43