Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-08-12 02:29:05

0001 // system include files
0002 #include <memory>
0003 #include <sstream>
0004 
0005 // user include files
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  * Base class
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 &params)
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   // convert values
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   // put to ValueMap
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);