CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_4_1_8_patch13/src/FastSimulation/Muons/src/FastL3MuonTrajectoryBuilder.cc

Go to the documentation of this file.
00001 
00021 #include "FastSimulation/Muons/interface/FastL3MuonTrajectoryBuilder.h"
00022 
00023 
00024 //---------------
00025 // C++ Headers --
00026 //---------------
00027 
00028 #include <iostream>
00029 //#include <iomanip>
00030 #include <algorithm>
00031 
00032 //-------------------------------
00033 // Collaborating Class Headers --
00034 //-------------------------------
00035 
00036 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00037 
00038 #include "RecoMuon/GlobalTrackingTools/interface/GlobalMuonTrackMatcher.h"
00039 
00040 #include "TrackingTools/TrajectoryCleaning/interface/TrajectoryCleanerBySharedHits.h"
00041 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00042 
00043 // Tracker RecHits and Tracks
00044 #include "DataFormats/TrackReco/interface/Track.h"
00045 
00046 //----------------
00047 // Constructors --
00048 //----------------
00049 
00050 FastL3MuonTrajectoryBuilder::FastL3MuonTrajectoryBuilder(const edm::ParameterSet& par,
00051                                                          const MuonServiceProxy* service) 
00052 : 
00053   GlobalTrajectoryBuilderBase(par, service), 
00054   theTkSeedGenerator(0), theTrajectoryCleaner(0) 
00055 {
00056 
00057   theFirstEvent = true;
00058   
00059   theTrackerTrajectoryCollection = par.getParameter<edm::InputTag>("TrackerTrajectories");
00060 
00061 #ifdef FAMOS_DEBUG
00062   dbe = edm::Service<DQMStore>().operator->();
00063   matchMuons = dbe->book1D("MatchMuons", "Eta distribution (match)",100,-2.5,2.5);
00064   refitMuons = dbe->book1D("RefitMuons", "Eta distribution (refit)",100,-2.5,2.5);
00065 #endif
00066 
00067 }
00068 
00069 
00070 //--------------
00071 // Destructor --
00072 //--------------
00073 
00074 FastL3MuonTrajectoryBuilder::~FastL3MuonTrajectoryBuilder() {
00075   if (theTrajectoryCleaner) delete theTrajectoryCleaner;
00076 #ifdef FAMOS_DEBUG
00077   dbe->save("test.root");
00078 #endif
00079 }
00080 
00081 //
00082 // get information from event
00083 //
00084 void FastL3MuonTrajectoryBuilder::setEvent(const edm::Event& event) {
00085   
00086   // const std::string category = "Muon|RecoMuon|FastL3MuonTrajectoryBuilder|setEvent";
00087     
00088   GlobalTrajectoryBuilderBase::setEvent(event);
00089   theEvent = &event;
00090     
00091   // Retrieve tracker tracks for muons
00092   regionalTkTracks = makeTkCandCollection(dummyStaCand);
00093   // edm::LogInfo(category) << "Found " << regionalTkTracks.size() << " tracker tracks from Muons";  
00094 
00095 }
00096 
00097 //
00098 // reconstruct trajectories
00099 //
00100 MuonCandidate::CandidateContainer 
00101 FastL3MuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
00102 
00103   // static const std::string category = "FastL3MuonTrajectoryBuilder";
00104 
00105   // cut on muons with low momenta
00106   if ( (staCandIn).second->pt() < thePtCut || 
00107        (staCandIn).second->innerMomentum().Rho() < thePtCut || 
00108        (staCandIn).second->innerMomentum().R() < 2.5 ) return CandidateContainer();
00109 
00110   // convert the STA track into a Trajectory if Trajectory not already present
00111   TrackCand staCand(staCandIn);
00112   addTraj(staCand);
00113   
00114   // match tracker tracks to muon track
00115   std::vector<TrackCand> trackerTracks = trackMatcher()->match(staCand, regionalTkTracks);
00116 
00117   // edm::LogInfo(category) << "Found " << trackerTracks.size() << " matching tracker tracks within region of interest";
00118   if ( trackerTracks.empty() ) return CandidateContainer();
00119   
00120   // build a combined tracker-muon MuonCandidate
00121   //
00122   // turn tkMatchedTracks into MuonCandidates
00123   //
00124   //edm::LogInfo(category) << "turn tkMatchedTracks into MuonCandidates";
00125   CandidateContainer tkTrajs;
00126   for (std::vector<TrackCand>::const_iterator tkt = trackerTracks.begin(); tkt != trackerTracks.end(); tkt++) {
00127     if ((*tkt).first != 0 && (*tkt).first->isValid()) {
00128 
00129       MuonCandidate* muonCand = new MuonCandidate(0,staCand.second,(*tkt).second,new Trajectory(*(*tkt).first));      
00130       tkTrajs.push_back(muonCand);
00131 #ifdef FAMOS_DEBUG
00132       if ( muonCand->muonTrack()->innerMomentum().Perp2() > 400. ) 
00133         matchMuons->Fill(muonCand->muonTrack()->innerMomentum().Eta());
00134 #endif
00135       // LogTrace(category) << "tpush";
00136 
00137     }
00138   }
00139   
00140   if ( tkTrajs.empty() )  {
00141     // edm::LogInfo(category) << "tkTrajs empty";
00142     return CandidateContainer();
00143   }
00144   
00145   CandidateContainer result = build(staCand, tkTrajs);  
00146 #ifdef FAMOS_DEBUG
00147   if ( result.size() > 0 ) { 
00148     CandidateContainer::const_iterator muonIt = result.begin();
00149     if ((*muonIt)->muonTrack()->innerMomentum().Perp2() > 400. ) 
00150       refitMuons->Fill((*muonIt)->muonTrack()->innerMomentum().Eta());
00151   }
00152 #endif
00153   // edm::LogInfo(category) << "Found "<< result.size() << " L3Muons from one L2Cand";
00154 
00155   // free memory
00156   if ( staCandIn.first == 0) delete staCand.first;
00157 
00158   for( CandidateContainer::const_iterator it = tkTrajs.begin(); it != tkTrajs.end(); ++it) {
00159     if ( (*it)->trajectory() ) delete (*it)->trajectory();
00160     if ( (*it)->trackerTrajectory() ) delete (*it)->trackerTrajectory();
00161     if ( *it ) delete (*it);
00162   }
00163   tkTrajs.clear();  
00164 
00165   return result;
00166   
00167 }
00168 
00169 //
00170 // make a TrackCand collection using tracker Track, Trajectory information
00171 //
00172 std::vector<FastL3MuonTrajectoryBuilder::TrackCand> 
00173 FastL3MuonTrajectoryBuilder::makeTkCandCollection(const TrackCand& staCand) {
00174 
00175   // const std::string category = "Muon|RecoMuon|FastL3MuonTrajectoryBuilder|makeTkCandCollection";
00176 
00177   std::vector<TrackCand> tkCandColl;  
00178 
00179   // Get the tracker tracks
00180   edm:: Handle<std::vector<Trajectory> > theTrajectories;
00181   edm::Handle<TrajTrackAssociationCollection> theAssoMap;  
00182   theEvent->getByLabel(theTrackerTrajectoryCollection,theTrajectories);
00183   theEvent->getByLabel(theTrackerTrajectoryCollection,theAssoMap);
00184   
00185   TrajTrackAssociationCollection::const_iterator anAssociation;  
00186   TrajTrackAssociationCollection::const_iterator firstAssociation;  
00187   TrajTrackAssociationCollection::const_iterator lastAssociation;
00188   firstAssociation = theAssoMap->begin();
00189   lastAssociation = theAssoMap->end();
00190 
00191   // Loop on muon tracks seeded by L2 muons
00192   for ( anAssociation = firstAssociation; anAssociation != lastAssociation; ++anAssociation ) { 
00193     edm::Ref<std::vector<Trajectory> > aTrajectoryRef = anAssociation->key;
00194     reco::TrackRef aTrackRef = anAssociation->val;
00195     tkCandColl.push_back(TrackCand(new Trajectory((*aTrajectoryRef)),reco::TrackRef()));
00196   }
00197         
00198   // LogTrace(category) << "Found " << tkCandColl.size() << " tkCands from seeds";
00199   // std::cout << "Found " << tkCandColl.size() << " tkCands from seeds" << std::endl;
00200 
00201   return tkCandColl;
00202 
00203 }
00204 
00205 
00206 //
00207 // build a tracker Trajectory from a seed
00208 //
00209 std::vector<Trajectory> 
00210 FastL3MuonTrajectoryBuilder::makeTrajsFromSeeds(const std::vector<TrajectorySeed>& tkSeeds) const {
00211 
00212   // const std::string category = "Muon|RecoMuon|FastL3MuonTrajectoryBuilder|makeTrajsFromSeeds";
00213   std::vector<Trajectory> result;
00214   // edm::LogInfo(category) << "Trajectories from all seeds " << result.size();
00215   return result;
00216 
00217 }
00218 
00219 void 
00220 FastL3MuonTrajectoryBuilder::clear() { 
00221   std::vector<TrackCand>::const_iterator is = regionalTkTracks.begin();
00222   std::vector<TrackCand>::const_iterator il = regionalTkTracks.end();
00223   for ( ; is != il; ++is) {
00224     delete (*is).first;   
00225   }
00226 }
00227 
00228 
00229 
00230