00001 #include "TSGFromL1Muon.h"
00002
00003 #include "FWCore/Framework/interface/Event.h"
00004 #include "FWCore/Framework/interface/EventSetup.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "FWCore/Framework/interface/ESHandle.h"
00007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00008
00009 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGeneratorFactory.h"
00010 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGenerator.h"
00011
00012 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitter.h"
00013 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterFactory.h"
00014 #include "RecoMuon/TrackerSeedGenerator/interface/L1MuonPixelTrackFitter.h"
00015 #include "RecoMuon/TrackerSeedGenerator/interface/L1MuonSeedsMerger.h"
00016
00017 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h"
00018 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h"
00019 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducerFactory.h"
00020 #include "RecoMuon/TrackerSeedGenerator/interface/L1MuonRegionProducer.h"
00021
00022 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackFilter.h"
00023 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackFilterFactory.h"
00024
00025 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleaner.h"
00026 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleanerFactory.h"
00027
00028 #include "DataFormats/TrackReco/interface/Track.h"
00029 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00030
00031 #include "RecoTracker/TkSeedGenerator/interface/SeedFromProtoTrack.h"
00032 #include "RecoTracker/TkSeedGenerator/interface/SeedFromConsecutiveHits.h"
00033 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00034
00035 #include <vector>
00036
00037 #include "DataFormats/L1Trigger/interface/L1MuonParticle.h"
00038 #include "DataFormats/L1Trigger/interface/L1MuonParticleFwd.h"
00039 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00040 #include "DataFormats/MuonSeed/interface/L3MuonTrajectorySeedCollection.h"
00041
00042 using namespace reco;
00043 using namespace ctfseeding;
00044 using namespace l1extra;
00045
00046 template <class T> T sqr( T t) {return t*t;}
00047
00048
00049 TSGFromL1Muon::TSGFromL1Muon(const edm::ParameterSet& cfg)
00050 : theConfig(cfg),theRegionProducer(0),theHitGenerator(0),theFitter(0),theFilter(0),theMerger(0)
00051 {
00052 produces<L3MuonTrajectorySeedCollection>();
00053 theSourceTag = cfg.getParameter<edm::InputTag>("L1MuonLabel");
00054 }
00055
00056 TSGFromL1Muon::~TSGFromL1Muon()
00057 {
00058 delete theMerger;
00059 delete theFilter;
00060 delete theFitter;
00061 delete theHitGenerator;
00062 delete theRegionProducer;
00063 }
00064
00065 void TSGFromL1Muon::beginJob(const edm::EventSetup& es)
00066 {
00067 edm::ParameterSet regfactoryPSet = theConfig.getParameter<edm::ParameterSet>("RegionFactoryPSet");
00068 std::string regfactoryName = regfactoryPSet.getParameter<std::string>("ComponentName");
00069 TrackingRegionProducer * p =
00070 TrackingRegionProducerFactory::get()->create(regfactoryName,regfactoryPSet);
00071 theRegionProducer = dynamic_cast<L1MuonRegionProducer* >(p);
00072
00073 edm::ParameterSet hitsfactoryPSet =
00074 theConfig.getParameter<edm::ParameterSet>("OrderedHitsFactoryPSet");
00075 std::string hitsfactoryName = hitsfactoryPSet.getParameter<std::string>("ComponentName");
00076 theHitGenerator = OrderedHitsGeneratorFactory::get()->create( hitsfactoryName, hitsfactoryPSet);
00077
00078 edm::ParameterSet fitterPSet = theConfig.getParameter<edm::ParameterSet>("FitterPSet");
00079 std::string fitterName = fitterPSet.getParameter<std::string>("ComponentName");
00080 PixelFitter * f = PixelFitterFactory::get()->create( fitterName, fitterPSet);
00081 theFitter = dynamic_cast<L1MuonPixelTrackFitter* >(f);
00082
00083 edm::ParameterSet filterPSet = theConfig.getParameter<edm::ParameterSet>("FilterPSet");
00084 std::string filterName = filterPSet.getParameter<std::string>("ComponentName");
00085 theFilter = PixelTrackFilterFactory::get()->create( filterName, filterPSet);
00086
00087 edm::ParameterSet cleanerPSet = theConfig.getParameter<edm::ParameterSet>("CleanerPSet");
00088 std::string cleanerName = cleanerPSet.getParameter<std::string>("ComponentName");
00089
00090 theMerger = new L1MuonSeedsMerger(cleanerPSet);
00091 }
00092
00093
00094 void TSGFromL1Muon::produce(edm::Event& ev, const edm::EventSetup& es)
00095 {
00096 std::auto_ptr<L3MuonTrajectorySeedCollection> result(new L3MuonTrajectorySeedCollection());
00097
00098 edm::Handle<L1MuonParticleCollection> l1muon;
00099 ev.getByLabel(theSourceTag, l1muon);
00100
00101 LogDebug("TSGFromL1Muon")<<l1muon->size()<<" l1 muons to seed from.";
00102
00103 L1MuonParticleCollection::const_iterator muItr = l1muon->begin();
00104 L1MuonParticleCollection::const_iterator muEnd = l1muon->end();
00105 for ( size_t iL1 = 0; muItr < muEnd; ++muItr, ++iL1) {
00106
00107 if (muItr->gmtMuonCand().empty()) continue;
00108
00109 const L1MuGMTCand & muon = muItr->gmtMuonCand();
00110 l1extra::L1MuonParticleRef l1Ref(l1muon, iL1);
00111
00112 theRegionProducer->setL1Constraint(muon);
00113 theFitter->setL1Constraint(muon);
00114
00115 typedef std::vector<TrackingRegion * > Regions;
00116 Regions regions = theRegionProducer->regions(ev,es);
00117 for (Regions::const_iterator ir=regions.begin(); ir != regions.end(); ++ir) {
00118
00119 L1MuonSeedsMerger::TracksAndHits tracks;
00120 const TrackingRegion & region = **ir;
00121 const OrderedSeedingHits & candidates = theHitGenerator->run(region,ev,es);
00122
00123 unsigned int nSets = candidates.size();
00124 for (unsigned int ic= 0; ic <nSets; ic++) {
00125
00126 const std::vector<ctfseeding::SeedingHit>& hits = candidates[ic].hits();
00127 std::vector<const TrackingRecHit *> trh;
00128 for (unsigned int i= 0, nHits = hits.size(); i< nHits; ++i) trh.push_back( hits[i] );
00129
00130 theFitter->setPxConstraint(hits);
00131 reco::Track* track = theFitter->run(es, trh, region);
00132 if (!track) continue;
00133
00134 if (!(*theFilter)(track) ) { delete track; continue; }
00135 tracks.push_back(L1MuonSeedsMerger::TrackAndHits(track, hits));
00136 }
00137
00138 if(theMerger) theMerger->resolve(tracks);
00139 for (L1MuonSeedsMerger::TracksAndHits::const_iterator it = tracks.begin();
00140 it != tracks.end(); ++it) {
00141
00142 SeedFromProtoTrack seed( *(it->first), it->second, es);
00143 if (seed.isValid()) (*result).push_back(L3MuonTrajectorySeed(seed.trajectorySeed(),l1Ref));
00144
00145
00146
00147
00148
00149 delete it->first;
00150 }
00151 }
00152 for (Regions::const_iterator it=regions.begin(); it != regions.end(); ++it) delete (*it);
00153 }
00154
00155 LogDebug("TSGFromL1Muon")<<result->size()<<" seeds to the event.";
00156 ev.put(result);
00157 }
00158