CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoPixelVertexing/PixelTrackFitting/src/PixelTrackReconstruction.cc

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   //Retrieve tracker topology from geometry
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     // producing tracks
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       // fitting
00131       reco::Track* track = theFitter->run( ev, es, hits, region);
00132       if (!track) continue;
00133 
00134       // decide if track should be skipped according to filter
00135       if (theFilter && !(*theFilter)(track, hits) ) {
00136         delete track;
00137         continue;
00138       }
00139 
00140       // add tracks
00141       tracks.push_back(TrackWithTTRHs(track, tuplet));
00142     }
00143     theGenerator->clear();
00144   }
00145 
00146   // skip ovelrapped tracks
00147   if (theCleaner) tracks = PixelTrackCleanerWrapper(theCleaner).clean(tracks,tTopo);
00148 
00149   // clean memory
00150   for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) delete (*ir);
00151 }