8 #include <boost/foreach.hpp>
9 #include <boost/bind.hpp>
11 namespace reco {
namespace tau {
22 &
tau_->selectedSignalPFChargedHadrCands_;
24 &
tau_->selectedSignalPFGammaCands_;
26 &
tau_->selectedSignalPFNeutrHadrCands_;
28 &
tau_->selectedSignalPFCands_;
31 &
tau_->selectedIsolationPFChargedHadrCands_;
33 &
tau_->selectedIsolationPFGammaCands_;
35 &
tau_->selectedIsolationPFNeutrHadrCands_;
37 &
tau_->selectedIsolationPFCands_;
44 new SortedListPtr::element_type);
95 tau_->signalTauChargedHadronCandidates_.reserve(size);
96 tau_->selectedSignalPFChargedHadrCands_.reserve(size);
98 tau_->isolationTauChargedHadronCandidates_.reserve(size);
99 tau_->selectedIsolationPFChargedHadrCands_.reserve(size);
105 void checkOverlap(
const PFCandidatePtr& neutral,
const std::vector<PFCandidatePtr>&
pfGammas,
bool& isUnique)
109 for ( std::vector<PFCandidatePtr>::const_iterator
pfGamma = pfGammas.begin();
112 if ( (*
pfGamma) == neutral ) isUnique =
false;
116 void checkOverlap(
const PFCandidatePtr& neutral,
const std::vector<reco::RecoTauPiZero>& piZeros,
bool& isUnique)
120 for ( std::vector<reco::RecoTauPiZero>::const_iterator piZero = piZeros.begin();
121 piZero != piZeros.end(); ++piZero ) {
122 size_t numPFGammas = piZero->numberOfDaughters();
123 for (
size_t iPFGamma = 0; iPFGamma < numPFGammas; ++iPFGamma ) {
126 if ( pfGamma.
id() == neutral.
id() && pfGamma.
key() == neutral.key() ) isUnique =
false;
138 std::vector<PFCandidatePtr> neutrals_cleaned;
139 for ( std::vector<PFCandidatePtr>::const_iterator neutral = neutrals.begin();
140 neutral != neutrals.end(); ++neutral ) {
142 bool isUnique =
true;
144 else checkOverlap(*neutral,
tau_->signalPiZeroCandidates_, isUnique);
147 else checkOverlap(*neutral,
tau_->isolationPiZeroCandidates_, isUnique);
150 if ( isUnique ) neutrals_cleaned.push_back(*neutral);
153 if ( neutrals_cleaned.size() != neutrals.size() ) {
158 tau_->signalTauChargedHadronCandidates_.push_back(chargedHadron_cleaned);
159 p4_ += chargedHadron_cleaned.
p4();
164 for ( std::vector<PFCandidatePtr>::const_iterator neutral = neutrals.begin();
165 neutral != neutrals.end(); ++neutral ) {
170 tau_->isolationTauChargedHadronCandidates_.push_back(chargedHadron_cleaned);
176 for ( std::vector<PFCandidatePtr>::const_iterator neutral = neutrals.begin();
177 neutral != neutrals.end(); ++neutral ) {
187 tau_->signalPiZeroCandidates_.reserve(size);
192 tau_->isolationPiZeroCandidates_.reserve(size);
202 tau_->signalPiZeroCandidates_.push_back(piZero);
212 tau_->isolationPiZeroCandidates_.push_back(piZero);
220 std::vector<PFCandidatePtr>*
238 template<
typename T1,
typename T2>
239 void checkMatchedProductIds(
const T1& t1,
const T2&
t2) {
240 if (t1.id() != t2.id()) {
241 throw cms::Exception(
"MismatchedPFCandSrc") <<
"Error: the input tag"
242 <<
" for the PF candidate collection provided to the RecoTauBuilder "
243 <<
" does not match the one that was used to build the source jets."
244 <<
" Please update the pfCandSrc paramters for the PFTau builders.";
252 checkMatchedProductIds(pfRef,
pfCands_);
261 checkMatchedProductIds(candPtr,
pfCands_);
267 template<
typename T>
bool ptDescending(
const T&
a,
const T&
b) {
268 return a.pt() > b.pt();
270 template<
typename T>
bool ptDescendingPtr(
const T& a,
const T& b) {
271 return a->pt() > b->pt();
278 tau_->signalTauChargedHadronCandidates_.end(),
279 ptDescending<PFRecoTauChargedHadron>);
280 std::sort(
tau_->isolationTauChargedHadronCandidates_.begin(),
281 tau_->isolationTauChargedHadronCandidates_.end(),
282 ptDescending<PFRecoTauChargedHadron>);
284 tau_->signalPiZeroCandidates_.end(),
285 ptDescending<RecoTauPiZero>);
287 tau_->isolationPiZeroCandidates_.end(),
288 ptDescending<RecoTauPiZero>);
295 sortedCollection->end(),
296 ptDescendingPtr<PFCandidatePtr>);
298 for ( std::vector<PFCandidatePtr>::const_iterator particle = sortedCollection->begin();
299 particle != sortedCollection->end(); ++particle ) {
300 colkey.second->push_back(*particle);
322 double leadChargedHadronPt = 0.;
323 int leadChargedHadronCharge = 0;
324 for ( std::vector<PFRecoTauChargedHadron>::const_iterator chargedHadron =
tau_->signalTauChargedHadronCandidates_.begin();
325 chargedHadron !=
tau_->signalTauChargedHadronCandidates_.end(); ++chargedHadron ) {
328 charge += chargedHadron->charge();
329 if ( chargedHadron->pt() > leadChargedHadronPt ) {
330 leadChargedHadronPt = chargedHadron->pt();
331 leadChargedHadronCharge = chargedHadron->charge();
335 if ( nCharged == 3 )
tau_->setCharge(charge);
336 else tau_->setCharge(leadChargedHadronCharge);
339 tau_->setPdgId(
tau_->charge() < 0 ? 15 : -15);
352 tau_->setisolationPFChargedHadrCandsPtSum(
358 tau_->setisolationPFGammaCandsEtSum(
368 if ( setupLeadingObjects ) {
369 typedef std::vector<PFCandidatePtr>::const_iterator Iter;
376 tau_->setleadPFCand(*leadingCand);
384 tau_->setleadPFChargedHadrCand(*leadingChargedCand);
392 tau_->setleadPFNeutralCand(*leadingGammaCand);
void addPFCand(Region region, ParticleType type, const PFCandidateRef &ref, bool skipAddToP4=false)
Append a PFCandidateRef/Ptr to a given collection.
void addTauChargedHadron(Region region, const PFRecoTauChargedHadron &chargedHadron)
Add a ChargedHadron to the given collection.
reco::Candidate::LorentzVector p4_
std::auto_ptr< reco::PFTau > get(bool setupLeadingCandidates=true)
CollectionMap collections_
void reserve(Region region, ParticleType type, size_t size)
Reserve a set amount of space for a given RefVector.
double sumPFCandPt(InputIterator begin, InputIterator end)
Sum the pT of a collection of PFCandidates.
virtual const LorentzVector & p4() const GCC11_FINAL
four-momentum Lorentz vector
boost::shared_ptr< std::vector< PFCandidatePtr > > SortedListPtr
std::vector< PFCandidatePtr > * getCollection(Region region, ParticleType type)
std::vector< PFCandidatePtr > pfGammas(const PFJet &jet, bool sort=true)
Extract all pfGammas from a PFJet.
bool isNonnull() const
Checks for non-null.
SortedCollectionMap sortedCollections_
bool isNonnull() const
Checks for non-null.
const edm::Handle< PFCandidateCollection > & pfCands_
auto const T2 &decltype(t1.eta()) t2
SortedListPtr getSortedCollection(Region region, ParticleType type)
ProductID id() const
Accessor for product ID.
Container::value_type value_type
void addPFCands(Region region, ParticleType type, const InputIterator &begin, const InputIterator &end)
InputIterator leadPFCand(InputIterator begin, InputIterator end)
PFCandidatePtr convertToPtr(const PFCandidatePtr &pfPtr) const
unsigned int nCharged(const GenJet &jet)
std::auto_ptr< reco::PFTau > tau_
void reserveTauChargedHadron(Region region, size_t size)
Reserve a set amount of space for the ChargedHadrons.
const std::vector< PFCandidatePtr > & getNeutralPFCandidates() const
references to additional neutral PFCandidates
key_type key() const
Accessor for product key.
void reservePiZero(Region region, size_t size)
Reserve a set amount of space for the PiZeros.
std::vector< PFCandidatePtr > neutralPFCandidates_
RecoTauConstructor(const PFJetRef &jetRef, const edm::Handle< PFCandidateCollection > &pfCands, bool copyGammasFromPiZeros=false)
Constructor with PFCandidate Handle.
const daughters & daughterPtrVector() const
references to daughtes
void sortAndCopyIntoTau()
void addPiZero(Region region, const RecoTauPiZero &piZero)
Add a PiZero to the given collection.
void setChargedHadronP4(reco::PFRecoTauChargedHadron &chargedHadron, double scaleFactor_neutralPFCands=1.0)
edm::Ptr< PFCandidate > PFCandidatePtr
persistent Ptr to a PFCandidate
tuple size
Write out results.
const PFCandidatePtr & getChargedPFCandidate() const
reference to "charged" PFCandidate (either charged PFCandidate or PFNeutralHadron) ...