Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

first DQM based HLT MET monitoring code #17231

Merged
merged 8 commits into from Feb 8, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions DQMOffline/Configuration/python/DQMOfflineHeavyIons_cff.py
Expand Up @@ -46,6 +46,7 @@


triggerOfflineDQMSource.remove(jetMETHLTOfflineAnalyzer)
triggerOfflineDQMSource.remove(exoticaMonitorHLT)

#egammaDQMOffline.remove(electronAnalyzerSequence)
egammaDQMOffline.remove(zmumugammaAnalysis)
Expand Down
3 changes: 3 additions & 0 deletions DQMOffline/Trigger/plugins/BuildFile.xml
Expand Up @@ -6,6 +6,7 @@
<use name="DataFormats/HLTReco"/>
<use name="DataFormats/MuonReco"/>
<use name="DataFormats/EgammaReco"/>
<use name="DataFormats/EgammaCandidates"/>
<use name="DataFormats/TrackReco"/>
<use name="DataFormats/TrajectorySeed"/>
<use name="DataFormats/BTauReco"/>
Expand All @@ -17,6 +18,8 @@
<use name="HLTrigger/HLTcore"/>
<use name="CondFormats/DataRecord"/>
<use name="DQMServices/Core"/>
<use name="CommonTools/Utils"/>
<use name="CommonTools/TriggerUtils"/>
<use name="root"/>
<use name="roofit"/>
<use name="boost"/>
Expand Down
278 changes: 278 additions & 0 deletions DQMOffline/Trigger/plugins/METMonitor.cc
@@ -0,0 +1,278 @@
#include "DQMOffline/Trigger/plugins/METMonitor.h"

#include "FWCore/MessageLogger/interface/MessageLogger.h"

#include "DQM/TrackingMonitor/interface/GetLumi.h"

#include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h"


double MAX_PHI = 3.2;
int N_PHI = 64;
MEbinning phi_binning_{
N_PHI, -MAX_PHI, MAX_PHI
};
// -----------------------------
// constructors and destructor
// -----------------------------

METMonitor::METMonitor( const edm::ParameterSet& iConfig ) :
folderName_ ( iConfig.getParameter<std::string>("FolderName") )
, metToken_ ( consumes<reco::PFMETCollection> (iConfig.getParameter<edm::InputTag>("met") ) )
, jetToken_ ( mayConsume<reco::PFJetCollection> (iConfig.getParameter<edm::InputTag>("jets") ) )
, eleToken_ ( mayConsume<reco::GsfElectronCollection>(iConfig.getParameter<edm::InputTag>("electrons") ) )
, muoToken_ ( mayConsume<reco::MuonCollection> (iConfig.getParameter<edm::InputTag>("muons") ) )
, met_variable_binning_ ( iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double> >("metBinning") )
, met_binning_ ( getHistoPSet (iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet> ("metPSet") ) )
, ls_binning_ ( getHistoLSPSet (iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet> ("lsPSet") ) )
, num_genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig.getParameter<edm::ParameterSet>("numGenericTriggerEventPSet"),consumesCollector(), *this))
, den_genTriggerEventFlag_(new GenericTriggerEventFlag(iConfig.getParameter<edm::ParameterSet>("denGenericTriggerEventPSet"),consumesCollector(), *this))
, metSelection_ ( iConfig.getParameter<std::string>("metSelection") )
, jetSelection_ ( iConfig.getParameter<std::string>("jetSelection") )
, eleSelection_ ( iConfig.getParameter<std::string>("eleSelection") )
, muoSelection_ ( iConfig.getParameter<std::string>("muoSelection") )
, njets_ ( iConfig.getParameter<int>("njets" ) )
, nelectrons_ ( iConfig.getParameter<int>("nelectrons" ) )
, nmuons_ ( iConfig.getParameter<int>("nmuons" ) )
{

metME_.numerator = nullptr;
metME_.denominator = nullptr;
metME_variableBinning_.numerator = nullptr;
metME_variableBinning_.denominator = nullptr;
metVsLS_.numerator = nullptr;
metVsLS_.denominator = nullptr;
metPhiME_.numerator = nullptr;
metPhiME_.denominator = nullptr;

}

METMonitor::~METMonitor()
{
if (num_genTriggerEventFlag_) delete num_genTriggerEventFlag_;
if (den_genTriggerEventFlag_) delete den_genTriggerEventFlag_;
}

MEbinning METMonitor::getHistoPSet(edm::ParameterSet pset)
{
return MEbinning{
pset.getParameter<int32_t>("nbins"),
pset.getParameter<double>("xmin"),
pset.getParameter<double>("xmax"),
};
}

MEbinning METMonitor::getHistoLSPSet(edm::ParameterSet pset)
{
return MEbinning{
pset.getParameter<int32_t>("nbins"),
0.,
double(pset.getParameter<int32_t>("nbins"))
};
}

void METMonitor::setMETitle(METME& me, std::string titleX, std::string titleY)
{
me.numerator->setAxisTitle(titleX,1);
me.numerator->setAxisTitle(titleY,2);
me.denominator->setAxisTitle(titleX,1);
me.denominator->setAxisTitle(titleY,2);

}

void METMonitor::bookME(DQMStore::IBooker &ibooker, METME& me, std::string& histname, std::string& histtitle, int& nbins, double& min, double& max)
{
me.numerator = ibooker.book1D(histname+"_numerator", histtitle+" (numerator)", nbins, min, max);
me.denominator = ibooker.book1D(histname+"_denominator", histtitle+" (denominator)", nbins, min, max);
}
void METMonitor::bookME(DQMStore::IBooker &ibooker, METME& me, std::string& histname, std::string& histtitle, std::vector<double> binning)
{
int nbins = binning.size()-1;
std::vector<float> fbinning(binning.begin(),binning.end());
float* arr = &fbinning[0];
me.numerator = ibooker.book1D(histname+"_numerator", histtitle+" (numerator)", nbins, arr);
me.denominator = ibooker.book1D(histname+"_denominator", histtitle+" (denominator)", nbins, arr);
}
void METMonitor::bookME(DQMStore::IBooker &ibooker, METME& me, std::string& histname, std::string& histtitle, int& nbinsX, double& xmin, double& xmax, double& ymin, double& ymax)
{
me.numerator = ibooker.bookProfile(histname+"_numerator", histtitle+" (numerator)", nbinsX, xmin, xmax, ymin, ymax);
me.denominator = ibooker.bookProfile(histname+"_denominator", histtitle+" (denominator)", nbinsX, xmin, xmax, ymin, ymax);
}
void METMonitor::bookME(DQMStore::IBooker &ibooker, METME& me, std::string& histname, std::string& histtitle, int& nbinsX, double& xmin, double& xmax, int& nbinsY, double& ymin, double& ymax)
{
me.numerator = ibooker.book2D(histname+"_numerator", histtitle+" (numerator)", nbinsX, xmin, xmax, nbinsY, ymin, ymax);
me.denominator = ibooker.book2D(histname+"_denominator", histtitle+" (denominator)", nbinsX, xmin, xmax, nbinsY, ymin, ymax);
}
void METMonitor::bookME(DQMStore::IBooker &ibooker, METME& me, std::string& histname, std::string& histtitle, std::vector<double> binningX, std::vector<double> binningY)
{
int nbinsX = binningX.size()-1;
std::vector<float> fbinningX(binningX.begin(),binningX.end());
float* arrX = &fbinningX[0];
int nbinsY = binningY.size()-1;
std::vector<float> fbinningY(binningY.begin(),binningY.end());
float* arrY = &fbinningY[0];

me.numerator = ibooker.book2D(histname+"_numerator", histtitle+" (numerator)", nbinsX, arrX, nbinsY, arrY);
me.denominator = ibooker.book2D(histname+"_denominator", histtitle+" (denominator)", nbinsX, arrX, nbinsY, arrY);
}

void METMonitor::bookHistograms(DQMStore::IBooker & ibooker,
edm::Run const & iRun,
edm::EventSetup const & iSetup)
{

std::string histname, histtitle;

std::string currentFolder = folderName_ ;
ibooker.setCurrentFolder(currentFolder.c_str());

histname = "met"; histtitle = "PFMET";
bookME(ibooker,metME_,histname,histtitle,met_binning_.nbins,met_binning_.xmin, met_binning_.xmax);
setMETitle(metME_,"PF MET [GeV]","events / [GeV]");

histname = "met_variable"; histtitle = "PFMET";
bookME(ibooker,metME_variableBinning_,histname,histtitle,met_variable_binning_);
setMETitle(metME_variableBinning_,"PF MET [GeV]","events / [GeV]");

histname = "metVsLS"; histtitle = "PFMET vs LS";
bookME(ibooker,metVsLS_,histname,histtitle,ls_binning_.nbins, ls_binning_.xmin, ls_binning_.xmax,met_binning_.xmin, met_binning_.xmax);
setMETitle(metVsLS_,"LS","PF MET [GeV]");

histname = "metPhi"; histtitle = "PFMET phi";
bookME(ibooker,metPhiME_,histname,histtitle, phi_binning_.nbins, phi_binning_.xmin, phi_binning_.xmax);
setMETitle(metPhiME_,"PF MET #phi","events / 0.1 rad");

// Initialize the GenericTriggerEventFlag
if ( num_genTriggerEventFlag_ && num_genTriggerEventFlag_->on() ) num_genTriggerEventFlag_->initRun( iRun, iSetup );
if ( den_genTriggerEventFlag_ && den_genTriggerEventFlag_->on() ) den_genTriggerEventFlag_->initRun( iRun, iSetup );

}

#include "FWCore/Framework/interface/ESHandle.h"
#include "FWCore/Framework/interface/EventSetup.h"
#include "DataFormats/TrackerCommon/interface/TrackerTopology.h"
#include "Geometry/Records/interface/TrackerTopologyRcd.h"
void METMonitor::analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) {

// Filter out events if Trigger Filtering is requested
if (den_genTriggerEventFlag_->on() && ! den_genTriggerEventFlag_->accept( iEvent, iSetup) ) return;

edm::Handle<reco::PFMETCollection> metHandle;
iEvent.getByToken( metToken_, metHandle );
reco::PFMET pfmet = metHandle->front();
if ( ! metSelection_( pfmet ) ) return;

float met = pfmet.pt();
float phi = pfmet.phi();

edm::Handle<reco::PFJetCollection> jetHandle;
iEvent.getByToken( jetToken_, jetHandle );
std::vector<reco::PFJet> jets;
if ( int(jetHandle->size()) < njets_ ) return;
for ( auto const & j : *jetHandle ) {
if ( jetSelection_( j ) ) jets.push_back(j);
}
if ( int(jets.size()) < njets_ ) return;

edm::Handle<reco::GsfElectronCollection> eleHandle;
iEvent.getByToken( eleToken_, eleHandle );
std::vector<reco::GsfElectron> electrons;
if ( int(eleHandle->size()) < nelectrons_ ) return;
for ( auto const & e : *eleHandle ) {
if ( eleSelection_( e ) ) electrons.push_back(e);
}
if ( int(electrons.size()) < nelectrons_ ) return;

edm::Handle<reco::MuonCollection> muoHandle;
iEvent.getByToken( muoToken_, muoHandle );
if ( int(muoHandle->size()) < nmuons_ ) return;
std::vector<reco::Muon> muons;
for ( auto const & m : *muoHandle ) {
if ( muoSelection_( m ) ) muons.push_back(m);
}
if ( int(muons.size()) < nmuons_ ) return;

// filling histograms (denominator)
metME_.denominator -> Fill(met);
metME_variableBinning_.denominator -> Fill(met);
metPhiME_.denominator -> Fill(phi);

int ls = iEvent.id().luminosityBlock();
metVsLS_.denominator -> Fill(ls, met);

// applying selection for numerator
if (num_genTriggerEventFlag_->on() && ! num_genTriggerEventFlag_->accept( iEvent, iSetup) ) return;

// filling histograms (num_genTriggerEventFlag_)
metME_.numerator -> Fill(met);
metME_variableBinning_.numerator -> Fill(met);
metPhiME_.numerator -> Fill(phi);
metVsLS_.numerator -> Fill(ls, met);

}

void METMonitor::fillHistoPSetDescription(edm::ParameterSetDescription & pset)
{
pset.add<int> ( "nbins");
pset.add<double>( "xmin" );
pset.add<double>( "xmax" );
}

void METMonitor::fillHistoLSPSetDescription(edm::ParameterSetDescription & pset)
{
pset.add<int> ( "nbins", 2500);
}

void METMonitor::fillDescriptions(edm::ConfigurationDescriptions & descriptions)
{
edm::ParameterSetDescription desc;
desc.add<std::string> ( "FolderName", "HLT/MET" );

desc.add<edm::InputTag>( "met", edm::InputTag("pfMet") );
desc.add<edm::InputTag>( "jets", edm::InputTag("ak4PFJetsCHS") );
desc.add<edm::InputTag>( "electrons",edm::InputTag("gedGsfElectrons") );
desc.add<edm::InputTag>( "muons", edm::InputTag("muons") );
desc.add<std::string>("metSelection", "pt > 0");
desc.add<std::string>("jetSelection", "pt > 0");
desc.add<std::string>("eleSelection", "pt > 0");
desc.add<std::string>("muoSelection", "pt > 0");
desc.add<int>("njets", 0);
desc.add<int>("nelectrons", 0);
desc.add<int>("nmuons", 0);

edm::ParameterSetDescription genericTriggerEventPSet;
genericTriggerEventPSet.add<bool>("andOr");
genericTriggerEventPSet.add<edm::InputTag>("dcsInputTag", edm::InputTag("scalersRawToDigi") );
genericTriggerEventPSet.add<std::vector<int> >("dcsPartitions",{});
genericTriggerEventPSet.add<bool>("andOrDcs", false);
genericTriggerEventPSet.add<bool>("errorReplyDcs", true);
genericTriggerEventPSet.add<std::string>("dbLabel","");
genericTriggerEventPSet.add<bool>("andOrHlt", true);
genericTriggerEventPSet.add<edm::InputTag>("hltInputTag", edm::InputTag("TriggerResults::HLT") );
genericTriggerEventPSet.add<std::vector<std::string> >("hltPaths",{});
genericTriggerEventPSet.add<std::string>("hltDBKey","");
genericTriggerEventPSet.add<bool>("errorReplyHlt",false);
genericTriggerEventPSet.add<unsigned int>("verbosityLevel",1);

desc.add<edm::ParameterSetDescription>("numGenericTriggerEventPSet", genericTriggerEventPSet);
desc.add<edm::ParameterSetDescription>("denGenericTriggerEventPSet", genericTriggerEventPSet);

edm::ParameterSetDescription histoPSet;
edm::ParameterSetDescription metPSet;
fillHistoPSetDescription(metPSet);
histoPSet.add<edm::ParameterSetDescription>("metPSet", metPSet);
std::vector<double> bins = {0.,20.,40.,60.,80.,90.,100.,110.,120.,130.,140.,150.,160.,170.,180.,190.,200.,220.,240.,260.,280.,300.,350.,400.,450.,1000.};
histoPSet.add<std::vector<double> >("metBinning", bins);

edm::ParameterSetDescription lsPSet;
fillHistoLSPSetDescription(lsPSet);
histoPSet.add<edm::ParameterSetDescription>("lsPSet", lsPSet);

desc.add<edm::ParameterSetDescription>("histoPSet",histoPSet);

descriptions.add("metMonitoring", desc);
}

// Define this as a plug-in
#include "FWCore/Framework/interface/MakerMacros.h"
DEFINE_FWK_MODULE(METMonitor);