diff --git a/CommonTools/RecoAlgos/interface/RecoTrackSelectorBase.h b/CommonTools/RecoAlgos/interface/RecoTrackSelectorBase.h index 4bfad1f2cea64..e92c77a79b3c3 100644 --- a/CommonTools/RecoAlgos/interface/RecoTrackSelectorBase.h +++ b/CommonTools/RecoAlgos/interface/RecoTrackSelectorBase.h @@ -28,6 +28,7 @@ class RecoTrackSelectorBase { maxChi2_(cfg.getParameter("maxChi2")), minHit_(cfg.getParameter("minHit")), minPixelHit_(cfg.getParameter("minPixelHit")), + maxPixelHit_(cfg.getParameter("maxPixelHit")), minLayer_(cfg.getParameter("minLayer")), min3DLayer_(cfg.getParameter("min3DLayer")), usePV_(false), @@ -97,6 +98,7 @@ class RecoTrackSelectorBase { desc.add("minHit", 0); desc.add("minLayer", 3); desc.add("minPixelHit", 0); + desc.add("maxPixelHit", 99); desc.add >("algorithm", {}); desc.add >("algorithmMaskContains", {}); desc.add >("originalAlgorithm", {}); @@ -149,6 +151,7 @@ class RecoTrackSelectorBase { return ((algo_ok & quality_ok) && t.hitPattern().numberOfValidHits() >= minHit_ && t.hitPattern().numberOfValidPixelHits() >= minPixelHit_ && + t.hitPattern().numberOfValidPixelHits() <= maxPixelHit_ && t.hitPattern().trackerLayersWithMeasurement() >= minLayer_ && t.hitPattern().pixelLayersWithMeasurement() + t.hitPattern().numberOfValidStripLayersWithMonoAndStereo() >= min3DLayer_ && @@ -167,6 +170,7 @@ class RecoTrackSelectorBase { double maxChi2_; int minHit_; int minPixelHit_; + int maxPixelHit_; int minLayer_; int min3DLayer_; bool usePV_; diff --git a/CommonTools/RecoAlgos/python/recoTrackSelectorPSet_cfi.py b/CommonTools/RecoAlgos/python/recoTrackSelectorPSet_cfi.py index 7ece5edef0b70..ab85c304fc701 100644 --- a/CommonTools/RecoAlgos/python/recoTrackSelectorPSet_cfi.py +++ b/CommonTools/RecoAlgos/python/recoTrackSelectorPSet_cfi.py @@ -18,6 +18,7 @@ min3DLayer = cms.int32(0), minHit = cms.int32(0), minPixelHit = cms.int32(0), + maxPixelHit = cms.int32(99), beamSpot = cms.InputTag("offlineBeamSpot"), usePV = cms.bool(False), vertexTag = cms.InputTag('offlinePrimaryVertices'), diff --git a/CommonTools/UtilAlgos/interface/ObjectSelectorProducer.h b/CommonTools/UtilAlgos/interface/ObjectSelectorProducer.h index c2d3090bcf01d..af226760cdadc 100644 --- a/CommonTools/UtilAlgos/interface/ObjectSelectorProducer.h +++ b/CommonTools/UtilAlgos/interface/ObjectSelectorProducer.h @@ -33,6 +33,7 @@ class ObjectSelectorProducer : public Base { /// constructor explicit ObjectSelectorProducer(const edm::ParameterSet& cfg) : Base(cfg), + throwOnMissing_(cfg.template getParameter("throwOnMissing")), srcToken_( this->template consumes(cfg.template getParameter("src"))), selectorInit_(this->consumesCollector()), @@ -45,6 +46,7 @@ class ObjectSelectorProducer : public Base { static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; + desc.add("throwOnMissing", true); desc.add("src", edm::InputTag("")); Selector::fillPSetDescription(desc); descriptions.addWithDefaultLabel(desc); @@ -56,6 +58,13 @@ class ObjectSelectorProducer : public Base { selectorInit_.init(selector_, evt, es); edm::Handle source; evt.getByToken(srcToken_, source); + + // If the input source is not valid AND throwOnMissing is false skip the event + // This is necessary when filtering e.g. HLT collection that are not available for all events + if (!source.isValid() && !throwOnMissing_) { + return; + } + StoreManager manager(source); selector_.select(source, evt, es); manager.cloneAndStore(selector_.begin(), selector_.end(), evt); @@ -63,6 +72,7 @@ class ObjectSelectorProducer : public Base { postProcessor_.process(filtered, evt); } /// source collection label + const bool throwOnMissing_; edm::EDGetTokenT srcToken_; /// Object collection selector Init selectorInit_; diff --git a/Validation/RecoTrack/python/HLTmultiTrackValidator_cff.py b/Validation/RecoTrack/python/HLTmultiTrackValidator_cff.py index 152810f17c043..e2418e360d245 100644 --- a/Validation/RecoTrack/python/HLTmultiTrackValidator_cff.py +++ b/Validation/RecoTrack/python/HLTmultiTrackValidator_cff.py @@ -2,6 +2,7 @@ from Validation.RecoTrack.HLTmultiTrackValidator_cfi import * from SimGeneral.TrackingAnalysis.trackingParticleNumberOfLayersProducer_cff import * +from Validation.RecoTrack.cutsRecoTracks_cfi import cutsRecoTracks as _cutsRecoTracks hltTrackValidator = hltMultiTrackValidator.clone( label = [ @@ -15,12 +16,30 @@ ] ) +# Pixel-less track selector +hltPixelLessTracks = _cutsRecoTracks.clone( + throwOnMissing = cms.bool(False), # HLT collection might be missing + src = "hltMergedTracks", + minLayer = 3, + maxPixelHit = 0 +) + +# Tracks with at least one pixel hit +hltWithPixelTracks = _cutsRecoTracks.clone( + throwOnMissing = cms.bool(False), # HLT collection might be missing + src = "hltMergedTracks", + minLayer = 3, + minPixelHit = 1 +) + hltMultiTrackValidationTask = cms.Task( hltTPClusterProducer , trackingParticleNumberOfLayersProducer , hltTrackAssociatorByHits ) hltMultiTrackValidation = cms.Sequence( + hltPixelLessTracks+ + hltWithPixelTracks+ hltTrackValidator, hltMultiTrackValidationTask ) @@ -32,17 +51,19 @@ def _modifyForRun3(trackvalidator): run3_common.toModify(hltTrackValidator, _modifyForRun3) def _modifyForPhase2(trackvalidator): - trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTrackSelectionHighPurity", "hltHighPtTripletStepTrackSelectionHighPurity"] + trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTrackSelectionHighPurity", "hltHighPtTripletStepTrackSelectionHighPurity", "hltPixelLessTracks", "hltWithPixelTracks"] from Configuration.Eras.Modifier_phase2_tracker_cff import phase2_tracker phase2_tracker.toModify(hltTrackValidator, _modifyForPhase2) +phase2_tracker.toModify(hltPixelLessTracks, src = "hltGeneralTracks") +phase2_tracker.toModify(hltWithPixelTracks, src = "hltGeneralTracks") from Configuration.ProcessModifiers.trackingLST_cff import trackingLST from Configuration.ProcessModifiers.ngtScouting_cff import ngtScouting from Configuration.ProcessModifiers.singleIterPatatrack_cff import singleIterPatatrack def _modifyForSingleIterPatatrack(trackvalidator): - trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTrackSelectionHighPurity"] + trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTrackSelectionHighPurity", "hltPixelLessTracks", "hltWithPixelTracks"] singleIterPatatrack.toModify(hltTrackValidator, _modifyForSingleIterPatatrack) def _modifyForNGTScouting(trackvalidator): @@ -50,5 +71,5 @@ def _modifyForNGTScouting(trackvalidator): (ngtScouting & ~trackingLST).toModify(hltTrackValidator, _modifyForNGTScouting) def _modifyForNGTScoutingLST(trackvalidator): - trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTracksT5TCLST"] + trackvalidator.label = ["hltGeneralTracks", "hltPhase2PixelTracks", "hltInitialStepTracksT5TCLST", "hltPixelLessTracks", "hltWithPixelTracks"] (ngtScouting & trackingLST).toModify(hltTrackValidator, _modifyForNGTScoutingLST) diff --git a/Validation/RecoTrack/src/MTVHistoProducerAlgoForTracker.cc b/Validation/RecoTrack/src/MTVHistoProducerAlgoForTracker.cc index 8382ea9536128..bd2295205a03e 100644 --- a/Validation/RecoTrack/src/MTVHistoProducerAlgoForTracker.cc +++ b/Validation/RecoTrack/src/MTVHistoProducerAlgoForTracker.cc @@ -379,6 +379,7 @@ std::unique_ptr MTVHistoProducerAlgoForTracker::makeRecoT psetTrack.addParameter("maxChi2", 1e10); psetTrack.addParameter("minHit", 0); psetTrack.addParameter("minPixelHit", 0); + psetTrack.addParameter("maxPixelHit", 99); psetTrack.addParameter("minLayer", 0); psetTrack.addParameter("min3DLayer", 0); psetTrack.addParameter("quality", std::vector{});