00001
00026 #include "RecoMuon/GlobalTrackFinder/interface/GlobalMuonTrajectoryBuilder.h"
00027
00028
00029
00030
00031
00032 #include <iostream>
00033 #include <iomanip>
00034 #include <algorithm>
00035
00036
00037
00038
00039
00040 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00041 #include "FWCore/Framework/interface/Event.h"
00042
00043 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00044
00045 #include "DataFormats/TrackReco/interface/Track.h"
00046
00047 #include "RecoMuon/TrackingTools/interface/MuonCandidate.h"
00048 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
00049 #include "RecoMuon/GlobalTrackingTools/interface/GlobalMuonTrackMatcher.h"
00050
00051 #include "FWCore/ServiceRegistry/interface/Service.h"
00052
00053 using namespace std;
00054 using namespace edm;
00055
00056
00057
00058
00059
00060 GlobalMuonTrajectoryBuilder::GlobalMuonTrajectoryBuilder(const edm::ParameterSet& par,
00061 const MuonServiceProxy* service) : GlobalTrajectoryBuilderBase(par, service),
00062 theTkTrajsAvailableFlag(false)
00063 {
00064
00065 theFirstEvent = true;
00066 theTkTrackLabel = par.getParameter<edm::InputTag>("TrackerCollectionLabel");
00067 }
00068
00069
00070
00071
00072
00073
00074 GlobalMuonTrajectoryBuilder::~GlobalMuonTrajectoryBuilder() {
00075 }
00076
00077
00078
00079
00080 void GlobalMuonTrajectoryBuilder::setEvent(const edm::Event& event) {
00081
00082 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|setEvent";
00083
00084 GlobalTrajectoryBuilderBase::setEvent(event);
00085
00086
00087 edm::Handle<std::vector<Trajectory> > handleTrackerTrajs;
00088 event.getByLabel(theTkTrackLabel,allTrackerTracks);
00089 LogInfo(category)
00090 << "Found " << allTrackerTracks->size()
00091 << " tracker Tracks with label "<< theTkTrackLabel;
00092 if (event.getByLabel(theTkTrackLabel,handleTrackerTrajs) && event.getByLabel(theTkTrackLabel,tkAssoMap)) {
00093 theTkTrajsAvailableFlag = true;
00094 allTrackerTrajs = &*handleTrackerTrajs;
00095
00096 if ( theFirstEvent ) {
00097 LogInfo(category) << "Tk Trajectories Found! ";
00098 theFirstEvent = false;
00099 }
00100 }
00101
00102 }
00103
00104
00105
00106
00107 MuonCandidate::CandidateContainer GlobalMuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
00108
00109 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|trajectories";
00110
00111
00112 if ( (staCandIn).second->pt() < thePtCut || (staCandIn).second->innerMomentum().Rho() < thePtCut || (staCandIn).second->innerMomentum().R() < 2.5 ) return CandidateContainer();
00113
00114
00115 TrackCand staCand(staCandIn);
00116 addTraj(staCand);
00117
00118 vector<TrackCand> regionalTkTracks = makeTkCandCollection(staCand);
00119 LogInfo(category) << "Found " << regionalTkTracks.size() << " tracks within region of interest";
00120
00121
00122 vector<TrackCand> trackerTracks = trackMatcher()->match(staCand, regionalTkTracks);
00123 LogInfo(category) << "Found " << trackerTracks.size() << " matching tracker tracks within region of interest";
00124 if ( trackerTracks.empty() ) {
00125 if ( staCandIn.first == 0) delete staCand.first;
00126 if ( !theTkTrajsAvailableFlag ) {
00127 for ( vector<TrackCand>::const_iterator is = regionalTkTracks.begin(); is != regionalTkTracks.end(); ++is) {
00128 delete (*is).first;
00129 }
00130 }
00131 return CandidateContainer();
00132 }
00133
00134
00135
00136
00137
00138 LogInfo(category) << "turn tkMatchedTracks into MuonCandidates";
00139 CandidateContainer tkTrajs;
00140 for (vector<TrackCand>::const_iterator tkt = trackerTracks.begin(); tkt != trackerTracks.end(); tkt++) {
00141 if ((*tkt).first != 0 && (*tkt).first->isValid()) {
00142 MuonCandidate* muonCand = new MuonCandidate( 0 ,staCand.second,(*tkt).second, new Trajectory(*(*tkt).first));
00143 tkTrajs.push_back(muonCand);
00144 LogTrace(category) << "tpush";
00145 }
00146 }
00147
00148 if ( tkTrajs.empty() ) {
00149 LogTrace(category) << "tkTrajs empty";
00150 if ( staCandIn.first == 0) delete staCand.first;
00151 if ( !theTkTrajsAvailableFlag ) {
00152 for ( vector<TrackCand>::const_iterator is = regionalTkTracks.begin(); is != regionalTkTracks.end(); ++is) {
00153 delete (*is).first;
00154 }
00155 }
00156 return CandidateContainer();
00157 }
00158
00159 CandidateContainer result = build(staCand, tkTrajs);
00160 LogInfo(category) << "Found "<< result.size() << " GLBMuons from one STACand";
00161
00162
00163 if ( staCandIn.first == 0) delete staCand.first;
00164 if ( !theTkTrajsAvailableFlag ) {
00165 for ( vector<TrackCand>::const_iterator is = regionalTkTracks.begin(); is != regionalTkTracks.end(); ++is) {
00166 delete (*is).first;
00167 }
00168 }
00169
00170 for( CandidateContainer::const_iterator it = tkTrajs.begin(); it != tkTrajs.end(); ++it) {
00171 if ( (*it)->trajectory() ) delete (*it)->trajectory();
00172 if ( (*it)->trackerTrajectory() ) delete (*it)->trackerTrajectory();
00173 if ( *it ) delete (*it);
00174 }
00175 tkTrajs.clear();
00176
00177
00178 return result;
00179
00180 }
00181
00182
00183
00184
00185 vector<GlobalMuonTrajectoryBuilder::TrackCand> GlobalMuonTrajectoryBuilder::makeTkCandCollection(const TrackCand& staCand) {
00186
00187 const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|makeTkCandCollection";
00188
00189 vector<TrackCand> tkCandColl;
00190
00191 vector<TrackCand> tkTrackCands;
00192
00193 if ( theTkTrajsAvailableFlag ) {
00194 for(TrajTrackAssociationCollection::const_iterator it = tkAssoMap->begin(); it != tkAssoMap->end(); ++it){
00195 const Ref<vector<Trajectory> > traj = it->key;
00196 const reco::TrackRef tk = it->val;
00197 TrackCand tkCand = TrackCand(0,tk);
00198 if( traj->isValid() ) tkCand.first = &*traj ;
00199 tkTrackCands.push_back(tkCand);
00200 }
00201 } else {
00202 for ( unsigned int position = 0; position != allTrackerTracks->size(); ++position ) {
00203 reco::TrackRef tkTrackRef(allTrackerTracks,position);
00204 TrackCand tkCand = TrackCand(0,tkTrackRef);
00205 tkTrackCands.push_back(tkCand);
00206 }
00207 }
00208
00209 tkCandColl = chooseRegionalTrackerTracks(staCand,tkTrackCands);
00210
00211 return tkCandColl;
00212
00213 }