@@ -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" ));
0 commit comments