From f88e74b4bc7dddf497f845a2b7a5ba7fac31da4c Mon Sep 17 00:00:00 2001 From: Marco Musich Date: Sun, 28 Sep 2025 20:58:04 +0200 Subject: [PATCH] PrimaryVertexResolution: add protection against missing track references in input vertex --- .../src/PrimaryVertexResolution.cc | 43 +++++++++++++++---- 1 file changed, 34 insertions(+), 9 deletions(-) diff --git a/DQM/TrackingMonitor/src/PrimaryVertexResolution.cc b/DQM/TrackingMonitor/src/PrimaryVertexResolution.cc index 30cd52deb0f32..909b5faff9d95 100644 --- a/DQM/TrackingMonitor/src/PrimaryVertexResolution.cc +++ b/DQM/TrackingMonitor/src/PrimaryVertexResolution.cc @@ -47,7 +47,7 @@ namespace { class PrimaryVertexResolution : public DQMEDAnalyzer { public: PrimaryVertexResolution(const edm::ParameterSet& iConfig); - ~PrimaryVertexResolution() override; + ~PrimaryVertexResolution() override = default; void bookHistograms(DQMStore::IBooker&, edm::Run const&, edm::EventSetup const&) override; void analyze(const edm::Event&, const edm::EventSetup&) override; @@ -60,12 +60,15 @@ class PrimaryVertexResolution : public DQMEDAnalyzer { const reco::BeamSpot& beamspot); const edm::ESGetToken ttbToken_; - edm::EDGetTokenT vertexSrc_; - edm::EDGetTokenT beamspotSrc_; - edm::EDGetTokenT lumiScalersSrc_; - edm::EDGetTokenT metaDataSrc_; + + const edm::InputTag vertexInputTag_; + const edm::EDGetTokenT vertexSrc_; + const edm::EDGetTokenT beamspotSrc_; + const edm::EDGetTokenT lumiScalersSrc_; + const edm::EDGetTokenT metaDataSrc_; const bool forceSCAL_; - std::string rootFolder_; + const std::string rootFolder_; + bool errorPrinted_; AdaptiveVertexFitter fitter_; @@ -327,19 +330,19 @@ class PrimaryVertexResolution : public DQMEDAnalyzer { PrimaryVertexResolution::PrimaryVertexResolution(const edm::ParameterSet& iConfig) : ttbToken_(esConsumes(edm::ESInputTag("", iConfig.getUntrackedParameter("transientTrackBuilder")))), - vertexSrc_(consumes(iConfig.getUntrackedParameter("vertexSrc"))), + vertexInputTag_(iConfig.getUntrackedParameter("vertexSrc")), + vertexSrc_(consumes(vertexInputTag_)), beamspotSrc_(consumes(iConfig.getUntrackedParameter("beamspotSrc"))), lumiScalersSrc_(consumes(iConfig.getUntrackedParameter("lumiScalersSrc"))), metaDataSrc_(consumes(iConfig.getUntrackedParameter("metaDataSrc"))), forceSCAL_(iConfig.getUntrackedParameter("forceSCAL")), rootFolder_(iConfig.getUntrackedParameter("rootFolder")), + errorPrinted_(false), binningX_(iConfig), binningY_(iConfig), hPV_(binningX_, binningY_), hOtherV_(binningX_, binningY_) {} -PrimaryVertexResolution::~PrimaryVertexResolution() {} - void PrimaryVertexResolution::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; desc.addUntracked("vertexSrc", edm::InputTag("trackingDQMgoodOfflinePrimaryVertices")); @@ -399,6 +402,28 @@ void PrimaryVertexResolution::analyze(const edm::Event& iEvent, const edm::Event if (vertices.empty()) return; + // check upfront that refs to track are (likely) to be valid + { + bool ok = true; + for (const auto& v : vertices) { + if (v.tracksSize() > 0) { + const auto& ref = v.trackRefAt(0); + if (ref.isNull() || !ref.isAvailable()) { + if (!errorPrinted_) + edm::LogWarning("PrimaryVertexResolution") + << "Skipping vertex collection: " << vertexInputTag_ + << " since likely the track collection the vertex has refs pointing to is missing (at least the first " + "TrackBaseRef is null or not available)"; + else + errorPrinted_ = true; + ok = false; + } + } + } + if (!ok) + return; + } + edm::Handle hbeamspot = iEvent.getHandle(beamspotSrc_); const reco::BeamSpot& beamspot = *hbeamspot;