CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_6_1_2_SLHC2/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 SeedGeneratorFromRegionHitsEDProducer::SeedGeneratorFromRegionHitsEDProducer(
00025     const edm::ParameterSet& cfg) 
00026   : theConfig(cfg), theGenerator(0), theRegionProducer(0),
00027     theClusterCheck(cfg.getParameter<edm::ParameterSet>("ClusterCheckPSet")),
00028     theMerger_(0)
00029 {
00030   theSilentOnClusterCheck = cfg.getParameter<edm::ParameterSet>("ClusterCheckPSet").getUntrackedParameter<bool>("silentClusterCheck",false);
00031 
00032   // seed merger & its settings
00033   if ( cfg.exists("SeedMergerPSet")) {
00034     edm::ParameterSet mergerPSet = theConfig.getParameter<edm::ParameterSet>( "SeedMergerPSet" );
00035     theMerger_=new QuadrupletSeedMerger();
00036     theMerger_->setTTRHBuilderLabel( mergerPSet.getParameter<std::string>( "ttrhBuilderLabel" ) );
00037     theMerger_->setMergeTriplets( mergerPSet.getParameter<bool>( "mergeTriplets" ) );
00038     theMerger_->setAddRemainingTriplets( mergerPSet.getParameter<bool>( "addRemainingTriplets" ) );
00039     theMerger_->setLayerListName( mergerPSet.getParameter<std::string>( "layerListName" ) );
00040   }
00041 
00042   produces<TrajectorySeedCollection>();
00043 }
00044 
00045 SeedGeneratorFromRegionHitsEDProducer::~SeedGeneratorFromRegionHitsEDProducer()
00046 {
00047 }
00048 
00049 void SeedGeneratorFromRegionHitsEDProducer::endRun(edm::Run &run, const edm::EventSetup& es) {
00050   delete theRegionProducer;
00051   delete theGenerator;
00052 }
00053 
00054 void SeedGeneratorFromRegionHitsEDProducer::beginRun(edm::Run &run, const edm::EventSetup& es)
00055 {
00056   edm::ParameterSet regfactoryPSet = 
00057       theConfig.getParameter<edm::ParameterSet>("RegionFactoryPSet");
00058   std::string regfactoryName = regfactoryPSet.getParameter<std::string>("ComponentName");
00059   theRegionProducer = TrackingRegionProducerFactory::get()->create(regfactoryName,regfactoryPSet);
00060 
00061   edm::ParameterSet hitsfactoryPSet = 
00062       theConfig.getParameter<edm::ParameterSet>("OrderedHitsFactoryPSet");
00063   std::string hitsfactoryName = hitsfactoryPSet.getParameter<std::string>("ComponentName");
00064   OrderedHitsGenerator*  hitsGenerator = 
00065       OrderedHitsGeneratorFactory::get()->create( hitsfactoryName, hitsfactoryPSet);
00066 
00067   edm::ParameterSet comparitorPSet =
00068       theConfig.getParameter<edm::ParameterSet>("SeedComparitorPSet");
00069   std::string comparitorName = comparitorPSet.getParameter<std::string>("ComponentName");
00070   SeedComparitor * aComparitor = (comparitorName == "none") ? 
00071       0 :  SeedComparitorFactory::get()->create( comparitorName, comparitorPSet);   
00072 
00073   edm::ParameterSet creatorPSet =
00074       theConfig.getParameter<edm::ParameterSet>("SeedCreatorPSet");
00075   std::string creatorName = creatorPSet.getParameter<std::string>("ComponentName");
00076   SeedCreator * aCreator = SeedCreatorFactory::get()->create( creatorName, creatorPSet);
00077 
00078   theGenerator = new SeedGeneratorFromRegionHits(hitsGenerator, aComparitor, aCreator); 
00079  
00080 }
00081 
00082 void SeedGeneratorFromRegionHitsEDProducer::produce(edm::Event& ev, const edm::EventSetup& es)
00083 {
00084   std::auto_ptr<TrajectorySeedCollection> triplets(new TrajectorySeedCollection());
00085   std::auto_ptr<TrajectorySeedCollection> quadruplets( new TrajectorySeedCollection() );
00086 
00087   //protection for big ass events...
00088   size_t clustsOrZero = theClusterCheck.tooManyClusters(ev);
00089   if (clustsOrZero){
00090     if (!theSilentOnClusterCheck)
00091         edm::LogError("TooManyClusters") << "Found too many clusters (" << clustsOrZero << "), bailing out.\n";
00092     ev.put(triplets);
00093     return ;
00094   }
00095 
00096   typedef std::vector<TrackingRegion* > Regions;
00097   typedef Regions::const_iterator IR;
00098   Regions regions = theRegionProducer->regions(ev,es);
00099   if (theMerger_!=0)
00100     theMerger_->update(es);
00101 
00102   for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) {
00103     const TrackingRegion & region = **ir;
00104 
00105     // make job
00106     theGenerator->run(*triplets, region, ev,es);
00107 
00108     // make quadruplets
00109     // (TODO: can partly be propagated to the merger)
00110     if ( theMerger_ !=0 ) {
00111       TrajectorySeedCollection const& tempQuads = theMerger_->mergeTriplets( *triplets, region, es, theConfig ); //@@
00112       for( TrajectorySeedCollection::const_iterator qIt = tempQuads.begin(); qIt < tempQuads.end(); ++qIt ) {
00113         quadruplets->push_back( *qIt );
00114       }
00115     }
00116   }
00117  
00118   // clear memory
00119   for (IR ir=regions.begin(), irEnd=regions.end(); ir < irEnd; ++ir) delete (*ir);
00120 
00121   // put to event
00122   if ( theMerger_!=0)
00123     ev.put(quadruplets);
00124   else
00125     ev.put(triplets);
00126 }