CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
TopDiLeptonHLTOfflineDQM.cc
Go to the documentation of this file.
1 //#include <algorithm>
15 
17 
19 
20 /*Originally from DQM/Physics by R. Wolf and J. Andrea*/
21 using namespace std;
22 namespace HLTOfflineDQMTopDiLepton {
23 
24  // maximal Delta to consider
25  // hlt and reco objects matched
26  static const double DRMIN = 0.05;
27 
28  MonitorDiLepton::MonitorDiLepton(const char* label, const edm::ParameterSet& cfg, edm::ConsumesCollector&& iC) :
29  label_(label), eidPattern_(0), elecIso_(0), elecSelect_(0), muonIso_(0), muonSelect_(0), jetIDSelect_(0),
30  lowerEdge_(-1.), upperEdge_(-1.), elecMuLogged_(0), diMuonLogged_(0), diElecLogged_(0)
31  {
32  // sources have to be given; this PSet is not optional
33  edm::ParameterSet sources=cfg.getParameter<edm::ParameterSet>("sources");
34  muons_= iC.consumes< edm::View<reco::Muon> >(sources.getParameter<edm::InputTag>("muons"));
35  elecs_= iC.consumes< edm::View<reco::GsfElectron> >(sources.getParameter<edm::InputTag>("elecs"));
36  jets_ = iC.consumes< edm::View<reco::Jet> >(sources.getParameter<edm::InputTag>("jets" ));
37 
38  const auto& mets = sources.getParameter<std::vector<edm::InputTag>>("mets");
39  for (const auto& met: mets) {
40  mets_.push_back(iC.consumes<edm::View<reco::MET>>(met));
41  }
42 
43  // elecExtras are optional; they may be omitted or empty
44  if( cfg.existsAs<edm::ParameterSet>("elecExtras") ){
45  edm::ParameterSet elecExtras=cfg.getParameter<edm::ParameterSet>("elecExtras");
46  // select is optional; in case it's not found no
47  // selection will be applied
48  if( elecExtras.existsAs<std::string>("select") ){
50  }
51  // isolation is optional; in case it's not found no
52  // isolation will be applied
53  if( elecExtras.existsAs<std::string>("isolation") ){
55  }
56  // electronId is optional; in case it's not found the
57  // InputTag will remain empty
58  if( elecExtras.existsAs<edm::ParameterSet>("electronId") ){
59  edm::ParameterSet elecId=elecExtras.getParameter<edm::ParameterSet>("electronId");
60  electronId_= iC.consumes< edm::ValueMap<float> >(elecId.getParameter<edm::InputTag>("src"));
61  eidPattern_= elecId.getParameter<int>("pattern");
62  }
63  }
64  // muonExtras are optional; they may be omitted or empty
65  if( cfg.existsAs<edm::ParameterSet>("muonExtras") ){
66  edm::ParameterSet muonExtras=cfg.getParameter<edm::ParameterSet>("muonExtras");
67  // select is optional; in case it's not found no
68  // selection will be applied
69  if( muonExtras.existsAs<std::string>("select") ){
71  }
72  // isolation is optional; in case it's not found no
73  // isolation will be applied
74  if( muonExtras.existsAs<std::string>("isolation") ){
76  }
77  }
78  // jetExtras are optional; they may be omitted or empty
79  if( cfg.existsAs<edm::ParameterSet>("jetExtras") ){
80  edm::ParameterSet jetExtras=cfg.getParameter<edm::ParameterSet>("jetExtras");
81  // jetCorrector is optional; in case it's not found
82  // the InputTag will remain empty
83  if( jetExtras.existsAs<std::string>("jetCorrector") ){
84  jetCorrector_= jetExtras.getParameter<std::string>("jetCorrector");
85  }
86  // read jetID information if it exists
87  if(jetExtras.existsAs<edm::ParameterSet>("jetID")){
89  jetIDLabel_ = iC.consumes< reco::JetIDValueMap >(jetID.getParameter<edm::InputTag>("label"));
91  }
92  // select is optional; in case it's not found no
93  // selection will be applied (only implemented for
94  // CaloJets at the moment)
95  if( jetExtras.existsAs<std::string>("select") ){
96  jetSelect_= jetExtras.getParameter<std::string>("select");
97  }
98  }
99  // triggerExtras are optional; they may be omitted or empty
100  processName_ = "HLT";
101  if( cfg.existsAs<edm::ParameterSet>("triggerExtras") ){
102  edm::ParameterSet triggerExtras=cfg.getParameter<edm::ParameterSet>("triggerExtras");
103  triggerTable_= iC.consumes< edm::TriggerResults >(triggerExtras.getParameter<edm::InputTag>("src"));
104  processName_ = triggerExtras.getParameter<edm::InputTag>("src").process();
105  elecMuPaths_ = triggerExtras.getParameter<std::vector<std::string> >("pathsELECMU");
106  diMuonPaths_ = triggerExtras.getParameter<std::vector<std::string> >("pathsDIMUON");
107  diElecPaths_ = triggerExtras.getParameter<std::vector<std::string> >("pathsDIELEC");
108  }
109  // massExtras is optional; in case it's not found no mass
110  // window cuts are applied for the same flavor monitor
111  // histograms
112  if( cfg.existsAs<edm::ParameterSet>("massExtras") ){
113  edm::ParameterSet massExtras=cfg.getParameter<edm::ParameterSet>("massExtras");
114  lowerEdge_= massExtras.getParameter<double>("lowerEdge");
115  upperEdge_= massExtras.getParameter<double>("upperEdge");
116  }
117 
118  // and don't forget to do the histogram booking
119  folder_=cfg.getParameter<std::string>("directory");
120 
121  triggerEventWithRefsTag_ = iC.consumes< trigger::TriggerEventWithRefs >(edm::InputTag("hltTriggerSummaryRAW","",processName_));
122 
123  }
124 
125  void
127  {
128  //set up the current directory path
129  std::string current(folder_); current+=label_;
130  store_.setCurrentFolder(current);
131 
132  // determine number of bins for trigger monitoring
133  unsigned int nElecMu=elecMuPaths_.size();
134  unsigned int nDiMuon=diMuonPaths_.size();
135  unsigned int nDiElec=diElecPaths_.size();
136 
137  // invariant mass of opposite charge lepton pair (only filled for same flavor)
138  hists_["invMass_" ] = store_.book1D("InvMass" , "M(lep1, lep2)" , 80, 0., 320.); //OK
139  // invariant mass of same charge lepton pair (only filled for same flavor)
140  hists_["invMassWC_" ] = store_.book1D("InvMassWC" , "M_{WC}(L1, L2)" , 80, 0., 320.); //OK
141  // decay channel [1]: muon/muon, [2]:elec/elec, [3]:elec/muon
142  hists_["decayChannel_"] = store_.book1D("DecayChannel", "Decay Channel" , 3, 0, 3); //OK
143  // // trigger efficiency estimates for the electron muon channel
144  // hists_["elecMuEff_" ] = store_.book1D("ElecMuEff" , "Eff(e/#mu paths)" , nElecMu, 0., nElecMu);
145  // monitored trigger occupancy for the electron muon channel
146  hists_["elecMuMon_" ] = store_.book1D("ElecMuMon" , "Mon(e/#mu paths)" , nElecMu, 0., nElecMu);
147  // // trigger efficiency estimates for the di muon channel
148  // hists_["diMuonEff_" ] = store_.book1D("DiMuonEff" , "Eff(#mu/#mu paths)" , nDiMuon, 0., nDiMuon);
149  // monitored trigger occupancy for the di muon channel
150  hists_["diMuonMon_" ] = store_.book1D("DiMuonMon" , "Mon(#mu/#mu paths)" , nDiMuon, 0., nDiMuon);
151  // // trigger efficiency estimates for the di electron channel
152  // hists_["diElecEff_" ] = store_.book1D("DiElecEff" , "Eff(e/e paths)" , nDiElec, 0., nDiElec);
153  // monitored trigger occupancy for the di electron channel
154  hists_["diElecMon_" ] = store_.book1D("DiElecMon" , "Mon(e/e paths)" , nDiElec, 0., nDiElec);
155  // multiplicity of jets with pt>30 (corrected to L2+L3)
156  hists_["jetMult_" ] = store_.book1D("JetMult" , "N_{30}(jet)" , 21, -0.5, 20.5); //OK
157 
158  // set bin labels for trigger monitoring
162  // set bin labels for decayChannel_
163  hists_["decayChannel_"]->setBinLabel( 1, "#mu e" , 1);
164  hists_["decayChannel_"]->setBinLabel( 2, "#mu #mu", 1);
165  hists_["decayChannel_"]->setBinLabel( 3, "e e" , 1);
166 
167  // selected dimuon events
168  hists_["diMuonLogger_"] = store_.book2D("DiMuonLogger", "Logged DiMuon Events" , 8, 0., 8., 10, 0., 10.); //OK
169  // selected dielec events
170  hists_["diElecLogger_"] = store_.book2D("DiElecLogger", "Logged DiElec Events" , 8, 0., 8., 10, 0., 10.); //OK
171  // selected elemu events
172  hists_["elecMuLogger_"] = store_.book2D("ElecMuLogger", "Logged ElecMu Events" , 8, 0., 8., 10, 0., 10.); //OK
173 
174  // set bin labels for trigger monitoring
175  loggerBinLabels(std::string("diMuonLogger_"));
176  loggerBinLabels(std::string("diElecLogger_"));
177  loggerBinLabels(std::string("elecMuLogger_"));
178 
179  // deltaR min between hlt iso lepton and reco iso lepton wrt eta
180  hists_["leptDeltaREta_"] = store_.book2D("DeltaRMinEtaLepton", "#Delta R_{min}(leptons) wrt #eta", 30, -3, 3, 10, 0., 0.1);
181  // resolution in pT for matched isolated leptons
182  hists_["leptResolution_"] = store_.book1D("ResIsoLeptons", "#Delta p_{T}/p_{T}(matched leptons)", 20, 0., 0.1);
183  // matching monitoring
184  hists_["matchingMon_"] = store_.book1D("MatchingMon", "Mon(matching)", 3, 0., 3.);
185  // set axes titles for matching monitoring
186  hists_["matchingMon_"]->setBinLabel( 1 , "1st lepton" );
187  hists_["matchingMon_"]->setBinLabel( 2 , "2nd lepton" );
188  hists_["matchingMon_"]->setBinLabel( 3 , "both " );
189 
190  return;
191  }
192 
193  void
194  MonitorDiLepton::fill(const edm::Event& event, const edm::EventSetup& setup, const HLTConfigProvider& hltConfig, const std::vector<std::string> triggerPaths)
195  {
196  // fetch trigger event if configured such
199  if( !event.getByToken(triggerTable_, triggerTable) ) return;
200  }
201 
202  edm::Handle<trigger::TriggerEventWithRefs> triggerEventWithRefsHandle;
203  if(!event.getByToken(triggerEventWithRefsTag_,triggerEventWithRefsHandle)) return;
204 
205  /*
206  ------------------------------------------------------------
207 
208  Run information
209 
210  ------------------------------------------------------------
211  */
212 
213  if (!event.eventAuxiliary().run()) return;
214 
215  /*
216  ------------------------------------------------------------
217 
218  Muon Selection
219 
220  ------------------------------------------------------------
221  */
222 
223  // buffer isolated muons
224  std::vector<const reco::Muon*> isoMuons;
225 
227  if( !event.getByToken(muons_, muons) ) {
228  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
229  << "Muon collection not found \n";
230  return;
231  }
232 
233  for(edm::View<reco::Muon>::const_iterator muon=muons->begin(); muon!=muons->end(); ++muon){
234  // restrict to globalMuons
235  if( muon->isGlobalMuon() ){
236  // apply preselection
237  if(!muonSelect_ || (*muonSelect_)(*muon)){
238  if(!muonIso_ || (*muonIso_)(*muon)) isoMuons.push_back(&(*muon));
239  }
240  }
241  }
242 
243  /*
244  ------------------------------------------------------------
245 
246  Electron Selection
247 
248  ------------------------------------------------------------
249  */
250 
251  // buffer isolated electronss
252  std::vector<const reco::GsfElectron*> isoElecs;
253  edm::Handle<edm::ValueMap<float> > electronId;
255  if( !event.getByToken(electronId_, electronId) ) return;
256  }
257 
259  if( !event.getByToken(elecs_, elecs) ) {
260  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
261  << "Electron collection not found \n";
262  return;
263  }
264 
265  for(edm::View<reco::GsfElectron>::const_iterator elec=elecs->begin(); elec!=elecs->end(); ++elec){
266  // restrict to electrons with good electronId
267  int idx = elec-elecs->begin();
268  if( electronId_.isUninitialized() ? true : ((int)(*electronId)[elecs->refAt(idx)] & eidPattern_) ){
269  // apply preselection
270  if(!elecSelect_ || (*elecSelect_)(*elec)){
271  if(!elecIso_ || (*elecIso_)(*elec)) isoElecs.push_back(&(*elec));
272  }
273  }
274  }
275 
276  /*
277  ------------------------------------------------------------
278 
279  Jet Selection
280 
281  ------------------------------------------------------------
282  */
283 
284  const JetCorrector* corrector=0;
285  if(!jetCorrector_.empty()){
286  // check whether a jet correcto is in the event setup or not
287  if(setup.find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
288  corrector = JetCorrector::getJetCorrector(jetCorrector_, setup);
289  }
290  else{
291  edm::LogVerbatim( "TopDiLeptonHLTOfflineDQM" )
292  << "\n"
293  << "------------------------------------------------------------------------------------- \n"
294  << " No JetCorrectionsRecord available from EventSetup: \n"
295  << " - Jets will not be corrected. \n"
296  << " - If you want to change this add the following lines to your cfg file: \n"
297  << " \n"
298  << " ## load jet corrections \n"
299  << " process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
300  << " process.prefer(\"ak5CaloL2L3\") \n"
301  << " \n"
302  << "------------------------------------------------------------------------------------- \n";
303  }
304  }
305 
306  unsigned int mult=0;
307  // buffer leadingJets
308  std::vector<reco::Jet> leadingJets;
310  if( !event.getByToken(jets_, jets) ) {
311  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
312  << "Jet collection not found \n";
313  return;
314  }
315 
317  if(jetIDSelect_){
318  if( !event.getByToken(jetIDLabel_, jetID) ) return;
319  }
320 
321  for(edm::View<reco::Jet>::const_iterator jet=jets->begin(); jet!=jets->end(); ++jet){
322  unsigned int idx=jet-jets->begin();
323  if( jetIDSelect_ && dynamic_cast<const reco::CaloJet*>(jets->refAt(idx).get())){
324  if(!(*jetIDSelect_)((*jetID)[jets->refAt(idx)])) continue;
325  }
326  // chekc additional jet selection for calo, pf and bare reco jets
327  if(dynamic_cast<const reco::CaloJet*>(&*jet)){
328  reco::CaloJet sel = dynamic_cast<const reco::CaloJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
329  StringCutObjectSelector<reco::CaloJet> jetSelect(jetSelect_); if(!jetSelect(sel)){ continue;}
330  }
331  else if(dynamic_cast<const reco::PFJet*>(&*jet)){
332  reco::PFJet sel= dynamic_cast<const reco::PFJet&>(*jet); sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
333  StringCutObjectSelector<reco::PFJet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
334  }
335  else{
336  reco::Jet sel = *jet; sel.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
337  StringCutObjectSelector<reco::Jet> jetSelect(jetSelect_); if(!jetSelect(sel)) continue;
338  }
339  // check for overlaps
340  bool overlap=false;
341  for(std::vector<const reco::GsfElectron*>::const_iterator elec=isoElecs.begin(); elec!=isoElecs.end(); ++elec){
342  if(reco::deltaR((*elec)->eta(), (*elec)->phi(), jet->eta(), jet->phi())<0.4){overlap=true; break;}
343  } if(overlap){continue;}
344  // prepare jet to fill monitor histograms
345  reco::Jet monitorJet=*jet; monitorJet.scaleEnergy(corrector ? corrector->correction(*jet) : 1.);
346  ++mult; // determine jet multiplicity
347  if(idx==0) {
348  leadingJets.push_back(monitorJet);
349  }
350  if(idx==1) {
351  leadingJets.push_back(monitorJet);
352  }
353  }
354  fill("jetMult_", mult);
355 
356  /*
357  ------------------------------------------------------------
358 
359  MET Selection
360 
361  ------------------------------------------------------------
362  */
363 
364  // buffer for event logging
365  reco::MET caloMET;
366  for(std::vector< edm::EDGetTokenT< edm::View<reco::MET> > >::const_iterator met_=mets_.begin(); met_!=mets_.end(); ++met_){
367 
369  if( !event.getByToken(*met_, met) ) continue;
370 
371  if(met->begin()!=met->end()){
372  unsigned int idx=met_-mets_.begin();
373  if(idx==0){
374  caloMET=*met->begin();
375  }
376  }
377  }
378 
379 
380  /*
381  ------------------------------------------------------------
382 
383  Event Monitoring
384 
385  ------------------------------------------------------------
386  */
387  const edm::TriggerNames& triggerNames = event.triggerNames(*triggerTable);
388  // loop over trigger paths
389  for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
390  bool elecmu = false;
391  bool dielec = false;
392  bool dimuon = false;
393  // consider only path from triggerPaths
394  string name = triggerNames.triggerNames()[i];
395  for (unsigned int j=0; j<triggerPaths.size(); j++) {
396  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase) && TString(name.c_str()).Contains(TString("ele"), TString::kIgnoreCase) && TString(name.c_str()).Contains(TString("mu"), TString::kIgnoreCase)) elecmu = true;
397  else {
398  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase) && TString(name.c_str()).Contains(TString("ele"), TString::kIgnoreCase)) dielec = true;
399  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase) && TString(name.c_str()).Contains(TString("mu"), TString::kIgnoreCase)) dimuon = true;
400  }
401  }
402 
403  // ELECMU channel
404  if( elecmu ){
405  fill("decayChannel_", 0.5);
406  if( isoElecs.size()>0 && isoMuons.size()>0 ) {
407  double mass = (isoElecs[0]->p4()+isoMuons[0]->p4()).mass();
408  if( (lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<mass && mass<upperEdge_) ){
409  // fill plots for trigger monitoring
410  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "elecMu", elecMuPaths_);
411  if(elecMuLogged_<=hists_.find("elecMuLogger_")->second->getNbinsY()){
412  // log runnumber, lumi block, event number & some
413  // more pysics infomation for interesting events
414  fill("elecMuLogger_", 0.5, elecMuLogged_+0.5, event.eventAuxiliary().run());
415  fill("elecMuLogger_", 1.5, elecMuLogged_+0.5, event.eventAuxiliary().luminosityBlock());
416  fill("elecMuLogger_", 2.5, elecMuLogged_+0.5, event.eventAuxiliary().event());
417  fill("elecMuLogger_", 3.5, elecMuLogged_+0.5, isoMuons[0]->pt());
418  fill("elecMuLogger_", 4.5, elecMuLogged_+0.5, isoElecs[0]->pt());
419  if(leadingJets.size()>0) fill("elecMuLogger_", 5.5, elecMuLogged_+0.5, leadingJets[0].pt());
420  if(leadingJets.size()>1) fill("elecMuLogger_", 6.5, elecMuLogged_+0.5, leadingJets[1].pt());
421  fill("elecMuLogger_", 7.5, elecMuLogged_+0.5, caloMET.et());
422  ++elecMuLogged_;
423  }
424  }
425  }
426  }
427 
428  // DIMUON channel
429  if( dimuon ){
430  fill("decayChannel_", 1.5);
431  if (isoMuons.size()>1) {
432  int charge = isoMuons[0]->charge()*isoMuons[1]->charge();
433  double mass = (isoMuons[0]->p4()+isoMuons[1]->p4()).mass();
434  fill(charge<0 ? "invMass_" : "invMassWC_" , mass );
435  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<mass && mass<upperEdge_) ){
436  // fill plots for trigger monitoring
437  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "diMuon", diMuonPaths_);
438  if(diMuonLogged_<=hists_.find("diMuonLogger_")->second->getNbinsY()){
439  // log runnumber, lumi block, event number & some
440  // more pysics infomation for interesting events
441  fill("diMuonLogger_", 0.5, diMuonLogged_+0.5, event.eventAuxiliary().run());
442  fill("diMuonLogger_", 1.5, diMuonLogged_+0.5, event.eventAuxiliary().luminosityBlock());
443  fill("diMuonLogger_", 2.5, diMuonLogged_+0.5, event.eventAuxiliary().event());
444  fill("diMuonLogger_", 3.5, diMuonLogged_+0.5, isoMuons[0]->pt());
445  fill("diMuonLogger_", 4.5, diMuonLogged_+0.5, isoMuons[1]->pt());
446  if(leadingJets.size()>0) fill("diMuonLogger_", 5.5, diMuonLogged_+0.5, leadingJets[0].pt());
447  if(leadingJets.size()>1) fill("diMuonLogger_", 6.5, diMuonLogged_+0.5, leadingJets[1].pt());
448  fill("diMuonLogger_", 7.5, diMuonLogged_+0.5, caloMET.et());
449  ++diMuonLogged_;
450  }
451  }
452  }
453  }
454 
455  // DIELEC channel
456  if( dielec ){
457  fill("decayChannel_", 2.5);
458  if( dielec && isoElecs.size()>1 ){
459  int charge = isoElecs[0]->charge()*isoElecs[1]->charge();
460  double mass = (isoElecs[0]->p4()+isoElecs[1]->p4()).mass();
461  fill(charge<0 ? "invMass_" : "invMassWC_" , mass );
462  if((lowerEdge_==-1. && upperEdge_==-1.) || (lowerEdge_<mass && mass<upperEdge_) ){
463  // fill plots for trigger monitoring
464  if(!triggerTable_.isUninitialized()) fill(event, *triggerTable, "diElec", diElecPaths_);
465  if(diElecLogged_<=hists_.find("diElecLogger_")->second->getNbinsY()){
466  // log runnumber, lumi block, event number & some
467  // more pysics infomation for interesting events
468  fill("diElecLogger_", 0.5, diElecLogged_+0.5, event.eventAuxiliary().run());
469  fill("diElecLogger_", 1.5, diElecLogged_+0.5, event.eventAuxiliary().luminosityBlock());
470  fill("diElecLogger_", 2.5, diElecLogged_+0.5, event.eventAuxiliary().event());
471  fill("diElecLogger_", 3.5, diElecLogged_+0.5, isoElecs[0]->pt());
472  fill("diElecLogger_", 4.5, diElecLogged_+0.5, isoElecs[1]->pt());
473  if(leadingJets.size()>0) fill("diElecLogger_", 5.5, diElecLogged_+0.5, leadingJets[0].pt());
474  if(leadingJets.size()>1) fill("diElecLogger_", 6.5, diElecLogged_+0.5, leadingJets[1].pt());
475  fill("diElecLogger_", 7.5, diElecLogged_+0.5, caloMET.et());
476  ++diElecLogged_;
477  }
478  }
479  }
480  }
481  }
482 
483  /*
484  ------------------------------------------------------------
485 
486  HLT Objects Monitoring
487 
488  ------------------------------------------------------------
489  */
490 
491  // loop over trigger paths
492  for(unsigned int i=0; i<triggerNames.triggerNames().size(); ++i){
493  // consider only path from triggerPaths
494  string name = triggerNames.triggerNames()[i].c_str();
495  bool isInteresting = false;
496  for (unsigned int j=0; j<triggerPaths.size(); j++) {
497  if (TString(name.c_str()).Contains(TString(triggerPaths[j]), TString::kIgnoreCase)) isInteresting = true;
498  }
499  if (!isInteresting) continue;
500  // dump infos on the considered trigger path
501  const unsigned int triggerIndex = triggerNames.triggerIndex(name);
502  // get modules for the considered trigger path
503  const vector<string>& moduleLabels(hltConfig.moduleLabels(triggerIndex));
504  const unsigned int moduleIndex(triggerTable->index(triggerIndex));
505  // Results from TriggerEventWithRefs product
506  electronIds_.clear(); electronRefs_.clear();
507  muonIds_.clear(); muonRefs_.clear();
508  // look only for modules actually run in this path
509  unsigned int kElec=0;
510  unsigned int kMuon=0;
511  for (unsigned int k=0; k<=moduleIndex; ++k) {
512  const string& moduleLabel(moduleLabels[k]);
513  const string moduleType(hltConfig.moduleType(moduleLabel));
514  // check whether the module is packed up in TriggerEventWithRef product
515  const unsigned int filterIndex(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabel,"",processName_)));
516  if (filterIndex<triggerEventWithRefsHandle->size()) {
517  triggerEventWithRefsHandle->getObjects(filterIndex,electronIds_,electronRefs_);
518  const unsigned int nElectrons(electronIds_.size());
519  if (nElectrons>0) kElec = k;
520 
521  triggerEventWithRefsHandle->getObjects(filterIndex,muonIds_,muonRefs_);
522  const unsigned int nMuons(muonIds_.size());
523  if (nMuons>0) kMuon = k;
524 
525  }
526  }
527  bool l1Matched = false;
528  bool l2Matched = false;
529  double l1DeltaRMin = 500.;
530  double l2DeltaRMin = 500.;
531  unsigned int l1IndMatched = 500;
532  unsigned int l2IndMatched = 500;
533  // access to hlt dielecs
534  electronIds_.clear(); electronRefs_.clear();
535  if (kElec > 0 && kMuon < 1 && isoElecs.size()>0) {
536  const string& moduleLabelElec(moduleLabels[kElec]);
537  const string moduleTypeElec(hltConfig.moduleType(moduleLabelElec));
538  const unsigned int filterIndexElec(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
539  triggerEventWithRefsHandle->getObjects(filterIndexElec,electronIds_,electronRefs_);
540  const unsigned int nElectrons(electronIds_.size());
541  double deltar1 = 600.;
542  double deltar2 = 600.;
543  for (unsigned int inde = 0; inde < isoElecs.size(); inde++) {
544  if (nElectrons > 0) deltar1 = deltaR(*electronRefs_[0],*isoElecs[inde]);
545  if (nElectrons > 1) deltar2 = deltaR(*electronRefs_[1],*isoElecs[inde]);
546  if (deltar1 < deltar2 && deltar1 < l1DeltaRMin) {
547  l1DeltaRMin = deltar1;
548  l1IndMatched = inde;
549  }
550  if (deltar2 < deltar1 && deltar2 < l2DeltaRMin) {
551  l2DeltaRMin = deltar2;
552  l2IndMatched = inde;
553  }
554  }
555  if (nElectrons > 0 && l1IndMatched < 500) fill("leptDeltaREta_", isoElecs[l1IndMatched]->eta(), l1DeltaRMin);
556  if (nElectrons > 1 && l2IndMatched < 500) fill("leptDeltaREta_", isoElecs[l2IndMatched]->eta(), l2DeltaRMin);
557  if (l1DeltaRMin < DRMIN) {
558  l1Matched = true;
559  fill("matchingMon_", 0.5 );
560  fill("leptResolution_", fabs(isoElecs[l1IndMatched]->pt()-electronRefs_[0]->pt())/isoElecs[l1IndMatched]->pt() );
561  }
562  if (l2DeltaRMin < DRMIN) {
563  l2Matched = true;
564  fill("matchingMon_", 1.5 );
565  fill("leptResolution_", fabs(isoElecs[l2IndMatched]->pt()-electronRefs_[1]->pt())/isoElecs[l2IndMatched]->pt() );
566  }
567  }
568  // access to hlt dimuons
569  muonIds_.clear(); muonRefs_.clear();
570  l1DeltaRMin = 500.; l2DeltaRMin = 500.; double l3DeltaRMin = 500.;
571  l1IndMatched = 500; l2IndMatched = 500; double l3IndMatched = 500;
572  if (kMuon > 0 && kElec < 1 && isoMuons.size()>0) {
573  const string& moduleLabelMuon(moduleLabels[kMuon]);
574  const string moduleTypeMuon(hltConfig.moduleType(moduleLabelMuon));
575  const unsigned int filterIndexMuon(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
576  triggerEventWithRefsHandle->getObjects(filterIndexMuon,muonIds_,muonRefs_);
577  trigger::VRmuon myMuonRefs;
578  const unsigned int nMuons(muonIds_.size());
579  for (unsigned int l=0; l<nMuons; l++) {
580  bool isNew = true;
581  for (unsigned int ll=0; ll<myMuonRefs.size(); ll++) {
582  if (fabs((myMuonRefs[ll]->pt()-muonRefs_[l]->pt())/muonRefs_[l]->pt()) < 1e-5) isNew = false;
583  }
584  if (isNew) myMuonRefs.push_back(muonRefs_[l]);
585  }
586  const unsigned int nMyMuons(myMuonRefs.size());
587  double deltar1 = 600.;
588  double deltar2 = 600.;
589  double deltar3 = 600.;
590  for (unsigned int indm = 0; indm < isoMuons.size(); indm++) {
591  if (nMyMuons > 0) deltar1 = deltaR(*myMuonRefs[0],*isoMuons[indm]);
592  if (nMyMuons > 1) deltar2 = deltaR(*myMuonRefs[1],*isoMuons[indm]);
593  if (nMyMuons > 2) deltar3 = deltaR(*myMuonRefs[2],*isoMuons[indm]);
594  if (nMyMuons > 0 && (nMyMuons<1 || deltar1 < deltar2) && (nMyMuons<2 || deltar1<deltar3) && deltar1 < l1DeltaRMin) {
595  l1DeltaRMin = deltar1;
596  l1IndMatched = indm;
597  }
598  if (nMyMuons > 1 && deltar2 < deltar1 && (nMyMuons<3 || deltar2<deltar3) && deltar2 < l2DeltaRMin) {
599  l2DeltaRMin = deltar2;
600  l2IndMatched = indm;
601  }
602  if (nMyMuons > 2 && deltar3 < deltar1 && deltar3 < deltar2 && deltar3 < l3DeltaRMin) {
603  l3DeltaRMin = deltar3;
604  l3IndMatched = indm;
605  }
606  }
607  if (nMyMuons > 0 && l1IndMatched < 500) fill("leptDeltaREta_", isoMuons[l1IndMatched]->eta(), l1DeltaRMin);
608  if (nMyMuons > 1 && l2IndMatched < 500) fill("leptDeltaREta_", isoMuons[l2IndMatched]->eta(), l2DeltaRMin);
609  if (nMyMuons > 2 && l3IndMatched < 500) fill("leptDeltaREta_", isoMuons[l3IndMatched]->eta(), l3DeltaRMin);
610  if (l1DeltaRMin < DRMIN) {
611  l1Matched = true;
612  fill("matchingMon_", 0.5 );
613  fill("leptResolution_", fabs(isoMuons[l1IndMatched]->pt()-myMuonRefs[0]->pt())/isoMuons[l1IndMatched]->pt() );
614  if (l2DeltaRMin < DRMIN) {
615  l2Matched = true;
616  fill("matchingMon_", 1.5 );
617  fill("leptResolution_", fabs(isoMuons[l2IndMatched]->pt()-myMuonRefs[1]->pt())/isoMuons[l2IndMatched]->pt() );
618  } else if (l3DeltaRMin < DRMIN) {
619  l2Matched = true;
620  fill("matchingMon_", 1.5 );
621  fill("leptResolution_", fabs(isoMuons[l3IndMatched]->pt()-myMuonRefs[2]->pt())/isoMuons[l3IndMatched]->pt() );
622  }
623  } else {
624  if (l2DeltaRMin < DRMIN) {
625  l1Matched = true;
626  fill("matchingMon_", 0.5 );
627  fill("leptResolution_", fabs(isoMuons[l2IndMatched]->pt()-myMuonRefs[1]->pt())/isoMuons[l2IndMatched]->pt() );
628  if (l3DeltaRMin < DRMIN) {
629  l2Matched = true;
630  fill("matchingMon_", 1.5 );
631  fill("leptResolution_", fabs(isoMuons[l3IndMatched]->pt()-myMuonRefs[2]->pt())/isoMuons[l3IndMatched]->pt() );
632  }
633  }
634  if (l3DeltaRMin < DRMIN) {
635  l1Matched = true;
636  fill("matchingMon_", 0.5 );
637  fill("leptResolution_", fabs(isoMuons[l3IndMatched]->pt()-myMuonRefs[2]->pt())/isoMuons[l3IndMatched]->pt() );
638  }
639  }
640  }
641  // access to hlt elec-muon
642  electronIds_.clear(); electronRefs_.clear();
643  muonIds_.clear(); muonRefs_.clear();
644  l1DeltaRMin = 500.; l2DeltaRMin = 500.;
645  l1IndMatched = 500; l2IndMatched = 500;
646  if (kElec > 0 && kMuon > 0 && isoElecs.size()>0) {
647  const string& moduleLabelElec(moduleLabels[kElec]);
648  const string moduleTypeElec(hltConfig.moduleType(moduleLabelElec));
649  const unsigned int filterIndexElec(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelElec,"",processName_)));
650  triggerEventWithRefsHandle->getObjects(filterIndexElec,electronIds_,electronRefs_);
651  const unsigned int nElectrons(electronIds_.size());
652  double deltar = 600.;
653  for (unsigned int inde = 0; inde < isoElecs.size(); inde++) {
654  if (nElectrons > 0) deltar = deltaR(*electronRefs_[0],*isoElecs[inde]);
655  if (deltar < l1DeltaRMin) {
656  l1DeltaRMin = deltar;
657  l1IndMatched = inde;
658  }
659  }
660  if (nElectrons > 0 && l1IndMatched < 500) fill("leptDeltaREta_", isoElecs[l1IndMatched]->eta(), l1DeltaRMin);
661  if (l1DeltaRMin < DRMIN) {
662  l1Matched = true;
663  fill("matchingMon_", 0.5 );
664  fill("leptResolution_", fabs(isoElecs[l1IndMatched]->pt()-electronRefs_[0]->pt())/isoElecs[l1IndMatched]->pt() );
665  }
666  }
667  if (kElec > 0 && kMuon > 0 && isoMuons.size()>0) {
668  const string& moduleLabelMuon(moduleLabels[kMuon]);
669  const string moduleTypeMuon(hltConfig.moduleType(moduleLabelMuon));
670  const unsigned int filterIndexMuon(triggerEventWithRefsHandle->filterIndex(edm::InputTag(moduleLabelMuon,"",processName_)));
671  triggerEventWithRefsHandle->getObjects(filterIndexMuon,muonIds_,muonRefs_);
672  const unsigned int nMuons(muonIds_.size());
673  if (isoMuons.size()<1) continue;
674  double deltar = 600.;
675  for (unsigned int indm = 0; indm < isoMuons.size(); indm++) {
676  if (nMuons > 0) deltar = deltaR(*muonRefs_[0],*isoMuons[indm]);
677  if (deltar < l2DeltaRMin) {
678  l2DeltaRMin = deltar;
679  l2IndMatched = indm;
680  }
681  }
682  if (nMuons > 0 && l2IndMatched < 500) fill("leptDeltaREta_", isoMuons[l2IndMatched]->eta(), l2DeltaRMin);
683  if (l2DeltaRMin < DRMIN) {
684  l2Matched = true;
685  fill("matchingMon_", 1.5 );
686  fill("leptResolution_", fabs(isoMuons[l2IndMatched]->pt()-muonRefs_[0]->pt())/isoMuons[l2IndMatched]->pt() );
687  }
688  }
689  if (l1Matched && l2Matched) fill("matchingMon_", 2.5 );
690  }
691 
692  }
693 
694 }
695 
696 TopDiLeptonHLTOfflineDQM::TopDiLeptonHLTOfflineDQM(const edm::ParameterSet& cfg): vertexSelect_(0), beamspotSelect_(0)
697 {
698  // configure the preselection
699  edm::ParameterSet presel=cfg.getParameter<edm::ParameterSet>("preselection");
700  if( presel.existsAs<edm::ParameterSet>("trigger") ){
701  edm::ParameterSet trigger=presel.getParameter<edm::ParameterSet>("trigger");
702  triggerTable_= consumes< edm::TriggerResults >(trigger.getParameter<edm::InputTag>("src"));
703  triggerPaths_=trigger.getParameter<std::vector<std::string> >("select");
704  }
705  if( presel.existsAs<edm::ParameterSet>("vertex" ) ){
706  edm::ParameterSet vertex=presel.getParameter<edm::ParameterSet>("vertex");
707  vertex_= consumes< std::vector<reco::Vertex> >(vertex.getParameter<edm::InputTag>("src"));
709  }
710  if( presel.existsAs<edm::ParameterSet>("beamspot" ) ){
711  edm::ParameterSet beamspot=presel.getParameter<edm::ParameterSet>("beamspot");
712  beamspot_= consumes< reco::BeamSpot >(beamspot.getParameter<edm::InputTag>("src"));
714  }
715 
716  // configure the selection
717  std::vector<edm::ParameterSet> sel=cfg.getParameter<std::vector<edm::ParameterSet> >("selection");
718  for(unsigned int i=0; i<sel.size(); ++i){
719  selectionOrder_.push_back(sel.at(i).getParameter<std::string>("label"));
721  }
722 
723  for (const std::string& s: selectionOrder_) {
725 
726  if (selection_.find(key) == selection_.end())
727  continue;
728 
729  if (type == "muons"){
731  }
732  if (type == "elecs"){
734  }
735  if (type == "jets"){
737  }
738  if (type == "jets/pf"){
740  }
741  if (type == "jets/calo"){
743  }
744  if (type == "met"){
746  }
747  }
748 }
749 
750  void
752 {
753  using namespace std;
754  using namespace edm;
755 
756  bool changed(true);
757  if (!hltConfig_.init(iRun,iSetup,"*",changed)) {
758  edm::LogWarning( "TopSingleLeptonHLTOfflineDQM" )
759  << "Config extraction failure with process name "
761  << "\n";
762  return;
763  }
764 }
765 
766  void
768 {
771  if( !event.getByToken(triggerTable_, triggerTable) ) return;
772  if(!acceptHLT(event, *triggerTable, triggerPaths_)) return;
773  }
774  if(!vertex_.isUninitialized()){
776  if( !event.getByToken(vertex_, vertex) ) return;
777  if(vertex->empty() || !(*vertexSelect_)(vertex->front())) return;
778  }
779  if(!beamspot_.isUninitialized()){
781  if( !event.getByToken(beamspot_, beamspot) ) return;
782  if(!(*beamspotSelect_)(*beamspot)) return;
783  }
784  // apply selection steps
785  for(std::vector<std::string>::const_iterator selIt=selectionOrder_.begin(); selIt!=selectionOrder_.end(); ++selIt){
786  std::string key = selectionStep(*selIt), type = objectType(*selIt);
787  if(selection_.find(key)!=selection_.end()){
788 
789  if(type=="empty"){
790  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
791  continue;
792  }
793  if(type=="Hlt" ){
794  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
795  continue;
796  }
797 
798  bool passSel = true;
799 
800  for(std::vector<std::string>::const_iterator selIt2=selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
801  std::string key2 = selectionStep(*selIt2), type2 = objectType(*selIt2);
802  if(selection_.find(key2)==selection_.end()) continue;
803 
804  if(type2=="Hlt" || type2=="empty" ) continue;
805  if (!selectmap_[type2]->select(event)) passSel=false;
806 
807  } // end 2nd loop
808 
809  // Apply cumulative event selection
810  if ( !passSel ) continue;
811 
812  selection_[key].second->fill(event, setup, hltConfig_, triggerPaths_);
813 
814  }
815  }
816 }
817 
818 void
820 {
821  for (auto& sel: selection_) {
822  sel.second.second->book(i);
823  }
824 }
TopDiLeptonHLTOfflineDQM(const edm::ParameterSet &cfg)
default constructor
type
Definition: HCALResponse.h:21
T getParameter(std::string const &) const
virtual double et() const GCC11_FINAL
transverse energy
int i
Definition: DBlmapReader.cc:9
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
Definition: View.h:81
tuple met
____________________________________________________________________________||
Definition: CaloMET_cfi.py:4
const std::string moduleType(const std::string &module) const
C++ class name of module.
double lowerEdge_
mass window upper and lower edge
bool existsAs(std::string const &parameterName, bool trackiness=true) const
checks if a parameter exists as a given type
Definition: ParameterSet.h:184
Jets made from CaloTowers.
Definition: CaloJet.h:29
StringCutObjectSelector< reco::Muon > * muonSelect_
extra selection on muons
edm::EDGetTokenT< reco::BeamSpot > beamspot_
beamspot
StringCutObjectSelector< reco::GsfElectron > * elecSelect_
extra selection on electrons
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:434
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
RunNumber_t run() const
std::string selectionStep(const std::string &label)
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
int elecMuLogged_
number of logged interesting events
virtual void scaleEnergy(double fScale)
scale energy of the jet
Definition: Jet.cc:444
T eta() const
edm::EDGetTokenT< edm::View< reco::GsfElectron > > elecs_
input sources for monitoring
StringCutObjectSelector< reco::GsfElectron > * elecIso_
extra isolation criterion on electron
edm::EDGetTokenT< edm::View< reco::Jet > > jets_
double charge(const std::vector< uint8_t > &Ampls)
Strings const & triggerNames() const
Definition: TriggerNames.cc:24
Jets made from PFObjects.
Definition: PFJet.h:21
LuminosityBlockNumber_t luminosityBlock() const
edm::EDGetTokenT< reco::JetIDValueMap > jetIDLabel_
jetID as an extra selection type
std::vector< std::string > triggerPaths_
trigger paths
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
Definition: EventSetup.cc:90
std::vector< edm::EDGetTokenT< edm::View< reco::MET > > > mets_
considers a vector of METs
bool overlap(const reco::Muon &muon1, const reco::Muon &muon2, double pullX=1.0, double pullY=1.0, bool checkAdjacentChambers=false)
std::map< std::string, SelectionStepHLTBase * > selectmap_
std::vector< std::string > diMuonPaths_
trigger paths for di muon channel
StringCutObjectSelector< reco::BeamSpot > * beamspotSelect_
string cut selector
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup)
unsigned int triggerIndex(std::string const &name) const
Definition: TriggerNames.cc:32
Definition: MET.h:39
ConsumesCollector consumesCollector()
Use a ConsumesCollector to gather consumes information from helper functions.
vector< PseudoJet > jets
void loggerBinLabels(std::string hist)
set labels for event logging histograms
MonitorElement * book1D(Args &&...args)
Definition: DQMStore.h:113
std::vector< std::string > diElecPaths_
trigger paths for di electron channel
int j
Definition: DBlmapReader.cc:9
virtual void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c)
do this during the event loop
auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
Definition: deltaR.h:30
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerEventWithRefsTag_
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
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
std::map< std::string, MonitorElement * > hists_
histogram container
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
void triggerBinLabels(std::string channel, const std::vector< std::string > &labels)
set configurable labels for trigger monitoring histograms
const std::string & processName() const
process name
std::map< std::string, std::pair< edm::ParameterSet, HLTOfflineDQMTopDiLepton::MonitorDiLepton * > > selection_
int k[5][pyjets_maxn]
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
EventAuxiliary const & eventAuxiliary() const
Definition: Event.h:72
void setCurrentFolder(const std::string &fullpath)
Definition: DQMStore.cc:274
bool acceptHLT(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
MonitorElement * book2D(Args &&...args)
Definition: DQMStore.h:131
tuple idx
DEBUGGING if hasattr(process,&quot;trackMonIterativeTracking2012&quot;): print &quot;trackMonIterativeTracking2012 D...
std::vector< std::string > selectionOrder_
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
void book(DQMStore::IBooker &store_)
book histograms in subdirectory directory
std::string objectType(const std::string &label)
std::vector< reco::RecoChargedCandidateRef > VRmuon
edm::EDGetTokenT< edm::ValueMap< float > > electronId_
electronId label
list key
Definition: combine.py:13
tuple muons
Definition: patZpeak.py:38
bool isUninitialized() const
Definition: EDGetToken.h:71
tuple process
Definition: LaserDQM_cfg.py:3
edm::EDGetTokenT< edm::View< reco::Muon > > muons_
edm::EDGetTokenT< std::vector< reco::Vertex > > vertex_
primary vertex
static std::string const triggerPaths
Definition: EdmProvDump.cc:42
void setup(std::vector< TH2F > &depth, std::string name, std::string units="")
tuple size
Write out results.
EventNumber_t event() const
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
StringCutObjectSelector< reco::Muon > * muonIso_
extra isolation criterion on muon
Definition: Run.h:41
StringCutObjectSelector< reco::JetID > * jetIDSelect_
extra jetID selection on calo jets
StringCutObjectSelector< reco::Vertex > * vertexSelect_
string cut selector