#include <Alignment/TrackerToMuonPropagator/src/TrackerToMuonPropagator.cc>
Public Member Functions | |
TrackerToMuonPropagator (const edm::ParameterSet &) | |
~TrackerToMuonPropagator () | |
Private Member Functions | |
virtual void | beginJob (const edm::EventSetup &) |
virtual void | endJob () |
virtual void | produce (edm::Event &, const edm::EventSetup &) |
Private Attributes | |
edm::InputTag | m_globalMuons |
edm::InputTag | m_globalMuonTracks |
std::string | m_propagator |
bool | m_refitTracker |
TrackTransformer * | m_trackTransformer |
Implementation: <Notes on="" implementation>="">
Definition at line 63 of file TrackerToMuonPropagator.cc.
TrackerToMuonPropagator::TrackerToMuonPropagator | ( | const edm::ParameterSet & | iConfig | ) | [explicit] |
Definition at line 93 of file TrackerToMuonPropagator.cc.
References edm::ParameterSet::getParameter(), m_globalMuons, m_globalMuonTracks, m_propagator, m_refitTracker, m_trackTransformer, and NULL.
00094 { 00095 m_globalMuons = iConfig.getParameter<edm::InputTag>("globalMuons"); 00096 m_globalMuonTracks = iConfig.getParameter<edm::InputTag>("globalMuonTracks"); 00097 m_propagator = iConfig.getParameter<std::string>("propagator"); 00098 m_refitTracker = iConfig.getParameter<bool>("refitTrackerTrack"); 00099 if (m_refitTracker) { 00100 m_trackTransformer = new TrackTransformer(iConfig.getParameter<edm::ParameterSet>("trackerTrackTransformer")); 00101 } 00102 else m_trackTransformer = NULL; 00103 00104 produces<std::vector<Trajectory> >(); 00105 produces<TrajTrackAssociationCollection>(); 00106 }
TrackerToMuonPropagator::~TrackerToMuonPropagator | ( | ) |
Definition at line 109 of file TrackerToMuonPropagator.cc.
00110 { 00111 00112 // do anything here that needs to be done at desctruction time 00113 // (e.g. close files, deallocate resources etc.) 00114 00115 }
void TrackerToMuonPropagator::beginJob | ( | const edm::EventSetup & | ) | [private, virtual] |
void TrackerToMuonPropagator::produce | ( | edm::Event & | iEvent, | |
const edm::EventSetup & | iSetup | |||
) | [private, virtual] |
Implements edm::EDProducer.
Definition at line 124 of file TrackerToMuonPropagator.cc.
References alongMomentum, MuonTransientTrackingRecHitBuilder::build(), MuonSubdetId::CSC, MuonSubdetId::DT, e, lat::endl(), Exception, Trajectory::firstMeasurement(), TrajectoryMeasurement::forwardPredictedState(), edm::EventSetup::get(), edm::Event::getByLabel(), globalMuonTrajectories_cff::globalMuons, i, TrajectoryStateOnSurface::isValid(), m_globalMuons, m_globalMuonTracks, m_propagator, m_refitTracker, m_trackTransformer, DetId::Muon, TrajectoryStateTransform::persistentState(), Trajectory::push(), edm::OwnVector< T, P >::push_back(), edm::Event::put(), DetId::rawId(), TrajectoryMeasurement::recHit(), TrackTransformer::setServices(), edm::OwnVector< T, P >::size(), and TrackTransformer::transform().
00125 { 00126 if (m_trackTransformer) m_trackTransformer->setServices(iSetup); 00127 00128 edm::Handle<reco::MuonCollection> globalMuons; 00129 iEvent.getByLabel(m_globalMuons, globalMuons); 00130 00131 edm::Handle<reco::TrackCollection> globalMuonTracks; 00132 iEvent.getByLabel(m_globalMuonTracks, globalMuonTracks); 00133 00134 edm::ESHandle<Propagator> propagator; 00135 iSetup.get<TrackingComponentsRecord>().get(m_propagator, propagator); 00136 00137 edm::ESHandle<TrackerGeometry> trackerGeometry; 00138 iSetup.get<TrackerDigiGeometryRecord>().get(trackerGeometry); 00139 00140 edm::ESHandle<DTGeometry> dtGeometry; 00141 iSetup.get<MuonGeometryRecord>().get(dtGeometry); 00142 00143 edm::ESHandle<CSCGeometry> cscGeometry; 00144 iSetup.get<MuonGeometryRecord>().get(cscGeometry); 00145 00146 edm::ESHandle<MagneticField> magneticField; 00147 iSetup.get<IdealMagneticFieldRecord>().get(magneticField); 00148 00149 edm::ESHandle<GlobalTrackingGeometry> globalGeometry; 00150 iSetup.get<GlobalTrackingGeometryRecord>().get(globalGeometry); 00151 00152 // Create these factories once per event 00153 TrajectoryStateTransform transformer; 00154 MuonTransientTrackingRecHitBuilder muonTransBuilder; 00155 00156 // Create a collection of Trajectories, to put in the Event 00157 std::auto_ptr<std::vector<Trajectory> > trajectoryCollection(new std::vector<Trajectory>); 00158 00159 // Remember which trajectory is associated with which track 00160 std::map<edm::Ref<std::vector<Trajectory> >::key_type, edm::Ref<reco::TrackCollection>::key_type> reference_map; 00161 edm::Ref<std::vector<Trajectory> >::key_type trajCounter = 0; 00162 00163 for (reco::MuonCollection::const_iterator globalMuon = globalMuons->begin(); globalMuon != globalMuons->end(); ++globalMuon) { 00164 00165 // get the counter for this global muon (that's why we needed to extract the collection explicitly 00166 edm::Ref<reco::TrackCollection>::key_type trackCounter = 0; 00167 reco::TrackCollection::const_iterator globalMuonTrack = globalMuonTracks->begin(); 00168 for (; globalMuonTrack != globalMuonTracks->end(); ++globalMuonTrack) { 00169 trackCounter++; 00170 if (fabs(globalMuon->combinedMuon()->phi() - globalMuonTrack->phi()) < 1e-10 && 00171 fabs(globalMuon->combinedMuon()->eta() - globalMuonTrack->eta()) < 1e-10) break; 00172 } 00173 if (globalMuonTrack == globalMuonTracks->end()) { 00174 throw cms::Exception("BadConfig") << "The tracks label doesn't correspond to the same objects as the muons label" << std::endl; 00175 } 00176 00177 TrajectoryStateOnSurface tracker_tsos; 00178 DetId outerDetId; 00179 if (m_refitTracker) { 00180 std::vector<Trajectory> trackerTrajectories = m_trackTransformer->transform(*globalMuon->track()); 00181 if (trackerTrajectories.size() == 1) { 00182 const Trajectory trackerTrajectory = *(trackerTrajectories.begin()); 00183 00184 // surprisingly, firstMeasurement() corresponds to the outermost state of the tracker 00185 tracker_tsos = trackerTrajectory.firstMeasurement().forwardPredictedState(); 00186 outerDetId = trackerTrajectory.firstMeasurement().recHit()->geographicalId(); 00187 } 00188 else continue; 00189 } 00190 else { 00191 // get information about the outermost tracker hit 00192 GlobalPoint outerPosition(globalMuon->track()->outerPosition().x(), globalMuon->track()->outerPosition().y(), globalMuon->track()->outerPosition().z()); 00193 GlobalVector outerMomentum(globalMuon->track()->outerMomentum().x(), globalMuon->track()->outerMomentum().y(), globalMuon->track()->outerMomentum().z()); 00194 int charge = globalMuon->track()->charge(); 00195 const reco::Track::CovarianceMatrix outerStateCovariance = globalMuon->track()->outerStateCovariance(); 00196 outerDetId = DetId(globalMuon->track()->outerDetId()); 00197 00198 // construct the information necessary to make a TrajectoryStateOnSurface 00199 GlobalTrajectoryParameters globalTrajParams(outerPosition, outerMomentum, charge, &(*magneticField)); 00200 CurvilinearTrajectoryError curviError(outerStateCovariance); 00201 FreeTrajectoryState tracker_state(globalTrajParams, curviError); 00202 00203 // starting point for propagation into the muon system 00204 tracker_tsos = TrajectoryStateOnSurface(globalTrajParams, curviError, trackerGeometry->idToDet(outerDetId)->surface()); 00205 } 00206 00207 TrajectoryStateOnSurface last_tsos = tracker_tsos; 00208 00209 // loop over the muon hits, keeping track of the successful extrapolations 00210 edm::OwnVector<TrackingRecHit> muonHits; 00211 std::vector<TrajectoryStateOnSurface> TSOSes; 00212 for (trackingRecHit_iterator hit = globalMuon->combinedMuon()->recHitsBegin(); hit != globalMuon->combinedMuon()->recHitsEnd(); ++hit) { 00213 DetId id = (*hit)->geographicalId(); 00214 00215 TrajectoryStateOnSurface extrapolation; 00216 bool extrapolated = false; 00217 if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::DT) { 00218 extrapolation = propagator->propagate(last_tsos, dtGeometry->idToDet(id)->surface()); 00219 extrapolated = true; 00220 } 00221 else if (id.det() == DetId::Muon && id.subdetId() == MuonSubdetId::CSC) { 00222 extrapolation = propagator->propagate(last_tsos, cscGeometry->idToDet(id)->surface()); 00223 extrapolated = true; 00224 } 00225 00226 if (extrapolated && extrapolation.isValid()) { 00227 muonHits.push_back((*hit)->clone()); 00228 TSOSes.push_back(extrapolation); 00229 } 00230 } // end loop over standAloneMuon hits 00231 00232 // if it has any successful extrapolations, make them into a Trajectory 00233 if (muonHits.size() > 0) { 00234 PTrajectoryStateOnDet *PTraj = transformer.persistentState(tracker_tsos, outerDetId.rawId()); 00235 TrajectorySeed trajectorySeed(*PTraj, muonHits, alongMomentum); 00236 Trajectory trajectory(trajectorySeed, alongMomentum); 00237 00238 for (unsigned int i = 0; i < muonHits.size(); i++) { 00239 TrajectoryMeasurement::ConstRecHitPointer hitPtr(muonTransBuilder.build(&(muonHits[i]), globalGeometry)); 00240 TrajectoryStateOnSurface TSOS = TSOSes[i]; 00241 trajectory.push(TrajectoryMeasurement(TSOS, TSOS, TSOS, hitPtr)); 00242 } // end filling Trajectory 00243 00244 trajectoryCollection->push_back(trajectory); 00245 00246 // Remember which Trajectory is associated with which Track 00247 trajCounter++; 00248 reference_map[trajCounter] = trackCounter; 00249 00250 } // end if we have some good extrapolations 00251 00252 } // end loop over globalMuons 00253 00254 unsigned int numTrajectories = trajectoryCollection->size(); 00255 00256 // insert the trajectories into the Event 00257 edm::OrphanHandle<std::vector<Trajectory> > ohTrajs = iEvent.put(trajectoryCollection); 00258 00259 // create the trajectory <-> track association map 00260 std::auto_ptr<TrajTrackAssociationCollection> trajTrackMap(new TrajTrackAssociationCollection()); 00261 00262 for (trajCounter = 0; trajCounter < numTrajectories; trajCounter++) { 00263 edm::Ref<reco::TrackCollection>::key_type trackCounter = reference_map[trajCounter]; 00264 00265 trajTrackMap->insert(edm::Ref<std::vector<Trajectory> >(ohTrajs, trajCounter), edm::Ref<reco::TrackCollection>(globalMuonTracks, trackCounter)); 00266 } 00267 // and put it in the Event, also 00268 iEvent.put(trajTrackMap); 00269 }
Definition at line 75 of file TrackerToMuonPropagator.cc.
Referenced by produce(), and TrackerToMuonPropagator().
Definition at line 75 of file TrackerToMuonPropagator.cc.
Referenced by produce(), and TrackerToMuonPropagator().
std::string TrackerToMuonPropagator::m_propagator [private] |
Definition at line 76 of file TrackerToMuonPropagator.cc.
Referenced by produce(), and TrackerToMuonPropagator().
bool TrackerToMuonPropagator::m_refitTracker [private] |
Definition at line 78 of file TrackerToMuonPropagator.cc.
Referenced by produce(), and TrackerToMuonPropagator().
Definition at line 79 of file TrackerToMuonPropagator.cc.
Referenced by produce(), and TrackerToMuonPropagator().