File indexing completed on 2024-12-25 02:13:48
0001
0002
0003
0004
0005
0006
0007
0008 #include "RecoMuon/TrackerSeedGenerator/interface/TrackerSeedCleaner.h"
0009
0010
0011
0012
0013 #include <vector>
0014
0015
0016
0017
0018 #include "FWCore/Framework/interface/Event.h"
0019 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0020
0021 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
0022 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
0023 #include "DataFormats/Math/interface/deltaPhi.h"
0024
0025 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
0026 #include "TrackingTools/PatternTools/interface/TSCBLBuilderNoMaterial.h"
0027 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0028 #include "RecoTracker/TkTrackingRegions/interface/RectangularEtaPhiTrackingRegion.h"
0029 #include "RecoTracker/TkTrackingRegions/interface/TkTrackingRegionsMargin.h"
0030 #include "RecoTracker/TkMSParametrization/interface/PixelRecoRange.h"
0031
0032 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
0033
0034 using namespace std;
0035 using namespace edm;
0036
0037
0038
0039
0040 void TrackerSeedCleaner::init(const MuonServiceProxy* service) { theProxyService = service; }
0041
0042
0043
0044
0045 void TrackerSeedCleaner::setEvent(const edm::Event& event) { event.getByToken(beamspotToken_, bsHandle_); }
0046
0047
0048
0049
0050 void TrackerSeedCleaner::clean(const reco::TrackRef& muR,
0051 const RectangularEtaPhiTrackingRegion& region,
0052 tkSeeds& seeds) {
0053
0054 if (cleanBySharedHits) {
0055 seeds = nonRedundantSeeds(seeds);
0056 }
0057
0058 theTTRHBuilder = theProxyService->eventSetup().getHandle(theTTRHBuilderToken);
0059
0060 LogDebug("TrackerSeedCleaner") << seeds.size() << " trajectory seeds to the events before cleaning" << endl;
0061
0062
0063 const reco::BeamSpot& bs = *bsHandle_;
0064
0065
0066
0067 std::vector<TrajectorySeed> result;
0068
0069 TSCBLBuilderNoMaterial tscblBuilder;
0070
0071 for (TrajectorySeedCollection::iterator seed = seeds.begin(); seed < seeds.end(); ++seed) {
0072 if (seed->nHits() < 2)
0073 continue;
0074
0075 TransientTrackingRecHit::RecHitPointer recHit = theTTRHBuilder->build(&*(seed->recHits().end() - 1));
0076 TrajectoryStateOnSurface state = trajectoryStateTransform::transientState(
0077 seed->startingState(), recHit->surface(), theProxyService->magneticField().product());
0078
0079 TrajectoryStateClosestToBeamLine tsAtClosestApproachSeed =
0080 tscblBuilder(*state.freeState(), bs);
0081 if (!tsAtClosestApproachSeed.isValid())
0082 continue;
0083 GlobalPoint vSeed1 = tsAtClosestApproachSeed.trackStateAtPCA().position();
0084 GlobalVector pSeed = tsAtClosestApproachSeed.trackStateAtPCA().momentum();
0085 GlobalPoint vSeed(vSeed1.x() - bs.x0(), vSeed1.y() - bs.y0(), vSeed1.z() - bs.z0());
0086
0087
0088 double etaSeed = state.globalMomentum().eta();
0089 double phiSeed = pSeed.phi();
0090
0091
0092 typedef PixelRecoRange<float> Range;
0093 typedef TkTrackingRegionsMargin<float> Margin;
0094
0095 Range etaRange = region.etaRange();
0096 double etaLimit = (fabs(fabs(etaRange.max()) - fabs(etaRange.mean())) < 0.1)
0097 ? 0.1
0098 : fabs(fabs(etaRange.max()) - fabs(etaRange.mean()));
0099
0100 Margin phiMargin = region.phiMargin();
0101 double phiLimit = (phiMargin.right() < 0.1) ? 0.1 : phiMargin.right();
0102
0103 double ptSeed = pSeed.perp();
0104 double ptMin = (region.ptMin() > 3.5) ? 3.5 : region.ptMin();
0105
0106 bool inEtaRange = etaSeed >= (etaRange.mean() - etaLimit) && etaSeed <= (etaRange.mean() + etaLimit);
0107 bool inPhiRange = (fabs(deltaPhi(phiSeed, double(region.direction().phi()))) < phiLimit);
0108
0109 bool inPtRange = ptSeed >= ptMin && ptSeed <= 2 * (muR->pt());
0110
0111
0112 if (seed->nHits() == 3)
0113 inPtRange = true;
0114
0115
0116 if (inPtRange && usePt_Cleaner && !useDirection_Cleaner) {
0117 result.push_back(*seed);
0118 LogDebug("TrackerSeedCleaner") << " Keeping the seed : this seed passed pt selection";
0119 }
0120
0121
0122 if (inEtaRange && inPhiRange && !usePt_Cleaner && useDirection_Cleaner) {
0123 result.push_back(*seed);
0124 LogDebug("TrackerSeedCleaner") << " Keeping the seed : this seed passed direction selection";
0125 }
0126
0127
0128 if (inEtaRange && inPhiRange && inPtRange && usePt_Cleaner && useDirection_Cleaner) {
0129 result.push_back(*seed);
0130 LogDebug("TrackerSeedCleaner") << " Keeping the seed : this seed passed direction and pt selection";
0131 }
0132
0133 LogDebug("TrackerSeedCleaner") << " eta for current seed " << etaSeed << "\n"
0134 << " phi for current seed " << phiSeed << "\n"
0135 << " eta for L2 track " << muR->eta() << "\n"
0136 << " phi for L2 track " << muR->phi() << "\n";
0137 }
0138
0139
0140 if (!result.empty() && (useDirection_Cleaner || usePt_Cleaner))
0141 seeds.swap(result);
0142
0143 LogDebug("TrackerSeedCleaner") << seeds.size() << " trajectory seeds to the events after cleaning" << endl;
0144
0145 return;
0146 }
0147
0148 TrackerSeedCleaner::tkSeeds TrackerSeedCleaner::nonRedundantSeeds(tkSeeds const& seeds) const {
0149 std::vector<uint> idxTriplets{}, idxNonTriplets{};
0150 idxTriplets.reserve(seeds.size());
0151 idxNonTriplets.reserve(seeds.size());
0152
0153 for (uint i1 = 0; i1 < seeds.size(); ++i1) {
0154 auto const& s1 = seeds[i1];
0155 if (s1.nHits() == 3)
0156 idxTriplets.emplace_back(i1);
0157 else
0158 idxNonTriplets.emplace_back(i1);
0159 }
0160
0161 if (idxTriplets.empty()) {
0162 return seeds;
0163 }
0164
0165 std::vector<bool> keepSeedFlags(seeds.size(), true);
0166 for (uint j1 = 0; j1 < idxNonTriplets.size(); ++j1) {
0167 auto const i1 = idxNonTriplets[j1];
0168 auto const& seed = seeds[i1];
0169 keepSeedFlags[i1] = seedIsNotRedundant(seeds, seed, idxTriplets);
0170 }
0171
0172 tkSeeds result{};
0173 result.reserve(seeds.size());
0174
0175 for (uint i1 = 0; i1 < seeds.size(); ++i1) {
0176 if (keepSeedFlags[i1]) {
0177 result.emplace_back(seeds[i1]);
0178 }
0179 }
0180
0181 return result;
0182 }
0183
0184 bool TrackerSeedCleaner::seedIsNotRedundant(tkSeeds const& seeds,
0185 TrajectorySeed const& s1,
0186 std::vector<uint> const& otherIdxs) const {
0187 auto const& rh1s = s1.recHits();
0188 for (uint j2 = 0; j2 < otherIdxs.size(); ++j2) {
0189 auto const& s2 = seeds[otherIdxs[j2]];
0190
0191 uint shared = 0;
0192 for (auto const& h2 : s2.recHits()) {
0193 for (auto const& h1 : rh1s) {
0194 if (h2.sharesInput(&h1, TrackingRecHit::all)) {
0195 ++shared;
0196 }
0197 }
0198 }
0199 if (shared == 2) {
0200 return false;
0201 }
0202 }
0203
0204 return true;
0205 }