From efbd262a5c6c1d9572ad7db28aa4ee8797d2f97e Mon Sep 17 00:00:00 2001 From: david walter Date: Fri, 19 Aug 2022 17:07:43 +0200 Subject: [PATCH 1/2] Several updates -new implementation of trigger tools using HLTConfigProvider to automatically find last filter of trigger path. This way the filter name has not explicitly specified. -removing era modifier as they are not needed for current run 3 data taking. -moving z counting to electrons into a separate plugin. This way the z counting to muons is concise. The plugin for electrons does not function yet but is planned to be updated in the future. -Re organization of histograms according to LUM-21-001, reducing the total amount of histograms and reducing redundant information. --- DQMOffline/Lumi/BuildFile.xml | 1 + DQMOffline/Lumi/interface/TTrigger.h | 22 - DQMOffline/Lumi/interface/TriggerDefs.h | 11 - DQMOffline/Lumi/interface/TriggerRecord.h | 30 - DQMOffline/Lumi/interface/TriggerTools.h | 75 +- DQMOffline/Lumi/plugins/ZCounting.cc | 941 ++++++------------ DQMOffline/Lumi/plugins/ZCounting.h | 176 +--- DQMOffline/Lumi/plugins/ZCountingElectrons.cc | 358 +++++++ DQMOffline/Lumi/plugins/ZCountingElectrons.h | 107 ++ DQMOffline/Lumi/python/ZCounting_cff.py | 80 +- DQMOffline/Lumi/python/ZCounting_cfi.py | 44 + DQMOffline/Lumi/src/ElectronIdentifier.cc | 6 - DQMOffline/Lumi/src/TTrigger.cc | 80 -- DQMOffline/Lumi/src/TriggerTools.cc | 168 +++- DQMOffline/Lumi/test/ZCounting_cfg.py | 76 -- .../Lumi/test/zcounting_step1_fromAOD.py | 108 ++ .../Lumi/test/zcounting_step1_fromRAW.py | 127 +++ .../Lumi/test/zcounting_step2_fromAOD.py | 108 ++ 18 files changed, 1389 insertions(+), 1129 deletions(-) delete mode 100644 DQMOffline/Lumi/interface/TTrigger.h delete mode 100644 DQMOffline/Lumi/interface/TriggerDefs.h delete mode 100644 DQMOffline/Lumi/interface/TriggerRecord.h create mode 100644 DQMOffline/Lumi/plugins/ZCountingElectrons.cc create mode 100644 DQMOffline/Lumi/plugins/ZCountingElectrons.h create mode 100644 DQMOffline/Lumi/python/ZCounting_cfi.py delete mode 100644 DQMOffline/Lumi/src/TTrigger.cc delete mode 100644 DQMOffline/Lumi/test/ZCounting_cfg.py create mode 100644 DQMOffline/Lumi/test/zcounting_step1_fromAOD.py create mode 100644 DQMOffline/Lumi/test/zcounting_step1_fromRAW.py create mode 100644 DQMOffline/Lumi/test/zcounting_step2_fromAOD.py diff --git a/DQMOffline/Lumi/BuildFile.xml b/DQMOffline/Lumi/BuildFile.xml index a4a3e935ec662..c190a7442cfe0 100644 --- a/DQMOffline/Lumi/BuildFile.xml +++ b/DQMOffline/Lumi/BuildFile.xml @@ -4,6 +4,7 @@ + diff --git a/DQMOffline/Lumi/interface/TTrigger.h b/DQMOffline/Lumi/interface/TTrigger.h deleted file mode 100644 index a86e39eba0318..0000000000000 --- a/DQMOffline/Lumi/interface/TTrigger.h +++ /dev/null @@ -1,22 +0,0 @@ -#ifndef DQMOFFLINE_LUMI_TTRIGGER_H -#define DQMOFFLINE_LUMI_TTRIGGER_H - -#include "DQMOffline/Lumi/interface/TriggerRecord.h" // class to handle user specified trigger info -#include "DQMOffline/Lumi/interface/TriggerDefs.h" - -namespace ZCountingTrigger { - class TTrigger { - public: - TTrigger(const std::vector &muonTriggerNames, const std::vector &muonTriggerObjectNames); - ~TTrigger() {} - - // Methods - int getTriggerBit(const std::string &iName) const; - int getTriggerObjectBit(const std::string &iName, const std::string &iObjName) const; - bool pass(const std::string &iName, const TriggerBits &iTrig) const; - bool passObj(const std::string &iName, const std::string &iObjName, const TriggerObjects &iTrigObj) const; - - std::vector fRecords; - }; -} // namespace ZCountingTrigger -#endif diff --git a/DQMOffline/Lumi/interface/TriggerDefs.h b/DQMOffline/Lumi/interface/TriggerDefs.h deleted file mode 100644 index a00f926cdda79..0000000000000 --- a/DQMOffline/Lumi/interface/TriggerDefs.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef DQMOFFLINE_LUMI_TRIGGERDEFS_H -#define DQMOFFLINE_LUMI_TRIGGERDEFS_H - -#include - -const unsigned int kNTrigBit = 128; -typedef std::bitset TriggerBits; -const unsigned int kNTrigObjectBit = 256; -typedef std::bitset TriggerObjects; - -#endif diff --git a/DQMOffline/Lumi/interface/TriggerRecord.h b/DQMOffline/Lumi/interface/TriggerRecord.h deleted file mode 100644 index 197ba0e59283c..0000000000000 --- a/DQMOffline/Lumi/interface/TriggerRecord.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef DQMOFFLINE_LUMI_TRIGGERRECORD_H -#define DQMOFFLINE_LUMI_TRIGGERRECORD_H - -#include -#include -#include - -namespace ZCountingTrigger { - - class TriggerRecord { - public: - TriggerRecord(const std::string &name = "", const unsigned int value = 0) { - hltPattern = name; - baconTrigBit = value; - hltPathName = ""; - hltPathIndex = (unsigned int)-1; - } - ~TriggerRecord() {} - - std::string hltPattern; // HLT path name/pattern (wildcards allowed: *,?) - unsigned int baconTrigBit; // bacon trigger bit - std::string hltPathName; // HLT path name in trigger menu - unsigned int hltPathIndex; // HLT path index in trigger menu - - // map between trigger object name and bacon trigger object bit - std::vector > objectMap; - }; - -} // namespace ZCountingTrigger -#endif diff --git a/DQMOffline/Lumi/interface/TriggerTools.h b/DQMOffline/Lumi/interface/TriggerTools.h index 13c3cba091ab4..d1417b4ad628d 100644 --- a/DQMOffline/Lumi/interface/TriggerTools.h +++ b/DQMOffline/Lumi/interface/TriggerTools.h @@ -1,20 +1,73 @@ #ifndef DQMOFFLINE_LUMI_TRIGGERTOOLS_H #define DQMOFFLINE_LUMI_TRIGGERTOOLS_H -#include "DQMOffline/Lumi/interface/TriggerDefs.h" -#include "DQMOffline/Lumi/interface/TriggerRecord.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/Common/interface/TriggerNames.h" +#include "DataFormats/Common/interface/TriggerResults.h" #include "DataFormats/HLTReco/interface/TriggerEvent.h" -#include +#include "HLTrigger/HLTcore/interface/HLTConfigProvider.h" -namespace ZCountingTrigger { +#include - class TriggerTools { - public: - static TriggerObjects matchHLT(const double eta, - const double phi, - const std::vector &triggerRecords, - const trigger::TriggerEvent &triggerEvent); +const unsigned int kNTrigBit = 128; +typedef std::bitset TriggerBits; +const unsigned int kNTrigObjectBit = 256; +typedef std::bitset TriggerObjectBits; + +class TriggerTools { +public: + TriggerTools(){}; + ~TriggerTools(){}; + + void readEvent(const edm::Event &iEvent); + + void setTriggerResultsToken(edm::EDGetTokenT token) { fHLTTag_token = token; } + void setTriggerEventToken(edm::EDGetTokenT token) { fHLTObjTag_token = token; } + void setDRMAX(const double _drMax) { DRMAX = _drMax; } + + void addTriggerRecord(const std::string &name) { + Record rec; + rec.hltPattern = name; + records.push_back(rec); + } + void addTriggerRecord(const std::string &name, const std::string &objName) { + Record rec; + rec.hltPattern = name; + rec.hltObjName = objName; + records.push_back(rec); + } + + void initHLTObjects(const HLTConfigProvider &hltConfigProvider_); + + bool pass() const; + bool passObj(const double eta, const double phi) const; + +private: + struct Record { + std::string hltPattern; // HLT path name/pattern (wildcards allowed: *,?) + std::string hltPathName = ""; // HLT path name in trigger menu + unsigned int hltPathIndex = (unsigned int)-1; // HLT path index in trigger menu + std::string hltObjName = ""; // trigger object name in trigger menu }; + std::vector records; + + edm::EDGetTokenT fHLTTag_token; + edm::EDGetTokenT fHLTObjTag_token; + + edm::Handle hTrgRes; + edm::Handle hTrgEvt; + + edm::ParameterSetID fTriggerNamesID; + + // initialization from HLT menu; needs to be called on every change in HLT menu + void initPathNames(const std::vector &triggerNames); + + TriggerBits triggerBits; + + // Matching parameter + double DRMAX = 0.1; +}; -} // namespace ZCountingTrigger #endif diff --git a/DQMOffline/Lumi/plugins/ZCounting.cc b/DQMOffline/Lumi/plugins/ZCounting.cc index 8795ddaad3d7c..b77d3d373db2b 100644 --- a/DQMOffline/Lumi/plugins/ZCounting.cc +++ b/DQMOffline/Lumi/plugins/ZCounting.cc @@ -8,76 +8,62 @@ #include "DataFormats/MuonReco/interface/Muon.h" #include "DataFormats/MuonReco/interface/MuonSelectors.h" -#include "DQMOffline/Lumi/interface/TriggerDefs.h" -#include "DQMOffline/Lumi/interface/TTrigger.h" -#include "DQMOffline/Lumi/interface/TriggerTools.h" - #include #include #include "DQMOffline/Lumi/plugins/ZCounting.h" -using namespace ZCountingTrigger; - // // -------------------------------------- Constructor -------------------------------------------- // ZCounting::ZCounting(const edm::ParameterSet& iConfig) - : fHLTObjTag(iConfig.getParameter("TriggerEvent")), - fHLTTag(iConfig.getParameter("TriggerResults")), - fPVName(iConfig.getUntrackedParameter("edmPVName", "offlinePrimaryVertices")), - fMuonName(iConfig.getUntrackedParameter("edmName", "muons")), - fTrackName(iConfig.getUntrackedParameter("edmTrackName", "generalTracks")), - - // Electron-specific Parameters - fElectronName(iConfig.getUntrackedParameter("edmGsfEleName", "gedGsfElectrons")), - fSCName(iConfig.getUntrackedParameter("edmSCName", "particleFlowEGamma")), - - // Electron-specific Tags - fRhoTag(iConfig.getParameter("rhoname")), - fBeamspotTag(iConfig.getParameter("beamspotName")), - fConversionTag(iConfig.getParameter("conversionsName")), - - // Electron-specific Cuts - ELE_PT_CUT_TAG(iConfig.getUntrackedParameter("PtCutEleTag")), - ELE_PT_CUT_PROBE(iConfig.getUntrackedParameter("PtCutEleProbe")), - ELE_ETA_CUT_TAG(iConfig.getUntrackedParameter("EtaCutEleTag")), - ELE_ETA_CUT_PROBE(iConfig.getUntrackedParameter("EtaCutEleProbe")), - - ELE_MASS_CUT_LOW(iConfig.getUntrackedParameter("MassCutEleLow")), - ELE_MASS_CUT_HIGH(iConfig.getUntrackedParameter("MassCutEleHigh")), - - ELE_ID_WP(iConfig.getUntrackedParameter("ElectronIDType", "TIGHT")), - EleID_(ElectronIdentifier(iConfig)) { + : triggerResultsInputTag_(iConfig.getParameter("TriggerResults")), + fPVName_token(consumes( + iConfig.getUntrackedParameter("edmPVName", "offlinePrimaryVertices"))), + fMuonName_token(consumes(iConfig.getUntrackedParameter("edmName", "muons"))), + fTrackName_token( + consumes(iConfig.getUntrackedParameter("edmTrackName", "generalTracks"))), + + PtCutL1_(iConfig.getUntrackedParameter("PtCutL1")), + PtCutL2_(iConfig.getUntrackedParameter("PtCutL2")), + EtaCutL1_(iConfig.getUntrackedParameter("EtaCutL1")), + EtaCutL2_(iConfig.getUntrackedParameter("EtaCutL2")), + + MassBin_(iConfig.getUntrackedParameter("MassBin")), + MassMin_(iConfig.getUntrackedParameter("MassMin")), + MassMax_(iConfig.getUntrackedParameter("MassMax")), + + LumiBin_(iConfig.getUntrackedParameter("LumiBin")), + LumiMin_(iConfig.getUntrackedParameter("LumiMin")), + LumiMax_(iConfig.getUntrackedParameter("LumiMax")), + + PVBin_(iConfig.getUntrackedParameter("PVBin")), + PVMin_(iConfig.getUntrackedParameter("PVMin")), + PVMax_(iConfig.getUntrackedParameter("PVMax")), + + VtxNTracksFitCut_(iConfig.getUntrackedParameter("VtxNTracksFitMin")), + VtxNdofCut_(iConfig.getUntrackedParameter("VtxNdofMin")), + VtxAbsZCut_(iConfig.getUntrackedParameter("VtxAbsZMax")), + VtxRhoCut_(iConfig.getUntrackedParameter("VtxRhoMax")), + + IDTypestr_(iConfig.getUntrackedParameter("IDType")), + IsoTypestr_(iConfig.getUntrackedParameter("IsoType")), + IsoCut_(iConfig.getUntrackedParameter("IsoCut")) +{ edm::LogInfo("ZCounting") << "Constructor ZCounting::ZCounting " << std::endl; - //Get parameters from configuration file - fHLTTag_token = consumes(fHLTTag); - fHLTObjTag_token = consumes(fHLTObjTag); - fPVName_token = consumes(fPVName); - fMuonName_token = consumes(fMuonName); - fTrackName_token = consumes(fTrackName); - - // Trigger-specific Parameters - fMuonHLTNames = iConfig.getParameter>("MuonTriggerNames"); - fMuonHLTObjectNames = iConfig.getParameter>("MuonTriggerObjectNames"); - if (fMuonHLTNames.size() != fMuonHLTObjectNames.size()) { - edm::LogError("ZCounting") << "List of MuonTriggerNames and MuonTriggerObjectNames has to be the same length" - << std::endl; - } - - // Electron-specific parameters - fGsfElectronName_token = consumes>(fElectronName); - fSCName_token = consumes>(fSCName); - fRhoToken = consumes(fRhoTag); - fBeamspotToken = consumes(fBeamspotTag); - fConversionToken = consumes(fConversionTag); + // Trigger settings + triggers = new TriggerTools(); + triggers->setTriggerResultsToken(consumes(triggerResultsInputTag_)); + triggers->setTriggerEventToken(consumes(iConfig.getParameter("TriggerEvent"))); + triggers->setDRMAX(DRMAX); - // Muon-specific Cuts - IDTypestr_ = iConfig.getUntrackedParameter("IDType"); - IsoTypestr_ = iConfig.getUntrackedParameter("IsoType"); - IsoCut_ = iConfig.getUntrackedParameter("IsoCut"); + edm::LogVerbatim("ZCounting") << "ZCounting::ZCounting set trigger names"; + const std::vector patterns_ = iConfig.getParameter>("MuonTriggerNames"); + for (const std::string pattern_ : patterns_) { + triggers->addTriggerRecord(pattern_); + } if (IDTypestr_ == "Loose") IDType_ = LooseID; @@ -85,6 +71,8 @@ ZCounting::ZCounting(const edm::ParameterSet& iConfig) IDType_ = MediumID; else if (IDTypestr_ == "Tight") IDType_ = TightID; + else if (IDTypestr_ == "CustomTight") + IDType_ = CustomTightID; else IDType_ = NoneID; @@ -94,30 +82,6 @@ ZCounting::ZCounting(const edm::ParameterSet& iConfig) IsoType_ = PFIso; else IsoType_ = NoneIso; - - PtCutL1_ = iConfig.getUntrackedParameter("PtCutL1"); - PtCutL2_ = iConfig.getUntrackedParameter("PtCutL2"); - EtaCutL1_ = iConfig.getUntrackedParameter("EtaCutL1"); - EtaCutL2_ = iConfig.getUntrackedParameter("EtaCutL2"); - - MassBin_ = iConfig.getUntrackedParameter("MassBin"); - MassMin_ = iConfig.getUntrackedParameter("MassMin"); - MassMax_ = iConfig.getUntrackedParameter("MassMax"); - - LumiBin_ = iConfig.getUntrackedParameter("LumiBin"); - LumiMin_ = iConfig.getUntrackedParameter("LumiMin"); - LumiMax_ = iConfig.getUntrackedParameter("LumiMax"); - - PVBin_ = iConfig.getUntrackedParameter("PVBin"); - PVMin_ = iConfig.getUntrackedParameter("PVMin"); - PVMax_ = iConfig.getUntrackedParameter("PVMax"); - - VtxNTracksFitCut_ = iConfig.getUntrackedParameter("VtxNTracksFitMin"); - VtxNdofCut_ = iConfig.getUntrackedParameter("VtxNdofMin"); - VtxAbsZCut_ = iConfig.getUntrackedParameter("VtxAbsZMax"); - VtxRhoCut_ = iConfig.getUntrackedParameter("VtxRhoMax"); - - EleID_.setID(ELE_ID_WP); } // @@ -128,12 +92,29 @@ ZCounting::~ZCounting() { edm::LogInfo("ZCounting") << "Destructor ZCounting::~Z // // -------------------------------------- beginRun -------------------------------------------- // -void ZCounting::dqmBeginRun(edm::Run const&, edm::EventSetup const&) { +void ZCounting::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) { edm::LogInfo("ZCounting") << "ZCounting::beginRun" << std::endl; - // Triggers - fTrigger = std::make_unique(fMuonHLTNames, fMuonHLTObjectNames); + // initialize triggers + + edm::LogVerbatim("ZCounting") << "ZCounting::dqmBeginRun now at " << iRun.id(); + bool hltChanged_ = true; + if (hltConfigProvider_.init(iRun, iSetup, triggerResultsInputTag_.process(), hltChanged_)) { + edm::LogVerbatim("ZCounting") << "ZCounting::dqmBeginRun [TriggerObjMatchValueMapsProducer::beginRun] " + "HLTConfigProvider initialized [processName() = \"" + << hltConfigProvider_.processName() << "\", tableName() = \"" + << hltConfigProvider_.tableName() << "\", size() = " << hltConfigProvider_.size() + << "]"; + } else { + edm::LogError("ZCounting") << "ZCounting::dqmBeginRun Initialization of HLTConfigProvider failed for Run=" + << iRun.id() << " (process=\"" << triggerResultsInputTag_.process() + << "\") -> plugin will not produce outputs for this Run"; + return; + } + + triggers->initHLTObjects(hltConfigProvider_); } + // // -------------------------------------- bookHistos -------------------------------------------- // @@ -143,164 +124,137 @@ void ZCounting::bookHistograms(DQMStore::IBooker& ibooker_, edm::Run const&, edm ibooker_.setCurrentFolder("ZCounting/Histograms"); // Muon histograms - h_mass_HLT_pass_central = ibooker_.book2D("h_mass_HLT_pass_central", - "Muon HLT passing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_HLT_pass_forward = ibooker_.book2D("h_mass_HLT_pass_forward", - "Muon HLT passing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_HLT_fail_central = ibooker_.book2D("h_mass_HLT_fail_central", - "Muon HLT failing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_HLT_fail_forward = ibooker_.book2D("h_mass_HLT_fail_forward", - "Muon HLT failing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - - h_mass_SIT_pass_central = ibooker_.book2D("h_mass_SIT_pass_central", - "Muon SIT passing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_SIT_pass_forward = ibooker_.book2D("h_mass_SIT_pass_forward", - "Muon SIT passing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_SIT_fail_central = ibooker_.book2D("h_mass_SIT_fail_central", - "Muon SIT_failing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_SIT_fail_forward = ibooker_.book2D("h_mass_SIT_fail_forward", - "Muon SIT failing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - - h_mass_Glo_pass_central = ibooker_.book2D("h_mass_Glo_pass_central", - "Muon Glo passing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_Glo_pass_forward = ibooker_.book2D("h_mass_Glo_pass_forward", - "Muon Glo passing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_Glo_fail_central = ibooker_.book2D("h_mass_Glo_fail_central", - "Muon Glo failing probes central", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); - h_mass_Glo_fail_forward = ibooker_.book2D("h_mass_Glo_fail_forward", - "Muon Glo failing probes forward", - LumiBin_, - LumiMin_, - LumiMax_, - MassBin_, - MassMin_, - MassMax_); + h_mass_2HLT_BB = ibooker_.book2D("h_mass_2HLT_BB", + "Both muon pass HLT in barrel-barrel", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_2HLT_BE = ibooker_.book2D("h_mass_2HLT_BE", + "Both muon pass HLT passing in barrel-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_2HLT_EE = ibooker_.book2D("h_mass_2HLT_EE", + "Both muon pass HLT passing in endcap-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_1HLT_BB = ibooker_.book2D("h_mass_1HLT_BB", + "One muon pass HLT in barrel-barrel", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_1HLT_BE = ibooker_.book2D("h_mass_1HLT_BE", + "One muon pass HLT passing in barrel-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_1HLT_EE = ibooker_.book2D("h_mass_1HLT_EE", + "One muon pass HLT passing in endcap-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_mass_SIT_fail_BB = ibooker_.book2D("h_mass_SIT_fail_BB", + "Muon SIT failing barrel-barrel", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_SIT_fail_BE = ibooker_.book2D("h_mass_SIT_fail_BE", + "Muon SIT failing barrel-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_mass_SIT_fail_EE = ibooker_.book2D("h_mass_SIT_fail_EE", + "Muon SIT failing endcap-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_mass_Glo_fail_BB = ibooker_.book2D("h_mass_Glo_fail_BB", + "Muon Glo failing barrel-barrel", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_mass_Glo_fail_BE = ibooker_.book2D("h_mass_Glo_fail_BE", + "Muon Glo failing barrel-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_mass_Glo_fail_EE = ibooker_.book2D("h_mass_Glo_fail_EE", + "Muon Glo failing endcap-endcap", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); h_npv = ibooker_.book2D( "h_npv", "Events with valid primary vertex", LumiBin_, LumiMin_, LumiMax_, PVBin_, PVMin_, PVMax_); - h_mass_yield_Z = ibooker_.book2D( - "h_mass_yield_Z", "reconstructed Z bosons", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_npv_yield_Z = - ibooker_.book2D("h_npv_yield_Z", "reconstructed Z bosons", LumiBin_, LumiMin_, LumiMax_, PVBin_, PVMin_, PVMax_); - h_yieldBB_Z = ibooker_.book1D("h_yieldBB_Z", "reconstructed Z bosons in barrel", LumiBin_, LumiMin_, LumiMax_); - h_yieldEE_Z = ibooker_.book1D("h_yieldEE_Z", "reconstructed Z bosons in endcap", LumiBin_, LumiMin_, LumiMax_); // Axis titles - h_mass_HLT_pass_central->setAxisTitle("luminosiry section", 1); - h_mass_HLT_pass_forward->setAxisTitle("luminosiry section", 1); - h_mass_HLT_fail_central->setAxisTitle("luminosiry section", 1); - h_mass_HLT_fail_forward->setAxisTitle("luminosiry section", 1); - h_mass_SIT_pass_central->setAxisTitle("luminosiry section", 1); - h_mass_SIT_pass_forward->setAxisTitle("luminosiry section", 1); - h_mass_SIT_fail_central->setAxisTitle("luminosiry section", 1); - h_mass_SIT_fail_forward->setAxisTitle("luminosiry section", 1); - h_mass_Glo_pass_central->setAxisTitle("luminosiry section", 1); - h_mass_Glo_pass_forward->setAxisTitle("luminosiry section", 1); - h_mass_Glo_fail_central->setAxisTitle("luminosiry section", 1); - h_mass_Glo_fail_forward->setAxisTitle("luminosiry section", 1); - h_mass_HLT_pass_central->setAxisTitle("tag and probe mass", 2); - h_mass_HLT_pass_forward->setAxisTitle("tag and probe mass", 2); - h_mass_HLT_fail_central->setAxisTitle("tag and probe mass", 2); - h_mass_HLT_fail_forward->setAxisTitle("tag and probe mass", 2); - h_mass_SIT_pass_central->setAxisTitle("tag and probe mass", 2); - h_mass_SIT_pass_forward->setAxisTitle("tag and probe mass", 2); - h_mass_SIT_fail_central->setAxisTitle("tag and probe mass", 2); - h_mass_SIT_fail_forward->setAxisTitle("tag and probe mass", 2); - h_mass_Glo_pass_central->setAxisTitle("tag and probe mass", 2); - h_mass_Glo_pass_forward->setAxisTitle("tag and probe mass", 2); - h_mass_Glo_fail_central->setAxisTitle("tag and probe mass", 2); - h_mass_Glo_fail_forward->setAxisTitle("tag and probe mass", 2); + h_mass_2HLT_BB->setAxisTitle("luminosity section", 1); + h_mass_2HLT_BE->setAxisTitle("luminosity section", 1); + h_mass_2HLT_EE->setAxisTitle("luminosity section", 1); + h_mass_1HLT_BB->setAxisTitle("luminosity section", 1); + h_mass_1HLT_BE->setAxisTitle("luminosity section", 1); + h_mass_1HLT_EE->setAxisTitle("luminosity section", 1); + h_mass_SIT_fail_BB->setAxisTitle("luminosity section", 1); + h_mass_SIT_fail_BE->setAxisTitle("luminosity section", 1); + h_mass_SIT_fail_EE->setAxisTitle("luminosity section", 1); + h_mass_Glo_fail_BB->setAxisTitle("luminosity section", 1); + h_mass_Glo_fail_BE->setAxisTitle("luminosity section", 1); + h_mass_Glo_fail_EE->setAxisTitle("luminosity section", 1); + h_mass_2HLT_BB->setAxisTitle("tag and probe mass", 2); + h_mass_2HLT_BE->setAxisTitle("tag and probe mass", 2); + h_mass_2HLT_EE->setAxisTitle("tag and probe mass", 2); + h_mass_1HLT_BB->setAxisTitle("tag and probe mass", 2); + h_mass_1HLT_BE->setAxisTitle("tag and probe mass", 2); + h_mass_1HLT_EE->setAxisTitle("tag and probe mass", 2); + h_mass_SIT_fail_BB->setAxisTitle("tag and probe mass", 2); + h_mass_SIT_fail_BE->setAxisTitle("tag and probe mass", 2); + h_mass_SIT_fail_EE->setAxisTitle("tag and probe mass", 2); + h_mass_Glo_fail_BB->setAxisTitle("tag and probe mass", 2); + h_mass_Glo_fail_BE->setAxisTitle("tag and probe mass", 2); + h_mass_Glo_fail_EE->setAxisTitle("tag and probe mass", 2); h_npv->setAxisTitle("luminosity section", 1); h_npv->setAxisTitle("number of primary vertices", 2); - h_npv_yield_Z->setAxisTitle("luminosiry section", 1); - h_npv_yield_Z->setAxisTitle("number of primary vertices", 2); - h_mass_yield_Z->setAxisTitle("luminosiry section", 1); - h_mass_yield_Z->setAxisTitle("tag and probe mass", 2); - - h_yieldBB_Z->setAxisTitle("luminosiry section", 1); - h_yieldEE_Z->setAxisTitle("luminosiry section", 1); - - /* - // Electron histograms - h_ee_mass_id_pass_central = ibooker_.book2D("h_ee_mass_id_pass_central", "h_ee_mass_id_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_fail_central = ibooker_.book2D("h_ee_mass_id_fail_central", "h_ee_mass_id_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_pass_forward = ibooker_.book2D("h_ee_mass_id_pass_forward", "h_ee_mass_id_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_fail_forward = ibooker_.book2D("h_ee_mass_id_fail_forward", "h_ee_mass_id_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - - h_ee_mass_HLT_pass_central = ibooker_.book2D("h_ee_mass_HLT_pass_central", "h_ee_mass_HLT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_fail_central = ibooker_.book2D("h_ee_mass_HLT_fail_central", "h_ee_mass_HLT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_pass_forward = ibooker_.book2D("h_ee_mass_HLT_pass_forward", "h_ee_mass_HLT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_fail_forward = ibooker_.book2D("h_ee_mass_HLT_fail_forward", "h_ee_mass_HLT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - - h_ee_yield_Z_ebeb = ibooker_.book1D("h_ee_yield_Z_ebeb", "h_ee_yield_Z_ebeb", LumiBin_, LumiMin_, LumiMax_); - h_ee_yield_Z_ebee = ibooker_.book1D("h_ee_yield_Z_ebee", "h_ee_yield_Z_ebee", LumiBin_, LumiMin_, LumiMax_); - h_ee_yield_Z_eeee = ibooker_.book1D("h_ee_yield_Z_eeee", "h_ee_yield_Z_eeee", LumiBin_, LumiMin_, LumiMax_);*/ } // @@ -309,23 +263,18 @@ void ZCounting::bookHistograms(DQMStore::IBooker& ibooker_, edm::Run const&, edm //-------------------------------------------------------------------------------------------------- void ZCounting::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { // Fill event tree on the fly edm::LogInfo("ZCounting") << "ZCounting::analyze" << std::endl; - analyzeMuons(iEvent, iSetup); - //analyzeElectrons(iEvent, iSetup); -} -void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iSetup) { - edm::LogInfo("ZCounting") << "ZCounting::analyzeMuons" << std::endl; //------------------------------- //--- Vertex //------------------------------- edm::Handle hVertexProduct; iEvent.getByToken(fPVName_token, hVertexProduct); if (!hVertexProduct.isValid()) { - edm::LogWarning("ZCounting") << "ZCounting::analyzeMuons - no valid primary vertex product found" << std::endl; + edm::LogWarning("ZCounting") << "ZCounting::analyze - no valid primary vertex product found" << std::endl; return; } - const reco::VertexCollection* pvCol = hVertexProduct.product(); - const reco::Vertex* pv = &(*pvCol->begin()); + + const reco::Vertex* pv = 0; int nvtx = 0; for (auto const& itVtx : *hVertexProduct) { @@ -351,36 +300,10 @@ void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iS //------------------------------- //--- Trigger //------------------------------- - edm::Handle hTrgRes; - iEvent.getByToken(fHLTTag_token, hTrgRes); - if (!hTrgRes.isValid()) - return; - - edm::Handle hTrgEvt; - iEvent.getByToken(fHLTObjTag_token, hTrgEvt); - - const edm::TriggerNames& triggerNames = iEvent.triggerNames(*hTrgRes); - bool config_changed = false; - if (fTriggerNamesID != triggerNames.parameterSetID()) { - fTriggerNamesID = triggerNames.parameterSetID(); - config_changed = true; - } - if (config_changed) { - initHLT(*hTrgRes, triggerNames); - } - - TriggerBits triggerBits; - for (unsigned int irec = 0; irec < fTrigger->fRecords.size(); irec++) { - if (fTrigger->fRecords[irec].hltPathIndex == (unsigned int)-1) - continue; - if (hTrgRes->accept(fTrigger->fRecords[irec].hltPathIndex)) { - triggerBits[fTrigger->fRecords[irec].baconTrigBit] = true; - } - } - //if(fSkipOnHLTFail && triggerBits == 0) return; + triggers->readEvent(iEvent); // Trigger requirement - if (!isMuonTrigger(*fTrigger, triggerBits)) + if (!triggers->pass()) return; //------------------------------- @@ -402,32 +325,36 @@ void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iS // Tag loop for (auto const& itMu1 : *hMuonProduct) { - float pt1 = itMu1.muonBestTrack()->pt(); - float eta1 = itMu1.muonBestTrack()->eta(); - float phi1 = itMu1.muonBestTrack()->phi(); - float q1 = itMu1.muonBestTrack()->charge(); + const float pt1 = itMu1.muonBestTrack()->pt(); + const float eta1 = itMu1.muonBestTrack()->eta(); + const float phi1 = itMu1.muonBestTrack()->phi(); + const float q1 = itMu1.muonBestTrack()->charge(); // Tag selection: kinematic cuts, lepton selection and trigger matching if (pt1 < PtCutL1_) continue; if (fabs(eta1) > EtaCutL1_) continue; - if (!(passMuonID(itMu1, *pv, IDType_) && passMuonIso(itMu1, IsoType_, IsoCut_))) + if (!(passMuonID(itMu1, pv) && passMuonIso(itMu1))) continue; - if (!isMuonTriggerObj(*fTrigger, TriggerTools::matchHLT(eta1, phi1, fTrigger->fRecords, *hTrgEvt))) + if (!triggers->passObj(eta1, phi1)) continue; vTag.SetPtEtaPhiM(pt1, eta1, phi1, MUON_MASS); + bool isTagCentral = false; + if (fabs(eta1) < MUON_BOUND) + isTagCentral = true; + // Probe loop over muons for (auto const& itMu2 : *hMuonProduct) { if (&itMu2 == &itMu1) continue; - float pt2 = itMu2.muonBestTrack()->pt(); - float eta2 = itMu2.muonBestTrack()->eta(); - float phi2 = itMu2.muonBestTrack()->phi(); - float q2 = itMu2.muonBestTrack()->charge(); + const float pt2 = itMu2.muonBestTrack()->pt(); + const float eta2 = itMu2.muonBestTrack()->eta(); + const float phi2 = itMu2.muonBestTrack()->phi(); + const float q2 = itMu2.muonBestTrack()->charge(); // Probe selection: kinematic cuts and opposite charge requirement if (pt2 < PtCutL2_) @@ -445,86 +372,63 @@ void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iS if ((dilepMass < MassMin_) || (dilepMass > MassMax_)) continue; - bool isTagCentral = false; bool isProbeCentral = false; - if (fabs(eta1) < MUON_BOUND) - isTagCentral = true; if (fabs(eta2) < MUON_BOUND) isProbeCentral = true; // Determine event category for efficiency calculation - if (passMuonID(itMu2, *pv, IDType_) && passMuonIso(itMu2, IsoType_, IsoCut_)) { - if (isMuonTriggerObj(*fTrigger, TriggerTools::matchHLT(eta2, phi2, fTrigger->fRecords, *hTrgEvt))) { + if (passMuonID(itMu2, pv) && passMuonIso(itMu2)) { + if (triggers->passObj(eta2, phi2)) { // category 2HLT: both muons passing trigger requirements if (&itMu1 > &itMu2) continue; // make sure we don't double count MuMu2HLT category - // Fill twice for each event, since both muons pass trigger - if (isTagCentral) { - h_mass_HLT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); + if (isTagCentral && isProbeCentral) { + h_mass_2HLT_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isProbeCentral) { + h_mass_2HLT_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_mass_HLT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); + h_mass_2HLT_BE->Fill(iEvent.luminosityBlock(), dilepMass); } - - if (isProbeCentral) { - h_mass_HLT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - } else { - h_mass_HLT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - } - } else { - // category 1HLT: probe passing selection but not trigger - if (isProbeCentral) { - h_mass_HLT_fail_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); + // category 1HLT: only one muon passes trigger + if (isTagCentral && isProbeCentral) { + h_mass_1HLT_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isProbeCentral) { + h_mass_1HLT_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_mass_HLT_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_SIT_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); + h_mass_1HLT_BE->Fill(iEvent.luminosityBlock(), dilepMass); } } - // category 2HLT + 1HLT: Fill once for Z yield - h_npv_yield_Z->Fill(iEvent.luminosityBlock(), nvtx); - h_mass_yield_Z->Fill(iEvent.luminosityBlock(), dilepMass); - if (isTagCentral && isProbeCentral) - h_yieldBB_Z->Fill(iEvent.luminosityBlock()); - else if (!isTagCentral && !isProbeCentral) - h_yieldEE_Z->Fill(iEvent.luminosityBlock()); } else if (itMu2.isGlobalMuon()) { // category Glo: probe is a Global muon but failing selection - if (isProbeCentral) { - h_mass_SIT_fail_central->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_central->Fill(iEvent.luminosityBlock(), dilepMass); + if (isTagCentral && isProbeCentral) { + h_mass_SIT_fail_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isProbeCentral) { + h_mass_SIT_fail_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_mass_SIT_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass); - h_mass_Glo_pass_forward->Fill(iEvent.luminosityBlock(), dilepMass); + h_mass_SIT_fail_BE->Fill(iEvent.luminosityBlock(), dilepMass); } } else if (itMu2.isStandAloneMuon()) { // category Sta: probe is a Standalone muon - if (isProbeCentral) { - h_mass_Glo_fail_central->Fill(iEvent.luminosityBlock(), dilepMass); + if (isTagCentral && isProbeCentral) { + h_mass_Glo_fail_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isProbeCentral) { + h_mass_Glo_fail_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_mass_Glo_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass); + h_mass_Glo_fail_BE->Fill(iEvent.luminosityBlock(), dilepMass); } } else if (itMu2.innerTrack()->hitPattern().trackerLayersWithMeasurement() >= 6 && itMu2.innerTrack()->hitPattern().numberOfValidPixelHits() >= 1) { // cateogry Trk: probe is a tracker track - if (isProbeCentral) { - h_mass_Glo_fail_central->Fill(iEvent.luminosityBlock(), dilepMass); + if (isTagCentral && isProbeCentral) { + h_mass_Glo_fail_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isProbeCentral) { + h_mass_Glo_fail_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_mass_Glo_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass); + h_mass_Glo_fail_BE->Fill(iEvent.luminosityBlock(), dilepMass); } } - } // End of probe loop over muons // Probe loop over tracks, only for standalone efficiency calculation @@ -540,10 +444,10 @@ void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iS if (isMuon) continue; - float pt2 = itTrk.pt(); - float eta2 = itTrk.eta(); - float phi2 = itTrk.phi(); - float q2 = itTrk.charge(); + const float pt2 = itTrk.pt(); + const float eta2 = itTrk.eta(); + const float phi2 = itTrk.phi(); + const float q2 = itTrk.charge(); // Probe selection: kinematic cuts and opposite charge requirement if (pt2 < PtCutL2_) @@ -565,301 +469,22 @@ void ZCounting::analyzeMuons(const edm::Event& iEvent, const edm::EventSetup& iS isTrackCentral = true; if (itTrk.hitPattern().trackerLayersWithMeasurement() >= 6 && itTrk.hitPattern().numberOfValidPixelHits() >= 1) { - if (isTrackCentral) - h_mass_Glo_fail_central->Fill(iEvent.luminosityBlock(), dilepMass); - else - h_mass_Glo_fail_forward->Fill(iEvent.luminosityBlock(), dilepMass); - } - - } //End of probe loop over tracks - - } //End of tag loop -} -void ZCounting::analyzeElectrons(const edm::Event& iEvent, const edm::EventSetup& iSetup) { - edm::LogInfo("ZCounting") << "ZCounting::analyzeElectrons" << std::endl; - - //------------------------------- - //--- Vertex - //------------------------------- - edm::Handle hVertexProduct; - iEvent.getByToken(fPVName_token, hVertexProduct); - if (!hVertexProduct.isValid()) - return; - - const reco::VertexCollection* pvCol = hVertexProduct.product(); - int nvtx = 0; - - for (auto const& vtx : *pvCol) { - if (vtx.isFake()) - continue; - if (vtx.tracksSize() < VtxNTracksFitCut_) - continue; - if (vtx.ndof() < VtxNdofCut_) - continue; - if (fabs(vtx.z()) > VtxAbsZCut_) - continue; - if (vtx.position().Rho() > VtxRhoCut_) - continue; - - nvtx++; - } - - // Good vertex requirement - if (nvtx == 0) - return; - - //------------------------------- - //--- Trigger - //------------------------------- - edm::Handle hTrgRes; - iEvent.getByToken(fHLTTag_token, hTrgRes); - if (!hTrgRes.isValid()) - return; - - edm::Handle hTrgEvt; - iEvent.getByToken(fHLTObjTag_token, hTrgEvt); - - const edm::TriggerNames& triggerNames = iEvent.triggerNames(*hTrgRes); - Bool_t config_changed = false; - if (fTriggerNamesID != triggerNames.parameterSetID()) { - fTriggerNamesID = triggerNames.parameterSetID(); - config_changed = true; - } - if (config_changed) { - initHLT(*hTrgRes, triggerNames); - } - - TriggerBits triggerBits; - for (unsigned int irec = 0; irec < fTrigger->fRecords.size(); irec++) { - if (fTrigger->fRecords[irec].hltPathIndex == (unsigned int)-1) - continue; - if (hTrgRes->accept(fTrigger->fRecords[irec].hltPathIndex)) { - triggerBits[fTrigger->fRecords[irec].baconTrigBit] = true; - } - } - - // Trigger requirement - if (!isElectronTrigger(*fTrigger, triggerBits)) - return; - - // Get Electrons - edm::Handle> electrons; - iEvent.getByToken(fGsfElectronName_token, electrons); - - // Get SuperClusters - edm::Handle> superclusters; - iEvent.getByToken(fSCName_token, superclusters); - - // Get Rho - edm::Handle rhoHandle; - iEvent.getByToken(fRhoToken, rhoHandle); - EleID_.setRho(*rhoHandle); - - // Get beamspot - edm::Handle beamspotHandle; - iEvent.getByToken(fBeamspotToken, beamspotHandle); - - // Conversions - edm::Handle conversionsHandle; - iEvent.getByToken(fConversionToken, conversionsHandle); - - edm::Ptr eleProbe; - enum { eEleEle2HLT = 1, eEleEle1HLT1L1, eEleEle1HLT, eEleEleNoSel, eEleSC }; // event category enum - - // Loop over Tags - for (size_t itag = 0; itag < electrons->size(); ++itag) { - const auto el1 = electrons->ptrAt(itag); - if (not EleID_.passID(el1, beamspotHandle, conversionsHandle)) - continue; - - float pt1 = el1->pt(); - float eta1 = el1->eta(); - float phi1 = el1->phi(); - - if (!isElectronTriggerObj(*fTrigger, TriggerTools::matchHLT(eta1, phi1, fTrigger->fRecords, *hTrgEvt))) - continue; - TLorentzVector vTag(0., 0., 0., 0.); - vTag.SetPtEtaPhiM(pt1, eta1, phi1, ELECTRON_MASS); - - // Tag selection: kinematic cuts, lepton selection and trigger matching - double tag_pt = vTag.Pt(); - double tag_abseta = fabs(vTag.Eta()); - - bool tag_is_valid_tag = ele_tag_selection(tag_pt, tag_abseta); - bool tag_is_valid_probe = ele_probe_selection(tag_pt, tag_abseta); - - if (not(tag_is_valid_tag or tag_is_valid_probe)) - continue; - - // Loop over probes - for (size_t iprobe = 0; iprobe < superclusters->size(); ++iprobe) { - // Initialize probe - const auto sc = superclusters->ptrAt(iprobe); - if (*sc == *(el1->superCluster())) { - continue; - } - - // Find matching electron - for (size_t iele = 0; iele < electrons->size(); ++iele) { - if (iele == itag) - continue; - const auto ele = electrons->ptrAt(iele); - if (*sc == *(ele->superCluster())) { - eleProbe = ele; - break; - } - } - - // Assign final probe 4-vector - TLorentzVector vProbe(0., 0., 0., 0.); - if (eleProbe.isNonnull()) { - vProbe.SetPtEtaPhiM(eleProbe->pt(), eleProbe->eta(), eleProbe->phi(), ELECTRON_MASS); - } else { - double pt = sc->energy() * sqrt(1 - pow(tanh(sc->eta()), 2)); - vProbe.SetPtEtaPhiM(pt, sc->eta(), sc->phi(), ELECTRON_MASS); - } - - // Probe Selection - double probe_pt = vProbe.Pt(); - double probe_abseta = fabs(sc->eta()); - bool probe_is_valid_probe = ele_probe_selection(probe_pt, probe_abseta); - if (!probe_is_valid_probe) - continue; - - // Good Probe found! - - // Require good Z - TLorentzVector vDilep = vTag + vProbe; - - if ((vDilep.M() < ELE_MASS_CUT_LOW) || (vDilep.M() > ELE_MASS_CUT_HIGH)) - continue; - if (eleProbe.isNonnull() and (eleProbe->charge() != -el1->charge())) - continue; - - // Good Z found! - - long ls = iEvent.luminosityBlock(); - bool probe_pass_trigger = isElectronTriggerObj( - *fTrigger, TriggerTools::matchHLT(vProbe.Eta(), vProbe.Phi(), fTrigger->fRecords, *hTrgEvt)); - bool probe_pass_id = eleProbe.isNonnull() and EleID_.passID(eleProbe, beamspotHandle, conversionsHandle); - - //// Fill for yields - bool probe_is_forward = probe_abseta > ELE_ETA_CRACK_LOW; - bool tag_is_forward = tag_abseta > ELE_ETA_CRACK_LOW; - - if (probe_pass_id) { - if (probe_is_forward and tag_is_forward) { - h_ee_yield_Z_eeee->Fill(ls); - } else if (!probe_is_forward and !tag_is_forward) { - h_ee_yield_Z_ebeb->Fill(ls); + if (isTagCentral && isTrackCentral) { + h_mass_Glo_fail_BB->Fill(iEvent.luminosityBlock(), dilepMass); + } else if (!isTagCentral && !isTrackCentral) { + h_mass_Glo_fail_EE->Fill(iEvent.luminosityBlock(), dilepMass); } else { - h_ee_yield_Z_ebee->Fill(ls); + h_mass_Glo_fail_BE->Fill(iEvent.luminosityBlock(), dilepMass); } } - - if (!tag_is_valid_tag) - continue; - - /// Fill for ID efficiency - if (probe_pass_id) { - if (probe_is_forward) { - h_ee_mass_id_pass_forward->Fill(ls, vDilep.M()); - } else { - h_ee_mass_id_pass_central->Fill(ls, vDilep.M()); - } - } else { - if (probe_is_forward) { - h_ee_mass_id_fail_forward->Fill(ls, vDilep.M()); - } else { - h_ee_mass_id_fail_central->Fill(ls, vDilep.M()); - } - } - - /// Fill for HLT efficiency - if (probe_pass_id and probe_pass_trigger) { - if (probe_is_forward) { - h_ee_mass_HLT_pass_forward->Fill(ls, vDilep.M()); - } else { - h_ee_mass_HLT_pass_central->Fill(ls, vDilep.M()); - } - } else if (probe_pass_id) { - if (probe_is_forward) { - h_ee_mass_HLT_fail_forward->Fill(ls, vDilep.M()); - } else { - h_ee_mass_HLT_fail_central->Fill(ls, vDilep.M()); - } - } - } // End of probe loop + } //End of probe loop over tracks } //End of tag loop } -bool ZCounting::ele_probe_selection(double pt, double abseta) { - if (pt < ELE_PT_CUT_PROBE) - return false; - if (abseta > ELE_ETA_CUT_PROBE) - return false; - if ((abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH)) - return false; - return true; -} -bool ZCounting::ele_tag_selection(double pt, double abseta) { - if (pt < ELE_PT_CUT_TAG) - return false; - if (abseta > ELE_ETA_CUT_TAG) - return false; - if ((abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH)) - return false; - return true; -} // // -------------------------------------- functions -------------------------------------------- // -void ZCounting::initHLT(const edm::TriggerResults& result, const edm::TriggerNames& triggerNames) { - for (unsigned int irec = 0; irec < fTrigger->fRecords.size(); irec++) { - fTrigger->fRecords[irec].hltPathName = ""; - fTrigger->fRecords[irec].hltPathIndex = (unsigned int)-1; - const std::string pattern = fTrigger->fRecords[irec].hltPattern; - if (edm::is_glob(pattern)) { // handle pattern with wildcards (*,?) - std::vector::const_iterator> matches = - edm::regexMatch(triggerNames.triggerNames(), pattern); - if (matches.empty()) { - edm::LogWarning("ZCounting") << "requested pattern [" << pattern << "] does not match any HLT paths" - << std::endl; - } else { - for (auto const& match : matches) { - fTrigger->fRecords[irec].hltPathName = *match; - } - } - } else { // take full HLT path name given - fTrigger->fRecords[irec].hltPathName = pattern; - } - // Retrieve index in trigger menu corresponding to HLT path - unsigned int index = triggerNames.triggerIndex(fTrigger->fRecords[irec].hltPathName); - if (index < result.size()) { // check for valid index - fTrigger->fRecords[irec].hltPathIndex = index; - } - } -} - -//-------------------------------------------------------------------------------------------------- -bool ZCounting::isMuonTrigger(const ZCountingTrigger::TTrigger& triggerMenu, const TriggerBits& hltBits) { - for (unsigned int i = 0; i < fMuonHLTNames.size(); ++i) { - if (triggerMenu.pass(fMuonHLTNames.at(i), hltBits)) - return true; - } - return false; -} - -//-------------------------------------------------------------------------------------------------- -bool ZCounting::isMuonTriggerObj(const ZCountingTrigger::TTrigger& triggerMenu, const TriggerObjects& hltMatchBits) { - for (unsigned int i = 0; i < fMuonHLTNames.size(); ++i) { - if (triggerMenu.passObj(fMuonHLTNames.at(i), fMuonHLTObjectNames.at(i), hltMatchBits)) - return true; - } - return false; -} - //-------------------------------------------------------------------------------------------------- // Definition of the CustomTightID function bool ZCounting::isCustomTightMuon(const reco::Muon& muon) { @@ -875,50 +500,40 @@ bool ZCounting::isCustomTightMuon(const reco::Muon& muon) { } //-------------------------------------------------------------------------------------------------- -bool ZCounting::passMuonID( - const reco::Muon& muon, - const reco::Vertex& vtx, - const MuonIDTypes& idType) { //Muon ID selection, using internal function "DataFormats/MuonReco/src/MuonSelectors.cc - - if (idType == LooseID && muon::isLooseMuon(muon)) - return true; - else if (idType == MediumID && muon::isMediumMuon(muon)) - return true; - else if (idType == TightID && muon::isTightMuon(muon, vtx)) - return true; - else if (idType == CustomTightID && isCustomTightMuon(muon)) - return true; - else if (idType == NoneID) - return true; - else - return false; -} -//-------------------------------------------------------------------------------------------------- -bool ZCounting::passMuonIso(const reco::Muon& muon, - const MuonIsoTypes& isoType, - const float isoCut) { //Muon isolation selection, up-to-date with MUO POG recommendation - - if (isoType == TrackerIso && muon.isolationR03().sumPt < isoCut) - return true; - else if (isoType == PFIso && - muon.pfIsolationR04().sumChargedHadronPt + - std::max(0., - muon.pfIsolationR04().sumNeutralHadronEt + muon.pfIsolationR04().sumPhotonEt - - 0.5 * muon.pfIsolationR04().sumPUPt) < - isoCut) - return true; - else if (isoType == NoneIso) - return true; - else - return false; +bool ZCounting::passMuonID(const reco::Muon& muon, const reco::Vertex* vtx) { + // Muon ID selection, using internal function "DataFormats/MuonReco/src/MuonSelectors.cc + switch (IDType_) { + case LooseID: + return muon::isLooseMuon(muon); + case MediumID: + return muon::isMediumMuon(muon); + case CustomTightID: + return isCustomTightMuon(muon); + case TightID: + return vtx != nullptr && muon::isTightMuon(muon, *vtx); + case NoneID: + return true; + } + return false; } //-------------------------------------------------------------------------------------------------- -bool ZCounting::isElectronTrigger(ZCountingTrigger::TTrigger triggerMenu, TriggerBits hltBits) { - return triggerMenu.pass("HLT_Ele35_WPTight_Gsf_v*", hltBits); -} -//-------------------------------------------------------------------------------------------------- -bool ZCounting::isElectronTriggerObj(ZCountingTrigger::TTrigger triggerMenu, TriggerObjects hltMatchBits) { - return triggerMenu.passObj("HLT_Ele35_WPTight_Gsf_v*", "hltEle35noerWPTightGsfTrackIsoFilter", hltMatchBits); +bool ZCounting::passMuonIso(const reco::Muon& muon) { + //Muon isolation selection, up-to-date with MUO POG recommendation + switch (IsoType_) { + case TrackerIso: + return muon.isolationR03().sumPt < IsoCut_; + case PFIso: + return muon.pfIsolationR04().sumChargedHadronPt + + std::max(0., + muon.pfIsolationR04().sumNeutralHadronEt + muon.pfIsolationR04().sumPhotonEt - + 0.5 * muon.pfIsolationR04().sumPUPt) < + IsoCut_; + case NoneIso: + return true; + } + + return false; } + DEFINE_FWK_MODULE(ZCounting); diff --git a/DQMOffline/Lumi/plugins/ZCounting.h b/DQMOffline/Lumi/plugins/ZCounting.h index 313c25c1d8c42..4e87416efd5e3 100644 --- a/DQMOffline/Lumi/plugins/ZCounting.h +++ b/DQMOffline/Lumi/plugins/ZCounting.h @@ -21,22 +21,7 @@ #include "DQMServices/Core/interface/DQMEDAnalyzer.h" #include "DQMServices/Core/interface/DQMStore.h" -#include "DQMOffline/Lumi/interface/TriggerDefs.h" -#include "DQMOffline/Lumi/interface/TTrigger.h" #include "DQMOffline/Lumi/interface/TriggerTools.h" -#include "DQMOffline/Lumi/interface/ElectronIdentifier.h" - -class TFile; -class TH1D; -class TTree; -class TClonesArray; -namespace edm { - class TriggerResults; - class TriggerNames; -} // namespace edm -namespace ZCountingTrigger { - class TTrigger; -} class ZCounting : public DQMEDAnalyzer { public: @@ -53,142 +38,83 @@ class ZCounting : public DQMEDAnalyzer { private: //other functions - void analyzeMuons(edm::Event const& e, edm::EventSetup const& eSetup); - void analyzeElectrons(edm::Event const& e, edm::EventSetup const& eSetup); - bool isMuonTrigger(const ZCountingTrigger::TTrigger& triggerMenu, const TriggerBits& hltBits); - bool isMuonTriggerObj(const ZCountingTrigger::TTrigger& triggerMenu, const TriggerObjects& hltMatchBits); - bool passMuonID(const reco::Muon& muon, const reco::Vertex& vtx, const MuonIDTypes& idType); - bool passMuonIso(const reco::Muon& muon, const MuonIsoTypes& isoType, const float isoCut); + bool passMuonID(const reco::Muon& muon, const reco::Vertex *vtx); + bool passMuonIso(const reco::Muon& muon); bool isCustomTightMuon(const reco::Muon& muon); - // Electron-specific functions - bool isElectronTrigger(ZCountingTrigger::TTrigger triggerMenu, TriggerBits hltBits); - bool isElectronTriggerObj(ZCountingTrigger::TTrigger triggerMenu, TriggerObjects hltMatchBits); - bool ele_probe_selection(double pt, double abseta); - bool ele_tag_selection(double pt, double abseta); - - // initialization from HLT menu; needs to be called on every change in HLT menu - void initHLT(const edm::TriggerResults&, const edm::TriggerNames&); - // EDM object collection names - edm::ParameterSetID fTriggerNamesID; - edm::InputTag fHLTObjTag; - edm::InputTag fHLTTag; - edm::EDGetTokenT fHLTObjTag_token; - edm::EDGetTokenT fHLTTag_token; - std::string fPVName; + const edm::InputTag triggerResultsInputTag_; edm::EDGetTokenT fPVName_token; // Muons - std::string fMuonName; edm::EDGetTokenT fMuonName_token; std::vector fMuonHLTNames; std::vector fMuonHLTObjectNames; // Tracks - std::string fTrackName; edm::EDGetTokenT fTrackName_token; - // Electrons - std::string fElectronName; - edm::EDGetTokenT> fGsfElectronName_token; - std::string fSCName; - edm::EDGetTokenT> fSCName_token; - - edm::InputTag fRhoTag; - edm::EDGetTokenT fRhoToken; - - edm::InputTag fBeamspotTag; - edm::EDGetTokenT fBeamspotToken; - - edm::InputTag fConversionTag; - edm::EDGetTokenT fConversionToken; - - // bacon fillers - std::unique_ptr fTrigger; - - std::string IDTypestr_; - std::string IsoTypestr_; + // other input + const double PtCutL1_; + const double PtCutL2_; + const double EtaCutL1_; + const double EtaCutL2_; + + const int MassBin_; + const double MassMin_; + const double MassMax_; + + const int LumiBin_; + const double LumiMin_; + const double LumiMax_; + + const int PVBin_; + const double PVMin_; + const double PVMax_; + + const double VtxNTracksFitCut_; + const double VtxNdofCut_; + const double VtxAbsZCut_; + const double VtxRhoCut_; + + const std::string IDTypestr_; + const std::string IsoTypestr_; + const double IsoCut_; + + // muon ID and ISO parameters MuonIDTypes IDType_{NoneID}; MuonIsoTypes IsoType_{NoneIso}; - double IsoCut_; - - double PtCutL1_; - double PtCutL2_; - double EtaCutL1_; - double EtaCutL2_; - int MassBin_; - double MassMin_; - double MassMax_; + // trigger objects + HLTConfigProvider hltConfigProvider_; + TriggerTools *triggers; - int LumiBin_; - double LumiMin_; - double LumiMax_; - - int PVBin_; - double PVMin_; - double PVMax_; - - double VtxNTracksFitCut_; - double VtxNdofCut_; - double VtxAbsZCut_; - double VtxRhoCut_; + // constants + const double DRMAX = 0.1; // max dR matching between muon and hlt object const double MUON_MASS = 0.105658369; const double MUON_BOUND = 0.9; - const float ELECTRON_MASS = 0.000511; - - const float ELE_PT_CUT_TAG; - const float ELE_PT_CUT_PROBE; - const float ELE_ETA_CUT_TAG; - const float ELE_ETA_CUT_PROBE; - const float ELE_MASS_CUT_LOW; - const float ELE_MASS_CUT_HIGH; - - const std::string ELE_ID_WP; - const float ELE_ETA_CRACK_LOW = 1.4442; - const float ELE_ETA_CRACK_HIGH = 1.56; - // Electron-specific members - ElectronIdentifier EleID_; + // General Histograms + MonitorElement* h_npv; // Muon Histograms - MonitorElement* h_mass_HLT_pass_central; - MonitorElement* h_mass_HLT_pass_forward; - MonitorElement* h_mass_HLT_fail_central; - MonitorElement* h_mass_HLT_fail_forward; + MonitorElement* h_mass_2HLT_BB; + MonitorElement* h_mass_2HLT_BE; + MonitorElement* h_mass_2HLT_EE; - MonitorElement* h_mass_SIT_pass_central; - MonitorElement* h_mass_SIT_pass_forward; - MonitorElement* h_mass_SIT_fail_central; - MonitorElement* h_mass_SIT_fail_forward; + MonitorElement* h_mass_1HLT_BB; + MonitorElement* h_mass_1HLT_BE; + MonitorElement* h_mass_1HLT_EE; - MonitorElement* h_mass_Glo_pass_central; - MonitorElement* h_mass_Glo_pass_forward; - MonitorElement* h_mass_Glo_fail_central; - MonitorElement* h_mass_Glo_fail_forward; + MonitorElement* h_mass_SIT_fail_BB; + MonitorElement* h_mass_SIT_fail_BE; + MonitorElement* h_mass_SIT_fail_EE; + + MonitorElement* h_mass_Glo_fail_BB; + MonitorElement* h_mass_Glo_fail_BE; + MonitorElement* h_mass_Glo_fail_EE; - MonitorElement* h_npv; - MonitorElement* h_npv_yield_Z; - MonitorElement* h_mass_yield_Z; - MonitorElement* h_yieldBB_Z; - MonitorElement* h_yieldEE_Z; - - // Electron Histograms - MonitorElement* h_ee_mass_id_pass_central; - MonitorElement* h_ee_mass_id_fail_central; - MonitorElement* h_ee_mass_id_pass_forward; - MonitorElement* h_ee_mass_id_fail_forward; - - MonitorElement* h_ee_mass_HLT_pass_central; - MonitorElement* h_ee_mass_HLT_fail_central; - MonitorElement* h_ee_mass_HLT_pass_forward; - MonitorElement* h_ee_mass_HLT_fail_forward; - - MonitorElement* h_ee_yield_Z_ebeb; - MonitorElement* h_ee_yield_Z_ebee; - MonitorElement* h_ee_yield_Z_eeee; }; #endif diff --git a/DQMOffline/Lumi/plugins/ZCountingElectrons.cc b/DQMOffline/Lumi/plugins/ZCountingElectrons.cc new file mode 100644 index 0000000000000..516268129087d --- /dev/null +++ b/DQMOffline/Lumi/plugins/ZCountingElectrons.cc @@ -0,0 +1,358 @@ +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Common/interface/TriggerNames.h" +#include "FWCore/Utilities/interface/RegexMatch.h" +#include "DataFormats/Common/interface/Handle.h" +#include "DataFormats/Common/interface/TriggerResults.h" +#include "DataFormats/HLTReco/interface/TriggerEvent.h" +#include "DataFormats/VertexReco/interface/Vertex.h" + +#include + +#include + +#include "DQMOffline/Lumi/plugins/ZCountingElectrons.h" + +// +// -------------------------------------- Constructor -------------------------------------------- +// +ZCountingElectrons::ZCountingElectrons(const edm::ParameterSet& iConfig) + : triggerResultsInputTag_(iConfig.getParameter("TriggerResults")), + fPVName_token(consumes(iConfig.getUntrackedParameter("edmPVName", "offlinePrimaryVertices"))), + + // Electron-specific Parameters + fGsfElectronName_token(consumes>(iConfig.getUntrackedParameter("edmGsfEleName", "gedGsfElectrons"))), + fSCName_token(consumes>(iConfig.getUntrackedParameter("edmSCName", "particleFlowEGamma"))), + + // Electron-specific Tags + fRhoToken(consumes(iConfig.getParameter("rhoname"))), + fBeamspotToken(consumes(iConfig.getParameter("beamspotName"))), + fConversionToken(consumes(iConfig.getParameter("conversionsName"))), + + // Electron-specific Cuts + PtCutL1_(iConfig.getUntrackedParameter("PtCutL1")), + PtCutL2_(iConfig.getUntrackedParameter("PtCutL2")), + EtaCutL1_(iConfig.getUntrackedParameter("EtaCutL1")), + EtaCutL2_(iConfig.getUntrackedParameter("EtaCutL2")), + + MassBin_(iConfig.getUntrackedParameter("MassBin")), + MassMin_(iConfig.getUntrackedParameter("MassMin")), + MassMax_(iConfig.getUntrackedParameter("MassMax")), + + LumiBin_(iConfig.getUntrackedParameter("LumiBin")), + LumiMin_(iConfig.getUntrackedParameter("LumiMin")), + LumiMax_(iConfig.getUntrackedParameter("LumiMax")), + + PVBin_(iConfig.getUntrackedParameter("PVBin")), + PVMin_(iConfig.getUntrackedParameter("PVMin")), + PVMax_(iConfig.getUntrackedParameter("PVMax")), + + VtxNTracksFitCut_(iConfig.getUntrackedParameter("VtxNTracksFitMin")), + VtxNdofCut_(iConfig.getUntrackedParameter("VtxNdofMin")), + VtxAbsZCut_(iConfig.getUntrackedParameter("VtxAbsZMax")), + VtxRhoCut_(iConfig.getUntrackedParameter("VtxRhoMax")), + + ELE_ID_WP(iConfig.getUntrackedParameter("ElectronIDType", "TIGHT")), + EleID_(ElectronIdentifier(iConfig)) { + edm::LogInfo("ZCounting") << "Constructor ZCountingElectrons::ZCounting " << std::endl; + + // Trigger settings + triggers = new TriggerTools(); + triggers->setTriggerResultsToken(consumes(triggerResultsInputTag_)); + triggers->setTriggerEventToken(consumes(iConfig.getParameter("TriggerEvent"))); + triggers->setDRMAX(DRMAX); + + edm::LogVerbatim("ZCounting") << "ZCounting::ZCounting set trigger names"; + const std::vector patterns_ = + iConfig.getParameter>("ElectronTriggerNames"); + for (const std::string pattern_ : patterns_) { + triggers->addTriggerRecord(pattern_); + } + + + EleID_.setID(ELE_ID_WP); +} + +// +// -------------------------------------- Destructor -------------------------------------------- +// +ZCountingElectrons::~ZCountingElectrons() { edm::LogInfo("ZCountingElectrons") << "Destructor ZCountingElectrons::~ZCountingElectrons " << std::endl; } + +// +// -------------------------------------- beginRun -------------------------------------------- +// +void ZCountingElectrons::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const& iSetup) { + edm::LogInfo("ZCountingElectrons") << "ZCountingElectrons::beginRun" << std::endl; + + // initialize triggers + + edm::LogVerbatim("ZCountingElectrons") << "ZCountingElectrons::dqmBeginRun now at " << iRun.id(); + + bool hltChanged_ = true; + if (hltConfigProvider_.init(iRun, iSetup, triggerResultsInputTag_.process(), hltChanged_)) { + edm::LogVerbatim("ZCountingElectrons") << "ZCountingElectrons::dqmBeginRun [TriggerObjMatchValueMapsProducer::beginRun] " + "HLTConfigProvider initialized [processName() = \"" + << hltConfigProvider_.processName() << "\", tableName() = \"" + << hltConfigProvider_.tableName() << "\", size() = " << hltConfigProvider_.size() + << "]"; + } else { + edm::LogError("ZCountingElectrons") << "ZCountingElectrons::dqmBeginRun Initialization of HLTConfigProvider failed for Run=" + << iRun.id() << " (process=\"" << triggerResultsInputTag_.process() + << "\") -> plugin will not produce outputs for this Run"; + return; + } + + triggers->initHLTObjects(hltConfigProvider_); +} +// +// -------------------------------------- bookHistos -------------------------------------------- +// +void ZCountingElectrons::bookHistograms(DQMStore::IBooker& ibooker_, edm::Run const&, edm::EventSetup const&) { + edm::LogInfo("ZCountingElectrons") << "ZCountingElectrons::bookHistograms" << std::endl; + ibooker_.cd(); + ibooker_.setCurrentFolder("ZCounting/Histograms"); + + h_npv = ibooker_.book2D( + "h_npv", "Events with valid primary vertex", LumiBin_, LumiMin_, LumiMax_, PVBin_, PVMin_, PVMax_); + + h_npv->setAxisTitle("luminosity section", 1); + h_npv->setAxisTitle("number of primary vertices", 2); + + // Electron histograms + h_ee_mass_id_pass_central = ibooker_.book2D("h_ee_mass_id_pass_central", "h_ee_mass_id_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_id_fail_central = ibooker_.book2D("h_ee_mass_id_fail_central", "h_ee_mass_id_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_id_pass_forward = ibooker_.book2D("h_ee_mass_id_pass_forward", "h_ee_mass_id_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_id_fail_forward = ibooker_.book2D("h_ee_mass_id_fail_forward", "h_ee_mass_id_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + + h_ee_mass_HLT_pass_central = ibooker_.book2D("h_ee_mass_HLT_pass_central", "h_ee_mass_HLT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_HLT_fail_central = ibooker_.book2D("h_ee_mass_HLT_fail_central", "h_ee_mass_HLT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_HLT_pass_forward = ibooker_.book2D("h_ee_mass_HLT_pass_forward", "h_ee_mass_HLT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + h_ee_mass_HLT_fail_forward = ibooker_.book2D("h_ee_mass_HLT_fail_forward", "h_ee_mass_HLT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); + + h_ee_yield_Z_ebeb = ibooker_.book1D("h_ee_yield_Z_ebeb", "h_ee_yield_Z_ebeb", LumiBin_, LumiMin_, LumiMax_); + h_ee_yield_Z_ebee = ibooker_.book1D("h_ee_yield_Z_ebee", "h_ee_yield_Z_ebee", LumiBin_, LumiMin_, LumiMax_); + h_ee_yield_Z_eeee = ibooker_.book1D("h_ee_yield_Z_eeee", "h_ee_yield_Z_eeee", LumiBin_, LumiMin_, LumiMax_); +} + +// +// -------------------------------------- Analyze -------------------------------------------- +// +//-------------------------------------------------------------------------------------------------- +void ZCountingElectrons::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { // Fill event tree on the fly + edm::LogInfo("ZCountingElectrons") << "ZCountingElectrons::analyze" << std::endl; + + //------------------------------- + //--- Vertex + //------------------------------- + edm::Handle hVertexProduct; + iEvent.getByToken(fPVName_token, hVertexProduct); + if (!hVertexProduct.isValid()) { + edm::LogWarning("ZCounting") << "ZCountingElectrons::analyze - no valid primary vertex product found" << std::endl; + return; + } + // const reco::VertexCollection* pvCol = hVertexProduct.product(); + // const reco::Vertex* pv = &(*pvCol->begin()); + int nvtx = 0; + + for (auto const& itVtx : *hVertexProduct) { + if (itVtx.isFake()) + continue; + if (itVtx.tracksSize() < VtxNTracksFitCut_) + continue; + if (itVtx.ndof() < VtxNdofCut_) + continue; + if (fabs(itVtx.z()) > VtxAbsZCut_) + continue; + if (itVtx.position().Rho() > VtxRhoCut_) + continue; + + // if (nvtx == 0) { + // pv = &itVtx; + // } + nvtx++; + } + + h_npv->Fill(iEvent.luminosityBlock(), nvtx); + + //------------------------------- + //--- Trigger + //------------------------------- + triggers->readEvent(iEvent); + + // Trigger requirement + if (!triggers->pass()) + return; + + // Get Electrons + edm::Handle> electrons; + iEvent.getByToken(fGsfElectronName_token, electrons); + + // Get SuperClusters + edm::Handle> superclusters; + iEvent.getByToken(fSCName_token, superclusters); + + // Get Rho + edm::Handle rhoHandle; + iEvent.getByToken(fRhoToken, rhoHandle); + EleID_.setRho(*rhoHandle); + + // Get beamspot + edm::Handle beamspotHandle; + iEvent.getByToken(fBeamspotToken, beamspotHandle); + + // Conversions + edm::Handle conversionsHandle; + iEvent.getByToken(fConversionToken, conversionsHandle); + + edm::Ptr eleProbe; + enum { eEleEle2HLT = 1, eEleEle1HLT1L1, eEleEle1HLT, eEleEleNoSel, eEleSC }; // event category enum + + // Loop over Tags + for (size_t itag = 0; itag < electrons->size(); ++itag) { + const auto el1 = electrons->ptrAt(itag); + if (not EleID_.passID(el1, beamspotHandle, conversionsHandle)) + continue; + + float pt1 = el1->pt(); + float eta1 = el1->eta(); + float phi1 = el1->phi(); + + if (!triggers->passObj(eta1, phi1)) + continue; + TLorentzVector vTag(0., 0., 0., 0.); + vTag.SetPtEtaPhiM(pt1, eta1, phi1, ELECTRON_MASS); + + // Tag selection: kinematic cuts, lepton selection and trigger matching + double tag_pt = vTag.Pt(); + double tag_abseta = fabs(vTag.Eta()); + + bool tag_is_valid_tag = ele_tag_selection(tag_pt, tag_abseta); + bool tag_is_valid_probe = ele_probe_selection(tag_pt, tag_abseta); + + if (not(tag_is_valid_tag or tag_is_valid_probe)) + continue; + + // Loop over probes + for (size_t iprobe = 0; iprobe < superclusters->size(); ++iprobe) { + // Initialize probe + const auto sc = superclusters->ptrAt(iprobe); + if (*sc == *(el1->superCluster())) { + continue; + } + + // Find matching electron + for (size_t iele = 0; iele < electrons->size(); ++iele) { + if (iele == itag) + continue; + const auto ele = electrons->ptrAt(iele); + if (*sc == *(ele->superCluster())) { + eleProbe = ele; + break; + } + } + + // Assign final probe 4-vector + TLorentzVector vProbe(0., 0., 0., 0.); + if (eleProbe.isNonnull()) { + vProbe.SetPtEtaPhiM(eleProbe->pt(), eleProbe->eta(), eleProbe->phi(), ELECTRON_MASS); + } else { + double pt = sc->energy() * sqrt(1 - pow(tanh(sc->eta()), 2)); + vProbe.SetPtEtaPhiM(pt, sc->eta(), sc->phi(), ELECTRON_MASS); + } + + // Probe Selection + double probe_pt = vProbe.Pt(); + double probe_abseta = fabs(sc->eta()); + bool probe_is_valid_probe = ele_probe_selection(probe_pt, probe_abseta); + if (!probe_is_valid_probe) + continue; + + // Good Probe found! + + // Require good Z + TLorentzVector vDilep = vTag + vProbe; + + if ((vDilep.M() < MassMin_) || (vDilep.M() > MassMax_)) + continue; + if (eleProbe.isNonnull() and (eleProbe->charge() != -el1->charge())) + continue; + + // Good Z found! + long ls = iEvent.luminosityBlock(); + bool probe_pass_trigger = triggers->passObj(vProbe.Eta(), vProbe.Phi()); + bool probe_pass_id = eleProbe.isNonnull() and EleID_.passID(eleProbe, beamspotHandle, conversionsHandle); + + //// Fill for yields + bool probe_is_forward = probe_abseta > ELE_ETA_CRACK_LOW; + bool tag_is_forward = tag_abseta > ELE_ETA_CRACK_LOW; + + if (probe_pass_id) { + if (probe_is_forward and tag_is_forward) { + h_ee_yield_Z_eeee->Fill(ls); + } else if (!probe_is_forward and !tag_is_forward) { + h_ee_yield_Z_ebeb->Fill(ls); + } else { + h_ee_yield_Z_ebee->Fill(ls); + } + } + + if (!tag_is_valid_tag) + continue; + + /// Fill for ID efficiency + if (probe_pass_id) { + if (probe_is_forward) { + h_ee_mass_id_pass_forward->Fill(ls, vDilep.M()); + } else { + h_ee_mass_id_pass_central->Fill(ls, vDilep.M()); + } + } else { + if (probe_is_forward) { + h_ee_mass_id_fail_forward->Fill(ls, vDilep.M()); + } else { + h_ee_mass_id_fail_central->Fill(ls, vDilep.M()); + } + } + + /// Fill for HLT efficiency + if (probe_pass_id and probe_pass_trigger) { + if (probe_is_forward) { + h_ee_mass_HLT_pass_forward->Fill(ls, vDilep.M()); + } else { + h_ee_mass_HLT_pass_central->Fill(ls, vDilep.M()); + } + } else if (probe_pass_id) { + if (probe_is_forward) { + h_ee_mass_HLT_fail_forward->Fill(ls, vDilep.M()); + } else { + h_ee_mass_HLT_fail_central->Fill(ls, vDilep.M()); + } + } + } // End of probe loop + } //End of tag loop +} + +// +// -------------------------------------- functions -------------------------------------------- +// + +bool ZCountingElectrons::ele_probe_selection(double pt, double abseta) { + if (pt < PtCutL2_) + return false; + if (abseta > EtaCutL2_) + return false; + if ((abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH)) + return false; + return true; +} + +bool ZCountingElectrons::ele_tag_selection(double pt, double abseta) { + if (pt < PtCutL1_) + return false; + if (abseta > EtaCutL1_) + return false; + if ((abseta > ELE_ETA_CRACK_LOW) and (abseta < ELE_ETA_CRACK_HIGH)) + return false; + return true; +} + +DEFINE_FWK_MODULE(ZCountingElectrons); diff --git a/DQMOffline/Lumi/plugins/ZCountingElectrons.h b/DQMOffline/Lumi/plugins/ZCountingElectrons.h new file mode 100644 index 0000000000000..bd56a1817bb6f --- /dev/null +++ b/DQMOffline/Lumi/plugins/ZCountingElectrons.h @@ -0,0 +1,107 @@ +#ifndef ZCountingElectrons_H +#define ZCountingElectrons_H + +#include "FWCore/Framework/interface/MakerMacros.h" // definitions for declaring plug-in modules +#include "FWCore/Framework/interface/Frameworkfwd.h" // declaration of EDM types +#include "FWCore/Framework/interface/EDAnalyzer.h" // EDAnalyzer class +#include "FWCore/Framework/interface/ConsumesCollector.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" // Parameters +#include "FWCore/Utilities/interface/InputTag.h" + +#include // string class +#include + +#include "DataFormats/HLTReco/interface/TriggerEvent.h" +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" + +#include "DQMServices/Core/interface/DQMEDAnalyzer.h" +#include "DQMServices/Core/interface/DQMStore.h" + +#include "DQMOffline/Lumi/interface/TriggerTools.h" +#include "DQMOffline/Lumi/interface/ElectronIdentifier.h" + +class ZCountingElectrons : public DQMEDAnalyzer { +public: + ZCountingElectrons(const edm::ParameterSet& ps); + ~ZCountingElectrons() override; + +protected: + void dqmBeginRun(edm::Run const&, edm::EventSetup const&) override; + void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override; + void analyze(edm::Event const& e, edm::EventSetup const& eSetup) override; + +private: + + // Electron-specific functions + bool ele_probe_selection(double pt, double abseta); + bool ele_tag_selection(double pt, double abseta); + + // EDM object collection names + const edm::InputTag triggerResultsInputTag_; + edm::EDGetTokenT fPVName_token; + + // Electrons + edm::EDGetTokenT> fGsfElectronName_token; + edm::EDGetTokenT> fSCName_token; + edm::EDGetTokenT fRhoToken; + edm::EDGetTokenT fBeamspotToken; + edm::EDGetTokenT fConversionToken; + + double PtCutL1_; + double PtCutL2_; + double EtaCutL1_; + double EtaCutL2_; + + int MassBin_; + double MassMin_; + double MassMax_; + + int LumiBin_; + double LumiMin_; + double LumiMax_; + + int PVBin_; + double PVMin_; + double PVMax_; + + double VtxNTracksFitCut_; + double VtxNdofCut_; + double VtxAbsZCut_; + double VtxRhoCut_; + + const std::string ELE_ID_WP; + + // trigger objects + HLTConfigProvider hltConfigProvider_; + TriggerTools *triggers; + + //constants + const double DRMAX = 0.1; // max dR matching between muon and hlt object + const float ELECTRON_MASS = 0.000511; + const float ELE_ETA_CRACK_LOW = 1.4442; + const float ELE_ETA_CRACK_HIGH = 1.56; + + // Electron-specific members + ElectronIdentifier EleID_; + + // General Histograms + MonitorElement* h_npv; + + // Electron Histograms + MonitorElement* h_ee_mass_id_pass_central; + MonitorElement* h_ee_mass_id_fail_central; + MonitorElement* h_ee_mass_id_pass_forward; + MonitorElement* h_ee_mass_id_fail_forward; + + MonitorElement* h_ee_mass_HLT_pass_central; + MonitorElement* h_ee_mass_HLT_fail_central; + MonitorElement* h_ee_mass_HLT_pass_forward; + MonitorElement* h_ee_mass_HLT_fail_forward; + + MonitorElement* h_ee_yield_Z_ebeb; + MonitorElement* h_ee_yield_Z_ebee; + MonitorElement* h_ee_yield_Z_eeee; +}; + +#endif diff --git a/DQMOffline/Lumi/python/ZCounting_cff.py b/DQMOffline/Lumi/python/ZCounting_cff.py index be8b0f5bdfe3d..311a8a1486e5d 100644 --- a/DQMOffline/Lumi/python/ZCounting_cff.py +++ b/DQMOffline/Lumi/python/ZCounting_cff.py @@ -1,80 +1,4 @@ import FWCore.ParameterSet.Config as cms -from DQMServices.Core.DQMEDAnalyzer import DQMEDAnalyzer -zcounting = DQMEDAnalyzer('ZCounting', - TriggerEvent = cms.InputTag('hltTriggerSummaryAOD','','HLT'), - TriggerResults = cms.InputTag('TriggerResults','','HLT'), - edmPVName = cms.untracked.string('offlinePrimaryVertices'), - edmName = cms.untracked.string('muons'), - edmTrackName = cms.untracked.string('generalTracks'), - - edmGsfEleName = cms.untracked.string('gedGsfElectrons'), - edmSCName = cms.untracked.string('particleFlowEGamma'), - - effAreasConfigFile = cms.FileInPath("RecoEgamma/ElectronIdentification/data/Summer16/effAreaElectrons_cone03_pfNeuHadronsAndPhotons_80X.txt"), - - rhoname = cms.InputTag('fixedGridRhoFastjetAll'), - beamspotName = cms.InputTag('offlineBeamSpot'), - conversionsName = cms.InputTag('conversions'), - - MuonTriggerNames = cms.vstring("HLT_IsoMu24_v*"), - MuonTriggerObjectNames = cms.vstring("hltL3crIsoL1sSingleMu22L1f0L2f10QL3f24QL3trkIsoFiltered0p08"), - - IDType = cms.untracked.string("CustomTight"),# Tight, Medium, Loose, CustomTight - IsoType = cms.untracked.string("NULL"), # Tracker-based, PF-based - IsoCut = cms.untracked.double(0.), # {0.05, 0.10} for Tracker-based, {0.15, 0.25} for PF-based - - PtCutL1 = cms.untracked.double(27.0), - PtCutL2 = cms.untracked.double(27.0), - EtaCutL1 = cms.untracked.double(2.4), - EtaCutL2 = cms.untracked.double(2.4), - - PtCutEleTag = cms.untracked.double(40.0), - PtCutEleProbe = cms.untracked.double(35.0), - EtaCutEleTag = cms.untracked.double(2.5), - EtaCutEleProbe = cms.untracked.double(2.5), - MassCutEleLow = cms.untracked.double(80.0), - MassCutEleHigh = cms.untracked.double(100.0), - - ElectronIDType = cms.untracked.string("TIGHT"), - - MassBin = cms.untracked.int32(80), - MassMin = cms.untracked.double(50.0), - MassMax = cms.untracked.double(130.0), - - LumiBin = cms.untracked.int32(2500), - LumiMin = cms.untracked.double(0.5), - LumiMax = cms.untracked.double(2500.5), - - PVBin = cms.untracked.int32(100), - PVMin = cms.untracked.double(0.5), - PVMax = cms.untracked.double(100.5), - - VtxNTracksFitMin = cms.untracked.double(0.), - VtxNdofMin = cms.untracked.double(4.), - VtxAbsZMax = cms.untracked.double(24.), - VtxRhoMax = cms.untracked.double(2.) - ) - - -from Configuration.Eras.Modifier_run2_HLTconditions_2016_cff import run2_HLTconditions_2016 -run2_HLTconditions_2016.toModify( zcounting, MuonTriggerNames = cms.vstring("HLT_IsoMu24_v*","HLT_IsoTkMu24_v*"), - MuonTriggerObjectNames = cms.vstring("hltL3crIsoL1sSingleMu22L1f0L2f10QL3f24QL3trkIsoFiltered0p07", - "hltL3fL1sMu22L1f0Tkf24QL3trkIsoFiltered0p09"), - PtCutL1 = cms.untracked.double(27.0), - PtCutL2 = cms.untracked.double(27.0) - ) - -from Configuration.Eras.Modifier_run2_HLTconditions_2017_cff import run2_HLTconditions_2017 -run2_HLTconditions_2017.toModify(zcounting, MuonTriggerNames = cms.vstring("HLT_IsoMu27_v*"), - MuonTriggerObjectNames = cms.vstring("hltL3crIsoL1sMu22Or25L1f0L2f10QL3f27QL3trkIsoFiltered0p07"), - PtCutL1 = cms.untracked.double(30.0), - PtCutL2 = cms.untracked.double(30.0) - ) - -from Configuration.Eras.Modifier_run2_HLTconditions_2018_cff import run2_HLTconditions_2018 -run2_HLTconditions_2018.toModify(zcounting, MuonTriggerNames = cms.vstring("HLT_IsoMu24_v*"), - MuonTriggerObjectNames = cms.vstring("hltL3crIsoL1sSingleMu22L1f0L2f10QL3f24QL3trkIsoFiltered0p07"), - PtCutL1 = cms.untracked.double(27.0), - PtCutL2 = cms.untracked.double(27.0) - ) +from DQMOffline.Lumi.ZCounting_cfi import * +zcounting = cms.Sequence(ZCounting) diff --git a/DQMOffline/Lumi/python/ZCounting_cfi.py b/DQMOffline/Lumi/python/ZCounting_cfi.py new file mode 100644 index 0000000000000..1fa0980180354 --- /dev/null +++ b/DQMOffline/Lumi/python/ZCounting_cfi.py @@ -0,0 +1,44 @@ +import FWCore.ParameterSet.Config as cms + +from DQMServices.Core.DQMEDAnalyzer import DQMEDAnalyzer +ZCounting = DQMEDAnalyzer('ZCounting', + TriggerEvent=cms.InputTag( + 'hltTriggerSummaryAOD', '', 'HLT'), + TriggerResults=cms.InputTag( + 'TriggerResults', '', 'HLT'), + edmPVName=cms.untracked.string( + 'offlinePrimaryVertices'), + edmName=cms.untracked.string('muons'), + edmTrackName=cms.untracked.string('generalTracks'), + + MuonTriggerNames=cms.vstring("HLT_IsoMu24_v*"), + + # Tight, Medium, Loose, CustomTight + IDType=cms.untracked.string("CustomTight"), + IsoType=cms.untracked.string( + "NULL"), # Tracker-based, PF-based + # {0.05, 0.10} for Tracker-based, {0.15, 0.25} for PF-based + IsoCut=cms.untracked.double(0.), + + PtCutL1=cms.untracked.double(27.0), + PtCutL2=cms.untracked.double(27.0), + EtaCutL1=cms.untracked.double(2.4), + EtaCutL2=cms.untracked.double(2.4), + + MassBin=cms.untracked.int32(80), + MassMin=cms.untracked.double(50.0), + MassMax=cms.untracked.double(130.0), + + LumiBin=cms.untracked.int32(2500), + LumiMin=cms.untracked.double(0.5), + LumiMax=cms.untracked.double(2500.5), + + PVBin=cms.untracked.int32(100), + PVMin=cms.untracked.double(0.5), + PVMax=cms.untracked.double(100.5), + + VtxNTracksFitMin=cms.untracked.double(0.), + VtxNdofMin=cms.untracked.double(4.), + VtxAbsZMax=cms.untracked.double(24.), + VtxRhoMax=cms.untracked.double(2.) + ) diff --git a/DQMOffline/Lumi/src/ElectronIdentifier.cc b/DQMOffline/Lumi/src/ElectronIdentifier.cc index 05eab88f24d21..d5f66dff8e14e 100644 --- a/DQMOffline/Lumi/src/ElectronIdentifier.cc +++ b/DQMOffline/Lumi/src/ElectronIdentifier.cc @@ -1,10 +1,7 @@ #include "DQMOffline/Lumi/interface/ElectronIdentifier.h" #include "FWCore/Framework/interface/Event.h" -#include "FWCore/Common/interface/TriggerNames.h" #include "FWCore/Utilities/interface/RegexMatch.h" #include "DataFormats/Common/interface/Handle.h" -#include "DataFormats/Common/interface/TriggerResults.h" -#include "DataFormats/HLTReco/interface/TriggerEvent.h" #include "DataFormats/VertexReco/interface/Vertex.h" #include "DataFormats/MuonReco/interface/Muon.h" #include "DataFormats/MuonReco/interface/MuonSelectors.h" @@ -14,9 +11,6 @@ #include "DataFormats/EgammaReco/interface/SuperCluster.h" #include "CommonTools/Egamma/interface/ConversionTools.h" -#include "DQMOffline/Lumi/interface/TTrigger.h" -#include "DQMOffline/Lumi/interface/TriggerTools.h" - #include #include #include diff --git a/DQMOffline/Lumi/src/TTrigger.cc b/DQMOffline/Lumi/src/TTrigger.cc deleted file mode 100644 index 25aa5976d9139..0000000000000 --- a/DQMOffline/Lumi/src/TTrigger.cc +++ /dev/null @@ -1,80 +0,0 @@ -#include "DQMOffline/Lumi/interface/TTrigger.h" -#include "FWCore/MessageLogger/interface/MessageLogger.h" - -#include -#include -#include -#include -#include - -using namespace ZCountingTrigger; - -//-------------------------------------------------------------------------------------------------- -// -// Reads in an input file specifying the triggers we're interested in. -// The input file has the format: -// -// -// A trigger with multiple objects will have multiple entries with the same but -// one entry for each . -// -// The trigger object leg numbering is to account for the possibility that a particular object of -// the trigger can evolve and obtain a different trigger object name, but we still want this to -// be associated with the same leg (e.g. the trailing electron in a dielectron trigger) -// -TTrigger::TTrigger(const std::vector &muonTriggerNames, - const std::vector &muonTriggerObjectNames) { - for (unsigned int i = 0; i < muonTriggerNames.size(); ++i) { - fRecords.push_back(ZCountingTrigger::TriggerRecord(muonTriggerNames.at(i), 0)); - fRecords.back().objectMap.push_back(std::pair(muonTriggerObjectNames.at(i), 0)); - } - fRecords.push_back(ZCountingTrigger::TriggerRecord("HLT_Ele35_WPTight_Gsf_v*", 1)); - fRecords.back().objectMap.push_back(std::pair("hltEle35noerWPTightGsfTrackIsoFilter", 0)); - fRecords.push_back(ZCountingTrigger::TriggerRecord("HLT_Ele27_WPTight_Gsf_v*", 2)); - fRecords.back().objectMap.push_back(std::pair("hltEle27WPTightGsfTrackIsoFilter", 0)); -} - -//-------------------------------------------------------------------------------------------------- -int TTrigger::getTriggerBit(const std::string &iName) const { - int lId = -1; - for (unsigned int i0 = 0; i0 < fRecords.size(); i0++) { - if (iName == fRecords[i0].hltPattern) - lId = i0; - } - if (lId == -1) - edm::LogWarning("ZCounting") << "=== Missing Trigger ==" << iName << std::endl; - return lId; -} - -//-------------------------------------------------------------------------------------------------- -int TTrigger::getTriggerObjectBit(const std::string &iName, const std::string &iObjName) const { - int lId = getTriggerBit(iName); - if (lId == -1) - return -1; - - for (unsigned int i0 = 0; i0 < fRecords[lId].objectMap.size(); i0++) { - if (iObjName != fRecords[lId].objectMap[i0].first) - continue; - return fRecords[lId].objectMap[i0].second; - } - - return -1; -} - -//-------------------------------------------------------------------------------------------------- -bool TTrigger::pass(const std::string &iName, const TriggerBits &iTrig) const { - int lId = getTriggerBit(iName); - if (lId == -1) - return false; - - return iTrig[lId]; -} - -//-------------------------------------------------------------------------------------------------- -bool TTrigger::passObj(const std::string &iName, const std::string &iObjName, const TriggerObjects &iTrigObj) const { - int lId = getTriggerObjectBit(iName, iObjName); - if (lId == -1) - return false; - - return iTrigObj[lId]; -} diff --git a/DQMOffline/Lumi/src/TriggerTools.cc b/DQMOffline/Lumi/src/TriggerTools.cc index 82ee68813a80b..0397f8bd1d9cc 100644 --- a/DQMOffline/Lumi/src/TriggerTools.cc +++ b/DQMOffline/Lumi/src/TriggerTools.cc @@ -1,39 +1,153 @@ #include "DQMOffline/Lumi/interface/TriggerTools.h" + +#include "FWCore/Utilities/interface/RegexMatch.h" #include "FWCore/Utilities/interface/InputTag.h" #include "DataFormats/Math/interface/deltaR.h" -#include -using namespace ZCountingTrigger; +#include //-------------------------------------------------------------------------------------------------- -TriggerObjects TriggerTools::matchHLT(const double eta, - const double phi, - const std::vector& triggerRecords, - const trigger::TriggerEvent& triggerEvent) { - const double dRMax = 0.2; - - TriggerObjects matchBits; - for (unsigned int irec = 0; irec < triggerRecords.size(); irec++) { - for (unsigned int iobj = 0; iobj < triggerRecords[irec].objectMap.size(); iobj++) { - const std::string& filterName = triggerRecords[irec].objectMap[iobj].first; - const unsigned int filterBit = triggerRecords[irec].objectMap[iobj].second; - - edm::InputTag filterTag(filterName, "", "HLT"); - // filterIndex must be less than the size of trgEvent or you get a CMSException: _M_range_check - if (triggerEvent.filterIndex(filterTag) < triggerEvent.sizeFilters()) { - const trigger::TriggerObjectCollection& toc(triggerEvent.getObjects()); - const trigger::Keys& keys(triggerEvent.filterKeys(triggerEvent.filterIndex(filterTag))); - - for (unsigned int hlto = 0; hlto < keys.size(); hlto++) { - trigger::size_type hltf = keys[hlto]; - const trigger::TriggerObject& tobj(toc[hltf]); - if (reco::deltaR(eta, phi, tobj.eta(), tobj.phi()) < dRMax) { - matchBits[filterBit] = true; - } +void TriggerTools::initPathNames(const std::vector& triggerNames) { + /* + init HLT path every run (e.g. versions can change) + */ + edm::LogVerbatim("TriggerTools") << "TriggerTools::initPathNames initHLT"; + for (auto& iRec : records) { + iRec.hltPathName = ""; + iRec.hltPathIndex = (unsigned int)-1; + const std::string pattern = iRec.hltPattern; + if (edm::is_glob(pattern)) { // handle pattern with wildcards (*,?) + std::vector::const_iterator> matches = edm::regexMatch(triggerNames, pattern); + if (matches.empty()) { + edm::LogWarning("ZCounting") << "requested pattern [" << pattern << "] does not match any HLT paths"; + } else { + for (auto const& match : matches) { + iRec.hltPathName = *match; } } + } else { // take full HLT path name given + iRec.hltPathName = pattern; } } +} + +//-------------------------------------------------------------------------------------------------- +void TriggerTools::initHLTObjects(const HLTConfigProvider& hltConfigProvider_) { + /* + execture each run to initialize the last filter of each trigger corresponding to the corresponding object that has fired the trigger + */ + edm::LogVerbatim("TriggerTools") << "TriggerTools::initHLTObjects initHLTObjects"; + const std::vector& triggerNames(hltConfigProvider_.triggerNames()); + + initPathNames(triggerNames); + + for (auto& iRec : records) { + std::vector hltFiltersWithTags_; + + for (auto const& iPathName : triggerNames) { + if (iPathName != iRec.hltPathName) { + continue; + } + edm::LogVerbatim("TriggerTools") << "TriggerTools::initHLTObjects trigger name: " << iPathName; + + iRec.hltPathIndex = hltConfigProvider_.triggerIndex(iPathName); + + auto const& moduleLabels(hltConfigProvider_.moduleLabels(iRec.hltPathIndex)); + + for (int idx = moduleLabels.size() - 1; idx >= 0; --idx) { + auto const& moduleLabel(moduleLabels.at(idx)); + + auto const& moduleEDMType(hltConfigProvider_.moduleEDMType(moduleLabel)); + if (moduleEDMType != "EDFilter") { + continue; + } + + auto const& moduleType(hltConfigProvider_.moduleType(moduleLabel)); + if ((moduleType == "HLTTriggerTypeFilter") or (moduleType == "HLTBool") or (moduleType == "HLTPrescaler")) { + continue; + } + + if (!hltConfigProvider_.saveTags(moduleLabel)) { + continue; + } + edm::LogVerbatim("TriggerTools") << "TriggerTools::initHLTObjects new hlt object name: " << moduleLabel; + + iRec.hltObjName = moduleLabel; + break; + } + break; + } - return matchBits; + if (iRec.hltPathIndex == (unsigned int)-1) { + edm::LogWarning("TriggerTools") << "TriggerTools::initHLTObjects hltPathIndex has not been found for: " << iRec.hltPattern << std::endl; + continue; + } + } } + +//-------------------------------------------------------------------------------------------------- +void TriggerTools::readEvent(const edm::Event& iEvent) { + /* + execture each event to load trigger objects + */ + + LogDebug("TriggerTools") << "TriggerTools::readEvent"; + + iEvent.getByToken(fHLTTag_token, hTrgRes); + if (!hTrgRes.isValid()) { + edm::LogWarning("TriggerTools") << "TriggerTools::readEvent No valid trigger result product found"; + } + + iEvent.getByToken(fHLTObjTag_token, hTrgEvt); + if (!hTrgEvt.isValid()) { + edm::LogWarning("TriggerTools") << "TriggerTools::readEvent No valid trigger event product found"; + } + + triggerBits.reset(); + for (unsigned int i = 0; i < records.size(); i++) { + if (records.at(i).hltPathIndex == (unsigned int)-1) { + LogDebug("TriggerTools") << "TriggerTools::readEvent hltPathIndex has not been set" << std::endl; + continue; + } + if (hTrgRes->accept(records.at(i).hltPathIndex)) { + triggerBits[i] = true; + } + } + LogDebug("TriggerTools") << "TriggerTools::readEvent bitset = " << triggerBits[1] << triggerBits[0]; +} + +//-------------------------------------------------------------------------------------------------- +bool TriggerTools::pass() const { + /* + check if the event passed any of the initialized triggers + */ + + return triggerBits!=0; +} + +//-------------------------------------------------------------------------------------------------- +bool TriggerTools::passObj(const double eta, const double phi) const { + /* + check if the object is matched to any trigger of the initialized triggers, and that this trigger is passed + */ + + for (unsigned int i = 0; i < records.size(); i++) { + const std::string& filterName = records.at(i).hltObjName; + + edm::InputTag filterTag(filterName, "", "HLT"); + // filterIndex must be less than the size of trgEvent or you get a CMSException: _M_range_check + if (hTrgEvt->filterIndex(filterTag) < hTrgEvt->sizeFilters()) { + const trigger::TriggerObjectCollection& toc(hTrgEvt->getObjects()); + const trigger::Keys& keys(hTrgEvt->filterKeys(hTrgEvt->filterIndex(filterTag))); + + for (unsigned int hlto = 0; hlto < keys.size(); hlto++) { + trigger::size_type hltf = keys[hlto]; + const trigger::TriggerObject& tobj(toc[hltf]); + if (reco::deltaR(eta, phi, tobj.eta(), tobj.phi()) < DRMAX) { + return true; + } + } + } + } + return false; +} \ No newline at end of file diff --git a/DQMOffline/Lumi/test/ZCounting_cfg.py b/DQMOffline/Lumi/test/ZCounting_cfg.py deleted file mode 100644 index d90edd57d3cea..0000000000000 --- a/DQMOffline/Lumi/test/ZCounting_cfg.py +++ /dev/null @@ -1,76 +0,0 @@ -import FWCore.ParameterSet.Config as cms - -from Configuration.Eras.Era_Run2_2018_cff import Run2_2018 -process = cms.Process('RECODQM', Run2_2018) - -# import of standard configurations -process.load('Configuration/StandardSequences/Services_cff') -process.load('FWCore/MessageService/MessageLogger_cfi') -process.load('Configuration/StandardSequences/GeometryDB_cff') -process.load('Configuration/StandardSequences/MagneticField_38T_cff') -process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') -#process.load('Configuration/StandardSequences/FrontierConditions_GlobalTag_cff') -process.load('Configuration/EventContent/EventContent_cff') -process.load('TrackingTools/TransientTrack/TransientTrackBuilder_cfi') -process.load('Configuration.StandardSequences.EDMtoMEAtRunEnd_cff') - -# load DQM -process.load("DQMServices.Core.DQM_cfg") -process.load("DQMServices.Components.DQMEnvironment_cfi") - -process.MessageLogger.cerr.FwkReport.reportEvery = 1000 -process.GlobalTag.globaltag = '101X_dataRun2_Prompt_v9' -#process.GlobalTag.globaltag = '92X_dataRun2_Prompt_v4' - - -# trigger filter -process.load('HLTrigger/HLTfilters/hltHighLevel_cfi') -process.hltHighLevel.throw = cms.bool(False) -process.hltHighLevel.HLTPaths = cms.vstring() - - -from CondCore.CondDB.CondDB_cfi import * - -process.maxEvents = cms.untracked.PSet( input = cms.untracked.int32(100) ) -process.source = cms.Source("PoolSource", - fileNames = cms.untracked.vstring( -#'/store/data/Run2017B/SingleMuon/RECO/PromptReco-v1/000/297/218/00000/14C84999-6457-E711-AAE4-02163E0136E0.root' -'file:/eos/cms/store/data/Run2018D/SingleMuon/AOD/22Jan2019-v2/110000/104D2C01-12D2-0742-BE61-897755323EDE.root' - ) - ) - -process.source.inputCommands = cms.untracked.vstring("keep *", - "drop *_MEtoEDMConverter_*_*") - -process.options = cms.untracked.PSet( - wantSummary = cms.untracked.bool(False), - Rethrow = cms.untracked.vstring('ProductNotFound'), - fileMode = cms.untracked.string('FULLMERGE') - ) - - -from DQMOffline.Lumi.ZCounting_cff import zcounting - -process.load("DQMOffline.Lumi.ZCounting_cff") - -#process.zcounting.MuonTriggerNames = cms.vstring("HLT_IsoMu27_v*","HLT_IsoMu24_v*") -#process.zcounting.MuonTriggerObjectNames = cms.vstring("hltL3crIsoL1sMu22Or25L1f0L2f10QL3f27QL3trkIsoFiltered0p07", -# "hltL3crIsoL1sSingleMu22L1f0L2f10QL3f24QL3trkIsoFiltered0p07") - -process.DQMoutput = cms.OutputModule("DQMRootOutputModule", - fileName = cms.untracked.string("OUT_step1.root")) - -# Path and EndPath definitions -process.dqmoffline_step = cms.Path(process.zcounting) -process.dqmsave_step = cms.Path(process.DQMSaver) -#process.DQMoutput_step = cms.EndPath(process.DQMoutput) - - -# Schedule definition -process.schedule = cms.Schedule( - process.dqmoffline_step, -# process.DQMoutput_step - process.dqmsave_step - ) - -process.dqmSaver.workflow = '/SingleMuon/Run2017B-PromptReco-v1/RECO' diff --git a/DQMOffline/Lumi/test/zcounting_step1_fromAOD.py b/DQMOffline/Lumi/test/zcounting_step1_fromAOD.py new file mode 100644 index 0000000000000..711dc94c5574a --- /dev/null +++ b/DQMOffline/Lumi/test/zcounting_step1_fromAOD.py @@ -0,0 +1,108 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: step1 -s DQM:@lumi --conditions=124X_dataRun3_Prompt_v4 --datatier DQMIO --eventcontent DQM --filein=root://eoscms.cern.ch//eos/cms/tier0/store/data/Run2022C/Muon/AOD/PromptReco-v1/000/357/000/00000/0a70812e-3573-4552-955d-e3be9ec4af47.root --fileout=FILEOUT.root -n -1 --data --geometry DB:Extended --python_file step1_fromAOD.py +import FWCore.ParameterSet.Config as cms + + + +process = cms.Process('DQM') + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('DQMServices.Core.DQMStoreNonLegacy_cff') +process.load('DQMOffline.Configuration.DQMOffline_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(-1), + output = cms.optional.untracked.allowed(cms.int32,cms.PSet) +) + +process.MessageLogger.cerr.FwkReport.reportEvery = 1000 + +# Input source +process.source = cms.Source("PoolSource", + fileNames = cms.untracked.vstring('root://eoscms.cern.ch//eos/cms/tier0/store/data/Run2022C/Muon/AOD/PromptReco-v1/000/357/000/00000/0a70812e-3573-4552-955d-e3be9ec4af47.root'), + secondaryFileNames = cms.untracked.vstring() +) + +process.options = cms.untracked.PSet( + FailPath = cms.untracked.vstring(), + IgnoreCompletely = cms.untracked.vstring(), + Rethrow = cms.untracked.vstring(), + SkipEvent = cms.untracked.vstring(), + accelerators = cms.untracked.vstring('*'), + allowUnscheduled = cms.obsolete.untracked.bool, + canDeleteEarly = cms.untracked.vstring(), + deleteNonConsumedUnscheduledModules = cms.untracked.bool(True), + dumpOptions = cms.untracked.bool(False), + emptyRunLumiMode = cms.obsolete.untracked.string, + eventSetup = cms.untracked.PSet( + forceNumberOfConcurrentIOVs = cms.untracked.PSet( + allowAnyLabel_=cms.required.untracked.uint32 + ), + numberOfConcurrentIOVs = cms.untracked.uint32(0) + ), + fileMode = cms.untracked.string('FULLMERGE'), + forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False), + makeTriggerResults = cms.obsolete.untracked.bool, + numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0), + numberOfConcurrentRuns = cms.untracked.uint32(1), + numberOfStreams = cms.untracked.uint32(0), + numberOfThreads = cms.untracked.uint32(1), + printDependencies = cms.untracked.bool(False), + sizeOfStackForThreadsInKB = cms.optional.untracked.uint32, + throwIfIllegalParameter = cms.untracked.bool(True), + wantSummary = cms.untracked.bool(True) +) + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('step1 nevts:-1'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.DQMoutput = cms.OutputModule("DQMRootOutputModule", + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('DQMIO'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('FILEOUT.root'), + outputCommands = process.DQMEventContent.outputCommands, + splitLevel = cms.untracked.int32(0) +) + +# Additional output definition + +# Other statements +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, '124X_dataRun3_Prompt_v4', '') + +# Path and EndPath definitions +process.dqmoffline_step = cms.EndPath(process.DQMOfflineLumi) +process.dqmofflineOnPAT_step = cms.EndPath(process.PostDQMOffline) +process.DQMoutput_step = cms.EndPath(process.DQMoutput) + +# Schedule definition +process.schedule = cms.Schedule(process.dqmoffline_step,process.dqmofflineOnPAT_step,process.DQMoutput_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) + + + +# Customisation from command line + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion diff --git a/DQMOffline/Lumi/test/zcounting_step1_fromRAW.py b/DQMOffline/Lumi/test/zcounting_step1_fromRAW.py new file mode 100644 index 0000000000000..56a0a770f3b86 --- /dev/null +++ b/DQMOffline/Lumi/test/zcounting_step1_fromRAW.py @@ -0,0 +1,127 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: step1 --conditions=124X_dataRun3_Prompt_v4 --data --datatier RECO,DQMIO --era Run3 --eventcontent RECO,DQM --filein file:/eos/cms/tier0/store/data/Run2022C/Muon/RAW/v1/000/357/479/00001/0322010f-75fe-44a6-ad5d-7f53bd5177a7.root --fileout file:step1.root --no_exec --number 10 --process reRECO --python_filename step_2_cfg.py --scenario pp --step RAW2DIGI,L1Reco,RECO,DQM:@lumi +import FWCore.ParameterSet.Config as cms + +from Configuration.Eras.Era_Run3_cff import Run3 + +process = cms.Process('reRECO',Run3) + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.RawToDigi_Data_cff') +process.load('Configuration.StandardSequences.L1Reco_cff') +process.load('Configuration.StandardSequences.Reconstruction_Data_cff') +process.load('DQMServices.Core.DQMStoreNonLegacy_cff') +process.load('DQMOffline.Configuration.DQMOffline_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(10), + output = cms.optional.untracked.allowed(cms.int32,cms.PSet) +) + +# Input source +process.source = cms.Source("PoolSource", + fileNames = cms.untracked.vstring('file:/eos/cms/tier0/store/data/Run2022C/Muon/RAW/v1/000/357/479/00001/0322010f-75fe-44a6-ad5d-7f53bd5177a7.root'), + secondaryFileNames = cms.untracked.vstring() +) + +process.options = cms.untracked.PSet( + FailPath = cms.untracked.vstring(), + IgnoreCompletely = cms.untracked.vstring(), + Rethrow = cms.untracked.vstring(), + SkipEvent = cms.untracked.vstring(), + accelerators = cms.untracked.vstring('*'), + allowUnscheduled = cms.obsolete.untracked.bool, + canDeleteEarly = cms.untracked.vstring(), + deleteNonConsumedUnscheduledModules = cms.untracked.bool(True), + dumpOptions = cms.untracked.bool(False), + emptyRunLumiMode = cms.obsolete.untracked.string, + eventSetup = cms.untracked.PSet( + forceNumberOfConcurrentIOVs = cms.untracked.PSet( + allowAnyLabel_=cms.required.untracked.uint32 + ), + numberOfConcurrentIOVs = cms.untracked.uint32(0) + ), + fileMode = cms.untracked.string('FULLMERGE'), + forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False), + makeTriggerResults = cms.obsolete.untracked.bool, + numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0), + numberOfConcurrentRuns = cms.untracked.uint32(1), + numberOfStreams = cms.untracked.uint32(0), + numberOfThreads = cms.untracked.uint32(1), + printDependencies = cms.untracked.bool(False), + sizeOfStackForThreadsInKB = cms.optional.untracked.uint32, + throwIfIllegalParameter = cms.untracked.bool(True), + wantSummary = cms.untracked.bool(False) +) + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('step1 nevts:10'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +process.RECOoutput = cms.OutputModule("PoolOutputModule", + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('RECO'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('file:step1.root'), + outputCommands = process.RECOEventContent.outputCommands, + splitLevel = cms.untracked.int32(0) +) + +process.DQMoutput = cms.OutputModule("DQMRootOutputModule", + dataset = cms.untracked.PSet( + dataTier = cms.untracked.string('DQMIO'), + filterName = cms.untracked.string('') + ), + fileName = cms.untracked.string('file:step1_inDQM.root'), + outputCommands = process.DQMEventContent.outputCommands, + splitLevel = cms.untracked.int32(0) +) + +# Additional output definition + +# Other statements +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, '124X_dataRun3_Prompt_v4', '') + +# Path and EndPath definitions +process.raw2digi_step = cms.Path(process.RawToDigi) +process.L1Reco_step = cms.Path(process.L1Reco) +process.reconstruction_step = cms.Path(process.reconstruction) +process.dqmoffline_step = cms.EndPath(process.DQMOfflineLumi) +process.dqmofflineOnPAT_step = cms.EndPath(process.PostDQMOffline) +process.RECOoutput_step = cms.EndPath(process.RECOoutput) +process.DQMoutput_step = cms.EndPath(process.DQMoutput) + +# Schedule definition +process.schedule = cms.Schedule(process.raw2digi_step,process.L1Reco_step,process.reconstruction_step,process.dqmoffline_step,process.dqmofflineOnPAT_step,process.RECOoutput_step,process.DQMoutput_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) + + + +# Customisation from command line + +#Have logErrorHarvester wait for the same EDProducers to finish as those providing data for the OutputModule +from FWCore.Modules.logErrorHarvester_cff import customiseLogErrorHarvesterUsingOutputCommands +process = customiseLogErrorHarvesterUsingOutputCommands(process) + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion diff --git a/DQMOffline/Lumi/test/zcounting_step2_fromAOD.py b/DQMOffline/Lumi/test/zcounting_step2_fromAOD.py new file mode 100644 index 0000000000000..e78b3fd7c4b83 --- /dev/null +++ b/DQMOffline/Lumi/test/zcounting_step2_fromAOD.py @@ -0,0 +1,108 @@ +# Auto generated configuration file +# using: +# Revision: 1.19 +# Source: /local/reps/CMSSW/CMSSW/Configuration/Applications/python/ConfigBuilder.py,v +# with command line options: step2 -s HARVESTING:@lumi --conditions=124X_dataRun3_Prompt_v4 --datatier AOD --filein=file:FILEOUT.root --fileout=FILEOUT_Harvest.root --data --geometry DB:Extended --filetype DQM --python_file step2_fromAOD.py +import FWCore.ParameterSet.Config as cms + + + +process = cms.Process('HARVESTING') + +# import of standard configurations +process.load('Configuration.StandardSequences.Services_cff') +process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi') +process.load('FWCore.MessageService.MessageLogger_cfi') +process.load('Configuration.EventContent.EventContent_cff') +process.load('Configuration.StandardSequences.GeometryRecoDB_cff') +process.load('Configuration.StandardSequences.MagneticField_cff') +process.load('Configuration.StandardSequences.DQMSaverAtRunEnd_cff') +process.load('Configuration.StandardSequences.Harvesting_cff') +process.load('Configuration.StandardSequences.FrontierConditions_GlobalTag_cff') + +process.maxEvents = cms.untracked.PSet( + input = cms.untracked.int32(1), + output = cms.optional.untracked.allowed(cms.int32,cms.PSet) +) + +# Input source +process.source = cms.Source("DQMRootSource", + fileNames = cms.untracked.vstring('file:FILEOUT.root') +) + +process.options = cms.untracked.PSet( + FailPath = cms.untracked.vstring(), + IgnoreCompletely = cms.untracked.vstring(), + Rethrow = cms.untracked.vstring('ProductNotFound'), + SkipEvent = cms.untracked.vstring(), + accelerators = cms.untracked.vstring('*'), + allowUnscheduled = cms.obsolete.untracked.bool, + canDeleteEarly = cms.untracked.vstring(), + deleteNonConsumedUnscheduledModules = cms.untracked.bool(True), + dumpOptions = cms.untracked.bool(False), + emptyRunLumiMode = cms.obsolete.untracked.string, + eventSetup = cms.untracked.PSet( + forceNumberOfConcurrentIOVs = cms.untracked.PSet( + allowAnyLabel_=cms.required.untracked.uint32 + ), + numberOfConcurrentIOVs = cms.untracked.uint32(0) + ), + fileMode = cms.untracked.string('FULLMERGE'), + forceEventSetupCacheClearOnNewRun = cms.untracked.bool(False), + makeTriggerResults = cms.obsolete.untracked.bool, + numberOfConcurrentLuminosityBlocks = cms.untracked.uint32(0), + numberOfConcurrentRuns = cms.untracked.uint32(1), + numberOfStreams = cms.untracked.uint32(0), + numberOfThreads = cms.untracked.uint32(1), + printDependencies = cms.untracked.bool(False), + sizeOfStackForThreadsInKB = cms.optional.untracked.uint32, + throwIfIllegalParameter = cms.untracked.bool(True), + wantSummary = cms.untracked.bool(False) +) + +# Production Info +process.configurationMetadata = cms.untracked.PSet( + annotation = cms.untracked.string('step2 nevts:1'), + name = cms.untracked.string('Applications'), + version = cms.untracked.string('$Revision: 1.19 $') +) + +# Output definition + +# Additional output definition + +# Other statements +from Configuration.AlCa.GlobalTag import GlobalTag +process.GlobalTag = GlobalTag(process.GlobalTag, '124X_dataRun3_Prompt_v4', '') + +# Path and EndPath definitions +process.alcaHarvesting = cms.Path() +process.dqmHarvesting = cms.Path(process.DQMOffline_SecondStep+process.DQMOffline_Certification) +process.dqmHarvestingExtraHLT = cms.Path(process.DQMOffline_SecondStep_ExtraHLT+process.DQMOffline_Certification) +process.dqmHarvestingFakeHLT = cms.Path(process.DQMOffline_SecondStep_FakeHLT+process.DQMOffline_Certification) +process.dqmHarvestingPOGMC = cms.Path(process.DQMOffline_SecondStep_PrePOGMC) +process.genHarvesting = cms.Path(process.postValidation_gen) +process.validationHarvesting = cms.Path(process.postValidation+process.hltpostvalidation+process.postValidation_gen) +process.validationHarvestingFS = cms.Path(process.recoMuonPostProcessors+process.postValidationTracking+process.MuIsoValPostProcessor+process.calotowersPostProcessor+process.hcalSimHitsPostProcessor+process.hcaldigisPostProcessor+process.hcalrechitsPostProcessor+process.electronPostValidationSequence+process.photonPostProcessor+process.pfJetClient+process.pfMETClient+process.pfJetResClient+process.pfElectronClient+process.rpcRecHitPostValidation_step+process.makeBetterPlots+process.bTagCollectorSequenceMCbcl+process.METPostProcessor+process.L1GenPostProcessor+process.bdHadronTrackPostProcessor+process.MuonCSCDigisPostProcessors+process.postValidation_gen) +process.validationHarvestingHI = cms.Path(process.postValidationHI) +process.validationHarvestingMiniAOD = cms.Path(process.JetPostProcessor+process.METPostProcessorHarvesting+process.bTagMiniValidationHarvesting+process.postValidationMiniAOD) +process.validationHarvestingNoHLT = cms.Path(process.postValidation+process.postValidation_gen) +process.validationpreprodHarvesting = cms.Path(process.postValidation_preprod+process.hltpostvalidation_preprod+process.postValidation_gen) +process.validationpreprodHarvestingNoHLT = cms.Path(process.postValidation_preprod+process.postValidation_gen) +process.validationprodHarvesting = cms.Path(process.hltpostvalidation_prod+process.postValidation_gen) +process.DQMNone_step = cms.Path(process.DQMNone) +process.dqmsave_step = cms.Path(process.DQMSaver) + +# Schedule definition +process.schedule = cms.Schedule(process.DQMNone_step,process.dqmsave_step) +from PhysicsTools.PatAlgos.tools.helpers import associatePatAlgosToolsTask +associatePatAlgosToolsTask(process) + + + +# Customisation from command line + +# Add early deletion of temporary data products to reduce peak memory need +from Configuration.StandardSequences.earlyDeleteSettings_cff import customiseEarlyDelete +process = customiseEarlyDelete(process) +# End adding early deletion From f457c021febd895489329c96d035a4d2303b340b Mon Sep 17 00:00:00 2001 From: david walter Date: Fri, 19 Aug 2022 18:00:15 +0200 Subject: [PATCH 2/2] Apply code-checks and code-format --- DQMOffline/Lumi/plugins/ZCounting.cc | 7 +- DQMOffline/Lumi/plugins/ZCounting.h | 7 +- DQMOffline/Lumi/plugins/ZCountingElectrons.cc | 122 +++++++++++++----- DQMOffline/Lumi/plugins/ZCountingElectrons.h | 5 +- DQMOffline/Lumi/src/TriggerTools.cc | 5 +- 5 files changed, 102 insertions(+), 44 deletions(-) diff --git a/DQMOffline/Lumi/plugins/ZCounting.cc b/DQMOffline/Lumi/plugins/ZCounting.cc index b77d3d373db2b..00963672c5907 100644 --- a/DQMOffline/Lumi/plugins/ZCounting.cc +++ b/DQMOffline/Lumi/plugins/ZCounting.cc @@ -49,8 +49,7 @@ ZCounting::ZCounting(const edm::ParameterSet& iConfig) IDTypestr_(iConfig.getUntrackedParameter("IDType")), IsoTypestr_(iConfig.getUntrackedParameter("IsoType")), - IsoCut_(iConfig.getUntrackedParameter("IsoCut")) -{ + IsoCut_(iConfig.getUntrackedParameter("IsoCut")) { edm::LogInfo("ZCounting") << "Constructor ZCounting::ZCounting " << std::endl; // Trigger settings @@ -61,7 +60,7 @@ ZCounting::ZCounting(const edm::ParameterSet& iConfig) edm::LogVerbatim("ZCounting") << "ZCounting::ZCounting set trigger names"; const std::vector patterns_ = iConfig.getParameter>("MuonTriggerNames"); - for (const std::string pattern_ : patterns_) { + for (const std::string& pattern_ : patterns_) { triggers->addTriggerRecord(pattern_); } @@ -274,7 +273,7 @@ void ZCounting::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) return; } - const reco::Vertex* pv = 0; + const reco::Vertex* pv = nullptr; int nvtx = 0; for (auto const& itVtx : *hVertexProduct) { diff --git a/DQMOffline/Lumi/plugins/ZCounting.h b/DQMOffline/Lumi/plugins/ZCounting.h index 4e87416efd5e3..2dff7a5f3fcf6 100644 --- a/DQMOffline/Lumi/plugins/ZCounting.h +++ b/DQMOffline/Lumi/plugins/ZCounting.h @@ -38,7 +38,7 @@ class ZCounting : public DQMEDAnalyzer { private: //other functions - bool passMuonID(const reco::Muon& muon, const reco::Vertex *vtx); + bool passMuonID(const reco::Muon& muon, const reco::Vertex* vtx); bool passMuonIso(const reco::Muon& muon); bool isCustomTightMuon(const reco::Muon& muon); @@ -80,14 +80,14 @@ class ZCounting : public DQMEDAnalyzer { const std::string IDTypestr_; const std::string IsoTypestr_; const double IsoCut_; - + // muon ID and ISO parameters MuonIDTypes IDType_{NoneID}; MuonIsoTypes IsoType_{NoneIso}; // trigger objects HLTConfigProvider hltConfigProvider_; - TriggerTools *triggers; + TriggerTools* triggers; // constants const double DRMAX = 0.1; // max dR matching between muon and hlt object @@ -114,7 +114,6 @@ class ZCounting : public DQMEDAnalyzer { MonitorElement* h_mass_Glo_fail_BB; MonitorElement* h_mass_Glo_fail_BE; MonitorElement* h_mass_Glo_fail_EE; - }; #endif diff --git a/DQMOffline/Lumi/plugins/ZCountingElectrons.cc b/DQMOffline/Lumi/plugins/ZCountingElectrons.cc index 516268129087d..73a8672160c02 100644 --- a/DQMOffline/Lumi/plugins/ZCountingElectrons.cc +++ b/DQMOffline/Lumi/plugins/ZCountingElectrons.cc @@ -17,11 +17,14 @@ // ZCountingElectrons::ZCountingElectrons(const edm::ParameterSet& iConfig) : triggerResultsInputTag_(iConfig.getParameter("TriggerResults")), - fPVName_token(consumes(iConfig.getUntrackedParameter("edmPVName", "offlinePrimaryVertices"))), + fPVName_token(consumes( + iConfig.getUntrackedParameter("edmPVName", "offlinePrimaryVertices"))), // Electron-specific Parameters - fGsfElectronName_token(consumes>(iConfig.getUntrackedParameter("edmGsfEleName", "gedGsfElectrons"))), - fSCName_token(consumes>(iConfig.getUntrackedParameter("edmSCName", "particleFlowEGamma"))), + fGsfElectronName_token(consumes>( + iConfig.getUntrackedParameter("edmGsfEleName", "gedGsfElectrons"))), + fSCName_token(consumes>( + iConfig.getUntrackedParameter("edmSCName", "particleFlowEGamma"))), // Electron-specific Tags fRhoToken(consumes(iConfig.getParameter("rhoname"))), @@ -40,7 +43,7 @@ ZCountingElectrons::ZCountingElectrons(const edm::ParameterSet& iConfig) LumiBin_(iConfig.getUntrackedParameter("LumiBin")), LumiMin_(iConfig.getUntrackedParameter("LumiMin")), - LumiMax_(iConfig.getUntrackedParameter("LumiMax")), + LumiMax_(iConfig.getUntrackedParameter("LumiMax")), PVBin_(iConfig.getUntrackedParameter("PVBin")), PVMin_(iConfig.getUntrackedParameter("PVMin")), @@ -62,20 +65,20 @@ ZCountingElectrons::ZCountingElectrons(const edm::ParameterSet& iConfig) triggers->setDRMAX(DRMAX); edm::LogVerbatim("ZCounting") << "ZCounting::ZCounting set trigger names"; - const std::vector patterns_ = - iConfig.getParameter>("ElectronTriggerNames"); - for (const std::string pattern_ : patterns_) { + const std::vector patterns_ = iConfig.getParameter>("ElectronTriggerNames"); + for (const std::string& pattern_ : patterns_) { triggers->addTriggerRecord(pattern_); } - EleID_.setID(ELE_ID_WP); } // // -------------------------------------- Destructor -------------------------------------------- // -ZCountingElectrons::~ZCountingElectrons() { edm::LogInfo("ZCountingElectrons") << "Destructor ZCountingElectrons::~ZCountingElectrons " << std::endl; } +ZCountingElectrons::~ZCountingElectrons() { + edm::LogInfo("ZCountingElectrons") << "Destructor ZCountingElectrons::~ZCountingElectrons " << std::endl; +} // // -------------------------------------- beginRun -------------------------------------------- @@ -89,15 +92,15 @@ void ZCountingElectrons::dqmBeginRun(edm::Run const& iRun, edm::EventSetup const bool hltChanged_ = true; if (hltConfigProvider_.init(iRun, iSetup, triggerResultsInputTag_.process(), hltChanged_)) { - edm::LogVerbatim("ZCountingElectrons") << "ZCountingElectrons::dqmBeginRun [TriggerObjMatchValueMapsProducer::beginRun] " - "HLTConfigProvider initialized [processName() = \"" - << hltConfigProvider_.processName() << "\", tableName() = \"" - << hltConfigProvider_.tableName() << "\", size() = " << hltConfigProvider_.size() - << "]"; + edm::LogVerbatim("ZCountingElectrons") + << "ZCountingElectrons::dqmBeginRun [TriggerObjMatchValueMapsProducer::beginRun] " + "HLTConfigProvider initialized [processName() = \"" + << hltConfigProvider_.processName() << "\", tableName() = \"" << hltConfigProvider_.tableName() + << "\", size() = " << hltConfigProvider_.size() << "]"; } else { - edm::LogError("ZCountingElectrons") << "ZCountingElectrons::dqmBeginRun Initialization of HLTConfigProvider failed for Run=" - << iRun.id() << " (process=\"" << triggerResultsInputTag_.process() - << "\") -> plugin will not produce outputs for this Run"; + edm::LogError("ZCountingElectrons") + << "ZCountingElectrons::dqmBeginRun Initialization of HLTConfigProvider failed for Run=" << iRun.id() + << " (process=\"" << triggerResultsInputTag_.process() << "\") -> plugin will not produce outputs for this Run"; return; } @@ -118,26 +121,83 @@ void ZCountingElectrons::bookHistograms(DQMStore::IBooker& ibooker_, edm::Run co h_npv->setAxisTitle("number of primary vertices", 2); // Electron histograms - h_ee_mass_id_pass_central = ibooker_.book2D("h_ee_mass_id_pass_central", "h_ee_mass_id_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_fail_central = ibooker_.book2D("h_ee_mass_id_fail_central", "h_ee_mass_id_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_pass_forward = ibooker_.book2D("h_ee_mass_id_pass_forward", "h_ee_mass_id_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_id_fail_forward = ibooker_.book2D("h_ee_mass_id_fail_forward", "h_ee_mass_id_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - - h_ee_mass_HLT_pass_central = ibooker_.book2D("h_ee_mass_HLT_pass_central", "h_ee_mass_HLT_pass_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_fail_central = ibooker_.book2D("h_ee_mass_HLT_fail_central", "h_ee_mass_HLT_fail_central", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_pass_forward = ibooker_.book2D("h_ee_mass_HLT_pass_forward", "h_ee_mass_HLT_pass_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - h_ee_mass_HLT_fail_forward = ibooker_.book2D("h_ee_mass_HLT_fail_forward", "h_ee_mass_HLT_fail_forward", LumiBin_, LumiMin_, LumiMax_, MassBin_, MassMin_, MassMax_); - - h_ee_yield_Z_ebeb = ibooker_.book1D("h_ee_yield_Z_ebeb", "h_ee_yield_Z_ebeb", LumiBin_, LumiMin_, LumiMax_); - h_ee_yield_Z_ebee = ibooker_.book1D("h_ee_yield_Z_ebee", "h_ee_yield_Z_ebee", LumiBin_, LumiMin_, LumiMax_); - h_ee_yield_Z_eeee = ibooker_.book1D("h_ee_yield_Z_eeee", "h_ee_yield_Z_eeee", LumiBin_, LumiMin_, LumiMax_); + h_ee_mass_id_pass_central = ibooker_.book2D("h_ee_mass_id_pass_central", + "h_ee_mass_id_pass_central", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_id_fail_central = ibooker_.book2D("h_ee_mass_id_fail_central", + "h_ee_mass_id_fail_central", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_id_pass_forward = ibooker_.book2D("h_ee_mass_id_pass_forward", + "h_ee_mass_id_pass_forward", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_id_fail_forward = ibooker_.book2D("h_ee_mass_id_fail_forward", + "h_ee_mass_id_fail_forward", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_ee_mass_HLT_pass_central = ibooker_.book2D("h_ee_mass_HLT_pass_central", + "h_ee_mass_HLT_pass_central", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_HLT_fail_central = ibooker_.book2D("h_ee_mass_HLT_fail_central", + "h_ee_mass_HLT_fail_central", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_HLT_pass_forward = ibooker_.book2D("h_ee_mass_HLT_pass_forward", + "h_ee_mass_HLT_pass_forward", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + h_ee_mass_HLT_fail_forward = ibooker_.book2D("h_ee_mass_HLT_fail_forward", + "h_ee_mass_HLT_fail_forward", + LumiBin_, + LumiMin_, + LumiMax_, + MassBin_, + MassMin_, + MassMax_); + + h_ee_yield_Z_ebeb = ibooker_.book1D("h_ee_yield_Z_ebeb", "h_ee_yield_Z_ebeb", LumiBin_, LumiMin_, LumiMax_); + h_ee_yield_Z_ebee = ibooker_.book1D("h_ee_yield_Z_ebee", "h_ee_yield_Z_ebee", LumiBin_, LumiMin_, LumiMax_); + h_ee_yield_Z_eeee = ibooker_.book1D("h_ee_yield_Z_eeee", "h_ee_yield_Z_eeee", LumiBin_, LumiMin_, LumiMax_); } // // -------------------------------------- Analyze -------------------------------------------- // //-------------------------------------------------------------------------------------------------- -void ZCountingElectrons::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) { // Fill event tree on the fly +void ZCountingElectrons::analyze(const edm::Event& iEvent, + const edm::EventSetup& iSetup) { // Fill event tree on the fly edm::LogInfo("ZCountingElectrons") << "ZCountingElectrons::analyze" << std::endl; //------------------------------- diff --git a/DQMOffline/Lumi/plugins/ZCountingElectrons.h b/DQMOffline/Lumi/plugins/ZCountingElectrons.h index bd56a1817bb6f..1b466d8e251c4 100644 --- a/DQMOffline/Lumi/plugins/ZCountingElectrons.h +++ b/DQMOffline/Lumi/plugins/ZCountingElectrons.h @@ -32,7 +32,6 @@ class ZCountingElectrons : public DQMEDAnalyzer { void analyze(edm::Event const& e, edm::EventSetup const& eSetup) override; private: - // Electron-specific functions bool ele_probe_selection(double pt, double abseta); bool ele_tag_selection(double pt, double abseta); @@ -74,9 +73,9 @@ class ZCountingElectrons : public DQMEDAnalyzer { // trigger objects HLTConfigProvider hltConfigProvider_; - TriggerTools *triggers; + TriggerTools* triggers; - //constants + //constants const double DRMAX = 0.1; // max dR matching between muon and hlt object const float ELECTRON_MASS = 0.000511; const float ELE_ETA_CRACK_LOW = 1.4442; diff --git a/DQMOffline/Lumi/src/TriggerTools.cc b/DQMOffline/Lumi/src/TriggerTools.cc index 0397f8bd1d9cc..b26d60941f5d6 100644 --- a/DQMOffline/Lumi/src/TriggerTools.cc +++ b/DQMOffline/Lumi/src/TriggerTools.cc @@ -79,7 +79,8 @@ void TriggerTools::initHLTObjects(const HLTConfigProvider& hltConfigProvider_) { } if (iRec.hltPathIndex == (unsigned int)-1) { - edm::LogWarning("TriggerTools") << "TriggerTools::initHLTObjects hltPathIndex has not been found for: " << iRec.hltPattern << std::endl; + edm::LogWarning("TriggerTools") << "TriggerTools::initHLTObjects hltPathIndex has not been found for: " + << iRec.hltPattern << std::endl; continue; } } @@ -122,7 +123,7 @@ bool TriggerTools::pass() const { check if the event passed any of the initialized triggers */ - return triggerBits!=0; + return triggerBits != 0; } //--------------------------------------------------------------------------------------------------