1 #ifndef __TrackFromParentImporter_H__ 2 #define __TrackFromParentImporter_H__ 13 template <
class Collection>
21 static const std::vector<reco::PFRecTrackRef>
_empty;
25 template <
class Collection,
class Adaptor = noop::ParentCollectionAdaptor<Collection> >
30 _src(sumes.consumes<Collection>(conf.getParameter<
edm::
InputTag>(
"source"))) {}
38 template <
class Collection,
class Adaptor>
43 elems.reserve(elems.size() + 2 * pfparents->size());
45 auto TKs_end = std::partition(
48 auto bpar = pfparents->cbegin();
49 auto epar = pfparents->cend();
52 for (
auto pfparent = bpar; pfparent != epar; ++pfparent) {
53 if (Adaptor::check_importable(*pfparent)) {
55 const auto& pftracks = Adaptor::get_track_refs(*pfparent);
56 for (
const auto& pftrack : pftracks) {
57 auto tk_elem = std::find_if(
58 elems.begin(), TKs_end, [&](
const ElementType&
a) {
return (
a->trackRef() == pftrack->trackRef()); });
59 if (tk_elem != TKs_end) {
60 Adaptor::set_element_info(tk_elem->get(), parentRef);
63 Adaptor::set_element_info(trkElem, parentRef);
64 TKs_end = elems.insert(TKs_end, ElementType(trkElem));
70 elems.shrink_to_fit();
static bool check_importable(const typename Collection::value_type &)
Abstract base class for a PFBlock element (track, cluster...)
static void set_element_info(reco::PFBlockElement *, const typename edm::Ref< Collection > &)
Handle< PROD > getHandle(EDGetTokenT< PROD > token) const
Container::value_type value_type
static const std::vector< reco::PFRecTrackRef > & get_track_refs(const typename Collection::value_type &)
static const std::vector< reco::PFRecTrackRef > _empty
edm::EDGetTokenT< Collection > _src
TrackFromParentImporter(const edm::ParameterSet &conf, edm::ConsumesCollector &sumes)
std::vector< std::unique_ptr< reco::PFBlockElement > > ElementList