@@ -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}
0 commit comments