From 4b674c9734e9280d06f3b8ea15413910d55b6696 Mon Sep 17 00:00:00 2001 From: sbein Date: Sat, 18 Feb 2023 02:27:57 +0100 Subject: [PATCH 1/7] backporting restructuring of ONNX backend and refinement modules for FastSim NANO collections --- PhysicsTools/NanoAOD/plugins/BuildFile.xml | 2 +- PhysicsTools/NanoAOD/python/jets_cff.py | 59 ++++ .../ONNXRuntime/interface/ONNXRuntime.h | 7 + PhysicsTools/PatAlgos/BuildFile.xml | 3 + .../interface/BaseMVAValueMapProducer.h | 320 ++++++++++++++++++ .../plugins/BaseMVAValueMapProducer.cc | 5 +- .../plugins/BaseMVAValueMapProducer.h | 241 ------------- PhysicsTools/PatAlgos/plugins/BuildFile.xml | 1 - 8 files changed, 392 insertions(+), 246 deletions(-) create mode 100644 PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h delete mode 100644 PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h diff --git a/PhysicsTools/NanoAOD/plugins/BuildFile.xml b/PhysicsTools/NanoAOD/plugins/BuildFile.xml index 587b18fc96309..3b184ea00b6d5 100644 --- a/PhysicsTools/NanoAOD/plugins/BuildFile.xml +++ b/PhysicsTools/NanoAOD/plugins/BuildFile.xml @@ -1,4 +1,3 @@ - @@ -14,6 +13,7 @@ + diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index f2574d121deaf..5d51ad4cf93c5 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -531,6 +531,65 @@ run2_jme_2017.toModify( cjetNN,outputFormulas = cms.vstring(["at(0)*0.24718524515628815+0.9927206635475159","0.5*(at(2)-at(1))*0.24718524515628815"])) +# +# ML-based FastSim refinement +# +from Configuration.Eras.Modifier_fastSim_cff import fastSim +def nanoAOD_refineFastSim_bTagDeepFlav(process): + + fastSim.toModify( process.jetTable.variables, + btagDeepFlavBunrefined = process.jetTable.variables.btagDeepFlavB.clone(), + btagDeepFlavCvBunrefined = process.jetTable.variables.btagDeepFlavCvB.clone(), + btagDeepFlavCvLunrefined = process.jetTable.variables.btagDeepFlavCvL.clone(), + btagDeepFlavQGunrefined = process.jetTable.variables.btagDeepFlavQG.clone(), + ) + + fastSim.toModify( process.jetTable.variables, + btagDeepFlavB = None, + btagDeepFlavCvB = None, + btagDeepFlavCvL = None, + btagDeepFlavQG = None, + ) + + fastSim.toModify( process.jetTable.externalVariables, + btagDeepFlavB = ExtVar(cms.InputTag("btagDeepFlavRefineNN:btagDeepFlavBrefined"), float, doc="DeepJet b+bb+lepb tag discriminator", precision=10), + btagDeepFlavCvB = ExtVar(cms.InputTag("btagDeepFlavRefineNN:btagDeepFlavCvBrefined"), float, doc="DeepJet c vs b+bb+lepb discriminator", precision=10), + btagDeepFlavCvL = ExtVar(cms.InputTag("btagDeepFlavRefineNN:btagDeepFlavCvLrefined"), float, doc="DeepJet c vs uds+g discriminator", precision=10), + btagDeepFlavQG = ExtVar(cms.InputTag("btagDeepFlavRefineNN:btagDeepFlavQGrefined"), float, doc="DeepJet g vs uds discriminator", precision=10), + ) + + process.btagDeepFlavRefineNN= cms.EDProducer("JetBaseMVAValueMapProducer", + backend = cms.string("ONNX"), + batch_eval = cms.bool(True), + disableONNXGraphOpt = cms.bool(True), + + src = cms.InputTag("linkedObjects","jets"), + + weightFile=cms.FileInPath("PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx"), + name = cms.string("btagDeepFlavRefineNN"), + + isClassifier = cms.bool(False), + variablesOrder = cms.vstring(["GenJet_pt","GenJet_eta","Jet_hadronFlavour", + "Jet_btagDeepFlavB","Jet_btagDeepFlavCvB","Jet_btagDeepFlavCvL","Jet_btagDeepFlavQG"]), + variables = cms.PSet( + GenJet_pt = cms.string("?genJetFwdRef().backRef().isNonnull()?genJetFwdRef().backRef().pt():pt"), + GenJet_eta = cms.string("?genJetFwdRef().backRef().isNonnull()?genJetFwdRef().backRef().eta():eta"), + Jet_hadronFlavour = cms.string("hadronFlavour()"), + Jet_btagDeepFlavB = cms.string("bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')"), + Jet_btagDeepFlavCvB = cms.string("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probb')+bDiscriminator('pfDeepFlavourJetTags:probbb')+bDiscriminator('pfDeepFlavourJetTags:problepb')):-1"), + Jet_btagDeepFlavCvL = cms.string("?(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg'))>0?bDiscriminator('pfDeepFlavourJetTags:probc')/(bDiscriminator('pfDeepFlavourJetTags:probc')+bDiscriminator('pfDeepFlavourJetTags:probuds')+bDiscriminator('pfDeepFlavourJetTags:probg')):-1"), + Jet_btagDeepFlavQG = cms.string("?(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfDeepFlavourJetTags:probg')/(bDiscriminator('pfDeepFlavourJetTags:probg')+bDiscriminator('pfDeepFlavourJetTags:probuds')):-1"), + ), + inputTensorName = cms.string("input"), + outputTensorName = cms.string("output"), + outputNames = cms.vstring(["btagDeepFlavBrefined","btagDeepFlavCvBrefined","btagDeepFlavCvLrefined","btagDeepFlavQGrefined"]), + outputFormulas = cms.vstring(["at(0)","at(1)","at(2)","at(3)"]), + ) + + fastSim.toModify(process.jetTablesTask, process.jetTablesTask.add(process.btagDeepFlavRefineNN)) + + return process + subJetTable = cms.EDProducer("SimpleCandidateFlatTableProducer", src = cms.InputTag("slimmedJetsAK8PFPuppiSoftDropPacked","SubJets"), diff --git a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h index f49ddcbd05b6a..f311961fd46cf 100644 --- a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h +++ b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h @@ -22,6 +22,11 @@ namespace cms::Ort { typedef std::vector> FloatArrays; + enum class Backend { + cpu, + cuda, + }; + class ONNXRuntime { public: ONNXRuntime(const std::string& model_path, const ::Ort::SessionOptions* session_options = nullptr); @@ -29,6 +34,8 @@ namespace cms::Ort { ONNXRuntime& operator=(const ONNXRuntime&) = delete; ~ONNXRuntime(); + static ::Ort::SessionOptions defaultSessionOptions(Backend backend = Backend::cpu); + // Run inference and get outputs // input_names: list of the names of the input nodes. // input_values: list of input arrays for each input node. The order of `input_values` must match `input_names`. diff --git a/PhysicsTools/PatAlgos/BuildFile.xml b/PhysicsTools/PatAlgos/BuildFile.xml index 3aaff834e379f..c4d0b11dd5246 100644 --- a/PhysicsTools/PatAlgos/BuildFile.xml +++ b/PhysicsTools/PatAlgos/BuildFile.xml @@ -18,6 +18,9 @@ + + + diff --git a/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h new file mode 100644 index 0000000000000..07f94dbc677fa --- /dev/null +++ b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h @@ -0,0 +1,320 @@ +#ifndef PhysicsTools_PatAlgos_BaseMVAValueMapProducer +#define PhysicsTools_PatAlgos_BaseMVAValueMapProducer + +// -*- C++ -*- +// +// Package: PhysicsTools/PatAlgos +// Class: BaseMVAValueMapProducer +// +/**\class BaseMVAValueMapProducer BaseMVAValueMapProducer.cc PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc + + Description: [one line class summary] + + Implementation: + [Notes on implementation] +*/ +// +// Original Author: Andre Rizzi +// Created: Mon, 07 Sep 2017 09:18:03 GMT +// +// + +// system include files +#include + +// user include files +#include "FWCore/Framework/interface/Frameworkfwd.h" +#include "FWCore/Framework/interface/stream/EDProducer.h" + +#include "FWCore/Framework/interface/Event.h" +#include "FWCore/Framework/interface/MakerMacros.h" + +#include "FWCore/ParameterSet/interface/ParameterSet.h" +#include "FWCore/Utilities/interface/StreamID.h" + +#include "TMVA/Factory.h" +#include "TMVA/Reader.h" + +#include "CommonTools/Utils/interface/StringObjectFunction.h" +#include "DataFormats/Common/interface/ValueMap.h" +#include "CommonTools/MVAUtils/interface/TMVAZipReader.h" +#include "DataFormats/PatCandidates/interface/Jet.h" +#include "DataFormats/PatCandidates/interface/Muon.h" +#include "DataFormats/PatCandidates/interface/Electron.h" + +#include "DataFormats/PatCandidates/interface/Jet.h" +#include "DataFormats/PatCandidates/interface/Muon.h" +#include "DataFormats/PatCandidates/interface/Electron.h" +#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" +#include "PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h" + +#include +// +// class declaration +// + +class BaseMVACache { +public: + BaseMVACache(const std::string& model_path, const std::string& backend, const bool disableONNXGraphOpt) { + if (backend == "TF") { + graph_.reset(tensorflow::loadGraphDef(model_path)); + tf_session_ = tensorflow::createSession(graph_.get()); + } else if (backend == "ONNX") { + if (disableONNXGraphOpt) { + Ort::SessionOptions sess_opts; + sess_opts = cms::Ort::ONNXRuntime::defaultSessionOptions(); + sess_opts.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_DISABLE_ALL); + ort_ = std::make_unique(model_path, &sess_opts); + } else { + ort_ = std::make_unique(model_path); + } + } + } + ~BaseMVACache() { tensorflow::closeSession(tf_session_); } + + tensorflow::Session* getTFSession() const { return tf_session_; } + const cms::Ort::ONNXRuntime& getONNXSession() const { return *ort_; } + +private: + std::shared_ptr graph_; + tensorflow::Session* tf_session_ = nullptr; + std::unique_ptr ort_; +}; + +template +class BaseMVAValueMapProducer : public edm::stream::EDProducer<> { +public: + explicit BaseMVAValueMapProducer(const edm::ParameterSet& iConfig) + : src_(consumes>(iConfig.getParameter("src"))), + variablesOrder_(iConfig.getParameter>("variablesOrder")), + name_(iConfig.getParameter("name")), + backend_(iConfig.getParameter("backend")), + weightfilename_(iConfig.getParameter("weightFile").fullPath()), + isClassifier_(iConfig.getParameter("isClassifier")), + tmva_(backend_ == "TMVA"), + tf_(backend_ == "TF"), + onnx_(backend_ == "ONNX"), + batch_eval_(iConfig.getParameter("batch_eval")) { + if (tmva_) + reader_ = new TMVA::Reader(); + edm::ParameterSet const& varsPSet = iConfig.getParameter("variables"); + for (const std::string& vname : varsPSet.getParameterNamesForType()) { + funcs_.emplace_back( + std::pair>(vname, varsPSet.getParameter(vname))); + } + + values_.resize(variablesOrder_.size()); + size_t i = 0; + for (const auto& v : variablesOrder_) { + positions_[v] = i; + if (tmva_) + reader_->AddVariable(v, (&values_.front()) + i); + i++; + } + // reader_.BookMVA(name_,iConfig.getParameter("weightFile").fullPath() ); + if (tmva_) { + reco::details::loadTMVAWeights(reader_, name_, weightfilename_); + } else if (tf_) { + tensorflow::setLogging("3"); + graph_ = tensorflow::loadGraphDef(weightfilename_); + size_t nThreads = iConfig.getParameter("nThreads"); + session_ = tensorflow::createSession(graph_, nThreads); + } else if (onnx_) { + ort_ = std::make_unique(weightfilename_); + } else { + throw cms::Exception("ConfigError") << "Only 'TF', 'ONNX' and 'TMVA' backends are supported\n"; + } + if (tf_ || onnx_) { + inputTensorName_ = iConfig.getParameter("inputTensorName"); + outputTensorName_ = iConfig.getParameter("outputTensorName"); + output_names_ = iConfig.getParameter>("outputNames"); + for (const auto& s : iConfig.getParameter>("outputFormulas")) { + output_formulas_.push_back(StringObjectFunction>(s)); + } + } + if (tmva_) + produces>(); + else { + for (const auto& n : output_names_) { + produces>(n); + } + } + } + ~BaseMVAValueMapProducer() override {} + + void setValue(const std::string var, float val) { + if (positions_.find(var) != positions_.end()) + values_[positions_[var]] = val; + } + + static edm::ParameterSetDescription getDescription(); + static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); + +private: + void beginStream(edm::StreamID) override{}; + void produce(edm::Event&, const edm::EventSetup&) override; + void endStream() override{}; + + ///to be implemented in derived classes, filling values for additional variables + virtual void readAdditionalCollections(edm::Event&, const edm::EventSetup&) {} + virtual void fillAdditionalVariables(const T&) {} + + edm::EDGetTokenT> src_; + std::map positions_; + std::vector>> funcs_; + std::vector variablesOrder_; + std::vector values_; + TMVA::Reader* reader_; + tensorflow::GraphDef* graph_; + tensorflow::Session* session_; + std::string singleThreadPool_; + std::unique_ptr ort_; + + std::string name_; + std::string backend_; + std::string weightfilename_; + bool isClassifier_; + bool tmva_; + bool tf_; + bool onnx_; + bool batch_eval_; + std::string inputTensorName_; + std::string outputTensorName_; + std::vector output_names_; + std::vector>> output_formulas_; +}; + +template +void BaseMVAValueMapProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) { + edm::Handle> src; + iEvent.getByToken(src_, src); + readAdditionalCollections(iEvent, iSetup); + std::vector> mvaOut((tmva_) ? 1 : output_names_.size()); + for (auto& v : mvaOut) + v.reserve(src->size()); + + if (batch_eval_) { + std::vector data; + data.reserve(src->size() * positions_.size()); + for (auto const& o : *src) { + for (auto const& p : funcs_) { + setValue(p.first, p.second(o)); + } + fillAdditionalVariables(o); + data.insert(data.end(), values_.begin(), values_.end()); + } + + std::vector outputs; + if (tf_) { + //currently support only one input sensor to reuse the TMVA like config + tensorflow::TensorShape input_size{(long long int)src->size(), (long long int)positions_.size()}; + tensorflow::NamedTensorList input_tensors; + input_tensors.resize(1); + input_tensors[0] = + tensorflow::NamedTensor(inputTensorName_, tensorflow::Tensor(tensorflow::DT_FLOAT, input_size)); + + for (unsigned i = 0; i < data.size(); ++i) { + input_tensors[0].second.flat()(i) = data[i]; + } + std::vector output_tensors; + tensorflow::run(session_, input_tensors, {outputTensorName_}, &output_tensors); + for (unsigned i = 0; i < output_tensors.at(0).NumElements(); ++i) { + outputs.push_back(output_tensors.at(0).flat()(i)); + } + } else if (onnx_) { + cms::Ort::FloatArrays inputs{data}; + outputs = ort_->run({inputTensorName_}, inputs, {}, {outputTensorName_}, src->size())[0]; + } + + const unsigned outdim = outputs.size() / src->size(); + for (unsigned i = 0; i < src->size(); ++i) { + std::vector tmpOut(outputs.begin() + i * outdim, outputs.begin() + (i + 1) * outdim); + for (size_t k = 0; k < output_names_.size(); k++) { + mvaOut[k].push_back(output_formulas_[k](tmpOut)); + } + } + } else { + for (auto const& o : *src) { + for (auto const& p : funcs_) { + setValue(p.first, p.second(o)); + } + fillAdditionalVariables(o); + if (tmva_) { + mvaOut[0].push_back(isClassifier_ ? reader_->EvaluateMVA(name_) : reader_->EvaluateRegression(name_)[0]); + } + + std::vector tmpOut; + if (tf_) { + //currently support only one input sensor to reuse the TMVA like config + tensorflow::TensorShape input_size{1, (long long int)positions_.size()}; + tensorflow::NamedTensorList input_tensors; + input_tensors.resize(1); + input_tensors[0] = + tensorflow::NamedTensor(inputTensorName_, tensorflow::Tensor(tensorflow::DT_FLOAT, input_size)); + for (size_t j = 0; j < values_.size(); j++) { + input_tensors[0].second.matrix()(0, j) = values_[j]; + } + std::vector outputs; + tensorflow::run(session_, input_tensors, {outputTensorName_}, &outputs); + for (int k = 0; k < outputs.at(0).matrix().dimension(1); k++) + tmpOut.push_back(outputs.at(0).matrix()(0, k)); + } else if (onnx_) { + cms::Ort::FloatArrays inputs{values_}; + tmpOut = ort_->run({inputTensorName_}, inputs, {}, {outputTensorName_})[0]; + } + + for (size_t k = 0; k < output_names_.size(); k++) + mvaOut[k].push_back(output_formulas_[k](tmpOut)); + } + } + size_t k = 0; + for (auto& m : mvaOut) { + std::unique_ptr> mvaV(new edm::ValueMap()); + edm::ValueMap::Filler filler(*mvaV); + filler.insert(src, m.begin(), m.end()); + filler.fill(); + iEvent.put(std::move(mvaV), (tmva_) ? "" : output_names_[k]); + k++; + } +} + +template +edm::ParameterSetDescription BaseMVAValueMapProducer::getDescription() { + edm::ParameterSetDescription desc; + desc.add("src")->setComment("input physics object collection"); + desc.add>("variablesOrder")->setComment("ordered list of MVA input variable names"); + desc.add("name")->setComment("output score variable name"); + desc.add("isClassifier")->setComment("is a classifier discriminator"); + edm::ParameterSetDescription variables; + variables.setAllowAnything(); + desc.add("variables", variables)->setComment("list of input variable definitions"); + desc.add("weightFile")->setComment("xml weight file"); + desc.add("backend", "TMVA")->setComment("TMVA, TF or ONNX"); + desc.add("inputTensorName", "")->setComment("Name of tensorflow input tensor in the model"); + desc.add("outputTensorName", "")->setComment("Name of tensorflow output tensor in the model"); + desc.add>("outputNames", std::vector()) + ->setComment("Names of the output values to be used in the output valuemap"); + desc.add>("outputFormulas", std::vector()) + ->setComment("Formulas to be used to post process the output"); + desc.add("nThreads", 1)->setComment("number of threads"); + desc.add("singleThreadPool", "no_threads"); + desc.add("batch_eval", false)->setComment("Run inference in batch instead of per-object"); + + return desc; +} + +template +void BaseMVAValueMapProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { + edm::ParameterSetDescription desc = getDescription(); + std::string modname; + if (typeid(T) == typeid(pat::Jet)) + modname += "Jet"; + else if (typeid(T) == typeid(pat::Muon)) + modname += "Muon"; + else if (typeid(T) == typeid(pat::Electron)) + modname += "Ele"; + modname += "BaseMVAValueMapProducer"; + descriptions.add(modname, desc); +} + +#endif diff --git a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc b/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc index 7fb99af43d005..bcb00b910bc6d 100644 --- a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc +++ b/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc @@ -2,7 +2,7 @@ // // Package: PhysicsTools/PatAlgos // Class: BaseMVAValueMapProducer -// +// /**\class BaseMVAValueMapProducer BaseMVAValueMapProducer.cc PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc Description: [one line class summary] @@ -16,7 +16,7 @@ // // -#include "PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h" +#include "PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h" typedef BaseMVAValueMapProducer JetBaseMVAValueMapProducer; typedef BaseMVAValueMapProducer MuonBaseMVAValueMapProducer; @@ -26,4 +26,3 @@ typedef BaseMVAValueMapProducer EleBaseMVAValueMapProducer; DEFINE_FWK_MODULE(JetBaseMVAValueMapProducer); DEFINE_FWK_MODULE(MuonBaseMVAValueMapProducer); DEFINE_FWK_MODULE(EleBaseMVAValueMapProducer); - diff --git a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h b/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h deleted file mode 100644 index 97c38bb709f7c..0000000000000 --- a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h +++ /dev/null @@ -1,241 +0,0 @@ -#ifndef PhysicsTools_PatAlgos_BaseMVAValueMapProducer -#define PhysicsTools_PatAlgos_BaseMVAValueMapProducer - -// -*- C++ -*- -// -// Package: PhysicsTools/PatAlgos -// Class: BaseMVAValueMapProducer -// -/**\class BaseMVAValueMapProducer BaseMVAValueMapProducer.cc PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc - - Description: [one line class summary] - - Implementation: - [Notes on implementation] -*/ -// -// Original Author: Andre Rizzi -// Created: Mon, 07 Sep 2017 09:18:03 GMT -// -// - - -// system include files -#include - -// user include files -#include "FWCore/Framework/interface/Frameworkfwd.h" -#include "FWCore/Framework/interface/stream/EDProducer.h" - -#include "FWCore/Framework/interface/Event.h" -#include "FWCore/Framework/interface/MakerMacros.h" - -#include "FWCore/ParameterSet/interface/ParameterSet.h" -#include "FWCore/Utilities/interface/StreamID.h" - - -#include "TMVA/Factory.h" -#include "TMVA/Reader.h" - -#include "CommonTools/Utils/interface/StringObjectFunction.h" -#include "DataFormats/Common/interface/ValueMap.h" -#include "CommonTools/MVAUtils/interface/TMVAZipReader.h" -#include "DataFormats/PatCandidates/interface/Jet.h" -#include "DataFormats/PatCandidates/interface/Muon.h" -#include "DataFormats/PatCandidates/interface/Electron.h" - -#include "DataFormats/PatCandidates/interface/Jet.h" -#include "DataFormats/PatCandidates/interface/Muon.h" -#include "DataFormats/PatCandidates/interface/Electron.h" -#include "PhysicsTools/TensorFlow/interface/TensorFlow.h" - -#include -// -// class declaration -// - - -template -class BaseMVAValueMapProducer : public edm::stream::EDProducer<> { - public: - explicit BaseMVAValueMapProducer(const edm::ParameterSet &iConfig): - src_(consumes>(iConfig.getParameter("src"))), - variablesOrder_(iConfig.getParameter>("variablesOrder")), - name_(iConfig.getParameter("name")), - backend_(iConfig.getParameter("backend")), - weightfilename_(iConfig.getParameter("weightFile").fullPath()), - isClassifier_(iConfig.getParameter("isClassifier")), - tmva_(backend_=="TMVA"),tf_(backend_=="TF") - { - if(tmva_) reader_=new TMVA::Reader(); - edm::ParameterSet const & varsPSet = iConfig.getParameter("variables"); - for (const std::string & vname : varsPSet.getParameterNamesForType()) { - funcs_.emplace_back(std::pair>(vname,varsPSet.getParameter(vname))); - } - - values_.resize(variablesOrder_.size()); - size_t i=0; - for(const auto & v : variablesOrder_){ - positions_[v]=i; - if(tmva_) reader_->AddVariable(v,(&values_.front())+i); - i++; - } -// reader_.BookMVA(name_,iConfig.getParameter("weightFile").fullPath() ); - if(tmva_) - { - reco::details::loadTMVAWeights(reader_, name_, weightfilename_); - }else if(tf_) { - tensorflow::setLogging("3"); - graph_=tensorflow::loadGraphDef(weightfilename_); - inputTensorName_=iConfig.getParameter("inputTensorName"); - outputTensorName_=iConfig.getParameter("outputTensorName"); - output_names_=iConfig.getParameter>("outputNames"); - for(const auto & s : iConfig.getParameter>("outputFormulas")) { output_formulas_.push_back(StringObjectFunction>(s));} - size_t nThreads = iConfig.getParameter("nThreads"); - std::string singleThreadPool = iConfig.getParameter("singleThreadPool"); - tensorflow::SessionOptions sessionOptions; - tensorflow::setThreading(sessionOptions, nThreads, singleThreadPool); - session_ = tensorflow::createSession(graph_, sessionOptions); - - } else { - throw cms::Exception("ConfigError") << "Only 'TF' and 'TMVA' backends are supported\n"; - } - if(tmva_) produces>(); - else { - for(const auto & n : output_names_){ - produces>(n); - } - } - - } - ~BaseMVAValueMapProducer() override {} - - void setValue(const std::string var,float val) { - if(positions_.find(var)!=positions_.end()) - values_[positions_[var]]=val; - } - - static edm::ParameterSetDescription getDescription(); - static void fillDescriptions(edm::ConfigurationDescriptions& descriptions); - - private: - void beginStream(edm::StreamID) override {}; - void produce(edm::Event&, const edm::EventSetup&) override; - void endStream() override {}; - - ///to be implemented in derived classes, filling values for additional variables - virtual void readAdditionalCollections(edm::Event&, const edm::EventSetup&) {} - virtual void fillAdditionalVariables(const T&) {} - - - edm::EDGetTokenT> src_; - std::map positions_; - std::vector>> funcs_; - std::vector variablesOrder_; - std::vector values_; - TMVA::Reader * reader_; - tensorflow::GraphDef* graph_; - tensorflow::Session* session_; - - std::string name_; - std::string backend_; - std::string weightfilename_; - bool isClassifier_; - bool tmva_; - bool tf_; - std::string inputTensorName_; - std::string outputTensorName_; - std::vector output_names_; - std::vector>> output_formulas_; - -}; - -template -void -BaseMVAValueMapProducer::produce(edm::Event& iEvent, const edm::EventSetup& iSetup) -{ - edm::Handle> src; - iEvent.getByToken(src_, src); - readAdditionalCollections(iEvent,iSetup); - std::vector> mvaOut((tmva_)?1:output_names_.size()); - for( auto & v : mvaOut) v.reserve(src->size()); - - for(auto const & o: *src) { - for(auto const & p : funcs_ ){ - setValue(p.first,p.second(o)); - } - fillAdditionalVariables(o); - if(tmva_){ - mvaOut[0].push_back(isClassifier_ ? reader_->EvaluateMVA(name_) : reader_->EvaluateRegression(name_)[0]); - } - if(tf_){ - //currently support only one input sensor to reuse the TMVA like config - tensorflow::TensorShape input_size {1,(long long int)positions_.size()} ; - tensorflow::NamedTensorList input_tensors; - input_tensors.resize(1); - input_tensors[0] = tensorflow::NamedTensor(inputTensorName_, tensorflow::Tensor(tensorflow::DT_FLOAT, input_size)); - for(size_t j =0; j < values_.size();j++) { - input_tensors[0].second.matrix()(0,j) = values_[j]; - } - std::vector outputs; - std::vector names; names.push_back(outputTensorName_); - tensorflow::run(session_, input_tensors, names, &outputs); - std::vector tmpOut; - for(int k=0;k().dimension(1);k++) tmpOut.push_back(outputs.at(0).matrix()(0, k)); - for(size_t k=0;k> mvaV(new edm::ValueMap()); - edm::ValueMap::Filler filler(*mvaV); - filler.insert(src,m.begin(),m.end()); - filler.fill(); - iEvent.put(std::move(mvaV),(tmva_)?"":output_names_[k]); - k++; - } - -} - -template -edm::ParameterSetDescription -BaseMVAValueMapProducer::getDescription(){ - edm::ParameterSetDescription desc; - desc.add("src")->setComment("input physics object collection"); - desc.add>("variablesOrder")->setComment("ordered list of MVA input variable names"); - desc.add("name")->setComment("output score variable name"); - desc.add("isClassifier")->setComment("is a classifier discriminator"); - edm::ParameterSetDescription variables; - variables.setAllowAnything(); - desc.add("variables", variables)->setComment("list of input variable definitions"); - desc.add("weightFile")->setComment("xml weight file"); - desc.add("backend","TMVA")->setComment("TMVA or TF"); - desc.add("inputTensorName","")->setComment("Name of tensorflow input tensor in the model"); - desc.add("outputTensorName","")->setComment("Name of tensorflow output tensor in the model"); - desc.add>("outputNames",std::vector())->setComment("Names of the output values to be used in the output valuemap"); - desc.add>("outputFormulas",std::vector())->setComment("Formulas to be used to post process the output"); - desc.add("nThreads",1)->setComment("number of threads"); - desc.add("singleThreadPool", "no_threads"); - - - return desc; -} - -template -void -BaseMVAValueMapProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) { - edm::ParameterSetDescription desc = getDescription(); - std::string modname; - if (typeid(T) == typeid(pat::Jet)) modname+="Jet"; - else if (typeid(T) == typeid(pat::Muon)) modname+="Muon"; - else if (typeid(T) == typeid(pat::Electron)) modname+="Ele"; - modname+="BaseMVAValueMapProducer"; - descriptions.add(modname,desc); -} - - - -#endif diff --git a/PhysicsTools/PatAlgos/plugins/BuildFile.xml b/PhysicsTools/PatAlgos/plugins/BuildFile.xml index 29d6b64440915..ee82200127b12 100644 --- a/PhysicsTools/PatAlgos/plugins/BuildFile.xml +++ b/PhysicsTools/PatAlgos/plugins/BuildFile.xml @@ -2,7 +2,6 @@ - From 64d138d6a512bc28277bb1ca706a626348708598 Mon Sep 17 00:00:00 2001 From: sbein Date: Sun, 19 Feb 2023 15:24:19 +0100 Subject: [PATCH 2/7] backporting changes from FastSim refinement commit: https://github.com/cms-sw/cmssw/pull/40553/commits/4ca1787fff292494aef9053751adccdb2241579f. Refined variables will carry the normal names in NANO. --- PhysicsTools/NanoAOD/plugins/BJetEnergyRegressionMVA.cc | 2 +- PhysicsTools/NanoAOD/python/jets_cff.py | 5 +++-- PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h | 2 ++ PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/PhysicsTools/NanoAOD/plugins/BJetEnergyRegressionMVA.cc b/PhysicsTools/NanoAOD/plugins/BJetEnergyRegressionMVA.cc index 8ab46a5a552d6..c36922c3c5f99 100644 --- a/PhysicsTools/NanoAOD/plugins/BJetEnergyRegressionMVA.cc +++ b/PhysicsTools/NanoAOD/plugins/BJetEnergyRegressionMVA.cc @@ -25,7 +25,7 @@ #include "RecoVertex/VertexPrimitives/interface/ConvertToFromReco.h" #include "RecoVertex/VertexPrimitives/interface/VertexState.h" -#include "PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.h" +#include "PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h" #include class BJetEnergyRegressionMVA : public BaseMVAValueMapProducer { diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index 5d51ad4cf93c5..35cb0a05235f3 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -537,6 +537,7 @@ from Configuration.Eras.Modifier_fastSim_cff import fastSim def nanoAOD_refineFastSim_bTagDeepFlav(process): + fastSim.toModify( process.jetTable.variables, btagDeepFlavBunrefined = process.jetTable.variables.btagDeepFlavB.clone(), btagDeepFlavCvBunrefined = process.jetTable.variables.btagDeepFlavCvB.clone(), @@ -565,7 +566,7 @@ def nanoAOD_refineFastSim_bTagDeepFlav(process): src = cms.InputTag("linkedObjects","jets"), - weightFile=cms.FileInPath("PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx"), + weightFile=cms.FileInPath("PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx"),#local hack for backporting: cp /cvmfs/cms.cern.ch/slc7_amd64_gcc11/cms/data-PhysicsTools-NanoAOD/V01-03-00/PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx # cp /nfs/dust/cms/user/wolfmor/Refinement/TrainingOutput/regression_model_20221127_opset11.onnx PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx name = cms.string("btagDeepFlavRefineNN"), isClassifier = cms.bool(False), @@ -586,7 +587,7 @@ def nanoAOD_refineFastSim_bTagDeepFlav(process): outputFormulas = cms.vstring(["at(0)","at(1)","at(2)","at(3)"]), ) - fastSim.toModify(process.jetTablesTask, process.jetTablesTask.add(process.btagDeepFlavRefineNN)) + fastSim.toModify(process.jetTables, process.jetTables.insert(0,process.btagDeepFlavRefineNN)) return process diff --git a/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h index 07f94dbc677fa..6b7e064d5b837 100644 --- a/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h +++ b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h @@ -278,6 +278,7 @@ void BaseMVAValueMapProducer::produce(edm::Event& iEvent, const edm::EventSet } } + template edm::ParameterSetDescription BaseMVAValueMapProducer::getDescription() { edm::ParameterSetDescription desc; @@ -299,6 +300,7 @@ edm::ParameterSetDescription BaseMVAValueMapProducer::getDescription() { desc.add("nThreads", 1)->setComment("number of threads"); desc.add("singleThreadPool", "no_threads"); desc.add("batch_eval", false)->setComment("Run inference in batch instead of per-object"); + desc.add("disableONNXGraphOpt", false)->setComment("Disable ONNX runtime graph optimization"); return desc; } diff --git a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc b/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc index bcb00b910bc6d..42935571a28ac 100644 --- a/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc +++ b/PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc @@ -2,7 +2,7 @@ // // Package: PhysicsTools/PatAlgos // Class: BaseMVAValueMapProducer -// +// /**\class BaseMVAValueMapProducer BaseMVAValueMapProducer.cc PhysicsTools/PatAlgos/plugins/BaseMVAValueMapProducer.cc Description: [one line class summary] @@ -26,3 +26,4 @@ typedef BaseMVAValueMapProducer EleBaseMVAValueMapProducer; DEFINE_FWK_MODULE(JetBaseMVAValueMapProducer); DEFINE_FWK_MODULE(MuonBaseMVAValueMapProducer); DEFINE_FWK_MODULE(EleBaseMVAValueMapProducer); + From 1bc156348b5d0c33037f4713f9a05cf3f0394dce Mon Sep 17 00:00:00 2001 From: sbein Date: Wed, 1 Mar 2023 23:17:29 +0100 Subject: [PATCH 3/7] removed CUDA option --- PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h index f311961fd46cf..521a4046f46c0 100644 --- a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h +++ b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h @@ -24,18 +24,16 @@ namespace cms::Ort { enum class Backend { cpu, - cuda, - }; - + }; + class ONNXRuntime { public: ONNXRuntime(const std::string& model_path, const ::Ort::SessionOptions* session_options = nullptr); ONNXRuntime(const ONNXRuntime&) = delete; ONNXRuntime& operator=(const ONNXRuntime&) = delete; ~ONNXRuntime(); - + static ::Ort::SessionOptions defaultSessionOptions(Backend backend = Backend::cpu); - // Run inference and get outputs // input_names: list of the names of the input nodes. // input_values: list of input arrays for each input node. The order of `input_values` must match `input_names`. From 34f1ebed9a0e6245c1a293ec680835e99a68fa98 Mon Sep 17 00:00:00 2001 From: sbein Date: Wed, 1 Mar 2023 23:21:39 +0100 Subject: [PATCH 4/7] added NANO steps for Run2 FastSim and a new refinement recipe 135.14 as per the original PR --- .../python/relval_standard.py | 61 ++++++++++--------- .../python/relval_steps.py | 10 +++ 2 files changed, 41 insertions(+), 30 deletions(-) diff --git a/Configuration/PyReleaseValidation/python/relval_standard.py b/Configuration/PyReleaseValidation/python/relval_standard.py index c39050230a40a..611c2e432bb3e 100644 --- a/Configuration/PyReleaseValidation/python/relval_standard.py +++ b/Configuration/PyReleaseValidation/python/relval_standard.py @@ -423,32 +423,33 @@ workflows[5.7] = ['H130GGgluonfusion', ['H130GGgluonfusionFS','HARVESTFS']] ### fastsim_13 TeV ### -workflows[135.1] = ['TTbar_13', ['TTbarFS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.2] = ['SingleMuPt10_UP15', ['SingleMuPt10FS_UP15','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.3] = ['SingleMuPt100_UP15', ['SingleMuPt100FS_UP15','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.4] = ['ZEE_13', ['ZEEFS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.5] = ['ZTT_13',['ZTTFS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.6] = ['QCD_FlatPt_15_3000_13', ['QCDFlatPt153000FS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.7] = ['H125GGgluonfusion_13', ['H125GGgluonfusionFS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.9] = ['ZMM_13',['ZMMFS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13','HARVESTUP15FS','MINIAODMCUP15FS']] -workflows[135.12] = ['QCD_Pt_80_120_13', ['QCD_Pt_80_120FS_13','HARVESTUP15FS','MINIAODMCUP15FS']] +workflows[135.1] = ['TTbar_13', ['TTbarFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.2] = ['SingleMuPt10_UP15', ['SingleMuPt10FS_UP15','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.3] = ['SingleMuPt100_UP15', ['SingleMuPt100FS_UP15','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.4] = ['ZEE_13', ['ZEEFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.5] = ['ZTT_13',['ZTTFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.6] = ['QCD_FlatPt_15_3000_13', ['QCDFlatPt153000FS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.7] = ['H125GGgluonfusion_13', ['H125GGgluonfusionFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.9] = ['ZMM_13',['ZMMFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] +workflows[135.12] = ['QCD_Pt_80_120_13', ['QCD_Pt_80_120FS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FS']] workflows[135.13] = ['TTbar_13', ['TTbarFS_13_trackingOnlyValidation','HARVESTUP15FS_trackingOnly']] +workflows[135.14] = ['TTbar_13', ['TTbarFS_13','HARVESTUP15FS','MINIAODMCUP15FS','NANOAOD2016FSrefine']] ### MinBias fastsim_13 TeV for mixing ### workflows[135.8] = ['',['MinBiasFS_13_ForMixing']] ### Phase1 FastSim 13TeV ### -workflows[2017.1] = ['TTbar_13_UP17', ['TTbarFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.2] = ['SingleMuPt10_UP17', ['SingleMuPt10FS_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.3] = ['SingleMuPt100_UP17', ['SingleMuPt100FS_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.4] = ['ZEE_13_UP17', ['ZEEFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.5] = ['ZTT_13_UP17',['ZTTFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.6] = ['QCD_FlatPt_15_3000_13_UP17', ['QCDFlatPt153000FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.7] = ['H125GGgluonfusion_13_UP17', ['H125GGgluonfusionFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.9] = ['ZMM_13_UP17',['ZMMFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13_UP17', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] -workflows[2017.12] = ['QCD_Pt_80_120_13_UP17', ['QCD_Pt_80_120FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS']] +workflows[2017.1] = ['TTbar_13_UP17', ['TTbarFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.2] = ['SingleMuPt10_UP17', ['SingleMuPt10FS_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.3] = ['SingleMuPt100_UP17', ['SingleMuPt100FS_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.4] = ['ZEE_13_UP17', ['ZEEFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.5] = ['ZTT_13_UP17',['ZTTFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.6] = ['QCD_FlatPt_15_3000_13_UP17', ['QCDFlatPt153000FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.7] = ['H125GGgluonfusion_13_UP17', ['H125GGgluonfusionFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.9] = ['ZMM_13_UP17',['ZMMFS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13_UP17', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] +workflows[2017.12] = ['QCD_Pt_80_120_13_UP17', ['QCD_Pt_80_120FS_13_UP17','HARVESTUP17FS','MINIAODMCUP17FS','NANOAOD2017FS']] workflows[2017.13] = ['TTbar_13_UP17', ['TTbarFS_13_trackingOnlyValidation_UP17','HARVESTUP17FS_trackingOnly']] ### MinBias fastsim_13 TeV for mixing ### @@ -458,16 +459,16 @@ workflows[2018.8] = ['',['MinBiasFS_13_UP18_ForMixing']] ### Phase1 FastSim 13TeV, 2018 ### -workflows[2018.1] = ['TTbar_13_UP18', ['TTbarFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.2] = ['SingleMuPt10_UP18', ['SingleMuPt10FS_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.3] = ['SingleMuPt100_UP18', ['SingleMuPt100FS_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.4] = ['ZEE_13_UP18', ['ZEEFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.5] = ['ZTT_13_UP18',['ZTTFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.6] = ['QCD_FlatPt_15_3000_13_UP18', ['QCDFlatPt153000FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.7] = ['H125GGgluonfusion_13_UP18', ['H125GGgluonfusionFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.9] = ['ZMM_13_UP18',['ZMMFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13_UP18', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] -workflows[2018.12] = ['QCD_Pt_80_120_13_UP18', ['QCD_Pt_80_120FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS']] +workflows[2018.1] = ['TTbar_13_UP18', ['TTbarFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.2] = ['SingleMuPt10_UP18', ['SingleMuPt10FS_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.3] = ['SingleMuPt100_UP18', ['SingleMuPt100FS_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.4] = ['ZEE_13_UP18', ['ZEEFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.5] = ['ZTT_13_UP18',['ZTTFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.6] = ['QCD_FlatPt_15_3000_13_UP18', ['QCDFlatPt153000FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.7] = ['H125GGgluonfusion_13_UP18', ['H125GGgluonfusionFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.9] = ['ZMM_13_UP18',['ZMMFS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.11] = ['SMS-T1tttt_mGl-1500_mLSP-100_13_UP18', ['SMS-T1tttt_mGl-1500_mLSP-100FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] +workflows[2018.12] = ['QCD_Pt_80_120_13_UP18', ['QCD_Pt_80_120FS_13_UP18','HARVESTUP18FS','MINIAODMCUP18FS','NANOAOD2018FS']] workflows[2018.13] = ['TTbar_13_UP18', ['TTbarFS_13_trackingOnlyValidation_UP18','HARVESTUP18FS_trackingOnly']] ### standard set ### diff --git a/Configuration/PyReleaseValidation/python/relval_steps.py b/Configuration/PyReleaseValidation/python/relval_steps.py index 2411e7a0eab0f..cd3ed8b5be79f 100644 --- a/Configuration/PyReleaseValidation/python/relval_steps.py +++ b/Configuration/PyReleaseValidation/python/relval_steps.py @@ -2953,11 +2953,15 @@ def gen2018HiMix(fragment,howMuch): steps['NANOAODMC2017_106XMiniAODv1'] = merge([{'--era': 'Run2_2017,run2_nanoAOD_106Xv1'}, steps['NANOAODMC2017'] ]) + + steps['NANOEDMMC2017'] = merge([{'--conditions': 'auto:phase1_2017_realistic', '--era': 'Run2_2017'}, stepNanoEDMMC ]) steps['NANOEDMMC2017_94XMiniAODv1'] = merge([{'--era': 'Run2_2017,run2_nanoAOD_94XMiniAODv1'}, steps['NANOEDMMC2017'] ]) steps['NANOEDMMC2017_94XMiniAODv2'] = merge([{'--era': 'Run2_2017,run2_nanoAOD_94XMiniAODv2'}, steps['NANOEDMMC2017'] ]) steps['NANOEDMMC2017_106XMiniAODv1'] = merge([{'--era': 'Run2_2017,run2_nanoAOD_106Xv1'}, steps['NANOEDMMC2017'] ]) steps['NANOEDMMC2016_80X'] = merge([{'--conditions': 'auto:run2_mc', '--era': 'Run2_2016,run2_miniAOD_80XLegacy'}, steps['NANOEDMMC2017'] ]) +steps['NANOEDMMC2016_PROD'] = merge([{'--conditions': 'auto:run2_mc', '--era': 'Run2_2016', '--filein':'file:step3_inMINIAODSIM.root'}, stepNanoEDMMCProd ]) +steps['NANOEDMMC2017_PROD'] = merge([{'--conditions': 'auto:phase1_2017_realistic', '--era': 'Run2_2017', '--filein':'file:step3_inMINIAODSIM.root'}, stepNanoEDMMCProd ]) steps['NANOEDMMC2018_PROD'] = merge([{'--conditions': 'auto:phase1_2018_realistic', '--era': 'Run2_2018', '--filein':'file:step3_inMINIAODSIM.root'}, stepNanoEDMMCProd ]) steps['NANOEDM2017'] = merge([{'--conditions': 'auto:run2_data_relval', '--era': 'Run2_2017'}, stepNanoEDMData ]) @@ -2969,6 +2973,12 @@ def gen2018HiMix(fragment,howMuch): steps['NANOEDM2018_106Xv1'] = merge([ {'--era': 'Run2_2018,run2_nanoAOD_106Xv1'}, steps['NANOEDM2018'] ]) steps['NANOEDM2018_106Xv2'] = merge([ {'--era': 'Run2_2018,run2_nanoAOD_106Xv2'}, steps['NANOEDM2018'] ]) +steps['NANOAOD2016FS'] = merge([{'--filein':'file:step3.root','--fast':''}, steps['NANOEDMMC2016_PROD']]) +steps['NANOAOD2017FS'] = merge([{'--filein':'file:step3.root','--fast':'','--era':'Run2_2017_FastSim'}, steps['NANOEDMMC2017_PROD']]) +steps['NANOAOD2018FS'] = merge([{'--filein':'file:step3.root','--fast':'','--era':'Run2_2018_FastSim'}, steps['NANOEDMMC2018_PROD']]) +steps['NANOAOD2016FSrefine'] = merge([{'--customise':'PhysicsTools/NanoAOD/jets_cff.nanoAOD_refineFastSim_bTagDeepFlav'}, steps['NANOAOD2016FS']]) + + steps['HARVESTNANOAODMC2017']=merge([{'-s':'HARVESTING:@nanoAODDQM','--conditions': 'auto:phase1_2017_realistic','--era': 'Run2_2017'},steps['HARVESTUP15']]) steps['HARVESTNANOAODMC2017_94XMiniAODv1']=merge([{'--era': 'Run2_2017,run2_nanoAOD_94XMiniAODv1'},steps['HARVESTNANOAODMC2017']]) steps['HARVESTNANOAODMC2017_94XMiniAODv2']=merge([{'--era': 'Run2_2017,run2_nanoAOD_94XMiniAODv2'},steps['HARVESTNANOAODMC2017']]) From 8657ffe019bb6beeeb913d1229cf715ff573e6bf Mon Sep 17 00:00:00 2001 From: Sam Bein Date: Wed, 12 Apr 2023 21:05:14 +0200 Subject: [PATCH 5/7] removed comment on local file --- PhysicsTools/NanoAOD/python/jets_cff.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PhysicsTools/NanoAOD/python/jets_cff.py b/PhysicsTools/NanoAOD/python/jets_cff.py index 35cb0a05235f3..a4e736848b902 100644 --- a/PhysicsTools/NanoAOD/python/jets_cff.py +++ b/PhysicsTools/NanoAOD/python/jets_cff.py @@ -566,7 +566,7 @@ def nanoAOD_refineFastSim_bTagDeepFlav(process): src = cms.InputTag("linkedObjects","jets"), - weightFile=cms.FileInPath("PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx"),#local hack for backporting: cp /cvmfs/cms.cern.ch/slc7_amd64_gcc11/cms/data-PhysicsTools-NanoAOD/V01-03-00/PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx # cp /nfs/dust/cms/user/wolfmor/Refinement/TrainingOutput/regression_model_20221127_opset11.onnx PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx + weightFile=cms.FileInPath("PhysicsTools/NanoAOD/data/btagDeepFlavRefineNN_CHS.onnx"), name = cms.string("btagDeepFlavRefineNN"), isClassifier = cms.bool(False), From 42ac0761f11ee84d160730b43a72136ad4bb735e Mon Sep 17 00:00:00 2001 From: Sam Bein Date: Wed, 12 Apr 2023 21:08:15 +0200 Subject: [PATCH 6/7] removed class BaseMVACache from PR --- .../interface/BaseMVAValueMapProducer.h | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h index 6b7e064d5b837..6765e4272e78f 100644 --- a/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h +++ b/PhysicsTools/PatAlgos/interface/BaseMVAValueMapProducer.h @@ -53,34 +53,6 @@ // class declaration // -class BaseMVACache { -public: - BaseMVACache(const std::string& model_path, const std::string& backend, const bool disableONNXGraphOpt) { - if (backend == "TF") { - graph_.reset(tensorflow::loadGraphDef(model_path)); - tf_session_ = tensorflow::createSession(graph_.get()); - } else if (backend == "ONNX") { - if (disableONNXGraphOpt) { - Ort::SessionOptions sess_opts; - sess_opts = cms::Ort::ONNXRuntime::defaultSessionOptions(); - sess_opts.SetGraphOptimizationLevel(GraphOptimizationLevel::ORT_DISABLE_ALL); - ort_ = std::make_unique(model_path, &sess_opts); - } else { - ort_ = std::make_unique(model_path); - } - } - } - ~BaseMVACache() { tensorflow::closeSession(tf_session_); } - - tensorflow::Session* getTFSession() const { return tf_session_; } - const cms::Ort::ONNXRuntime& getONNXSession() const { return *ort_; } - -private: - std::shared_ptr graph_; - tensorflow::Session* tf_session_ = nullptr; - std::unique_ptr ort_; -}; - template class BaseMVAValueMapProducer : public edm::stream::EDProducer<> { public: From 843898a5d7e24c38e3ab206e5140087793df2d63 Mon Sep 17 00:00:00 2001 From: Sam Bein Date: Wed, 12 Apr 2023 21:10:27 +0200 Subject: [PATCH 7/7] eliminated backend and enum functions --- PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h | 5 ----- 1 file changed, 5 deletions(-) diff --git a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h index 521a4046f46c0..5c3833a1ad12d 100644 --- a/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h +++ b/PhysicsTools/ONNXRuntime/interface/ONNXRuntime.h @@ -21,10 +21,6 @@ namespace cms::Ort { typedef std::vector> FloatArrays; - - enum class Backend { - cpu, - }; class ONNXRuntime { public: @@ -33,7 +29,6 @@ namespace cms::Ort { ONNXRuntime& operator=(const ONNXRuntime&) = delete; ~ONNXRuntime(); - static ::Ort::SessionOptions defaultSessionOptions(Backend backend = Backend::cpu); // Run inference and get outputs // input_names: list of the names of the input nodes. // input_values: list of input arrays for each input node. The order of `input_values` must match `input_names`.