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 if (theFilter) theFilter->update(ev);
00107
00108 for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) {
00109 const TrackingRegion & region = **ir;
00110
00111 const OrderedSeedingHits & triplets = theGenerator->run(region,ev,es);
00112 const OrderedSeedingHits &tuplets= (theMerger_==0)? triplets : theMerger_->mergeTriplets( triplets, es );
00113
00114 unsigned int nTuplets = tuplets.size();
00115 tracks.reserve(tracks.size()+nTuplets);
00116
00117 for (unsigned int iTuplet = 0; iTuplet < nTuplets; ++iTuplet) {
00118 const SeedingHitSet & tuplet = tuplets[iTuplet];
00119
00120 std::vector<const TrackingRecHit *> hits;
00121 for (unsigned int iHit = 0, nHits = tuplet.size(); iHit < nHits; ++iHit) {
00122 hits.push_back( tuplet[iHit]->hit() );
00123 }
00124
00125
00126 reco::Track* track = theFitter->run( ev, es, hits, region);
00127 if (!track) continue;
00128
00129
00130 if (theFilter && !(*theFilter)(track, hits) ) {
00131 delete track;
00132 continue;
00133 }
00134
00135
00136 tracks.push_back(TrackWithTTRHs(track, tuplet));
00137 }
00138 theGenerator->clear();
00139 }
00140
00141
00142 if (theCleaner) tracks = PixelTrackCleanerWrapper(theCleaner).clean(tracks);
00143
00144
00145 for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) delete (*ir);
00146 }