File indexing completed on 2025-02-05 23:51:10
0001 #ifndef CommonTools_UtilAlgos_ObjectSelectorProducer_h
0002 #define CommonTools_UtilAlgos_ObjectSelectorProducer_h
0003
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/Framework/interface/ConsumesCollector.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "FWCore/Utilities/interface/InputTag.h"
0009 #include "CommonTools/UtilAlgos/interface/StoreManagerTrait.h"
0010 #include "CommonTools/UtilAlgos/interface/SelectedOutputCollectionTrait.h"
0011 #include "CommonTools/UtilAlgos/interface/NullPostProcessor.h"
0012 #include "CommonTools/UtilAlgos/interface/EventSetupInitTrait.h"
0013 #include <utility>
0014 #include <vector>
0015 #include <memory>
0016 #include <algorithm>
0017
0018
0019
0020
0021
0022
0023
0024
0025 template <typename Selector,
0026 typename OutputCollection,
0027 typename PostProcessor,
0028 typename StoreManager,
0029 typename Base,
0030 typename Init>
0031 class ObjectSelectorProducer : public Base {
0032 public:
0033
0034 explicit ObjectSelectorProducer(const edm::ParameterSet& cfg)
0035 : Base(cfg),
0036 srcToken_(
0037 this->template consumes<typename Selector::collection>(cfg.template getParameter<edm::InputTag>("src"))),
0038 selectorInit_(this->consumesCollector()),
0039 selector_(cfg, this->consumesCollector()),
0040 postProcessor_(cfg, this->consumesCollector()) {
0041 postProcessor_.init(*this);
0042 }
0043
0044 ~ObjectSelectorProducer() override {}
0045
0046 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0047 edm::ParameterSetDescription desc;
0048 desc.add<edm::InputTag>("src", edm::InputTag(""));
0049 Selector::fillPSetDescription(desc);
0050 descriptions.addWithDefaultLabel(desc);
0051 }
0052
0053 private:
0054
0055 void produce(edm::Event& evt, const edm::EventSetup& es) override {
0056 selectorInit_.init(selector_, evt, es);
0057 edm::Handle<typename Selector::collection> source;
0058 evt.getByToken(srcToken_, source);
0059 StoreManager manager(source);
0060 selector_.select(source, evt, es);
0061 manager.cloneAndStore(selector_.begin(), selector_.end(), evt);
0062 edm::OrphanHandle<OutputCollection> filtered = manager.put(evt);
0063 postProcessor_.process(filtered, evt);
0064 }
0065
0066 edm::EDGetTokenT<typename Selector::collection> srcToken_;
0067
0068 Init selectorInit_;
0069 Selector selector_;
0070
0071 PostProcessor postProcessor_;
0072 };
0073
0074 #endif