@@ -142,30 +142,43 @@ MuonHLTSeedMVAClassifierPhase2::MuonHLTSeedMVAClassifierPhase2(const edm::Parame
142142void 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