File indexing completed on 2025-01-08 03:35:56
0001 #ifndef RecoAlgos_CandidateProducer_h
0002 #define RecoAlgos_CandidateProducer_h
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include "CommonTools/UtilAlgos/interface/AnySelector.h"
0016 #include "CommonTools/UtilAlgos/interface/EventSetupInitTrait.h"
0017 #include "CommonTools/UtilAlgos/interface/MasterCollectionHelper.h"
0018 #include "DataFormats/Candidate/interface/CandidateFwd.h"
0019 #include "DataFormats/Common/interface/Handle.h"
0020 #include "FWCore/Framework/interface/Event.h"
0021 #include "FWCore/Framework/interface/stream/EDProducer.h"
0022 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0023 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0024 #include "FWCore/ParameterSet/interface/ParameterSetfwd.h"
0025 #include "FWCore/Utilities/interface/InputTag.h"
0026
0027 namespace converter {
0028 namespace helper {
0029 template <typename T>
0030 struct CandConverter {};
0031
0032 struct ConcreteCreator {
0033 template <typename CColl, typename Comp, typename Conv>
0034 static void create(size_t idx, CColl& cands, const Comp& components, Conv& converter) {
0035 typename Conv::Candidate c;
0036 typedef edm::Ref<std::vector<typename Conv::value_type> > ref_type;
0037 ref_type ref = components.template getConcreteRef<ref_type>(idx);
0038 converter.convert(ref, c);
0039 cands.push_back(c);
0040 }
0041 };
0042
0043 struct PolymorphicCreator {
0044 template <typename CColl, typename Comp, typename Conv>
0045 static void create(size_t idx, CColl& cands, const Comp& components, Conv& converter) {
0046 typename Conv::Candidate* c = new typename Conv::Candidate;
0047 typedef edm::Ref<std::vector<typename Conv::value_type> > ref_type;
0048 ref_type ref = components.template getConcreteRef<ref_type>(idx);
0049 converter.convert(ref, *c);
0050 cands.push_back(c);
0051 }
0052 };
0053
0054 template <typename CColl>
0055 struct CandCreator {
0056 typedef ConcreteCreator type;
0057 };
0058
0059 template <>
0060 struct CandCreator<reco::CandidateCollection> {
0061 typedef PolymorphicCreator type;
0062 };
0063 }
0064 }
0065
0066 template <typename TColl,
0067 typename CColl,
0068 typename Selector = AnySelector,
0069 typename Conv = typename converter::helper::CandConverter<typename TColl::value_type>::type,
0070 typename Creator = typename converter::helper::CandCreator<CColl>::type,
0071 typename Init = typename ::reco::modules::EventSetupInit<Selector>::type>
0072 class CandidateProducer : public edm::stream::EDProducer<> {
0073 public:
0074
0075 CandidateProducer(const edm::ParameterSet& cfg)
0076 : srcToken_(consumes<TColl>(cfg.template getParameter<edm::InputTag>("src"))),
0077 converter_(cfg, consumesCollector()),
0078 selectorInit_(consumesCollector()),
0079 selector_(reco::modules::make<Selector>(cfg, consumesCollector())),
0080 initialized_(false) {
0081 produces<CColl>();
0082 }
0083
0084 ~CandidateProducer() override {}
0085
0086
0087 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0088 edm::ParameterSetDescription desc;
0089 desc.add<edm::InputTag>("src", edm::InputTag(""));
0090 Conv::fillPSetDescription(desc);
0091 descriptions.addWithDefaultLabel(desc);
0092 }
0093
0094 private:
0095
0096 void beginRun(const edm::Run&, const edm::EventSetup& es) override {
0097 if (!initialized_) {
0098 converter_.beginFirstRun(es);
0099 initialized_ = true;
0100 }
0101 }
0102
0103 void produce(edm::Event& evt, const edm::EventSetup& es) override {
0104 edm::Handle<TColl> src;
0105 evt.getByToken(srcToken_, src);
0106 selectorInit_.init(selector_, evt, es);
0107 ::helper::MasterCollection<TColl> master(src, evt);
0108 std::unique_ptr<CColl> cands(new CColl);
0109 if (!src->empty()) {
0110 size_t size = src->size();
0111 cands->reserve(size);
0112 for (size_t idx = 0; idx != size; ++idx) {
0113 if (selector_((*src)[idx]))
0114 Creator::create(master.index(idx), *cands, master, converter_);
0115 }
0116 }
0117 evt.put(std::move(cands));
0118 }
0119
0120 edm::EDGetTokenT<TColl> srcToken_;
0121
0122 Conv converter_;
0123
0124 Init selectorInit_;
0125 Selector selector_;
0126
0127 bool initialized_;
0128 };
0129
0130 #endif