17 #include <boost/ptr_container/ptr_vector.hpp>
42 template <
typename Prod>
49 typedef std::vector<std::unique_ptr<CleanerEntryType>>
CleanerList;
75 template <
typename Prod>
78 tau_token = consumes<reco::PFTauCollection>(tauSrc_);
80 typedef std::vector<edm::ParameterSet>
VPSet;
83 for (VPSet::const_iterator cleanerPSet =
cleaners.begin(); cleanerPSet !=
cleaners.end(); ++cleanerPSet) {
84 auto cleanerEntry = std::make_unique<CleanerEntryType>();
89 cleanerEntry->tolerance_ = cleanerPSet->getParameter<
double>(
"tolerance");
90 cleaners_.emplace_back(
std::move(cleanerEntry));
96 outputSelector_ = std::make_unique<StringCutObjectSelector<reco::PFTau>>(
selection);
100 verbosity_ =
pset.getParameter<
int>(
"verbosity");
106 template <
typename Prod>
111 template <
typename T>
131 template <
typename T>
133 std::ostringstream os;
136 for (
unsigned iEntry = 0; iEntry <
numEntries; ++iEntry) {
145 struct PFTauRankType {
146 PFTauRankType(
const reco::PFTauRef& tauRef) : idx_(tauRef.
key()), tauRef_(tauRef) {}
149 std::cout <<
label <<
" (" << tauRef_.id() <<
":" << tauRef_.key() <<
", idx = " << idx_ <<
"):";
150 assert(tauRef_.key() == idx_);
151 std::cout <<
" Pt = " << tauRef_->pt() <<
", eta = " << tauRef_->eta() <<
", phi = " << tauRef_->phi()
152 <<
", mass = " << tauRef_->mass() <<
" (decayMode = " << tauRef_->decayMode() <<
")";
155 if (tauRef_->jetRef().isNonnull()) {
156 std::cout <<
" Pt = " << tauRef_->jetRef()->pt() <<
", eta = " << tauRef_->jetRef()->eta()
157 <<
", phi = " << tauRef_->jetRef()->phi() <<
", mass = " << tauRef_->jetRef()->mass()
158 <<
", area = " << tauRef_->jetRef()->jetArea();
162 const std::vector<reco::PFRecoTauChargedHadron>& signalTauChargedHadronCandidates =
163 tauRef_->signalTauChargedHadronCandidates();
164 size_t numChargedHadrons = signalTauChargedHadronCandidates.size();
165 for (
size_t iChargedHadron = 0; iChargedHadron < numChargedHadrons; ++iChargedHadron) {
167 std::cout <<
" chargedHadron #" << iChargedHadron <<
":" << std::endl;
170 const std::vector<reco::RecoTauPiZero>& signalPiZeroCandidates = tauRef_->signalPiZeroCandidates();
171 size_t numPiZeros = signalPiZeroCandidates.size();
172 std::cout <<
"signalPiZeroCandidates = " << numPiZeros << std::endl;
173 for (
size_t iPiZero = 0; iPiZero < numPiZeros; ++iPiZero) {
175 std::cout <<
" piZero #" << iPiZero <<
": Pt = " << piZero.
pt() <<
", eta = " << piZero.
eta()
176 <<
", phi = " << piZero.
phi() <<
", mass = " << piZero.
mass() << std::endl;
178 const auto& isolationCands = tauRef_->isolationCands();
179 size_t numCands = isolationCands.size();
180 std::cout <<
"isolationCands = " << numCands << std::endl;
181 for (
size_t iCand = 0; iCand < numCands; ++iCand) {
182 const auto&
cand = isolationCands.at(iCand);
183 std::cout <<
" pfCand #" << iCand <<
" (" <<
cand.id() <<
":" <<
cand.key() <<
"):"
184 <<
" Pt = " <<
cand->pt() <<
", eta = " <<
cand->eta() <<
", phi = " <<
cand->phi() << std::endl;
186 std::cout <<
" ranks = " << format_vT(ranks_) << std::endl;
187 std::cout <<
" tolerances = " << format_vT(tolerances_) << std::endl;
192 std::vector<float> ranks_;
193 std::vector<float> tolerances_;
196 bool isHigherRank(
const PFTauRankType*
tau1,
const PFTauRankType*
tau2) {
205 for (
size_t i = 0;
i <
tau1->N_; ++
i) {
206 const float& val1 =
tau1->ranks_[
i];
207 const float& val2 =
tau2->ranks_[
i];
208 double av = 0.5 * (val1 + val2);
210 if (val1 < (val2 -
thresh))
212 else if (val2 < (val1 -
thresh))
219 template <
typename Prod>
222 std::cout <<
"<RecoTauCleanerImpl::produce>:" << std::endl;
226 for (
typename CleanerList::iterator cleaner = cleaners_.begin(); cleaner != cleaners_.end(); ++cleaner) {
227 (*cleaner)->plugin_->setup(evt, es);
235 std::list<PFTauRankType*> rankedTaus;
236 size_t N = inputTaus->size();
239 PFTauRankType* rankedTau =
new PFTauRankType(inputRef);
240 rankedTau->N_ = cleaners_.size();
241 rankedTau->ranks_.reserve(rankedTau->N_);
242 rankedTau->tolerances_.reserve(rankedTau->N_);
243 for (
typename CleanerList::const_iterator cleaner = cleaners_.begin(); cleaner != cleaners_.end(); ++cleaner) {
244 rankedTau->ranks_.push_back((*(*cleaner)->plugin_)(inputRef));
245 rankedTau->tolerances_.push_back((*cleaner)->tolerance_);
248 std::ostringstream os;
249 os <<
"rankedTau #" <<
idx;
250 rankedTau->print(os.str());
252 rankedTaus.push_back(rankedTau);
254 rankedTaus.sort(isHigherRank);
257 typedef std::vector<reco::PFTauRef> PFTauRefs;
258 PFTauRefs dirty(inputTaus->size());
259 size_t idx_sorted = 0;
260 for (std::list<PFTauRankType*>::const_iterator rankedTau = rankedTaus.begin(); rankedTau != rankedTaus.end();
262 dirty[idx_sorted] = (*rankedTau)->tauRef_;
264 std::cout <<
"dirty[" << idx_sorted <<
"] = " << dirty[idx_sorted].id() <<
":" << dirty[idx_sorted].key()
272 PFTauRefs cleanTaus = reco::tau::cleanOverlaps<PFTauRefs, RemoveDuplicateJets>(dirty);
275 auto output = std::make_unique<Prod>();
279 for (PFTauRefs::const_iterator
tau = cleanTaus.begin();
tau != cleanTaus.end(); ++
tau) {
281 bool selected =
true;
282 if (outputSelector_.get() && !(*outputSelector_)(**tau)) {
286 output->push_back(convert<output_type>(*
tau));
306 vps_description_for_cleaners.
add<
double>(
"tolerance", 0);
311 vps_description_for_cleaners.
addOptional<
int>(
"passForCharge");
312 vps_description_for_cleaners.
addOptional<
double>(
"selectionFailValue");
313 vps_description_for_cleaners.
addOptional<std::vector<unsigned int>>(
"nprongs");
315 vps_description_for_cleaners.
addOptional<
double>(
"minTrackPt");
323 std::vector<edm::ParameterSet> default_cleaners;
324 default_cleaners.reserve(7);
330 cleaner_Charge.
addParameter<
double>(
"selectionFailValue", 0);
331 cleaner_Charge.
addParameter<std::vector<unsigned int>>(
"nprongs",
337 default_cleaners.push_back(cleaner_Charge);
345 default_cleaners.push_back(temp2);
353 default_cleaners.push_back(temp2);
360 default_cleaners.push_back(temp2);
368 temp2.
addParameter<
double>(
"selectionFailValue", 1000.0);
370 default_cleaners.push_back(temp2);
378 temp2.
addParameter<
double>(
"selectionFailValue", 1000.0);
380 default_cleaners.push_back(temp2);
387 "isolationPFChargedHadrCandsPtSum() + isolationPFGammaCandsEtSum()");
389 temp2.
addParameter<
double>(
"selectionFailValue", 1000.0);
391 default_cleaners.push_back(temp2);
394 desc.addVPSet(
"cleaners", vps_description_for_cleaners, default_cleaners);
397 desc.add<
int>(
"verbosity", 0);
399 descriptions.
add(
"RecoTauCleaner",
desc);