Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-09 23:33:59

0001 #ifndef CollectionCombiner_H
0002 #define CollectionCombiner_H
0003 
0004 /** \class CollectionCombiner 
0005  * Description: this templated EDProducer can merge (no duplicate removal) any number of collection of the same type.
0006  * the usage is to declare a concrete combiner in SealModule:
0007  * typedef CollectionCombiner<std::vector< Trajectory> > TrajectoryCombiner;
0008  * DEFINE_FWK_MODULE(TrajectoryCombiner);
0009  * edm::View cannot be used, because the template argument is used for the input and the output type.
0010  *
0011  * \author Jean-Roch Vlimant
0012  */
0013 
0014 // system include files
0015 #include <memory>
0016 
0017 // user include files
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   // ----------member data ---------------------------
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