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  triggerSummaryTokenRAW = iC.consumes <trigger::TriggerEventWithRefs>(edm::InputTag("hltTriggerSummaryRAW","",processName_));
158  triggerSummaryTokenAOD = iC.consumes <trigger::TriggerEventWithRefs>(edm::InputTag("hltTriggerSummaryAOD","",processName_));
159 
160  }
161 
162  void
164  {
165  //set up the current directory path
166  std::string current(folder_); current+=label_;
167  store_.setCurrentFolder(current);
168 
169  // determine number of bins for trigger monitoring
170  unsigned int nPaths=triggerPaths_.size();
171 
172  // number of selected primary vertices
173  hists_["pvMult_" ] = store_.book1D("PvMult" , "N_{pvs}" , 100, 0., 100.);
174  // multiplicity of jets with pt>20 (corrected to L2+L3)
175  hists_["jetMult_" ] = store_.book1D("JetMult" , "N_{20}(jet)" , 10, 0., 10.);
176  // // trigger efficiency estimates for single lepton triggers
177  // hists_["triggerEff_" ] = store_.book1D("TriggerEff" , "Eff(trigger)" , nPaths, 0., nPaths);
178  // monitored trigger occupancy for single lepton triggers
179  hists_["triggerMon_" ] = store_.book1D("TriggerMon" , "Mon(trigger)" , nPaths, 0., nPaths);
180  // W mass estimate
181  hists_["massW_" ] = store_.book1D("MassW" , "M(W)" , 60, 0., 300.);
182  // Top mass estimate
183  hists_["massTop_" ] = store_.book1D("MassTop" , "M(Top)" , 50, 0., 500.);
184  // Mlb mu
185  hists_["mMub_" ] = store_.book1D("mMub" , "m_{#mub}" , 50, 0., 500.);
186  // W mass transverse estimate mu
187  hists_["MTWm_" ] = store_.book1D("MTWm" , "M_{T}^{W}(#mu)" , 60, 0., 300.);
188  // Top mass transverse estimate mu
189  hists_["mMTT_" ] = store_.book1D("mMTT" , "M_{T}^{t}(#mu)" , 50, 0., 500.);
190  // Mlb e
191  hists_["mEb_" ] = store_.book1D("mEb" , "m_{eb}" , 50, 0., 500.);
192  // W mass transverse estimate e
193  hists_["MTWe_" ] = store_.book1D("MTWe" , "M_{T}^{W}(e)" , 60, 0., 300.);
194  // Top mass transverse estimate e
195  hists_["eMTT_" ] = store_.book1D("eMTT" , "M_{T}^{t}(e)" , 50, 0., 500.);
196  // set bin labels for trigger monitoring
198  // multiplicity of btagged jets (for track counting high efficiency) with pt(L2L3)>20
199  hists_["jetMultBEff_"] = store_.book1D("JetMultBProb", "N_{20}(b/prob)" , 10, 0., 10.);
200  // btag discriminator for track counting high efficiency for jets with pt(L2L3)>20
201  hists_["jetBDiscEff_"] = store_.book1D("JetBDiscProb", "Disc_{b/prob}(jet)", 25, 0., 2.5);
202  // multiplicity of btagged jets (for track counting high purity) with pt(L2L3)>20
203 // hists_["jetMultBPur_"] = store_.book1D("JetMultBPur", "N_{20}(b/pur)" , 10, 0., 10.);
204  // btag discriminator for track counting high purity
205 // hists_["jetBDiscPur_"] = store_.book1D("JetBDiscPur", "Disc_{b/pur}(Jet)", 100, 0., 10.);
206  // multiplicity of btagged jets (for simple secondary vertex) with pt(L2L3)>20
207  hists_["jetMultBVtx_"] = store_.book1D("JetMultBVtx", "N_{20}(b/vtx)" , 10, 0., 10.);
208  // btag discriminator for simple secondary vertex
209  hists_["jetBDiscVtx_"] = store_.book1D("JetBDiscVtx", "Disc_{b/vtx}(Jet)", 35, -1., 6.);
210  // selected events
211  hists_["eventLogger_"] = store_.book2D("EventLogger", "Logged Events" , 3, 0., 3., 4, 0., 4.);
212  // set axes titles for selected events
213  hists_["eventLogger_"]->getTH1()->SetOption("TEXT");
214  hists_["eventLogger_"]->setBinLabel( 1 , "Run" , 1);
215  hists_["eventLogger_"]->setBinLabel( 2 , "Block" , 1);
216  hists_["eventLogger_"]->setBinLabel( 3 , "Event" , 1);
217  hists_["eventLogger_"]->setAxisTitle("logged evts" , 2);
218 
219  // deltaR min between hlt iso lepton and reco iso lepton wrt eta
220  hists_["leptDeltaREta_"] = store_.book2D("DeltaRMinEtaLepton", "#Delta R_{min}(leptons) wrt #eta", 30, -3, 3, 10, 0., 0.1);
221  // deltaR min between hlt jets and reco jets wrt eta
222  hists_["jetDeltaREta_"] = store_.book2D("DeltaRMinEtaJet", "#Delta R_{min}(jets) wrt #eta", 30, -3, 3, 10, 0., 0.1);
223  // resolution in pT for matched isolated leptons
224  hists_["leptResolution_"] = store_.book1D("ResIsoLeptons", "#Delta p_{T}/p_{T}(matched leptons)", 20, 0., 0.1);
225  // resolution in pT for matched jets
226  hists_["jetResolution_"] = store_.book1D("ResIsoJets", "#Delta p_{T}/p_{T}(matched jets)", 20, 0., 0.1);
227  // matching monitoring
228  hists_["matchingMon_"] = store_.book1D("MatchingMon", "Mon(matching)", 5, 0., 5.);
229  // set axes titles for matching monitoring
230  hists_["matchingMon_"]->setBinLabel( 1 , "iso lepton" );
231  hists_["matchingMon_"]->setBinLabel( 2 , "1st jet" );
232  hists_["matchingMon_"]->setBinLabel( 3 , "2nd jet" );
233  hists_["matchingMon_"]->setBinLabel( 4 , "3rd jet" );
234  hists_["matchingMon_"]->setBinLabel( 5 , "all " );
235 
236  return;
237  }
238 
239  void
241  {
242  // fetch trigger event if configured such
245  if( !event.getByToken(triggerTable_, triggerTable) ) return;
246  }
247 
248  /*
249  ------------------------------------------------------------
250 
251  Primary Vertex Monitoring
252 
253  ------------------------------------------------------------
254  */
255  // fill monitoring plots for primary verices
257  if( !event.getByToken(pvs_, pvs) ) {
258  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
259  << "Vertex collection not found \n";
260  return;
261  }
262  unsigned int pvMult = 0;
263  for(edm::View<reco::Vertex>::const_iterator pv=pvs->begin(); pv!=pvs->end(); ++pv){
264  if(!pvSelect_ || (*pvSelect_)(*pv))
265  pvMult++;
266  }
267  fill("pvMult_", pvMult );
268 
269  /*
270  ------------------------------------------------------------
271 
272  Electron Monitoring
273 
274  ------------------------------------------------------------
275  */
276 
277  // fill monitoring plots for electrons
278 
280  if( !event.getByToken(elecs_, elecs) ) {
281  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
282  << "Electron collection not found \n";
283  return;
284  }
285 
286 
287  // check availability of electron id
288  edm::Handle<edm::ValueMap<float> > electronId;
290  if( !event.getByToken(electronId_, electronId) ) return;
291  }
292 
293  // loop electron collection
294  unsigned int eMultIso=0;
295  std::vector<const reco::GsfElectron*> isoElecs;
297  for(edm::View<reco::GsfElectron>::const_iterator elec=elecs->begin(); elec!=elecs->end(); ++elec){
298  unsigned int idx = elec-elecs->begin();
299  // restrict to electrons with good electronId
300  if( electronId_.isUninitialized() ? true : ((int)(*electronId)[elecs->refAt(idx)] & eidPattern_) ){
301  if(!elecSelect_ || (*elecSelect_)(*elec)){
302  if(!elecIso_ || (*elecIso_)(*elec)){ if(eMultIso == 0) e = *elec; isoElecs.push_back(&(*elec)); ++eMultIso;}
303  }
304  }
305  }
306 
307  /*
308  ------------------------------------------------------------
309 
310  Muon Monitoring
311 
312  ------------------------------------------------------------
313  */
314 
315  // fill monitoring plots for muons
316  unsigned int mMultIso=0;
318  std::vector<const reco::Muon*> isoMuons;
319  if( !event.getByToken(muons_, muons) ) {
320  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
321  << "Muon collection not found \n";
322  return;
323  }
324  reco::Muon mu;
325  for(edm::View<reco::Muon>::const_iterator muon=muons->begin(); muon!=muons->end(); ++muon){
326  // restrict to globalMuons
327  if( muon->isGlobalMuon() ){
328  // apply preselection
329  if(!muonSelect_ || (*muonSelect_)(*muon)){
330  if(!muonIso_ || (*muonIso_)(*muon)) {if(mMultIso == 0) mu = *muon; isoMuons.push_back(&(*muon)); ++mMultIso;}
331  }
332  }
333  }
334 
335  /*
336  ------------------------------------------------------------
337 
338  Jet Monitoring
339 
340  ------------------------------------------------------------
341  */
342 
343  // check availability of the btaggers
344  edm::Handle<reco::JetTagCollection> btagEff, btagPur, btagVtx;
345  if( includeBTag_ ){
346  if( !event.getByToken(btagEff_, btagEff) ) return;
347 // if( !event.getByToken(btagPur_, btagPur) ) return;
348  if( !event.getByToken(btagVtx_, btagVtx) ) return;
349  }
350  // load jet corrector if configured such
351  const JetCorrector* corrector=0;
352  if(!jetCorrector_.empty()){
353  // check whether a jet corrector is in the event setup or not
354  if(setup.find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
355  corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
356  }
357  else{
358  edm::LogVerbatim( "TopSingleLeptonHLTOfflineDQM" )
359  << "\n"
360  << "------------------------------------------------------------------------------------- \n"
361  << " No JetCorrectionsRecord available from EventSetup: \n"
362  << " - Jets will not be corrected. \n"
363  << " - If you want to change this add the following lines to your cfg file: \n"
364  << " \n"
365  << " ## load jet corrections \n"
366  << " process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
367  << " process.prefer(\"ak5CaloL2L3\") \n"
368  << " \n"
369  << "------------------------------------------------------------------------------------- \n";
370  }
371  }
372 
373  // loop jet collection
374  std::vector<reco::Jet> correctedJets;
375  unsigned int mult=0, multBEff=0, multBVtx=0; //multBPur=0;
376 
378  if( !event.getByToken(jets_, jets) ) {
379  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
380  << "Jet collection not found \n";
381  return;
382  }
383 
385  if(jetIDSelect_){
386  if( !event.getByToken(jetIDLabel_, jetID) ) return;
387  }
388  reco::Jet bJetCand;
389  for(edm::View<reco::Jet>::const_iterator jet=jets->begin(); jet!=jets->end(); ++jet){
390  // check jetID for calo jets
391  unsigned int idx = jet-jets->begin();
392  if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())){
393  if(!(*jetIDSelect_)((*jetID)[jets->refAt(idx)])) continue;
394  }
395  // chekc additional jet selection for calo, pf and bare reco jets
396  if(dynamic_cast<const reco::CaloJet*>(&*jet)){
397  reco::CaloJet sel = dynamic_cast<const reco::CaloJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
398  StringCutObjectSelector<reco::CaloJet> jetSelect(jetSelect_); if(!jetSelect(sel)){ continue;}
399  }
400  else if(dynamic_cast<const reco::PFJet*>(&*jet)){
401  reco::PFJet sel= dynamic_cast<const reco::PFJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
402  StringCutObjectSelector<reco::PFJet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
403  }
404  else{
405  reco::Jet sel = *jet; sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
406  StringCutObjectSelector<reco::Jet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
407  }
408 
409  // prepare jet to fill monitor histograms
410  reco::Jet monitorJet = *jet; monitorJet.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
411  correctedJets.push_back(monitorJet);
412  ++mult; // determine jet multiplicity
413  if( includeBTag_ ){
414  // fill b-discriminators
415  edm::RefToBase<reco::Jet> jetRef = jets->refAt(idx);
416  // for the btagEff collection
417  double btagEffDisc = (*btagEff)[jetRef];
418  fill("jetBDiscEff_", btagEffDisc);
419  if( (*btagEff)[jetRef]>btagEffWP_ ) ++multBEff;
420  // for the btagPur collection
421 // double btagPurDisc = (*btagPur)[jetRef];
422 // fill("jetBDiscPur_", btagPurDisc);
423 // if( (*btagPur)[jetRef]>btagPurWP_ ) {if(multBPur == 0) bJetCand = *jet; ++multBPur;}
424  // for the btagVtx collection
425  double btagVtxDisc = (*btagVtx)[jetRef];
426  fill("jetBDiscVtx_", btagVtxDisc);
427  if( (*btagVtx)[jetRef]>btagVtxWP_ ) { if(multBVtx == 0) bJetCand= *jet; ++multBVtx;}
428  }
429  }
430 
431  fill("jetMult_" , mult );
432  fill("jetMultBEff_", multBEff);
433 // fill("jetMultBPur_", multBPur);
434  fill("jetMultBVtx_", multBVtx);
435 
436  /*
437  ------------------------------------------------------------
438 
439  MET Monitoring
440 
441  ------------------------------------------------------------
442  */
443 
444  // fill monitoring histograms for met
445  reco::MET mET;
446  for(std::vector< edm::EDGetTokenT< edm::View<reco::MET> > >::const_iterator met_=mets_.begin(); met_!=mets_.end(); ++met_){
448  if( !event.getByToken(*met_, met) ) continue;
449  if(met->begin()!=met->end()){
450  mET = *(met->begin());
451  }
452  }
453 
454  /*
455  ------------------------------------------------------------
456 
457  Event Monitoring
458 
459  ------------------------------------------------------------
460  */
461 
462  // fill W boson and top mass estimates
463  CalculateHLT eventKinematics(MAXJETS, WMASS);
464  double wMass = eventKinematics.massWBoson (correctedJets);
465  double topMass = eventKinematics.massTopQuark(correctedJets);
466  if(wMass>=0 && topMass>=0) {fill("massW_" , wMass ); fill("massTop_" , topMass);}
467  // fill plots for trigger monitoring
468  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<wMass && wMass<upperEdge_) ){
469  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "trigger", triggerPaths_);
470  if(logged_<=hists_.find("eventLogger_")->second->getNbinsY()){
471  // log runnumber, lumi block, event number & some
472  // more pysics infomation for interesting events
473  // We're doing a static_cast here to denote the explicity of the cast
474  double runID = static_cast<double>(event.eventAuxiliary().run());
475  double luminosityBlockID = static_cast<double>(event.eventAuxiliary().luminosityBlock());
476  double eventID = static_cast<double>(event.eventAuxiliary().event());
477  fill("eventLogger_", 0.5, logged_+0.5, runID);
478  fill("eventLogger_", 1.5, logged_+0.5, luminosityBlockID);
479  fill("eventLogger_", 2.5, logged_+0.5, eventID);
480  ++logged_;
481  }
482  }
483  if(multBVtx != 0 && mMultIso == 1 ){
484  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW) fill("MTWm_",mtW);
485  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mMub_", Mlb);
486  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("mMTT_", MTT);
487  }
488 
489  if(multBVtx != 0 && eMultIso == 1 ){
490  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW)fill("MTWe_",mtW);
491  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mEb_", Mlb);
492  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("eMTT_", MTT);
493  }
494 
495 
496  /*
497  ------------------------------------------------------------
498 
499  HLT Objects Monitoring
500 
501  ------------------------------------------------------------
502  */
503 
504 // edm::Handle<trigger::TriggerEventWithRefs> triggerEventWithRefsHandle;
505 // if(event.getByToken(triggerEventWithRefsTag_,triggerEventWithRefsHandle)) {
506 
508  event.getByToken(triggerSummaryTokenRAW,rawTriggerEvent);
509 
511  event.getByToken(triggerSummaryTokenAOD,aodTriggerEvent);
512 
514  if(!rawTriggerEvent.isValid()){
515  hasRawTriggerSummary=false;
516 // edm::LogWarning( "TopDiLeptonHLTOfflineDQM" )
517 // << "No RAW trigger summary found! Returning... \n";
518 
519  if(!aodTriggerEvent.isValid()){
520 // edm::LogWarning( "TopDiLeptonHLTOfflineDQM" )
521 // << "No AOD trigger summary found! Returning... \n";
522  return;
523  }
524  }
525 
526  const edm::TriggerNames& triggerNames = event.triggerNames(*triggerTable);
527  // loop over trigger paths
528  for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
529  // consider only path from triggerPaths
530  string name = triggerNames.triggerNames()[i];
531  bool isInteresting = false;
532  for (unsigned int j=0; j<triggerPaths.size(); j++) {
533  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase)) isInteresting = true;
534  }
535  if (!isInteresting) continue;
536  // dump infos on the considered trigger path
537  const unsigned int triggerIndex = triggerNames.triggerIndex(name);
538  // get modules for the considered trigger path
539  const vector<string>& moduleLabels(hltConfig.moduleLabels(triggerIndex));
540  const unsigned int moduleIndex(triggerTable->index(triggerIndex));
541  // Results from TriggerEventWithRefs product
542  electronIds_.clear(); electronRefs_.clear();
543  muonIds_.clear(); muonRefs_.clear();
544  pfjetIds_.clear(); pfjetRefs_.clear();
545  // look only for modules actually run in this path
546  unsigned int kElec=0;
547  unsigned int kMuon=0;
548  unsigned int kJet=0;
549  for (unsigned int k=0; k<=moduleIndex; ++k) {
550  const string& moduleLabel(moduleLabels[k]);
551  const string moduleType(hltConfig.moduleType(moduleLabel));
552  // check whether the module is packed up in TriggerEventWithRef product
553 // const unsigned int filterIndex(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
555  const unsigned int filterIndex(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
556  if (filterIndex<rawTriggerEvent->size()) {
557  rawTriggerEvent->getObjects(filterIndex,electronIds_,electronRefs_);
558  const unsigned int nElectrons(electronIds_.size());
559  if (nElectrons>0) kElec = k;
560 
561  rawTriggerEvent->getObjects(filterIndex,muonIds_,muonRefs_);
562  const unsigned int nMuons(muonIds_.size());
563  if (nMuons>0) kMuon = k;
564 
565  rawTriggerEvent->getObjects(filterIndex,pfjetIds_,pfjetRefs_);
566  const unsigned int nPFJets(pfjetIds_.size());
567  if (nPFJets>0) kJet = k;
568  }
569  }
570 
571  else{
572  const unsigned int filterIndex(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
573  if (filterIndex<aodTriggerEvent->size()) {
574  aodTriggerEvent->getObjects(filterIndex,electronIds_,electronRefs_);
575  const unsigned int nElectrons(electronIds_.size());
576  if (nElectrons>0) kElec = k;
577 
578  aodTriggerEvent->getObjects(filterIndex,muonIds_,muonRefs_);
579  const unsigned int nMuons(muonIds_.size());
580  if (nMuons>0) kMuon = k;
581 
582  aodTriggerEvent->getObjects(filterIndex,pfjetIds_,pfjetRefs_);
583  const unsigned int nPFJets(pfjetIds_.size());
584  if (nPFJets>0) kJet = k;
585  }
586  }
587 
588  }
589  bool isMatched = true;
590  bool lMatched = false;
591  bool j1Matched = false;
592  bool j2Matched = false;
593  bool j3Matched = false;
594 
595 // access to hlt elecs
596  double eDeltaRMin = 500.;
597  unsigned int eIndMatched = 500;
598  electronIds_.clear(); electronRefs_.clear();
599  if (kElec > 0) {
600  const string& moduleLabelElec(moduleLabels[kElec]);
601  const string moduleTypeElec(hltConfig.moduleType(moduleLabelElec));
602 // const unsigned int filterIndexElec(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
603 // triggerEventWithRefsHandle->getObjects(filterIndexElec,electronIds_,electronRefs_);
604 
606  const unsigned int filterIndexElec(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
607  rawTriggerEvent->getObjects(filterIndexElec,electronIds_,electronRefs_);
608  }
609  else{
610  const unsigned int filterIndexElec(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
611  aodTriggerEvent->getObjects(filterIndexElec,electronIds_,electronRefs_);
612  }
613 
614  for (unsigned int inde = 0; inde < isoElecs.size(); inde++) {
615  double deltar = deltaR(*electronRefs_[0],*isoElecs[inde]);
616  if (deltar < eDeltaRMin) {
617  eDeltaRMin = deltar;
618  eIndMatched = inde;
619  }
620  }
621  if (eDeltaRMin < DRMIN) lMatched = true;
622  }
623 
624 // access to hlt muons
625  muonIds_.clear(); muonRefs_.clear();
626  double mDeltaRMin = 500.;
627  unsigned int mIndMatched = 500;
628  if (kMuon > 0) {
629  const string& moduleLabelMuon(moduleLabels[kMuon]);
630  const string moduleTypeMuon(hltConfig.moduleType(moduleLabelMuon));
631 // const unsigned int filterIndexMuon(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
632 // triggerEventWithRefsHandle->getObjects(filterIndexMuon,muonIds_,muonRefs_);
633 
635  const unsigned int filterIndexMuon(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
636  rawTriggerEvent->getObjects(filterIndexMuon,muonIds_,muonRefs_);
637  }
638  else{
639  const unsigned int filterIndexMuon(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
640  aodTriggerEvent->getObjects(filterIndexMuon,muonIds_,muonRefs_);
641  }
642 
643  for (unsigned int indm = 0; indm < isoMuons.size(); indm++) {
644  double deltar = deltaR(*muonRefs_[0],*isoMuons[indm]);
645  if (deltar < mDeltaRMin) {
646  mDeltaRMin = deltar;
647  mIndMatched = indm;
648  }
649  }
650  if (mDeltaRMin < DRMIN) lMatched = true;
651  }
652 
653 // access to hlt pf jets
654  const unsigned int nPFJets(pfjetIds_.size());
655  pfjetIds_.clear(); pfjetRefs_.clear();
656  double j1DeltaRMin = 500.;
657  double j2DeltaRMin = 500.;
658  double j3DeltaRMin = 500.;
659  unsigned int j1IndMatched = 500;
660  unsigned int j2IndMatched = 500;
661  unsigned int j3IndMatched = 500;
662  if (kJet > 0) {
663  const string& moduleLabelJet(moduleLabels[kJet]);
664  const string moduleTypeJet(hltConfig.moduleType(moduleLabelJet));
665 // const unsigned int filterIndexJet(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
666 // triggerEventWithRefsHandle->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
667 
669  const unsigned int filterIndexJet(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
670  rawTriggerEvent->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
671  }
672  else{
673  const unsigned int filterIndexJet(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
674  aodTriggerEvent->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
675  }
676 
677  for (unsigned int indj = 0; indj < correctedJets.size(); indj++) {
678  double deltar1 = deltaR(*pfjetRefs_[0],correctedJets[indj]);
679  if (deltar1 < j1DeltaRMin) {j1DeltaRMin = deltar1; j1IndMatched = indj;}
680  if (nPFJets > 1) {
681  double deltar2 = deltaR(*pfjetRefs_[1],correctedJets[indj]);
682  if (deltar2 < j2DeltaRMin) {j2DeltaRMin = deltar2; j2IndMatched = indj;}
683  if (nPFJets > 2) {
684  double deltar3 = deltaR(*pfjetRefs_[2],correctedJets[indj]);
685  if (deltar3 < j3DeltaRMin) {j3DeltaRMin = deltar3; j3IndMatched = indj;}
686  }
687  }
688  }
689  if (nPFJets > 0 && j1DeltaRMin < DRMIN) j1Matched = true;
690  if (nPFJets > 1 && j2DeltaRMin < DRMIN) j2Matched = true;
691  if (nPFJets > 2 && j3DeltaRMin < DRMIN) j3Matched = true;
692  }
693 
694  if (eIndMatched < 500) {
695  fill("leptDeltaREta_", isoElecs[eIndMatched]->eta(), eDeltaRMin);
696  if (lMatched) fill("leptResolution_", fabs(isoElecs[eIndMatched]->pt()-electronRefs_[0]->pt())/isoElecs[eIndMatched]->pt() );
697  }
698 
699  if (mIndMatched < 500) {
700  fill("leptDeltaREta_", isoMuons[mIndMatched]->eta(), mDeltaRMin);
701  if (lMatched) fill("leptResolution_", fabs(isoMuons[mIndMatched]->pt()-muonRefs_[0]->pt())/isoMuons[mIndMatched]->pt() );
702  }
703 
704  if (lMatched) fill("matchingMon_", 0.5 );
705  else isMatched = false;
706 
707  if (j1IndMatched < 500) {
708  fill("jetDeltaREta_", correctedJets[j1IndMatched].eta(), j1DeltaRMin);
709  if (j1Matched) {
710  fill("jetResolution_", fabs(correctedJets[j1IndMatched].pt()-pfjetRefs_[0]->pt())/correctedJets[j1IndMatched].pt() );
711  fill("matchingMon_", 1.5 );
712  }
713  else isMatched = false;
714  if (j2IndMatched < 500) {
715  fill("jetDeltaREta_", correctedJets[j2IndMatched].eta(), j2DeltaRMin);
716  if (j2Matched) {
717  fill("jetResolution_", fabs(correctedJets[j2IndMatched].pt()-pfjetRefs_[1]->pt())/correctedJets[j2IndMatched].pt() );
718  fill("matchingMon_", 2.5 );
719  }
720  else isMatched = false;
721  if (j3IndMatched < 500) {
722  fill("jetDeltaREta_", correctedJets[j3IndMatched].eta(), j3DeltaRMin);
723  if (j3Matched) {
724  fill("jetResolution_", fabs(correctedJets[j3IndMatched].pt()-pfjetRefs_[2]->pt())/correctedJets[j3IndMatched].pt() );
725  fill("matchingMon_", 3.5 );
726  }
727  else isMatched = false;
728  }
729  }
730  }
731  if (isMatched) fill("matchingMon_", 4.5 );
732 
733  }
734 
735 // }
736  }
737 
738 }
739 
741 
743 {
744  // configure preselection
745  edm::ParameterSet presel=cfg.getParameter<edm::ParameterSet>("preselection");
746  if( presel.existsAs<edm::ParameterSet>("trigger") ){
747  edm::ParameterSet trigger=presel.getParameter<edm::ParameterSet>("trigger");
748  triggerTable_= consumes< edm::TriggerResults >(trigger.getParameter<edm::InputTag>("src"));
749  triggerPaths_=trigger.getParameter<std::vector<std::string> >("select");
750  }
751  if( presel.existsAs<edm::ParameterSet>("vertex" ) ){
752  edm::ParameterSet vertex=presel.getParameter<edm::ParameterSet>("vertex");
753  vertex_= consumes< std::vector<reco::Vertex> >(vertex.getParameter<edm::InputTag>("src"));
755  }
756  if( presel.existsAs<edm::ParameterSet>("beamspot" ) ){
758  beamspot_= consumes< reco::BeamSpot >(beamspot.getParameter<edm::InputTag>("src"));
760  }
761 
762  // configure the selection
763  std::vector<edm::ParameterSet> sel=cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
764  for(unsigned int i=0; i<sel.size(); ++i){
765  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
767  }
768 
769  for (const std::string& s: selectionOrder_) {
771 
772  if (selection_.find(key) == selection_.end())
773  continue;
774 
775  if (type == "muons"){
777  }
778  if (type == "elecs"){
780  }
781  if (type == "jets"){
783  }
784  if (type == "jets/pf"){
786  }
787  if (type == "jets/calo"){
789  }
790  if (type == "met"){
792  }
793  }
794 }
795 
796 void
798 {
799  using namespace std;
800  using namespace edm;
801 
802  bool changed(true);
803  if (!hltConfig_.init(iRun,iSetup,"*",changed)) {
804  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
805  << "Config extraction failure with process name "
807  << "\n";
808  return;
809  }
810 }
811 
812  void
814 {
817  if( !event.getByToken(triggerTable_, triggerTable) ) return;
818  if(!acceptHLT(event, *triggerTable, triggerPaths_)) return;
819  }
820  if(!vertex_.isUninitialized()){
822  if( !event.getByToken(vertex_, vertex) ) return;
823  if(vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
824  }
825  if(!beamspot_.isUninitialized()){
827  if( !event.getByToken(beamspot_, beamspot) ) return;
828  if(!(*beamspotSelect_)(*beamspot)) return;
829  }
830  // apply selection steps
831  for(std::vector<std::string>::const_iterator selIt=selectionOrder_.begin(); selIt!=selectionOrder_.end(); ++selIt){
832  std::string key = selectionStep(*selIt), type = objectType(*selIt);
833  if(selection_.find(key)!=selection_.end()){
834 
835  if(type=="empty"){
836  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
837  continue;
838  }
839  if(type=="Hlt" ){
840  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
841  continue;
842  }
843 
844  bool passSel = true;
845 
846  for(std::vector<std::string>::const_iterator selIt2=selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
847  std::string key2 = selectionStep(*selIt2), type2 = objectType(*selIt2);
848  if(selection_.find(key2)==selection_.end()) continue;
849 
850  if(type2=="Hlt" || type2=="empty" ) continue;
851  if (!selectmap_[type2]->select(event)) passSel=false;
852 
853  } // end 2nd loop
854 
855  // Apply cumulative event selection
856  if ( !passSel ) continue;
857 
858  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
859 
860  }
861  }
862 }
863 
864  void
866 {
867  for (auto& sel: selection_) {
868  sel.second.second->book(i);
869  }
870 }
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerSummaryTokenAOD
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup) override
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:457
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< 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< 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
virtual void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) override
do this during the event loop
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
bool isValid() const
Definition: HandleBase.h:75
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerSummaryTokenRAW
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
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:277
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
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
tuple size
Write out results.
Definition: Run.h:42