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
64 changes: 63 additions & 1 deletion DQM/HLTEvF/plugins/ScoutingCollectionMonitor.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ It is based on the preexisting work of the scouting group and can be found at gi

// user include files
#include "DQMServices/Core/interface/DQMEDAnalyzer.h"
#include "DataFormats/BeamSpot/interface/BeamSpot.h"
#include "DataFormats/EcalDetId/interface/EBDetId.h"
#include "DataFormats/EcalDetId/interface/EEDetId.h"
#include "DataFormats/HcalDetId/interface/HcalDetId.h"
Expand Down Expand Up @@ -72,7 +73,7 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
void setToken(edm::EDGetTokenT<T>& token, const edm::ParameterSet& iConfig, std::string name) {
const auto inputTag = iConfig.getParameter<edm::InputTag>(name);
if (!inputTag.encode().empty()) {
token = consumes(inputTag);
token = mayConsume<T>(inputTag);
}
}

Expand Down Expand Up @@ -117,6 +118,7 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
const edm::EDGetTokenT<std::vector<Run3ScoutingPFJet>> pfjetsToken_;
const edm::EDGetTokenT<std::vector<Run3ScoutingTrack>> tracksToken_;
const edm::EDGetTokenT<OnlineLuminosityRecord> onlineMetaDataDigisToken_;
const edm::EDGetTokenT<reco::BeamSpot> beamSpotToken_;
const std::string topfoldername_;

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

// Multiplicity histograms
dqm::reco::MonitorElement* nTracks_hist;
dqm::reco::MonitorElement* nPrimaryVertices_hist;
dqm::reco::MonitorElement* nDisplacedVertices_hist;
dqm::reco::MonitorElement* nDisplacedVerticesNoVtx_hist;
dqm::reco::MonitorElement* nMuons_hist;
dqm::reco::MonitorElement* nMuonsVtx_hist;
dqm::reco::MonitorElement* nElectrons_hist;
dqm::reco::MonitorElement* nPhotons_hist;
dqm::reco::MonitorElement* nPFJets_hist;
dqm::reco::MonitorElement* nPFCands_hist;

// pv vs PU and rho vs PU plots
int primaryVertex_counter = 0;
float avgPileUp;
Expand Down Expand Up @@ -405,6 +419,8 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
dqm::reco::MonitorElement* tk_chi2_prob_hist;
dqm::reco::MonitorElement* tk_PV_dxy_hist;
dqm::reco::MonitorElement* tk_PV_dz_hist;
dqm::reco::MonitorElement* tk_BS_dxy_hist;
dqm::reco::MonitorElement* tk_BS_dz_hist;

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

// --- Fill multiplicity histograms ---
nTracks_hist->Fill(tracksH->size());
nPrimaryVertices_hist->Fill(primaryVerticesH->size());
nDisplacedVertices_hist->Fill(verticesH->size());
nDisplacedVerticesNoVtx_hist->Fill(verticesNoVtxH->size());
nMuons_hist->Fill(muonsH->size());
nMuonsVtx_hist->Fill(muonsVtxH->size());
nElectrons_hist->Fill(electronsH->size());
nPhotons_hist->Fill(photonsH->size());
nPFJets_hist->Fill(PFjetsH->size());
nPFCands_hist->Fill(pfcandsH->size());

// fill the PF candidate histograms (no electrons!)

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

// determine the beamspot position (if it exists in the event)
std::unique_ptr<Run3ScoutingVertex> beamspotVertex{nullptr};
edm::Handle<reco::BeamSpot> beamSpotH;
if (getValidHandle(iEvent, beamSpotToken_, beamSpotH, "beamSpot")) {
const auto& beamspot = *beamSpotH;
beamspotVertex = std::make_unique<Run3ScoutingVertex>(
beamspot.x0(), beamspot.y0(), beamspot.z0(), 0., 0., 0., 0., 0., true, 0., 0., 0., 0);
}

// fill tracks histograms
for (const auto& tk : *tracksH) {
tk_pt_tk_hist->Fill(tk.tk_pt());
Expand Down Expand Up @@ -840,6 +878,13 @@ void ScoutingCollectionMonitor::analyze(const edm::Event& iEvent, const edm::Eve

tk_PV_dxy_hist->Fill(best_offset.first);
tk_PV_dz_hist->Fill(best_offset.second);

// skip beamspot-based plots if not valid
if (beamspotVertex) {
auto bs_offset = trk_vtx_offSet(tk, *beamspotVertex);
tk_BS_dxy_hist->Fill(bs_offset.first);
tk_BS_dz_hist->Fill(bs_offset.second);
}
}

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

// Book multiplicity histograms in the topfolder
nTracks_hist = ibook.book1D("nTracks", "Number of Tracks;N_{tracks};Entries", 400, 0, 400);
nPrimaryVertices_hist = ibook.book1D("nPrimaryVertices", "Number of Primary Vertices;N_{PV};Entries", 51, 0, 50);
nDisplacedVertices_hist =
ibook.book1D("nDisplacedVertices", "Number of Displaced Vertices (Vtx);N_{DV};Entries", 10, 0, 10);
nDisplacedVerticesNoVtx_hist =
ibook.book1D("nDisplacedVerticesNoVtx", "Number of Displaced Vertices (NoVtx);N_{DV}^{NoVtx};Entries", 10, 0, 10);
nMuons_hist = ibook.book1D("nMuons", "Number of Muons (NoVtx);N_{muons};Entries", 10, 0, 10);
nMuonsVtx_hist = ibook.book1D("nMuonsVtx", "Number of Muons (Vtx);N_{muons}^{Vtx};Entries", 10, 0, 10);
nElectrons_hist = ibook.book1D("nElectrons", "Number of Electrons;N_{ele};Entries", 10, 0, 10);
nPhotons_hist = ibook.book1D("nPhotons", "Number of Photons;N_{photon};Entries", 25, 0, 25);
nPFJets_hist = ibook.book1D("nPFJets", "Number of PF Jets;N_{jet};Entries", 101, 0, 100);
nPFCands_hist = ibook.book1D("nPFCands", "Number of PF Candidates;N_{pfcand};Entries", 1001, 0, 1000);

rho_hist = ibook.book1D("rho", "#rho; #rho; Entries", 100, 0.0, 60.0);
pfMetPhi_hist = ibook.book1D("pfMetPhi", "pf MET #phi; #phi ;Entries", 100, -3.14, 3.14);
pfMetPt_hist = ibook.book1D("pfMetPt", "pf MET pT;p_{T} [GeV];Entries", 100, 0.0, 250.0);
Expand Down Expand Up @@ -1341,6 +1400,8 @@ void ScoutingCollectionMonitor::bookHistograms(DQMStore::IBooker& ibook,
tk_chi2_prob_hist = ibook.book1DD("tk_chi2_prob_hist", "p(#chi^{2}, NDOF); p(#chi^{2}, NDOF); Entries", 100, 0, 1);
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);
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);
tk_BS_dxy_hist = ibook.book1D("tk_BS_dxy", "Track dxy w.r.t. BeamSpot;dxy_{BS} (cm);Entries", 100, -0.5, 0.5);
tk_BS_dz_hist = ibook.book1D("tk_BS_dz", "Track dz w.r.t. BeamSpot;dz_{BS} (cm);Entries", 100, -20.0, 20.0);

// book the calo rechits histograms
const std::array<std::string, 2> caloLabels = {{"All", "Cleaned"}};
Expand Down Expand Up @@ -1448,6 +1509,7 @@ void ScoutingCollectionMonitor::fillDescriptions(edm::ConfigurationDescriptions&
desc.add<edm::InputTag>("pfMetPhi", edm::InputTag("hltScoutingPFPacker", "pfMetPhi"));
desc.add<edm::InputTag>("rho", edm::InputTag("hltScoutingPFPacker", "rho"));
desc.add<edm::InputTag>("onlineMetaDataDigis", edm::InputTag("onlineMetaDataDigis"));
desc.add<edm::InputTag>("beamSpot", edm::InputTag("hltOnlineBeamSpot"));
desc.add<edm::InputTag>("pfRecHitsEB", edm::InputTag("hltScoutingRecHitPacker", "EB"));
desc.add<edm::InputTag>("pfRecHitsEE", edm::InputTag("hltScoutingRecHitPacker", "EE"));
desc.add<edm::InputTag>("pfRecHitsHBHE", edm::InputTag("hltScoutingRecHitPacker", "HBHE"));
Expand Down
8 changes: 7 additions & 1 deletion DQM/HLTEvF/python/ScoutingMuonMonitoring_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,16 @@

from HLTriggerOffline.Scouting.ScoutingMuonTriggerAnalyzer_cfi import ScoutingMuonTriggerAnalysis_DoubleMu, ScoutingMuonTriggerAnalysis_SingleMu
from HLTriggerOffline.Scouting.ScoutingMuonTagProbeAnalyzer_cfi import ScoutingMuonTagProbeAnalysisNoVtx, ScoutingMuonTagProbeAnalysisVtx
from HLTriggerOffline.Scouting.ScoutingMuonPropertiesMonitoring_cfi import ScoutingMuonPropertiesMonitor

ScoutingMuonTagProbeAnalysisNoVtxOnline = ScoutingMuonTagProbeAnalysisNoVtx.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/NoVtx")
ScoutingMuonTagProbeAnalysisVtxOnline = ScoutingMuonTagProbeAnalysisVtx.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/Vtx")
ScoutingMuonTriggerAnalysis_DoubleMu = ScoutingMuonTriggerAnalysis_DoubleMu.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/L1Efficiency/DoubleMu")
ScoutingMuonTriggerAnalysis_SingleMu = ScoutingMuonTriggerAnalysis_SingleMu.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/L1Efficiency/SingleMu")
ScoutingMuonPropertiesMonitorOnline = ScoutingMuonPropertiesMonitor.clone(OutputInternalPath = "/HLT/ScoutingOnline/Muons/Properties")

ScoutingMuonMonitoring = cms.Sequence( ScoutingMuonTagProbeAnalysisNoVtxOnline + ScoutingMuonTagProbeAnalysisVtxOnline + ScoutingMuonTriggerAnalysis_DoubleMu + ScoutingMuonTriggerAnalysis_SingleMu )
ScoutingMuonMonitoring = cms.Sequence(ScoutingMuonTagProbeAnalysisNoVtxOnline +
ScoutingMuonTagProbeAnalysisVtxOnline +
ScoutingMuonTriggerAnalysis_DoubleMu +
ScoutingMuonTriggerAnalysis_SingleMu +
ScoutingMuonPropertiesMonitorOnline)
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
#from Configuration.AlCa.GlobalTag import GlobalTag as gtCustomise
#process.GlobalTag = gtCustomise(process.GlobalTag, 'auto:run3_data', '')

# import beamspot
from RecoVertex.BeamSpotProducer.BeamSpotOnline_cfi import onlineBeamSpotProducer as _onlineBeamSpotProducer
process.hltOnlineBeamSpot = _onlineBeamSpotProducer.clone()

### for pp collisions
process.load("DQM.HLTEvF.ScoutingCollectionMonitor_cfi")
Expand All @@ -61,7 +64,12 @@
)
)

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

### process customizations included here
from DQM.Integration.config.online_customizations_cfi import *
Expand Down
13 changes: 9 additions & 4 deletions DQMOffline/HLTScouting/python/HLTScoutingDqmOffline_cff.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,25 @@
import FWCore.ParameterSet.Config as cms
from DQMServices.Core.DQMEDHarvester import DQMEDHarvester

### Muons monitoring
from HLTriggerOffline.Scouting.ScoutingMuonTriggerAnalyzer_cfi import *
from HLTriggerOffline.Scouting.ScoutingMuonTagProbeAnalyzer_cfi import *
from HLTriggerOffline.Scouting.ScoutingMuonMonitoring_Client_cff import *
from HLTriggerOffline.Scouting.ScoutingMuonPropertiesMonitoring_cfi import *

### Egamma monitoring
from HLTriggerOffline.Scouting.HLTScoutingEGammaDqmOffline_cff import *

from DQM.HLTEvF.ScoutingCollectionMonitor_cfi import *

### Jets Monitoring
from DQMOffline.JetMET.jetMETDQMOfflineSource_cff import *

### Miscellaneous monitoring
from DQM.HLTEvF.ScoutingCollectionMonitor_cfi import *

hltScoutingMuonDqmOffline = cms.Sequence(scoutingMonitoringTagProbeMuonNoVtx *
scoutingMonitoringTagProbeMuonVtx *
scoutingMonitoringTriggerMuon_DoubleMu *
scoutingMonitoringTriggerMuon_SingleMu )
scoutingMonitoringTriggerMuon_SingleMu *
ScoutingMuonPropertiesMonitor )

hltScoutingJetDqmOffline = cms.Sequence(jetMETDQMOfflineSourceScouting)

Expand Down
18 changes: 10 additions & 8 deletions HLTriggerOffline/Scouting/plugins/BuildFile.xml
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
<use name="FWCore/Framework"/>
<use name="FWCore/PluginManager"/>
<use name="FWCore/ParameterSet"/>
<use name="DQMServices/Core"/>
<use name="CLHEP"/>
<use name="DQMServices/Core"/>
<use name="DataFormats/HLTReco"/>
<use name="DataFormats/L1TGlobal"/>
<use name="DataFormats/PatCandidates"/>
<use name="DataFormats/Scouting"/>
<use name="L1Trigger/L1TGlobal"/>
<use name="DataFormats/L1TGlobal"/>
<use name="FWCore/Framework"/>
<use name="FWCore/ParameterSet"/>
<use name="FWCore/PluginManager"/>
<use name="FWCore/Utilities"/>
<use name="TrackingTools/Records"/>
<use name="HLTrigger/HLTcore"/>
<use name="DataFormats/HLTReco"/>
<use name="L1Trigger/L1TGlobal"/>
<use name="TrackingTools/Records"/>
<use name="TrackingTools/TransientTrack"/>
<use name="RecoVertex/VertexTools"/>
<flags EDM_PLUGIN="1"/>
Loading