File indexing completed on 2025-01-09 23:33:59
0001 #ifndef CollectionCombiner_H
0002 #define CollectionCombiner_H
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015 #include <memory>
0016
0017
0018 #include "FWCore/Framework/interface/Frameworkfwd.h"
0019 #include "FWCore/Framework/interface/global/EDProducer.h"
0020
0021 #include "FWCore/Framework/interface/Event.h"
0022
0023 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0024 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0025 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0026
0027 template <typename Collection>
0028 class CollectionCombiner : public edm::global::EDProducer<> {
0029 public:
0030 explicit CollectionCombiner(const edm::ParameterSet&);
0031 ~CollectionCombiner() override = default;
0032
0033 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0034
0035 private:
0036 void produce(edm::StreamID, edm::Event&, const edm::EventSetup&) const override;
0037
0038
0039 std::vector<edm::InputTag> labels;
0040 std::vector<edm::EDGetTokenT<Collection> > collectionTokens;
0041 };
0042
0043 template <typename Collection>
0044 CollectionCombiner<Collection>::CollectionCombiner(const edm::ParameterSet& iConfig) {
0045 labels = iConfig.getParameter<std::vector<edm::InputTag> >("labels");
0046 produces<Collection>();
0047 for (unsigned int i = 0; i < labels.size(); ++i)
0048 collectionTokens.push_back(consumes<Collection>(labels.at(i)));
0049 }
0050
0051 template <typename Collection>
0052 void CollectionCombiner<Collection>::produce(edm::StreamID, edm::Event& iEvent, const edm::EventSetup& es) const {
0053 unsigned int i = 0, i_max = labels.size();
0054 edm::Handle<Collection> handle;
0055 auto merged = std::make_unique<Collection>();
0056 for (; i != i_max; ++i) {
0057 iEvent.getByToken(collectionTokens[i], handle);
0058 merged->insert(merged->end(), handle->begin(), handle->end());
0059 }
0060 iEvent.put(std::move(merged));
0061 }
0062
0063 template <typename Collection>
0064 void CollectionCombiner<Collection>::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0065 edm::ParameterSetDescription desc;
0066 desc.add<std::vector<edm::InputTag> >("labels", {});
0067 descriptions.addWithDefaultLabel(desc);
0068 }
0069
0070 #endif