Skip to content

Commit cf3e809

Browse files
committed
Optimise muon seed MVA classifier
- Add early return in case either input collection is empty - Swap std::sort with std::partial_sort
1 parent 48600da commit cf3e809

File tree

1 file changed

+34
-19
lines changed

1 file changed

+34
-19
lines changed

RecoMuon/TrackerSeedGenerator/plugins/MuonHLTSeedMVAClassifierPhase2.cc

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -142,30 +142,43 @@ MuonHLTSeedMVAClassifierPhase2::MuonHLTSeedMVAClassifierPhase2(const edm::Parame
142142
void MuonHLTSeedMVAClassifierPhase2::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) {
143143
auto result = std::make_unique<TrajectorySeedCollection>();
144144

145-
edm::ESHandle<TrackerGeometry> trkGeom = iSetup.getHandle(trackerGeometryESToken_);
146-
edm::ESHandle<GeometricDet> geomDet = iSetup.getHandle(geomDetESToken_);
147-
edm::ESHandle<TrackerTopology> trkTopo = iSetup.getHandle(trackerTopologyESToken_);
148-
149-
GeometricSearchTrackerBuilder builder;
150-
GeometricSearchTracker geomTracker = *(builder.build(&(*geomDet), &(*trkGeom), &(*trkTopo)));
151-
152145
edm::Handle<l1t::TrackerMuonCollection> h_L1TkMu;
153146
bool hasL1TkMu = iEvent.getByToken(t_L1TkMu_, h_L1TkMu);
154147

155148
edm::Handle<TrajectorySeedCollection> h_Seed;
156149
bool hasSeed = iEvent.getByToken(t_Seed_, h_Seed);
157150

158-
edm::ESHandle<MagneticField> magfieldH = iSetup.getHandle(magFieldESToken_);
159-
edm::ESHandle<Propagator> propagatorAlongH = iSetup.getHandle(propagatorESToken_);
160-
std::unique_ptr<Propagator> propagatorAlong = SetPropagationDirection(*propagatorAlongH, alongMomentum);
161-
162151
if (!(hasL1TkMu && hasSeed)) {
163152
edm::LogError("SeedClassifierError") << "Error! Cannot find L1TkMuon or TrajectorySeed\n"
164153
<< "hasL1TkMu : " << hasL1TkMu << "\n"
165154
<< "hasSeed : " << hasSeed << "\n";
166155
return;
167156
}
168157

158+
if (h_L1TkMu->size() == 0 or h_Seed->size() == 0) {
159+
if (h_Seed->size() != 0) {
160+
edm::LogInfo("SeedClassifierError") << "Empty L1TkMu collection" << '\n';
161+
}
162+
if (h_L1TkMu->size() != 0) {
163+
edm::LogInfo("SeedClassifierError") << "Empty Muon Pixel seeds collection" << '\n';
164+
} else {
165+
edm::LogInfo("SeedClassifierError") << "Empty L1TkMu and Muon Pixel seeds collections" << '\n';
166+
}
167+
iEvent.put(std::move(result));
168+
return;
169+
}
170+
171+
edm::ESHandle<TrackerGeometry> trkGeom = iSetup.getHandle(trackerGeometryESToken_);
172+
edm::ESHandle<GeometricDet> geomDet = iSetup.getHandle(geomDetESToken_);
173+
edm::ESHandle<TrackerTopology> trkTopo = iSetup.getHandle(trackerTopologyESToken_);
174+
175+
GeometricSearchTrackerBuilder builder;
176+
GeometricSearchTracker geomTracker = *(builder.build(&(*geomDet), &(*trkGeom), &(*trkTopo)));
177+
178+
edm::ESHandle<MagneticField> magfieldH = iSetup.getHandle(magFieldESToken_);
179+
edm::ESHandle<Propagator> propagatorAlongH = iSetup.getHandle(propagatorESToken_);
180+
std::unique_ptr<Propagator> propagatorAlong = SetPropagationDirection(*propagatorAlongH, alongMomentum);
181+
169182
// -- sort seeds by MVA score and chooes top nSeedsMax_B_ / nSeedsMax_E_
170183
if (doSort_) {
171184
std::vector<std::pair<unsigned, double>> pairSeedIdxMvaScore_B = {};
@@ -204,19 +217,21 @@ void MuonHLTSeedMVAClassifierPhase2::produce(edm::Event& iEvent, const edm::Even
204217
pairSeedIdxMvaScore_E.push_back(make_pair(i, logistic));
205218
}
206219

207-
std::sort(pairSeedIdxMvaScore_B.begin(), pairSeedIdxMvaScore_B.end(), sortByMvaScorePhase2);
208-
std::sort(pairSeedIdxMvaScore_E.begin(), pairSeedIdxMvaScore_E.end(), sortByMvaScorePhase2);
220+
std::partial_sort(pairSeedIdxMvaScore_B.begin(),
221+
std::min(pairSeedIdxMvaScore_B.begin() + nSeedsMax_B_, pairSeedIdxMvaScore_B.end()),
222+
pairSeedIdxMvaScore_B.end(),
223+
sortByMvaScorePhase2);
224+
std::partial_sort(pairSeedIdxMvaScore_E.begin(),
225+
std::min(pairSeedIdxMvaScore_E.begin() + nSeedsMax_E_, pairSeedIdxMvaScore_E.end()),
226+
pairSeedIdxMvaScore_E.end(),
227+
sortByMvaScorePhase2);
209228

210-
for (auto i = 0U; i < pairSeedIdxMvaScore_B.size(); ++i) {
211-
if ((int)i == nSeedsMax_B_)
212-
break;
229+
for (size_t i = 0; i < std::min(pairSeedIdxMvaScore_B.size(), static_cast<size_t>(nSeedsMax_B_)); ++i) {
213230
const auto& seed(h_Seed->at(pairSeedIdxMvaScore_B.at(i).first));
214231
result->emplace_back(seed);
215232
}
216233

217-
for (auto i = 0U; i < pairSeedIdxMvaScore_E.size(); ++i) {
218-
if ((int)i == nSeedsMax_E_)
219-
break;
234+
for (size_t i = 0; i < std::min(pairSeedIdxMvaScore_E.size(), static_cast<size_t>(nSeedsMax_E_)); ++i) {
220235
const auto& seed(h_Seed->at(pairSeedIdxMvaScore_E.at(i).first));
221236
result->emplace_back(seed);
222237
}

0 commit comments

Comments
 (0)