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
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
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 }
0064
0065 #include "FWCore/PluginManager/interface/ModuleDef.h"
0066 #include "FWCore/Framework/interface/MakerMacros.h"
0067
0068 DEFINE_FWK_MODULE(ClassifierMerger);