00001
00014
00015 #include "FWCore/Framework/interface/EDProducer.h"
00016 #include "FWCore/Framework/interface/Event.h"
00017 #include "FWCore/Framework/interface/EventSetup.h"
00018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00019 #include "DataFormats/Common/interface/Handle.h"
00020 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00021
00022 #include "RecoMuon/GlobalMuonProducer/src/GlobalMuonProducer.h"
00023
00024
00025 #include "RecoMuon/GlobalTrackFinder/interface/GlobalMuonTrajectoryBuilder.h"
00026 #include "RecoMuon/TrackingTools/interface/MuonTrackFinder.h"
00027 #include "RecoMuon/TrackingTools/interface/MuonTrackLoader.h"
00028 #include "RecoMuon/TrackingTools/interface/MuonServiceProxy.h"
00029
00030
00031 #include "DataFormats/TrackReco/interface/Track.h"
00032 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00033
00034 #include "DataFormats/MuonReco/interface/MuonTrackLinks.h"
00035 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00036 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00037 #include "DataFormats/TrackReco/interface/TrackToTrackMap.h"
00038
00039 using namespace edm;
00040 using namespace std;
00041
00042
00043
00044
00045 GlobalMuonProducer::GlobalMuonProducer(const ParameterSet& parameterSet) {
00046
00047 LogTrace("Muon|RecoMuon|GlobalMuonProducer") << "constructor called" << endl;
00048
00049
00050 ParameterSet trajectoryBuilderParameters = parameterSet.getParameter<ParameterSet>("GLBTrajBuilderParameters");
00051 InputTag trackCollectionTag = parameterSet.getParameter<InputTag>("TrackerCollectionLabel");
00052 trajectoryBuilderParameters.addParameter<InputTag>("TrackerCollectionLabel",trackCollectionTag);
00053
00054
00055 theSTACollectionLabel = parameterSet.getParameter<InputTag>("MuonCollectionLabel");
00056
00057
00058 ParameterSet serviceParameters = parameterSet.getParameter<ParameterSet>("ServiceParameters");
00059
00060
00061 ParameterSet trackLoaderParameters = parameterSet.getParameter<ParameterSet>("TrackLoaderParameters");
00062
00063
00064 theService = new MuonServiceProxy(serviceParameters);
00065
00066
00067 MuonTrackLoader* mtl = new MuonTrackLoader(trackLoaderParameters,theService);
00068 GlobalMuonTrajectoryBuilder* gmtb = new GlobalMuonTrajectoryBuilder(trajectoryBuilderParameters, theService);
00069
00070 theTrackFinder = new MuonTrackFinder(gmtb, mtl);
00071
00072 setAlias(parameterSet.getParameter<std::string>("@module_label"));
00073 produces<reco::TrackCollection>().setBranchAlias(theAlias + "Tracks");
00074 produces<TrackingRecHitCollection>().setBranchAlias(theAlias + "RecHits");
00075 produces<reco::TrackExtraCollection>().setBranchAlias(theAlias + "TrackExtras");
00076 produces<vector<Trajectory> >().setBranchAlias(theAlias + "Trajectories") ;
00077 produces<TrajTrackAssociationCollection>().setBranchAlias(theAlias + "TrajTrackMap");
00078 produces<reco::MuonTrackLinksCollection>().setBranchAlias(theAlias + "s");
00079 }
00080
00081
00082
00083
00084
00085 GlobalMuonProducer::~GlobalMuonProducer() {
00086
00087 LogTrace("Muon|RecoMuon|GlobalMuonProducer") << "destructor called" << endl;
00088 if (theService) delete theService;
00089 if (theTrackFinder) delete theTrackFinder;
00090
00091 }
00092
00093
00094
00095
00096
00097 void GlobalMuonProducer::produce(Event& event, const EventSetup& eventSetup) {
00098 const string metname = "Muon|RecoMuon|GlobalMuonProducer";
00099 LogTrace(metname)<<endl<<endl<<endl;
00100 LogTrace(metname)<<"Global Muon Reconstruction started"<<endl;
00101
00102
00103 theService->update(eventSetup);
00104
00105
00106 Handle<reco::TrackCollection> staMuons;
00107 event.getByLabel(theSTACollectionLabel,staMuons);
00108
00109 Handle<vector<Trajectory> > staMuonsTraj;
00110
00111 LogTrace(metname) << "Taking " << staMuons->size() << " Stand Alone Muons "<<theSTACollectionLabel<<endl;
00112
00113 vector<MuonTrajectoryBuilder::TrackCand> staTrackCands;
00114
00115 edm::Handle<TrajTrackAssociationCollection> staAssoMap;
00116
00117 edm::Handle<reco::TrackToTrackMap> updatedStaAssoMap;
00118
00119 if( event.getByLabel(theSTACollectionLabel.label(), staMuonsTraj) && event.getByLabel(theSTACollectionLabel.label(),staAssoMap) && event.getByLabel(theSTACollectionLabel.label(),updatedStaAssoMap) ) {
00120
00121 for(TrajTrackAssociationCollection::const_iterator it = staAssoMap->begin(); it != staAssoMap->end(); ++it){
00122 const Ref<vector<Trajectory> > traj = it->key;
00123 const reco::TrackRef tkRegular = it->val;
00124 reco::TrackRef tkUpdated;
00125 reco::TrackToTrackMap::const_iterator iEnd;
00126 reco::TrackToTrackMap::const_iterator iii;
00127 if ( theSTACollectionLabel.instance() == "UpdatedAtVtx") {
00128 iEnd = updatedStaAssoMap->end();
00129 iii = updatedStaAssoMap->find(it->val);
00130 if (iii != iEnd ) tkUpdated = (*updatedStaAssoMap)[it->val] ;
00131 }
00132
00133 const reco::TrackRef tk = ( tkUpdated.isNonnull() ) ? tkUpdated : tkRegular ;
00134
00135 MuonTrajectoryBuilder::TrackCand tkCand = MuonTrajectoryBuilder::TrackCand(0,tk);
00136 if( traj->isValid() ) tkCand.first = &*traj ;
00137 staTrackCands.push_back(tkCand);
00138 }
00139 } else {
00140 for ( unsigned int position = 0; position != staMuons->size(); ++position ) {
00141 reco::TrackRef staTrackRef(staMuons,position);
00142 MuonTrajectoryBuilder::TrackCand staCand = MuonTrajectoryBuilder::TrackCand(0,staTrackRef);
00143 staTrackCands.push_back(staCand);
00144 }
00145 }
00146
00147 theTrackFinder->reconstruct(staTrackCands, event);
00148
00149
00150 LogTrace(metname)<<"Event loaded"
00151 <<"================================"
00152 <<endl<<endl;
00153
00154 }