From 622b6a0a7004f69a3d5a50a20b77a80a4478bee6 Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Fri, 16 Jan 2026 21:29:20 +0100 Subject: [PATCH 1/5] clean-up of TrackToTrackComparisonHists --- .../interface/TrackToTrackComparisonHists.h | 149 --------------- .../plugins/SealModule.cc | 8 - .../TrackToTrackComparisonHists.cc | 177 ++++++++++++++++-- 3 files changed, 159 insertions(+), 175 deletions(-) delete mode 100644 DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h delete mode 100644 DQM/TrackingMonitorSource/plugins/SealModule.cc rename DQM/TrackingMonitorSource/{src => plugins}/TrackToTrackComparisonHists.cc (81%) diff --git a/DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h b/DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h deleted file mode 100644 index e741e83d5c1e0..0000000000000 --- a/DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h +++ /dev/null @@ -1,149 +0,0 @@ -// -// Original Author: John Alison, Mia Tosi -// Created: 27 July 2020 -// -// - -// user include files -#include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/EDGetToken.h" -#include "DataFormats/TrackReco/interface/TrackFwd.h" -#include "DataFormats/VertexReco/interface/VertexFwd.h" -#include "DataFormats/BeamSpot/interface/BeamSpotFwd.h" -#include "DataFormats/Scalers/interface/LumiScalers.h" -#include "DataFormats/OnlineMetaData/interface/OnlineLuminosityRecord.h" -#include "DQMServices/Core/interface/MonitorElement.h" -#include "DQMServices/Core/interface/DQMStore.h" -#include "DQMServices/Core/interface/DQMEDAnalyzer.h" - -// system include files -#include -#include -#include -#include - -// -// class declaration -// -class DQMStore; -class GenericTriggerEventFlag; - -class TrackToTrackComparisonHists : public DQMEDAnalyzer { -public: - struct generalME { - std::string label; - MonitorElement *h_tracks, *h_pt, *h_eta, *h_phi, *h_dxy, *h_dz, *h_dxyWRTpv, *h_dzWRTpv, *h_charge, *h_hits; - MonitorElement *h_dRmin, *h_dRmin_l; - MonitorElement* h_pt_vs_eta; - MonitorElement *h_onlinelumi, *h_PU, *h_ls; - }; - - struct matchingME { - std::string label; - MonitorElement *h_hits_vs_hits, *h_pt_vs_pt, *h_eta_vs_eta, *h_phi_vs_phi; - MonitorElement *h_dPt, *h_dEta, *h_dPhi, *h_dDxy, *h_dDz, *h_dDxyWRTpv, *h_dDzWRTpv, *h_dCharge, *h_dHits; - }; - - typedef std::vector>> idx2idxByDoubleColl; - - explicit TrackToTrackComparisonHists(const edm::ParameterSet&); - ~TrackToTrackComparisonHists() override; - - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - static void fillHistoPSetDescription(edm::ParameterSetDescription& pset); - -protected: - void beginJob(const edm::EventSetup& iSetup); - void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override; - void bookHistograms(DQMStore::IBooker& iBooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override; - - void fillMap(const edm::View& tracks1, - const edm::View& tracks2, - idx2idxByDoubleColl& map, - float dRMin); - - void initialize_parameter(const edm::ParameterSet& iConfig); - void bookHistos(DQMStore::IBooker& ibooker, generalME& mes, TString label, std::string& dir); - void book_generic_tracks_histos(DQMStore::IBooker& ibooker, generalME& mes, TString label, std::string& dir); - void book_matching_tracks_histos(DQMStore::IBooker& ibooker, matchingME& mes, TString label, std::string& dir); - - void fill_generic_tracks_histos(generalME& mes, - reco::Track* trk, - reco::BeamSpot* bs, - reco::Vertex* pv, - unsigned int ls, - double onlinelumi, - double PU, - bool requirePlateau = true); - void fill_matching_tracks_histos( - matchingME& mes, reco::Track* mon, reco::Track* ref, reco::BeamSpot* bs, reco::Vertex* pv); - - DQMStore* dqmStore_; - - edm::InputTag monitoredTrackInputTag_; - edm::InputTag referenceTrackInputTag_; - - //these are used by MTVGenPs - edm::EDGetTokenT> monitoredTrackToken_; - edm::EDGetTokenT> referenceTrackToken_; - edm::EDGetTokenT monitoredBSToken_; - edm::EDGetTokenT referenceBSToken_; - edm::EDGetTokenT monitoredPVToken_; - edm::EDGetTokenT referencePVToken_; - edm::EDGetTokenT lumiScalersToken_; - edm::EDGetTokenT onlineMetaDataDigisToken_; - -private: - // edm::ParameterSet conf_; - const bool isCosmics_; - std::string topDirName_; - double dRmin_; - double pTCutForPlateau_; - double dxyCutForPlateau_; - double dzWRTPvCut_; - bool requireValidHLTPaths_; - bool hltPathsAreValid_ = false; - std::unique_ptr genTriggerEventFlag_; - - // reference tracks All and matched - generalME referenceTracksMEs_; - generalME matchedReferenceTracksMEs_; - - // monitored tracks All and unmatched - generalME monitoredTracksMEs_; - generalME unMatchedMonitoredTracksMEs_; - - // Track matching statistics - matchingME matchTracksMEs_; - - double Eta_rangeMin, Eta_rangeMax; - unsigned int Eta_nbin; - double Pt_rangeMin, Pt_rangeMax; - unsigned int Pt_nbin; //bool useInvPt; bool useLogPt; - double Phi_rangeMin, Phi_rangeMax; - unsigned int Phi_nbin; - double Dxy_rangeMin, Dxy_rangeMax; - unsigned int Dxy_nbin; - double Dz_rangeMin, Dz_rangeMax; - unsigned int Dz_nbin; - - double ptRes_rangeMin, ptRes_rangeMax; - unsigned int ptRes_nbin; - double phiRes_rangeMin, phiRes_rangeMax; - unsigned int phiRes_nbin; - double etaRes_rangeMin, etaRes_rangeMax; - unsigned int etaRes_nbin; - double dxyRes_rangeMin, dxyRes_rangeMax; - unsigned int dxyRes_nbin; - double dzRes_rangeMin, dzRes_rangeMax; - unsigned int dzRes_nbin; - unsigned int ls_rangeMin, ls_rangeMax; - unsigned int ls_nbin; - double PU_rangeMin, PU_rangeMax; - unsigned int PU_nbin; - double onlinelumi_rangeMin, onlinelumi_rangeMax; - unsigned int onlinelumi_nbin; -}; diff --git a/DQM/TrackingMonitorSource/plugins/SealModule.cc b/DQM/TrackingMonitorSource/plugins/SealModule.cc deleted file mode 100644 index 32ef50dfe3c42..0000000000000 --- a/DQM/TrackingMonitorSource/plugins/SealModule.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include "FWCore/PluginManager/interface/ModuleDef.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h" -DEFINE_FWK_MODULE(TrackToTrackComparisonHists); - -//#include "DQM/TrackingMonitorSource/interface/Vertex2VertexValidator.h" -//DEFINE_FWK_MODULE(Vertex2VertexValidator); diff --git a/DQM/TrackingMonitorSource/src/TrackToTrackComparisonHists.cc b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc similarity index 81% rename from DQM/TrackingMonitorSource/src/TrackToTrackComparisonHists.cc rename to DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc index b3e78f174b4f5..9ca0b7ad15588 100644 --- a/DQM/TrackingMonitorSource/src/TrackToTrackComparisonHists.cc +++ b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc @@ -1,15 +1,151 @@ -#include "FWCore/MessageLogger/interface/MessageLogger.h" -#include "DQM/TrackingMonitorSource/interface/TrackToTrackComparisonHists.h" +// +// Original Author: John Alison, Mia Tosi +// Created: 27 July 2020 +// +// +// user include files +#include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h" +#include "DQMServices/Core/interface/DQMEDAnalyzer.h" #include "DQMServices/Core/interface/DQMStore.h" - -#include "DataFormats/TrackReco/interface/Track.h" +#include "DQMServices/Core/interface/MonitorElement.h" #include "DataFormats/BeamSpot/interface/BeamSpot.h" -#include "DataFormats/VertexReco/interface/Vertex.h" #include "DataFormats/Luminosity/interface/LumiSummary.h" - #include "DataFormats/Math/interface/deltaR.h" -#include "CommonTools/TriggerUtils/interface/GenericTriggerEventFlag.h" +#include "DataFormats/OnlineMetaData/interface/OnlineLuminosityRecord.h" +#include "DataFormats/Scalers/interface/LumiScalers.h" +#include "DataFormats/TrackReco/interface/Track.h" +#include "DataFormats/TrackReco/interface/TrackFwd.h" +#include "DataFormats/VertexReco/interface/Vertex.h" +#include "DataFormats/VertexReco/interface/VertexFwd.h" +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/MakerMacros.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/EDGetToken.h" + +// system include files +#include +#include +#include +#include + +class TrackToTrackComparisonHists : public DQMEDAnalyzer { +public: + struct generalME { + std::string label; + MonitorElement *h_tracks, *h_pt, *h_eta, *h_phi, *h_dxy, *h_dz, *h_dxyWRTpv, *h_dzWRTpv, *h_charge, *h_hits; + MonitorElement *h_dRmin, *h_dRmin_l; + MonitorElement* h_pt_vs_eta; + MonitorElement *h_onlinelumi, *h_PU, *h_ls; + }; + + struct matchingME { + std::string label; + MonitorElement *h_hits_vs_hits, *h_pt_vs_pt, *h_eta_vs_eta, *h_phi_vs_phi; + MonitorElement *h_dPt, *h_dEta, *h_dPhi, *h_dDxy, *h_dDz, *h_dDxyWRTpv, *h_dDzWRTpv, *h_dCharge, *h_dHits; + }; + + typedef std::vector>> idx2idxByDoubleColl; + + explicit TrackToTrackComparisonHists(const edm::ParameterSet&); + ~TrackToTrackComparisonHists() override; + + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + static void fillHistoPSetDescription(edm::ParameterSetDescription& pset); + +protected: + void beginJob(const edm::EventSetup& iSetup); + void analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) override; + void bookHistograms(DQMStore::IBooker& iBooker, edm::Run const& iRun, edm::EventSetup const& iSetup) override; + + void fillMap(const edm::View& tracks1, + const edm::View& tracks2, + idx2idxByDoubleColl& map, + float dRMin); + + void initialize_parameter(const edm::ParameterSet& iConfig); + void bookHistos(DQMStore::IBooker& ibooker, generalME& mes, TString label, std::string& dir); + void book_generic_tracks_histos(DQMStore::IBooker& ibooker, generalME& mes, TString label, std::string& dir); + void book_matching_tracks_histos(DQMStore::IBooker& ibooker, matchingME& mes, TString label, std::string& dir); + + void fill_generic_tracks_histos(generalME& mes, + reco::Track* trk, + reco::BeamSpot* bs, + reco::Vertex* pv, + unsigned int ls, + double onlinelumi, + double PU, + bool requirePlateau = true); + void fill_matching_tracks_histos( + matchingME& mes, reco::Track* mon, reco::Track* ref, reco::BeamSpot* bs, reco::Vertex* pv); + + const edm::InputTag monitoredTrackInputTag_; + const edm::InputTag referenceTrackInputTag_; + + //these are used by MTVGenPs + const edm::EDGetTokenT> monitoredTrackToken_; + const edm::EDGetTokenT> referenceTrackToken_; + const edm::EDGetTokenT monitoredBSToken_; + const edm::EDGetTokenT referenceBSToken_; + const edm::EDGetTokenT monitoredPVToken_; + const edm::EDGetTokenT referencePVToken_; + const edm::EDGetTokenT lumiScalersToken_; + const edm::EDGetTokenT onlineMetaDataDigisToken_; + +private: + // edm::ParameterSet conf_; + const bool isCosmics_; + const std::string topDirName_; + const double dRmin_; + const double pTCutForPlateau_; + const double dxyCutForPlateau_; + const double dzWRTPvCut_; + const bool requireValidHLTPaths_; + + bool hltPathsAreValid_ = false; + std::unique_ptr genTriggerEventFlag_; + + // reference tracks All and matched + generalME referenceTracksMEs_; + generalME matchedReferenceTracksMEs_; + + // monitored tracks All and unmatched + generalME monitoredTracksMEs_; + generalME unMatchedMonitoredTracksMEs_; + + // Track matching statistics + matchingME matchTracksMEs_; + + double Eta_rangeMin, Eta_rangeMax; + unsigned int Eta_nbin; + double Pt_rangeMin, Pt_rangeMax; + unsigned int Pt_nbin; //bool useInvPt; bool useLogPt; + double Phi_rangeMin, Phi_rangeMax; + unsigned int Phi_nbin; + double Dxy_rangeMin, Dxy_rangeMax; + unsigned int Dxy_nbin; + double Dz_rangeMin, Dz_rangeMax; + unsigned int Dz_nbin; + + double ptRes_rangeMin, ptRes_rangeMax; + unsigned int ptRes_nbin; + double phiRes_rangeMin, phiRes_rangeMax; + unsigned int phiRes_nbin; + double etaRes_rangeMin, etaRes_rangeMax; + unsigned int etaRes_nbin; + double dxyRes_rangeMin, dxyRes_rangeMax; + unsigned int dxyRes_nbin; + double dzRes_rangeMin, dzRes_rangeMax; + unsigned int dzRes_nbin; + unsigned int ls_rangeMin, ls_rangeMax; + unsigned int ls_nbin; + double PU_rangeMin, PU_rangeMax; + unsigned int PU_nbin; + double onlinelumi_rangeMin, onlinelumi_rangeMax; + unsigned int onlinelumi_nbin; +}; // // constructors and destructor @@ -17,6 +153,17 @@ TrackToTrackComparisonHists::TrackToTrackComparisonHists(const edm::ParameterSet& iConfig) : monitoredTrackInputTag_(iConfig.getParameter("monitoredTrack")), referenceTrackInputTag_(iConfig.getParameter("referenceTrack")), + monitoredTrackToken_(consumes>(monitoredTrackInputTag_)), + referenceTrackToken_(consumes>(referenceTrackInputTag_)), + monitoredBSToken_(consumes(iConfig.getParameter("monitoredBeamSpot"))), + referenceBSToken_(consumes(iConfig.getParameter("referenceBeamSpot"))), + monitoredPVToken_( + consumes(iConfig.getParameter("monitoredPrimaryVertices"))), + referencePVToken_( + consumes(iConfig.getParameter("referencePrimaryVertices"))), + lumiScalersToken_(consumes(iConfig.getParameter("scalers"))), + onlineMetaDataDigisToken_( + consumes(iConfig.getParameter("onlineMetaDataDigis"))), isCosmics_(iConfig.getParameter("isCosmics")), topDirName_(iConfig.getParameter("topDirName")), dRmin_(iConfig.getParameter("dRmin")), @@ -31,16 +178,6 @@ TrackToTrackComparisonHists::TrackToTrackComparisonHists(const edm::ParameterSet initialize_parameter(iConfig); //now do what ever initialization is needed - monitoredTrackToken_ = consumes>(monitoredTrackInputTag_); - referenceTrackToken_ = consumes>(referenceTrackInputTag_); - monitoredBSToken_ = consumes(iConfig.getParameter("monitoredBeamSpot")); - referenceBSToken_ = consumes(iConfig.getParameter("referenceBeamSpot")); - monitoredPVToken_ = consumes(iConfig.getParameter("monitoredPrimaryVertices")); - referencePVToken_ = consumes(iConfig.getParameter("referencePrimaryVertices")); - lumiScalersToken_ = consumes(iConfig.getParameter("scalers")); - onlineMetaDataDigisToken_ = - consumes(iConfig.getParameter("onlineMetaDataDigis")); - referenceTracksMEs_.label = referenceTrackInputTag_.label(); matchedReferenceTracksMEs_.label = referenceTrackInputTag_.label() + "_matched"; @@ -342,7 +479,7 @@ void TrackToTrackComparisonHists::fillDescriptions(edm::ConfigurationDescription fillHistoPSetDescription(histoPSet); desc.add("histoPSet", histoPSet); - descriptions.add("trackToTrackComparisonHists", desc); + descriptions.addWithDefaultLabel(desc); } void TrackToTrackComparisonHists::fillMap(const edm::View& tracks1, @@ -684,3 +821,7 @@ void TrackToTrackComparisonHists::fillHistoPSetDescription(edm::ParameterSetDesc pset.add("PU_rangeMax", 120.0); pset.add("PU_nbin", 120); } + +#include "FWCore/PluginManager/interface/ModuleDef.h" +#include "FWCore/Framework/interface/MakerMacros.h" +DEFINE_FWK_MODULE(TrackToTrackComparisonHists); From 0a76e9a051838c6e582b26a7c4c83d7240fe012e Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Fri, 16 Jan 2026 22:33:33 +0100 Subject: [PATCH 2/5] use range-based loop for filling generic track histos --- .../plugins/TrackToTrackComparisonHists.cc | 98 +++++++++---------- 1 file changed, 45 insertions(+), 53 deletions(-) diff --git a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc index 9ca0b7ad15588..438737c7ebd65 100644 --- a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc +++ b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc @@ -71,15 +71,18 @@ class TrackToTrackComparisonHists : public DQMEDAnalyzer { void book_matching_tracks_histos(DQMStore::IBooker& ibooker, matchingME& mes, TString label, std::string& dir); void fill_generic_tracks_histos(generalME& mes, - reco::Track* trk, - reco::BeamSpot* bs, - reco::Vertex* pv, + const reco::Track* trk, + const reco::BeamSpot* bs, + const reco::Vertex* pv, unsigned int ls, double onlinelumi, double PU, bool requirePlateau = true); - void fill_matching_tracks_histos( - matchingME& mes, reco::Track* mon, reco::Track* ref, reco::BeamSpot* bs, reco::Vertex* pv); + void fill_matching_tracks_histos(matchingME& mes, + const reco::Track* mon, + const reco::Track* ref, + const reco::BeamSpot* bs, + const reco::Vertex* pv); const edm::InputTag monitoredTrackInputTag_; const edm::InputTag referenceTrackInputTag_; @@ -330,88 +333,77 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // loop over reference tracks // LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (reference): " << referenceTracks.size() << "\n"; - for (idx2idxByDoubleColl::const_iterator pItr = reference2monitoredColl.begin(), eItr = reference2monitoredColl.end(); - pItr != eItr; - ++pItr) { + for (const auto& [trackIdx, trackDRmap] : reference2monitoredColl) { nReferenceTracks++; - int trackIdx = pItr->first; - reco::Track track = referenceTracks.at(trackIdx); + + const reco::Track& track = referenceTracks.at(trackIdx); float dzWRTpv = track.dz(referencePV.position()); - if (fabs(dzWRTpv) > dzWRTPvCut_) + if (std::abs(dzWRTpv) > dzWRTPvCut_) continue; fill_generic_tracks_histos(*&referenceTracksMEs_, &track, &referenceBS, &referencePV, ls, onlinelumi, PU); - std::map trackDRmap = pItr->second; if (trackDRmap.empty()) { - (matchedReferenceTracksMEs_.h_dRmin)->Fill(-1.); - (matchedReferenceTracksMEs_.h_dRmin_l)->Fill(-1.); + matchedReferenceTracksMEs_.h_dRmin->Fill(-1.); + matchedReferenceTracksMEs_.h_dRmin_l->Fill(-1.); continue; } - double dRmin = trackDRmap.begin()->first; - (referenceTracksMEs_.h_dRmin)->Fill(dRmin); - (referenceTracksMEs_.h_dRmin_l)->Fill(dRmin); - - bool matched = false; - if (dRmin < dRmin_) - matched = true; + const double dRmin = trackDRmap.begin()->first; + referenceTracksMEs_.h_dRmin->Fill(dRmin); + referenceTracksMEs_.h_dRmin_l->Fill(dRmin); - if (matched) { + if (dRmin < dRmin_) { nMatchedReferenceTracks++; + fill_generic_tracks_histos(*&matchedReferenceTracksMEs_, &track, &referenceBS, &referencePV, ls, onlinelumi, PU); - (matchedReferenceTracksMEs_.h_dRmin)->Fill(dRmin); - (matchedReferenceTracksMEs_.h_dRmin_l)->Fill(dRmin); - int matchedTrackIndex = trackDRmap[dRmin]; - reco::Track matchedTrack = monitoredTracks.at(matchedTrackIndex); + matchedReferenceTracksMEs_.h_dRmin->Fill(dRmin); + matchedReferenceTracksMEs_.h_dRmin_l->Fill(dRmin); + + const int matchedTrackIndex = trackDRmap.at(dRmin); + const reco::Track& matchedTrack = monitoredTracks.at(matchedTrackIndex); + fill_matching_tracks_histos(*&matchTracksMEs_, &track, &matchedTrack, &referenceBS, &referencePV); } - - } // Over reference tracks + } // over reference tracks // // loop over monitoed tracks // LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (monitored): " << monitoredTracks.size() << "\n"; - for (idx2idxByDoubleColl::const_iterator pItr = monitored2referenceColl.begin(), eItr = monitored2referenceColl.end(); - pItr != eItr; - ++pItr) { + for (const auto& [trackIdx, trackDRmap] : monitored2referenceColl) { nMonitoredTracks++; - int trackIdx = pItr->first; - reco::Track track = monitoredTracks.at(trackIdx); + + const reco::Track& track = monitoredTracks.at(trackIdx); float dzWRTpv = track.dz(monitoredPV.position()); - if (fabs(dzWRTpv) > dzWRTPvCut_) + if (std::abs(dzWRTpv) > dzWRTPvCut_) continue; fill_generic_tracks_histos(*&monitoredTracksMEs_, &track, &monitoredBS, &monitoredPV, ls, onlinelumi, PU); - std::map trackDRmap = pItr->second; if (trackDRmap.empty()) { - (unMatchedMonitoredTracksMEs_.h_dRmin)->Fill(-1.); - (unMatchedMonitoredTracksMEs_.h_dRmin_l)->Fill(-1.); + unMatchedMonitoredTracksMEs_.h_dRmin->Fill(-1.); + unMatchedMonitoredTracksMEs_.h_dRmin_l->Fill(-1.); continue; } - double dRmin = trackDRmap.begin()->first; - (monitoredTracksMEs_.h_dRmin)->Fill(dRmin); - (monitoredTracksMEs_.h_dRmin_l)->Fill(dRmin); - - bool matched = false; - if (dRmin < dRmin_) - matched = true; + const double dRmin = trackDRmap.begin()->first; + monitoredTracksMEs_.h_dRmin->Fill(dRmin); + monitoredTracksMEs_.h_dRmin_l->Fill(dRmin); - if (!matched) { + if (dRmin >= dRmin_) { nUnmatchedMonitoredTracks++; + fill_generic_tracks_histos( *&unMatchedMonitoredTracksMEs_, &track, &monitoredBS, &monitoredPV, ls, onlinelumi, PU); - (unMatchedMonitoredTracksMEs_.h_dRmin)->Fill(dRmin); - (unMatchedMonitoredTracksMEs_.h_dRmin_l)->Fill(dRmin); - } - } // over monitoed tracks + unMatchedMonitoredTracksMEs_.h_dRmin->Fill(dRmin); + unMatchedMonitoredTracksMEs_.h_dRmin_l->Fill(dRmin); + } + } // over monitored tracks edm::LogInfo("TrackToTrackComparisonHists") << "Total reference tracks: " << nReferenceTracks << "\n" @@ -630,9 +622,9 @@ void TrackToTrackComparisonHists::book_matching_tracks_histos(DQMStore::IBooker& } void TrackToTrackComparisonHists::fill_generic_tracks_histos(generalME& mes, - reco::Track* trk, - reco::BeamSpot* bs, - reco::Vertex* pv, + const reco::Track* trk, + const reco::BeamSpot* bs, + const reco::Vertex* pv, unsigned int ls, double onlinelumi, double PU, @@ -675,7 +667,7 @@ void TrackToTrackComparisonHists::fill_generic_tracks_histos(generalME& mes, } void TrackToTrackComparisonHists::fill_matching_tracks_histos( - matchingME& mes, reco::Track* mon, reco::Track* ref, reco::BeamSpot* bs, reco::Vertex* pv) { + matchingME& mes, const reco::Track* mon, const reco::Track* ref, const reco::BeamSpot* bs, const reco::Vertex* pv) { float mon_pt = mon->pt(); float mon_eta = mon->eta(); float mon_phi = mon->phi(); From 5a8b701401cac2f42804625a0fc676f47213a71f Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Sat, 17 Jan 2026 13:27:56 +0100 Subject: [PATCH 3/5] reduce cost of fillMap by using deltaR2 instead of deltaR --- .../plugins/TrackToTrackComparisonHists.cc | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc index 438737c7ebd65..116aff40435fa 100644 --- a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc +++ b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc @@ -333,7 +333,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // loop over reference tracks // LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (reference): " << referenceTracks.size() << "\n"; - for (const auto& [trackIdx, trackDRmap] : reference2monitoredColl) { + for (const auto& [trackIdx, trackDR2map] : reference2monitoredColl) { nReferenceTracks++; const reco::Track& track = referenceTracks.at(trackIdx); @@ -344,13 +344,14 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E fill_generic_tracks_histos(*&referenceTracksMEs_, &track, &referenceBS, &referencePV, ls, onlinelumi, PU); - if (trackDRmap.empty()) { + if (trackDR2map.empty()) { matchedReferenceTracksMEs_.h_dRmin->Fill(-1.); matchedReferenceTracksMEs_.h_dRmin_l->Fill(-1.); continue; } - const double dRmin = trackDRmap.begin()->first; + const double dR2min = trackDR2map.begin()->first; + const double dRmin = std::sqrt(dR2min); referenceTracksMEs_.h_dRmin->Fill(dRmin); referenceTracksMEs_.h_dRmin_l->Fill(dRmin); @@ -362,7 +363,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E matchedReferenceTracksMEs_.h_dRmin->Fill(dRmin); matchedReferenceTracksMEs_.h_dRmin_l->Fill(dRmin); - const int matchedTrackIndex = trackDRmap.at(dRmin); + const int matchedTrackIndex = trackDR2map.at(dR2min); const reco::Track& matchedTrack = monitoredTracks.at(matchedTrackIndex); fill_matching_tracks_histos(*&matchTracksMEs_, &track, &matchedTrack, &referenceBS, &referencePV); @@ -373,7 +374,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // loop over monitoed tracks // LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (monitored): " << monitoredTracks.size() << "\n"; - for (const auto& [trackIdx, trackDRmap] : monitored2referenceColl) { + for (const auto& [trackIdx, trackDR2map] : monitored2referenceColl) { nMonitoredTracks++; const reco::Track& track = monitoredTracks.at(trackIdx); @@ -384,13 +385,14 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E fill_generic_tracks_histos(*&monitoredTracksMEs_, &track, &monitoredBS, &monitoredPV, ls, onlinelumi, PU); - if (trackDRmap.empty()) { + if (trackDR2map.empty()) { unMatchedMonitoredTracksMEs_.h_dRmin->Fill(-1.); unMatchedMonitoredTracksMEs_.h_dRmin_l->Fill(-1.); continue; } - const double dRmin = trackDRmap.begin()->first; + const double dR2min = trackDR2map.begin()->first; + const double dRmin = std::sqrt(dR2min); monitoredTracksMEs_.h_dRmin->Fill(dRmin); monitoredTracksMEs_.h_dRmin_l->Fill(dRmin); @@ -485,22 +487,22 @@ void TrackToTrackComparisonHists::fillMap(const edm::View& tracks1, for (const auto& track1 : tracks1) { std::map tmp; int j = 0; - float smallest_dR = 1e9; - int smallest_dR_j = -1; + float smallest_dR2 = 1e9 * 1e9; + int smallest_dR2_j = -1; // // loop on tracks2 // for (const auto& track2 : tracks2) { - double dR = reco::deltaR(track1.eta(), track1.phi(), track2.eta(), track2.phi()); + double dR2 = reco::deltaR2(track1.eta(), track1.phi(), track2.eta(), track2.phi()); - if (dR < smallest_dR) { - smallest_dR = dR; - smallest_dR_j = j; + if (dR2 < smallest_dR2) { + smallest_dR2 = dR2; + smallest_dR2_j = j; } - if (dR < dRMin) { - tmp[dR] = j; + if (dR2 < dRMin * dRMin) { + tmp[dR2] = j; } j++; @@ -510,7 +512,7 @@ void TrackToTrackComparisonHists::fillMap(const edm::View& tracks1, // If there are no tracks that pass the dR store the smallest (for debugging/validating matching) // if (tmp.empty()) - tmp[smallest_dR] = smallest_dR_j; + tmp[smallest_dR2] = smallest_dR2_j; map.push_back(std::make_pair(i, tmp)); i++; From 5e473fca01a9d52d6aab0da62be990f885b50c8d Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Sat, 17 Jan 2026 18:30:37 +0100 Subject: [PATCH 4/5] simply handle access in TrackToTrackComparisonHists --- .../plugins/TrackToTrackComparisonHists.cc | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc index 116aff40435fa..40f448add4e9d 100644 --- a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc +++ b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc @@ -241,8 +241,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // // Get Reference Track Info // - edm::Handle> referenceTracksHandle; - iEvent.getByToken(referenceTrackToken_, referenceTracksHandle); + auto const referenceTracksHandle = iEvent.getHandle(referenceTrackToken_); if (!referenceTracksHandle.isValid()) { edm::LogError("TrackToTrackComparisonHists") << "referenceTracksHandle with input tag " << referenceTrackInputTag_.encode() << " not found, skipping event"; @@ -250,17 +249,14 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E } const edm::View& referenceTracks = *referenceTracksHandle; - edm::Handle referenceBSHandle; - iEvent.getByToken(referenceBSToken_, referenceBSHandle); + const auto& referenceBSHandle = iEvent.getHandle(referenceBSToken_); if (!referenceBSHandle.isValid()) { edm::LogError("TrackToTrackComparisonHists") << "referenceBSHandle not found, skipping event"; return; } reco::BeamSpot referenceBS = *referenceBSHandle; - edm::Handle referencePVHandle; - iEvent.getByToken(referencePVToken_, referencePVHandle); - + const auto& referencePVHandle = iEvent.getHandle(referencePVToken_); reco::Vertex referencePV; if (isCosmics_) { referencePV = reco::Vertex(referenceBS.position(), referenceBS.rotatedCovariance3D(), 0., 0., 0); @@ -277,8 +273,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // // Get Monitored Track Info // - edm::Handle> monitoredTracksHandle; - iEvent.getByToken(monitoredTrackToken_, monitoredTracksHandle); + const auto& monitoredTracksHandle = iEvent.getHandle(monitoredTrackToken_); if (!monitoredTracksHandle.isValid()) { edm::LogError("TrackToTrackComparisonHists") << "monitoredTracksHandle with input tag " << monitoredTrackInputTag_.encode() << " not found, skipping event"; @@ -286,17 +281,14 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E } const edm::View& monitoredTracks = *monitoredTracksHandle; - edm::Handle monitoredBSHandle; - iEvent.getByToken(monitoredBSToken_, monitoredBSHandle); + const auto& monitoredBSHandle = iEvent.getHandle(monitoredBSToken_); if (!monitoredTracksHandle.isValid()) { edm::LogError("TrackToTrackComparisonHists") << "monitoredBSHandle not found, skipping event"; return; } reco::BeamSpot monitoredBS = *monitoredBSHandle; - edm::Handle monitoredPVHandle; - iEvent.getByToken(monitoredPVToken_, monitoredPVHandle); - + const auto& monitoredPVHandle = iEvent.getHandle(monitoredPVToken_); reco::Vertex monitoredPV; if (isCosmics_) { monitoredPV = reco::Vertex(monitoredBS.position(), monitoredBS.rotatedCovariance3D(), 0., 0., 0); From 85f9f89ae64c5061db9281933b0eaf693cae8eae Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Fri, 23 Jan 2026 15:27:21 +0100 Subject: [PATCH 5/5] Factor out common track/BS/PV retrieval logic --- .../plugins/TrackToTrackComparisonHists.cc | 114 +++++++++--------- 1 file changed, 55 insertions(+), 59 deletions(-) diff --git a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc index 40f448add4e9d..ff365bd9505a0 100644 --- a/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc +++ b/DQM/TrackingMonitorSource/plugins/TrackToTrackComparisonHists.cc @@ -238,69 +238,65 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E return; } + // lambda function to get the event data products + auto getEventContext = + [&](const edm::EDGetTokenT>& trackToken, + const edm::EDGetTokenT& bsToken, + const edm::EDGetTokenT& pvToken, + const edm::InputTag& trackTag, + const std::string& label) -> std::tuple*, reco::BeamSpot, reco::Vertex> { + // Tracks + const auto tracksHandle = iEvent.getHandle(trackToken); + if (!tracksHandle.isValid()) { + edm::LogError("TrackToTrackComparisonHists") + << label << "TracksHandle with input tag " << trackTag.encode() << " not found, skipping event"; + return {nullptr, {}, {}}; + } + + // BeamSpot + const auto bsHandle = iEvent.getHandle(bsToken); + if (!bsHandle.isValid()) { + edm::LogError("TrackToTrackComparisonHists") << label << "BSHandle not found, skipping event"; + return {nullptr, {}, {}}; + } + + reco::BeamSpot bs = *bsHandle; + + // Primary vertex + reco::Vertex pv; + if (isCosmics_) { + pv = reco::Vertex(bs.position(), bs.rotatedCovariance3D(), 0., 0., 0); + } else { + const auto pvHandle = iEvent.getHandle(pvToken); + if (!pvHandle.isValid() || pvHandle->empty()) { + edm::LogError("TrackToTrackComparisonHists") + << label + << (!pvHandle.isValid() ? "PVHandle not found, skipping event" : "PVHandle is empty, skipping event"); + return {nullptr, {}, {}}; + } + pv = pvHandle->front(); + } + + return {tracksHandle.product(), bs, pv}; + }; + // // Get Reference Track Info // - auto const referenceTracksHandle = iEvent.getHandle(referenceTrackToken_); - if (!referenceTracksHandle.isValid()) { - edm::LogError("TrackToTrackComparisonHists") - << "referenceTracksHandle with input tag " << referenceTrackInputTag_.encode() << " not found, skipping event"; - return; - } - const edm::View& referenceTracks = *referenceTracksHandle; + const auto [referenceTracks, referenceBS, referencePV] = + getEventContext(referenceTrackToken_, referenceBSToken_, referencePVToken_, referenceTrackInputTag_, "reference"); - const auto& referenceBSHandle = iEvent.getHandle(referenceBSToken_); - if (!referenceBSHandle.isValid()) { - edm::LogError("TrackToTrackComparisonHists") << "referenceBSHandle not found, skipping event"; + if (!referenceTracks) return; - } - reco::BeamSpot referenceBS = *referenceBSHandle; - - const auto& referencePVHandle = iEvent.getHandle(referencePVToken_); - reco::Vertex referencePV; - if (isCosmics_) { - referencePV = reco::Vertex(referenceBS.position(), referenceBS.rotatedCovariance3D(), 0., 0., 0); - } else { - if (!referencePVHandle.isValid() || referencePVHandle->empty()) { - edm::LogError("TrackToTrackComparisonHists") - << (!referencePVHandle.isValid() ? "referencePVHandle not found, skipping event" - : "referencePVHandle is empty, skipping event"); - return; - } - referencePV = referencePVHandle->front(); - } // // Get Monitored Track Info // - const auto& monitoredTracksHandle = iEvent.getHandle(monitoredTrackToken_); - if (!monitoredTracksHandle.isValid()) { - edm::LogError("TrackToTrackComparisonHists") - << "monitoredTracksHandle with input tag " << monitoredTrackInputTag_.encode() << " not found, skipping event"; - return; - } - const edm::View& monitoredTracks = *monitoredTracksHandle; + const auto [monitoredTracks, monitoredBS, monitoredPV] = + getEventContext(monitoredTrackToken_, monitoredBSToken_, monitoredPVToken_, monitoredTrackInputTag_, "monitored"); - const auto& monitoredBSHandle = iEvent.getHandle(monitoredBSToken_); - if (!monitoredTracksHandle.isValid()) { - edm::LogError("TrackToTrackComparisonHists") << "monitoredBSHandle not found, skipping event"; + if (!monitoredTracks) return; - } - reco::BeamSpot monitoredBS = *monitoredBSHandle; - - const auto& monitoredPVHandle = iEvent.getHandle(monitoredPVToken_); - reco::Vertex monitoredPV; - if (isCosmics_) { - monitoredPV = reco::Vertex(monitoredBS.position(), monitoredBS.rotatedCovariance3D(), 0., 0., 0); - } else { - if (!monitoredPVHandle.isValid() || monitoredPVHandle->empty()) { - edm::LogError("TrackToTrackComparisonHists") - << (!monitoredPVHandle.isValid() ? "monitoredPVHandle not found, skipping event" - : "monitoredPVHandle is empty, skipping event"); - return; - } - monitoredPV = monitoredPVHandle->front(); - } edm::LogInfo("TrackToTrackComparisonHists") << "analyzing " << monitoredTrackInputTag_.process() << ":" << monitoredTrackInputTag_.label() << ":" @@ -311,10 +307,10 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // Build the dR maps // idx2idxByDoubleColl monitored2referenceColl; - fillMap(monitoredTracks, referenceTracks, monitored2referenceColl, dRmin_); + fillMap(*monitoredTracks, *referenceTracks, monitored2referenceColl, dRmin_); idx2idxByDoubleColl reference2monitoredColl; - fillMap(referenceTracks, monitoredTracks, reference2monitoredColl, dRmin_); + fillMap(*referenceTracks, *monitoredTracks, reference2monitoredColl, dRmin_); unsigned int nReferenceTracks(0); // Counts the number of refernce tracks unsigned int nMatchedReferenceTracks(0); // Counts the number of matched refernce tracks @@ -324,11 +320,11 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // // loop over reference tracks // - LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (reference): " << referenceTracks.size() << "\n"; + LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (reference): " << referenceTracks->size() << "\n"; for (const auto& [trackIdx, trackDR2map] : reference2monitoredColl) { nReferenceTracks++; - const reco::Track& track = referenceTracks.at(trackIdx); + const reco::Track& track = referenceTracks->at(trackIdx); float dzWRTpv = track.dz(referencePV.position()); if (std::abs(dzWRTpv) > dzWRTPvCut_) @@ -356,7 +352,7 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E matchedReferenceTracksMEs_.h_dRmin_l->Fill(dRmin); const int matchedTrackIndex = trackDR2map.at(dR2min); - const reco::Track& matchedTrack = monitoredTracks.at(matchedTrackIndex); + const reco::Track& matchedTrack = monitoredTracks->at(matchedTrackIndex); fill_matching_tracks_histos(*&matchTracksMEs_, &track, &matchedTrack, &referenceBS, &referencePV); } @@ -365,11 +361,11 @@ void TrackToTrackComparisonHists::analyze(const edm::Event& iEvent, const edm::E // // loop over monitoed tracks // - LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (monitored): " << monitoredTracks.size() << "\n"; + LogDebug("TrackToTrackComparisonHists") << "\n# of tracks (monitored): " << monitoredTracks->size() << "\n"; for (const auto& [trackIdx, trackDR2map] : monitored2referenceColl) { nMonitoredTracks++; - const reco::Track& track = monitoredTracks.at(trackIdx); + const reco::Track& track = monitoredTracks->at(trackIdx); float dzWRTpv = track.dz(monitoredPV.position()); if (std::abs(dzWRTpv) > dzWRTPvCut_)