25 namespace HLTOfflineDQMTopSingleLepton {
32 static const double WMASS = 80.4;
35 static const double DRMIN = 0.05;
38 label_(label), elecIso_(0), elecSelect_(0), pvSelect_(0), muonIso_(0), muonSelect_(0), jetIDSelect_(0), includeBTag_(
false), lowerEdge_(-1.), upperEdge_(-1.), logged_(0)
46 const auto& mets = sources.
getParameter<std::vector<edm::InputTag>>(
"mets");
47 for (
const auto&
met: mets) {
173 hists_[
"pvMult_" ] = store_.
book1D(
"PvMult" ,
"N_{pvs}" , 100, 0., 100.);
175 hists_[
"jetMult_" ] = store_.
book1D(
"JetMult" ,
"N_{20}(jet)" , 10, 0., 10.);
179 hists_[
"triggerMon_" ] = store_.
book1D(
"TriggerMon" ,
"Mon(trigger)" , nPaths, 0., nPaths);
181 hists_[
"massW_" ] = store_.
book1D(
"MassW" ,
"M(W)" , 60, 0., 300.);
183 hists_[
"massTop_" ] = store_.
book1D(
"MassTop" ,
"M(Top)" , 50, 0., 500.);
185 hists_[
"mMub_" ] = store_.
book1D(
"mMub" ,
"m_{#mub}" , 50, 0., 500.);
187 hists_[
"MTWm_" ] = store_.
book1D(
"MTWm" ,
"M_{T}^{W}(#mu)" , 60, 0., 300.);
189 hists_[
"mMTT_" ] = store_.
book1D(
"mMTT" ,
"M_{T}^{t}(#mu)" , 50, 0., 500.);
191 hists_[
"mEb_" ] = store_.
book1D(
"mEb" ,
"m_{eb}" , 50, 0., 500.);
193 hists_[
"MTWe_" ] = store_.
book1D(
"MTWe" ,
"M_{T}^{W}(e)" , 60, 0., 300.);
195 hists_[
"eMTT_" ] = store_.
book1D(
"eMTT" ,
"M_{T}^{t}(e)" , 50, 0., 500.);
199 hists_[
"jetMultBEff_"] = store_.
book1D(
"JetMultBProb",
"N_{20}(b/prob)" , 10, 0., 10.);
201 hists_[
"jetBDiscEff_"] = store_.
book1D(
"JetBDiscProb",
"Disc_{b/prob}(jet)", 25, 0., 2.5);
207 hists_[
"jetMultBVtx_"] = store_.
book1D(
"JetMultBVtx",
"N_{20}(b/vtx)" , 10, 0., 10.);
209 hists_[
"jetBDiscVtx_"] = store_.
book1D(
"JetBDiscVtx",
"Disc_{b/vtx}(Jet)", 35, -1., 6.);
211 hists_[
"eventLogger_"] = store_.
book2D(
"EventLogger",
"Logged Events" , 3, 0., 3., 4, 0., 4.);
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);
220 hists_[
"leptDeltaREta_"] = store_.
book2D(
"DeltaRMinEtaLepton",
"#Delta R_{min}(leptons) wrt #eta", 30, -3, 3, 10, 0., 0.1);
222 hists_[
"jetDeltaREta_"] = store_.
book2D(
"DeltaRMinEtaJet",
"#Delta R_{min}(jets) wrt #eta", 30, -3, 3, 10, 0., 0.1);
224 hists_[
"leptResolution_"] = store_.
book1D(
"ResIsoLeptons",
"#Delta p_{T}/p_{T}(matched leptons)", 20, 0., 0.1);
226 hists_[
"jetResolution_"] = store_.
book1D(
"ResIsoJets",
"#Delta p_{T}/p_{T}(matched jets)", 20, 0., 0.1);
228 hists_[
"matchingMon_"] = store_.
book1D(
"MatchingMon",
"Mon(matching)", 5, 0., 5.);
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 " );
259 <<
"Vertex collection not found \n";
262 unsigned int pvMult = 0;
267 fill(
"pvMult_", pvMult );
282 <<
"Electron collection not found \n";
294 unsigned int eMultIso=0;
295 std::vector<const reco::GsfElectron*> isoElecs;
298 unsigned int idx = elec-elecs->begin();
302 if(!
elecIso_ || (*
elecIso_)(*elec)){
if(eMultIso == 0) e = *elec; isoElecs.push_back(&(*elec)); ++eMultIso;}
316 unsigned int mMultIso=0;
318 std::vector<const reco::Muon*> isoMuons;
321 <<
"Muon collection not found \n";
327 if(
muon->isGlobalMuon() ){
354 if(setup.
find( edm::eventsetup::EventSetupRecordKey::makeKey<JetCorrectionsRecord>() )){
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"
365 <<
" ## load jet corrections \n"
366 <<
" process.load(\"JetMETCorrections.Configuration.JetCorrectionServicesAllAlgos_cff\") \n"
367 <<
" process.prefer(\"ak5CaloL2L3\") \n"
369 <<
"------------------------------------------------------------------------------------- \n";
374 std::vector<reco::Jet> correctedJets;
375 unsigned int mult=0, multBEff=0, multBVtx=0;
380 <<
"Jet collection not found \n";
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;
396 if(dynamic_cast<const reco::CaloJet*>(&*
jet)){
400 else if(dynamic_cast<const reco::PFJet*>(&*
jet)){
411 correctedJets.push_back(monitorJet);
417 double btagEffDisc = (*btagEff)[jetRef];
418 fill(
"jetBDiscEff_", btagEffDisc);
419 if( (*btagEff)[jetRef]>
btagEffWP_ ) ++multBEff;
425 double btagVtxDisc = (*btagVtx)[jetRef];
426 fill(
"jetBDiscVtx_", btagVtxDisc);
427 if( (*btagVtx)[jetRef]>
btagVtxWP_ ) {
if(multBVtx == 0) bJetCand= *
jet; ++multBVtx;}
431 fill(
"jetMult_" , mult );
432 fill(
"jetMultBEff_", multBEff);
434 fill(
"jetMultBVtx_", multBVtx);
449 if(met->begin()!=met->end()){
450 mET = *(met->begin());
464 double wMass = eventKinematics.
massWBoson (correctedJets);
465 double topMass = eventKinematics.
massTopQuark(correctedJets);
466 if(wMass>=0 && topMass>=0) {
fill(
"massW_" , wMass );
fill(
"massTop_" , topMass);}
470 if(
logged_<=
hists_.find(
"eventLogger_")->second->getNbinsY()){
474 double runID =
static_cast<double>(
event.eventAuxiliary().run());
475 double luminosityBlockID =
static_cast<double>(
event.eventAuxiliary().luminosityBlock());
476 double eventID =
static_cast<double>(
event.eventAuxiliary().event());
478 fill(
"eventLogger_", 1.5,
logged_+0.5, luminosityBlockID);
483 if(multBVtx != 0 && mMultIso == 1 ){
484 double mtW = eventKinematics.
tmassWBoson(&mu,mET,bJetCand);
if (mtW == mtW)
fill(
"MTWm_",mtW);
485 double Mlb = eventKinematics.
masslb(&mu,mET,bJetCand);
if (Mlb == Mlb)
fill(
"mMub_", Mlb);
486 double MTT = eventKinematics.
tmassTopQuark(&mu,mET,bJetCand);
if (MTT == MTT)
fill(
"mMTT_", MTT);
489 if(multBVtx != 0 && eMultIso == 1 ){
490 double mtW = eventKinematics.
tmassWBoson(&mu,mET,bJetCand);
if (mtW == mtW)
fill(
"MTWe_",mtW);
491 double Mlb = eventKinematics.
masslb(&mu,mET,bJetCand);
if (Mlb == Mlb)
fill(
"mEb_", Mlb);
492 double MTT = eventKinematics.
tmassTopQuark(&mu,mET,bJetCand);
if (MTT == MTT)
fill(
"eMTT_", MTT);
514 if(!rawTriggerEvent.
isValid()){
519 if(!aodTriggerEvent.
isValid()){
531 bool isInteresting =
false;
532 for (
unsigned int j=0;
j<triggerPaths.size();
j++) {
533 if (TString(name.c_str()).Contains(TString(triggerPaths[
j]), TString::kIgnoreCase)) isInteresting =
true;
535 if (!isInteresting)
continue;
537 const unsigned int triggerIndex = triggerNames.
triggerIndex(name);
539 const vector<string>& moduleLabels(hltConfig.
moduleLabels(triggerIndex));
540 const unsigned int moduleIndex(triggerTable->index(triggerIndex));
546 unsigned int kElec=0;
547 unsigned int kMuon=0;
549 for (
unsigned int k=0;
k<=moduleIndex; ++
k) {
550 const string& moduleLabel(moduleLabels[
k]);
551 const string moduleType(hltConfig.
moduleType(moduleLabel));
556 if (filterIndex<rawTriggerEvent->
size()) {
559 if (nElectrons>0) kElec =
k;
562 const unsigned int nMuons(
muonIds_.size());
563 if (nMuons>0) kMuon =
k;
566 const unsigned int nPFJets(
pfjetIds_.size());
567 if (nPFJets>0) kJet =
k;
573 if (filterIndex<aodTriggerEvent->
size()) {
576 if (nElectrons>0) kElec =
k;
579 const unsigned int nMuons(
muonIds_.size());
580 if (nMuons>0) kMuon =
k;
583 const unsigned int nPFJets(
pfjetIds_.size());
584 if (nPFJets>0) kJet =
k;
590 bool lMatched =
false;
591 bool j1Matched =
false;
592 bool j2Matched =
false;
593 bool j3Matched =
false;
596 double eDeltaRMin = 500.;
597 unsigned int eIndMatched = 500;
600 const string& moduleLabelElec(moduleLabels[kElec]);
601 const string moduleTypeElec(hltConfig.
moduleType(moduleLabelElec));
614 for (
unsigned int inde = 0; inde < isoElecs.size(); inde++) {
616 if (deltar < eDeltaRMin) {
621 if (eDeltaRMin <
DRMIN) lMatched =
true;
626 double mDeltaRMin = 500.;
627 unsigned int mIndMatched = 500;
629 const string& moduleLabelMuon(moduleLabels[kMuon]);
630 const string moduleTypeMuon(hltConfig.
moduleType(moduleLabelMuon));
643 for (
unsigned int indm = 0; indm < isoMuons.size(); indm++) {
645 if (deltar < mDeltaRMin) {
650 if (mDeltaRMin <
DRMIN) lMatched =
true;
654 const unsigned int nPFJets(
pfjetIds_.size());
656 double j1DeltaRMin = 500.;
657 double j2DeltaRMin = 500.;
658 double j3DeltaRMin = 500.;
659 unsigned int j1IndMatched = 500;
660 unsigned int j2IndMatched = 500;
661 unsigned int j3IndMatched = 500;
663 const string& moduleLabelJet(moduleLabels[kJet]);
664 const string moduleTypeJet(hltConfig.
moduleType(moduleLabelJet));
677 for (
unsigned int indj = 0; indj < correctedJets.size(); indj++) {
679 if (deltar1 < j1DeltaRMin) {j1DeltaRMin = deltar1; j1IndMatched = indj;}
682 if (deltar2 < j2DeltaRMin) {j2DeltaRMin = deltar2; j2IndMatched = indj;}
685 if (deltar3 < j3DeltaRMin) {j3DeltaRMin = deltar3; j3IndMatched = indj;}
689 if (nPFJets > 0 && j1DeltaRMin <
DRMIN) j1Matched =
true;
690 if (nPFJets > 1 && j2DeltaRMin <
DRMIN) j2Matched =
true;
691 if (nPFJets > 2 && j3DeltaRMin <
DRMIN) j3Matched =
true;
694 if (eIndMatched < 500) {
695 fill(
"leptDeltaREta_", isoElecs[eIndMatched]->
eta(), eDeltaRMin);
696 if (lMatched)
fill(
"leptResolution_", fabs(isoElecs[eIndMatched]->
pt()-
electronRefs_[0]->
pt())/isoElecs[eIndMatched]->
pt() );
699 if (mIndMatched < 500) {
700 fill(
"leptDeltaREta_", isoMuons[mIndMatched]->
eta(), mDeltaRMin);
701 if (lMatched)
fill(
"leptResolution_", fabs(isoMuons[mIndMatched]->
pt()-
muonRefs_[0]->
pt())/isoMuons[mIndMatched]->
pt() );
704 if (lMatched)
fill(
"matchingMon_", 0.5 );
705 else isMatched =
false;
707 if (j1IndMatched < 500) {
708 fill(
"jetDeltaREta_", correctedJets[j1IndMatched].
eta(), j1DeltaRMin);
710 fill(
"jetResolution_", fabs(correctedJets[j1IndMatched].
pt()-
pfjetRefs_[0]->
pt())/correctedJets[j1IndMatched].
pt() );
711 fill(
"matchingMon_", 1.5 );
713 else isMatched =
false;
714 if (j2IndMatched < 500) {
715 fill(
"jetDeltaREta_", correctedJets[j2IndMatched].
eta(), j2DeltaRMin);
717 fill(
"jetResolution_", fabs(correctedJets[j2IndMatched].
pt()-
pfjetRefs_[1]->
pt())/correctedJets[j2IndMatched].
pt() );
718 fill(
"matchingMon_", 2.5 );
720 else isMatched =
false;
721 if (j3IndMatched < 500) {
722 fill(
"jetDeltaREta_", correctedJets[j3IndMatched].
eta(), j3DeltaRMin);
724 fill(
"jetResolution_", fabs(correctedJets[j3IndMatched].
pt()-
pfjetRefs_[2]->
pt())/correctedJets[j3IndMatched].
pt() );
725 fill(
"matchingMon_", 3.5 );
727 else isMatched =
false;
731 if (isMatched)
fill(
"matchingMon_", 4.5 );
763 std::vector<edm::ParameterSet>
sel=cfg.
getParameter<std::vector<edm::ParameterSet> >(
"selection");
764 for(
unsigned int i=0;
i<sel.size(); ++
i){
775 if (
type ==
"muons"){
778 if (
type ==
"elecs"){
784 if (
type ==
"jets/pf"){
787 if (
type ==
"jets/calo"){
805 <<
"Config extraction failure with process name "
823 if(vertex->empty() || !(*vertexSelect_)(vertex->front()))
return;
846 for(std::vector<std::string>::const_iterator selIt2=
selectionOrder_.begin(); selIt2<=selIt; ++selIt2){
850 if(type2==
"Hlt" || type2==
"empty" )
continue;
856 if ( !passSel )
continue;
868 sel.second.second->book(i);
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerSummaryTokenAOD
T getParameter(std::string const &) const
bool hasRawTriggerSummary
virtual void analyze(const edm::Event &event, const edm::EventSetup &setup) override
const std::string moduleType(const std::string &module) const
C++ class name of module.
HLTConfigProvider hltConfig_
bool existsAs(std::string const ¶meterName, bool trackiness=true) const
checks if a parameter exists as a given type
Jets made from CaloTowers.
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
static const double WMASS
bool getByToken(EDGetToken token, Handle< PROD > &result) const
int logged_
number of logged interesting events
std::string jetCorrector_
jetCorrector
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.
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
trigger::VRelectron electronRefs_
edm::EDGetTokenT< edm::View< reco::GsfElectron > > elecs_
input sources for monitoring
std::string selectionStep(const std::string &label)
double lowerEdge_
mass window upper and lower edge
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
Jets made from PFObjects.
static const double DRMIN
const eventsetup::EventSetupRecord * find(const eventsetup::EventSetupRecordKey &) const
static const unsigned int MAXJETS
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
unsigned int triggerIndex(std::string const &name) const
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
virtual void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) override
do this during the event loop
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_
std::vector< std::string > triggerPaths_
edm::EDGetTokenT< reco::JetTagCollection > btagEff_
btag discriminator labels
MonitorElement * book1D(Args &&...args)
std::string label_
instance label
bool isMatched(TrackingRecHit const &hit)
void triggerBinLabels(std::string channel, const std::vector< std::string > &labels)
set configurable labels for trigger monitoring histograms
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
trigger::VRpfjet pfjetRefs_
string key
FastSim: produces sample of signal events, overlayed with premixed minbias events.
edm::EDGetTokenT< trigger::TriggerEventWithRefs > triggerSummaryTokenRAW
edm::EDGetTokenT< edm::View< reco::Vertex > > pvs_
double tmassWBoson(reco::RecoCandidate *mu, const reco::MET &met, const reco::Jet &b)
calculate W boson transverse mass estimate
const std::string & processName() const
process name
std::vector< std::string > triggerPaths_
trigger paths
const std::vector< std::string > & moduleLabels(unsigned int trigger) const
label(s) of module(s) on a trigger path
double deltaR(double eta1, double eta2, double phi1, double phi2)
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)
std::string processName_
hlt objects
edm::EDGetTokenT< reco::BeamSpot > beamspot_
beamspot
bool acceptHLT(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
MonitorElement * book2D(Args &&...args)
double btagEffWP_
btag working points
static const double DRMIN
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d'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 ...
edm::EDGetTokenT< edm::View< reco::Jet > > jets_
std::string objectType(const std::string &label)
TopSingleLeptonHLTOfflineDQM(const edm::ParameterSet &cfg)
default constructor
boost::indirect_iterator< typename seq_t::const_iterator > const_iterator
edm::EDGetTokenT< edm::TriggerResults > triggerTable_
trigger table
trigger::VRmuon muonRefs_
bool isUninitialized() const
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
static std::string const triggerPaths
static const double WMASS
tuple size
Write out results.
trigger::Vids electronIds_