15 namespace reco {
namespace tau {
22 const std::vector<RecoTauPiZero>& piZeros,
23 const std::vector<PFCandidatePtr>& regionalExtras)
const;
39 qcuts_(pset.getParameter<edm::
ParameterSet>(
"qualityCuts")),
40 usePFLeptonsAsChargedHadrons_(pset.getParameter<bool>(
"usePFLeptons")),
41 isolationConeSize_(pset.getParameter<double>(
"isolationConeSize")) {
42 typedef std::vector<edm::ParameterSet> VPSet;
43 const VPSet& decayModes = pset.
getParameter<VPSet>(
"decayModes");
44 for (VPSet::const_iterator dm = decayModes.begin();
45 dm != decayModes.end(); ++dm) {
47 info.
nCharged_ = dm->getParameter<uint32_t>(
"nCharged");
48 info.
nPiZeros_ = dm->getParameter<uint32_t>(
"nPiZeros");
49 info.
maxPFCHs_ = dm->getParameter<uint32_t>(
"maxTracks");
50 info.
maxPiZeros_ = dm->getParameter<uint32_t>(
"maxPiZeros");
58 const std::vector<RecoTauPiZero>& piZeros,
59 const std::vector<PFCandidatePtr>& regionalExtras)
const {
61 typedef std::vector<PFCandidatePtr>
PFCandPtrs;
62 typedef std::vector<RecoTauPiZero> PiZeroList;
89 for (std::vector<decayModeInfo>::const_iterator
93 size_t piZerosToBuild = decayMode->nPiZeros_;
95 size_t tracksToBuild = decayMode->nCharged_;
98 if (pfchs.size() < tracksToBuild)
102 PFCandPtrs::iterator pfch_begin = pfchs.begin();
103 PFCandPtrs::iterator pfch_end = pfchs.end();
104 pfch_end =
takeNElements(pfch_begin, pfch_end, decayMode->maxPFCHs_);
108 PFCombo trackCombos(pfch_begin, pfch_end, tracksToBuild);
115 for (PFCombo::iterator trackCombo = trackCombos.begin();
116 trackCombo != trackCombos.end(); ++trackCombo) {
119 xCleaner(trackCombo->combo_begin(), trackCombo->combo_end());
121 PiZeroList cleanPiZeros = xCleaner(piZeros);
125 if (cleanPiZeros.size() < piZerosToBuild)
129 PiZeroList::iterator piZero_begin = cleanPiZeros.begin();
130 PiZeroList::iterator piZero_end = cleanPiZeros.end();
133 decayMode->maxPiZeros_);
137 PiZeroCombo piZeroCombos(piZero_begin, piZero_end, piZerosToBuild);
140 for (PiZeroCombo::iterator piZeroCombo = piZeroCombos.begin();
141 piZeroCombo != piZeroCombos.end(); ++piZeroCombo) {
160 (cleanPiZeros.size() - piZerosToBuild)*2);
162 (cleanPiZeros.size() - piZerosToBuild));
168 trackCombo->combo_begin(), trackCombo->combo_end()
175 piZeroCombo->combo_begin(), piZeroCombo->combo_end()
180 using namespace reco::tau::cone;
189 pfCandFilter(isolationConeFilter, pfCandXCleaner);
206 RegionalJunkConeAndIdFilter pfChargedJunk(
211 RegionalJunkConeAndIdFilter pfGammaJunk(
216 RegionalJunkConeAndIdFilter pfNeutralJunk(
224 boost::make_filter_iterator(
226 trackCombo->remainder_begin(), trackCombo->remainder_end()),
227 boost::make_filter_iterator(
229 trackCombo->remainder_end(), trackCombo->remainder_end())
236 boost::make_filter_iterator(
238 pfch_end, pfchs.end()),
239 boost::make_filter_iterator(
241 pfchs.end(), pfchs.end())
247 boost::make_filter_iterator(
248 pfChargedJunk, regionalJunk.begin(), regionalJunk.end()),
249 boost::make_filter_iterator(
250 pfChargedJunk, regionalJunk.end(), regionalJunk.end())
257 boost::make_filter_iterator(
258 pfGammaJunk, regionalJunk.begin(), regionalJunk.end()),
259 boost::make_filter_iterator(
260 pfGammaJunk, regionalJunk.end(), regionalJunk.end())
266 boost::make_filter_iterator(
268 pfnhs.begin(), pfnhs.end()),
269 boost::make_filter_iterator(
271 pfnhs.end(), pfnhs.end())
277 boost::make_filter_iterator(
278 pfNeutralJunk, regionalJunk.begin(), regionalJunk.end()),
279 boost::make_filter_iterator(
280 pfNeutralJunk, regionalJunk.end(), regionalJunk.end())
285 boost::make_filter_iterator(
286 isolationConeFilterPiZero,
287 piZeroCombo->remainder_begin(), piZeroCombo->remainder_end()),
288 boost::make_filter_iterator(
289 isolationConeFilterPiZero,
290 piZeroCombo->remainder_end(), piZeroCombo->remainder_end())
295 boost::make_filter_iterator(
296 isolationConeFilterPiZero,
297 piZero_end, cleanPiZeros.end()),
298 boost::make_filter_iterator(
299 isolationConeFilterPiZero,
300 cleanPiZeros.end(), cleanPiZeros.end())
303 output.push_back(tau.
get(
true));
307 return output.release();
314 "RecoTauBuilderCombinatoricPlugin");
T getParameter(std::string const &) const
const edm::Handle< PFCandidateCollection > & getPFCands() const
Hack to be able to convert Ptrs to Refs.
InputIterator takeNElements(const InputIterator &begin, const InputIterator &end, size_t N)
std::auto_ptr< reco::PFTau > get(bool setupLeadingCandidates=true)
void reserve(Region region, ParticleType type, size_t size)
Reserve a set amount of space for a given RefVector.
Coll filterRefs(const Coll &refcoll, bool invert=false) const
Filter a ref vector of PFCandidates.
std::vector< reco::PFCandidatePtr > PFCandPtrs
boost::ptr_vector< reco::PFTau > output_type
std::auto_ptr< output_type > return_type
virtual ~RecoTauBuilderCombinatoricPlugin()
std::vector< PFCandidatePtr > pfCandidates(const PFJet &jet, int particleId, bool sort=true)
void addPiZeros(Region region, const InputIterator &begin, const InputIterator &end)
Add a list of pi zeros to the input collection.
std::vector< decayModeInfo > decayModesToBuild_
void setPV(const reco::VertexRef &vtx) const
Update the primary vertex.
bool usePFLeptonsAsChargedHadrons_
const reco::Candidate::LorentzVector & p4() const
virtual return_type operator()(const reco::PFJetRef &jet, const std::vector< RecoTauPiZero > &piZeros, const std::vector< PFCandidatePtr > ®ionalExtras) const
void addPFCands(Region region, ParticleType type, const InputIterator &begin, const InputIterator &end)
RecoTauQualityCuts qcuts_
void reservePiZero(Region region, size_t size)
Reserve a set amount of space for the PiZeros.
std::vector< PFCandidatePtr > pfChargedCands(const PFJet &jet, bool sort=true)
Extract all non-neutral candidates from a PFJet.
RecoTauBuilderCombinatoricPlugin(const edm::ParameterSet &pset)
#define DEFINE_EDM_PLUGIN(factory, type, name)
double isolationConeSize_
const reco::VertexRef & primaryVertex() const
Get primary vertex associated to this event.
Transform a pizero to remove given candidates.