Back to home page

Project CMSSW displayed by LXR

 
 

    


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  * This class template is like ObjectSelector, but it is an EDProducer
0020  * instead of EDFilter. Use case is that when the filter decisions are
0021  * ignored (cms.ignore in configuration or EDFilter returns always
0022  * true), EDProducers are better for the unscheduled mode than
0023  * EDFilters.
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   /// constructor
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   /// destructor
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   /// process one event
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   /// source collection label
0066   edm::EDGetTokenT<typename Selector::collection> srcToken_;
0067   /// Object collection selector
0068   Init selectorInit_;
0069   Selector selector_;
0070   /// post processor
0071   PostProcessor postProcessor_;
0072 };
0073 
0074 #endif