CMS 3D CMS Logo

PFClusterProducer.cc
Go to the documentation of this file.
1 #include "PFClusterProducer.h"
2 
3 #ifdef PFLOW_DEBUG
4 #define LOGVERB(x) edm::LogVerbatim(x)
5 #define LOGWARN(x) edm::LogWarning(x)
6 #define LOGERR(x) edm::LogError(x)
7 #define LOGDRESSED(x) edm::LogInfo(x)
8 #else
9 #define LOGVERB(x) LogTrace(x)
10 #define LOGWARN(x) edm::LogWarning(x)
11 #define LOGERR(x) edm::LogError(x)
12 #define LOGDRESSED(x) LogDebug(x)
13 #endif
14 
16  _prodInitClusters(conf.getUntrackedParameter<bool>("prodInitialClusters",false))
17 {
18  _rechitsLabel = consumes<reco::PFRecHitCollection>(conf.getParameter<edm::InputTag>("recHitsSource"));
19  //setup rechit cleaners
20  const edm::VParameterSet& cleanerConfs =
21  conf.getParameterSetVector("recHitCleaners");
22  for( const auto& conf : cleanerConfs ) {
23  const std::string& cleanerName =
24  conf.getParameter<std::string>("algoName");
25  _cleaners.emplace_back(RecHitTopologicalCleanerFactory::get()->create(cleanerName,conf));
26  }
27  edm::ConsumesCollector sumes = consumesCollector();
28 
29  // setup seed finding
30  const edm::ParameterSet& sfConf =
31  conf.getParameterSet("seedFinder");
32  const std::string& sfName = sfConf.getParameter<std::string>("algoName");
33  _seedFinder = std::unique_ptr<SeedFinderBase>{SeedFinderFactory::get()->create(sfName,sfConf)};
34  //setup topo cluster builder
35  const edm::ParameterSet& initConf =
36  conf.getParameterSet("initialClusteringStep");
37  const std::string& initName = initConf.getParameter<std::string>("algoName");
38  _initialClustering = std::unique_ptr<ICSB>{InitialClusteringStepFactory::get()->create(initName,initConf,sumes)};
39  //setup pf cluster builder if requested
40  const edm::ParameterSet& pfcConf = conf.getParameterSet("pfClusterBuilder");
41  if( !pfcConf.empty() ) {
42  const std::string& pfcName = pfcConf.getParameter<std::string>("algoName");
43  _pfClusterBuilder = std::unique_ptr<PFCBB>{PFClusterBuilderFactory::get()->create(pfcName,pfcConf)};
44  }
45  //setup (possible) recalcuation of positions
46  const edm::ParameterSet& pConf = conf.getParameterSet("positionReCalc");
47  if( !pConf.empty() ) {
48  const std::string& pName = pConf.getParameter<std::string>("algoName");
49  _positionReCalc = std::unique_ptr<PosCalc>{PFCPositionCalculatorFactory::get()->create(pName,pConf)};
50  }
51  // see if new need to apply corrections, setup if there.
52  const edm::ParameterSet& cConf = conf.getParameterSet("energyCorrector");
53  if( !cConf.empty() ) {
54  const std::string& cName = cConf.getParameter<std::string>("algoName");
55  _energyCorrector = std::unique_ptr<PFClusterEnergyCorrectorBase>{PFClusterEnergyCorrectorFactory::get()->create(cName,cConf)};
56  }
57 
58 
59  if( _prodInitClusters ) {
60  produces<reco::PFClusterCollection>("initialClusters");
61  }
62  produces<reco::PFClusterCollection>();
63 }
64 
66  const edm::EventSetup& es) {
67  _initialClustering->update(es);
68  if( _pfClusterBuilder ) _pfClusterBuilder->update(es);
69  if( _positionReCalc ) _positionReCalc->update(es);
70 
71 }
72 
74  _initialClustering->reset();
75  if( _pfClusterBuilder ) _pfClusterBuilder->reset();
76 
78  e.getByToken(_rechitsLabel,rechits);
79 
80  _initialClustering->updateEvent(e);
81 
82  std::vector<bool> mask(rechits->size(),true);
83  for( const auto& cleaner : _cleaners ) {
84  cleaner->clean(rechits, mask);
85  }
86 
87 
88 
89  std::vector<bool> seedable(rechits->size(),false);
90  _seedFinder->findSeeds(rechits,mask,seedable);
91 
92 
93 
94  auto initialClusters = std::make_unique<reco::PFClusterCollection>();
95  _initialClustering->buildClusters(rechits, mask, seedable, *initialClusters);
96  LOGVERB("PFClusterProducer::produce()") << *_initialClustering;
97 
98 
99 
100 
101  auto pfClusters = std::make_unique<reco::PFClusterCollection>();
102  pfClusters.reset(new reco::PFClusterCollection);
103  if( _pfClusterBuilder ) { // if we've defined a re-clustering step execute it
104  _pfClusterBuilder->buildClusters(*initialClusters, seedable, *pfClusters);
105  LOGVERB("PFClusterProducer::produce()") << *_pfClusterBuilder;
106  } else {
107  pfClusters->insert(pfClusters->end(),
108  initialClusters->begin(),initialClusters->end());
109  }
110 
111 
112 
113 
114  if( _positionReCalc ) {
115  _positionReCalc->calculateAndSetPositions(*pfClusters);
116  }
117 
118  if( _energyCorrector ) {
119  _energyCorrector->correctEnergies(*pfClusters);
120  }
121 
122  if( _prodInitClusters ) e.put(std::move(initialClusters),"initialClusters");
123  e.put(std::move(pfClusters));
124 }
std::unique_ptr< SeedFinderBase > _seedFinder
T getParameter(std::string const &) const
std::unique_ptr< PFClusterEnergyCorrectorBase > _energyCorrector
bool empty() const
Definition: ParameterSet.h:191
VParameterSet const & getParameterSetVector(std::string const &name) const
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
def create(alignables, pedeDump, additionalData, outputFile, config)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
std::unique_ptr< PFClusterBuilderBase > _pfClusterBuilder
void beginLuminosityBlock(const edm::LuminosityBlock &, const edm::EventSetup &) override
#define LOGVERB(x)
std::unique_ptr< PFCPositionCalculatorBase > _positionReCalc
std::vector< std::unique_ptr< RecHitTopologicalCleanerBase > > _cleaners
const bool _prodInitClusters
edm::EDGetTokenT< reco::PFRecHitCollection > _rechitsLabel
std::unique_ptr< InitialClusteringStepBase > _initialClustering
void produce(edm::Event &, const edm::EventSetup &) override
ParameterSet const & getParameterSet(std::string const &) const
std::vector< PFCluster > PFClusterCollection
collection of PFCluster objects
Definition: PFClusterFwd.h:9
PFClusterProducer(const edm::ParameterSet &)
def move(src, dest)
Definition: eostools.py:511
T get(const Candidate &c)
Definition: component.h:55