Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2023-03-17 11:22:15

0001 #include "FWCore/Framework/interface/Frameworkfwd.h"
0002 #include "FWCore/Framework/interface/global/EDProducer.h"
0003 
0004 #include "FWCore/Framework/interface/Event.h"
0005 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0006 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 
0009 #include <vector>
0010 #include <memory>
0011 
0012 namespace {
0013   class ClassifierMerger final : public edm::global::EDProducer<> {
0014   public:
0015     explicit ClassifierMerger(const edm::ParameterSet& conf) {
0016       for (auto const& it : conf.getParameter<std::vector<std::string>>("inputClassifiers")) {
0017         srcMVAs.push_back(consumes<MVACollection>(edm::InputTag(it, "MVAValues")));
0018         srcQuals.push_back(consumes<QualityMaskCollection>(edm::InputTag(it, "QualityMasks")));
0019       }
0020 
0021       produces<MVACollection>("MVAValues");
0022       produces<QualityMaskCollection>("QualityMasks");
0023     }
0024 
0025     static void fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0026       edm::ParameterSetDescription desc;
0027       desc.add<std::vector<std::string>>("inputClassifiers", std::vector<std::string>());
0028       descriptions.add("ClassifierMerger", desc);
0029     }
0030 
0031   private:
0032     using MVACollection = std::vector<float>;
0033     using QualityMaskCollection = std::vector<unsigned char>;
0034 
0035     void produce(edm::StreamID, edm::Event& evt, const edm::EventSetup&) const override {
0036       // get Master
0037       edm::Handle<MVACollection> hmva;
0038       evt.getByToken(srcMVAs[0], hmva);
0039       auto size = (*hmva).size();
0040 
0041       edm::Handle<QualityMaskCollection> hqual;
0042       evt.getByToken(srcQuals[0], hqual);
0043 
0044       // products
0045       auto mvas = std::make_unique<MVACollection>(*hmva);
0046       auto quals = std::make_unique<QualityMaskCollection>(*hqual);
0047 
0048       for (auto i = 1U; i < srcQuals.size(); ++i) {
0049         evt.getByToken(srcQuals[i], hqual);
0050         auto const& iq = *hqual;
0051         assert(iq.size() == size);
0052         for (auto j = 0U; j != size; ++j)
0053           (*quals)[j] |= iq[j];
0054       }
0055 
0056       evt.put(std::move(mvas), "MVAValues");
0057       evt.put(std::move(quals), "QualityMasks");
0058     }
0059 
0060     std::vector<edm::EDGetTokenT<MVACollection>> srcMVAs;
0061     std::vector<edm::EDGetTokenT<QualityMaskCollection>> srcQuals;
0062   };
0063 }  // namespace
0064 
0065 #include "FWCore/PluginManager/interface/ModuleDef.h"
0066 #include "FWCore/Framework/interface/MakerMacros.h"
0067 
0068 DEFINE_FWK_MODULE(ClassifierMerger);