File indexing completed on 2023-03-17 11:20:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 #include "RecoMuon/GlobalTrackFinder/interface/GlobalMuonTrajectoryBuilder.h"
0025
0026
0027
0028
0029
0030 #include <iostream>
0031 #include <iomanip>
0032 #include <algorithm>
0033
0034
0035
0036
0037
0038 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0039 #include "FWCore/Framework/interface/Event.h"
0040
0041 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0042
0043 #include "DataFormats/TrackReco/interface/Track.h"
0044
0045 #include "RecoMuon/TrackingTools/interface/MuonCandidate.h"
0046 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
0047 #include "RecoMuon/GlobalTrackingTools/interface/GlobalMuonTrackMatcher.h"
0048
0049 using namespace std;
0050 using namespace edm;
0051
0052
0053
0054
0055
0056 GlobalMuonTrajectoryBuilder::GlobalMuonTrajectoryBuilder(const edm::ParameterSet& par,
0057 const MuonServiceProxy* service,
0058 edm::ConsumesCollector& iC)
0059 : GlobalTrajectoryBuilderBase(par, service, iC)
0060
0061 {
0062 theTkTrackLabel = par.getParameter<edm::InputTag>("TrackerCollectionLabel");
0063 allTrackerTracksToken = iC.consumes<reco::TrackCollection>(theTkTrackLabel);
0064 thePrimaryVtxLabel = par.getParameter<edm::InputTag>("VertexCollectionLabel");
0065 primaryVertexToken = iC.mayConsume<reco::VertexCollection>(thePrimaryVtxLabel);
0066 selectHighPurity_ = par.getParameter<bool>("selectHighPurity");
0067 }
0068
0069
0070
0071
0072
0073 GlobalMuonTrajectoryBuilder::~GlobalMuonTrajectoryBuilder() {}
0074
0075
0076
0077
0078 void GlobalMuonTrajectoryBuilder::setEvent(const edm::Event& event) {
0079 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|setEvent";
0080
0081 GlobalTrajectoryBuilderBase::setEvent(event);
0082
0083
0084 event.getByToken(allTrackerTracksToken, allTrackerTracks);
0085 LogDebug(category) << " Found " << allTrackerTracks->size() << " tracker Tracks with label " << theTkTrackLabel;
0086
0087
0088 event.getByToken(primaryVertexToken, vertexCollection);
0089 LogDebug(category) << " Found " << vertexCollection->size() << " tracker Tracks with label " << thePrimaryVtxLabel;
0090 }
0091
0092
0093
0094
0095 MuonCandidate::CandidateContainer GlobalMuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
0096 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|trajectories";
0097
0098
0099 LogTrace(category) << " STA pt " << staCandIn.second->pt() << " rho " << staCandIn.second->innerMomentum().Rho()
0100 << " R " << staCandIn.second->innerMomentum().R() << " theCut " << thePtCut;
0101
0102
0103 TrackCand staCand(staCandIn);
0104
0105 vector<TrackCand> regionalTkTracks = makeTkCandCollection(staCand);
0106 LogTrace(category) << " Found " << regionalTkTracks.size() << " tracks within region of interest";
0107
0108
0109 vector<TrackCand> trackerTracks = trackMatcher()->match(staCand, regionalTkTracks);
0110 LogTrace(category) << " Found " << trackerTracks.size() << " matching tracker tracks within region of interest";
0111
0112 if (trackerTracks.empty()) {
0113 if (staCandIn.first == nullptr)
0114 delete staCand.first;
0115
0116 return CandidateContainer();
0117 }
0118
0119
0120
0121
0122
0123 LogTrace(category) << " Turn tkMatchedTracks into MuonCandidates";
0124 CandidateContainer tkTrajs;
0125 for (vector<TrackCand>::const_iterator tkt = trackerTracks.begin(); tkt != trackerTracks.end(); tkt++) {
0126 tkTrajs.push_back(std::make_unique<MuonCandidate>(nullptr, staCand.second, (*tkt).second, nullptr));
0127 }
0128
0129 if (tkTrajs.empty()) {
0130 LogTrace(category) << " tkTrajs empty";
0131 if (staCandIn.first == nullptr)
0132 delete staCand.first;
0133
0134 return CandidateContainer();
0135 }
0136
0137 CandidateContainer result = build(staCand, tkTrajs);
0138 LogTrace(category) << " Found " << result.size() << " GLBMuons from one STACand";
0139
0140
0141 if (staCandIn.first == nullptr)
0142 delete staCand.first;
0143
0144 return result;
0145 }
0146
0147
0148
0149
0150 vector<GlobalMuonTrajectoryBuilder::TrackCand> GlobalMuonTrajectoryBuilder::makeTkCandCollection(
0151 const TrackCand& staCand) {
0152 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|makeTkCandCollection";
0153
0154 vector<TrackCand> tkCandColl;
0155
0156 vector<TrackCand> tkTrackCands;
0157
0158 for (unsigned int position = 0; position != allTrackerTracks->size(); ++position) {
0159 reco::TrackRef tkTrackRef(allTrackerTracks, position);
0160 TrackCand tkCand = TrackCand((Trajectory*)nullptr, tkTrackRef);
0161 if (selectHighPurity_ && !tkTrackRef->quality(reco::TrackBase::highPurity)) {
0162 const reco::VertexCollection* recoVertices = vertexCollection.product();
0163 if (!(*recoVertices)[0].isFake())
0164 continue;
0165 }
0166 tkTrackCands.push_back(tkCand);
0167 }
0168
0169 tkCandColl = chooseRegionalTrackerTracks(staCand, tkTrackCands);
0170
0171 return tkCandColl;
0172 }