CMS 3D CMS Logo

GlobalMuonTrajectoryBuilder.cc

Go to the documentation of this file.
00001 
00026 #include "RecoMuon/GlobalTrackFinder/interface/GlobalMuonTrajectoryBuilder.h"
00027 
00028 //---------------
00029 // C++ Headers --
00030 //---------------
00031 
00032 #include <iostream>
00033 #include <iomanip>
00034 #include <algorithm>
00035 
00036 //-------------------------------
00037 // Collaborating Class Headers --
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 // Constructors --
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 // Destructor --
00072 //--------------
00073 
00074 GlobalMuonTrajectoryBuilder::~GlobalMuonTrajectoryBuilder() {
00075 }
00076 
00077 //
00078 // get information from event
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   // get tracker TrackCollection from Event
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 // reconstruct trajectories
00106 //
00107 MuonCandidate::CandidateContainer GlobalMuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
00108 
00109   const std::string category = "Muon|RecoMuon|GlobalMuonTrajectoryBuilder|trajectories";
00110   
00111   // cut on muons with low momenta
00112   if ( (staCandIn).second->pt() < thePtCut || (staCandIn).second->innerMomentum().Rho() < thePtCut || (staCandIn).second->innerMomentum().R() < 2.5 ) return CandidateContainer();
00113   
00114   // convert the STA track into a Trajectory if Trajectory not already present
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   // match tracker tracks to muon track
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   // build a combined tracker-muon MuonCandidate
00135   //
00136   // turn tkMatchedTracks into MuonCandidates
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   // free memory
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 // make a TrackCand collection using tracker Track, Trajectory information
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 }

Generated on Tue Jun 9 17:44:13 2009 for CMSSW by  doxygen 1.5.4