File indexing completed on 2023-03-17 11:09:41
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "HLTMuonTrackSelector.h"
0011
0012 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0013 #include "DataFormats/TrackReco/interface/Track.h"
0014 #include "DataFormats/MuonReco/interface/MuonFwd.h"
0015 #include "DataFormats/MuonReco/interface/Muon.h"
0016 #include "DataFormats/Math/interface/deltaR.h"
0017
0018 using namespace std;
0019 using namespace reco;
0020
0021 HLTMuonTrackSelector::HLTMuonTrackSelector(const edm::ParameterSet& iConfig)
0022 : collectionCloner(producesCollector(), iConfig, true),
0023 collectionClonerTokens(iConfig.getParameter<edm::InputTag>("track"), consumesCollector()),
0024 token_muon(consumes<vector<reco::Muon> >(iConfig.getParameter<edm::InputTag>("muon"))),
0025 token_originalMVAVals(consumes<MVACollection>(iConfig.getParameter<edm::InputTag>("originalMVAVals"))),
0026 flag_copyMVA(iConfig.getParameter<bool>("copyMVA")) {
0027 produces<MVACollection>("MVAValues");
0028 }
0029
0030 HLTMuonTrackSelector::~HLTMuonTrackSelector() {}
0031
0032 void HLTMuonTrackSelector::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0033 edm::ParameterSetDescription desc;
0034 desc.add<edm::InputTag>("track", edm::InputTag());
0035 desc.add<edm::InputTag>("muon", edm::InputTag());
0036 desc.add<edm::InputTag>("originalMVAVals", edm::InputTag());
0037 desc.add<bool>("copyMVA", false);
0038 TrackCollectionCloner::fill(desc);
0039 descriptions.add("HLTMuonTrackSelector", desc);
0040 }
0041
0042 void HLTMuonTrackSelector::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& iSetup) const {
0043 TrackCollectionCloner::Producer producer(iEvent, collectionCloner);
0044
0045
0046 auto const& originalTracks = collectionClonerTokens.tracks(iEvent);
0047 auto nTrack = originalTracks.size();
0048
0049
0050 edm::Handle<vector<reco::Muon> > handle_muon;
0051 iEvent.getByToken(token_muon, handle_muon);
0052 auto nMuon = handle_muon->size();
0053
0054
0055 edm::Handle<MVACollection> handle_originalMVAVals;
0056 if (flag_copyMVA) {
0057 iEvent.getByToken(token_originalMVAVals, handle_originalMVAVals);
0058 assert((*handle_originalMVAVals).size() == nTrack);
0059 }
0060
0061
0062 std::vector<unsigned int> selectedIter;
0063 auto selectedMVAVals = std::make_unique<MVACollection>();
0064
0065 auto nSelected = 0U;
0066
0067
0068
0069
0070
0071
0072 for (auto i_mu = 0U; i_mu < nMuon; ++i_mu) {
0073
0074 const reco::Muon& muon(handle_muon->at(i_mu));
0075 TrackRef muonTrackRef = (muon.innerTrack().isNonnull()) ? muon.innerTrack() : muon.muonBestTrack();
0076
0077 double muonPt = muonTrackRef->pt();
0078 double muonEta = muonTrackRef->eta();
0079 double muonPhi = muonTrackRef->phi();
0080
0081 double smallestDPt = 1e30;
0082 unsigned int smallestDPtIter = 9999U;
0083
0084
0085 for (auto i_trk = 0U; i_trk < nTrack; ++i_trk) {
0086 auto const& track = originalTracks[i_trk];
0087
0088 double trackPt = track.pt();
0089 double trackEta = track.eta();
0090 double trackPhi = track.phi();
0091
0092 if (deltaR(trackEta, trackPhi, muonEta, muonPhi) < 0.1) {
0093 double dPt = fabs(trackPt - muonPt);
0094
0095 if (dPt < smallestDPt) {
0096 smallestDPt = dPt;
0097 smallestDPtIter = i_trk;
0098 }
0099 }
0100 }
0101
0102
0103 if (smallestDPtIter != 9999U) {
0104 selectedIter.push_back(smallestDPtIter);
0105 if (flag_copyMVA)
0106 selectedMVAVals->push_back((*handle_originalMVAVals)[smallestDPtIter]);
0107 ++nSelected;
0108 }
0109
0110 }
0111
0112 assert(producer.selTracks_->empty());
0113
0114
0115 producer(collectionClonerTokens, selectedIter);
0116 assert(producer.selTracks_->size() == nSelected);
0117
0118 if (flag_copyMVA)
0119 iEvent.put(std::move(selectedMVAVals), "MVAValues");
0120 }
0121
0122 #include "FWCore/Framework/interface/MakerMacros.h"
0123
0124 DEFINE_FWK_MODULE(HLTMuonTrackSelector);