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

Xshi hlt photon jet dqm #4946

Merged
merged 28 commits into from
Aug 26, 2014
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
4 changes: 4 additions & 0 deletions DQMOffline/Trigger/python/DQMOffline_Trigger_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,9 @@
# tracking
from DQMOffline.Trigger.TrackingMonitoring_cff import *

# photon jet
from DQMOffline.Trigger.HigPhotonJetHLTOfflineSource_cfi import *

#import DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi
#TrackerCollisionTrackMonHLT = DQM.TrackingMonitor.TrackerCollisionTrackingMonitor_cfi.TrackerCollisionTrackMon.clone()
#TrackerCollisionTrackMonHLT.FolderName = 'HLT/Tracking'
Expand All @@ -82,6 +85,7 @@
hltInclusiveVBFSource *
# TrackerCollisionTrackMonHLT *
trackingMonitorHLT *
higPhotonJetHLTOfflineSource *
dqmEnvHLT *
topHLTriggerOfflineDQM)

Expand Down
44 changes: 44 additions & 0 deletions DQMOffline/Trigger/python/HigPhotonJetHLTOfflineSource_cfi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import FWCore.ParameterSet.Config as cms

higPhotonJetHLTOfflineSource = cms.EDAnalyzer(
"HigPhotonJetHLTOfflineSource",
# Used when fetching triggerSummary and triggerResults
hltProcessName = cms.string("HLT"),
# HLT paths passing any one of these regular expressions will be included
hltPathsToCheck = cms.vstring(
"HLT_Photon22_R9Id90_HE10_Iso40_EBOnly_PFMET40_v",
"HLT_Photon36_R9Id90_HE10_Iso40_EBOnly_PFMET40_v",
"HLT_Photon50_R9Id90_HE10_Iso40_EBOnly_PFMET40_v",
"HLT_Photon75_R9Id90_HE10_Iso40_EBOnly_PFMET40_v",
"HLT_Photon90_R9Id90_HE10_Iso40_EBOnly_PFMET40_v",
"HLT_Photon135_PFMET40_v",
"HLT_Photon150_PFMET40_v",
"HLT_Photon160_PFMET40_v",
"HLT_Photon250_NoHE_PFMET40_v",
"HLT_Photon300_NoHE_PFMET40_v",
"HLT_Photon22_R9Id90_HE10_Iso40_EBOnly_VBF_v",
"HLT_Photon36_R9Id90_HE10_Iso40_EBOnly_VBF_v",
"HLT_Photon50_R9Id90_HE10_Iso40_EBOnly_VBF_v",
"HLT_Photon75_R9Id90_HE10_Iso40_EBOnly_VBF_v",
"HLT_Photon90_R9Id90_HE10_Iso40_EBOnly_VBF_v",
"HLT_Photon135_VBF_v",
"HLT_Photon150_VBF_v",
"HLT_Photon160_VBF_v",
"HLT_Photon250_NoHE_VBF_v",
"HLT_Photon300_NoHE_VBF_v",
),
# Location of plots in DQM
dirname = cms.untracked.string("HLT/Higgs/PhotonJet"),
verbose = cms.untracked.bool(False), # default: False
triggerAccept = cms.untracked.bool(True), # default: True
triggerResultsToken = cms.InputTag("TriggerResults"),
pvToken = cms.InputTag("offlinePrimaryVertices"),
photonsToken = cms.InputTag("gedPhotons"),
pfMetToken = cms.InputTag("pfMet"),
pfJetsToken = cms.InputTag("ak4PFJets"),

# cuts
pfjetMinPt = cms.untracked.double(30.0), #GeV
photonMinPt = cms.untracked.double(20.0), #GeV

)
313 changes: 313 additions & 0 deletions DQMOffline/Trigger/src/HigPhotonJetHLTOfflineSource.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,313 @@
// -*- C++ -*-
//
// Package: HigPhotonJetHLTOfflineSource
// Class: HigPhotonJetHLTOfflineSource
//

//
// Author: Xin Shi <Xin.Shi@cern.ch>
// Created: 2014.07.22
//

// system include files
#include <memory>
#include <iostream>

// user include files
#include "DQMServices/Core/interface/DQMStore.h"
#include "DQMServices/Core/interface/MonitorElement.h"
#include "DQMServices/Core/interface/DQMEDAnalyzer.h"

#include "FWCore/Framework/interface/Frameworkfwd.h"
#include "FWCore/Framework/interface/ConsumesCollector.h"
#include "FWCore/Framework/interface/MakerMacros.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "FWCore/Common/interface/TriggerNames.h"

#include "HLTrigger/HLTcore/interface/HLTConfigProvider.h"

#include "DataFormats/Common/interface/TriggerResults.h"
#include "DataFormats/JetReco/interface/CaloJetCollection.h"
#include "DataFormats/VertexReco/interface/Vertex.h"
#include "DataFormats/VertexReco/interface/VertexFwd.h"
#include "DataFormats/EgammaCandidates/interface/Photon.h"
#include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
#include "DataFormats/METReco/interface/PFMETCollection.h"
#include "DataFormats/METReco/interface/PFMET.h"
#include "DataFormats/JetReco/interface/PFJetCollection.h"
#include "DataFormats/JetReco/interface/PFJet.h"
#include "DataFormats/Math/interface/deltaPhi.h"

#include <TLorentzVector.h>
#include <TH2F.h>

// Define the interface
class HigPhotonJetHLTOfflineSource : public DQMEDAnalyzer {

public:

explicit HigPhotonJetHLTOfflineSource(const edm::ParameterSet&);

private:

// Analyzer Methods
virtual void dqmBeginRun(const edm::Run &,
const edm::EventSetup &) override;
virtual void bookHistograms(DQMStore::IBooker &,
edm::Run const &,
edm::EventSetup const &) override;
virtual void analyze(const edm::Event &,
const edm::EventSetup &) override;
virtual void endRun(const edm::Run &,
const edm::EventSetup &) override;
bool isMonitoredTriggerAccepted(const edm::TriggerNames,
const edm::Handle<edm::TriggerResults>);

// Input from Configuration File
edm::ParameterSet pset_;
std::string hltProcessName_;
std::vector<std::string> hltPathsToCheck_;
std::string dirname_;
bool verbose_;
bool triggerAccept_;

edm::EDGetTokenT <edm::TriggerResults> triggerResultsToken_;
edm::EDGetTokenT<reco::VertexCollection> pvToken_;
edm::EDGetTokenT<reco::PhotonCollection> photonsToken_;
edm::EDGetTokenT<reco::PFMETCollection> pfMetToken_;
edm::EDGetTokenT<reco::PFJetCollection> pfJetsToken_;

double pfjetMinPt_;
double photonMinPt_;

// Member Variables

MonitorElement* nvertices_;
MonitorElement* nphotons_;
MonitorElement* photonpt_;
MonitorElement* photonrapidity_;
MonitorElement* pfmet_;
MonitorElement* pfmetphi_;
MonitorElement* npfjets_;
MonitorElement* delphiphomet_;
MonitorElement* delphijetmet_;
MonitorElement* invmassjj_;
MonitorElement* deletajj_;
MonitorElement* triggers_;
MonitorElement* trigvsnvtx_;

double evtsrun_;

};


// Class Methods

HigPhotonJetHLTOfflineSource::HigPhotonJetHLTOfflineSource(const edm::ParameterSet& pset) :
pset_(pset)
{
hltProcessName_ = pset.getParameter<std::string>("hltProcessName");
hltPathsToCheck_ = pset.getParameter<std::vector<std::string>>("hltPathsToCheck");
verbose_ = pset.getUntrackedParameter<bool>("verbose", false);
triggerAccept_ = pset.getUntrackedParameter<bool>("triggerAccept", true);
triggerResultsToken_ = consumes <edm::TriggerResults> (pset.getParameter<edm::InputTag>("triggerResultsToken"));
dirname_ = pset.getUntrackedParameter<std::string>("dirname", std::string("HLT/Higgs/PhotonJet/"));
pvToken_ = consumes<reco::VertexCollection> (pset.getParameter<edm::InputTag>("pvToken"));
photonsToken_ = consumes<reco::PhotonCollection> (pset.getParameter<edm::InputTag>("photonsToken"));
pfMetToken_ = consumes<reco::PFMETCollection> (pset.getParameter<edm::InputTag>("pfMetToken"));
pfJetsToken_ = consumes<reco::PFJetCollection> (pset.getParameter<edm::InputTag>("pfJetsToken"));
pfjetMinPt_ = pset.getUntrackedParameter<double>("pfjetMinPt", 0.0);
photonMinPt_ = pset.getUntrackedParameter<double>("photonMinPt", 0.0);
}

void
HigPhotonJetHLTOfflineSource::dqmBeginRun(const edm::Run & iRun,
const edm::EventSetup & iSetup)
{ // Initialize hltConfig
HLTConfigProvider hltConfig;
bool changedConfig;
if (!hltConfig.init(iRun, iSetup, hltProcessName_, changedConfig)) {
edm::LogError("HLTPhotonJetVal") << "Initialization of HLTConfigProvider failed!!";
return;
}

evtsrun_ = 0;
}


void
HigPhotonJetHLTOfflineSource::bookHistograms(DQMStore::IBooker & iBooker,
edm::Run const & iRun,
edm::EventSetup const & iSetup)
{
iBooker.setCurrentFolder(dirname_);
nvertices_ = iBooker.book1D("nvertices", "Number of vertices", 100, 0, 100);
nphotons_ = iBooker.book1D("nphotons", "Number of photons", 100, 0, 10);
photonpt_ = iBooker.book1D("photonpt", "Photons pT", 100, 0, 500);
photonrapidity_ = iBooker.book1D("photonrapidity", "Photons rapidity;y_{#gamma}", 100, -2.5, 2.5);
pfmet_ = iBooker.book1D("pfmet", "PF MET", 100, 0, 250);
pfmetphi_ = iBooker.book1D("pfmetphi", "PF MET phi;#phi_{PFMET}", 100, -4, 4);
delphiphomet_ = iBooker.book1D("delphiphomet", "#Delta#phi(photon, MET);#Delta#phi(#gamma,MET)", 100, 0, 4);
npfjets_ = iBooker.book1D("npfjets", "Number of PF Jets", 100, 0, 20);
delphijetmet_ = iBooker.book1D("delphijetmet", "#Delta#phi(PFJet, MET);#Delta#phi(Jet,MET)", 100, 0, 4);
invmassjj_ = iBooker.book1D("invmassjj", "Inv mass two leading jets;M_{jj}[GeV]", 100, 0, 2000);
deletajj_ = iBooker.book1D("deletajj", "#Delta#eta(jj);|#Delta#eta_{jj}|", 100, 0, 6);
triggers_ = iBooker.book1D("triggers", "Triggers", hltPathsToCheck_.size(), 0, hltPathsToCheck_.size());
trigvsnvtx_ = iBooker.book2D("trigvsnvtx", "Trigger vs. # vertices;N_{vertices};Trigger", 100, 0, 100, hltPathsToCheck_.size(), 0, hltPathsToCheck_.size());
}


void
HigPhotonJetHLTOfflineSource::analyze(const edm::Event& iEvent,
const edm::EventSetup& iSetup)
{
// Count total number of events in one run
evtsrun_++;

edm::Handle<edm::TriggerResults> triggerResults;
iEvent.getByToken(triggerResultsToken_, triggerResults);
if(!triggerResults.isValid()) {
edm::LogError("HigPhotonJetHLT")<<"Missing triggerResults collection" << std::endl;
return;
}

// Check whether contains monitored trigger and accepted
const edm::TriggerNames triggerNames = iEvent.triggerNames(*triggerResults);
bool triggered = isMonitoredTriggerAccepted(triggerNames, triggerResults);

if (!triggered) return;

// Test scale
// if (evtsrun_ > 10) return;

// N Vertices
edm::Handle<reco::VertexCollection> vertices;
iEvent.getByToken(pvToken_, vertices);
if(!vertices.isValid()) return;
if (verbose_)
std::cout << "xshi:: N vertices : " << vertices->size() << std::endl;

// Set trigger name labels
for (size_t i = 0; i < hltPathsToCheck_.size(); i++) {
triggers_->setBinLabel(i+1, hltPathsToCheck_[i]);
}

// Fill trigger info
for (unsigned int itrig = 0; itrig < triggerResults->size(); itrig++){
std::string triggername = triggerNames.triggerName(itrig);
for (size_t i = 0; i < hltPathsToCheck_.size(); i++) {
if ( triggername.find(hltPathsToCheck_[i]) != std::string::npos) {
triggers_->Fill(i);
trigvsnvtx_->Fill(vertices->size(), i);
}
}
}

nvertices_->Fill(vertices->size());

// PF MET
edm::Handle<reco::PFMETCollection> pfmets;
iEvent.getByToken(pfMetToken_, pfmets);
if (!pfmets.isValid()) return;
const reco::PFMET pfmet = pfmets->front();
pfmet_->Fill(pfmet.et());
if (verbose_)
std::cout << "xshi:: number of pfmets: " << pfmets->size() << std::endl;
pfmetphi_->Fill(pfmet.phi());

// Photons
edm::Handle<reco::PhotonCollection> photons;
iEvent.getByToken(photonsToken_, photons);
if(!photons.isValid()) return;
int nphotons = 0;
for(reco::PhotonCollection::const_iterator phoIter=photons->begin();
phoIter!=photons->end();++phoIter){
if (phoIter->pt() < photonMinPt_ ) continue;
nphotons++;
photonpt_->Fill(phoIter->pt());
photonrapidity_->Fill(phoIter->rapidity());
double tmp_delphiphomet = fabs(deltaPhi(phoIter->phi(), pfmet.phi()));
delphiphomet_->Fill(tmp_delphiphomet);
}
nphotons_->Fill(nphotons);

// PF Jet
edm::Handle<reco::PFJetCollection> pfjets;
iEvent.getByToken(pfJetsToken_, pfjets);
if(!pfjets.isValid()) return;
if (verbose_)
std::cout << "xshi:: N pfjets : " << pfjets->size() << std::endl;

double min_delphijetmet = 6.0;
TLorentzVector p4jet1, p4jet2, p4jj;
// Two leading jets eta
double etajet1(0), etajet2(0);
int njet = 0;
for(reco::PFJetCollection::const_iterator jetIter=pfjets->begin();
jetIter!=pfjets->end();++jetIter){
if (jetIter->pt() < pfjetMinPt_ ) continue;
njet++;

double tmp_delphijetmet = fabs(deltaPhi(jetIter->phi(), pfmet.phi()));
if (tmp_delphijetmet < min_delphijetmet)
min_delphijetmet = tmp_delphijetmet;

if (njet == 1) {
p4jet1.SetXYZM(jetIter->px(), jetIter->py(), jetIter->pz(), jetIter->mass());
etajet1 = jetIter->eta();
}
if (njet == 2){
p4jet2.SetXYZM(jetIter->px(), jetIter->py(), jetIter->pz(), jetIter->mass());
etajet2 = jetIter->eta();
}
}
npfjets_->Fill(njet);

delphijetmet_->Fill(min_delphijetmet);
p4jj = p4jet1 + p4jet2;
double deletajj = etajet1 - etajet2 ;
if (verbose_)
std::cout << "xshi:: invmass jj " << p4jj.M() << std::endl;

invmassjj_->Fill(p4jj.M());
deletajj_->Fill(deletajj);
}


void
HigPhotonJetHLTOfflineSource::endRun(const edm::Run & iRun,
const edm::EventSetup& iSetup)
{
// Normalize to the total number of events in the run
TH2F* h = trigvsnvtx_->getTH2F();
double norm = evtsrun_*hltPathsToCheck_.size()/h->Integral();
h->Scale(norm);
if (verbose_) {
std::cout << "xshi:: endRun total number of events: " << evtsrun_
<< ", integral = " << h->Integral()
<< ", norm = " << norm << std::endl;
}
}

bool
HigPhotonJetHLTOfflineSource::isMonitoredTriggerAccepted(const edm::TriggerNames triggerNames,
const edm::Handle<edm::TriggerResults> triggerResults )
{
for (unsigned int itrig = 0; itrig < triggerResults->size(); itrig++){
// Only consider the triggered case.
if ( triggerAccept_ && ( (*triggerResults)[itrig].accept() != 1) ) continue;
std::string triggername = triggerNames.triggerName(itrig);
for (size_t i = 0; i < hltPathsToCheck_.size(); i++) {
if ( triggername.find(hltPathsToCheck_[i]) != std::string::npos) {
return true;
}
}
}

return false;
}

//define this as a plug-in
DEFINE_FWK_MODULE(HigPhotonJetHLTOfflineSource);