CMS 3D CMS Logo

List of all members | Public Types | 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 hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

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::CandidateViewJets_token
 
double maxJetAbsEta_
 
double minJetPt_
 
std::string moduleLabel_
 
std::auto_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_
 
std::auto_ptr< ChargedHadronPredicatepredicate_
 
rankerList rankers_
 
edm::InputTag srcJets_
 
int verbosity_
 

Detailed Description

Definition at line 52 of file PFRecoTauChargedHadronProducer.cc.

Member Typedef Documentation

Definition at line 55 of file PFRecoTauChargedHadronProducer.cc.

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

Definition at line 65 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 68 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 70 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 67 of file PFRecoTauChargedHadronProducer.cc.

Definition at line 56 of file PFRecoTauChargedHadronProducer.cc.

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

Definition at line 66 of file PFRecoTauChargedHadronProducer.cc.

Constructor & Destructor Documentation

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

Definition at line 93 of file PFRecoTauChargedHadronProducer.cc.

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

94  : moduleLabel_(cfg.getParameter<std::string>("@module_label"))
95 {
96  srcJets_ = cfg.getParameter<edm::InputTag>("jetSrc");
97  Jets_token = consumes<reco::CandidateView>(srcJets_);
98  minJetPt_ = ( cfg.exists("minJetPt") ) ? cfg.getParameter<double>("minJetPt") : -1.0;
99  maxJetAbsEta_ = ( cfg.exists("maxJetAbsEta") ) ? cfg.getParameter<double>("maxJetAbsEta") : 99.0;
100  verbosity_ = ( cfg.exists("verbosity") ) ?
101  cfg.getParameter<int>("verbosity") : 0;
102 
103  // get set of ChargedHadron builder plugins
104  edm::VParameterSet psets_builders = cfg.getParameter<edm::VParameterSet>("builders");
105  for ( edm::VParameterSet::const_iterator pset = psets_builders.begin();
106  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(PFRecoTauChargedHadronBuilderPluginFactory::get()->create(pluginType, pset_modified, consumesCollector()));
111  }
112 
113  // get set of plugins for ranking ChargedHadrons in quality
114  edm::VParameterSet psets_rankers = cfg.getParameter<edm::VParameterSet>("ranking");
115  for ( edm::VParameterSet::const_iterator pset = psets_rankers.begin();
116  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::auto_ptr<ChargedHadronPredicate>(new ChargedHadronPredicate(rankers_));
125 
126  // check if we want to apply a final output selection
127  if ( cfg.exists("outputSelection") ) {
128  std::string selection = cfg.getParameter<std::string>("outputSelection");
129  if ( selection != "" ) {
131  }
132  }
133 
134  produces<reco::PFJetChargedHadronAssociation>();
135 }
T getParameter(std::string const &) const
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:98
bool exists(std::string const &parameterName) const
checks if a parameter exists
edm::EDGetTokenT< reco::CandidateView > Jets_token
std::auto_ptr< ChargedHadronPredicate > predicate_
void addParameter(std::string const &name, T const &value)
Definition: ParameterSet.h:144
std::auto_ptr< StringCutObjectSelector< reco::PFRecoTauChargedHadron > > outputSelector_
T get(const Candidate &c)
Definition: component.h:55
PFRecoTauChargedHadronProducer::~PFRecoTauChargedHadronProducer ( )
inlineoverride

Definition at line 59 of file PFRecoTauChargedHadronProducer.cc.

References print(), and produce().

59 {}

Member Function Documentation

template<typename T >
void PFRecoTauChargedHadronProducer::print ( const T chargedHadrons)

Definition at line 303 of file PFRecoTauChargedHadronProducer.cc.

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

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

304 {
305  for ( typename T::const_iterator chargedHadron = chargedHadrons.begin();
306  chargedHadron != chargedHadrons.end(); ++chargedHadron ) {
307  edm::LogPrint("PFRecoTauChHProducer") << (*chargedHadron);
308  edm::LogPrint("PFRecoTauChHProducer") << "Rankers:" ;
309  for ( rankerList::const_iterator ranker = rankers_.begin();
310  ranker != rankers_.end(); ++ranker) {
311  const unsigned width = 25;
312  edm::LogPrint("PFRecoTauChHProducer") << " " << std::setiosflags(std::ios::left) << std::setw(width) << ranker->name()
313  << " " << std::resetiosflags(std::ios::left) << std::setprecision(3) << (*ranker)(*chargedHadron) << std::endl;
314  }
315  }
316 }
void PFRecoTauChargedHadronProducer::produce ( edm::Event evt,
const edm::EventSetup es 
)
override

Definition at line 137 of file PFRecoTauChargedHadronProducer.cc.

References funct::abs(), builders_, deltaR(), PFRecoTauDiscriminationAgainstElectronDeadECAL_cfi::dR, MillePedeFileConverter_cfg::e, edm::RefVector< C, T, F >::empty(), reco::TrackBase::eta(), cppFunctionSkipper::exception, edm::Event::get(), edm::Ptr< T >::get(), edm::Event::getByToken(), edm::RefVector< C, T, F >::id(), edm::Ptr< T >::isNonnull(), fwrapper::jets, Jets_token, edm::Ref< C, T, F >::key(), reco::PFRecoTauChargedHadron::kPFNeutralHadron, maxJetAbsEta_, minJetPt_, moduleLabel_, eostools::move(), reco::tau::RecoTauNamedPlugin::name(), outputSelector_, pfJetBenchmark_cfi::pfJets, reco::TrackBase::phi(), predicate_, print(), edm::Event::put(), mps_fire::result, reco::tau::setChargedHadronP4(), reco::tau::RecoTauEventHolderPlugin::setup(), HiIsolationCommonParameters_cff::track, and verbosity_.

Referenced by ~PFRecoTauChargedHadronProducer().

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

Member Data Documentation

builderList PFRecoTauChargedHadronProducer::builders_
private

Definition at line 81 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

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

Definition at line 76 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

double PFRecoTauChargedHadronProducer::maxJetAbsEta_
private

Definition at line 78 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

double PFRecoTauChargedHadronProducer::minJetPt_
private

Definition at line 77 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

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

Definition at line 87 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

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

Definition at line 84 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().

rankerList PFRecoTauChargedHadronProducer::rankers_
private

Definition at line 82 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and print().

edm::InputTag PFRecoTauChargedHadronProducer::srcJets_
private

Definition at line 75 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer().

int PFRecoTauChargedHadronProducer::verbosity_
private

Definition at line 90 of file PFRecoTauChargedHadronProducer.cc.

Referenced by PFRecoTauChargedHadronProducer(), and produce().