File indexing completed on 2025-02-20 03:45:12
0001 #ifndef RecoAlgos_ObjectSelectorBase_h
0002 #define RecoAlgos_ObjectSelectorBase_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "FWCore/Framework/interface/Event.h"
0016 #include "FWCore/Framework/interface/ConsumesCollector.h"
0017 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0018 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0019 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0020 #include "FWCore/Utilities/interface/InputTag.h"
0021 #include "CommonTools/UtilAlgos/interface/ParameterAdapter.h"
0022 #include <utility>
0023 #include <vector>
0024 #include <memory>
0025 #include <algorithm>
0026
0027 template <typename Selector,
0028 typename OutputCollection,
0029 typename SizeSelector,
0030 typename PostProcessor,
0031 typename StoreManager,
0032 typename Base,
0033 typename Init>
0034 class ObjectSelectorBase : public Base {
0035 public:
0036
0037
0038 explicit ObjectSelectorBase(const edm::ParameterSet& cfg)
0039 : Base(cfg),
0040 srcToken_(
0041 this->template consumes<typename Selector::collection>(cfg.template getParameter<edm::InputTag>("src"))),
0042 filter_(false),
0043 throwOnMissing_(cfg.getUntrackedParameter<bool>("throwOnMissing", true)),
0044 selectorInit_(this->consumesCollector()),
0045 selector_(cfg, this->consumesCollector()),
0046 sizeSelector_(reco::modules::make<SizeSelector>(cfg)),
0047 postProcessor_(cfg, this->consumesCollector()) {
0048 const std::string filter("filter");
0049 std::vector<std::string> bools = cfg.template getParameterNamesForType<bool>();
0050 bool found = std::find(bools.begin(), bools.end(), filter) != bools.end();
0051 if (found)
0052 filter_ = cfg.template getParameter<bool>(filter);
0053 postProcessor_.init(*this);
0054 }
0055
0056 ~ObjectSelectorBase() override {}
0057
0058 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0059 edm::ParameterSetDescription desc;
0060 desc.add<edm::InputTag>("src", edm::InputTag(""));
0061 Selector::fillPSetDescription(desc);
0062 desc.add<bool>("filter", false);
0063 desc.addUntracked<bool>("throwOnMissing", true);
0064 descriptions.addWithDefaultLabel(desc);
0065 }
0066
0067 private:
0068
0069 bool filter(edm::Event& evt, const edm::EventSetup& es) override {
0070 selectorInit_.init(selector_, evt, es);
0071 edm::Handle<typename Selector::collection> source;
0072 evt.getByToken(srcToken_, source);
0073
0074
0075 if (!throwOnMissing_ && !source.isValid()) {
0076 return !filter_;
0077 }
0078
0079 StoreManager manager(source);
0080 selector_.select(source, evt, es);
0081 manager.cloneAndStore(selector_.begin(), selector_.end(), evt);
0082 bool result = (!filter_ || sizeSelector_(manager.size()));
0083 edm::OrphanHandle<OutputCollection> filtered = manager.put(evt);
0084 postProcessor_.process(filtered, evt);
0085 return result;
0086 }
0087
0088 edm::EDGetTokenT<typename Selector::collection> srcToken_;
0089
0090 bool filter_;
0091
0092 bool throwOnMissing_;
0093
0094 Init selectorInit_;
0095 Selector selector_;
0096
0097 SizeSelector sizeSelector_;
0098
0099 PostProcessor postProcessor_;
0100 };
0101
0102 #endif