File indexing completed on 2025-08-12 02:29:05
0001
0002 #include <memory>
0003 #include <sstream>
0004
0005
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/stream/EDProducer.h"
0008 #include "FWCore/Framework/interface/Event.h"
0009 #include "FWCore/Framework/interface/EventSetup.h"
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0012 #include "FWCore/ParameterSet/interface/allowedValues.h"
0013
0014 #include "DataFormats/Common/interface/ValueMap.h"
0015 #include "DataFormats/L1Scouting/interface/OrbitCollection.h"
0016 #include "L1TriggerScouting/Utilities/interface/conversion.h"
0017
0018 #include "CommonTools/Utils/interface/TypedStringObjectMethodCaller.h"
0019
0020
0021
0022
0023 template <typename T>
0024 class L1ScoutingPhysicalValueMapProducer : public edm::stream::EDProducer<> {
0025 public:
0026 using TOrbitCollection = OrbitCollection<T>;
0027
0028 L1ScoutingPhysicalValueMapProducer(edm::ParameterSet const &);
0029 ~L1ScoutingPhysicalValueMapProducer() override = default;
0030
0031 static void fillDescriptions(edm::ConfigurationDescriptions &descriptions);
0032
0033 private:
0034 void produce(edm::Event &, edm::EventSetup const &) override;
0035
0036 void putValueMap(edm::Event &, edm::Handle<TOrbitCollection> &, const std::vector<float> &, const std::string &);
0037
0038 edm::EDGetTokenT<TOrbitCollection> src_;
0039
0040 static const std::unordered_map<std::string, std::function<float(int)>> func_lookup_;
0041
0042 std::vector<std::string> labels_;
0043 std::vector<TypedStringObjectMethodCaller<T, int>> getters_;
0044 std::vector<std::function<float(int)>> funcs_;
0045 };
0046
0047 template <typename T>
0048 const std::unordered_map<std::string, std::function<float(int)>> L1ScoutingPhysicalValueMapProducer<T>::func_lookup_ = {
0049 {"ugmt::fPt", l1ScoutingRun3::ugmt::fPt},
0050 {"ugmt::fEta", l1ScoutingRun3::ugmt::fEta},
0051 {"ugmt::fPhi", l1ScoutingRun3::ugmt::fPhi},
0052 {"ugmt::fPtUnconstrained", l1ScoutingRun3::ugmt::fPtUnconstrained},
0053 {"ugmt::fEtaAtVtx", l1ScoutingRun3::ugmt::fEtaAtVtx},
0054 {"ugmt::fPhiAtVtx", l1ScoutingRun3::ugmt::fPhiAtVtx},
0055 {"demux::fEt", l1ScoutingRun3::demux::fEt},
0056 {"demux::fEta", l1ScoutingRun3::demux::fEta},
0057 {"demux::fPhi", l1ScoutingRun3::demux::fPhi},
0058 };
0059
0060 template <typename T>
0061 L1ScoutingPhysicalValueMapProducer<T>::L1ScoutingPhysicalValueMapProducer(edm::ParameterSet const ¶ms)
0062 : src_(consumes(params.getParameter<edm::InputTag>("src"))) {
0063 auto conversionsPSet = params.getParameter<edm::ParameterSet>("conversions");
0064 for (const std::string &retname : conversionsPSet.getParameterNamesForType<edm::ParameterSet>()) {
0065 labels_.emplace_back(retname);
0066 const auto &conversionPSet = conversionsPSet.getParameter<edm::ParameterSet>(retname);
0067 const std::string &arg = conversionPSet.getParameter<std::string>("arg");
0068 getters_.emplace_back(arg);
0069 const std::string &func_name = conversionPSet.getParameter<std::string>("func");
0070 auto it = func_lookup_.find(func_name);
0071 if (it != func_lookup_.end()) {
0072 funcs_.emplace_back(it->second);
0073 } else {
0074 std::stringstream ss;
0075 for (auto const &func : func_lookup_)
0076 ss << "\n" << func.first;
0077 throw cms::Exception("L1ScoutingPhysicalValueMapProducer")
0078 << "Unrecognised function: " + func_name + "\nAllowed functions are" + ss.str();
0079 }
0080 produces<edm::ValueMap<float>>(retname);
0081 }
0082 }
0083
0084 template <typename T>
0085 void L1ScoutingPhysicalValueMapProducer<T>::fillDescriptions(edm::ConfigurationDescriptions &descriptions) {
0086 edm::ParameterSetDescription desc;
0087
0088 desc.add<edm::InputTag>("src");
0089
0090 edm::ParameterSetDescription conversion;
0091 conversion.add<std::string>("func")->setComment("function used to convert");
0092 conversion.add<std::string>("arg")->setComment("attribute of src to be converted");
0093
0094 edm::ParameterSetDescription conversions;
0095 conversions.setComment("a parameter set to define all conversions");
0096 conversions.addNode(
0097 edm::ParameterWildcard<edm::ParameterSetDescription>("*", edm::RequireZeroOrMore, true, conversion));
0098 desc.add<edm::ParameterSetDescription>("conversions", conversions);
0099
0100 descriptions.addWithDefaultLabel(desc);
0101 }
0102
0103 template <typename T>
0104 void L1ScoutingPhysicalValueMapProducer<T>::produce(edm::Event &iEvent, edm::EventSetup const &) {
0105 edm::Handle<TOrbitCollection> src = iEvent.getHandle(src_);
0106
0107 unsigned int nobjs = src->size();
0108 unsigned int nconversions = labels_.size();
0109
0110
0111 std::vector<std::vector<float>> converted_values(nconversions, std::vector<float>(nobjs));
0112 for (unsigned int iobj = 0; iobj < nobjs; iobj++) {
0113 const auto &obj = (*src)[iobj];
0114 for (unsigned int iconversion = 0; iconversion < nconversions; iconversion++) {
0115 int value = (getters_[iconversion])(obj);
0116 converted_values[iconversion][iobj] = (funcs_[iconversion])(value);
0117 }
0118 }
0119
0120
0121 for (unsigned int iconversion = 0; iconversion < nconversions; iconversion++) {
0122 putValueMap(iEvent, src, converted_values[iconversion], labels_[iconversion]);
0123 }
0124 }
0125
0126 template <typename T>
0127 void L1ScoutingPhysicalValueMapProducer<T>::putValueMap(edm::Event &iEvent,
0128 edm::Handle<TOrbitCollection> &handle,
0129 const std::vector<float> &values,
0130 const std::string &label) {
0131 std::unique_ptr<edm::ValueMap<float>> valuemap(new edm::ValueMap<float>());
0132 edm::ValueMap<float>::Filler filler(*valuemap);
0133 filler.insert(handle, values.begin(), values.end());
0134 filler.fill();
0135 iEvent.put(std::move(valuemap), label);
0136 }
0137
0138 #include "DataFormats/L1Scouting/interface/L1ScoutingMuon.h"
0139 using L1ScoutingMuonPhysicalValueMapProducer = L1ScoutingPhysicalValueMapProducer<l1ScoutingRun3::Muon>;
0140
0141 #include "DataFormats/L1Scouting/interface/L1ScoutingCalo.h"
0142 using L1ScoutingJetPhysicalValueMapProducer = L1ScoutingPhysicalValueMapProducer<l1ScoutingRun3::Jet>;
0143 using L1ScoutingEGammaPhysicalValueMapProducer = L1ScoutingPhysicalValueMapProducer<l1ScoutingRun3::EGamma>;
0144 using L1ScoutingTauPhysicalValueMapProducer = L1ScoutingPhysicalValueMapProducer<l1ScoutingRun3::Tau>;
0145
0146 DEFINE_FWK_MODULE(L1ScoutingMuonPhysicalValueMapProducer);
0147 DEFINE_FWK_MODULE(L1ScoutingJetPhysicalValueMapProducer);
0148 DEFINE_FWK_MODULE(L1ScoutingEGammaPhysicalValueMapProducer);
0149 DEFINE_FWK_MODULE(L1ScoutingTauPhysicalValueMapProducer);