Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:26:54

0001 /**
0002  *  Class: GlobalMuonTrajectoryBuilder
0003  *
0004  *  Description:
0005  *   Reconstruct muons starting
0006  *   from a muon track reconstructed
0007  *   in the standalone muon system (with DT, CSC and RPC
0008  *   information).
0009  *   It tries to reconstruct the corresponding
0010  *   track in the tracker and performs
0011  *   matching between the reconstructed tracks
0012  *   in the muon system and the tracker.
0013  *
0014  *
0015  *
0016  *  Authors :
0017  *  N. Neumeister            Purdue University
0018  *  C. Liu                   Purdue University
0019  *  A. Everett               Purdue University
0020  *  with contributions from: S. Lacaprara, J. Mumford, P. Traczyk
0021  *
0022  **/
0023 
0024 #include "RecoMuon/GlobalTrackFinder/interface/GlobalMuonTrajectoryBuilder.h"
0025 
0026 //---------------
0027 // C++ Headers --
0028 //---------------
0029 
0030 #include <iostream>
0031 #include <iomanip>
0032 #include <algorithm>
0033 
0034 //-------------------------------
0035 // Collaborating Class Headers --
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 // Constructors --
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 // Destructor --
0071 //--------------
0072 
0073 GlobalMuonTrajectoryBuilder::~GlobalMuonTrajectoryBuilder() {}
0074 
0075 //
0076 // get information from event
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   // get tracker TrackCollection from Event
0084   event.getByToken(allTrackerTracksToken, allTrackerTracks);
0085   LogDebug(category) << " Found " << allTrackerTracks->size() << " tracker Tracks with label " << theTkTrackLabel;
0086 
0087   // get primary vertex from Event
0088   event.getByToken(primaryVertexToken, vertexCollection);
0089   LogDebug(category) << " Found " << vertexCollection->size() << " tracker Tracks with label " << thePrimaryVtxLabel;
0090 }
0091 
0092 //
0093 // reconstruct trajectories
0094 //
0095 MuonCandidate::CandidateContainer GlobalMuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
0096   const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|trajectories";
0097 
0098   // cut on muons with low momenta
0099   LogTrace(category) << " STA pt " << staCandIn.second->pt() << " rho " << staCandIn.second->innerMomentum().Rho()
0100                      << " R " << staCandIn.second->innerMomentum().R() << " theCut " << thePtCut;
0101 
0102   // convert the STA track into a Trajectory if Trajectory not already present
0103   TrackCand staCand(staCandIn);
0104 
0105   vector<TrackCand> regionalTkTracks = makeTkCandCollection(staCand);
0106   LogTrace(category) << " Found " << regionalTkTracks.size() << " tracks within region of interest";
0107 
0108   // match tracker tracks to muon track
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   // build a combined tracker-muon MuonCandidate
0120   //
0121   // turn tkMatchedTracks into MuonCandidates
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   // free memory
0141   if (staCandIn.first == nullptr)
0142     delete staCand.first;
0143 
0144   return result;
0145 }
0146 
0147 //
0148 // make a TrackCand collection using tracker Track, Trajectory information
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 }