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  edm::Handle<trigger::TriggerEventWithRefs> triggerEventWithRefsHandle;
247  if(!event.getByToken(triggerEventWithRefsTag_,triggerEventWithRefsHandle)) return;
248 
249  /*
250  ------------------------------------------------------------
251 
252  Primary Vertex Monitoring
253 
254  ------------------------------------------------------------
255  */
256  // fill monitoring plots for primary verices
258  if( !event.getByToken(pvs_, pvs) ) {
259  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
260  << "Vertex collection not found \n";
261  return;
262  }
263  unsigned int pvMult = 0;
264  for(edm::View<reco::Vertex>::const_iterator pv=pvs->begin(); pv!=pvs->end(); ++pv){
265  if(!pvSelect_ || (*pvSelect_)(*pv))
266  pvMult++;
267  }
268  fill("pvMult_", pvMult );
269 
270  /*
271  ------------------------------------------------------------
272 
273  Electron Monitoring
274 
275  ------------------------------------------------------------
276  */
277 
278  // fill monitoring plots for electrons
280  if( !event.getByToken(elecs_, elecs) ) {
281  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
282  << "Electron collection not found \n";
283  return;
284  }
285 
286  // check availability of electron id
287  edm::Handle<edm::ValueMap<float> > electronId;
289  if( !event.getByToken(electronId_, electronId) ) return;
290  }
291 
292  // loop electron collection
293  unsigned int eMultIso=0;
294  std::vector<const reco::GsfElectron*> isoElecs;
296  for(edm::View<reco::GsfElectron>::const_iterator elec=elecs->begin(); elec!=elecs->end(); ++elec){
297  unsigned int idx = elec-elecs->begin();
298  // restrict to electrons with good electronId
299  if( electronId_.isUninitialized() ? true : ((int)(*electronId)[elecs->refAt(idx)] & eidPattern_) ){
300  if(!elecSelect_ || (*elecSelect_)(*elec)){
301  if(!elecIso_ || (*elecIso_)(*elec)){ if(eMultIso == 0) e = *elec; isoElecs.push_back(&(*elec)); ++eMultIso;}
302  }
303  }
304  }
305 
306  /*
307  ------------------------------------------------------------
308 
309  Muon Monitoring
310 
311  ------------------------------------------------------------
312  */
313 
314  // fill monitoring plots for muons
315  unsigned int mMultIso=0;
317  std::vector<const reco::Muon*> isoMuons;
318  if( !event.getByToken(muons_, muons) ) {
319  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
320  << "Muon collection not found \n";
321  return;
322  }
323  reco::Muon mu;
324  for(edm::View<reco::Muon>::const_iterator muon=muons->begin(); muon!=muons->end(); ++muon){
325  // restrict to globalMuons
326  if( muon->isGlobalMuon() ){
327  // apply preselection
328  if(!muonSelect_ || (*muonSelect_)(*muon)){
329  if(!muonIso_ || (*muonIso_)(*muon)) {if(mMultIso == 0) mu = *muon; isoMuons.push_back(&(*muon)); ++mMultIso;}
330  }
331  }
332  }
333 
334  /*
335  ------------------------------------------------------------
336 
337  Jet Monitoring
338 
339  ------------------------------------------------------------
340  */
341 
342  // check availability of the btaggers
343  edm::Handle<reco::JetTagCollection> btagEff, btagPur, btagVtx;
344  if( includeBTag_ ){
345  if( !event.getByToken(btagEff_, btagEff) ) return;
346  if( !event.getByToken(btagPur_, btagPur) ) return;
347  if( !event.getByToken(btagVtx_, btagVtx) ) return;
348  }
349  // load jet corrector if configured such
350  const JetCorrector* corrector=0;
351  if(!jetCorrector_.empty()){
352  // check whether a jet corrector is in the event setup or not
353  if(setup.find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
354  corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
355  }
356  else{
357  edm::LogVerbatim( "TopSingleLeptonHLTOfflineDQM" )
358  << "\n"
359  << "------------------------------------------------------------------------------------- \n"
360  << " No JetCorrectionsRecord available from EventSetup: \n"
361  << " - Jets will not be corrected. \n"
362  << " - If you want to change this add the following lines to your cfg file: \n"
363  << " \n"
364  << " ## load jet corrections \n"
365  << " process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
366  << " process.prefer(\"ak5CaloL2L3\") \n"
367  << " \n"
368  << "------------------------------------------------------------------------------------- \n";
369  }
370  }
371 
372  // loop jet collection
373  std::vector<reco::Jet> correctedJets;
374  unsigned int mult=0, multBEff=0, multBPur=0, multBVtx=0;
375 
377  if( !event.getByToken(jets_, jets) ) {
378  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
379  << "Jet collection not found \n";
380  return;
381  }
382 
384  if(jetIDSelect_){
385  if( !event.getByToken(jetIDLabel_, jetID) ) return;
386  }
387  reco::Jet bJetCand;
388  for(edm::View<reco::Jet>::const_iterator jet=jets->begin(); jet!=jets->end(); ++jet){
389  // check jetID for calo jets
390  unsigned int idx = jet-jets->begin();
391  if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())){
392  if(!(*jetIDSelect_)((*jetID)[jets->refAt(idx)])) continue;
393  }
394  // chekc additional jet selection for calo, pf and bare reco jets
395  if(dynamic_cast<const reco::CaloJet*>(&*jet)){
396  reco::CaloJet sel = dynamic_cast<const reco::CaloJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
397  StringCutObjectSelector<reco::CaloJet> jetSelect(jetSelect_); if(!jetSelect(sel)){ continue;}
398  }
399  else if(dynamic_cast<const reco::PFJet*>(&*jet)){
400  reco::PFJet sel= dynamic_cast<const reco::PFJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
401  StringCutObjectSelector<reco::PFJet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
402  }
403  else{
404  reco::Jet sel = *jet; sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
405  StringCutObjectSelector<reco::Jet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
406  }
407 
408  // prepare jet to fill monitor histograms
409  reco::Jet monitorJet = *jet; monitorJet.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
410  correctedJets.push_back(monitorJet);
411  ++mult; // determine jet multiplicity
412  if( includeBTag_ ){
413  // fill b-discriminators
414  edm::RefToBase<reco::Jet> jetRef = jets->refAt(idx);
415  // for the btagEff collection
416  double btagEffDisc = (*btagEff)[jetRef];
417  fill("jetBDiscEff_", btagEffDisc);
418  if( (*btagEff)[jetRef]>btagEffWP_ ) ++multBEff;
419  // for the btagPur collection
420  double btagPurDisc = (*btagPur)[jetRef];
421  fill("jetBDiscPur_", btagPurDisc);
422  if( (*btagPur)[jetRef]>btagPurWP_ ) {if(multBPur == 0) bJetCand = *jet; ++multBPur;}
423  // for the btagVtx collection
424  double btagVtxDisc = (*btagVtx)[jetRef];
425  fill("jetBDiscVtx_", btagVtxDisc);
426  if( (*btagVtx)[jetRef]>btagVtxWP_ ) ++multBVtx;
427  }
428  }
429  fill("jetMult_" , mult );
430  fill("jetMultBEff_", multBEff);
431  fill("jetMultBPur_", multBPur);
432  fill("jetMultBVtx_", multBVtx);
433 
434  /*
435  ------------------------------------------------------------
436 
437  MET Monitoring
438 
439  ------------------------------------------------------------
440  */
441 
442  // fill monitoring histograms for met
443  reco::MET mET;
444  for(std::vector< edm::EDGetTokenT< edm::View<reco::MET> > >::const_iterator met_=mets_.begin(); met_!=mets_.end(); ++met_){
446  if( !event.getByToken(*met_, met) ) continue;
447  if(met->begin()!=met->end()){
448  mET = *(met->begin());
449  }
450  }
451 
452  /*
453  ------------------------------------------------------------
454 
455  Event Monitoring
456 
457  ------------------------------------------------------------
458  */
459 
460  // fill W boson and top mass estimates
461  CalculateHLT eventKinematics(MAXJETS, WMASS);
462  double wMass = eventKinematics.massWBoson (correctedJets);
463  double topMass = eventKinematics.massTopQuark(correctedJets);
464  if(wMass>=0 && topMass>=0) {fill("massW_" , wMass ); fill("massTop_" , topMass);}
465  // fill plots for trigger monitoring
466  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<wMass && wMass<upperEdge_) ){
467  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "trigger", triggerPaths_);
468  if(logged_<=hists_.find("eventLogger_")->second->getNbinsY()){
469  // log runnumber, lumi block, event number & some
470  // more pysics infomation for interesting events
471  // We're doing a static_cast here to denote the explicity of the cast
472  double runID = static_cast<double>(event.eventAuxiliary().run());
473  double luminosityBlockID = static_cast<double>(event.eventAuxiliary().luminosityBlock());
474  double eventID = static_cast<double>(event.eventAuxiliary().event());
475  fill("eventLogger_", 0.5, logged_+0.5, runID);
476  fill("eventLogger_", 1.5, logged_+0.5, luminosityBlockID);
477  fill("eventLogger_", 2.5, logged_+0.5, eventID);
478  ++logged_;
479  }
480  }
481  if(multBPur != 0 && mMultIso == 1 ){
482  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW) fill("MTWm_",mtW);
483  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mMub_", Mlb);
484  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("mMTT_", MTT);
485  }
486 
487  if(multBPur != 0 && eMultIso == 1 ){
488  double mtW = eventKinematics.tmassWBoson(&mu,mET,bJetCand); if (mtW == mtW)fill("MTWe_",mtW);
489  double Mlb = eventKinematics.masslb(&mu,mET,bJetCand); if (Mlb == Mlb) fill("mEb_", Mlb);
490  double MTT = eventKinematics.tmassTopQuark(&mu,mET,bJetCand); if (MTT == MTT) fill("eMTT_", MTT);
491  }
492 
493 
494  /*
495  ------------------------------------------------------------
496 
497  HLT Objects Monitoring
498 
499  ------------------------------------------------------------
500  */
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 
658 
660 {
661  // configure preselection
662  edm::ParameterSet presel=cfg.getParameter<edm::ParameterSet>("preselection");
663  if( presel.existsAs<edm::ParameterSet>("trigger") ){
664  edm::ParameterSet trigger=presel.getParameter<edm::ParameterSet>("trigger");
665  triggerTable_= consumes< edm::TriggerResults >(trigger.getParameter<edm::InputTag>("src"));
666  triggerPaths_=trigger.getParameter<std::vector<std::string> >("select");
667  }
668  if( presel.existsAs<edm::ParameterSet>("vertex" ) ){
669  edm::ParameterSet vertex=presel.getParameter<edm::ParameterSet>("vertex");
670  vertex_= consumes< std::vector<reco::Vertex> >(vertex.getParameter<edm::InputTag>("src"));
672  }
673  if( presel.existsAs<edm::ParameterSet>("beamspot" ) ){
675  beamspot_= consumes< reco::BeamSpot >(beamspot.getParameter<edm::InputTag>("src"));
677  }
678 
679  // configure the selection
680  std::vector<edm::ParameterSet> sel=cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
681  for(unsigned int i=0; i<sel.size(); ++i){
682  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
684  }
685 
686  for (const std::string& s: selectionOrder_) {
688 
689  if (selection_.find(key) == selection_.end())
690  continue;
691 
692  if (type == "muons"){
694  }
695  if (type == "elecs"){
697  }
698  if (type == "jets"){
700  }
701  if (type == "jets/pf"){
703  }
704  if (type == "jets/calo"){
706  }
707  if (type == "met"){
709  }
710  }
711 }
712 
713  void
715 {
716  using namespace std;
717  using namespace edm;
718 
719  bool changed(true);
720  if (!hltConfig_.init(iRun,iSetup,"*",changed)) {
721  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
722  << "Config extraction failure with process name "
724  << "\n";
725  return;
726  }
727 }
728 
729  void
731 {
734  if( !event.getByToken(triggerTable_, triggerTable) ) return;
735  if(!acceptHLT(event, *triggerTable, triggerPaths_)) return;
736  }
737  if(!vertex_.isUninitialized()){
739  if( !event.getByToken(vertex_, vertex) ) return;
740  if(vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
741  }
742  if(!beamspot_.isUninitialized()){
744  if( !event.getByToken(beamspot_, beamspot) ) return;
745  if(!(*beamspotSelect_)(*beamspot)) return;
746  }
747  // apply selection steps
748  for(std::vector<std::string>::const_iterator selIt=selectionOrder_.begin(); selIt!=selectionOrder_.end(); ++selIt){
749  std::string key = selectionStep(*selIt), type = objectType(*selIt);
750  if(selection_.find(key)!=selection_.end()){
751 
752  if(type=="empty"){
753  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
754  continue;
755  }
756  if(type=="Hlt" ){
757  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
758  continue;
759  }
760 
761  bool passSel = true;
762 
763  for(std::vector<std::string>::const_iterator selIt2=selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
764  std::string key2 = selectionStep(*selIt2), type2 = objectType(*selIt2);
765  if(selection_.find(key2)==selection_.end()) continue;
766 
767  if(type2=="Hlt" || type2=="empty" ) continue;
768  if (!selectmap_[type2]->select(event)) passSel=false;
769 
770  } // end 2nd loop
771 
772  // Apply cumulative event selection
773  if ( !passSel ) continue;
774 
775  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
776 
777  }
778  }
779 }
780 
781 void
783 {
784  for (auto& sel: selection_) {
785  sel.second.second->book(i);
786  }
787 }
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
int i
Definition: DBlmapReader.cc:9
tuple cfg
Definition: looper.py:259
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:185
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:449
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)
T eta() const
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:90
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:82
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
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:274
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:71
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:41
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
Definition: Run.h:41