Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:09:41

0001 /*
0002 * class HLTMuonTrackSelector
0003 * 
0004 * See header file for documentation
0005 *  
0006 * Author: Kyeongpil Lee (kplee@cern.ch)
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);  // -- add copyExtras and copyTrajectories
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   // -- load tracks
0046   auto const& originalTracks = collectionClonerTokens.tracks(iEvent);
0047   auto nTrack = originalTracks.size();
0048 
0049   // -- load muons
0050   edm::Handle<vector<reco::Muon> > handle_muon;
0051   iEvent.getByToken(token_muon, handle_muon);
0052   auto nMuon = handle_muon->size();
0053 
0054   // -- load MVA values if necessary
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   // -- containers for selected track informations
0062   std::vector<unsigned int> selectedIter;
0063   auto selectedMVAVals = std::make_unique<MVACollection>();
0064 
0065   auto nSelected = 0U;
0066 
0067   ////////////////////
0068   // -- matching -- //
0069   ////////////////////
0070 
0071   // -- iteration over muons
0072   for (auto i_mu = 0U; i_mu < nMuon; ++i_mu) {
0073     // -- avoids crashing in case the muon is SA only.
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     // -- iteration over tracks
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     }  // -- end of track iteration
0101 
0102     // -- if at least one track is matched
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   }  // -- end of muon iteration
0111 
0112   assert(producer.selTracks_->empty());
0113 
0114   // -- produces tracks and associated informations
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);