CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/RecoMuon/MuonIdentification/plugins/TrajectorySeedFromMuonProducer.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 // $Id: TrajectorySeedFromMuonProducer.cc,v 1.1 2010/06/22 13:19:57 dmytro Exp $
00003 //
00004 // Authors: Y.Gao (FNAL)
00005 //
00006 // system include files
00007 #include <memory>
00008 
00009 // user include files
00010 #include "FWCore/Framework/interface/Frameworkfwd.h"
00011 #include "FWCore/Framework/interface/EDProducer.h"
00012 #include "FWCore/Framework/interface/Event.h"
00013 #include "FWCore/Framework/interface/ESHandle.h"
00014 #include "FWCore/Framework/interface/EventSetup.h"
00015 #include "FWCore/Framework/interface/MakerMacros.h"
00016 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00017 
00018 // related to reco::Track
00019 #include "DataFormats/TrackReco/interface/Track.h"
00020 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00021 
00022 // related to reco::Muon
00023 #include "DataFormats/MuonReco/interface/Muon.h"
00024 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00025 
00026 // TrajectorSeed Related
00027 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
00028 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00029 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00030 
00031 // TrajectorSeed Related
00032 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
00033 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00034 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00035 #include "MagneticField/Engine/interface/MagneticField.h"
00036 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00037 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
00038 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00039 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00040 
00041 #include "Geometry/CommonDetUnit/interface/GlobalTrackingGeometry.h"
00042 #include "Geometry/Records/interface/GlobalTrackingGeometryRecord.h"
00043 #include "TrackingTools/PatternTools/interface/TrajectoryMeasurement.h"
00044 #include "DataFormats/TrajectorySeed/interface/PropagationDirection.h"
00045 
00046 #include "RecoMuon/MuonIdentification/interface/MuonCosmicsId.h"
00047 
00048 class TrajectorySeedFromMuonProducer : public edm::EDProducer
00049 {
00050 
00051 public:
00052     explicit TrajectorySeedFromMuonProducer( const edm::ParameterSet & );   
00053     virtual void produce(edm::Event&, const edm::EventSetup&);
00054 
00055 private:
00056     edm::InputTag  muonCollectionTag_;
00057     edm::InputTag  trackCollectionTag_;
00058     bool           skipMatchedMuons_;
00059 };
00060 
00061 TrajectorySeedFromMuonProducer::TrajectorySeedFromMuonProducer(const edm::ParameterSet & iConfig)
00062 {
00063   muonCollectionTag_  = iConfig.getParameter<edm::InputTag>("muonCollectionTag");
00064   trackCollectionTag_ = iConfig.getParameter<edm::InputTag>("trackCollectionTag");
00065   skipMatchedMuons_   = iConfig.getParameter<bool>("skipMatchedMuons");
00066   produces<TrajectorySeedCollection>();
00067 }
00068 
00069 
00070 void TrajectorySeedFromMuonProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup)
00071 {
00072   using namespace edm;
00073   using namespace reco;
00074   using namespace std;
00075 
00076   // Product
00077   std::auto_ptr<TrajectorySeedCollection> result(new TrajectorySeedCollection());
00078   
00079   edm::ESHandle<MagneticField> magneticField;
00080   iSetup.get<IdealMagneticFieldRecord>().get(magneticField);
00081   
00082   edm::ESHandle<TrackerGeometry> trackerGeometry;
00083   iSetup.get<TrackerDigiGeometryRecord>().get(trackerGeometry);
00084   
00085   TrajectoryStateTransform transformer;
00086   
00087   edm::Handle<edm::View<Muon> > muonCollectionHandle;
00088   iEvent.getByLabel(muonCollectionTag_, muonCollectionHandle);
00089   
00090   edm::Handle<reco::TrackCollection> trackCollectionHandle;
00091   iEvent.getByLabel(trackCollectionTag_, trackCollectionHandle);
00092 
00093   // Loop over the muon track
00094   for (edm::View<Muon>::const_iterator muon = muonCollectionHandle->begin();  muon != muonCollectionHandle->end(); ++muon) {
00095     // muon must have a tracker track
00096     if( muon->innerTrack().isNull() ) continue;
00097     edm::RefToBase<reco::Track> track(muon->innerTrack());
00098     // check if there is a back-to-back track
00099     if( skipMatchedMuons_ &&
00100         muonid::findOppositeTrack(trackCollectionHandle, *track).isNonnull() ) continue;
00101     if( (!track->innerOk()) || (!track->recHit(0)->isValid())) continue;
00102     GlobalPoint innerPosition(track->innerPosition().x(), track->innerPosition().y(), track->innerPosition().z());
00103     GlobalVector innerMomentum(track->innerMomentum().x(), track->innerMomentum().y(), track->innerMomentum().z());
00104     int charge = track->charge();
00105     const reco::Track::CovarianceMatrix innerStateCovariance = track->innerStateCovariance();
00106     DetId innerDetId = DetId(track->innerDetId());
00107     // Construct the information necessary to make a TrajectoryStateOnSurface
00108     GlobalTrajectoryParameters globalTrajParams(innerPosition, innerMomentum, charge, &(*magneticField));
00109     CurvilinearTrajectoryError curviError(innerStateCovariance);
00110     FreeTrajectoryState tracker_state(globalTrajParams, curviError);
00111     LogTrace("MuonIdentification") << "Track Inner FTS: "<<tracker_state;
00112     
00113     TrajectoryStateOnSurface tracker_tsos  = TrajectoryStateOnSurface(globalTrajParams, curviError, trackerGeometry->idToDet(innerDetId)->surface());
00114     
00115     // Make Hits, push back the innermost Hit
00116     edm::OwnVector<TrackingRecHit> trackHits;
00117     trackHits.push_back(track->recHit(0)->clone() );
00118     
00119     // Make TrajectorySeed
00120     PTrajectoryStateOnDet *PTraj = transformer.persistentState(tracker_tsos, innerDetId.rawId());
00121     TrajectorySeed trajectorySeed(*PTraj, trackHits, oppositeToMomentum);
00122     LogTrace("MuonIdentification")<<"Trajectory Seed Direction: "<< trajectorySeed.direction()<<endl;
00123     result->push_back(trajectorySeed);
00124   }
00125   
00126   iEvent.put(result);
00127 
00128 }
00129 
00130 DEFINE_FWK_MODULE(TrajectorySeedFromMuonProducer);