CMS 3D CMS Logo

HigPhotonJetHLTOfflineSource.cc
Go to the documentation of this file.
1 // -*- C++ -*-
2 //
3 // Package: HigPhotonJetHLTOfflineSource
4 // Class: HigPhotonJetHLTOfflineSource
5 //
6 
7 //
8 // Author: Xin Shi <Xin.Shi@cern.ch>
9 // Created: 2014.07.22
10 //
11 
12 // system include files
13 #include <memory>
14 #include <iostream>
15 
16 // user include files
19 
27 
29 
41 
42 #include <TLorentzVector.h>
43 #include <TH2F.h>
44 
45 // Define the interface
47 public:
49 
50 private:
51  // Analyzer Methods
52  void dqmBeginRun(const edm::Run&, const edm::EventSetup&) override;
53  void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
54  void analyze(const edm::Event&, const edm::EventSetup&) override;
55  void dqmEndRun(const edm::Run&, const edm::EventSetup&) override;
57 
58  // Input from Configuration File
61  std::vector<std::string> hltPathsToCheck_;
63  bool verbose_;
65 
71 
72  double pfjetMinPt_;
73  double photonMinPt_;
74 
75  // Member Variables
76 
103 
104  double evtsrun_;
105 };
106 
107 // Class Methods
108 
110  hltProcessName_ = pset.getParameter<std::string>("hltProcessName");
111  hltPathsToCheck_ = pset.getParameter<std::vector<std::string>>("hltPathsToCheck");
112  verbose_ = pset.getUntrackedParameter<bool>("verbose", false);
113  triggerAccept_ = pset.getUntrackedParameter<bool>("triggerAccept", true);
114  triggerResultsToken_ = consumes<edm::TriggerResults>(pset.getParameter<edm::InputTag>("triggerResultsToken"));
115  dirname_ = pset.getUntrackedParameter<std::string>("dirname", std::string("HLT/Higgs/PhotonJet/"));
116  pvToken_ = consumes<reco::VertexCollection>(pset.getParameter<edm::InputTag>("pvToken"));
117  photonsToken_ = consumes<reco::PhotonCollection>(pset.getParameter<edm::InputTag>("photonsToken"));
118  pfMetToken_ = consumes<reco::PFMETCollection>(pset.getParameter<edm::InputTag>("pfMetToken"));
119  pfJetsToken_ = consumes<reco::PFJetCollection>(pset.getParameter<edm::InputTag>("pfJetsToken"));
120  pfjetMinPt_ = pset.getUntrackedParameter<double>("pfjetMinPt", 0.0);
121  photonMinPt_ = pset.getUntrackedParameter<double>("photonMinPt", 0.0);
122 }
123 
125  const edm::EventSetup& iSetup) { // Initialize hltConfig
127  bool changedConfig;
128  if (!hltConfig.init(iRun, iSetup, hltProcessName_, changedConfig)) {
129  edm::LogError("HLTPhotonJetVal") << "Initialization of HLTConfigProvider failed!!";
130  return;
131  }
132 
133  evtsrun_ = 0;
134 }
135 
137  edm::Run const& iRun,
138  edm::EventSetup const& iSetup) {
139  iBooker.setCurrentFolder(dirname_);
140  nvertices_reco_ = iBooker.book1D("nvertices_reco", "Reco: Number of vertices", 100, 0, 100);
141  nvertices_ = iBooker.book1D("nvertices", "Number of vertices", 100, 0, 100);
142  nphotons_reco_ = iBooker.book1D("nphotons_reco", "Reco: Number of photons", 100, 0, 10);
143  nphotons_ = iBooker.book1D("nphotons", "Number of photons", 100, 0, 10);
144  photonpt_reco_ = iBooker.book1D("photonpt_reco", "Reco: Photons pT", 100, 0, 500);
145  photonpt_ = iBooker.book1D("photonpt", "Photons pT", 100, 0, 500);
146  photonrapidity_reco_ = iBooker.book1D("photonrapidity_reco", "Reco: Photons rapidity;y_{#gamma}", 100, -2.5, 2.5);
147  photonrapidity_ = iBooker.book1D("photonrapidity", "Photons rapidity;y_{#gamma}", 100, -2.5, 2.5);
148  pfmet_reco_ = iBooker.book1D("pfmet_reco", "Reco: PF MET", 100, 0, 250);
149  pfmet_ = iBooker.book1D("pfmet", "PF MET", 100, 0, 250);
150  pfmetphi_reco_ = iBooker.book1D("pfmetphi_reco", "Reco: PF MET phi;#phi_{PFMET}", 100, -4, 4);
151  pfmetphi_ = iBooker.book1D("pfmetphi", "PF MET phi;#phi_{PFMET}", 100, -4, 4);
153  iBooker.book1D("delphiphomet_reco", "Reco: #Delta#phi(photon, MET);#Delta#phi(#gamma,MET)", 100, 0, 4);
154  delphiphomet_ = iBooker.book1D("delphiphomet", "#Delta#phi(photon, MET);#Delta#phi(#gamma,MET)", 100, 0, 4);
155  npfjets_reco_ = iBooker.book1D("npfjets_reco", "Reco: Number of PF Jets", 100, 0, 20);
156  npfjets_ = iBooker.book1D("npfjets", "Number of PF Jets", 100, 0, 20);
158  iBooker.book1D("delphijetmet_reco", "Reco: #Delta#phi(PFJet, MET);#Delta#phi(Jet,MET)", 100, 0, 4);
159  delphijetmet_ = iBooker.book1D("delphijetmet", "#Delta#phi(PFJet, MET);#Delta#phi(Jet,MET)", 100, 0, 4);
160  invmassjj_reco_ = iBooker.book1D("invmassjj_reco", "Reco: Inv mass two leading jets;M_{jj}[GeV]", 100, 0, 2000);
161  invmassjj_ = iBooker.book1D("invmassjj", "Inv mass two leading jets;M_{jj}[GeV]", 100, 0, 2000);
162  deletajj_reco_ = iBooker.book1D("deletajj_reco", "Reco: #Delta#eta(jj);|#Delta#eta_{jj}|", 100, 0, 6);
163  deletajj_ = iBooker.book1D("deletajj", "#Delta#eta(jj);|#Delta#eta_{jj}|", 100, 0, 6);
165  iBooker.book1D("triggers_reco", "Reco: Triggers", hltPathsToCheck_.size(), 0, hltPathsToCheck_.size());
166  triggers_ = iBooker.book1D("triggers", "Triggers", hltPathsToCheck_.size(), 0, hltPathsToCheck_.size());
167  trigvsnvtx_reco_ = iBooker.book2D("trigvsnvtx_reco",
168  "Reco: Trigger vs. # vertices;N_{vertices};Trigger",
169  100,
170  0,
171  100,
172  hltPathsToCheck_.size(),
173  0,
174  hltPathsToCheck_.size());
175  trigvsnvtx_ = iBooker.book2D("trigvsnvtx",
176  "Trigger vs. # vertices;N_{vertices};Trigger",
177  100,
178  0,
179  100,
180  hltPathsToCheck_.size(),
181  0,
182  hltPathsToCheck_.size());
183 }
184 
186  // Count total number of events in one run
187  evtsrun_++;
188 
190  iEvent.getByToken(triggerResultsToken_, triggerResults);
191  if (!triggerResults.isValid()) {
192  edm::LogError("HigPhotonJetHLT") << "Missing triggerResults collection" << std::endl;
193  return;
194  }
195 
196  // Check whether contains monitored trigger and accepted
197  const edm::TriggerNames& triggerNames = iEvent.triggerNames(*triggerResults);
198  bool triggered = isMonitoredTriggerAccepted(triggerNames, triggerResults);
199 
200  // if (!triggered) return;
201 
202  // Test scale
203  // if (evtsrun_ > 10) return;
204 
205  // N Vertices
207  iEvent.getByToken(pvToken_, vertices);
208  if (!vertices.isValid())
209  return;
210  if (verbose_)
211  std::cout << "xshi:: N vertices : " << vertices->size() << std::endl;
212 
213  // Set trigger name labels
214  for (size_t i = 0; i < hltPathsToCheck_.size(); i++) {
216  }
217 
218  // Fill trigger info
219  for (unsigned int itrig = 0; itrig < triggerResults->size(); itrig++) {
220  const std::string& triggername = triggerNames.triggerName(itrig);
221  for (size_t i = 0; i < hltPathsToCheck_.size(); i++) {
222  if (triggername.find(hltPathsToCheck_[i]) != std::string::npos) {
223  triggers_reco_->Fill(i);
224  trigvsnvtx_reco_->Fill(vertices->size(), i);
225  if (triggered)
226  triggers_->Fill(i);
227  if (triggered)
228  trigvsnvtx_->Fill(vertices->size(), i);
229  }
230  }
231  }
232 
233  nvertices_reco_->Fill(vertices->size());
234  if (triggered)
235  nvertices_->Fill(vertices->size());
236 
237  // PF MET
239  iEvent.getByToken(pfMetToken_, pfmets);
240  if (!pfmets.isValid())
241  return;
242  const reco::PFMET pfmet = pfmets->front();
243  pfmet_reco_->Fill(pfmet.et());
244  if (triggered)
245  pfmet_->Fill(pfmet.et());
246  if (verbose_)
247  std::cout << "xshi:: number of pfmets: " << pfmets->size() << std::endl;
248 
249  pfmetphi_reco_->Fill(pfmet.phi());
250  if (triggered)
251  pfmetphi_->Fill(pfmet.phi());
252 
253  // Photons
255  iEvent.getByToken(photonsToken_, photons);
256  if (!photons.isValid())
257  return;
258  int nphotons = 0;
259  for (auto const& phoIter : *photons) {
260  if (phoIter.pt() < photonMinPt_)
261  continue;
262  nphotons++;
263  photonpt_reco_->Fill(phoIter.pt());
264  photonrapidity_reco_->Fill(phoIter.rapidity());
265  if (triggered)
266  photonpt_->Fill(phoIter.pt());
267  if (triggered)
268  photonrapidity_->Fill(phoIter.rapidity());
269  double tmp_delphiphomet = fabs(deltaPhi(phoIter.phi(), pfmet.phi()));
270  delphiphomet_reco_->Fill(tmp_delphiphomet);
271  if (triggered)
272  delphiphomet_->Fill(tmp_delphiphomet);
273  }
274  nphotons_reco_->Fill(nphotons);
275  if (triggered)
276  nphotons_->Fill(nphotons);
277 
278  // PF Jet
280  iEvent.getByToken(pfJetsToken_, pfjets);
281  if (!pfjets.isValid())
282  return;
283  if (verbose_)
284  std::cout << "xshi:: N pfjets : " << pfjets->size() << std::endl;
285 
286  double min_delphijetmet = 6.0;
287  TLorentzVector p4jet1, p4jet2, p4jj;
288  // Two leading jets eta
289  double etajet1(0), etajet2(0);
290  int njet = 0;
291  for (auto const& jetIter : *pfjets) {
292  if (jetIter.pt() < pfjetMinPt_)
293  continue;
294  njet++;
295 
296  double tmp_delphijetmet = fabs(deltaPhi(jetIter.phi(), pfmet.phi()));
297  if (tmp_delphijetmet < min_delphijetmet)
298  min_delphijetmet = tmp_delphijetmet;
299 
300  if (njet == 1) {
301  p4jet1.SetXYZM(jetIter.px(), jetIter.py(), jetIter.pz(), jetIter.mass());
302  etajet1 = jetIter.eta();
303  }
304  if (njet == 2) {
305  p4jet2.SetXYZM(jetIter.px(), jetIter.py(), jetIter.pz(), jetIter.mass());
306  etajet2 = jetIter.eta();
307  }
308  }
309  npfjets_reco_->Fill(njet);
310  if (triggered)
311  npfjets_->Fill(njet);
312 
313  delphijetmet_reco_->Fill(min_delphijetmet);
314  if (triggered)
315  delphijetmet_->Fill(min_delphijetmet);
316  p4jj = p4jet1 + p4jet2;
317  double deletajj = etajet1 - etajet2;
318  if (verbose_)
319  std::cout << "xshi:: invmass jj " << p4jj.M() << std::endl;
320 
321  invmassjj_reco_->Fill(p4jj.M());
322  deletajj_reco_->Fill(deletajj);
323  if (triggered)
324  invmassjj_->Fill(p4jj.M());
325  if (triggered)
326  deletajj_->Fill(deletajj);
327 }
328 
330  // Normalize to the total number of events in the run
331  TH2F* h = trigvsnvtx_->getTH2F();
332  double integral = h->Integral();
333  double norm = (integral > 0.) ? evtsrun_ * hltPathsToCheck_.size() / integral : 1.;
334  h->Scale(norm);
335  if (verbose_) {
336  std::cout << "xshi:: endRun total number of events: " << evtsrun_ << ", integral = " << h->Integral()
337  << ", norm = " << norm << std::endl;
338  }
339 }
340 
343  for (unsigned int itrig = 0; itrig < triggerResults->size(); itrig++) {
344  // Only consider the triggered case.
345  if (triggerAccept_ && ((*triggerResults)[itrig].accept() != 1))
346  continue;
347  const std::string& triggername = triggerNames.triggerName(itrig);
348  for (auto const& i : hltPathsToCheck_) {
349  if (triggername.find(i) != std::string::npos) {
350  return true;
351  }
352  }
353  }
354 
355  return false;
356 }
357 
358 //define this as a plug-in
MonitorElement * book1D(TString const &name, TString const &title, int const nchX, double const lowX, double const highX)
Definition: DQMStore.cc:239
T getParameter(std::string const &) const
T getUntrackedParameter(std::string const &, T const &) const
edm::EDGetTokenT< reco::PFJetCollection > pfJetsToken_
FWCore Framework interface EventSetupRecordImplementation h
Helper function to determine trigger accepts.
void dqmBeginRun(const edm::Run &, const edm::EventSetup &) override
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
void bookHistograms(DQMStore::IBooker &, edm::Run const &, edm::EventSetup const &) override
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:418
edm::EDGetTokenT< reco::PFMETCollection > pfMetToken_
edm::EDGetTokenT< edm::TriggerResults > triggerResultsToken_
edm::EDGetTokenT< reco::VertexCollection > pvToken_
bool accept(const edm::Event &event, const edm::TriggerResults &triggerTable, const std::string &triggerPath)
Definition: TopDQMHelpers.h:30
int njet
Definition: HydjetWrapper.h:89
void Fill(long long x)
edm::EDGetTokenT< reco::PhotonCollection > photonsToken_
int iEvent
Definition: GenABIO.cc:224
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
double et() const final
transverse energy
unsigned int size() const
Get number of paths stored.
void analyze(const edm::Event &, const edm::EventSetup &) override
static std::string const triggerResults
Definition: EdmProvDump.cc:45
bool isValid() const
Definition: HandleBase.h:70
virtual void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
Integral< F, X >::type integral(const F &f)
Definition: Integral.h:70
HigPhotonJetHLTOfflineSource(const edm::ParameterSet &)
bool isMonitoredTriggerAccepted(const edm::TriggerNames &, const edm::Handle< edm::TriggerResults > &)
std::string const & triggerName(unsigned int index) const
Definition: TriggerNames.cc:22
bool init(const edm::Run &iRun, const edm::EventSetup &iSetup, const std::string &processName, bool &changed)
d&#39;tor
MonitorElement * book2D(TString const &name, TString const &title, int nchX, double lowX, double highX, int nchY, double lowY, double highY)
Definition: DQMStore.cc:266
std::vector< std::string > hltPathsToCheck_
double phi() const final
momentum azimuthal angle
edm::TriggerNames const & triggerNames(edm::TriggerResults const &triggerResults) const override
Definition: Event.cc:265
void dqmEndRun(const edm::Run &, const edm::EventSetup &) override
Definition: Run.h:45