Go to the documentation of this file.00001 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackReconstruction.h"
00002
00003 #include "FWCore/Framework/interface/Event.h"
00004 #include "FWCore/Framework/interface/EventSetup.h"
00005 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00006
00007 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGenerator.h"
00008 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGeneratorFactory.h"
00009
00010 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h"
00011 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h"
00012 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducerFactory.h"
00013
00014 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitter.h"
00015 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelFitterFactory.h"
00016
00017 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackFilter.h"
00018 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackFilterFactory.h"
00019
00020 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleaner.h"
00021 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleanerFactory.h"
00022 #include "RecoPixelVertexing/PixelTrackFitting/interface/PixelTrackCleanerWrapper.h"
00023
00024 #include "DataFormats/TrackReco/interface/Track.h"
00025 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00026 #include "DataFormats/TrackReco/interface/TrackExtra.h"
00027
00028 #include "RecoPixelVertexing/PixelTriplets/interface/QuadrupletSeedMerger.h"
00029
00030 #include <vector>
00031
00032 using namespace pixeltrackfitting;
00033 using namespace ctfseeding;
00034 using edm::ParameterSet;
00035
00036 PixelTrackReconstruction::PixelTrackReconstruction(const ParameterSet& cfg)
00037 : theConfig(cfg), theFitter(0), theFilter(0), theCleaner(0), theGenerator(0), theRegionProducer(0), theMerger_(0)
00038 {
00039 if ( cfg.exists("SeedMergerPSet") ) {
00040 edm::ParameterSet mergerPSet = theConfig.getParameter<edm::ParameterSet>( "SeedMergerPSet" );
00041 std::string seedmergerTTRHBuilderLabel = mergerPSet.getParameter<std::string>( "ttrhBuilderLabel" );
00042 std::string seedmergerLayerListName = mergerPSet.getParameter<std::string>( "layerListName" );
00043 bool seedmergerAddTriplets = mergerPSet.getParameter<bool>( "addRemainingTriplets" );
00044 bool seedmergerMergeTriplets = mergerPSet.getParameter<bool>( "mergeTriplets" );
00045 theMerger_ = new QuadrupletSeedMerger();
00046 theMerger_->setMergeTriplets( seedmergerMergeTriplets );
00047 theMerger_->setAddRemainingTriplets( seedmergerAddTriplets );
00048 theMerger_->setTTRHBuilderLabel( seedmergerTTRHBuilderLabel );
00049 theMerger_->setLayerListName( seedmergerLayerListName );
00050 }
00051 }
00052
00053 PixelTrackReconstruction::~PixelTrackReconstruction()
00054 {
00055 halt();
00056 }
00057
00058 void PixelTrackReconstruction::halt()
00059 {
00060 delete theFilter; theFilter=0;
00061 delete theFitter; theFitter=0;
00062 delete theCleaner; theCleaner=0;
00063 delete theGenerator; theGenerator=0;
00064 delete theRegionProducer; theRegionProducer=0;
00065 delete theMerger_; theMerger_=0;
00066 }
00067
00068 void PixelTrackReconstruction::init(const edm::EventSetup& es)
00069 {
00070 ParameterSet regfactoryPSet = theConfig.getParameter<ParameterSet>("RegionFactoryPSet");
00071 std::string regfactoryName = regfactoryPSet.getParameter<std::string>("ComponentName");
00072 theRegionProducer = TrackingRegionProducerFactory::get()->create(regfactoryName,regfactoryPSet);
00073
00074 ParameterSet orderedPSet =
00075 theConfig.getParameter<ParameterSet>("OrderedHitsFactoryPSet");
00076 std::string orderedName = orderedPSet.getParameter<std::string>("ComponentName");
00077 theGenerator = OrderedHitsGeneratorFactory::get()->create( orderedName, orderedPSet);
00078
00079 ParameterSet fitterPSet = theConfig.getParameter<ParameterSet>("FitterPSet");
00080 std::string fitterName = fitterPSet.getParameter<std::string>("ComponentName");
00081 theFitter = PixelFitterFactory::get()->create( fitterName, fitterPSet);
00082
00083 ParameterSet filterPSet = theConfig.getParameter<ParameterSet>("FilterPSet");
00084 std::string filterName = filterPSet.getParameter<std::string>("ComponentName");
00085 if (filterName != "none") {
00086 theFilter = theConfig.getParameter<bool>("useFilterWithES") ?
00087 PixelTrackFilterWithESFactory::get()->create( filterName, filterPSet, es) :
00088 PixelTrackFilterFactory::get()->create( filterName, filterPSet);
00089 }
00090
00091 ParameterSet cleanerPSet = theConfig.getParameter<ParameterSet>("CleanerPSet");
00092 std::string cleanerName = cleanerPSet.getParameter<std::string>("ComponentName");
00093 if (cleanerName != "none") theCleaner = PixelTrackCleanerFactory::get()->create( cleanerName, cleanerPSet);
00094
00095 if ( theMerger_ !=0 ) {
00096 theMerger_->update( es );
00097 }
00098 }
00099
00100 void PixelTrackReconstruction::run(TracksWithTTRHs& tracks, edm::Event& ev, const edm::EventSetup& es)
00101 {
00102 typedef std::vector<TrackingRegion* > Regions;
00103 typedef Regions::const_iterator IR;
00104 Regions regions = theRegionProducer->regions(ev,es);
00105
00106
00107 edm::ESHandle<TrackerTopology> tTopoHand;
00108 es.get<IdealGeometryRecord>().get(tTopoHand);
00109 const TrackerTopology *tTopo=tTopoHand.product();
00110
00111 if (theFilter) theFilter->update(ev);
00112
00113 for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) {
00114 const TrackingRegion & region = **ir;
00115
00116 const OrderedSeedingHits & triplets = theGenerator->run(region,ev,es);
00117 const OrderedSeedingHits &tuplets= (theMerger_==0)? triplets : theMerger_->mergeTriplets( triplets, es );
00118
00119 unsigned int nTuplets = tuplets.size();
00120 tracks.reserve(tracks.size()+nTuplets);
00121
00122 for (unsigned int iTuplet = 0; iTuplet < nTuplets; ++iTuplet) {
00123 const SeedingHitSet & tuplet = tuplets[iTuplet];
00124
00125 std::vector<const TrackingRecHit *> hits;
00126 for (unsigned int iHit = 0, nHits = tuplet.size(); iHit < nHits; ++iHit) {
00127 hits.push_back( tuplet[iHit]->hit() );
00128 }
00129
00130
00131 reco::Track* track = theFitter->run( ev, es, hits, region);
00132 if (!track) continue;
00133
00134
00135 if (theFilter && !(*theFilter)(track, hits) ) {
00136 delete track;
00137 continue;
00138 }
00139
00140
00141 tracks.push_back(TrackWithTTRHs(track, tuplet));
00142 }
00143 theGenerator->clear();
00144 }
00145
00146
00147 if (theCleaner) tracks = PixelTrackCleanerWrapper(theCleaner).clean(tracks,tTopo);
00148
00149
00150 for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) delete (*ir);
00151 }