CMS 3D CMS Logo

List of all members | Public Types | Public Member Functions | Static Public Member Functions | Private Types | Private Attributes
PFRecoTauChargedHadronProducer Class Reference
Inheritance diagram for PFRecoTauChargedHadronProducer:
edm::stream::EDProducer<>

Public Types

typedef reco::tau::PFRecoTauChargedHadronBuilderPlugin Builder
 
typedef reco::tau::PFRecoTauChargedHadronQualityPlugin Ranker
 
- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Public Member Functions

 PFRecoTauChargedHadronProducer (const edm::ParameterSet &cfg)
 
template<typename T >
void print (const T &chargedHadrons)
 
void produce (edm::Event &evt, const edm::EventSetup &es) override
 
 ~PFRecoTauChargedHadronProducer () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInBeginLumis () const final
 
bool hasAbilityToProduceInBeginRuns () const final
 
bool hasAbilityToProduceInEndLumis () const final
 
bool hasAbilityToProduceInEndRuns () const final
 

Static Public Member Functions

static void fillDescriptions (edm::ConfigurationDescriptions &descriptions)
 

Private Types

typedef boost::ptr_vector< BuilderbuilderList
 
typedef boost::ptr_list< reco::PFRecoTauChargedHadronChargedHadronList
 
typedef reco::tau::RecoTauLexicographicalRanking< rankerList, reco::PFRecoTauChargedHadronChargedHadronPredicate
 
typedef boost::ptr_vector< reco::PFRecoTauChargedHadronChargedHadronVector
 
typedef boost::ptr_vector< RankerrankerList
 

Private Attributes

builderList builders_
 
edm::EDGetTokenT< reco::JetViewJets_token
 
double maxJetAbsEta_
 
double minJetPt_
 
std::string moduleLabel_
 
std::unique_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_
 
std::unique_ptr< ChargedHadronPredicatepredicate_
 
rankerList rankers_
 
edm::InputTag srcJets_
 
int verbosity_
 

Detailed Description

Definition at line 54 of file PFRecoTauChargedHadronProducer.cc.

Member Typedef Documentation

Definition at line 56 of file PFRecoTauChargedHadronProducer.cc.

typedef boost::ptr_vector<Builder> PFRecoTauChargedHadronProducer::builderList
private

Definition at line 68 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 71 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 73 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 70 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 57 of file PFRecoTauChargedHadronProducer.cc.

typedef boost::ptr_vector<Ranker> PFRecoTauChargedHadronProducer::rankerList
private

Definition at line 69 of file PFRecoTauChargedHadronProducer.cc.

Constructor & Destructor Documentation

PFRecoTauChargedHadronProducer::PFRecoTauChargedHadronProducer ( const edm::ParameterSet cfg)
explicit

Definition at line 96 of file PFRecoTauChargedHadronProducer.cc.

References edm::ParameterSet::addParameter(), builders_, beamerCreator::create(), timingPdfMaker::get, edm::ParameterSet::getParameter(), Jets_token, maxJetAbsEta_, minJetPt_, outputSelector_, predicate_, muonDTDigis_cfi::pset, rankers_, corrVsCorr::selection, srcJets_, AlCaHLTBitMon_QueryRunRegistry::string, and verbosity_.

97  : moduleLabel_(cfg.getParameter<std::string>("@module_label")) {
98  srcJets_ = cfg.getParameter<edm::InputTag>("jetSrc");
99  Jets_token = consumes<reco::JetView>(srcJets_);
100  minJetPt_ = cfg.getParameter<double>("minJetPt");
101  maxJetAbsEta_ = cfg.getParameter<double>("maxJetAbsEta");
102  verbosity_ = cfg.getParameter<int>("verbosity");
103 
104  // get set of ChargedHadron builder plugins
105  edm::VParameterSet psets_builders = cfg.getParameter<edm::VParameterSet>("builders");
106  for (edm::VParameterSet::const_iterator pset = psets_builders.begin(); pset != psets_builders.end(); ++pset) {
107  std::string pluginType = pset->getParameter<std::string>("plugin");
108  edm::ParameterSet pset_modified = (*pset);
109  pset_modified.addParameter<int>("verbosity", verbosity_);
110  builders_.push_back(
111  PFRecoTauChargedHadronBuilderPluginFactory::get()->create(pluginType, pset_modified, consumesCollector()));
112  }
113 
114  // get set of plugins for ranking ChargedHadrons in quality
115  edm::VParameterSet psets_rankers = cfg.getParameter<edm::VParameterSet>("ranking");
116  for (edm::VParameterSet::const_iterator pset = psets_rankers.begin(); pset != psets_rankers.end(); ++pset) {
117  std::string pluginType = pset->getParameter<std::string>("plugin");
118  edm::ParameterSet pset_modified = (*pset);
119  pset_modified.addParameter<int>("verbosity", verbosity_);
120  rankers_.push_back(PFRecoTauChargedHadronQualityPluginFactory::get()->create(pluginType, pset_modified));
121  }
122 
123  // build the sorting predicate
124  predicate_ = std::unique_ptr<ChargedHadronPredicate>(new ChargedHadronPredicate(rankers_));
125 
126  // check if we want to apply a final output selection
127  std::string selection = cfg.getParameter<std::string>("outputSelection");
128  if (!selection.empty()) {
130  }
131 
132  produces<reco::PFJetChargedHadronAssociation>();
133 }
T getParameter(std::string const &) const
edm::EDGetTokenT< reco::JetView > Jets_token
def create(alignables, pedeDump, additionalData, outputFile, config)
reco::tau::RecoTauLexicographicalRanking< rankerList, reco::PFRecoTauChargedHadron > ChargedHadronPredicate
std::vector< ParameterSet > VParameterSet
Definition: ParameterSet.h:33
selection
main part
Definition: corrVsCorr.py:100
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:124
std::unique_ptr< ChargedHadronPredicate > predicate_
std::unique_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_
PFRecoTauChargedHadronProducer::~PFRecoTauChargedHadronProducer ( )
inlineoverride

Definition at line 60 of file PFRecoTauChargedHadronProducer.cc.

References fillDescriptions(), print(), and produce().

60 {}

Member Function Documentation

void PFRecoTauChargedHadronProducer::fillDescriptions ( edm::ConfigurationDescriptions descriptions)
static

Definition at line 336 of file PFRecoTauChargedHadronProducer.cc.

References edm::ConfigurationDescriptions::add(), edm::ParameterSetDescription::add(), edm::ParameterSetDescription::addOptional(), edm::ParameterSet::addParameter(), edm::ParameterSetDescription::addVPSet(), DEFINE_FWK_MODULE, HLT_2018_cff::InputTag, beam_dqm_sourceclient-live_cfg::qualityCuts, and AlCaHLTBitMon_QueryRunRegistry::string.

Referenced by ~PFRecoTauChargedHadronProducer().

336  {
337  // ak4PFJetsRecoTauChargedHadrons
339  {
340  edm::ParameterSetDescription desc_ranking;
341  desc_ranking.add<std::string>("selectionPassFunction", "-pt");
342  desc_ranking.add<double>("selectionFailValue", 1000.0);
343  desc_ranking.add<std::string>("selection", "algoIs(\"kChargedPFCandidate\")");
344  desc_ranking.add<std::string>("name", "ChargedPFCandidate");
345  desc_ranking.add<std::string>("plugin", "PFRecoTauChargedHadronStringQuality");
346 
347  edm::ParameterSet pset_ranking;
348  pset_ranking.addParameter<std::string>("selectionPassFunction", "-pt");
349  pset_ranking.addParameter<double>("selectionFailValue", 1000.0);
350  pset_ranking.addParameter<std::string>("selection", "algoIs(\"kChargedPFCandidate\")");
351  pset_ranking.addParameter<std::string>("name", "ChargedPFCandidate");
352  pset_ranking.addParameter<std::string>("plugin", "PFRecoTauChargedHadronStringQuality");
353  std::vector<edm::ParameterSet> vpsd_ranking;
354  vpsd_ranking.push_back(pset_ranking);
355 
356  desc.addVPSet("ranking", desc_ranking, vpsd_ranking);
357  }
358 
359  desc.add<int>("verbosity", 0);
360  desc.add<double>("maxJetAbsEta", 2.5);
361  desc.add<std::string>("outputSelection", "pt > 0.5");
362  desc.add<double>("minJetPt", 14.0);
363  desc.add<edm::InputTag>("jetSrc", edm::InputTag("ak4PFJets"));
364 
365  {
366  edm::ParameterSetDescription desc_builders;
367  desc_builders.add<double>("minMergeChargedHadronPt");
368  desc_builders.add<std::string>("name");
369  desc_builders.add<std::string>("plugin");
370  desc_builders.addOptional<double>("dRcone");
371  desc_builders.addOptional<bool>("dRconeLimitedToJetArea");
372  desc_builders.addOptional<double>("dRmergeNeutralHadron");
373  desc_builders.addOptional<double>("dRmergePhoton");
374  desc_builders.addOptional<edm::InputTag>("srcTracks");
375 
376  {
377  edm::ParameterSetDescription pset_signalQualityCuts;
378  pset_signalQualityCuts.add<double>("maxDeltaZ", 0.4);
379  pset_signalQualityCuts.add<double>("minTrackPt", 0.5);
380  pset_signalQualityCuts.add<double>("minTrackVertexWeight", -1.0);
381  pset_signalQualityCuts.add<double>("maxTrackChi2", 100.0);
382  pset_signalQualityCuts.add<unsigned int>("minTrackPixelHits", 0);
383  pset_signalQualityCuts.add<double>("minGammaEt", 1.0);
384  pset_signalQualityCuts.add<unsigned int>("minTrackHits", 3);
385  pset_signalQualityCuts.add<double>("minNeutralHadronEt", 30.0);
386  pset_signalQualityCuts.add<double>("maxTransverseImpactParameter", 0.1);
387  pset_signalQualityCuts.addOptional<bool>("useTracksInsteadOfPFHadrons");
388 
389  edm::ParameterSetDescription pset_vxAssocQualityCuts;
390  pset_vxAssocQualityCuts.add<double>("minTrackPt", 0.5);
391  pset_vxAssocQualityCuts.add<double>("minTrackVertexWeight", -1.0);
392  pset_vxAssocQualityCuts.add<double>("maxTrackChi2", 100.0);
393  pset_vxAssocQualityCuts.add<unsigned int>("minTrackPixelHits", 0);
394  pset_vxAssocQualityCuts.add<double>("minGammaEt", 1.0);
395  pset_vxAssocQualityCuts.add<unsigned int>("minTrackHits", 3);
396  pset_vxAssocQualityCuts.add<double>("maxTransverseImpactParameter", 0.1);
397  pset_vxAssocQualityCuts.addOptional<bool>("useTracksInsteadOfPFHadrons");
398 
399  edm::ParameterSetDescription pset_isolationQualityCuts;
400  pset_isolationQualityCuts.add<double>("maxDeltaZ", 0.2);
401  pset_isolationQualityCuts.add<double>("minTrackPt", 1.0);
402  pset_isolationQualityCuts.add<double>("minTrackVertexWeight", -1.0);
403  pset_isolationQualityCuts.add<double>("maxTrackChi2", 100.0);
404  pset_isolationQualityCuts.add<unsigned int>("minTrackPixelHits", 0);
405  pset_isolationQualityCuts.add<double>("minGammaEt", 1.5);
406  pset_isolationQualityCuts.add<unsigned int>("minTrackHits", 8);
407  pset_isolationQualityCuts.add<double>("maxTransverseImpactParameter", 0.03);
408  pset_isolationQualityCuts.addOptional<bool>("useTracksInsteadOfPFHadrons");
409 
410  edm::ParameterSetDescription pset_qualityCuts;
411  pset_qualityCuts.add<edm::ParameterSetDescription>("signalQualityCuts", pset_signalQualityCuts);
412  pset_qualityCuts.add<edm::ParameterSetDescription>("vxAssocQualityCuts", pset_vxAssocQualityCuts);
413  pset_qualityCuts.add<edm::ParameterSetDescription>("isolationQualityCuts", pset_isolationQualityCuts);
414  pset_qualityCuts.add<std::string>("leadingTrkOrPFCandOption", "leadPFCand");
415  pset_qualityCuts.add<std::string>("pvFindingAlgo", "closestInDeltaZ");
416  pset_qualityCuts.add<edm::InputTag>("primaryVertexSrc", edm::InputTag("offlinePrimaryVertices"));
417  pset_qualityCuts.add<bool>("vertexTrackFiltering", false);
418  pset_qualityCuts.add<bool>("recoverLeadingTrk", false);
419 
420  desc_builders.add<edm::ParameterSetDescription>("qualityCuts", pset_qualityCuts);
421  }
422 
423  desc_builders.add<double>("minMergeGammaEt");
424  desc_builders.add<int>("verbosity", 0);
425  desc_builders.add<double>("minMergeNeutralHadronEt");
426 
427  desc_builders.addOptional<double>("dRmergePhotonWrtChargedHadron");
428  desc_builders.addOptional<double>("dRmergePhotonWrtNeutralHadron");
429  desc_builders.addOptional<int>("maxUnmatchedBlockElementsNeutralHadron");
430  desc_builders.addOptional<double>("dRmergePhotonWrtElectron");
431  desc_builders.addOptional<std::vector<int>>("chargedHadronCandidatesParticleIds");
432  desc_builders.addOptional<int>("minBlockElementMatchesPhoton");
433  desc_builders.addOptional<double>("dRmergeNeutralHadronWrtNeutralHadron");
434  desc_builders.addOptional<int>("maxUnmatchedBlockElementsPhoton");
435  desc_builders.addOptional<double>("dRmergeNeutralHadronWrtOther");
436  desc_builders.addOptional<double>("dRmergeNeutralHadronWrtElectron");
437  desc_builders.addOptional<int>("minBlockElementMatchesNeutralHadron");
438  desc_builders.addOptional<double>("dRmergePhotonWrtOther");
439  desc_builders.addOptional<double>("dRmergeNeutralHadronWrtChargedHadron");
440 
441  edm::ParameterSet pset_builders;
442  pset_builders.addParameter<std::string>("name", "");
443  pset_builders.addParameter<std::string>("plugin", "");
445  pset_builders.addParameter<edm::ParameterSet>("qualityCuts", qualityCuts);
446  pset_builders.addParameter<int>("verbosity", 0);
447  std::vector<edm::ParameterSet> vpsd_builders;
448  vpsd_builders.push_back(pset_builders);
449 
450  desc.addVPSet("builders", desc_builders, vpsd_builders);
451  }
452 
453  descriptions.add("pfRecoTauChargedHadronProducer", desc);
454 }
ParameterDescriptionBase * addOptional(U const &iLabel, T const &value)
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:124
ParameterDescriptionBase * add(U const &iLabel, T const &value)
void add(std::string const &label, ParameterSetDescription const &psetDescription)
template<typename T >
void PFRecoTauChargedHadronProducer::print ( const T chargedHadrons)

Definition at line 322 of file PFRecoTauChargedHadronProducer.cc.

References muons2muons_cfi::chargedHadron, rankers_, and ApeEstimator_cff::width.

Referenced by produce(), and ~PFRecoTauChargedHadronProducer().

322  {
323  for (typename T::const_iterator chargedHadron = chargedHadrons.begin(); chargedHadron != chargedHadrons.end();
324  ++chargedHadron) {
325  edm::LogPrint("PFRecoTauChHProducer") << (*chargedHadron);
326  edm::LogPrint("PFRecoTauChHProducer") << "Rankers:";
327  for (rankerList::const_iterator ranker = rankers_.begin(); ranker != rankers_.end(); ++ranker) {
328  const unsigned width = 25;
329  edm::LogPrint("PFRecoTauChHProducer")
330  << " " << std::setiosflags(std::ios::left) << std::setw(width) << ranker->name() << " "
331  << std::resetiosflags(std::ios::left) << std::setprecision(3) << (*ranker)(*chargedHadron) << std::endl;
332  }
333  }
334 }
void PFRecoTauChargedHadronProducer::produce ( edm::Event evt,
const edm::EventSetup es 
)
override

Definition at line 135 of file PFRecoTauChargedHadronProducer.cc.

References funct::abs(), builders_, PbPb_ZMuSkimMuonDPG_cff::deltaR, HGC3DClusterGenMatchSelector_cfi::dR, MillePedeFileConverter_cfg::e, edm::RefToBaseVector< T >::empty(), reco::TrackBase::eta(), cppFunctionSkipper::exception, edm::Ref< C, T, F >::get(), edm::Event::getByToken(), reco::PFCandidate::gsfTrackRef(), mps_fire::i, edm::Ref< C, T, F >::isNonnull(), singleTopDQM_cfi::jets, Jets_token, reco::PFRecoTauChargedHadron::kPFNeutralHadron, maxJetAbsEta_, minJetPt_, moduleLabel_, eostools::move(), reco::PFCandidate::muonRef(), outputSelector_, pfJetBenchmark_cfi::pfJets, reco::TrackBase::phi(), predicate_, print(), edm::RefToBaseVector< T >::push_back(), edm::Event::put(), edm::View< T >::refAt(), mps_fire::result, reco::tau::setChargedHadronP4(), edm::View< T >::size(), HLT_2018_cff::track, reco::PFCandidate::trackRef(), and verbosity_.

Referenced by ~PFRecoTauChargedHadronProducer().

135  {
136  if (verbosity_) {
137  edm::LogPrint("PFRecoTauChHProducer") << "<PFRecoTauChargedHadronProducer::produce>:";
138  edm::LogPrint("PFRecoTauChHProducer") << " moduleLabel = " << moduleLabel_;
139  }
140 
141  // give each of our plugins a chance at doing something with the edm::Event
142  for (auto& builder : builders_) {
143  builder.setup(evt, es);
144  }
145 
146  // get a view of our jets via the base candidates
148  evt.getByToken(Jets_token, jets);
149 
150  // convert the view to a RefVector of actual PFJets
152  size_t nElements = jets->size();
153  for (size_t i = 0; i < nElements; ++i) {
154  pfJets.push_back(jets->refAt(i));
155  }
156 
157  // make our association
158  std::unique_ptr<reco::PFJetChargedHadronAssociation> pfJetChargedHadronAssociations;
159 
160  if (!pfJets.empty()) {
161  pfJetChargedHadronAssociations = std::make_unique<reco::PFJetChargedHadronAssociation>(reco::JetRefBaseProd(jets));
162  } else {
163  pfJetChargedHadronAssociations = std::make_unique<reco::PFJetChargedHadronAssociation>();
164  }
165 
166  // loop over our jets
167  for (const auto& pfJet : pfJets) {
168  if (pfJet->pt() - minJetPt_ < 1e-5)
169  continue;
170  if (std::abs(pfJet->eta()) - maxJetAbsEta_ > -1e-5)
171  continue;
172 
173  // build global list of ChargedHadron candidates for each jet
174  ChargedHadronList uncleanedChargedHadrons;
175 
176  // merge candidates reconstructed by all desired algorithm plugins
177  for (auto const& builder : builders_) {
178  try {
179  ChargedHadronVector result(builder(*pfJet));
180  if (verbosity_) {
181  edm::LogPrint("PFRecoTauChHProducer") << "result of builder = " << builder.name() << ":";
182  print(result);
183  }
184  uncleanedChargedHadrons.transfer(uncleanedChargedHadrons.end(), result);
185  } catch (cms::Exception& exception) {
186  edm::LogError("BuilderPluginException")
187  << "Exception caught in builder plugin " << builder.name() << ", rethrowing" << std::endl;
188  throw exception;
189  }
190  }
191 
192  // rank the candidates according to our quality plugins
193  uncleanedChargedHadrons.sort(*predicate_);
194 
195  // define collection of cleaned ChargedHadrons;
196  std::vector<reco::PFRecoTauChargedHadron> cleanedChargedHadrons;
197 
198  // keep track of neutral PFCandidates, charged PFCandidates and tracks "used" by ChargedHadron candidates in the clean collection
199  typedef std::pair<double, double> etaPhiPair;
200  std::list<etaPhiPair> tracksInCleanCollection;
201  std::set<reco::CandidatePtr> neutralPFCandsInCleanCollection;
202 
203  while (!uncleanedChargedHadrons.empty()) {
204  // get next best ChargedHadron candidate
205  std::unique_ptr<reco::PFRecoTauChargedHadron> nextChargedHadron(uncleanedChargedHadrons.pop_front().release());
206  if (verbosity_) {
207  edm::LogPrint("PFRecoTauChHProducer") << "processing nextChargedHadron:";
208  edm::LogPrint("PFRecoTauChHProducer") << (*nextChargedHadron);
209  }
210 
211  // discard candidates which fail final output selection
212  if (!(*outputSelector_)(*nextChargedHadron))
213  continue;
214 
215  const reco::Track* track = nullptr;
216  if (nextChargedHadron->getChargedPFCandidate().isNonnull()) {
217  const reco::PFCandidate* chargedPFCand =
218  dynamic_cast<const reco::PFCandidate*>(&*nextChargedHadron->getChargedPFCandidate());
219  if (chargedPFCand) {
220  if (chargedPFCand->trackRef().isNonnull())
221  track = chargedPFCand->trackRef().get();
222  else if (chargedPFCand->muonRef().isNonnull() && chargedPFCand->muonRef()->innerTrack().isNonnull())
223  track = chargedPFCand->muonRef()->innerTrack().get();
224  else if (chargedPFCand->muonRef().isNonnull() && chargedPFCand->muonRef()->globalTrack().isNonnull())
225  track = chargedPFCand->muonRef()->globalTrack().get();
226  else if (chargedPFCand->muonRef().isNonnull() && chargedPFCand->muonRef()->outerTrack().isNonnull())
227  track = chargedPFCand->muonRef()->outerTrack().get();
228  else if (chargedPFCand->gsfTrackRef().isNonnull())
229  track = chargedPFCand->gsfTrackRef().get();
230  }
231  }
232  if (nextChargedHadron->getTrack().isNonnull() && !track) {
233  track = nextChargedHadron->getTrack().get();
234  }
235 
236  // discard candidate in case its track is "used" by any ChargedHadron in the clean collection
237  bool isTrack_overlap = false;
238  if (track) {
239  double track_eta = track->eta();
240  double track_phi = track->phi();
241  for (std::list<etaPhiPair>::const_iterator trackInCleanCollection = tracksInCleanCollection.begin();
242  trackInCleanCollection != tracksInCleanCollection.end();
243  ++trackInCleanCollection) {
244  double dR = deltaR(track_eta, track_phi, trackInCleanCollection->first, trackInCleanCollection->second);
245  if (dR < 1.e-4)
246  isTrack_overlap = true;
247  }
248  }
249  if (verbosity_) {
250  edm::LogPrint("PFRecoTauChHProducer") << "isTrack_overlap = " << isTrack_overlap;
251  }
252  if (isTrack_overlap)
253  continue;
254 
255  // discard ChargedHadron candidates without track in case they are close to neutral PFCandidates "used" by ChargedHadron candidates in the clean collection
256  bool isNeutralPFCand_overlap = false;
257  if (nextChargedHadron->algoIs(reco::PFRecoTauChargedHadron::kPFNeutralHadron)) {
258  for (std::set<reco::CandidatePtr>::const_iterator neutralPFCandInCleanCollection =
259  neutralPFCandsInCleanCollection.begin();
260  neutralPFCandInCleanCollection != neutralPFCandsInCleanCollection.end();
261  ++neutralPFCandInCleanCollection) {
262  if ((*neutralPFCandInCleanCollection) == nextChargedHadron->getChargedPFCandidate())
263  isNeutralPFCand_overlap = true;
264  }
265  }
266  if (verbosity_) {
267  edm::LogPrint("PFRecoTauChHProducer") << "isNeutralPFCand_overlap = " << isNeutralPFCand_overlap;
268  }
269  if (isNeutralPFCand_overlap)
270  continue;
271 
272  // find neutral PFCandidates that are not "used" by any ChargedHadron in the clean collection
273  std::vector<reco::CandidatePtr> uniqueNeutralPFCands;
274  std::set_difference(nextChargedHadron->getNeutralPFCandidates().begin(),
275  nextChargedHadron->getNeutralPFCandidates().end(),
276  neutralPFCandsInCleanCollection.begin(),
277  neutralPFCandsInCleanCollection.end(),
278  std::back_inserter(uniqueNeutralPFCands));
279 
280  if (uniqueNeutralPFCands.size() ==
281  nextChargedHadron->getNeutralPFCandidates()
282  .size()) { // all neutral PFCandidates are unique, add ChargedHadron candidate to clean collection
283  if (track)
284  tracksInCleanCollection.push_back(std::make_pair(track->eta(), track->phi()));
285  neutralPFCandsInCleanCollection.insert(nextChargedHadron->getNeutralPFCandidates().begin(),
286  nextChargedHadron->getNeutralPFCandidates().end());
287  if (verbosity_) {
288  edm::LogPrint("PFRecoTauChHProducer") << "--> adding nextChargedHadron to output collection.";
289  }
290  cleanedChargedHadrons.push_back(*nextChargedHadron);
291  } else { // remove overlapping neutral PFCandidates, reevaluate ranking criterion and process ChargedHadron candidate again
292  nextChargedHadron->neutralPFCandidates_.clear();
293  for (auto const& neutralPFCand : uniqueNeutralPFCands) {
294  nextChargedHadron->neutralPFCandidates_.push_back(neutralPFCand);
295  }
296  // update ChargedHadron four-momentum
297  reco::tau::setChargedHadronP4(*nextChargedHadron);
298  // reinsert ChargedHadron candidate into list of uncleaned candidates,
299  // at position according to new rank
300  ChargedHadronList::iterator insertionPoint = std::lower_bound(
301  uncleanedChargedHadrons.begin(), uncleanedChargedHadrons.end(), *nextChargedHadron, *predicate_);
302  if (verbosity_) {
303  edm::LogPrint("PFRecoTauChHProducer") << "--> removing non-unique neutral PFCandidates and reinserting "
304  "nextChargedHadron in uncleaned collection.";
305  }
306  uncleanedChargedHadrons.insert(insertionPoint, std::move(nextChargedHadron));
307  }
308  }
309 
310  if (verbosity_) {
311  print(cleanedChargedHadrons);
312  }
313 
314  // add ChargedHadron-to-jet association
315  pfJetChargedHadronAssociations->setValue(pfJet.key(), cleanedChargedHadrons);
316  }
317 
318  evt.put(std::move(pfJetChargedHadronAssociations));
319 }
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:131
edm::EDGetTokenT< reco::JetView > Jets_token
bool isNonnull() const
Checks for non-null.
Definition: Ref.h:238
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:525
size_type size() const
double phi() const
azimuthal angle of momentum vector
Definition: TrackBase.h:614
reco::TrackRef trackRef() const
Definition: PFCandidate.cc:408
RefToBase< value_type > refAt(size_type i) const
edm::RefToBaseProd< reco::Jet > JetRefBaseProd
Definition: JetCollection.h:13
double eta() const
pseudorapidity of momentum vector
Definition: TrackBase.h:617
boost::ptr_vector< reco::PFRecoTauChargedHadron > ChargedHadronVector
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
T const * get() const
Returns C++ pointer to the item.
Definition: Ref.h:232
reco::MuonRef muonRef() const
Definition: PFCandidate.cc:421
std::unique_ptr< ChargedHadronPredicate > predicate_
boost::ptr_list< reco::PFRecoTauChargedHadron > ChargedHadronList
Particle reconstructed by the particle flow algorithm.
Definition: PFCandidate.h:40
reco::GsfTrackRef gsfTrackRef() const
Definition: PFCandidate.cc:440
void push_back(const RefToBase< T > &)
void setChargedHadronP4(reco::PFRecoTauChargedHadron &chargedHadron, double scaleFactor_neutralPFCands=1.0)
std::unique_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

builderList PFRecoTauChargedHadronProducer::builders_
private

Definition at line 84 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

edm::EDGetTokenT<reco::JetView> PFRecoTauChargedHadronProducer::Jets_token
private

Definition at line 79 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

double PFRecoTauChargedHadronProducer::maxJetAbsEta_
private

Definition at line 81 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

double PFRecoTauChargedHadronProducer::minJetPt_
private

Definition at line 80 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

std::string PFRecoTauChargedHadronProducer::moduleLabel_
private
std::unique_ptr<StringCutObjectSelector<reco::PFRecoTauChargedHadron> > PFRecoTauChargedHadronProducer::outputSelector_
private

Definition at line 90 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

std::unique_ptr<ChargedHadronPredicate> PFRecoTauChargedHadronProducer::predicate_
private

Definition at line 87 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

rankerList PFRecoTauChargedHadronProducer::rankers_
private

Definition at line 85 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and print().

edm::InputTag PFRecoTauChargedHadronProducer::srcJets_
private

Definition at line 78 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer().

int PFRecoTauChargedHadronProducer::verbosity_
private

Definition at line 93 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().