Skip to content

Commit 78ed121

Browse files
authored
Merge pull request #48707 from cms-ngt-hlt/mm_jp_caloScouting_DQM
Update `ScoutingCollectionMonitor` to allow monitoring of ECal and HCal PF rechits
2 parents ac6c225 + 649c43b commit 78ed121

File tree

2 files changed

+237
-4
lines changed

2 files changed

+237
-4
lines changed

DQM/HLTEvF/plugins/ScoutingCollectionMonitor.cc

Lines changed: 230 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,17 @@ 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/EcalDetId/interface/EBDetId.h"
28+
#include "DataFormats/EcalDetId/interface/EEDetId.h"
29+
#include "DataFormats/HcalDetId/interface/HcalDetId.h"
2730
#include "DataFormats/L1TGlobal/interface/GlobalAlgBlk.h"
2831
#include "DataFormats/OnlineMetaData/interface/OnlineLuminosityRecord.h"
2932
#include "DataFormats/PatCandidates/interface/PackedTriggerPrescales.h"
3033
#include "DataFormats/PatCandidates/interface/TriggerObjectStandAlone.h"
34+
#include "DataFormats/Scouting/interface/Run3ScoutingEBRecHit.h"
35+
#include "DataFormats/Scouting/interface/Run3ScoutingEERecHit.h"
3136
#include "DataFormats/Scouting/interface/Run3ScoutingElectron.h"
37+
#include "DataFormats/Scouting/interface/Run3ScoutingHBHERecHit.h"
3238
#include "DataFormats/Scouting/interface/Run3ScoutingMuon.h"
3339
#include "DataFormats/Scouting/interface/Run3ScoutingPFJet.h"
3440
#include "DataFormats/Scouting/interface/Run3ScoutingParticle.h"
@@ -62,6 +68,14 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
6268
void analyze(const edm::Event&, const edm::EventSetup&) override;
6369
void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override;
6470

71+
template <typename T>
72+
void setToken(edm::EDGetTokenT<T>& token, const edm::ParameterSet& iConfig, std::string name) {
73+
const auto inputTag = iConfig.getParameter<edm::InputTag>(name);
74+
if (!inputTag.encode().empty()) {
75+
token = consumes(inputTag);
76+
}
77+
}
78+
6579
template <typename T>
6680
bool getValidHandle(const edm::Event& iEvent,
6781
const edm::EDGetTokenT<T>& token,
@@ -105,6 +119,13 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
105119
const edm::EDGetTokenT<OnlineLuminosityRecord> onlineMetaDataDigisToken_;
106120
const std::string topfoldername_;
107121

122+
// calo rechits (only 2025 V1.3 onwards, see https://its.cern.ch/jira/browse/CMSHLT-3607)
123+
edm::EDGetTokenT<Run3ScoutingEBRecHitCollection> ebRecHitsToken_;
124+
edm::EDGetTokenT<Run3ScoutingEERecHitCollection> eeRecHitsToken_;
125+
edm::EDGetTokenT<Run3ScoutingEBRecHitCollection> ebCleanedRecHitsToken_;
126+
edm::EDGetTokenT<Run3ScoutingEERecHitCollection> eeCleanedRecHitsToken_;
127+
edm::EDGetTokenT<Run3ScoutingHBHERecHitCollection> hbheRecHitsToken_;
128+
108129
// pv vs PU and rho vs PU plots
109130
int primaryVertex_counter = 0;
110131
float avgPileUp;
@@ -384,6 +405,22 @@ class ScoutingCollectionMonitor : public DQMEDAnalyzer {
384405
dqm::reco::MonitorElement* tk_chi2_prob_hist;
385406
dqm::reco::MonitorElement* tk_PV_dxy_hist;
386407
dqm::reco::MonitorElement* tk_PV_dz_hist;
408+
409+
// calo rechits histrograms (ECAL has two version, cleaned and unclean)
410+
dqm::reco::MonitorElement* ebRecHitsNumber_hist[2];
411+
dqm::reco::MonitorElement* ebRecHits_energy_hist[2];
412+
dqm::reco::MonitorElement* ebRecHits_time_hist[2];
413+
dqm::reco::MonitorElement* ebRecHitsEtaPhiMap[2];
414+
dqm::reco::MonitorElement* eeRecHitsNumber_hist[2];
415+
dqm::reco::MonitorElement* eeRecHits_energy_hist[2];
416+
dqm::reco::MonitorElement* eeRecHits_time_hist[2];
417+
dqm::reco::MonitorElement* eePlusRecHitsXYMap[2];
418+
dqm::reco::MonitorElement* eeMinusRecHitsXYMap[2];
419+
dqm::reco::MonitorElement* hbheRecHitsNumber_hist;
420+
dqm::reco::MonitorElement* hbheRecHits_energy_hist;
421+
dqm::reco::MonitorElement* hbheRecHitsEtaPhiMap;
422+
dqm::reco::MonitorElement* hbRecHitsEtaPhiMap;
423+
dqm::reco::MonitorElement* heRecHitsEtaPhiMap;
387424
};
388425

389426
//
@@ -408,7 +445,13 @@ ScoutingCollectionMonitor::ScoutingCollectionMonitor(const edm::ParameterSet& iC
408445
pfjetsToken_(consumes<std::vector<Run3ScoutingPFJet>>(iConfig.getParameter<edm::InputTag>("pfjets"))),
409446
tracksToken_(consumes<std::vector<Run3ScoutingTrack>>(iConfig.getParameter<edm::InputTag>("tracks"))),
410447
onlineMetaDataDigisToken_(consumes(iConfig.getParameter<edm::InputTag>("onlineMetaDataDigis"))),
411-
topfoldername_(iConfig.getParameter<std::string>("topfoldername")) {}
448+
topfoldername_(iConfig.getParameter<std::string>("topfoldername")) {
449+
setToken(ebRecHitsToken_, iConfig, "pfRecHitsEB");
450+
setToken(eeRecHitsToken_, iConfig, "pfRecHitsEE");
451+
setToken(ebCleanedRecHitsToken_, iConfig, "pfCleanedRecHitsEB");
452+
setToken(eeCleanedRecHitsToken_, iConfig, "pfCleanedRecHitsEE");
453+
setToken(hbheRecHitsToken_, iConfig, "pfRecHitsHBHE");
454+
}
412455

413456
//
414457
// member functions
@@ -797,6 +840,100 @@ void ScoutingCollectionMonitor::analyze(const edm::Event& iEvent, const edm::Eve
797840
tk_PV_dxy_hist->Fill(best_offset.first);
798841
tk_PV_dz_hist->Fill(best_offset.second);
799842
}
843+
844+
// Define helper lambdas for EB and EE rechits
845+
auto fillEBHistograms = [](const auto& rechits,
846+
int index,
847+
dqm::reco::MonitorElement* numberHist[2],
848+
dqm::reco::MonitorElement* etaPhiMap[2],
849+
dqm::reco::MonitorElement* energyHist[2],
850+
dqm::reco::MonitorElement* timeHist[2]) {
851+
numberHist[index]->Fill(rechits.size());
852+
for (const auto& hit : rechits) {
853+
EBDetId id(hit.detId());
854+
etaPhiMap[index]->Fill(id.ieta(), id.iphi());
855+
energyHist[index]->Fill(hit.energy());
856+
timeHist[index]->Fill(hit.time());
857+
}
858+
};
859+
860+
auto fillEEHistograms = [](const auto& rechits,
861+
int index,
862+
dqm::reco::MonitorElement* numberHist[2],
863+
dqm::reco::MonitorElement* plusXYMap[2],
864+
dqm::reco::MonitorElement* minusXYMap[2],
865+
dqm::reco::MonitorElement* energyHist[2],
866+
dqm::reco::MonitorElement* timeHist[2]) {
867+
numberHist[index]->Fill(rechits.size());
868+
for (const auto& hit : rechits) {
869+
EEDetId id(hit.detId());
870+
if (id.zside() > 0) {
871+
plusXYMap[index]->Fill(id.ix(), id.iy());
872+
} else {
873+
minusXYMap[index]->Fill(id.ix(), id.iy());
874+
}
875+
energyHist[index]->Fill(hit.energy());
876+
timeHist[index]->Fill(hit.time());
877+
}
878+
};
879+
880+
// Process uncleaned EB rechits
881+
edm::Handle<Run3ScoutingEBRecHitCollection> ebRecHitsH;
882+
if (!ebRecHitsToken_.isUninitialized() && getValidHandle(iEvent, ebRecHitsToken_, ebRecHitsH, "pfRecHitsEB")) {
883+
fillEBHistograms(
884+
*ebRecHitsH, 0, ebRecHitsNumber_hist, ebRecHitsEtaPhiMap, ebRecHits_energy_hist, ebRecHits_time_hist);
885+
}
886+
887+
// Process uncleaned EE rechits
888+
edm::Handle<Run3ScoutingEERecHitCollection> eeRecHitsH;
889+
if (!eeRecHitsToken_.isUninitialized() && getValidHandle(iEvent, eeRecHitsToken_, eeRecHitsH, "pfRecHitsEE")) {
890+
fillEEHistograms(*eeRecHitsH,
891+
0,
892+
eeRecHitsNumber_hist,
893+
eePlusRecHitsXYMap,
894+
eeMinusRecHitsXYMap,
895+
eeRecHits_energy_hist,
896+
eeRecHits_time_hist);
897+
}
898+
899+
// Process cleaned EB rechits
900+
edm::Handle<Run3ScoutingEBRecHitCollection> ebRecHitsCleanedH;
901+
if (!ebCleanedRecHitsToken_.isUninitialized() &&
902+
getValidHandle(iEvent, ebCleanedRecHitsToken_, ebRecHitsCleanedH, "pfCleanedRecHitsEB")) {
903+
fillEBHistograms(
904+
*ebRecHitsCleanedH, 1, ebRecHitsNumber_hist, ebRecHitsEtaPhiMap, ebRecHits_energy_hist, ebRecHits_time_hist);
905+
}
906+
907+
// Process cleaned EE rechits
908+
edm::Handle<Run3ScoutingEERecHitCollection> eeRecHitsCleanedH;
909+
if (!eeCleanedRecHitsToken_.isUninitialized() &&
910+
getValidHandle(iEvent, eeCleanedRecHitsToken_, eeRecHitsCleanedH, "pfCleanedRecHitsEE")) {
911+
fillEEHistograms(*eeRecHitsCleanedH,
912+
1,
913+
eeRecHitsNumber_hist,
914+
eePlusRecHitsXYMap,
915+
eeMinusRecHitsXYMap,
916+
eeRecHits_energy_hist,
917+
eeRecHits_time_hist);
918+
}
919+
920+
// process the HBHE rechits
921+
edm::Handle<Run3ScoutingHBHERecHitCollection> hbheRecHitsH;
922+
if (!hbheRecHitsToken_.isUninitialized() &&
923+
getValidHandle(iEvent, hbheRecHitsToken_, hbheRecHitsH, "pfRecHitsHBHE")) {
924+
hbheRecHitsNumber_hist->Fill(hbheRecHitsH->size());
925+
for (const auto& hbheRecHit : *hbheRecHitsH) {
926+
hbheRecHits_energy_hist->Fill(hbheRecHit.energy());
927+
HcalDetId hcalid(hbheRecHit.detId());
928+
hbheRecHitsEtaPhiMap->Fill(hcalid.ieta(), hcalid.iphi());
929+
const auto& subdet = hcalid.subdetId();
930+
if (subdet == 1) { // HB
931+
hbRecHitsEtaPhiMap->Fill(hcalid.ieta(), hcalid.iphi());
932+
} else { // HE
933+
heRecHitsEtaPhiMap->Fill(hcalid.ieta(), hcalid.iphi());
934+
}
935+
}
936+
}
800937
}
801938

802939
// ------------ method called once each job just before starting event loop ------------
@@ -1203,6 +1340,93 @@ void ScoutingCollectionMonitor::bookHistograms(DQMStore::IBooker& ibook,
12031340
tk_chi2_prob_hist = ibook.book1DD("tk_chi2_prob_hist", "p(#chi^{2}, NDOF); p(#chi^{2}, NDOF); Entries", 100, 0, 1);
12041341
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);
12051342
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);
1343+
1344+
// book the calo rechits histograms
1345+
const std::array<std::string, 2> caloLabels = {{"All", "Cleaned"}};
1346+
const std::array<std::string, 2> caloSuffixes = {{"", "_clean"}};
1347+
for (int i = 0; i < 2; ++i) {
1348+
ibook.setCurrentFolder(topfoldername_ + "/CaloRecHits" + caloLabels[i]);
1349+
1350+
const std::string& lbl = caloLabels[i];
1351+
const std::string& sfx = caloSuffixes[i];
1352+
1353+
ebRecHitsNumber_hist[i] = ibook.book1D(
1354+
"ebRechitsN" + sfx, "Number of EB RecHits (" + lbl + "); number of EB recHits; Entries", 100, 0.0, 1000.0);
1355+
1356+
ebRecHits_energy_hist[i] =
1357+
ibook.book1D("ebRechits_energy" + sfx,
1358+
"Energy spectrum of EB RecHits (" + lbl + "); Energy of EB recHits (Gev); Entries",
1359+
100,
1360+
0.0,
1361+
500.0);
1362+
1363+
ebRecHits_time_hist[i] = ibook.book1D("ebRechits_time" + sfx,
1364+
"Time of EB RecHits (" + lbl + "); Energy of EB recHits (ps); Entries",
1365+
100,
1366+
0.0,
1367+
1000.0);
1368+
eeRecHitsNumber_hist[i] = ibook.book1D(
1369+
"eeRechitsN" + sfx, "Number of EE RecHits (" + lbl + "); number of EE recHits; Entries", 100, 0.0, 1000.0);
1370+
eeRecHits_energy_hist[i] =
1371+
ibook.book1D("eeRechits_energy" + sfx,
1372+
"Energy spectrum of EE RecHits (" + lbl + "); Energy of EE recHits (GeV); Entries",
1373+
100,
1374+
0.0,
1375+
1000.0);
1376+
eeRecHits_time_hist[i] = ibook.book1D(
1377+
"eeRechits_time" + sfx, "Time of EE RecHits (" + lbl + "); Time of EE recHits (ps); Entries", 100, 0.0, 1000.0);
1378+
1379+
ebRecHitsEtaPhiMap[i] = ibook.book2D("ebRecHitsEtaPhitMap" + sfx,
1380+
"Occupancy map of EB rechits (" + lbl + ");ieta;iphi;Entries",
1381+
171,
1382+
-85.5,
1383+
85.5,
1384+
361,
1385+
0.,
1386+
361);
1387+
1388+
ebRecHitsEtaPhiMap[i]->setOption("colz");
1389+
1390+
eePlusRecHitsXYMap[i] = ibook.book2D("eePlusRecHitsEtaPhitMap" + sfx,
1391+
"Occupancy map of EE+ rechits (" + lbl + ");ix;iy;Entries",
1392+
100,
1393+
1,
1394+
101,
1395+
100,
1396+
1,
1397+
101);
1398+
1399+
eePlusRecHitsXYMap[i]->setOption("colz");
1400+
1401+
eeMinusRecHitsXYMap[i] = ibook.book2D("eeMinusRecHitsEtaPhitMap" + sfx,
1402+
"Occupancy map of EE- rechits (" + lbl + ");ix;iy;Entries",
1403+
100,
1404+
1,
1405+
101,
1406+
100,
1407+
1,
1408+
101);
1409+
1410+
eeMinusRecHitsXYMap[i]->setOption("colz");
1411+
}
1412+
1413+
ibook.setCurrentFolder(topfoldername_ + "/CaloRecHitsAll");
1414+
hbheRecHitsNumber_hist =
1415+
ibook.book1D("hbheRechitsN", "number of hbhe RecHits; Number of HBHE recHits; Entries", 100, 0.0, 2000.0);
1416+
hbheRecHits_energy_hist = ibook.book1D(
1417+
"hbheRechits_energy", "Energy spectrum of hbhe RecHits; Energy of HBHE recHits (GeV); Entries", 100, 0.0, 200.0);
1418+
1419+
hbheRecHitsEtaPhiMap = ibook.book2D(
1420+
"hbheRecHitsEtaPhitMap", "Occupancy map of HBHE rechits;ieta;iphi;Entries", 61, -30.5, 30.5, 74, -0.5, 73.5);
1421+
hbheRecHitsEtaPhiMap->setOption("colz");
1422+
1423+
hbRecHitsEtaPhiMap = ibook.book2D(
1424+
"hbRecHitsEtaPhitMap", "Occupancy map of HB rechits;ieta;iphi;Entries", 83, -41.5, 41.5, 72, 0.5, 72.5);
1425+
hbRecHitsEtaPhiMap->setOption("colz");
1426+
1427+
heRecHitsEtaPhiMap = ibook.book2D(
1428+
"heRecHitsEtaPhitMap", "Occupancy map of HE rechits;ieta;iphi;Entries", 83, -41.5, 41.5, 72, 0.5, 72.5);
1429+
heRecHitsEtaPhiMap->setOption("colz");
12061430
}
12071431
// ------------ method fills 'descriptions' with the allowed parameters for the module ------------
12081432

@@ -1223,6 +1447,11 @@ void ScoutingCollectionMonitor::fillDescriptions(edm::ConfigurationDescriptions&
12231447
desc.add<edm::InputTag>("pfMetPhi", edm::InputTag("hltScoutingPFPacker", "pfMetPhi"));
12241448
desc.add<edm::InputTag>("rho", edm::InputTag("hltScoutingPFPacker", "rho"));
12251449
desc.add<edm::InputTag>("onlineMetaDataDigis", edm::InputTag("onlineMetaDataDigis"));
1450+
desc.add<edm::InputTag>("pfRecHitsEB", edm::InputTag("hltScoutingRecHitPacker", "EB"));
1451+
desc.add<edm::InputTag>("pfRecHitsEE", edm::InputTag("hltScoutingRecHitPacker", "EE"));
1452+
desc.add<edm::InputTag>("pfRecHitsHBHE", edm::InputTag("hltScoutingRecHitPacker", "HBHE"));
1453+
desc.add<edm::InputTag>("pfCleanedRecHitsEB", edm::InputTag("hltScoutingRecHitPacker", "EBCleaned"));
1454+
desc.add<edm::InputTag>("pfCleanedRecHitsEE", edm::InputTag("hltScoutingRecHitPacker", "EECleaned"));
12261455
desc.add<std::string>("topfoldername", "HLT/ScoutingOffline/Miscellaneous");
12271456
descriptions.addWithDefaultLabel(desc);
12281457
}

DQM/HLTEvF/python/ScoutingCollectionMonitor_cfi.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
from DQMServices.Core.DQMEDAnalyzer import DQMEDAnalyzer
33

44
scoutingCollectionMonitor = DQMEDAnalyzer('ScoutingCollectionMonitor',
5-
onlyScouting = cms.bool(False),
5+
topfoldername = cms.string("HLT/ScoutingOffline/Miscellaneous"),
6+
onlyScouting = cms.bool(False),
67
onlineMetaDataDigis = cms.InputTag("onlineMetaDataDigis"),
78
muons = cms.InputTag("hltScoutingMuonPackerNoVtx"),
89
muonsVtx = cms.InputTag("hltScoutingMuonPackerVtx"),
@@ -17,6 +18,9 @@
1718
pfMetPt = cms.InputTag("hltScoutingPFPacker","pfMetPt"),
1819
pfMetPhi = cms.InputTag("hltScoutingPFPacker","pfMetPhi"),
1920
rho = cms.InputTag("hltScoutingPFPacker","rho"),
20-
topfoldername = cms.string("HLT/ScoutingOffline/Miscellaneous")
21-
)
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"))
2226

0 commit comments

Comments
 (0)