File indexing completed on 2023-03-17 10:58:41
0001 #include <string>
0002 #include <vector>
0003
0004 #include "FWCore/Framework/interface/Frameworkfwd.h"
0005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0006 #include "FWCore/Framework/interface/MakerMacros.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "DQMServices/Core/interface/DQMStore.h"
0009 #include "DQMServices/Core/interface/DQMEDAnalyzer.h"
0010 #include "DQMOffline/Trigger/plugins/TriggerDQMBase.h"
0011 #include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h"
0012 #include "CommonTools/Utils/interface/StringCutObjectSelector.h"
0013 #include "DataFormats/METReco/interface/PFMET.h"
0014 #include "DataFormats/METReco/interface/PFMETCollection.h"
0015 #include "DataFormats/JetReco/interface/PFJet.h"
0016 #include "DataFormats/JetReco/interface/PFJetCollection.h"
0017 #include "DataFormats/MuonReco/interface/Muon.h"
0018 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0019 #include "DataFormats/EgammaCandidates/interface/GsfElectron.h"
0020 #include "DataFormats/EgammaCandidates/interface/GsfElectronFwd.h"
0021 #include "DataFormats/VertexReco/interface/Vertex.h"
0022 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0023
0024 class MuonMonitor : public DQMEDAnalyzer, public TriggerDQMBase {
0025 public:
0026 typedef dqm::reco::MonitorElement MonitorElement;
0027 typedef dqm::reco::DQMStore DQMStore;
0028
0029 MuonMonitor(const edm::ParameterSet&);
0030 ~MuonMonitor() throw() override;
0031
0032 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0033
0034 protected:
0035 void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
0036 void analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) override;
0037
0038 private:
0039 const std::string folderName_;
0040
0041 const bool requireValidHLTPaths_;
0042 bool hltPathsAreValid_;
0043
0044 edm::EDGetTokenT<reco::PFMETCollection> metToken_;
0045 edm::EDGetTokenT<reco::MuonCollection> muonToken_;
0046 edm::EDGetTokenT<reco::VertexCollection> vtxToken_;
0047 edm::EDGetTokenT<edm::View<reco::GsfElectron>> eleToken_;
0048
0049 static constexpr double MAX_PHI = 3.2;
0050 static constexpr int N_PHI = 64;
0051 const MEbinning phi_binning_{N_PHI, -MAX_PHI, MAX_PHI};
0052
0053 static constexpr double MAX_dxy = 2.5;
0054 static constexpr int N_dxy = 50;
0055 const MEbinning dxy_binning_{N_dxy, -MAX_dxy, MAX_dxy};
0056
0057 static constexpr double MAX_ETA = 2.4;
0058 static constexpr int N_ETA = 68;
0059 const MEbinning eta_binning_{N_ETA, -MAX_ETA, MAX_ETA};
0060
0061 std::vector<double> muon_variable_binning_;
0062 std::vector<double> muoneta_variable_binning_;
0063 MEbinning muon_binning_;
0064 MEbinning ls_binning_;
0065 std::vector<double> muPt_variable_binning_2D_;
0066 std::vector<double> elePt_variable_binning_2D_;
0067 std::vector<double> muEta_variable_binning_2D_;
0068 std::vector<double> eleEta_variable_binning_2D_;
0069
0070 ObjME muonME_;
0071 ObjME muonEtaME_;
0072 ObjME muonPhiME_;
0073 ObjME muonME_variableBinning_;
0074 ObjME muonVsLS_;
0075 ObjME muonEtaPhiME_;
0076 ObjME muondxy_;
0077 ObjME muondz_;
0078 ObjME muonEtaME_variableBinning_;
0079 ObjME eleME_variableBinning_;
0080 ObjME eleEtaME_;
0081 ObjME eleEta_muEta_;
0082 ObjME elePt_muPt_;
0083
0084 std::unique_ptr<GenericTriggerEventFlag> num_genTriggerEventFlag_;
0085 std::unique_ptr<GenericTriggerEventFlag> den_genTriggerEventFlag_;
0086
0087 StringCutObjectSelector<reco::MET, true> metSelection_;
0088 StringCutObjectSelector<reco::Muon, true> muonSelection_;
0089 StringCutObjectSelector<reco::GsfElectron, true> eleSelection_;
0090
0091 unsigned int nmuons_;
0092 unsigned int nelectrons_;
0093 };
0094
0095 MuonMonitor::MuonMonitor(const edm::ParameterSet& iConfig)
0096 : folderName_(iConfig.getParameter<std::string>("FolderName")),
0097 requireValidHLTPaths_(iConfig.getParameter<bool>("requireValidHLTPaths")),
0098 hltPathsAreValid_(false),
0099 metToken_(consumes<reco::PFMETCollection>(iConfig.getParameter<edm::InputTag>("met"))),
0100 muonToken_(mayConsume<reco::MuonCollection>(iConfig.getParameter<edm::InputTag>("muons"))),
0101 vtxToken_(mayConsume<reco::VertexCollection>(iConfig.getParameter<edm::InputTag>("vertices"))),
0102 eleToken_(mayConsume<edm::View<reco::GsfElectron>>(iConfig.getParameter<edm::InputTag>("electrons"))),
0103 muon_variable_binning_(
0104 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("muonBinning")),
0105 muoneta_variable_binning_(
0106 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("muonetaBinning")),
0107 muon_binning_(getHistoPSet(
0108 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("muonPSet"))),
0109 ls_binning_(
0110 getHistoPSet(iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<edm::ParameterSet>("lsPSet"))),
0111 muPt_variable_binning_2D_(
0112 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("muPtBinning2D")),
0113 elePt_variable_binning_2D_(
0114 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("elePtBinning2D")),
0115 muEta_variable_binning_2D_(
0116 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("muEtaBinning2D")),
0117 eleEta_variable_binning_2D_(
0118 iConfig.getParameter<edm::ParameterSet>("histoPSet").getParameter<std::vector<double>>("eleEtaBinning2D")),
0119 num_genTriggerEventFlag_(new GenericTriggerEventFlag(
0120 iConfig.getParameter<edm::ParameterSet>("numGenericTriggerEventPSet"), consumesCollector(), *this)),
0121 den_genTriggerEventFlag_(new GenericTriggerEventFlag(
0122 iConfig.getParameter<edm::ParameterSet>("denGenericTriggerEventPSet"), consumesCollector(), *this)),
0123 metSelection_(iConfig.getParameter<std::string>("metSelection")),
0124 muonSelection_(iConfig.getParameter<std::string>("muonSelection")),
0125 eleSelection_(iConfig.getParameter<std::string>("eleSelection")),
0126 nmuons_(iConfig.getParameter<unsigned int>("nmuons")),
0127 nelectrons_(iConfig.getParameter<unsigned int>("nelectrons")) {}
0128
0129 MuonMonitor::~MuonMonitor() throw() {
0130 if (num_genTriggerEventFlag_) {
0131 num_genTriggerEventFlag_.reset();
0132 }
0133 if (den_genTriggerEventFlag_) {
0134 den_genTriggerEventFlag_.reset();
0135 }
0136 }
0137
0138 void MuonMonitor::bookHistograms(DQMStore::IBooker& ibooker, edm::Run const& iRun, edm::EventSetup const& iSetup) {
0139
0140 if (num_genTriggerEventFlag_ && num_genTriggerEventFlag_->on()) {
0141 num_genTriggerEventFlag_->initRun(iRun, iSetup);
0142 }
0143 if (den_genTriggerEventFlag_ && den_genTriggerEventFlag_->on()) {
0144 den_genTriggerEventFlag_->initRun(iRun, iSetup);
0145 }
0146
0147
0148 hltPathsAreValid_ = (num_genTriggerEventFlag_ && den_genTriggerEventFlag_ && num_genTriggerEventFlag_->on() &&
0149 den_genTriggerEventFlag_->on() && num_genTriggerEventFlag_->allHLTPathsAreValid() &&
0150 den_genTriggerEventFlag_->allHLTPathsAreValid());
0151
0152
0153
0154 if (requireValidHLTPaths_ and (not hltPathsAreValid_)) {
0155 return;
0156 }
0157
0158 std::string histname, histtitle;
0159
0160 ibooker.setCurrentFolder(folderName_);
0161
0162 histname = "muon_pt";
0163 histtitle = "muon PT";
0164 bookME(ibooker, muonME_, histname, histtitle, muon_binning_.nbins, muon_binning_.xmin, muon_binning_.xmax);
0165 setMETitle(muonME_, "Muon pT [GeV]", "events / [GeV]");
0166
0167 histname = "muon_pt_variable";
0168 histtitle = "muon PT";
0169 bookME(ibooker, muonME_variableBinning_, histname, histtitle, muon_variable_binning_);
0170 setMETitle(muonME_variableBinning_, "Muon pT [GeV]", "events / [GeV]");
0171
0172 histname = "muonVsLS";
0173 histtitle = "muon pt vs LS";
0174 bookME(ibooker,
0175 muonVsLS_,
0176 histname,
0177 histtitle,
0178 ls_binning_.nbins,
0179 ls_binning_.xmin,
0180 ls_binning_.xmax,
0181 muon_binning_.xmin,
0182 muon_binning_.xmax);
0183 setMETitle(muonVsLS_, "LS", "Muon pT [GeV]");
0184
0185 histname = "muon_phi";
0186 histtitle = "Muon phi";
0187 bookME(ibooker, muonPhiME_, histname, histtitle, phi_binning_.nbins, phi_binning_.xmin, phi_binning_.xmax);
0188 setMETitle(muonPhiME_, "Muon #phi", "events / 0.1 rad");
0189
0190 histname = "muon_eta";
0191 histtitle = "Muon eta";
0192 bookME(ibooker, muonEtaME_, histname, histtitle, eta_binning_.nbins, eta_binning_.xmin, eta_binning_.xmax);
0193 setMETitle(muonEtaME_, "Muon #eta", "events");
0194
0195 histname = "muon_eta_variablebinning";
0196 histtitle = "Muon eta";
0197 bookME(ibooker, muonEtaME_variableBinning_, histname, histtitle, muoneta_variable_binning_);
0198 setMETitle(muonEtaME_variableBinning_, "Muon #eta", "events");
0199
0200 histname = "muon_dxy";
0201 histtitle = "Muon dxy";
0202 bookME(ibooker, muondxy_, histname, histtitle, dxy_binning_.nbins, dxy_binning_.xmin, dxy_binning_.xmax);
0203 setMETitle(muondxy_, "Muon #dxy", "events");
0204
0205 histname = "muon_dz";
0206 histtitle = "Muon dz";
0207 bookME(ibooker, muondz_, histname, histtitle, dxy_binning_.nbins, dxy_binning_.xmin, dxy_binning_.xmax);
0208 setMETitle(muondz_, "Muon #dz", "events");
0209
0210 histname = "muon_etaphi";
0211 histtitle = "Muon eta-phi";
0212 bookME(ibooker,
0213 muonEtaPhiME_,
0214 histname,
0215 histtitle,
0216 eta_binning_.nbins,
0217 eta_binning_.xmin,
0218 eta_binning_.xmax,
0219 phi_binning_.nbins,
0220 phi_binning_.xmin,
0221 phi_binning_.xmax);
0222 setMETitle(muonEtaPhiME_, "#eta", "#phi");
0223
0224 histname = "electron_pt_variable";
0225 histtitle = "electron PT";
0226 bookME(ibooker, eleME_variableBinning_, histname, histtitle, muon_variable_binning_);
0227 setMETitle(eleME_variableBinning_, "Electron pT [GeV]", "events / [GeV]");
0228
0229 histname = "electron_eta";
0230 histtitle = "electron eta";
0231 bookME(ibooker, eleEtaME_, histname, histtitle, eta_binning_.nbins, eta_binning_.xmin, eta_binning_.xmax);
0232 setMETitle(eleEtaME_, "Electron #eta", "events");
0233
0234 histname = "elePt_muPt";
0235 histtitle = "electron pt vs muon pt";
0236 bookME(ibooker, elePt_muPt_, histname, histtitle, elePt_variable_binning_2D_, muPt_variable_binning_2D_);
0237 setMETitle(elePt_muPt_, "electron pt [GeV]", "muon pt [GeV]");
0238
0239 histname = "eleEta_muEta";
0240 histtitle = "electron #eta vs muon #eta";
0241 bookME(ibooker, eleEta_muEta_, histname, histtitle, eleEta_variable_binning_2D_, muEta_variable_binning_2D_);
0242 setMETitle(eleEta_muEta_, "electron #eta", "muon #eta");
0243 }
0244
0245 void MuonMonitor::analyze(edm::Event const& iEvent, edm::EventSetup const& iSetup) {
0246
0247
0248 if (requireValidHLTPaths_ and (not hltPathsAreValid_)) {
0249 return;
0250 }
0251
0252
0253 if (den_genTriggerEventFlag_->on() && !den_genTriggerEventFlag_->accept(iEvent, iSetup)) {
0254 return;
0255 }
0256
0257 edm::Handle<reco::PFMETCollection> metHandle;
0258 iEvent.getByToken(metToken_, metHandle);
0259 reco::PFMET pfmet = metHandle->front();
0260 if (!metSelection_(pfmet)) {
0261 return;
0262 }
0263
0264 edm::Handle<reco::VertexCollection> vtxHandle;
0265 iEvent.getByToken(vtxToken_, vtxHandle);
0266
0267 math::XYZPoint pv(0, 0, 0);
0268 for (reco::Vertex const& v : *vtxHandle) {
0269 if (not v.isFake()) {
0270 pv.SetXYZ(v.x(), v.y(), v.z());
0271 break;
0272 }
0273 }
0274
0275 edm::Handle<reco::MuonCollection> muonHandle;
0276 iEvent.getByToken(muonToken_, muonHandle);
0277 std::vector<reco::Muon> muons;
0278 if (muonHandle->size() < nmuons_)
0279 return;
0280 for (auto const& p : *muonHandle) {
0281 if (muonSelection_(p))
0282 muons.push_back(p);
0283 }
0284 if (muons.size() < nmuons_)
0285 return;
0286
0287 edm::Handle<edm::View<reco::GsfElectron>> eleHandle;
0288 iEvent.getByToken(eleToken_, eleHandle);
0289 std::vector<reco::GsfElectron> electrons;
0290 if (eleHandle->size() < nelectrons_)
0291 return;
0292 for (auto const& e : *eleHandle) {
0293 if (eleSelection_(e))
0294 electrons.push_back(e);
0295 }
0296 if (electrons.size() < nelectrons_)
0297 return;
0298
0299
0300 const int ls = iEvent.id().luminosityBlock();
0301
0302 if (!muons.empty()) {
0303 muonME_.denominator->Fill(muons[0].pt());
0304 muonME_variableBinning_.denominator->Fill(muons[0].pt());
0305 muonPhiME_.denominator->Fill(muons[0].phi());
0306 muonEtaME_.denominator->Fill(muons[0].eta());
0307 muonVsLS_.denominator->Fill(ls, muons[0].pt());
0308 muonEtaPhiME_.denominator->Fill(muons[0].eta(), muons[0].phi());
0309 muondxy_.denominator->Fill(muons[0].muonBestTrack()->dxy(pv));
0310 muondz_.denominator->Fill(muons[0].muonBestTrack()->dz(pv));
0311 if (!electrons.empty()) {
0312 eleME_variableBinning_.denominator->Fill(electrons[0].pt());
0313 eleEtaME_.denominator->Fill(electrons[0].eta());
0314 eleEta_muEta_.denominator->Fill(electrons[0].eta(), muons[0].eta());
0315 elePt_muPt_.denominator->Fill(electrons[0].pt(), muons[0].pt());
0316 }
0317 }
0318
0319
0320 if (num_genTriggerEventFlag_->on() && !num_genTriggerEventFlag_->accept(iEvent, iSetup))
0321 return;
0322
0323
0324 if (!muons.empty()) {
0325 muonME_.numerator->Fill(muons[0].pt());
0326 muonME_variableBinning_.numerator->Fill(muons[0].pt());
0327 muonPhiME_.numerator->Fill(muons[0].phi());
0328 muonEtaME_.numerator->Fill(muons[0].eta());
0329 muonVsLS_.numerator->Fill(ls, muons[0].pt());
0330 muonEtaPhiME_.numerator->Fill(muons[0].eta(), muons[0].phi());
0331 muondxy_.numerator->Fill(muons[0].muonBestTrack()->dxy(pv));
0332 muondz_.numerator->Fill(muons[0].muonBestTrack()->dz(pv));
0333 if (!electrons.empty()) {
0334 eleME_variableBinning_.numerator->Fill(electrons[0].pt());
0335 eleEtaME_.numerator->Fill(electrons[0].eta());
0336 eleEta_muEta_.numerator->Fill(electrons[0].eta(), muons[0].eta());
0337 elePt_muPt_.numerator->Fill(electrons[0].pt(), muons[0].pt());
0338 }
0339 }
0340 }
0341
0342 void MuonMonitor::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0343 edm::ParameterSetDescription desc;
0344 desc.add<std::string>("FolderName", "HLT/Muon");
0345 desc.add<bool>("requireValidHLTPaths", true);
0346
0347 desc.add<edm::InputTag>("met", edm::InputTag("pfMet"));
0348 desc.add<edm::InputTag>("muons", edm::InputTag("muons"));
0349 desc.add<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
0350 desc.add<edm::InputTag>("electrons", edm::InputTag("gedGsfElectrons"));
0351 desc.add<std::string>("metSelection", "pt > 0");
0352 desc.add<std::string>("muonSelection", "pt > 6 && eta<2.4");
0353 desc.add<std::string>("eleSelection", "pt > 0");
0354 desc.add<unsigned int>("nmuons", 0);
0355 desc.add<unsigned int>("nelectrons", 0);
0356
0357 edm::ParameterSetDescription genericTriggerEventPSet;
0358 GenericTriggerEventFlag::fillPSetDescription(genericTriggerEventPSet);
0359 desc.add<edm::ParameterSetDescription>("numGenericTriggerEventPSet", genericTriggerEventPSet);
0360 desc.add<edm::ParameterSetDescription>("denGenericTriggerEventPSet", genericTriggerEventPSet);
0361
0362 edm::ParameterSetDescription histoPSet;
0363 edm::ParameterSetDescription metPSet;
0364 fillHistoPSetDescription(metPSet);
0365 histoPSet.add<edm::ParameterSetDescription>("muonPSet", metPSet);
0366 std::vector<double> bins = {0., 20., 40., 60., 80., 90., 100., 110., 120., 130., 140., 150., 160.,
0367 170., 180., 190., 200., 220., 240., 260., 280., 300., 350., 400., 450., 1000.};
0368 histoPSet.add<std::vector<double>>("muonBinning", bins);
0369
0370 std::vector<double> etabins = {-3., -2.5, -2., -1.5, -1., -.5, 0., .5, 1., 1.5, 2., 2.5, 3.};
0371 histoPSet.add<std::vector<double>>("muonetaBinning", etabins);
0372
0373 std::vector<double> bins_2D = {0., 40., 80., 100., 120., 140., 160., 180., 200., 240., 280., 350., 450., 1000.};
0374 std::vector<double> eta_bins_2D = {-3., -2., -1., 0., 1., 2., 3.};
0375 std::vector<double> phi_bins_2D = {
0376 -3.1415, -2.5132, -1.8849, -1.2566, -0.6283, 0, 0.6283, 1.2566, 1.8849, 2.5132, 3.1415};
0377 histoPSet.add<std::vector<double>>("elePtBinning2D", bins_2D);
0378 histoPSet.add<std::vector<double>>("muPtBinning2D", bins_2D);
0379 histoPSet.add<std::vector<double>>("eleEtaBinning2D", eta_bins_2D);
0380 histoPSet.add<std::vector<double>>("muEtaBinning2D", eta_bins_2D);
0381
0382 edm::ParameterSetDescription lsPSet;
0383 fillHistoLSPSetDescription(lsPSet);
0384 histoPSet.add<edm::ParameterSetDescription>("lsPSet", lsPSet);
0385
0386 desc.add<edm::ParameterSetDescription>("histoPSet", histoPSet);
0387
0388 descriptions.add("muonMonitoring", desc);
0389 }
0390
0391 DEFINE_FWK_MODULE(MuonMonitor);