Go to the documentation of this file.00001
00021 #include "FastSimulation/Muons/interface/FastL3MuonTrajectoryBuilder.h"
00022
00023
00024
00025
00026
00027
00028 #include <iostream>
00029
00030 #include <algorithm>
00031
00032
00033
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
00044 #include "DataFormats/TrackReco/interface/Track.h"
00045
00046
00047
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
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
00083
00084 void FastL3MuonTrajectoryBuilder::setEvent(const edm::Event& event) {
00085
00086
00087
00088 GlobalTrajectoryBuilderBase::setEvent(event);
00089 theEvent = &event;
00090
00091
00092 regionalTkTracks = makeTkCandCollection(dummyStaCand);
00093
00094
00095 }
00096
00097
00098
00099
00100 MuonCandidate::CandidateContainer
00101 FastL3MuonTrajectoryBuilder::trajectories(const TrackCand& staCandIn) {
00102
00103
00104
00105
00106 if ( (staCandIn).second->pt() < thePtCut ||
00107 (staCandIn).second->innerMomentum().Rho() < thePtCut ||
00108 (staCandIn).second->innerMomentum().R() < 2.5 ) return CandidateContainer();
00109
00110
00111 TrackCand staCand(staCandIn);
00112 addTraj(staCand);
00113
00114
00115 std::vector<TrackCand> trackerTracks = trackMatcher()->match(staCand, regionalTkTracks);
00116
00117
00118 if ( trackerTracks.empty() ) return CandidateContainer();
00119
00120
00121
00122
00123
00124
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
00136
00137 }
00138 }
00139
00140 if ( tkTrajs.empty() ) {
00141
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
00154
00155
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
00171
00172 std::vector<FastL3MuonTrajectoryBuilder::TrackCand>
00173 FastL3MuonTrajectoryBuilder::makeTkCandCollection(const TrackCand& staCand) {
00174
00175
00176
00177 std::vector<TrackCand> tkCandColl;
00178
00179
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
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
00199
00200
00201 return tkCandColl;
00202
00203 }
00204
00205
00206
00207
00208
00209 std::vector<Trajectory>
00210 FastL3MuonTrajectoryBuilder::makeTrajsFromSeeds(const std::vector<TrajectorySeed>& tkSeeds) const {
00211
00212
00213 std::vector<Trajectory> result;
00214
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