Skip to content

Commit bfcf87d

Browse files
authored
Merge pull request #49130 from cms-ngt-hlt/AdditionsScoutingDQM
Additions to scouting DQM with the ScoutingCollectionMonitor and a new ScoutingMuonPropertiesAnalyzer
2 parents 34e452c + ea5f0e5 commit bfcf87d

File tree

8 files changed

+1189
-20
lines changed

8 files changed

+1189
-20
lines changed

DQM/HLTEvF/plugins/ScoutingCollectionMonitor.cc

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ It is based on the preexisting work of the scouting group and can be found at gi
2424

2525
// user include files
2626
#include "DQMServices/Core/interface/DQMEDAnalyzer.h"
27+
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
2728
#include "DataFormats/EcalDetId/interface/EBDetId.h"
2829
#include "DataFormats/EcalDetId/interface/EEDetId.h"
2930
#include "DataFormats/HcalDetId/interface/HcalDetId.h"
@@ -72,7 +73,7 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
7273
void setToken(edm::EDGetTokenT<T>& token, const edm::ParameterSet& iConfig, std::string name) {
7374
const auto inputTag = iConfig.getParameter<edm::InputTag>(name);
7475
if (!inputTag.encode().empty()) {
75-
token = consumes(inputTag);
76+
token = mayConsume<T>(inputTag);
7677
}
7778
}
7879

@@ -117,6 +118,7 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
117118
const edm::EDGetTokenT<std::vector<Run3ScoutingPFJet>> pfjetsToken_;
118119
const edm::EDGetTokenT<std::vector<Run3ScoutingTrack>> tracksToken_;
119120
const edm::EDGetTokenT<OnlineLuminosityRecord> onlineMetaDataDigisToken_;
121+
const edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
120122
const std::string topfoldername_;
121123

122124
// calo rechits (only 2025 V1.3 onwards, see https://its.cern.ch/jira/browse/CMSHLT-3607)
@@ -126,6 +128,18 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
126128
edm::EDGetTokenT<Run3ScoutingEERecHitCollection> eeCleanedRecHitsToken_;
127129
edm::EDGetTokenT<Run3ScoutingHBHERecHitCollection> hbheRecHitsToken_;
128130

131+
// Multiplicity histograms
132+
dqm::reco::MonitorElement* nTracks_hist;
133+
dqm::reco::MonitorElement* nPrimaryVertices_hist;
134+
dqm::reco::MonitorElement* nDisplacedVertices_hist;
135+
dqm::reco::MonitorElement* nDisplacedVerticesNoVtx_hist;
136+
dqm::reco::MonitorElement* nMuons_hist;
137+
dqm::reco::MonitorElement* nMuonsVtx_hist;
138+
dqm::reco::MonitorElement* nElectrons_hist;
139+
dqm::reco::MonitorElement* nPhotons_hist;
140+
dqm::reco::MonitorElement* nPFJets_hist;
141+
dqm::reco::MonitorElement* nPFCands_hist;
142+
129143
// pv vs PU and rho vs PU plots
130144
int primaryVertex_counter = 0;
131145
float avgPileUp;
@@ -405,6 +419,8 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
405419
dqm::reco::MonitorElement* tk_chi2_prob_hist;
406420
dqm::reco::MonitorElement* tk_PV_dxy_hist;
407421
dqm::reco::MonitorElement* tk_PV_dz_hist;
422+
dqm::reco::MonitorElement* tk_BS_dxy_hist;
423+
dqm::reco::MonitorElement* tk_BS_dz_hist;
408424

409425
// calo rechits histrograms (ECAL has two version, cleaned and unclean)
410426
dqm::reco::MonitorElement* ebRecHitsNumber_hist[2];
@@ -445,6 +461,7 @@ ScoutingCollectionMonitor::ScoutingCollectionMonitor(const edm::ParameterSet& iC
445461
pfjetsToken_(consumes<std::vector<Run3ScoutingPFJet>>(iConfig.getParameter<edm::InputTag>("pfjets"))),
446462
tracksToken_(consumes<std::vector<Run3ScoutingTrack>>(iConfig.getParameter<edm::InputTag>("tracks"))),
447463
onlineMetaDataDigisToken_(consumes(iConfig.getParameter<edm::InputTag>("onlineMetaDataDigis"))),
464+
beamSpotToken_(consumes<reco::BeamSpot>(iConfig.getParameter<edm::InputTag>("beamSpot"))),
448465
topfoldername_(iConfig.getParameter<std::string>("topfoldername")) {
449466
setToken(ebRecHitsToken_, iConfig, "pfRecHitsEB");
450467
setToken(eeRecHitsToken_, iConfig, "pfRecHitsEE");
@@ -521,6 +538,18 @@ void ScoutingCollectionMonitor::analyze(const edm::Event& iEvent, const edm::Eve
521538
pfMetPhi_hist->Fill(*pfMetPhiH);
522539
pfMetPt_hist->Fill(*pfMetPtH);
523540

541+
// --- Fill multiplicity histograms ---
542+
nTracks_hist->Fill(tracksH->size());
543+
nPrimaryVertices_hist->Fill(primaryVerticesH->size());
544+
nDisplacedVertices_hist->Fill(verticesH->size());
545+
nDisplacedVerticesNoVtx_hist->Fill(verticesNoVtxH->size());
546+
nMuons_hist->Fill(muonsH->size());
547+
nMuonsVtx_hist->Fill(muonsVtxH->size());
548+
nElectrons_hist->Fill(electronsH->size());
549+
nPhotons_hist->Fill(photonsH->size());
550+
nPFJets_hist->Fill(PFjetsH->size());
551+
nPFCands_hist->Fill(pfcandsH->size());
552+
524553
// fill the PF candidate histograms (no electrons!)
525554

526555
for (const auto& cand : *pfcandsH) {
@@ -798,6 +827,15 @@ void ScoutingCollectionMonitor::analyze(const edm::Event& iEvent, const edm::Eve
798827
for (const auto& vtx : *verticesNoVtxH)
799828
fillVtxHistograms(vtx, 1);
800829

830+
// determine the beamspot position (if it exists in the event)
831+
std::unique_ptr<Run3ScoutingVertex> beamspotVertex{nullptr};
832+
edm::Handle<reco::BeamSpot> beamSpotH;
833+
if (getValidHandle(iEvent, beamSpotToken_, beamSpotH, "beamSpot")) {
834+
const auto& beamspot = *beamSpotH;
835+
beamspotVertex = std::make_unique<Run3ScoutingVertex>(
836+
beamspot.x0(), beamspot.y0(), beamspot.z0(), 0., 0., 0., 0., 0., true, 0., 0., 0., 0);
837+
}
838+
801839
// fill tracks histograms
802840
for (const auto& tk : *tracksH) {
803841
tk_pt_tk_hist->Fill(tk.tk_pt());
@@ -840,6 +878,13 @@ void ScoutingCollectionMonitor::analyze(const edm::Event& iEvent, const edm::Eve
840878

841879
tk_PV_dxy_hist->Fill(best_offset.first);
842880
tk_PV_dz_hist->Fill(best_offset.second);
881+
882+
// skip beamspot-based plots if not valid
883+
if (beamspotVertex) {
884+
auto bs_offset = trk_vtx_offSet(tk, *beamspotVertex);
885+
tk_BS_dxy_hist->Fill(bs_offset.first);
886+
tk_BS_dz_hist->Fill(bs_offset.second);
887+
}
843888
}
844889

845890
// Define helper lambdas for EB and EE rechits
@@ -943,6 +988,20 @@ void ScoutingCollectionMonitor::bookHistograms(DQMStore::IBooker& ibook,
943988
edm::EventSetup const& iSetup) {
944989
ibook.setCurrentFolder(topfoldername_);
945990

991+
// Book multiplicity histograms in the topfolder
992+
nTracks_hist = ibook.book1D("nTracks", "Number of Tracks;N_{tracks};Entries", 400, 0, 400);
993+
nPrimaryVertices_hist = ibook.book1D("nPrimaryVertices", "Number of Primary Vertices;N_{PV};Entries", 51, 0, 50);
994+
nDisplacedVertices_hist =
995+
ibook.book1D("nDisplacedVertices", "Number of Displaced Vertices (Vtx);N_{DV};Entries", 10, 0, 10);
996+
nDisplacedVerticesNoVtx_hist =
997+
ibook.book1D("nDisplacedVerticesNoVtx", "Number of Displaced Vertices (NoVtx);N_{DV}^{NoVtx};Entries", 10, 0, 10);
998+
nMuons_hist = ibook.book1D("nMuons", "Number of Muons (NoVtx);N_{muons};Entries", 10, 0, 10);
999+
nMuonsVtx_hist = ibook.book1D("nMuonsVtx", "Number of Muons (Vtx);N_{muons}^{Vtx};Entries", 10, 0, 10);
1000+
nElectrons_hist = ibook.book1D("nElectrons", "Number of Electrons;N_{ele};Entries", 10, 0, 10);
1001+
nPhotons_hist = ibook.book1D("nPhotons", "Number of Photons;N_{photon};Entries", 25, 0, 25);
1002+
nPFJets_hist = ibook.book1D("nPFJets", "Number of PF Jets;N_{jet};Entries", 101, 0, 100);
1003+
nPFCands_hist = ibook.book1D("nPFCands", "Number of PF Candidates;N_{pfcand};Entries", 1001, 0, 1000);
1004+
9461005
rho_hist = ibook.book1D("rho", "#rho; #rho; Entries", 100, 0.0, 60.0);
9471006
pfMetPhi_hist = ibook.book1D("pfMetPhi", "pf MET #phi; #phi ;Entries", 100, -3.14, 3.14);
9481007
pfMetPt_hist = ibook.book1D("pfMetPt", "pf MET pT;p_{T} [GeV];Entries", 100, 0.0, 250.0);
@@ -1341,6 +1400,8 @@ void ScoutingCollectionMonitor::bookHistograms(DQMStore::IBooker& ibook,
13411400
tk_chi2_prob_hist = ibook.book1DD("tk_chi2_prob_hist", "p(#chi^{2}, NDOF); p(#chi^{2}, NDOF); Entries", 100, 0, 1);
13421401
tk_PV_dz_hist = ibook.book1DD("tk_PV_dz", "Track dz w.r.t. PV; Track dz w.r.t. PV; Entries", 100, -0.35, 0.35);
13431402
tk_PV_dxy_hist = ibook.book1DD("tk_PV_dxy", "Track dxy w.r.t. PV; Track dxy w.r.t. PV; Entries", 100, -0.15, 0.15);
1403+
tk_BS_dxy_hist = ibook.book1D("tk_BS_dxy", "Track dxy w.r.t. BeamSpot;dxy_{BS} (cm);Entries", 100, -0.5, 0.5);
1404+
tk_BS_dz_hist = ibook.book1D("tk_BS_dz", "Track dz w.r.t. BeamSpot;dz_{BS} (cm);Entries", 100, -20.0, 20.0);
13441405

13451406
// book the calo rechits histograms
13461407
const std::array<std::string, 2> caloLabels = {{"All", "Cleaned"}};
@@ -1448,6 +1509,7 @@ void ScoutingCollectionMonitor::fillDescriptions(edm::ConfigurationDescriptions&
14481509
desc.add<edm::InputTag>("pfMetPhi", edm::InputTag("hltScoutingPFPacker", "pfMetPhi"));
14491510
desc.add<edm::InputTag>("rho", edm::InputTag("hltScoutingPFPacker", "rho"));
14501511
desc.add<edm::InputTag>("onlineMetaDataDigis", edm::InputTag("onlineMetaDataDigis"));
1512+
desc.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"));
14511513
desc.add<edm::InputTag>("pfRecHitsEB", edm::InputTag("hltScoutingRecHitPacker", "EB"));
14521514
desc.add<edm::InputTag>("pfRecHitsEE", edm::InputTag("hltScoutingRecHitPacker", "EE"));
14531515
desc.add<edm::InputTag>("pfRecHitsHBHE", edm::InputTag("hltScoutingRecHitPacker", "HBHE"));

DQM/HLTEvF/python/ScoutingCollectionMonitor_cfi.py

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,18 @@
1818
pfMetPt = cms.InputTag("hltScoutingPFPacker","pfMetPt"),
1919
pfMetPhi = cms.InputTag("hltScoutingPFPacker","pfMetPhi"),
2020
rho = cms.InputTag("hltScoutingPFPacker","rho"),
21-
pfRecHitsEB = cms.InputTag("hltScoutingRecHitPacker", "EB"),
22-
pfRecHitsEE = cms.InputTag("hltScoutingRecHitPacker", "EE"),
23-
pfCleanedRecHitsEB = cms.InputTag("hltScoutingRecHitPacker", "EBCleaned"),
24-
pfCleanedRecHitsEE = cms.InputTag("hltScoutingRecHitPacker", "EECleaned"),
25-
pfRecHitsHBHE = cms.InputTag("hltScoutingRecHitPacker", "HBHE"))
21+
pfRecHitsEB = cms.InputTag(""),
22+
pfRecHitsEE = cms.InputTag(""),
23+
pfCleanedRecHitsEB = cms.InputTag(""),
24+
pfCleanedRecHitsEE = cms.InputTag(""),
25+
pfRecHitsHBHE = cms.InputTag(""))
2626

27+
## Add the scouting rechits monitoring (only for 2025, integrated in menu GRun 2025 V1.3)
28+
## See https://its.cern.ch/jira/browse/CMSHLT-3607
29+
from Configuration.Eras.Modifier_run3_scouting_2025_cff import run3_scouting_2025
30+
run3_scouting_2025.toModify(scoutingCollectionMonitor,
31+
pfRecHitsEB = ("hltScoutingRecHitPacker", "EB"),
32+
pfRecHitsEE = ("hltScoutingRecHitPacker", "EE"),
33+
pfCleanedRecHitsEB = ("hltScoutingRecHitPacker", "EBCleaned"),
34+
pfCleanedRecHitsEE = ("hltScoutingRecHitPacker", "EECleaned"),
35+
pfRecHitsHBHE = ("hltScoutingRecHitPacker", "HBHE"))

DQM/HLTEvF/python/ScoutingMuonMonitoring_cff.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,16 @@
44

55
from HLTriggerOffline.Scouting.ScoutingMuonTriggerAnalyzer_cfi import ScoutingMuonTriggerAnalysis_DoubleMu, ScoutingMuonTriggerAnalysis_SingleMu
66
from HLTriggerOffline.Scouting.ScoutingMuonTagProbeAnalyzer_cfi import ScoutingMuonTagProbeAnalysisNoVtx, ScoutingMuonTagProbeAnalysisVtx
7+
from HLTriggerOffline.Scouting.ScoutingMuonPropertiesMonitoring_cfi import ScoutingMuonPropertiesMonitor
78

89
ScoutingMuonTagProbeAnalysisNoVtxOnline = ScoutingMuonTagProbeAnalysisNoVtx.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/NoVtx")
910
ScoutingMuonTagProbeAnalysisVtxOnline = ScoutingMuonTagProbeAnalysisVtx.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/Vtx")
1011
ScoutingMuonTriggerAnalysis_DoubleMu = ScoutingMuonTriggerAnalysis_DoubleMu.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/L1Efficiency/DoubleMu")
1112
ScoutingMuonTriggerAnalysis_SingleMu = ScoutingMuonTriggerAnalysis_SingleMu.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/L1Efficiency/SingleMu")
13+
ScoutingMuonPropertiesMonitorOnline = ScoutingMuonPropertiesMonitor.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/Properties")
1214

13-
ScoutingMuonMonitoring = cms.Sequence( ScoutingMuonTagProbeAnalysisNoVtxOnline + ScoutingMuonTagProbeAnalysisVtxOnline + ScoutingMuonTriggerAnalysis_DoubleMu + ScoutingMuonTriggerAnalysis_SingleMu )
15+
ScoutingMuonMonitoring = cms.Sequence(ScoutingMuonTagProbeAnalysisNoVtxOnline +
16+
ScoutingMuonTagProbeAnalysisVtxOnline +
17+
ScoutingMuonTriggerAnalysis_DoubleMu +
18+
ScoutingMuonTriggerAnalysis_SingleMu +
19+
ScoutingMuonPropertiesMonitorOnline)

DQM/Integration/python/clients/scouting_dqm_sourceclient-live_cfg.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
#from Configuration.AlCa.GlobalTag import GlobalTag as gtCustomise
4141
#process.GlobalTag = gtCustomise(process.GlobalTag, 'auto:run3_data', '')
4242

43+
# import beamspot
44+
from RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi import onlineBeamSpotProducer as _onlineBeamSpotProducer
45+
process.hltOnlineBeamSpot = _onlineBeamSpotProducer.clone()
4346

4447
### for pp collisions
4548
process.load("DQM.HLTEvF.ScoutingCollectionMonitor_cfi")
@@ -61,7 +64,12 @@
6164
)
6265
)
6366

64-
process.p = cms.Path(process.dqmcommon * process.scoutingCollectionMonitor * process.ScoutingMuonMonitoring * process.ScoutingJetMonitoring * process.ScoutingElectronMonitoring)
67+
process.p = cms.Path(process.dqmcommon *
68+
process.hltOnlineBeamSpot *
69+
process.scoutingCollectionMonitor *
70+
process.ScoutingMuonMonitoring *
71+
process.ScoutingJetMonitoring *
72+
process.ScoutingElectronMonitoring)
6573

6674
### process customizations included here
6775
from DQM.Integration.config.online_customizations_cfi import *

DQMOffline/HLTScouting/python/HLTScoutingDqmOffline_cff.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,25 @@
77
import FWCore.ParameterSet.Config as cms
88
from DQMServices.Core.DQMEDHarvester import DQMEDHarvester
99

10+
### Muons monitoring
1011
from HLTriggerOffline.Scouting.ScoutingMuonTriggerAnalyzer_cfi import *
1112
from HLTriggerOffline.Scouting.ScoutingMuonTagProbeAnalyzer_cfi import *
12-
from HLTriggerOffline.Scouting.ScoutingMuonMonitoring_Client_cff import *
13+
from HLTriggerOffline.Scouting.ScoutingMuonPropertiesMonitoring_cfi import *
1314

15+
### Egamma monitoring
1416
from HLTriggerOffline.Scouting.HLTScoutingEGammaDqmOffline_cff import *
1517

16-
from DQM.HLTEvF.ScoutingCollectionMonitor_cfi import *
17-
18+
### Jets Monitoring
1819
from DQMOffline.JetMET.jetMETDQMOfflineSource_cff import *
1920

21+
### Miscellaneous monitoring
22+
from DQM.HLTEvF.ScoutingCollectionMonitor_cfi import *
23+
2024
hltScoutingMuonDqmOffline = cms.Sequence(scoutingMonitoringTagProbeMuonNoVtx *
2125
scoutingMonitoringTagProbeMuonVtx *
2226
scoutingMonitoringTriggerMuon_DoubleMu *
23-
scoutingMonitoringTriggerMuon_SingleMu )
27+
scoutingMonitoringTriggerMuon_SingleMu *
28+
ScoutingMuonPropertiesMonitor )
2429

2530
hltScoutingJetDqmOffline = cms.Sequence(jetMETDQMOfflineSourceScouting)
2631

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
<use name="FWCore/Framework"/>
2-
<use name="FWCore/PluginManager"/>
3-
<use name="FWCore/ParameterSet"/>
4-
<use name="DQMServices/Core"/>
51
<use name="CLHEP"/>
2+
<use name="DQMServices/Core"/>
3+
<use name="DataFormats/HLTReco"/>
4+
<use name="DataFormats/L1TGlobal"/>
65
<use name="DataFormats/PatCandidates"/>
76
<use name="DataFormats/Scouting"/>
8-
<use name="L1Trigger/L1TGlobal"/>
9-
<use name="DataFormats/L1TGlobal"/>
7+
<use name="FWCore/Framework"/>
8+
<use name="FWCore/ParameterSet"/>
9+
<use name="FWCore/PluginManager"/>
1010
<use name="FWCore/Utilities"/>
11-
<use name="TrackingTools/Records"/>
1211
<use name="HLTrigger/HLTcore"/>
13-
<use name="DataFormats/HLTReco"/>
12+
<use name="L1Trigger/L1TGlobal"/>
13+
<use name="TrackingTools/Records"/>
14+
<use name="TrackingTools/TransientTrack"/>
15+
<use name="RecoVertex/VertexTools"/>
1416
<flags EDM_PLUGIN="1"/>

0 commit comments

Comments
 (0)