Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions DQM/HLTEvF/python/ScoutingElectronMonitoring_cff.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import FWCore.ParameterSet.Config as cms
from HLTriggerOffline.Scouting.ScoutingEGammaCollectionMonitoring_cfi import *
from HLTriggerOffline.Scouting.ScoutingElectronTagProbeAnalyzer_cfi import *

ScoutingElectronMonitoring = cms.Sequence(scoutingMonitoringEGMOnline + scoutingMonitoringTagProbeOnline)
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@

process.load("DQM.HLTEvF.ScoutingMuonMonitoring_cff")
process.load("DQM.HLTEvF.ScoutingJetMonitoring_cff")

process.load("DQM.HLTEvF.ScoutingElectronMonitoring_cff")
## Run-1 L1TGT required by ScoutingJetMonitoring https://github.com/cms-sw/cmssw/blob/master/DQMOffline/JetMET/src/JetAnalyzer.cc#L2603-L2611
process.GlobalTag.toGet.append(
cms.PSet(
Expand All @@ -61,7 +61,7 @@
)
)

process.p = cms.Path(process.dqmcommon * process.scoutingCollectionMonitor * process.ScoutingMuonMonitoring * process.ScoutingJetMonitoring)
process.p = cms.Path(process.dqmcommon * process.scoutingCollectionMonitor * process.ScoutingMuonMonitoring * process.ScoutingJetMonitoring * process.ScoutingElectronMonitoring)

### process customizations included here
from DQM.Integration.config.online_customizations_cfi import *
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,8 @@ class ScoutingEGammaCollectionMonitoring : public DQMEDAnalyzer {
const edm::EDGetTokenT<std::vector<Run3ScoutingElectron>> scoutingElectronCollection_;
const edm::EDGetTokenT<edm::ValueMap<bool>> eleIdMapTightToken_;

const bool useOfflineObject_;

kHistogramsScoutingEGammaCollectionMonitoring histos;
};

Expand All @@ -121,10 +123,11 @@ ScoutingEGammaCollectionMonitoring::ScoutingEGammaCollectionMonitoring(const edm
algToken_{consumes<BXVector<GlobalAlgBlk>>(iConfig.getParameter<edm::InputTag>("AlgInputTag"))},
triggerResultsToken_(consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("TriggerResultTag"))),
electronCollection_(
consumes<edm::View<pat::Electron>>(iConfig.getParameter<edm::InputTag>("ElectronCollection"))),
mayConsume<edm::View<pat::Electron>>(iConfig.getParameter<edm::InputTag>("ElectronCollection"))),
scoutingElectronCollection_(consumes<std::vector<Run3ScoutingElectron>>(
iConfig.getParameter<edm::InputTag>("ScoutingElectronCollection"))),
eleIdMapTightToken_(consumes<edm::ValueMap<bool>>(iConfig.getParameter<edm::InputTag>("eleIdMapTight"))) {
eleIdMapTightToken_(mayConsume<edm::ValueMap<bool>>(iConfig.getParameter<edm::InputTag>("eleIdMapTight"))),
useOfflineObject_(iConfig.getParameter<bool>("useOfflineObject")) {
l1GtUtils_ = std::make_shared<l1t::L1TGlobalUtil>(iConfig, consumesCollector(), l1t::UseEventSetupIn::RunAndEvent);
l1Seeds_ = iConfig.getParameter<std::vector<std::string>>("L1Seeds");
}
Expand All @@ -136,11 +139,49 @@ void ScoutingEGammaCollectionMonitoring::analyze(edm::Event const& iEvent, edm::
// Get PAT / Scouting Electron Token //
////////////////////////////////////////

edm::Handle<edm::View<pat::Electron>> patEls;
iEvent.getByToken(electronCollection_, patEls);
if (patEls.failedToGet()) {
edm::LogWarning("ScoutingEGammaCollectionMonitoring") << "pat::Electron collection not found.";
return;
if (useOfflineObject_) {
edm::Handle<edm::View<pat::Electron>> patEls;
iEvent.getByToken(electronCollection_, patEls);
if (patEls.failedToGet()) {
edm::LogWarning("ScoutingEGammaCollectionMonitoring") << "pat::Electron collection not found.";
return;
}
edm::LogInfo("ScoutingEGammaCollectionMonitoring") << "Process pat::Electrons: " << patEls->size();
edm::Handle<edm::ValueMap<bool>> tight_ele_id_decisions;
iEvent.getByToken(eleIdMapTightToken_, tight_ele_id_decisions);

// Fill pat::Electron histograms
histos.patElectron.h1N->Fill(patEls->size());
std::vector<int> tight_patElectron_index;
for (size_t i = 0; i < patEls->size(); ++i) {
const auto el = patEls->ptrAt(i);
histos.patElectron.electrons.h1Pt->Fill(el->pt());
histos.patElectron.electrons.h1Eta->Fill(el->eta());
histos.patElectron.electrons.h1Phi->Fill(el->phi());
if (((*tight_ele_id_decisions)[el]))
tight_patElectron_index.push_back(i);
}

// Expect pat electrons to be sorted by pt
if (!patEls->empty()) {
histos.patElectron.electron1.h1Pt->Fill(patEls->ptrAt(0)->pt());
histos.patElectron.electron1.h1Eta->Fill(patEls->ptrAt(0)->eta());
histos.patElectron.electron1.h1Phi->Fill(patEls->ptrAt(0)->phi());
}

if (patEls->size() >= 2) {
histos.patElectron.electron2.h1Pt->Fill(patEls->ptrAt(1)->pt());
histos.patElectron.electron2.h1Eta->Fill(patEls->ptrAt(1)->eta());
histos.patElectron.electron2.h1Phi->Fill(patEls->ptrAt(1)->phi());
if (!tight_patElectron_index.empty()) {
histos.patElectron.h1InvMass12->Fill((patEls->ptrAt(0)->p4() + patEls->ptrAt(1)->p4()).mass());
}
}

if (tight_patElectron_index.size() == 2) {
histos.patElectron.h1InvMassID->Fill(
(patEls->ptrAt(tight_patElectron_index[0])->p4() + patEls->ptrAt(tight_patElectron_index[1])->p4()).mass());
}
}

edm::Handle<std::vector<Run3ScoutingElectron>> sctEls;
Expand All @@ -150,10 +191,6 @@ void ScoutingEGammaCollectionMonitoring::analyze(edm::Event const& iEvent, edm::
return;
}

edm::Handle<edm::ValueMap<bool>> tight_ele_id_decisions;
iEvent.getByToken(eleIdMapTightToken_, tight_ele_id_decisions);

edm::LogInfo("ScoutingEGammaCollectionMonitoring") << "Process pat::Electrons: " << patEls->size();
edm::LogInfo("ScoutingEGammaCollectionMonitoring") << "Process Run3ScoutingElectrons: " << sctEls->size();

// Trigger
Expand All @@ -179,51 +216,6 @@ void ScoutingEGammaCollectionMonitoring::analyze(edm::Event const& iEvent, edm::
}
}

// Loop to verify the sorting of pat::Electron collection - REMOVE IN ONLINE
// DQM
for (size_t i = 1; i < patEls->size(); ++i) {
if (patEls->ptrAt(i - 1)->pt() < patEls->ptrAt(i)->pt()) {
edm::LogWarning("ScoutingEGammaCollectionMonitoring")
<< "pat::Electron collection not sorted by PT in descending order"
<< " will result in random histo filling. \n"
<< "pat::Electron[" << i << "].pt() = " << patEls->ptrAt(i)->pt() << "\n"
<< "pat::Electron[" << i + 1 << "].pt() = " << patEls->ptrAt(i + 1)->pt();
}
}

// Fill pat::Electron histograms
histos.patElectron.h1N->Fill(patEls->size());
std::vector<int> tight_patElectron_index;
for (size_t i = 0; i < patEls->size(); ++i) {
const auto el = patEls->ptrAt(i);
histos.patElectron.electrons.h1Pt->Fill(el->pt());
histos.patElectron.electrons.h1Eta->Fill(el->eta());
histos.patElectron.electrons.h1Phi->Fill(el->phi());
if (((*tight_ele_id_decisions)[el]))
tight_patElectron_index.push_back(i);
}

// Expect pat electrons to be sorted by pt
if (!patEls->empty()) {
histos.patElectron.electron1.h1Pt->Fill(patEls->ptrAt(0)->pt());
histos.patElectron.electron1.h1Eta->Fill(patEls->ptrAt(0)->eta());
histos.patElectron.electron1.h1Phi->Fill(patEls->ptrAt(0)->phi());
}

if (patEls->size() >= 2) {
histos.patElectron.electron2.h1Pt->Fill(patEls->ptrAt(1)->pt());
histos.patElectron.electron2.h1Eta->Fill(patEls->ptrAt(1)->eta());
histos.patElectron.electron2.h1Phi->Fill(patEls->ptrAt(1)->phi());
if (!tight_patElectron_index.empty()) {
histos.patElectron.h1InvMass12->Fill((patEls->ptrAt(0)->p4() + patEls->ptrAt(1)->p4()).mass());
}
}

if (tight_patElectron_index.size() == 2) {
histos.patElectron.h1InvMassID->Fill(
(patEls->ptrAt(tight_patElectron_index[0])->p4() + patEls->ptrAt(tight_patElectron_index[1])->p4()).mass());
}

// Fill the Run3ScoutingElectron histograms. No sorting assumed.
histos.sctElectron.h1N->Fill(sctEls->size());
// unsigned int leadSctElIndx = 0, subleadSctElIndx = -1;
Expand Down Expand Up @@ -468,6 +460,7 @@ void ScoutingEGammaCollectionMonitoring::fillDescriptions(edm::ConfigurationDesc
desc.add<edm::InputTag>("ScoutingElectronCollection", edm::InputTag("hltScoutingEgammaPacker"));
desc.add<edm::InputTag>("eleIdMapTight",
edm::InputTag("egmGsfElectronIDs:cutBasedElectronID-RunIIIWinter22-V1-tight"));
desc.add<bool>("useOfflineObject", true);
descriptions.addWithDefaultLabel(desc);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ class ScoutingElectronTagProbeAnalyzer : public DQMGlobalEDAnalyzer<kSctTagProbe
const edm::EDGetTokenT<pat::TriggerObjectStandAloneCollection> triggerObjects_;

const edm::EDGetTokenT<std::vector<Run3ScoutingElectron>> scoutingElectronCollection_;
const bool useOfflineObject_;
};

ScoutingElectronTagProbeAnalyzer::ScoutingElectronTagProbeAnalyzer(const edm::ParameterSet& iConfig)
Expand All @@ -145,9 +146,10 @@ ScoutingElectronTagProbeAnalyzer::ScoutingElectronTagProbeAnalyzer(const edm::Pa
filterToMatch_{iConfig.getParameter<vector<string>>("finalfilterSelection")},
triggerResultsToken_(consumes<edm::TriggerResults>(iConfig.getParameter<edm::InputTag>("TriggerResultTag"))),
triggerObjects_(
consumes<pat::TriggerObjectStandAloneCollection>(iConfig.getParameter<edm::InputTag>("TriggerObjects"))),
mayConsume<pat::TriggerObjectStandAloneCollection>(iConfig.getParameter<edm::InputTag>("TriggerObjects"))),
scoutingElectronCollection_(consumes<std::vector<Run3ScoutingElectron>>(
iConfig.getParameter<edm::InputTag>("ScoutingElectronCollection"))) {}
iConfig.getParameter<edm::InputTag>("ScoutingElectronCollection"))),
useOfflineObject_(iConfig.getParameter<bool>("useOfflineObject")) {}

void ScoutingElectronTagProbeAnalyzer::dqmAnalyze(edm::Event const& iEvent,
edm::EventSetup const& iSetup,
Expand All @@ -161,9 +163,7 @@ void ScoutingElectronTagProbeAnalyzer::dqmAnalyze(edm::Event const& iEvent,

// Trigger
edm::Handle<edm::TriggerResults> triggerResults;
edm::Handle<pat::TriggerObjectStandAloneCollection> triggerObjects;
iEvent.getByToken(triggerResultsToken_, triggerResults);
iEvent.getByToken(triggerObjects_, triggerObjects);

// Trigger result
if (triggerResults.failedToGet()) {
Expand Down Expand Up @@ -191,15 +191,19 @@ void ScoutingElectronTagProbeAnalyzer::dqmAnalyze(edm::Event const& iEvent,
}
}

// Trigger Object Matching
// Trigger Object Matching (HLTSCOUT don't have)
size_t numberOfFilters = filterToMatch_.size();
trigger::TriggerObjectCollection* legObjects = new trigger::TriggerObjectCollection[numberOfFilters];
for (size_t iteFilter = 0; iteFilter < filterToMatch_.size(); iteFilter++) {
std::string filterTag = filterToMatch_.at(iteFilter);
for (pat::TriggerObjectStandAlone obj : *triggerObjects) {
obj.unpackNamesAndLabels(iEvent, *triggerResults);
if (obj.hasFilterLabel(filterTag)) {
legObjects[iteFilter].push_back(obj);
if (useOfflineObject_) {
edm::Handle<pat::TriggerObjectStandAloneCollection> triggerObjects;
iEvent.getByToken(triggerObjects_, triggerObjects);
for (size_t iteFilter = 0; iteFilter < filterToMatch_.size(); iteFilter++) {
std::string filterTag = filterToMatch_.at(iteFilter);
for (pat::TriggerObjectStandAlone obj : *triggerObjects) {
obj.unpackNamesAndLabels(iEvent, *triggerResults);
if (obj.hasFilterLabel(filterTag)) {
legObjects[iteFilter].push_back(obj);
}
}
}
}
Expand Down Expand Up @@ -600,8 +604,8 @@ void ScoutingElectronTagProbeAnalyzer::fillDescriptions(edm::ConfigurationDescri
desc.add<vector<string>>("finalfilterSelection", {});
desc.add<edm::InputTag>("TriggerResultTag", edm::InputTag("TriggerResults", "", "HLT"));
desc.add<edm::InputTag>("TriggerObjects", edm::InputTag("slimmedPatTrigger"));
desc.add<edm::InputTag>("ElectronCollection", edm::InputTag("slimmedElectrons"));
desc.add<edm::InputTag>("ScoutingElectronCollection", edm::InputTag("Run3ScoutingElectrons"));
desc.add<bool>("useOfflineObject", true);
descriptions.addWithDefaultLabel(desc);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import FWCore.ParameterSet.Config as cms
from HLTriggerOffline.Scouting. ScoutingEGammaCollectionMonitoring_cfi import *
from HLTriggerOffline.Scouting.ScoutingEGammaCollectionMonitoring_cfi import *
from HLTriggerOffline.Scouting.ScoutingElectronTagProbeAnalyzer_cfi import *
from HLTriggerOffline.Scouting.PatElectronTagProbeAnalyzer_cfi import *

Expand All @@ -19,4 +19,4 @@
if hasattr(item,'idName') and hasattr(item,'cutFlow'):
setupVIDSelection(egmGsfElectronIDsForScoutingDQM,item)

hltScoutingEGammaDqmOffline = cms.Sequence(egmGsfElectronIDsForScoutingDQM + scoutingMonitoringEGM + scoutingMonitoringTagProbe + scoutingMonitoringPatElectronTagProbe)
hltScoutingEGammaDqmOffline = cms.Sequence(egmGsfElectronIDsForScoutingDQM + scoutingMonitoringEGMOffline + scoutingMonitoringTagProbeOffline + scoutingMonitoringPatElectronTagProbe)
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
'L1_SingleIsoEG34er2p5'
]

ScoutingEGammaCollectionMonitoring = DQMEDAnalyzer('ScoutingEGammaCollectionMonitoring',
ScoutingEGammaCollectionMonitoringOffline = DQMEDAnalyzer('ScoutingEGammaCollectionMonitoring',
OutputInternalPath = cms.string('/HLT/ScoutingOffline/EGamma/Collection'),
TriggerResultTag = cms.InputTag("TriggerResults", "", "HLT"),
AlgInputTag = cms.InputTag("gtStage2Digis"),
Expand All @@ -50,7 +50,14 @@
L1Seeds = cms.vstring(DoubleEGL1 + SinglePhotonL1),
ElectronCollection = cms.InputTag('slimmedElectrons'),
ScoutingElectronCollection = cms.InputTag("hltScoutingEgammaPacker"),
eleIdMapTight = cms.InputTag('egmGsfElectronIDsForScoutingDQM:cutBasedElectronID-RunIIIWinter22-V1-loose')
eleIdMapTight = cms.InputTag('egmGsfElectronIDsForScoutingDQM:cutBasedElectronID-RunIIIWinter22-V1-loose'),
useOfflineObject = cms.bool(True)
)

scoutingMonitoringEGM = cms.Sequence(ScoutingEGammaCollectionMonitoring)
ScoutingEGammaCollectionMonitoringOnline = ScoutingEGammaCollectionMonitoringOffline.clone(
OutputInternalPath = '/HLT/ScoutingOnline/EGamma/Collection',
useOfflineObject = False
)

scoutingMonitoringEGMOffline= cms.Sequence(ScoutingEGammaCollectionMonitoringOffline)
scoutingMonitoringEGMOnline= cms.Sequence(ScoutingEGammaCollectionMonitoringOnline)
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,21 @@
from DQMServices.Core.DQMEDAnalyzer import DQMEDAnalyzer
from DQMServices.Core.DQMEDHarvester import DQMEDHarvester

ScoutingElectronTagProbeAnalysis = DQMEDAnalyzer('ScoutingElectronTagProbeAnalyzer',
ScoutingElectronTagProbeAnalysisOffline = DQMEDAnalyzer('ScoutingElectronTagProbeAnalyzer',
OutputInternalPath = cms.string('/HLT/ScoutingOffline/EGamma/TnP/Tag_ScoutingElectron'),
BaseTriggerSelection = cms.vstring(["DST_PFScouting_ZeroBias_v", "DST_PFScouting_SingleMuon_v", "DST_PFScouting_DoubleMuon_v", "DST_PFScouting_JetHT_v"]),
triggerSelection = cms.vstring(["DST_PFScouting_DoubleEG_v", "DST_PFScouting_SinglePhotonEB_v"]),
finalfilterSelection = cms.vstring(["hltDoubleEG11CaloIdLHEFilter", "hltEG30EBTightIDTightIsoTrackIsoFilter"]), # Must align with triggerSelection
TriggerResultTag = cms.InputTag("TriggerResults", "", "HLT"),
TriggerObjects = cms.InputTag("slimmedPatTrigger"),
ElectronCollection = cms.InputTag('slimmedElectrons'),
ScoutingElectronCollection = cms.InputTag('hltScoutingEgammaPacker')
ScoutingElectronCollection = cms.InputTag('hltScoutingEgammaPacker'),
useOfflineObject = cms.bool(True)
)

scoutingMonitoringTagProbe = cms.Sequence(ScoutingElectronTagProbeAnalysis) # * ScoutingElectronEfficiencySummary)
ScoutingElectronTagProbeAnalysisOnline = ScoutingElectronTagProbeAnalysisOffline.clone(
OutputInternalPath = '/HLT/ScoutingOnline/EGamma/TnP/Tag_ScoutingElectron',
useOfflineObject = False
)

scoutingMonitoringTagProbeOffline = cms.Sequence(ScoutingElectronTagProbeAnalysisOffline)
scoutingMonitoringTagProbeOnline = cms.Sequence(ScoutingElectronTagProbeAnalysisOnline)