CMS 3D CMS Logo

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