test
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 
425  // for the btagVtx collection
426  double btagVtxDisc = (*btagVtx)[jetRef];
427  fill("jetBDiscVtx_", btagVtxDisc);
428  if( (*btagVtx)[jetRef]>btagVtxWP_ ) {if(multBVtx == 0) bJetCand = *jet; ++multBVtx;}
429 
430  }
431  }
432 
433  fill("jetMult_" , mult );
434  fill("jetMultBEff_", multBEff);
435 // fill("jetMultBPur_", multBPur);
436  fill("jetMultBVtx_", multBVtx);
437 
438  /*
439  ------------------------------------------------------------
440 
441  MET Monitoring
442 
443  ------------------------------------------------------------
444  */
445 
446  // fill monitoring histograms for met
447  reco::MET mET;
448  for(std::vector< edm::EDGetTokenT< edm::View<reco::MET> > >::const_iterator met_=mets_.begin(); met_!=mets_.end(); ++met_){
450  if( !event.getByToken(*met_, met) ) continue;
451  if(met->begin()!=met->end()){
452  mET = *(met->begin());
453  }
454  }
455 
456  /*
457  ------------------------------------------------------------
458 
459  Event Monitoring
460 
461  ------------------------------------------------------------
462  */
463 
464  // fill W boson and top mass estimates
465  CalculateHLT eventKinematics(MAXJETS, WMASS);
466  double wMass = eventKinematics.massWBoson (correctedJets);
467  double topMass = eventKinematics.massTopQuark(correctedJets);
468  if(wMass>=0 && topMass>=0) {fill("massW_" , wMass ); fill("massTop_" , topMass);}
469  // fill plots for trigger monitoring
470  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<wMass && wMass<upperEdge_) ){
471  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "trigger", triggerPaths_);
472  if(logged_<=hists_.find("eventLogger_")->second->getNbinsY()){
473  // log runnumber, lumi block, event number & some
474  // more pysics infomation for interesting events
475  // We're doing a static_cast here to denote the explicity of the cast
476  double runID = static_cast<double>(event.eventAuxiliary().run());
477  double luminosityBlockID = static_cast<double>(event.eventAuxiliary().luminosityBlock());
478  double eventID = static_cast<double>(event.eventAuxiliary().event());
479  fill("eventLogger_", 0.5, logged_+0.5, runID);
480  fill("eventLogger_", 1.5, logged_+0.5, luminosityBlockID);
481  fill("eventLogger_", 2.5, logged_+0.5, eventID);
482  ++logged_;
483  }
484  }
485  if(multBVtx != 0 && mMultIso == 1 ){
486  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW) fill("MTWm_",mtW);
487  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mMub_", Mlb);
488  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("mMTT_", MTT);
489  }
490 
491  if(multBVtx != 0 && eMultIso == 1 ){
492  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW)fill("MTWe_",mtW);
493  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mEb_", Mlb);
494  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("eMTT_", MTT);
495  }
496 
497 
498  /*
499  ------------------------------------------------------------
500 
501  HLT Objects Monitoring
502 
503  ------------------------------------------------------------
504  */
505 
506 // edm::Handle<trigger::TriggerEventWithRefs> triggerEventWithRefsHandle;
507 // if(event.getByToken(triggerEventWithRefsTag_,triggerEventWithRefsHandle)) {
508 
510  event.getByToken(triggerSummaryTokenRAW,rawTriggerEvent);
511 
513  event.getByToken(triggerSummaryTokenAOD,aodTriggerEvent);
514 
516  if(!rawTriggerEvent.isValid()){
517  hasRawTriggerSummary=false;
518 // edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
519 // << "No RAW trigger summary found! Returning... \n";
520  }
521 
522  if(!hasRawTriggerSummary && !aodTriggerEvent.isValid()){
523 // edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
524 // << "No AOD trigger summary found! Returning... \n";
525  return;
526  }
527 
528  const edm::TriggerNames& triggerNames = event.triggerNames(*triggerTable);
529  // loop over trigger paths
530  for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
531  // consider only path from triggerPaths
532  string name = triggerNames.triggerNames()[i];
533  bool isInteresting = false;
534  for (unsigned int j=0; j<triggerPaths.size(); j++) {
535  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase)) isInteresting = true;
536  }
537  if (!isInteresting) continue;
538  // dump infos on the considered trigger path
539  const unsigned int triggerIndex = triggerNames.triggerIndex(name);
540  // get modules for the considered trigger path
541  const vector<string>& moduleLabels(hltConfig.moduleLabels(triggerIndex));
542  const unsigned int moduleIndex(triggerTable->index(triggerIndex));
543  // Results from TriggerEventWithRefs product
544  electronIds_.clear(); electronRefs_.clear();
545  muonIds_.clear(); muonRefs_.clear();
546  pfjetIds_.clear(); pfjetRefs_.clear();
547  // look only for modules actually run in this path
548  unsigned int kElec=0;
549  unsigned int kMuon=0;
550  unsigned int kJet=0;
551  for (unsigned int k=0; k<=moduleIndex; ++k) {
552  const string& moduleLabel(moduleLabels[k]);
553  const string moduleType(hltConfig.moduleType(moduleLabel));
554  // check whether the module is packed up in TriggerEventWithRef product
555 // const unsigned int filterIndex(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
557  const unsigned int filterIndex(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
558  if (filterIndex<rawTriggerEvent->size()) {
559  rawTriggerEvent->getObjects(filterIndex,electronIds_,electronRefs_);
560  const unsigned int nElectrons(electronIds_.size());
561  if (nElectrons>0) kElec = k;
562 
563  rawTriggerEvent->getObjects(filterIndex,muonIds_,muonRefs_);
564  const unsigned int nMuons(muonIds_.size());
565  if (nMuons>0) kMuon = k;
566 
567  rawTriggerEvent->getObjects(filterIndex,pfjetIds_,pfjetRefs_);
568  const unsigned int nPFJets(pfjetIds_.size());
569  if (nPFJets>0) kJet = k;
570  }
571  }
572 
573  else{
574  const unsigned int filterIndex(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
575  if (filterIndex<aodTriggerEvent->size()) {
576  aodTriggerEvent->getObjects(filterIndex,electronIds_,electronRefs_);
577  const unsigned int nElectrons(electronIds_.size());
578  if (nElectrons>0) kElec = k;
579 
580  aodTriggerEvent->getObjects(filterIndex,muonIds_,muonRefs_);
581  const unsigned int nMuons(muonIds_.size());
582  if (nMuons>0) kMuon = k;
583 
584  aodTriggerEvent->getObjects(filterIndex,pfjetIds_,pfjetRefs_);
585  const unsigned int nPFJets(pfjetIds_.size());
586  if (nPFJets>0) kJet = k;
587  }
588  }
589 
590  }
591  bool isMatched = true;
592  bool lMatched = false;
593  bool j1Matched = false;
594  bool j2Matched = false;
595  bool j3Matched = false;
596 
597 // access to hlt elecs
598  double eDeltaRMin = 500.;
599  unsigned int eIndMatched = 500;
600  electronIds_.clear(); electronRefs_.clear();
601  if (kElec > 0) {
602  const string& moduleLabelElec(moduleLabels[kElec]);
603  const string moduleTypeElec(hltConfig.moduleType(moduleLabelElec));
604 // const unsigned int filterIndexElec(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
605 // triggerEventWithRefsHandle->getObjects(filterIndexElec,electronIds_,electronRefs_);
606 
608  const unsigned int filterIndexElec(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
609  rawTriggerEvent->getObjects(filterIndexElec,electronIds_,electronRefs_);
610  }
611  else{
612  const unsigned int filterIndexElec(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
613  aodTriggerEvent->getObjects(filterIndexElec,electronIds_,electronRefs_);
614  }
615 
616  for (unsigned int inde = 0; inde < isoElecs.size(); inde++) {
617  double deltar = deltaR(*electronRefs_[0],*isoElecs[inde]);
618  if (deltar < eDeltaRMin) {
619  eDeltaRMin = deltar;
620  eIndMatched = inde;
621  }
622  }
623  if (eDeltaRMin < DRMIN) lMatched = true;
624  }
625 
626 // access to hlt muons
627  muonIds_.clear(); muonRefs_.clear();
628  double mDeltaRMin = 500.;
629  unsigned int mIndMatched = 500;
630  if (kMuon > 0) {
631  const string& moduleLabelMuon(moduleLabels[kMuon]);
632  const string moduleTypeMuon(hltConfig.moduleType(moduleLabelMuon));
633 // const unsigned int filterIndexMuon(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
634 // triggerEventWithRefsHandle->getObjects(filterIndexMuon,muonIds_,muonRefs_);
635 
637  const unsigned int filterIndexMuon(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
638  rawTriggerEvent->getObjects(filterIndexMuon,muonIds_,muonRefs_);
639  }
640  else{
641  const unsigned int filterIndexMuon(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
642  aodTriggerEvent->getObjects(filterIndexMuon,muonIds_,muonRefs_);
643  }
644 
645  for (unsigned int indm = 0; indm < isoMuons.size(); indm++) {
646  double deltar = deltaR(*muonRefs_[0],*isoMuons[indm]);
647  if (deltar < mDeltaRMin) {
648  mDeltaRMin = deltar;
649  mIndMatched = indm;
650  }
651  }
652  if (mDeltaRMin < DRMIN) lMatched = true;
653  }
654 
655 // access to hlt pf jets
656  const unsigned int nPFJets(pfjetIds_.size());
657  pfjetIds_.clear(); pfjetRefs_.clear();
658  double j1DeltaRMin = 500.;
659  double j2DeltaRMin = 500.;
660  double j3DeltaRMin = 500.;
661  unsigned int j1IndMatched = 500;
662  unsigned int j2IndMatched = 500;
663  unsigned int j3IndMatched = 500;
664  if (kJet > 0) {
665  const string& moduleLabelJet(moduleLabels[kJet]);
666  const string moduleTypeJet(hltConfig.moduleType(moduleLabelJet));
667 // const unsigned int filterIndexJet(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
668 // triggerEventWithRefsHandle->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
669 
671  const unsigned int filterIndexJet(rawTriggerEvent->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
672  rawTriggerEvent->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
673  }
674  else{
675  const unsigned int filterIndexJet(aodTriggerEvent->filterIndex(edm::InputTag(moduleLabelJet,"",processName_)));
676  aodTriggerEvent->getObjects(filterIndexJet,pfjetIds_,pfjetRefs_);
677  }
678 
679  for (unsigned int indj = 0; indj < correctedJets.size(); indj++) {
680  double deltar1 = deltaR(*pfjetRefs_[0],correctedJets[indj]);
681  if (deltar1 < j1DeltaRMin) {j1DeltaRMin = deltar1; j1IndMatched = indj;}
682  if (nPFJets > 1) {
683  double deltar2 = deltaR(*pfjetRefs_[1],correctedJets[indj]);
684  if (deltar2 < j2DeltaRMin) {j2DeltaRMin = deltar2; j2IndMatched = indj;}
685  if (nPFJets > 2) {
686  double deltar3 = deltaR(*pfjetRefs_[2],correctedJets[indj]);
687  if (deltar3 < j3DeltaRMin) {j3DeltaRMin = deltar3; j3IndMatched = indj;}
688  }
689  }
690  }
691  if (nPFJets > 0 && j1DeltaRMin < DRMIN) j1Matched = true;
692  if (nPFJets > 1 && j2DeltaRMin < DRMIN) j2Matched = true;
693  if (nPFJets > 2 && j3DeltaRMin < DRMIN) j3Matched = true;
694  }
695 
696  if (eIndMatched < 500) {
697  fill("leptDeltaREta_", isoElecs[eIndMatched]->eta(), eDeltaRMin);
698  if (lMatched) fill("leptResolution_", fabs(isoElecs[eIndMatched]->pt()-electronRefs_[0]->pt())/isoElecs[eIndMatched]->pt() );
699  }
700 
701  if (mIndMatched < 500) {
702  fill("leptDeltaREta_", isoMuons[mIndMatched]->eta(), mDeltaRMin);
703  if (lMatched) fill("leptResolution_", fabs(isoMuons[mIndMatched]->pt()-muonRefs_[0]->pt())/isoMuons[mIndMatched]->pt() );
704  }
705 
706  if (lMatched) fill("matchingMon_", 0.5 );
707  else isMatched = false;
708 
709  if (j1IndMatched < 500) {
710  fill("jetDeltaREta_", correctedJets[j1IndMatched].eta(), j1DeltaRMin);
711  if (j1Matched) {
712  fill("jetResolution_", fabs(correctedJets[j1IndMatched].pt()-pfjetRefs_[0]->pt())/correctedJets[j1IndMatched].pt() );
713  fill("matchingMon_", 1.5 );
714  }
715  else isMatched = false;
716  if (j2IndMatched < 500) {
717  fill("jetDeltaREta_", correctedJets[j2IndMatched].eta(), j2DeltaRMin);
718  if (j2Matched) {
719  fill("jetResolution_", fabs(correctedJets[j2IndMatched].pt()-pfjetRefs_[1]->pt())/correctedJets[j2IndMatched].pt() );
720  fill("matchingMon_", 2.5 );
721  }
722  else isMatched = false;
723  if (j3IndMatched < 500) {
724  fill("jetDeltaREta_", correctedJets[j3IndMatched].eta(), j3DeltaRMin);
725  if (j3Matched) {
726  fill("jetResolution_", fabs(correctedJets[j3IndMatched].pt()-pfjetRefs_[2]->pt())/correctedJets[j3IndMatched].pt() );
727  fill("matchingMon_", 3.5 );
728  }
729  else isMatched = false;
730  }
731  }
732  }
733  if (isMatched) fill("matchingMon_", 4.5 );
734 
735  }
736 
737 // }
738  }
739 
740 }
741 
743 
745 {
746  // configure preselection
747  edm::ParameterSet presel=cfg.getParameter<edm::ParameterSet>("preselection");
748  if( presel.existsAs<edm::ParameterSet>("trigger") ){
749  edm::ParameterSet trigger=presel.getParameter<edm::ParameterSet>("trigger");
750  triggerTable_= consumes< edm::TriggerResults >(trigger.getParameter<edm::InputTag>("src"));
751  triggerPaths_=trigger.getParameter<std::vector<std::string> >("select");
752  }
753  if( presel.existsAs<edm::ParameterSet>("vertex" ) ){
754  edm::ParameterSet vertex=presel.getParameter<edm::ParameterSet>("vertex");
755  vertex_= consumes< std::vector<reco::Vertex> >(vertex.getParameter<edm::InputTag>("src"));
757  }
758  if( presel.existsAs<edm::ParameterSet>("beamspot" ) ){
760  beamspot_= consumes< reco::BeamSpot >(beamspot.getParameter<edm::InputTag>("src"));
762  }
763 
764  // configure the selection
765  std::vector<edm::ParameterSet> sel=cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
766  for(unsigned int i=0; i<sel.size(); ++i){
767  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
769  }
770 
771  for (const std::string& s: selectionOrder_) {
773 
774  if (selection_.find(key) == selection_.end())
775  continue;
776 
777  if (type == "muons"){
779  }
780  if (type == "elecs"){
782  }
783  if (type == "jets"){
785  }
786  if (type == "jets/pf"){
788  }
789  if (type == "jets/calo"){
791  }
792  if (type == "met"){
794  }
795  }
796 }
797 
798 void
800 {
801  using namespace std;
802  using namespace edm;
803 
804  bool changed(true);
805  if (!hltConfig_.init(iRun,iSetup,"*",changed)) {
806  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
807  << "Config extraction failure with process name "
809  << "\n";
810  return;
811  }
812 }
813 
814  void
816 {
819  if( !event.getByToken(triggerTable_, triggerTable) ) return;
820  if(!acceptHLT(event, *triggerTable, triggerPaths_)) return;
821  }
822  if(!vertex_.isUninitialized()){
824  if( !event.getByToken(vertex_, vertex) ) return;
825  if(vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
826  }
827  if(!beamspot_.isUninitialized()){
829  if( !event.getByToken(beamspot_, beamspot) ) return;
830  if(!(*beamspotSelect_)(*beamspot)) return;
831  }
832  // apply selection steps
833  for(std::vector<std::string>::const_iterator selIt=selectionOrder_.begin(); selIt!=selectionOrder_.end(); ++selIt){
834  std::string key = selectionStep(*selIt), type = objectType(*selIt);
835  if(selection_.find(key)!=selection_.end()){
836 
837  if(type=="empty"){
838  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
839  continue;
840  }
841  if(type=="Hlt" ){
842  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
843  continue;
844  }
845 
846  bool passSel = true;
847 
848  for(std::vector<std::string>::const_iterator selIt2=selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
849  std::string key2 = selectionStep(*selIt2), type2 = objectType(*selIt2);
850  if(selection_.find(key2)==selection_.end()) continue;
851 
852  if(type2=="Hlt" || type2=="empty" ) continue;
853  if (!selectmap_[type2]->select(event)) passSel=false;
854 
855  } // end 2nd loop
856 
857  // Apply cumulative event selection
858  if ( !passSel ) continue;
859 
860  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
861 
862  }
863  }
864 }
865 
866  void
868 {
869  for (auto& sel: selection_) {
870  sel.second.second->book(i);
871  }
872 }
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerSummaryTokenAOD
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< 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
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
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:276
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
tuple size
Write out results.
Definition: Run.h:43