From 971cbef1084c21141ea88cff983aa6dd25033104 Mon Sep 17 00:00:00 2001 From: Jonas Rembser Date: Mon, 4 May 2020 19:31:44 +0200 Subject: [PATCH] continue electron seeding refactor --- .../interface/ElectronSeedGenerator.h | 3 +- .../interface/PixelHitMatcher.h | 11 +- .../interface/TrajSeedMatcher.h | 83 ++++------- .../src/ElectronSeedGenerator.cc | 69 +++------ .../src/PixelHitMatcher.cc | 28 ++-- .../src/TrajSeedMatcher.cc | 140 ++++++++---------- .../plugins/ElectronNHitSeedProducer.cc | 24 ++- .../plugins/ElectronSeedProducer.cc | 2 - 8 files changed, 134 insertions(+), 226 deletions(-) diff --git a/RecoEgamma/EgammaElectronAlgos/interface/ElectronSeedGenerator.h b/RecoEgamma/EgammaElectronAlgos/interface/ElectronSeedGenerator.h index 7e833c597f029..7b624bb83c7ed 100644 --- a/RecoEgamma/EgammaElectronAlgos/interface/ElectronSeedGenerator.h +++ b/RecoEgamma/EgammaElectronAlgos/interface/ElectronSeedGenerator.h @@ -103,8 +103,7 @@ class ElectronSeedGenerator { const float phiMax2B_; const float phiMax2F_; - PixelHitMatcher electronMatcher_; - PixelHitMatcher positronMatcher_; + PixelHitMatcher matcher_; }; #endif // ElectronSeedGenerator_H diff --git a/RecoEgamma/EgammaElectronAlgos/interface/PixelHitMatcher.h b/RecoEgamma/EgammaElectronAlgos/interface/PixelHitMatcher.h index 0c6c068342a57..3a7d849550eb8 100644 --- a/RecoEgamma/EgammaElectronAlgos/interface/PixelHitMatcher.h +++ b/RecoEgamma/EgammaElectronAlgos/interface/PixelHitMatcher.h @@ -49,11 +49,8 @@ class PixelHitMatcher { float phi2maxB, float phi2minF, float phi2maxF, - float z2minB, float z2maxB, - float r2minF, float r2maxF, - float rMinI, float rMaxI, bool useRecoVertex); @@ -71,7 +68,7 @@ class PixelHitMatcher { private: struct BarrelMeasurementEstimator { - bool operator()(const GlobalPoint& vprim, const TrajectoryStateOnSurface& ts, const GlobalPoint& gp) const; + bool operator()(const GlobalPoint& vprim, const TrajectoryStateOnSurface&, const GlobalPoint&, int charge) const; float thePhiMin; float thePhiMax; @@ -80,7 +77,7 @@ class PixelHitMatcher { }; struct ForwardMeasurementEstimator { - bool operator()(const GlobalPoint& vprim, const TrajectoryStateOnSurface& ts, const GlobalPoint& gp) const; + bool operator()(const GlobalPoint& vprim, const TrajectoryStateOnSurface&, const GlobalPoint&, int charge) const; float thePhiMin; float thePhiMax; @@ -94,8 +91,8 @@ class PixelHitMatcher { BarrelMeasurementEstimator meas2ndBLayer; ForwardMeasurementEstimator meas1stFLayer; ForwardMeasurementEstimator meas2ndFLayer; - std::unique_ptr prop1stLayer; - std::unique_ptr prop2ndLayer; + std::unique_ptr prop1stLayer = nullptr; + std::unique_ptr prop2ndLayer = nullptr; const MagneticField* theMagField; const TrackerGeometry* theTrackerGeometry; const bool useRecoVertex_; diff --git a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h index 82116fb9b1b6a..97f10da2ab274 100644 --- a/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h +++ b/RecoEgamma/EgammaElectronAlgos/interface/TrajSeedMatcher.h @@ -25,6 +25,7 @@ #include "MagneticField/Engine/interface/MagneticField.h" #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h" +#include "DataFormats/Math/interface/Point3D.h" #include "DataFormats/GeometryVector/interface/GlobalPoint.h" #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h" #include "DataFormats/DetId/interface/DetId.h" @@ -37,6 +38,7 @@ #include "RecoTracker/Record/interface/NavigationSchoolRecord.h" #include "TrackingTools/RecoGeometry/interface/RecoGeometryRecord.h" +#include "TrackingTools/TrajectoryState/interface/ftsFromVertexToPoint.h" namespace edm { class ConsumesCollector; @@ -65,42 +67,17 @@ class TrajSeedMatcher { }; struct MatchInfo { - public: - DetId detId; - float dRZPos, dRZNeg; - float dPhiPos, dPhiNeg; - - MatchInfo(const DetId& iDetId, float iDRZPos, float iDRZNeg, float iDPhiPos, float iDPhiNeg) - : detId(iDetId), dRZPos(iDRZPos), dRZNeg(iDRZNeg), dPhiPos(iDPhiPos), dPhiNeg(iDPhiNeg) {} + const DetId detId; + const float dRZPos; + const float dRZNeg; + const float dPhiPos; + const float dPhiNeg; }; - class SeedWithInfo { - public: - SeedWithInfo(const TrajectorySeed& seed, - const std::vector& posCharge, - const std::vector& negCharge, - int nrValidLayers); - ~SeedWithInfo() = default; - - const TrajectorySeed& seed() const { return seed_; } - float dRZPos(size_t hitNr) const { return getVal(hitNr, &MatchInfo::dRZPos); } - float dRZNeg(size_t hitNr) const { return getVal(hitNr, &MatchInfo::dRZNeg); } - float dPhiPos(size_t hitNr) const { return getVal(hitNr, &MatchInfo::dPhiPos); } - float dPhiNeg(size_t hitNr) const { return getVal(hitNr, &MatchInfo::dPhiNeg); } - DetId detId(size_t hitNr) const { return hitNr < matchInfo_.size() ? matchInfo_[hitNr].detId : DetId(0); } - size_t nrMatchedHits() const { return matchInfo_.size(); } - const std::vector& matches() const { return matchInfo_; } - int nrValidLayers() const { return nrValidLayers_; } - - private: - float getVal(size_t hitNr, float MatchInfo::*val) const { - return hitNr < matchInfo_.size() ? matchInfo_[hitNr].*val : std::numeric_limits::max(); - } - - private: - const TrajectorySeed& seed_; - std::vector matchInfo_; - int nrValidLayers_; + struct SeedWithInfo { + const TrajectorySeed& seed; + const std::vector matchInfos; + const int nrValidLayers; }; class MatchingCuts { @@ -168,22 +145,20 @@ class TrajSeedMatcher { const std::vector > matchingCuts; }; - explicit TrajSeedMatcher(Configuration const& cfg, + explicit TrajSeedMatcher(TrajectorySeedCollection const& seeds, + math::XYZPoint const& vprim, + Configuration const& cfg, edm::EventSetup const& iSetup, MeasurementTrackerEvent const& measTkEvt); ~TrajSeedMatcher() = default; static edm::ParameterSetDescription makePSetDescription(); - std::vector operator()(const TrajectorySeedCollection& seeds, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy); + std::vector operator()(const GlobalPoint& candPos, const float energy); private: std::vector processSeed(const TrajectorySeed& seed, const GlobalPoint& candPos, - const GlobalPoint& vprim, const float energy, const TrajectoryStateOnSurface& initialTrajState); @@ -200,20 +175,11 @@ class TrajSeedMatcher { const GlobalPoint& point, const PropagatorWithMaterial& propagator); - TrajectoryStateOnSurface makeTrajStateOnSurface(const GlobalPoint& pos, - const GlobalPoint& vtx, - const float energy, - const int charge) const; + TrajectoryStateOnSurface makeTrajStateOnSurface(const GlobalPoint& pos, const float energy, const int charge) const; void clearCache(); - bool passesMatchSel(const SCHitMatch& hit, const size_t hitNr) const; - - int getNrValidLayersAlongTraj(const SCHitMatch& hit1, - const SCHitMatch& hit2, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy, - const int charge); + int getNrValidLayersAlongTraj( + const SCHitMatch& hit1, const SCHitMatch& hit2, const GlobalPoint& candPos, const float energy, const int charge); int getNrValidLayersAlongTraj(const DetId& hitId, const TrajectoryStateOnSurface& hitTrajState) const; @@ -223,15 +189,20 @@ class TrajSeedMatcher { size_t getNrHitsRequired(const int nrValidLayers) const; - //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 cfg_.useParamMagFieldIfDefined && magFieldParam_.isDefined(point) ? magFieldParam_ : magField_; + inline auto ftsFromVertexToPoint(GlobalPoint const& point, GlobalPoint const& vertex, float energy, int charge) const { + //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 + bool useMagFieldParam = cfg_.useParamMagFieldIfDefined && magFieldParam_.isDefined(point); + auto const& magneticField = useMagFieldParam ? magFieldParam_ : magField_; + return trackingTools::ftsFromVertexToPoint(magneticField, point, vertex, energy, charge); } private: static constexpr float kElectronMass_ = 0.000511; + TrajectorySeedCollection const& seeds_; + const GlobalPoint vprim_; + Configuration const& cfg_; MagneticField const& magField_; diff --git a/RecoEgamma/EgammaElectronAlgos/src/ElectronSeedGenerator.cc b/RecoEgamma/EgammaElectronAlgos/src/ElectronSeedGenerator.cc index 6e97e20c4e6ee..8c9f8cd824889 100644 --- a/RecoEgamma/EgammaElectronAlgos/src/ElectronSeedGenerator.cc +++ b/RecoEgamma/EgammaElectronAlgos/src/ElectronSeedGenerator.cc @@ -152,32 +152,16 @@ ElectronSeedGenerator::ElectronSeedGenerator(const edm::ParameterSet &pset, cons phiMin2F_(-pset.getParameter("PhiMax2F")), phiMax2B_(pset.getParameter("PhiMax2B")), phiMax2F_(pset.getParameter("PhiMax2F")), - electronMatcher_(pset.getParameter("ePhiMin1"), - pset.getParameter("ePhiMax1"), - phiMin2B_, - phiMax2B_, - phiMin2F_, - phiMax2F_, - -pset.getParameter("z2MaxB"), - pset.getParameter("z2MaxB"), - -pset.getParameter("r2MaxF"), - pset.getParameter("r2MaxF"), - -pset.getParameter("rMaxI"), - pset.getParameter("rMaxI"), - useRecoVertex_), - positronMatcher_(pset.getParameter("pPhiMin1"), - pset.getParameter("pPhiMax1"), - phiMin2B_, - phiMax2B_, - phiMin2F_, - phiMax2F_, - -pset.getParameter("z2MaxB"), - pset.getParameter("z2MaxB"), - -pset.getParameter("r2MaxF"), - pset.getParameter("r2MaxF"), - -pset.getParameter("rMaxI"), - pset.getParameter("rMaxI"), - useRecoVertex_) {} + matcher_(pset.getParameter("ePhiMin1"), + pset.getParameter("ePhiMax1"), + phiMin2B_, + phiMax2B_, + phiMin2F_, + phiMax2F_, + pset.getParameter("z2MaxB"), + pset.getParameter("r2MaxF"), + pset.getParameter("rMaxI"), + useRecoVertex_) {} void ElectronSeedGenerator::setupES(const edm::EventSetup &setup) { // get records if necessary (called once per event) @@ -197,8 +181,7 @@ void ElectronSeedGenerator::setupES(const edm::EventSetup &setup) { } if (tochange) { - electronMatcher_.setES(magField_.product(), trackerGeometry_.product()); - positronMatcher_.setES(magField_.product(), trackerGeometry_.product()); + matcher_.setES(magField_.product(), trackerGeometry_.product()); } } @@ -248,20 +231,8 @@ void ElectronSeedGenerator::seedsFromThisCluster(edm::Ref= rMax) | (rDiff <= rMin)) return false; - float phiDiff = normalizedPhi(gp.barePhi() - ts.barePhi()); + float phiDiff = -charge * normalizedPhi(gp.barePhi() - ts.barePhi()); return (phiDiff < thePhiMax) & (phiDiff > thePhiMin); } bool PixelHitMatcher::BarrelMeasurementEstimator::operator()(const GlobalPoint &vprim, const TrajectoryStateOnSurface &absolute_ts, - const GlobalPoint &absolute_gp) const { + const GlobalPoint &absolute_gp, + int charge) const { GlobalVector ts = absolute_ts.globalParameters().position() - vprim; GlobalVector gp = absolute_gp - vprim; @@ -53,7 +55,7 @@ bool PixelHitMatcher::BarrelMeasurementEstimator::operator()(const GlobalPoint & if ((zDiff >= myZmax) | (zDiff <= myZmin)) return false; - float phiDiff = normalizedPhi(gp.barePhi() - ts.barePhi()); + float phiDiff = -charge * normalizedPhi(gp.barePhi() - ts.barePhi()); return (phiDiff < thePhiMax) & (phiDiff > thePhiMin); } @@ -64,20 +66,15 @@ PixelHitMatcher::PixelHitMatcher(float phi1min, float phi2maxB, float phi2minF, float phi2maxF, - float z2minB, float z2maxB, - float r2minF, float r2maxF, - float rMinI, float rMaxI, bool useRecoVertex) : //zmin1 and zmax1 are dummy at this moment, set from beamspot later meas1stBLayer{phi1min, phi1max, 0., 0.}, - meas2ndBLayer{phi2minB, phi2maxB, z2minB, z2maxB}, - meas1stFLayer{phi1min, phi1max, 0., 0., rMinI, rMaxI}, - meas2ndFLayer{phi2minF, phi2maxF, r2minF, r2maxF, rMinI, rMaxI}, - prop1stLayer(nullptr), - prop2ndLayer(nullptr), + meas2ndBLayer{phi2minB, phi2maxB, -z2maxB, z2maxB}, + meas1stFLayer{phi1min, phi1max, 0., 0., -rMaxI, rMaxI}, + meas2ndFLayer{phi2minF, phi2maxF, -r2maxF, r2maxF, -rMaxI, rMaxI}, useRecoVertex_(useRecoVertex) {} void PixelHitMatcher::set1stLayer(float dummyphi1min, float dummyphi1max) { @@ -183,7 +180,8 @@ std::vector PixelHitMatcher::operator()(const std::vectorisValid()) continue; - bool est = id1.subdetId() % 2 ? meas1stBLayer(vprim, *tsos1, hit1Pos) : meas1stFLayer(vprim, *tsos1, hit1Pos); + bool est = id1.subdetId() % 2 ? meas1stBLayer(vprim, *tsos1, hit1Pos, charge) + : meas1stFLayer(vprim, *tsos1, hit1Pos, charge); if (!est) continue; EleRelPointPair pp1(hit1Pos, tsos1->globalParameters().position(), vprim); @@ -229,8 +227,8 @@ std::vector PixelHitMatcher::operator()(const std::vectorisValid()) continue; const GlobalPoint &hit2Pos = hitGpMap[idx2]; - bool est2 = - id2.subdetId() % 2 ? meas2ndBLayer(vertex, *tsos2, hit2Pos) : meas2ndFLayer(vertex, *tsos2, hit2Pos); + bool est2 = id2.subdetId() % 2 ? meas2ndBLayer(vertex, *tsos2, hit2Pos, charge) + : meas2ndFLayer(vertex, *tsos2, hit2Pos, charge); if (est2) { EleRelPointPair pp2(hit2Pos, tsos2->globalParameters().position(), vertex); const int subDet2 = id2.subdetId(); diff --git a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc index 483376597b656..a8bf55b4986a7 100644 --- a/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc +++ b/RecoEgamma/EgammaElectronAlgos/src/TrajSeedMatcher.cc @@ -53,6 +53,31 @@ namespace { 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}; } + + const std::vector makeMatchInfoVector( + std::vector const& posCharge, + std::vector const& negCharge) { + std::vector matchInfos; + 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 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") << " error in " << __FILE__ << ", " << __LINE__ + << " hits to be combined have different detIDs, this should not be possible and " + "nothing good will come of it"; + } + DetId detId = detIdPos.rawId() != 0 ? detIdPos : detIdNeg; + matchInfos.push_back({detId, dRZPos, dRZNeg, dPhiPos, dPhiNeg}); + } + return matchInfos; + } }; // namespace TrajSeedMatcher::Configuration::Configuration(const edm::ParameterSet& pset, edm::ConsumesCollector&& cc) @@ -77,10 +102,14 @@ TrajSeedMatcher::Configuration::Configuration(const edm::ParameterSet& pset, edm } } -TrajSeedMatcher::TrajSeedMatcher(TrajSeedMatcher::Configuration const& cfg, +TrajSeedMatcher::TrajSeedMatcher(TrajectorySeedCollection const& seeds, + math::XYZPoint const& vprim, + TrajSeedMatcher::Configuration const& cfg, edm::EventSetup const& iSetup, MeasurementTrackerEvent const& measTkEvt) - : cfg_{cfg}, + : seeds_{seeds}, + vprim_(vprim.x(), vprim.y(), vprim.z()), + cfg_{cfg}, magField_{iSetup.getData(cfg_.magFieldToken)}, magFieldParam_{iSetup.getData(cfg_.paramMagFieldToken)}, measTkEvt_{measTkEvt}, @@ -127,29 +156,26 @@ edm::ParameterSetDescription TrajSeedMatcher::makePSetDescription() { return desc; } -std::vector TrajSeedMatcher::operator()(const TrajectorySeedCollection& seeds, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy) { +std::vector TrajSeedMatcher::operator()(const GlobalPoint& candPos, const float energy) { clearCache(); std::vector matchedSeeds; //these are super expensive functions - TrajectoryStateOnSurface scTrajStateOnSurfNeg = makeTrajStateOnSurface(candPos, vprim, energy, -1); - TrajectoryStateOnSurface scTrajStateOnSurfPos = makeTrajStateOnSurface(candPos, vprim, energy, 1); + TrajectoryStateOnSurface scTrajStateOnSurfNeg = makeTrajStateOnSurface(candPos, energy, -1); + TrajectoryStateOnSurface scTrajStateOnSurfPos = makeTrajStateOnSurface(candPos, energy, 1); - for (const auto& seed : seeds) { - std::vector matchedHitsNeg = processSeed(seed, candPos, vprim, energy, scTrajStateOnSurfNeg); - std::vector matchedHitsPos = processSeed(seed, candPos, vprim, energy, scTrajStateOnSurfPos); + for (const auto& seed : seeds_) { + std::vector matchedHitsNeg = processSeed(seed, candPos, energy, scTrajStateOnSurfNeg); + std::vector matchedHitsPos = processSeed(seed, candPos, energy, scTrajStateOnSurfPos); int nrValidLayersPos = 0; int nrValidLayersNeg = 0; if (matchedHitsNeg.size() >= 2) { - nrValidLayersNeg = getNrValidLayersAlongTraj(matchedHitsNeg[0], matchedHitsNeg[1], candPos, vprim, energy, -1); + nrValidLayersNeg = getNrValidLayersAlongTraj(matchedHitsNeg[0], matchedHitsNeg[1], candPos, energy, -1); } if (matchedHitsPos.size() >= 2) { - nrValidLayersPos = getNrValidLayersAlongTraj(matchedHitsPos[0], matchedHitsPos[1], candPos, vprim, energy, +1); + nrValidLayersPos = getNrValidLayersAlongTraj(matchedHitsPos[0], matchedHitsPos[1], candPos, energy, +1); } int nrValidLayers = std::max(nrValidLayersNeg, nrValidLayersPos); @@ -163,7 +189,7 @@ std::vector TrajSeedMatcher::operator()(const Tra matchCountPasses = matchedHitsNeg.size() >= nrHitsRequired || matchedHitsPos.size() >= nrHitsRequired; } if (matchCountPasses) { - matchedSeeds.push_back({seed, matchedHitsPos, matchedHitsNeg, nrValidLayers}); + matchedSeeds.push_back({seed, makeMatchInfoVector(matchedHitsPos, matchedHitsNeg), nrValidLayers}); } } return matchedSeeds; @@ -171,7 +197,6 @@ std::vector TrajSeedMatcher::operator()(const Tra std::vector TrajSeedMatcher::processSeed(const TrajectorySeed& seed, const GlobalPoint& candPos, - const GlobalPoint& vprim, const float energy, const TrajectoryStateOnSurface& initialTrajState) { //next try passing these variables in once... @@ -179,22 +204,21 @@ std::vector TrajSeedMatcher::processSeed(const Traj const float candEt = energy * std::sin(candPos.theta()); const int charge = initialTrajState.charge(); - std::vector matchedHits; + std::vector matches; FreeTrajectoryState firstMatchFreeTraj; GlobalPoint prevHitPos; GlobalPoint vertex; - for (size_t hitNr = 0; hitNr < cfg_.matchingCuts.size() && hitNr < seed.nHits(); hitNr++) { - if (!cfg_.enableHitSkipping && hitNr > 0 && matchedHits.empty()) { - break; - } - - auto const& recHit = *(seed.recHits().first + hitNr); + const auto nCuts = cfg_.matchingCuts.size(); + for (size_t iHit = 0; + matches.size() < nCuts && iHit < seed.nHits() && (cfg_.enableHitSkipping || iHit == matches.size()); + iHit++) { + auto const& recHit = *(seed.recHits().first + iHit); if (!recHit.isValid()) { continue; } - const bool doFirstMatch = matchedHits.empty(); + const bool doFirstMatch = matches.empty(); auto const& trajState = doFirstMatch ? getTrajStateFromVtx(recHit, initialTrajState, backwardPropagator_) @@ -203,22 +227,21 @@ std::vector TrajSeedMatcher::processSeed(const Traj continue; } - auto const& vtxForMatchObject = doFirstMatch ? vprim : vertex; + 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 ((*cfg_.matchingCuts[matches.size()])(match)) { + matches.push_back(match); if (doFirstMatch) { //now we can figure out the z vertex - double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, match.hitPos, candPos); - vertex = GlobalPoint(vprim.x(), vprim.y(), zVertex); - firstMatchFreeTraj = - trackingTools::ftsFromVertexToPoint(getMagField(match.hitPos), match.hitPos, vertex, energy, charge); + double zVertex = cfg_.useRecoVertex ? vprim_.z() : getZVtxFromExtrapolation(vprim_, match.hitPos, candPos); + vertex = GlobalPoint(vprim_.x(), vprim_.y(), zVertex); + firstMatchFreeTraj = ftsFromVertexToPoint(match.hitPos, vertex, energy, charge); } prevHitPos = match.hitPos; } } - return matchedHits; + return matches; } // compute the z vertex from the candidate position and the found pixel hit @@ -270,12 +293,10 @@ const TrajectoryStateOnSurface& TrajSeedMatcher::getTrajStateFromPoint(const Tra } TrajectoryStateOnSurface TrajSeedMatcher::makeTrajStateOnSurface(const GlobalPoint& pos, - const GlobalPoint& vtx, const float energy, const int charge) const { - auto freeTS = trackingTools::ftsFromVertexToPoint(getMagField(pos), pos, vtx, energy, charge); - PerpendicularBoundPlaneBuilder bpb; - return TrajectoryStateOnSurface(freeTS, *bpb(freeTS.position(), freeTS.momentum())); + auto freeTS = ftsFromVertexToPoint(pos, vprim_, energy, charge); + return TrajectoryStateOnSurface(freeTS, *PerpendicularBoundPlaneBuilder{}(freeTS.position(), freeTS.momentum())); } void TrajSeedMatcher::clearCache() { @@ -285,26 +306,12 @@ void TrajSeedMatcher::clearCache() { trajStateFromPointNegChargeCache_.clear(); } -bool TrajSeedMatcher::passesMatchSel(const TrajSeedMatcher::SCHitMatch& hit, const size_t hitNr) const { - 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 " << cfg_.matchingCuts.size() << " defined"; - } -} +int TrajSeedMatcher::getNrValidLayersAlongTraj( + const SCHitMatch& hit1, const SCHitMatch& hit2, const GlobalPoint& candPos, const float energy, const int charge) { + double zVertex = cfg_.useRecoVertex ? vprim_.z() : getZVtxFromExtrapolation(vprim_, hit1.hitPos, candPos); + GlobalPoint vertex(vprim_.x(), vprim_.y(), zVertex); -int TrajSeedMatcher::getNrValidLayersAlongTraj(const SCHitMatch& hit1, - const SCHitMatch& hit2, - const GlobalPoint& candPos, - const GlobalPoint& vprim, - const float energy, - const int charge) { - double zVertex = cfg_.useRecoVertex ? vprim.z() : getZVtxFromExtrapolation(vprim, hit1.hitPos, candPos); - GlobalPoint vertex(vprim.x(), vprim.y(), zVertex); - - auto firstMatchFreeTraj = - trackingTools::ftsFromVertexToPoint(getMagField(hit1.hitPos), hit1.hitPos, vertex, energy, charge); + auto firstMatchFreeTraj = ftsFromVertexToPoint(hit1.hitPos, vertex, energy, charge); auto const& secondHitTraj = getTrajStateFromPoint(hit2.hit, firstMatchFreeTraj, hit1.hitPos, forwardPropagator_); return getNrValidLayersAlongTraj(hit2.hit.geographicalId(), secondHitTraj); } @@ -368,31 +375,6 @@ size_t TrajSeedMatcher::getNrHitsRequired(const int nrValidLayers) const { return cfg_.minNrHits.back(); } -TrajSeedMatcher::SeedWithInfo::SeedWithInfo(const TrajectorySeed& seed, - const std::vector& posCharge, - const std::vector& negCharge, - int nrValidLayers) - : 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 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") - << " error in " << __FILE__ << ", " << __LINE__ - << " hits to be combined have different detIDs, this should not be possible and nothing good will come of it"; - } - DetId detId = detIdPos.rawId() != 0 ? detIdPos : detIdNeg; - matchInfo_.push_back(MatchInfo(detId, dRZPos, dRZNeg, dPhiPos, dPhiNeg)); - } -} - TrajSeedMatcher::MatchingCutsV1::MatchingCutsV1(const edm::ParameterSet& pset) : dPhiMax_(pset.getParameter("dPhiMax")), dRZMax_(pset.getParameter("dRZMax")), diff --git a/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc b/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc index 5c27db5c6c8f0..b36e7a7bb81e7 100644 --- a/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc +++ b/RecoEgamma/EgammaElectronProducers/plugins/ElectronNHitSeedProducer.cc @@ -56,11 +56,6 @@ class ElectronNHitSeedProducer : public edm::global::EDProducer<> { }; namespace { - template - inline auto convertToGP(const T& orgPoint) { - return GlobalPoint(orgPoint.x(), orgPoint.y(), orgPoint.z()); - } - int getLayerOrDiskNr(DetId detId, const TrackerTopology& trackerTopo) { if (detId.subdetId() == PixelSubdetector::PixelBarrel) { return trackerTopo.pxbLayer(detId); @@ -111,12 +106,13 @@ void ElectronNHitSeedProducer::fillDescriptions(edm::ConfigurationDescriptions& void ElectronNHitSeedProducer::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const { auto const& trackerTopology = iSetup.getData(trackerTopologyToken_); - TrajSeedMatcher matcher{matcherConfiguration_, iSetup, iEvent.get(measTkEvtToken_)}; - reco::ElectronSeedCollection eleSeeds{}; - auto const& initialSeeds = iEvent.get(initialSeedsToken_); - auto primVtxPos = convertToGP(iEvent.get(beamSpotToken_).position()); + TrajSeedMatcher matcher{iEvent.get(initialSeedsToken_), + iEvent.get(beamSpotToken_).position(), + matcherConfiguration_, + iSetup, + iEvent.get(measTkEvtToken_)}; // Loop over all super-cluster collections (typically barrel and forward are supplied separately) for (const auto& superClustersToken : superClustersTokens_) { @@ -127,14 +123,12 @@ void ElectronNHitSeedProducer::produce(edm::StreamID, edm::Event& iEvent, const superClusRef->position().phi(), //supercluster phi superClusRef->position().r())); //supercluster r - const auto matchedSeeds = matcher(initialSeeds, caloPosition, primVtxPos, superClusRef->energy()); - - for (auto& matchedSeed : matchedSeeds) { - reco::ElectronSeed eleSeed(matchedSeed.seed()); + for (auto const& matchedSeed : matcher(caloPosition, superClusRef->energy())) { + reco::ElectronSeed eleSeed(matchedSeed.seed); reco::ElectronSeed::CaloClusterRef caloClusRef(superClusRef); eleSeed.setCaloCluster(caloClusRef); - eleSeed.setNrLayersAlongTraj(matchedSeed.nrValidLayers()); - for (auto& matchInfo : matchedSeed.matches()) { + eleSeed.setNrLayersAlongTraj(matchedSeed.nrValidLayers); + for (auto const& matchInfo : matchedSeed.matchInfos) { eleSeed.addHitInfo(makeSeedPixelVar(matchInfo, trackerTopology)); } eleSeeds.emplace_back(eleSeed); diff --git a/RecoEgamma/EgammaElectronProducers/plugins/ElectronSeedProducer.cc b/RecoEgamma/EgammaElectronProducers/plugins/ElectronSeedProducer.cc index d8e748f92827e..fbe4a806cb652 100644 --- a/RecoEgamma/EgammaElectronProducers/plugins/ElectronSeedProducer.cc +++ b/RecoEgamma/EgammaElectronProducers/plugins/ElectronSeedProducer.cc @@ -245,8 +245,6 @@ void ElectronSeedProducer::fillDescriptions(edm::ConfigurationDescriptions& desc // phi windows (non dynamic, overwritten in case dynamic is selected) desc.add("ePhiMin1", -0.125); desc.add("ePhiMax1", 0.075); - desc.add("pPhiMin1", -0.075); - desc.add("pPhiMax1", 0.125); desc.add("PhiMax2B", 0.002); desc.add("PhiMax2F", 0.003);