From 3b4f94874634b172745ad28eea407289d5a65c87 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Tue, 14 Apr 2020 11:37:43 +0200 Subject: [PATCH 1/3] ElectronNHitSeedProducer to global plugin --- .../interface/TrajSeedMatcher.h | 111 ++++++------ .../src/TrajSeedMatcher.cc | 162 +++++++++--------- .../plugins/ElectronNHitSeedProducer.cc | 81 ++++----- 3 files changed, 173 insertions(+), 181 deletions(-) diff --git a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h index 5d6bd6ac6b34a..67b8c4cfdaf48 100644 --- a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h +++ b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h @@ -35,7 +35,11 @@ #include "RecoTracker/MeasurementDet/interface/MeasurementTrackerEvent.h" #include "RecoEgamma/EgammaElectronAlgos/interface/utils.h" +#include "RecoTracker/Record/interface/NavigationSchoolRecord.h" +#include "TrackingTools/RecoGeometry/interface/RecoGeometryRecord.h" + namespace edm { + class ConsumesCollector; class EventSetup; class ConfigurationDescriptions; class ParameterSet; @@ -49,16 +53,7 @@ class TrajSeedMatcher { public: class SCHitMatch { public: - SCHitMatch() - : detId_(0), - dRZ_(std::numeric_limits::max()), - dPhi_(std::numeric_limits::max()), - hit_(nullptr), - et_(0), - eta_(0), - phi_(0), - charge_(0), - nrClus_(0) {} + SCHitMatch() {} //does not set charge,et,nrclus SCHitMatch(const GlobalPoint& vtxPos, const TrajectoryStateOnSurface& trajState, const TrackingRecHit& hit); @@ -85,17 +80,17 @@ class TrajSeedMatcher { const TrackingRecHit* hit() const { return hit_; } private: - DetId detId_; + DetId detId_ = 0; GlobalPoint hitPos_; - float dRZ_; - float dPhi_; - const TrackingRecHit* hit_; //we do not own this + float dRZ_ = std::numeric_limits::max(); + float dPhi_ = std::numeric_limits::max(); + const TrackingRecHit* hit_ = nullptr; //we do not own this //extra quanities which are set later - float et_; - float eta_; - float phi_; - int charge_; - int nrClus_; + float et_ = 0.f; + float eta_ = 0.f; + float phi_ = 0.f; + int charge_ = 0; + int nrClus_ = 0; }; struct MatchInfo { @@ -178,19 +173,41 @@ class TrajSeedMatcher { }; public: - explicit TrajSeedMatcher(const edm::ParameterSet& pset); + struct Configuration { + Configuration(const edm::ParameterSet& pset, edm::ConsumesCollector&& cc); + + const edm::ESGetToken magFieldToken; + const edm::ESGetToken paramMagFieldToken; + const edm::ESGetToken navSchoolToken; + const edm::ESGetToken detLayerGeomToken; + + const bool useRecoVertex; + const bool enableHitSkipping; + const bool requireExactMatchCount; + const bool useParamMagFieldIfDefined; + + //these two varibles determine how hits we require + //based on how many valid layers we had + //right now we always need atleast two hits + //also highly dependent on the seeds you pass in + //which also require a given number of hits + const std::vector minNrHits; + const std::vector minNrHitsValidLayerBins; + + const std::vector > matchingCuts; + }; + + explicit TrajSeedMatcher(Configuration const& cfg, + edm::EventSetup const& iSetup, + MeasurementTrackerEvent const& measTkEvt); ~TrajSeedMatcher() = default; static edm::ParameterSetDescription makePSetDescription(); - void doEventSetup(const edm::EventSetup& iSetup); - - std::vector compatibleSeeds(const TrajectorySeedCollection& seeds, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy); - - void setMeasTkEvtHandle(edm::Handle handle) { measTkEvt_ = std::move(handle); } + std::vector operator()(const TrajectorySeedCollection& seeds, + const GlobalPoint& candPos, + const GlobalPoint& vprim, + const float energy); private: std::vector processSeed(const TrajectorySeed& seed, @@ -252,37 +269,23 @@ class TrajSeedMatcher { //parameterised b-fields may not be valid for entire detector, just tracker volume //however need we ecal so we auto select based on the position const MagneticField& getMagField(const GlobalPoint& point) const { - return useParamMagFieldIfDefined_ && magFieldParam_->isDefined(point) ? *magFieldParam_ : *magField_; + return cfg_.useParamMagFieldIfDefined && magFieldParam_.isDefined(point) ? magFieldParam_ : magField_; } private: static constexpr float kElectronMass_ = 0.000511; static constexpr float kPhiCut_ = -0.801144; //cos(2.5) - std::unique_ptr forwardPropagator_; - std::unique_ptr backwardPropagator_; - unsigned long long cacheIDMagField_; - edm::ESHandle magField_; - edm::ESHandle magFieldParam_; - edm::Handle measTkEvt_; - edm::ESHandle navSchool_; - edm::ESHandle detLayerGeom_; - std::string paramMagFieldLabel_; - std::string navSchoolLabel_; - std::string detLayerGeomLabel_; - - bool useRecoVertex_; - bool enableHitSkipping_; - bool requireExactMatchCount_; - bool useParamMagFieldIfDefined_; - std::vector > matchingCuts_; - - //these two varibles determine how hits we require - //based on how many valid layers we had - //right now we always need atleast two hits - //also highly dependent on the seeds you pass in - //which also require a given number of hits - const std::vector minNrHits_; - const std::vector minNrHitsValidLayerBins_; + + Configuration const& cfg_; + + MagneticField const& magField_; + MagneticField const& magFieldParam_; + MeasurementTrackerEvent const& measTkEvt_; + NavigationSchool const& navSchool_; + DetLayerGeometry const& detLayerGeom_; + + PropagatorWithMaterial forwardPropagator_; + PropagatorWithMaterial backwardPropagator_; std::unordered_map trajStateFromVtxPosChargeCache_; std::unordered_map trajStateFromVtxNegChargeCache_; diff --git a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc index 072bcd7c2645f..5642ed9fe25bf 100644 --- a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc +++ b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc @@ -10,59 +10,81 @@ #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h" #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h" -#include "TrackingTools/RecoGeometry/interface/RecoGeometryRecord.h" #include "TrackingTools/KalmanUpdators/interface/Chi2MeasurementEstimator.h" -#include "RecoTracker/Record/interface/NavigationSchoolRecord.h" - #include "TrackingTools/TrajectoryState/interface/ftsFromVertexToPoint.h" #include "RecoEgamma/EgammaElectronAlgos/interface/ElectronUtilities.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" + constexpr float TrajSeedMatcher::kElectronMass_; -TrajSeedMatcher::TrajSeedMatcher(const edm::ParameterSet& pset) - : cacheIDMagField_(0), - paramMagFieldLabel_(pset.getParameter("paramMagField")), - navSchoolLabel_(pset.getParameter("navSchool")), - detLayerGeomLabel_(pset.getParameter("detLayerGeom")), - useRecoVertex_(pset.getParameter("useRecoVertex")), - enableHitSkipping_(pset.getParameter("enableHitSkipping")), - requireExactMatchCount_(pset.getParameter("requireExactMatchCount")), - useParamMagFieldIfDefined_(pset.getParameter("useParamMagFieldIfDefined")), - minNrHits_(pset.getParameter >("minNrHits")), - minNrHitsValidLayerBins_(pset.getParameter >("minNrHitsValidLayerBins")) { - const auto cutsPSets = pset.getParameter >("matchingCuts"); - for (const auto& cutPSet : cutsPSets) { - int version = cutPSet.getParameter("version"); - switch (version) { - case 1: - matchingCuts_.emplace_back(std::make_unique(cutPSet)); - break; - case 2: - matchingCuts_.emplace_back(std::make_unique(cutPSet)); - break; - default: - throw cms::Exception("InvalidConfig") << " Error TrajSeedMatcher::TrajSeedMatcher pixel match cuts version " - << version << " not recognised" << std::endl; +namespace { + auto makeMatchingCuts(std::vector const& cutsPSets) { + std::vector > matchingCuts; + + for (const auto& cutPSet : cutsPSets) { + int version = cutPSet.getParameter("version"); + switch (version) { + case 1: + matchingCuts.emplace_back(std::make_unique(cutPSet)); + break; + case 2: + matchingCuts.emplace_back(std::make_unique(cutPSet)); + break; + default: + throw cms::Exception("InvalidConfig") << " Error TrajSeedMatcher::TrajSeedMatcher pixel match cuts version " + << version << " not recognised" << std::endl; + } } - } - if (minNrHitsValidLayerBins_.size() + 1 != minNrHits_.size()) { + return matchingCuts; + } +}; // namespace + +TrajSeedMatcher::Configuration::Configuration(const edm::ParameterSet& pset, edm::ConsumesCollector&& cc) + : magFieldToken{cc.esConsumes()}, + paramMagFieldToken{ + cc.esConsumes(pset.getParameter("paramMagField"))}, + navSchoolToken{ + cc.esConsumes(pset.getParameter("navSchool"))}, + detLayerGeomToken{ + cc.esConsumes(pset.getParameter("detLayerGeom"))}, + useRecoVertex{pset.getParameter("useRecoVertex")}, + enableHitSkipping{pset.getParameter("enableHitSkipping")}, + requireExactMatchCount{pset.getParameter("requireExactMatchCount")}, + useParamMagFieldIfDefined{pset.getParameter("useParamMagFieldIfDefined")}, + minNrHits{pset.getParameter >("minNrHits")}, + minNrHitsValidLayerBins{pset.getParameter >("minNrHitsValidLayerBins")}, + matchingCuts{makeMatchingCuts(pset.getParameter >("matchingCuts"))} { + if (minNrHitsValidLayerBins.size() + 1 != minNrHits.size()) { throw cms::Exception("InvalidConfig") << " TrajSeedMatcher::TrajSeedMatcher minNrHitsValidLayerBins should be 1 less than minNrHits when its " - << minNrHitsValidLayerBins_.size() << " vs " << minNrHits_.size(); + << minNrHitsValidLayerBins.size() << " vs " << minNrHits.size(); } } +TrajSeedMatcher::TrajSeedMatcher(TrajSeedMatcher::Configuration const& cfg, + edm::EventSetup const& iSetup, + MeasurementTrackerEvent const& measTkEvt) + : cfg_{cfg}, + magField_{iSetup.getData(cfg_.magFieldToken)}, + magFieldParam_{iSetup.getData(cfg_.paramMagFieldToken)}, + measTkEvt_{measTkEvt}, + navSchool_{iSetup.getData(cfg_.navSchoolToken)}, + detLayerGeom_{iSetup.getData(cfg_.detLayerGeomToken)}, + forwardPropagator_(alongMomentum, kElectronMass_, &magField_), + backwardPropagator_(oppositeToMomentum, kElectronMass_, &magField_) {} + edm::ParameterSetDescription TrajSeedMatcher::makePSetDescription() { edm::ParameterSetDescription desc; desc.add("useRecoVertex", false); desc.add("enableHitSkipping", false); desc.add("requireExactMatchCount", true); desc.add("useParamMagFieldIfDefined", true); - desc.add("paramMagField", "ParabolicMf"); - desc.add("navSchool", "SimpleNavigationSchool"); - desc.add("detLayerGeom", "hltESPGlobalDetLayerGeometry"); + desc.add("paramMagField", edm::ESInputTag{"", "ParabolicMf"}); + desc.add("navSchool", edm::ESInputTag{"", "SimpleNavigationSchool"}); + desc.add("detLayerGeom", edm::ESInputTag{"", "hltESPGlobalDetLayerGeometry"}); desc.add >("minNrHitsValidLayerBins", {4}); desc.add >("minNrHits", {2, 3}); @@ -70,10 +92,8 @@ edm::ParameterSetDescription TrajSeedMatcher::makePSetDescription() { auto cutDescCases = 1 >> (edm::ParameterDescription("dPhiMax", 0.04, true) and edm::ParameterDescription("dRZMax", 0.09, true) and edm::ParameterDescription("dRZMaxLowEtThres", 20., true) and - edm::ParameterDescription >( - "dRZMaxLowEtEtaBins", std::vector{1., 1.5}, true) and - edm::ParameterDescription >( - "dRZMaxLowEt", std::vector{0.09, 0.15, 0.09}, true)) or + edm::ParameterDescription >("dRZMaxLowEtEtaBins", {1., 1.5}, true) and + edm::ParameterDescription >("dRZMaxLowEt", {0.09, 0.15, 0.09}, true)) or 2 >> (edm::ParameterDescription >("dPhiMaxHighEt", {0.003}, true) and edm::ParameterDescription >("dPhiMaxHighEtThres", {0.0}, true) and edm::ParameterDescription >("dPhiMaxLowEtGrad", {0.0}, true) and @@ -94,28 +114,10 @@ edm::ParameterSetDescription TrajSeedMatcher::makePSetDescription() { return desc; } -void TrajSeedMatcher::doEventSetup(const edm::EventSetup& iSetup) { - if (cacheIDMagField_ != iSetup.get().cacheIdentifier()) { - iSetup.get().get(magField_); - if (useParamMagFieldIfDefined_) - iSetup.get().get(paramMagFieldLabel_, magFieldParam_); - cacheIDMagField_ = iSetup.get().cacheIdentifier(); - forwardPropagator_ = std::make_unique(alongMomentum, kElectronMass_, &*(magField_)); - backwardPropagator_ = std::make_unique(oppositeToMomentum, kElectronMass_, &*(magField_)); - } - iSetup.get().get(navSchoolLabel_, navSchool_); - iSetup.get().get(detLayerGeomLabel_, detLayerGeom_); -} - -std::vector TrajSeedMatcher::compatibleSeeds(const TrajectorySeedCollection& seeds, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy) { - if (!forwardPropagator_ || !backwardPropagator_ || !magField_.isValid()) { - throw cms::Exception("LogicError") << __FUNCTION__ - << " can not make pixel seeds as event setup has not properly been called"; - } - +std::vector TrajSeedMatcher::operator()(const TrajectorySeedCollection& seeds, + const GlobalPoint& candPos, + const GlobalPoint& vprim, + const float energy) { clearCache(); std::vector matchedSeeds; @@ -140,7 +142,7 @@ std::vector TrajSeedMatcher::compatibleSeeds(cons int nrValidLayers = std::max(nrValidLayersNeg, nrValidLayersPos); size_t nrHitsRequired = getNrHitsRequired(nrValidLayers); bool matchCountPasses; - if (requireExactMatchCount_) { + if (cfg_.requireExactMatchCount) { // If the input seed collection is not cross-cleaned, an exact match is necessary to // prevent redundant seeds. matchCountPasses = matchedHitsNeg.size() == nrHitsRequired || matchedHitsPos.size() == nrHitsRequired; @@ -168,23 +170,23 @@ std::vector TrajSeedMatcher::processSeed(const Traj FreeTrajectoryState firstHitFreeTraj; GlobalPoint prevHitPos; GlobalPoint vertex; - for (size_t hitNr = 0; hitNr < matchingCuts_.size() && hitNr < seed.nHits(); hitNr++) { + for (size_t hitNr = 0; hitNr < cfg_.matchingCuts.size() && hitNr < seed.nHits(); hitNr++) { bool matched = false; if (matchedHits.empty()) { // First hit is special - SCHitMatch firstHit = matchFirstHit(seed, initialTrajState, vprim, *backwardPropagator_); + SCHitMatch firstHit = matchFirstHit(seed, initialTrajState, vprim, backwardPropagator_); firstHit.setExtra(candEt, candEta, candPos.phi(), charge, 1); if (passesMatchSel(firstHit, 0)) { matched = true; matchedHits.push_back(firstHit); //now we can figure out the z vertex - double zVertex = useRecoVertex_ ? vprim.z() : getZVtxFromExtrapolation(vprim, firstHit.hitPos(), candPos); + double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, firstHit.hitPos(), candPos); vertex = GlobalPoint(vprim.x(), vprim.y(), zVertex); firstHitFreeTraj = trackingTools::ftsFromVertexToPoint( getMagField(firstHit.hitPos()), firstHit.hitPos(), vertex, energy, charge); prevHitPos = firstHit.hitPos(); } } else { // All subsequent hits are handled the same - SCHitMatch hit = match2ndToNthHit(seed, firstHitFreeTraj, hitNr, prevHitPos, vertex, *forwardPropagator_); + SCHitMatch hit = match2ndToNthHit(seed, firstHitFreeTraj, hitNr, prevHitPos, vertex, forwardPropagator_); hit.setExtra(candEt, candEta, candPos.phi(), charge, 1); if (passesMatchSel(hit, matchedHits.size())) { matched = true; @@ -192,7 +194,7 @@ std::vector TrajSeedMatcher::processSeed(const Traj prevHitPos = hit.hitPos(); } } - if (!matched and !enableHitSkipping_) + if (!matched and !cfg_.enableHitSkipping) break; } return matchedHits; @@ -306,11 +308,11 @@ void TrajSeedMatcher::clearCache() { } bool TrajSeedMatcher::passesMatchSel(const TrajSeedMatcher::SCHitMatch& hit, const size_t hitNr) const { - if (hitNr < matchingCuts_.size()) { - return (*matchingCuts_[hitNr])(hit); + if (hitNr < cfg_.matchingCuts.size()) { + return (*cfg_.matchingCuts[hitNr])(hit); } else { throw cms::Exception("LogicError") << " Error, attempting to apply selection to hit " << hitNr - << " but only cuts for " << matchingCuts_.size() << " defined"; + << " but only cuts for " << cfg_.matchingCuts.size() << " defined"; } } @@ -320,23 +322,23 @@ int TrajSeedMatcher::getNrValidLayersAlongTraj(const SCHitMatch& hit1, const GlobalPoint& vprim, const float energy, const int charge) { - double zVertex = useRecoVertex_ ? vprim.z() : getZVtxFromExtrapolation(vprim, hit1.hitPos(), candPos); + double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, hit1.hitPos(), candPos); GlobalPoint vertex(vprim.x(), vprim.y(), zVertex); auto firstHitFreeTraj = trackingTools::ftsFromVertexToPoint(getMagField(hit1.hitPos()), hit1.hitPos(), vertex, energy, charge); - auto const& secondHitTraj = getTrajStateFromPoint(*hit2.hit(), firstHitFreeTraj, hit1.hitPos(), *forwardPropagator_); + auto const& secondHitTraj = getTrajStateFromPoint(*hit2.hit(), firstHitFreeTraj, hit1.hitPos(), forwardPropagator_); return getNrValidLayersAlongTraj(hit2.hit()->geographicalId(), secondHitTraj); } int TrajSeedMatcher::getNrValidLayersAlongTraj(const DetId& hitId, const TrajectoryStateOnSurface& hitTrajState) const { - const DetLayer* detLayer = detLayerGeom_->idToLayer(hitId); + const DetLayer* detLayer = detLayerGeom_.idToLayer(hitId); if (detLayer == nullptr) return 0; const FreeTrajectoryState& hitFreeState = *hitTrajState.freeState(); - auto const inLayers = navSchool_->compatibleLayers(*detLayer, hitFreeState, oppositeToMomentum); - const std::vector outLayers = navSchool_->compatibleLayers(*detLayer, hitFreeState, alongMomentum); + auto const inLayers = navSchool_.compatibleLayers(*detLayer, hitFreeState, oppositeToMomentum); + const auto outLayers = navSchool_.compatibleLayers(*detLayer, hitFreeState, alongMomentum); int nrValidLayers = 1; //because our current hit is also valid and wont be included in the count otherwise int nrPixInLayers = 0; @@ -344,14 +346,14 @@ int TrajSeedMatcher::getNrValidLayersAlongTraj(const DetId& hitId, const Traject for (auto layer : inLayers) { if (GeomDetEnumerators::isTrackerPixel(layer->subDetector())) { nrPixInLayers++; - if (layerHasValidHits(*layer, hitTrajState, *backwardPropagator_)) + if (layerHasValidHits(*layer, hitTrajState, backwardPropagator_)) nrValidLayers++; } } for (auto layer : outLayers) { if (GeomDetEnumerators::isTrackerPixel(layer->subDetector())) { nrPixOutLayers++; - if (layerHasValidHits(*layer, hitTrajState, *forwardPropagator_)) + if (layerHasValidHits(*layer, hitTrajState, forwardPropagator_)) nrValidLayers++; } } @@ -372,7 +374,7 @@ bool TrajSeedMatcher::layerHasValidHits(const DetLayer& layer, return false; else { DetId id = detWithState.front().first->geographicalId(); - MeasurementDetWithData measDet = measTkEvt_->idToDet(id); + MeasurementDetWithData measDet = measTkEvt_.idToDet(id); if (measDet.isActive()) return true; else @@ -381,11 +383,11 @@ bool TrajSeedMatcher::layerHasValidHits(const DetLayer& layer, } size_t TrajSeedMatcher::getNrHitsRequired(const int nrValidLayers) const { - for (size_t binNr = 0; binNr < minNrHitsValidLayerBins_.size(); binNr++) { - if (nrValidLayers < minNrHitsValidLayerBins_[binNr]) - return minNrHits_[binNr]; + for (size_t binNr = 0; binNr < cfg_.minNrHitsValidLayerBins.size(); binNr++) { + if (nrValidLayers < cfg_.minNrHitsValidLayerBins[binNr]) + return cfg_.minNrHits[binNr]; } - return minNrHits_.back(); + return cfg_.minNrHits.back(); } TrajSeedMatcher::SCHitMatch::SCHitMatch(const GlobalPoint& vtxPos, diff --git a/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc b/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc index a3ac2c90d9883..5c27db5c6c8f0 100644 --- a/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc +++ b/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc @@ -14,11 +14,10 @@ // //******************************************************************************* -#include "FWCore/Framework/interface/stream/EDProducer.h" +#include "FWCore/Framework/interface/global/EDProducer.h" #include "FWCore/Framework/interface/Event.h" #include "FWCore/Framework/interface/EventSetup.h" -#include "FWCore/Framework/interface/MakerMacros.h" -#include "FWCore/Framework/interface/ESHandle.h" +#include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/ParameterSet/interface/ParameterSet.h" #include "FWCore/ParameterSet/interface/ParameterSetDescription.h" #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h" @@ -26,7 +25,6 @@ #include "DataFormats/BeamSpot/interface/BeamSpot.h" #include "DataFormats/VertexReco/interface/Vertex.h" -#include "DataFormats/Common/interface/Handle.h" #include "DataFormats/EgammaReco/interface/SuperClusterFwd.h" #include "DataFormats/EgammaReco/interface/SuperCluster.h" #include "DataFormats/EgammaReco/interface/ElectronSeed.h" @@ -37,35 +35,29 @@ #include "RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h" -class ElectronNHitSeedProducer : public edm::stream::EDProducer<> { +class ElectronNHitSeedProducer : public edm::global::EDProducer<> { public: explicit ElectronNHitSeedProducer(const edm::ParameterSet&); - ~ElectronNHitSeedProducer() override = default; - void produce(edm::Event&, const edm::EventSetup&) final; + void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const final; static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); private: - TrajSeedMatcher matcher_; + const TrajSeedMatcher::Configuration matcherConfiguration_; std::vector>> superClustersTokens_; - edm::EDGetTokenT initialSeedsToken_; - edm::EDGetTokenT> verticesToken_; - edm::EDGetTokenT beamSpotToken_; - edm::EDGetTokenT measTkEvtToken_; + const edm::EDGetTokenT initialSeedsToken_; + const edm::EDGetTokenT> verticesToken_; + const edm::EDGetTokenT beamSpotToken_; + const edm::EDGetTokenT measTkEvtToken_; + const edm::EDPutTokenT putToken_; + const edm::ESGetToken trackerTopologyToken_; }; namespace { template - edm::Handle getHandle(const edm::Event& event, const edm::EDGetTokenT& token) { - edm::Handle handle; - event.getByToken(token, handle); - return handle; - } - - template - GlobalPoint convertToGP(const T& orgPoint) { + inline auto convertToGP(const T& orgPoint) { return GlobalPoint(orgPoint.x(), orgPoint.y(), orgPoint.z()); } @@ -92,56 +84,50 @@ namespace { } // namespace ElectronNHitSeedProducer::ElectronNHitSeedProducer(const edm::ParameterSet& pset) - : matcher_(pset.getParameter("matcherConfig")), + : matcherConfiguration_(pset.getParameter("matcherConfig"), consumesCollector()), initialSeedsToken_(consumes(pset.getParameter("initialSeeds"))), verticesToken_(consumes>(pset.getParameter("vertices"))), beamSpotToken_(consumes(pset.getParameter("beamSpot"))), - measTkEvtToken_(consumes(pset.getParameter("measTkEvt"))) { - const auto superClusTags = pset.getParameter>("superClusters"); - for (const auto& scTag : superClusTags) { + measTkEvtToken_(consumes(pset.getParameter("measTkEvt"))), + putToken_{produces()}, + trackerTopologyToken_{esConsumes()} { + for (const auto& scTag : pset.getParameter>("superClusters")) { superClustersTokens_.emplace_back(consumes>(scTag)); } - produces(); } void ElectronNHitSeedProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { edm::ParameterSetDescription desc; - desc.add("initialSeeds", edm::InputTag("hltElePixelSeedsCombined")); - desc.add("vertices", edm::InputTag()); - desc.add("beamSpot", edm::InputTag("hltOnlineBeamSpot")); - desc.add("measTkEvt", edm::InputTag("hltSiStripClusters")); - desc.add>("superClusters", - std::vector{edm::InputTag{"hltEgammaSuperClustersToPixelMatch"}}); + desc.add("initialSeeds", {"hltElePixelSeedsCombined"}); + desc.add("vertices", {}); + desc.add("beamSpot", {"hltOnlineBeamSpot"}); + desc.add("measTkEvt", {"hltSiStripClusters"}); + desc.add>("superClusters", {{"hltEgammaSuperClustersToPixelMatch"}}); desc.add("matcherConfig", TrajSeedMatcher::makePSetDescription()); descriptions.add("electronNHitSeedProducer", desc); } -void ElectronNHitSeedProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { - edm::ESHandle trackerTopoHandle; - iSetup.get().get(trackerTopoHandle); +void ElectronNHitSeedProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { + auto const& trackerTopology = iSetup.getData(trackerTopologyToken_); - matcher_.doEventSetup(iSetup); - matcher_.setMeasTkEvtHandle(getHandle(iEvent, measTkEvtToken_)); + TrajSeedMatcher matcher{matcherConfiguration_, iSetup, iEvent.get(measTkEvtToken_)}; - auto eleSeeds = std::make_unique(); - auto initialSeedsHandle = getHandle(iEvent, initialSeedsToken_); + reco::ElectronSeedCollection eleSeeds{}; + auto const& initialSeeds = iEvent.get(initialSeedsToken_); - auto beamSpotHandle = getHandle(iEvent, beamSpotToken_); - GlobalPoint primVtxPos = convertToGP(beamSpotHandle->position()); + auto primVtxPos = convertToGP(iEvent.get(beamSpotToken_).position()); // Loop over all super-cluster collections (typically barrel and forward are supplied separately) for (const auto& superClustersToken : superClustersTokens_) { - auto superClustersHandle = getHandle(iEvent, superClustersToken); - for (auto& superClusRef : *superClustersHandle) { + for (auto& superClusRef : iEvent.get(superClustersToken)) { //the eta of the supercluster when mustache clustered is slightly biased due to bending in magnetic field //the eta of its seed cluster is a better estimate of the orginal position GlobalPoint caloPosition(GlobalPoint::Polar(superClusRef->seed()->position().theta(), //seed theta superClusRef->position().phi(), //supercluster phi superClusRef->position().r())); //supercluster r - const std::vector matchedSeeds = - matcher_.compatibleSeeds(*initialSeedsHandle, caloPosition, primVtxPos, superClusRef->energy()); + const auto matchedSeeds = matcher(initialSeeds, caloPosition, primVtxPos, superClusRef->energy()); for (auto& matchedSeed : matchedSeeds) { reco::ElectronSeed eleSeed(matchedSeed.seed()); @@ -149,13 +135,14 @@ void ElectronNHitSeedProducer::produce(edm::Event& iEvent, const edm::EventSetup eleSeed.setCaloCluster(caloClusRef); eleSeed.setNrLayersAlongTraj(matchedSeed.nrValidLayers()); for (auto& matchInfo : matchedSeed.matches()) { - eleSeed.addHitInfo(makeSeedPixelVar(matchInfo, *trackerTopoHandle)); + eleSeed.addHitInfo(makeSeedPixelVar(matchInfo, trackerTopology)); } - eleSeeds->emplace_back(eleSeed); + eleSeeds.emplace_back(eleSeed); } } } - iEvent.put(std::move(eleSeeds)); + iEvent.emplace(putToken_, std::move(eleSeeds)); } +#include "FWCore/Framework/interface/MakerMacros.h" DEFINE_FWK_MODULE(ElectronNHitSeedProducer); From 07fd1da3c5ba76d2168e1cd450bbe2710ec89ebe Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Sat, 25 Apr 2020 19:12:07 +0200 Subject: [PATCH 2/3] HLT customization for ElectronNHitSeedProducer --- .../python/customizeHLTforCMSSW.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py index e627f103846db..e43579a57e198 100644 --- a/HLTrigger/Configuration/python/customizeHLTforCMSSW.py +++ b/HLTrigger/Configuration/python/customizeHLTforCMSSW.py @@ -164,10 +164,30 @@ def customiseFor2017DtUnpacking(process): return process +def customiseFor29512(process): + """Refresh configuration of ElectronNHitSeedProducer instances. + + Loops over some parameters of ElectronNHitSeedProducer instances and changes their type from string to ESInputTag. + + For PR https://github.com/cms-sw/cmssw/pull/29512 "ElectronNHitSeedProducer modernization" + """ + + for producer in producers_by_type(process, "ElectronNHitSeedProducer"): + matcherConfig = producer.matcherConfig + for parameter_name in ("detLayerGeom", "navSchool", "paramMagField"): + if hasattr(matcherConfig, parameter_name): + old_parameter = getattr(matcherConfig, parameter_name) + if old_parameter.pythonTypeName().endswith("string"): + old_value = old_parameter.pythonValue()[1:-1] + setattr(matcherConfig, parameter_name, cms.ESInputTag("", old_value)) + + return process + # CMSSW version specific customizations def customizeHLTforCMSSW(process, menuType="GRun"): # add call to action function in proper order: newest last! # process = customiseFor12718(process) + process = customiseFor29512(process) return process From d28cda9c3bb65ac0aa1d7d82de067fea672ec9aa Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Mon, 27 Apr 2020 12:51:33 +0200 Subject: [PATCH 3/3] SCHitMatch is now just const struct --- .../interface/TrajSeedMatcher.h | 68 ++------ .../src/TrajSeedMatcher.cc | 162 +++++++----------- 2 files changed, 74 insertions(+), 156 deletions(-) diff --git a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h index 67b8c4cfdaf48..82116fb9b1b6a 100644 --- a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h +++ b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h @@ -51,46 +51,17 @@ class TrackingRecHit; class TrajSeedMatcher { public: - class SCHitMatch { - public: - SCHitMatch() {} - - //does not set charge,et,nrclus - SCHitMatch(const GlobalPoint& vtxPos, const TrajectoryStateOnSurface& trajState, const TrackingRecHit& hit); - ~SCHitMatch() = default; - - void setExtra(float et, float eta, float phi, int charge, int nrClus) { - et_ = et; - eta_ = eta; - phi_ = phi; - charge_ = charge; - nrClus_ = nrClus; - } - - int subdetId() const { return detId_.subdetId(); } - DetId detId() const { return detId_; } - float dRZ() const { return dRZ_; } - float dPhi() const { return dPhi_; } - const GlobalPoint& hitPos() const { return hitPos_; } - float et() const { return et_; } - float eta() const { return eta_; } - float phi() const { return phi_; } - int charge() const { return charge_; } - int nrClus() const { return nrClus_; } - const TrackingRecHit* hit() const { return hit_; } - - private: - DetId detId_ = 0; - GlobalPoint hitPos_; - float dRZ_ = std::numeric_limits::max(); - float dPhi_ = std::numeric_limits::max(); - const TrackingRecHit* hit_ = nullptr; //we do not own this - //extra quanities which are set later - float et_ = 0.f; - float eta_ = 0.f; - float phi_ = 0.f; - int charge_ = 0; - int nrClus_ = 0; + struct SCHitMatch { + const DetId detId = 0; + const GlobalPoint hitPos; + const float dRZ = std::numeric_limits::max(); + const float dPhi = std::numeric_limits::max(); + const TrackingRecHit& hit; + const float et = 0.f; + const float eta = 0.f; + const float phi = 0.f; + const int charge = 0; + const int nrClus = 0; }; struct MatchInfo { @@ -186,7 +157,7 @@ class TrajSeedMatcher { const bool requireExactMatchCount; const bool useParamMagFieldIfDefined; - //these two varibles determine how hits we require + //these two variables determine how hits we require //based on how many valid layers we had //right now we always need atleast two hits //also highly dependent on the seeds you pass in @@ -220,20 +191,6 @@ class TrajSeedMatcher { const GlobalPoint& hitPos, const GlobalPoint& candPos); - bool passTrajPreSel(const GlobalPoint& hitPos, const GlobalPoint& candPos) const; - - TrajSeedMatcher::SCHitMatch matchFirstHit(const TrajectorySeed& seed, - const TrajectoryStateOnSurface& trajState, - const GlobalPoint& vtxPos, - const PropagatorWithMaterial& propagator); - - TrajSeedMatcher::SCHitMatch match2ndToNthHit(const TrajectorySeed& seed, - const FreeTrajectoryState& trajState, - const size_t hitNr, - const GlobalPoint& prevHitPos, - const GlobalPoint& vtxPos, - const PropagatorWithMaterial& propagator); - const TrajectoryStateOnSurface& getTrajStateFromVtx(const TrackingRecHit& hit, const TrajectoryStateOnSurface& initialState, const PropagatorWithMaterial& propagator); @@ -274,7 +231,6 @@ class TrajSeedMatcher { private: static constexpr float kElectronMass_ = 0.000511; - static constexpr float kPhiCut_ = -0.801144; //cos(2.5) Configuration const& cfg_; diff --git a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc index 5642ed9fe25bf..483376597b656 100644 --- a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc +++ b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc @@ -40,6 +40,19 @@ namespace { return matchingCuts; } + + TrajSeedMatcher::SCHitMatch makeSCHitMatch(const GlobalPoint& vtxPos, + const TrajectoryStateOnSurface& trajState, + const TrackingRecHit& hit, + float et, + float eta, + float phi, + int charge, + int nrClus) { + EleRelPointPair pointPair(hit.globalPosition(), trajState.globalParameters().position(), vtxPos); + float dRZ = hit.geographicalId().subdetId() == PixelSubdetector::PixelBarrel ? pointPair.dZ() : pointPair.dPerp(); + return {hit.geographicalId(), hit.globalPosition(), dRZ, pointPair.dPhi(), hit, et, eta, phi, charge, nrClus}; + } }; // namespace TrajSeedMatcher::Configuration::Configuration(const edm::ParameterSet& pset, edm::ConsumesCollector&& cc) @@ -167,35 +180,43 @@ std::vector TrajSeedMatcher::processSeed(const Traj const int charge = initialTrajState.charge(); std::vector matchedHits; - FreeTrajectoryState firstHitFreeTraj; + FreeTrajectoryState firstMatchFreeTraj; GlobalPoint prevHitPos; GlobalPoint vertex; for (size_t hitNr = 0; hitNr < cfg_.matchingCuts.size() && hitNr < seed.nHits(); hitNr++) { - bool matched = false; - if (matchedHits.empty()) { // First hit is special - SCHitMatch firstHit = matchFirstHit(seed, initialTrajState, vprim, backwardPropagator_); - firstHit.setExtra(candEt, candEta, candPos.phi(), charge, 1); - if (passesMatchSel(firstHit, 0)) { - matched = true; - matchedHits.push_back(firstHit); + if (!cfg_.enableHitSkipping && hitNr > 0 && matchedHits.empty()) { + break; + } + + auto const& recHit = *(seed.recHits().first + hitNr); + + if (!recHit.isValid()) { + continue; + } + + const bool doFirstMatch = matchedHits.empty(); + + auto const& trajState = doFirstMatch + ? getTrajStateFromVtx(recHit, initialTrajState, backwardPropagator_) + : getTrajStateFromPoint(recHit, firstMatchFreeTraj, prevHitPos, forwardPropagator_); + if (!trajState.isValid()) { + continue; + } + + auto const& vtxForMatchObject = doFirstMatch ? vprim : vertex; + auto match = makeSCHitMatch(vtxForMatchObject, trajState, recHit, candEt, candEta, candPos.phi(), charge, 1); + + if (passesMatchSel(match, matchedHits.size())) { + matchedHits.push_back(match); + if (doFirstMatch) { //now we can figure out the z vertex - double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, firstHit.hitPos(), candPos); + double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, match.hitPos, candPos); vertex = GlobalPoint(vprim.x(), vprim.y(), zVertex); - firstHitFreeTraj = trackingTools::ftsFromVertexToPoint( - getMagField(firstHit.hitPos()), firstHit.hitPos(), vertex, energy, charge); - prevHitPos = firstHit.hitPos(); - } - } else { // All subsequent hits are handled the same - SCHitMatch hit = match2ndToNthHit(seed, firstHitFreeTraj, hitNr, prevHitPos, vertex, forwardPropagator_); - hit.setExtra(candEt, candEta, candPos.phi(), charge, 1); - if (passesMatchSel(hit, matchedHits.size())) { - matched = true; - matchedHits.push_back(hit); - prevHitPos = hit.hitPos(); + firstMatchFreeTraj = + trackingTools::ftsFromVertexToPoint(getMagField(match.hitPos), match.hitPos, vertex, energy, charge); } + prevHitPos = match.hitPos; } - if (!matched and !cfg_.enableHitSkipping) - break; } return matchedHits; } @@ -213,15 +234,6 @@ float TrajSeedMatcher::getZVtxFromExtrapolation(const GlobalPoint& primeVtxPos, return hitPos.z() - r1Diff * (candPos.z() - hitPos.z()) / r2Diff; } -bool TrajSeedMatcher::passTrajPreSel(const GlobalPoint& hitPos, const GlobalPoint& candPos) const { - float dt = hitPos.x() * candPos.x() + hitPos.y() * candPos.y(); - if (dt < 0) - return false; - if (dt < kPhiCut_ * (candPos.perp() * hitPos.perp())) - return false; - return true; -} - const TrajectoryStateOnSurface& TrajSeedMatcher::getTrajStateFromVtx(const TrackingRecHit& hit, const TrajectoryStateOnSurface& initialState, const PropagatorWithMaterial& propagator) { @@ -266,40 +278,6 @@ TrajectoryStateOnSurface TrajSeedMatcher::makeTrajStateOnSurface(const GlobalPoi return TrajectoryStateOnSurface(freeTS, *bpb(freeTS.position(), freeTS.momentum())); } -TrajSeedMatcher::SCHitMatch TrajSeedMatcher::matchFirstHit(const TrajectorySeed& seed, - const TrajectoryStateOnSurface& initialState, - const GlobalPoint& vtxPos, - const PropagatorWithMaterial& propagator) { - const TrajectorySeed::range& hits = seed.recHits(); - auto hitIt = hits.first; - - if (hitIt->isValid()) { - const TrajectoryStateOnSurface& trajStateFromVtx = getTrajStateFromVtx(*hitIt, initialState, propagator); - if (trajStateFromVtx.isValid()) - return SCHitMatch(vtxPos, trajStateFromVtx, *hitIt); - } - return SCHitMatch(); -} - -TrajSeedMatcher::SCHitMatch TrajSeedMatcher::match2ndToNthHit(const TrajectorySeed& seed, - const FreeTrajectoryState& initialState, - const size_t hitNr, - const GlobalPoint& prevHitPos, - const GlobalPoint& vtxPos, - const PropagatorWithMaterial& propagator) { - const TrajectorySeed::range& hits = seed.recHits(); - auto hitIt = hits.first + hitNr; - - if (hitIt->isValid()) { - const TrajectoryStateOnSurface& trajState = getTrajStateFromPoint(*hitIt, initialState, prevHitPos, propagator); - - if (trajState.isValid()) { - return SCHitMatch(vtxPos, trajState, *hitIt); - } - } - return SCHitMatch(); -} - void TrajSeedMatcher::clearCache() { trajStateFromVtxPosChargeCache_.clear(); trajStateFromVtxNegChargeCache_.clear(); @@ -322,13 +300,13 @@ int TrajSeedMatcher::getNrValidLayersAlongTraj(const SCHitMatch& hit1, const GlobalPoint& vprim, const float energy, const int charge) { - double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, hit1.hitPos(), candPos); + double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, hit1.hitPos, candPos); GlobalPoint vertex(vprim.x(), vprim.y(), zVertex); - auto firstHitFreeTraj = - trackingTools::ftsFromVertexToPoint(getMagField(hit1.hitPos()), hit1.hitPos(), vertex, energy, charge); - auto const& secondHitTraj = getTrajStateFromPoint(*hit2.hit(), firstHitFreeTraj, hit1.hitPos(), forwardPropagator_); - return getNrValidLayersAlongTraj(hit2.hit()->geographicalId(), secondHitTraj); + auto firstMatchFreeTraj = + trackingTools::ftsFromVertexToPoint(getMagField(hit1.hitPos), hit1.hitPos, vertex, energy, charge); + auto const& secondHitTraj = getTrajStateFromPoint(hit2.hit, firstMatchFreeTraj, hit1.hitPos, forwardPropagator_); + return getNrValidLayersAlongTraj(hit2.hit.geographicalId(), secondHitTraj); } int TrajSeedMatcher::getNrValidLayersAlongTraj(const DetId& hitId, const TrajectoryStateOnSurface& hitTrajState) const { @@ -390,22 +368,6 @@ size_t TrajSeedMatcher::getNrHitsRequired(const int nrValidLayers) const { return cfg_.minNrHits.back(); } -TrajSeedMatcher::SCHitMatch::SCHitMatch(const GlobalPoint& vtxPos, - const TrajectoryStateOnSurface& trajState, - const TrackingRecHit& hit) - : detId_(hit.geographicalId()), - hitPos_(hit.globalPosition()), - hit_(&hit), - et_(0), - eta_(0), - phi_(0), - charge_(0), - nrClus_(0) { - EleRelPointPair pointPair(hitPos_, trajState.globalParameters().position(), vtxPos); - dRZ_ = detId_.subdetId() == PixelSubdetector::PixelBarrel ? pointPair.dZ() : pointPair.dPerp(); - dPhi_ = pointPair.dPhi(); -} - TrajSeedMatcher::SeedWithInfo::SeedWithInfo(const TrajectorySeed& seed, const std::vector& posCharge, const std::vector& negCharge, @@ -413,13 +375,13 @@ TrajSeedMatcher::SeedWithInfo::SeedWithInfo(const TrajectorySeed& seed, : seed_(seed), nrValidLayers_(nrValidLayers) { size_t nrHitsMax = std::max(posCharge.size(), negCharge.size()); for (size_t hitNr = 0; hitNr < nrHitsMax; hitNr++) { - DetId detIdPos = hitNr < posCharge.size() ? posCharge[hitNr].detId() : DetId(0); - float dRZPos = hitNr < posCharge.size() ? posCharge[hitNr].dRZ() : std::numeric_limits::max(); - float dPhiPos = hitNr < posCharge.size() ? posCharge[hitNr].dPhi() : std::numeric_limits::max(); + DetId detIdPos = hitNr < posCharge.size() ? posCharge[hitNr].detId : DetId(0); + float dRZPos = hitNr < posCharge.size() ? posCharge[hitNr].dRZ : std::numeric_limits::max(); + float dPhiPos = hitNr < posCharge.size() ? posCharge[hitNr].dPhi : std::numeric_limits::max(); - DetId detIdNeg = hitNr < negCharge.size() ? negCharge[hitNr].detId() : DetId(0); - float dRZNeg = hitNr < negCharge.size() ? negCharge[hitNr].dRZ() : std::numeric_limits::max(); - float dPhiNeg = hitNr < negCharge.size() ? negCharge[hitNr].dPhi() : std::numeric_limits::max(); + DetId detIdNeg = hitNr < negCharge.size() ? negCharge[hitNr].detId : DetId(0); + float dRZNeg = hitNr < negCharge.size() ? negCharge[hitNr].dRZ : std::numeric_limits::max(); + float dPhiNeg = hitNr < negCharge.size() ? negCharge[hitNr].dPhi : std::numeric_limits::max(); if (detIdPos != detIdNeg && (detIdPos.rawId() != 0 && detIdNeg.rawId() != 0)) { cms::Exception("LogicError") @@ -444,11 +406,11 @@ TrajSeedMatcher::MatchingCutsV1::MatchingCutsV1(const edm::ParameterSet& pset) } bool TrajSeedMatcher::MatchingCutsV1::operator()(const TrajSeedMatcher::SCHitMatch& scHitMatch) const { - if (dPhiMax_ >= 0 && std::abs(scHitMatch.dPhi()) > dPhiMax_) + if (dPhiMax_ >= 0 && std::abs(scHitMatch.dPhi) > dPhiMax_) return false; - const float dRZMax = getDRZCutValue(scHitMatch.et(), scHitMatch.eta()); - if (dRZMax_ >= 0 && std::abs(scHitMatch.dRZ()) > dRZMax) + const float dRZMax = getDRZCutValue(scHitMatch.et, scHitMatch.eta); + if (dRZMax_ >= 0 && std::abs(scHitMatch.dRZ) > dRZMax) return false; return true; @@ -491,12 +453,12 @@ TrajSeedMatcher::MatchingCutsV2::MatchingCutsV2(const edm::ParameterSet& pset) } bool TrajSeedMatcher::MatchingCutsV2::operator()(const TrajSeedMatcher::SCHitMatch& scHitMatch) const { - size_t binNr = getBinNr(scHitMatch.eta()); - float dPhiMax = getCutValue(scHitMatch.et(), dPhiHighEt_[binNr], dPhiHighEtThres_[binNr], dPhiLowEtGrad_[binNr]); - if (dPhiMax >= 0 && std::abs(scHitMatch.dPhi()) > dPhiMax) + size_t binNr = getBinNr(scHitMatch.eta); + float dPhiMax = getCutValue(scHitMatch.et, dPhiHighEt_[binNr], dPhiHighEtThres_[binNr], dPhiLowEtGrad_[binNr]); + if (dPhiMax >= 0 && std::abs(scHitMatch.dPhi) > dPhiMax) return false; - float dRZMax = getCutValue(scHitMatch.et(), dRZHighEt_[binNr], dRZHighEtThres_[binNr], dRZLowEtGrad_[binNr]); - if (dRZMax >= 0 && std::abs(scHitMatch.dRZ()) > dRZMax) + float dRZMax = getCutValue(scHitMatch.et, dRZHighEt_[binNr], dRZHighEtThres_[binNr], dRZLowEtGrad_[binNr]); + if (dRZMax >= 0 && std::abs(scHitMatch.dRZ) > dRZMax) return false; return true;