14 bool copyGammasFromPiZeros,
20 : signalConeSize_(signalConeSize),
21 minAbsPhotonSumPt_insideSignalCone_(minAbsPhotonSumPt_insideSignalCone),
22 minRelPhotonSumPt_insideSignalCone_(minRelPhotonSumPt_insideSignalCone),
23 minAbsPhotonSumPt_outsideSignalCone_(minAbsPhotonSumPt_outsideSignalCone),
24 minRelPhotonSumPt_outsideSignalCone_(minRelPhotonSumPt_outsideSignalCone),
52 LogDebug(
"TauConstructorAddPFCand") <<
" region = " << region <<
", type = " << type <<
": Pt = " << ptr->pt()
53 <<
", eta = " << ptr->eta() <<
", phi = " << ptr->phi();
58 LogDebug(
"TauConstructorAddPFCand") <<
"--> adding PFCand to tauP4.";
77 tau_->signalTauChargedHadronCandidatesRestricted().reserve(size);
78 tau_->selectedSignalChargedHadrCands_.reserve(size);
80 tau_->isolationTauChargedHadronCandidatesRestricted().reserve(size);
81 tau_->selectedIsolationChargedHadrCands_.reserve(size);
87 LogDebug(
"TauConstructorCheckOverlap") <<
" pfGammas: #entries = " << pfGammas.size();
88 for (std::vector<CandidatePtr>::const_iterator
pfGamma = pfGammas.begin();
pfGamma != pfGammas.end(); ++
pfGamma) {
90 if ((*pfGamma).refCore() == neutral.
refCore() && (*pfGamma).key() == neutral.
key())
96 LogDebug(
"TauConstructorCheckOverlap") <<
" piZeros: #entries = " << piZeros.size();
97 for (std::vector<reco::RecoTauPiZero>::const_iterator piZero = piZeros.begin(); piZero != piZeros.end();
99 size_t numPFGammas = piZero->numberOfDaughters();
100 for (
size_t iPFGamma = 0; iPFGamma < numPFGammas; ++iPFGamma) {
102 LogDebug(
"TauConstructorCheckOverlap") <<
"pfGamma = " << pfGamma.
id() <<
":" << pfGamma.
key();
103 if (pfGamma.
id() == neutral.
id() && pfGamma.
key() == neutral.
key())
111 LogDebug(
"TauConstructorAddChH") <<
" region = " << region <<
": Pt = " << chargedHadron.
pt()
112 <<
", eta = " << chargedHadron.
eta() <<
", phi = " << chargedHadron.
phi();
115 std::vector<CandidatePtr> neutrals_cleaned;
116 for (std::vector<CandidatePtr>::const_iterator neutral = neutrals.begin(); neutral != neutrals.end(); ++neutral) {
117 LogDebug(
"TauConstructorAddChH") <<
"neutral = " << neutral->id() <<
":" << neutral->key();
118 bool isUnique =
true;
127 checkOverlap(*neutral,
tau_->isolationPiZeroCandidatesRestricted(), isUnique);
129 LogDebug(
"TauConstructorAddChH") <<
"--> isUnique = " << isUnique;
131 neutrals_cleaned.push_back(*neutral);
134 if (neutrals_cleaned.size() != neutrals.size()) {
139 tau_->signalTauChargedHadronCandidatesRestricted().push_back(chargedHadron_cleaned);
140 p4_ += chargedHadron_cleaned.
p4();
145 for (std::vector<CandidatePtr>::const_iterator neutral = neutrals.begin(); neutral != neutrals.end(); ++neutral) {
146 if (
std::abs((*neutral)->pdgId()) == 22)
148 else if (
std::abs((*neutral)->pdgId()) == 130)
152 tau_->isolationTauChargedHadronCandidatesRestricted().push_back(chargedHadron_cleaned);
160 for (std::vector<CandidatePtr>::const_iterator neutral = neutrals.begin(); neutral != neutrals.end(); ++neutral) {
161 if (
std::abs((*neutral)->pdgId()) == 22)
163 else if (
std::abs((*neutral)->pdgId()) == 130)
171 tau_->signalPiZeroCandidatesRestricted().reserve(size);
177 tau_->isolationPiZeroCandidatesRestricted().reserve(size);
184 LogDebug(
"TauConstructorAddPi0") <<
" region = " << region <<
": Pt = " << piZero.
pt() <<
", eta = " << piZero.
eta()
185 <<
", phi = " << piZero.
phi();
187 tau_->signalPiZeroCandidatesRestricted().push_back(piZero);
196 tau_->isolationPiZeroCandidatesRestricted().push_back(piZero);
216 template <
typename T1,
typename T2>
217 void checkMatchedProductIds(
const T1&
t1,
const T2&
t2) {
218 if (t1.id() != t2.id()) {
220 <<
"Error: the input tag" 221 <<
" for the PF candidate collection provided to the RecoTauBuilder " 222 <<
" does not match the one that was used to build the source jets." 223 <<
" Please update the pfCandSrc paramters for the PFTau builders.";
231 checkMatchedProductIds(candPtr,
pfCands_);
238 template <
typename T>
239 bool ptDescending(
const T&
a,
const T&
b) {
240 return a.pt() > b.pt();
242 template <
typename T>
243 bool ptDescendingPtr(
const T& a,
const T& b) {
244 return a->pt() > b->pt();
250 std::sort(
tau_->signalTauChargedHadronCandidatesRestricted().begin(),
251 tau_->signalTauChargedHadronCandidatesRestricted().end(),
252 ptDescending<PFRecoTauChargedHadron>);
253 std::sort(
tau_->isolationTauChargedHadronCandidatesRestricted().begin(),
254 tau_->isolationTauChargedHadronCandidatesRestricted().end(),
255 ptDescending<PFRecoTauChargedHadron>);
256 std::sort(
tau_->signalPiZeroCandidatesRestricted().begin(),
257 tau_->signalPiZeroCandidatesRestricted().end(),
258 ptDescending<RecoTauPiZero>);
259 std::sort(
tau_->isolationPiZeroCandidatesRestricted().begin(),
260 tau_->isolationPiZeroCandidatesRestricted().end(),
261 ptDescending<RecoTauPiZero>);
267 std::sort(sortedCollection->begin(), sortedCollection->end(), ptDescendingPtr<CandidatePtr>);
269 for (std::vector<CandidatePtr>::const_iterator particle = sortedCollection->begin();
270 particle != sortedCollection->end();
272 colkey.second->push_back(*particle);
291 for (std::vector<RecoTauPiZero>::const_iterator piZero = piZeros.begin(); piZero != piZeros.end(); ++piZero) {
292 double photonSumPt_insideSignalCone = 0.;
293 double photonSumPt_outsideSignalCone = 0.;
294 int numPhotons = piZero->numberOfDaughters();
295 for (
int idxPhoton = 0; idxPhoton < numPhotons; ++idxPhoton) {
298 if (dR < dRsignalCone) {
299 photonSumPt_insideSignalCone += photon->
pt();
301 photonSumPt_outsideSignalCone += photon->
pt();
304 if (photonSumPt_insideSignalCone > minAbsPhotonSumPt_insideSignalCone ||
305 photonSumPt_insideSignalCone > (minRelPhotonSumPt_insideSignalCone * tau.
pt()) ||
306 photonSumPt_outsideSignalCone > minAbsPhotonSumPt_outsideSignalCone ||
307 photonSumPt_outsideSignalCone > (minRelPhotonSumPt_outsideSignalCone * tau.
pt()))
315 unsigned int trackIndex = (nCharged - 1) * (maxPiZeros + 1);
321 if (nPiZeros > maxPiZeros)
328 LogDebug(
"TauConstructorGet") <<
"Start getting";
343 double leadChargedHadronPt = 0.;
344 int leadChargedHadronCharge = 0;
345 for (std::vector<PFRecoTauChargedHadron>::const_iterator
chargedHadron =
346 tau_->signalTauChargedHadronCandidatesRestricted().begin();
360 tau_->setCharge(charge);
362 tau_->setCharge(leadChargedHadronCharge);
365 tau_->setPdgId(
tau_->charge() < 0 ? 15 : -15);
372 tau_->setSignalConeSize(dRsignalCone);
379 tau_->setDecayMode(dm);
381 LogDebug(
"TauConstructorGet") <<
"Pt = " <<
tau_->pt() <<
", eta = " <<
tau_->eta() <<
", phi = " <<
tau_->phi()
382 <<
", mass = " <<
tau_->mass() <<
", dm = " <<
tau_->decayMode();
389 tau_->setisolationPFGammaCandsEtSum(
396 if (setupLeadingObjects) {
397 typedef std::vector<CandidatePtr>::const_iterator Iter;
402 tau_->setleadCand(*leadingCand);
405 Iter leadingChargedCand =
409 tau_->setleadChargedHadrCand(*leadingChargedCand);
415 tau_->setleadNeutralCand(*leadingGammaCand);
void addPFCand(Region region, ParticleType type, const CandidatePtr &ptr, bool skipAddToP4=false)
Append a PFCandidateRef/Ptr to a given collection.
minRelPhotonSumPt_outsideSignalCone
void addTauChargedHadron(Region region, const PFRecoTauChargedHadron &chargedHadron)
Add a ChargedHadron to the given collection.
double minRelPhotonSumPt_outsideSignalCone_
reco::Candidate::LorentzVector p4_
CollectionMap collections_
void reserve(Region region, ParticleType type, size_t size)
Reserve a set amount of space for a given RefVector.
double eta() const final
momentum pseudorapidity
double sumPFCandPt(InputIterator begin, InputIterator end)
Sum the pT of a collection of PFCandidates.
std::vector< CandidatePtr > * getCollection(Region region, ParticleType type)
std::unique_ptr< reco::PFTau > tau_
minAbsPhotonSumPt_insideSignalCone
double pt() const final
transverse momentum
minAbsPhotonSumPt_outsideSignalCone
std::unique_ptr< reco::PFTau > get(bool setupLeadingCandidates=true)
InputIterator leadCand(InputIterator begin, InputIterator end)
virtual const daughters & daughterPtrVector() const
references to daughtes
const edm::Handle< edm::View< reco::Candidate > > & pfCands_
SortedCollectionMap sortedCollections_
virtual const LorentzVector & p4() const =0
four-momentum Lorentz vector
const std::vector< RecoTauPiZero > & signalPiZeroCandidates() const
Retrieve the association of signal region gamma candidates into candidate PiZeros.
SortedListPtr getSortedCollection(Region region, ParticleType type)
RefCore const & refCore() const
Abs< T >::type abs(const T &t)
const LorentzVector & p4() const final
four-momentum Lorentz vector
minRelPhotonSumPt_insideSignalCone
std::vector< CandidatePtr > neutralPFCandidates_
void addPFCands(Region region, ParticleType type, const InputIterator &begin, const InputIterator &end)
bool isNonnull() const
Checks for non-null.
constexpr auto deltaR(const T1 &t1, const T2 &t2) -> decltype(t1.eta())
double minAbsPhotonSumPt_outsideSignalCone_
edm::Ptr< Candidate > CandidatePtr
persistent reference to an object in a collection of Candidate objects
virtual double pt() const =0
transverse momentum
void reserveTauChargedHadron(Region region, size_t size)
Reserve a set amount of space for the ChargedHadrons.
void reservePiZero(Region region, size_t size)
Reserve a set amount of space for the PiZeros.
ProductID id() const
Accessor for product ID.
double minRelPhotonSumPt_insideSignalCone_
std::shared_ptr< std::vector< CandidatePtr > > SortedListPtr
def checkOverlap(process)
void sortAndCopyIntoTau()
const std::vector< PFRecoTauChargedHadron > & signalTauChargedHadronCandidates() const
Retrieve the association of signal region PF candidates into candidate PFRecoTauChargedHadrons.
void addPiZero(Region region, const RecoTauPiZero &piZero)
Add a PiZero to the given collection.
const StringObjectFunction< reco::PFTau > * signalConeSize_
double minAbsPhotonSumPt_insideSignalCone_
void setChargedHadronP4(reco::PFRecoTauChargedHadron &chargedHadron, double scaleFactor_neutralPFCands=1.0)
CandidatePtr convertToPtr(const PFCandidatePtr &pfPtr) const
const CandidatePtr & getChargedPFCandidate() const
reference to "charged" PFCandidate (either charged PFCandidate or PFNeutralHadron) ...
edm::Ptr< PFCandidate > PFCandidatePtr
persistent Ptr to a PFCandidate
double phi() const final
momentum azimuthal angle
std::vector< CandidatePtr > pfGammas(const Jet &jet, bool sort=true)
Extract all pfGammas from a PFJet.
const std::vector< CandidatePtr > & getNeutralPFCandidates() const
references to additional neutral PFCandidates
RecoTauConstructor(const JetBaseRef &jetRef, const edm::Handle< edm::View< reco::Candidate > > &pfCands, bool copyGammasFromPiZeros=false, const StringObjectFunction< reco::PFTau > *signalConeSize=0, double minAbsPhotonSumPt_insideSignalCone=2.5, double minRelPhotonSumPt_insideSignalCone=0., double minAbsPhotonSumPt_outsideSignalCone=1.e+9, double minRelPhotonSumPt_outsideSignalCone=1.e+9)
Constructor with PFCandidate Handle.