From 2f5c077d1af949243aa75170c769dc2ec7f44193 Mon Sep 17 00:00:00 2001 From: Mario Masciovecchio Date: Wed, 18 Mar 2026 11:27:32 -0700 Subject: [PATCH] Adding pass-through option to MultiTrackSelector (for LST tracking / seeding) --- .../plugins/AnalyticalTrackSelector.cc | 8 ++++++++ .../plugins/MultiTrackSelector.cc | 15 +++++++++++++-- .../plugins/MultiTrackSelector.h | 3 +++ .../python/multiTrackSelector_cfi.py | 3 +++ .../python/HighPtTripletStep_cff.py | 5 +++++ 5 files changed, 32 insertions(+), 2 deletions(-) diff --git a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc index aedf76cf9066b..c3416adb3de75 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/AnalyticalTrackSelector.cc @@ -113,6 +113,9 @@ AnalyticalTrackSelector::AnalyticalTrackSelector(const edm::ParameterSet& cfg) : beamspot_ = consumes(cfg.getParameter("beamspot")); useVertices_ = cfg.getParameter("useVertices"); useVtxError_ = cfg.getParameter("useVtxError"); + passThroughForAll_ = cfg.getParameter("passThroughForAll"); + passThroughForDisplaced_ = cfg.getParameter("passThroughForDisplaced"); + minLayersForDisplaced_ = cfg.getParameter("minLayersForDisplaced"); if (useVertices_) vertices_ = consumes(cfg.getParameter("vertices")); copyExtras_ = cfg.getUntrackedParameter("copyExtras", false); @@ -402,6 +405,11 @@ void AnalyticalTrackSelector::fillDescriptions(edm::ConfigurationDescriptions& d desc.add("vtxNumber", -1); desc.add("vertexCut", "ndof>=2&!isFake"); + // pass-through options + desc.add("passThroughForAll", false); + desc.add("passThroughForDisplaced", false); + desc.add("minLayersForDisplaced", 4); + desc.addUntracked("copyExtras", false); desc.addUntracked("copyTrajectories", false); desc.add("qualityBit", std::string(""))->setComment("set to ''if you don't want to set the bit"); diff --git a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc index 761cee753c524..aea4f3b94565a 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc +++ b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.cc @@ -20,7 +20,10 @@ MultiTrackSelector::MultiTrackSelector(const edm::ParameterSet& cfg) hSrc_(consumes(cfg.getParameter("src"))), beamspot_(consumes(cfg.getParameter("beamspot"))), useVertices_(cfg.getParameter("useVertices")), - useVtxError_(cfg.getParameter("useVtxError")) + useVtxError_(cfg.getParameter("useVtxError")), + passThroughForAll_(cfg.getParameter("passThroughForAll")), + passThroughForDisplaced_(cfg.getParameter("passThroughForDisplaced")), + minLayersForDisplaced_(cfg.getParameter("minLayersForDisplaced")) // now get the pset for each selector { if (useVertices_) @@ -344,6 +347,15 @@ bool MultiTrackSelector::select(unsigned int tsNum, using namespace std; + if (passThroughForAll_) + return true; + uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); + uint32_t npixhits = tk.hitPattern().numberOfValidPixelHits(); + if (passThroughForDisplaced_) { + if (npixhits == 0 && nlayers >= minLayersForDisplaced_) + return true; + } + //cuts on number of valid hits auto nhits = tk.numberOfValidHits(); if ((nhits >= min_hits_bypass_[tsNum]) || (nhits == 0)) @@ -368,7 +380,6 @@ bool MultiTrackSelector::select(unsigned int tsNum, /////////////////////////////// // Cuts on numbers of layers with hits/3D hits/lost hits. - uint32_t nlayers = tk.hitPattern().trackerLayersWithMeasurement(); uint32_t nlayers3D = tk.hitPattern().pixelLayersWithMeasurement() + tk.hitPattern().numberOfValidStripLayersWithMonoAndStereo(); uint32_t nlayersLost = tk.hitPattern().trackerLayersWithoutMeasurement(reco::HitPattern::TRACK_HITS); diff --git a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h index ff45507aa0927..0dd044dc16a1f 100644 --- a/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h +++ b/RecoTracker/FinalTrackSelectors/plugins/MultiTrackSelector.h @@ -89,6 +89,9 @@ class dso_hidden MultiTrackSelector : public edm::stream::EDProducer<> { edm::EDGetTokenT beamspot_; bool useVertices_; bool useVtxError_; + bool passThroughForAll_; + bool passThroughForDisplaced_; + uint32_t minLayersForDisplaced_; bool useAnyMVA_; edm::EDGetTokenT vertices_; diff --git a/RecoTracker/FinalTrackSelectors/python/multiTrackSelector_cfi.py b/RecoTracker/FinalTrackSelectors/python/multiTrackSelector_cfi.py index 2fe23cc7d8014..43c47c3811a78 100644 --- a/RecoTracker/FinalTrackSelectors/python/multiTrackSelector_cfi.py +++ b/RecoTracker/FinalTrackSelectors/python/multiTrackSelector_cfi.py @@ -85,6 +85,9 @@ useVertices = cms.bool(True), useVtxError = cms.bool(False), vertices = cms.InputTag("firstStepPrimaryVertices"), + passThroughForAll = cms.bool(False), + passThroughForDisplaced = cms.bool(False), + minLayersForDisplaced = cms.uint32(4), trackSelectors = cms.VPSet( looseMTS, tightMTS, highpurityMTS) diff --git a/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py b/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py index a4fe8a290a488..47dcba561f933 100644 --- a/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py +++ b/RecoTracker/IterativeTracking/python/HighPtTripletStep_cff.py @@ -259,6 +259,7 @@ phase2clustersToSkip = 'highPtTripletStepClusters' ) +from Configuration.ProcessModifiers.seedingLST_cff import seedingLST from Configuration.ProcessModifiers.trackingLST_cff import trackingLST from RecoTracker.LST.lstOutputConverter_cfi import lstOutputConverter as _lstOutputConverter (trackingPhase2PU140 & trackingLST).toReplaceWith(highPtTripletStepTrackCandidates, _lstOutputConverter.clone()) @@ -381,9 +382,13 @@ vectorHits.toModify(highPtTripletStepSelector.trackSelectors[2], minNumberLayers = 3, minNumber3DLayers = 3, d0_par1 = ( 0.5, 4.0 ), dz_par1 = ( 0.6, 4.0 )) (trackingPhase2PU140 & trackingLST).toModify(highPtTripletStepSelector, src = 'highPtTripletStepLSTpTracks') + +from Configuration.ProcessModifiers.seedingLST_cff import seedingLST +(trackingPhase2PU140 & (trackingLST | seedingLST)).toModify(highPtTripletStepSelector, passThroughForAll = True) # Passthrough selector to satisfy the TrackListMerger requirement for selector values highPtTripletStepSelectorLSTT4T5 = RecoTracker.FinalTrackSelectors.multiTrackSelector_cfi.multiTrackSelector.clone( src = 'highPtTripletStepLSTT4T5Tracks', + passThroughForDisplaced = True, trackSelectors = [ RecoTracker.FinalTrackSelectors.multiTrackSelector_cfi.looseMTS.clone( name = 'highPtTripletStepLSTT4T5Loose',