CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_5/src/RecoTracker/TkSeedGenerator/plugins/SeedGeneratorFromRegionHitsEDProducer.cc

Go to the documentation of this file.
00001 #include "SeedGeneratorFromRegionHitsEDProducer.h"
00002 
00003 #include "FWCore/Framework/interface/Event.h"
00004 #include "FWCore/Framework/interface/EventSetup.h"
00005 
00006 #include "DataFormats/TrajectorySeed/interface/TrajectorySeedCollection.h"
00007 
00008 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducerFactory.h"
00009 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegionProducer.h"
00010 #include "RecoTracker/TkTrackingRegions/interface/TrackingRegion.h"
00011 
00012 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGeneratorFactory.h"
00013 #include "RecoTracker/TkTrackingRegions/interface/OrderedHitsGenerator.h"
00014 
00015 #include "RecoTracker/TkSeedingLayers/interface/SeedComparitorFactory.h"
00016 #include "RecoTracker/TkSeedingLayers/interface/SeedComparitor.h"
00017 
00018 #include "RecoTracker/TkSeedGenerator/interface/SeedCreatorFactory.h"
00019 #include "RecoTracker/TkSeedGenerator/interface/SeedCreator.h"
00020 
00021 #include "RecoTracker/TkSeedGenerator/interface/SeedGeneratorFromRegionHits.h"
00022 #include "RecoPixelVertexing/PixelTriplets/interface/QuadrupletSeedMerger.h"
00023 
00024 
00025 SeedGeneratorFromRegionHitsEDProducer::SeedGeneratorFromRegionHitsEDProducer(
00026     const edm::ParameterSet& cfg) 
00027   : theConfig(cfg), theGenerator(0), theRegionProducer(0),
00028     theClusterCheck(cfg.getParameter<edm::ParameterSet>("ClusterCheckPSet")),
00029     theMerger_(0)
00030 {
00031   theSilentOnClusterCheck = cfg.getParameter<edm::ParameterSet>("ClusterCheckPSet").getUntrackedParameter<bool>("silentClusterCheck",false);
00032 
00033   moduleName = cfg.getParameter<std::string>("@module_label");
00034 
00035   // seed merger & its settings
00036   if ( cfg.exists("SeedMergerPSet")) {
00037     edm::ParameterSet mergerPSet = theConfig.getParameter<edm::ParameterSet>( "SeedMergerPSet" );
00038     theMerger_=new QuadrupletSeedMerger();
00039     theMerger_->setTTRHBuilderLabel( mergerPSet.getParameter<std::string>( "ttrhBuilderLabel" ) );
00040     theMerger_->setMergeTriplets( mergerPSet.getParameter<bool>( "mergeTriplets" ) );
00041     theMerger_->setAddRemainingTriplets( mergerPSet.getParameter<bool>( "addRemainingTriplets" ) );
00042     theMerger_->setLayerListName( mergerPSet.getParameter<std::string>( "layerListName" ) );
00043   }
00044 
00045   produces<TrajectorySeedCollection>();
00046 }
00047 
00048 SeedGeneratorFromRegionHitsEDProducer::~SeedGeneratorFromRegionHitsEDProducer()
00049 {
00050 }
00051 
00052 void SeedGeneratorFromRegionHitsEDProducer::endRun(edm::Run const&run, const edm::EventSetup& es) {
00053   delete theRegionProducer;
00054   delete theGenerator;
00055 }
00056 
00057 void SeedGeneratorFromRegionHitsEDProducer::beginRun(edm::Run const&run, const edm::EventSetup& es)
00058 {
00059   edm::ParameterSet regfactoryPSet = 
00060       theConfig.getParameter<edm::ParameterSet>("RegionFactoryPSet");
00061   std::string regfactoryName = regfactoryPSet.getParameter<std::string>("ComponentName");
00062   theRegionProducer = TrackingRegionProducerFactory::get()->create(regfactoryName,regfactoryPSet);
00063 
00064   edm::ParameterSet hitsfactoryPSet = 
00065       theConfig.getParameter<edm::ParameterSet>("OrderedHitsFactoryPSet");
00066   std::string hitsfactoryName = hitsfactoryPSet.getParameter<std::string>("ComponentName");
00067   OrderedHitsGenerator*  hitsGenerator = 
00068       OrderedHitsGeneratorFactory::get()->create( hitsfactoryName, hitsfactoryPSet);
00069 
00070   edm::ParameterSet comparitorPSet =
00071       theConfig.getParameter<edm::ParameterSet>("SeedComparitorPSet");
00072   std::string comparitorName = comparitorPSet.getParameter<std::string>("ComponentName");
00073   SeedComparitor * aComparitor = (comparitorName == "none") ? 
00074       0 :  SeedComparitorFactory::get()->create( comparitorName, comparitorPSet);   
00075 
00076   edm::ParameterSet creatorPSet =
00077       theConfig.getParameter<edm::ParameterSet>("SeedCreatorPSet");
00078   std::string creatorName = creatorPSet.getParameter<std::string>("ComponentName");
00079   SeedCreator * aCreator = SeedCreatorFactory::get()->create( creatorName, creatorPSet);
00080 
00081   theGenerator = new SeedGeneratorFromRegionHits(hitsGenerator, aComparitor, aCreator); 
00082  
00083 }
00084 
00085 void SeedGeneratorFromRegionHitsEDProducer::produce(edm::Event& ev, const edm::EventSetup& es)
00086 {
00087   std::auto_ptr<TrajectorySeedCollection> triplets(new TrajectorySeedCollection());
00088   std::auto_ptr<TrajectorySeedCollection> quadruplets( new TrajectorySeedCollection() );
00089 
00090   //protection for big ass events...
00091   size_t clustsOrZero = theClusterCheck.tooManyClusters(ev);
00092   if (clustsOrZero){
00093     if (!theSilentOnClusterCheck)
00094         edm::LogError("TooManyClusters") << "Found too many clusters (" << clustsOrZero << "), bailing out.\n";
00095     ev.put(triplets);
00096     return ;
00097   }
00098 
00099   typedef std::vector<TrackingRegion* > Regions;
00100   typedef Regions::const_iterator IR;
00101   Regions regions = theRegionProducer->regions(ev,es);
00102   if (theMerger_!=0)
00103     theMerger_->update(es);
00104 
00105   for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) {
00106     const TrackingRegion & region = **ir;
00107 
00108     // make job
00109     theGenerator->run(*triplets, region, ev,es);
00110     // std::cout << "created seeds for " << moduleName << " " << triplets->size() << std::endl;
00111 
00112 
00113     // make quadruplets
00114     // (TODO: can partly be propagated to the merger)
00115     if ( theMerger_ !=0 ) {
00116       TrajectorySeedCollection const& tempQuads = theMerger_->mergeTriplets( *triplets, region, es, theConfig ); //@@
00117       for( TrajectorySeedCollection::const_iterator qIt = tempQuads.begin(); qIt < tempQuads.end(); ++qIt ) {
00118         quadruplets->push_back( *qIt );
00119       }
00120     }
00121   }
00122  
00123   // clear memory
00124   for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) delete (*ir);
00125 
00126   // put to event
00127   if ( theMerger_!=0)
00128     ev.put(quadruplets);
00129   else
00130     ev.put(triplets);
00131 }