diff --git a/RecoBTag/ONNXRuntime/plugins/ParticleNetSonicJetTagsProducer.cc b/RecoBTag/ONNXRuntime/plugins/ParticleNetSonicJetTagsProducer.cc index 6a5e8da83d7ef..63bf9611c453f 100644 --- a/RecoBTag/ONNXRuntime/plugins/ParticleNetSonicJetTagsProducer.cc +++ b/RecoBTag/ONNXRuntime/plugins/ParticleNetSonicJetTagsProducer.cc @@ -49,7 +49,14 @@ class ParticleNetSonicJetTagsProducer : public TritonEDProducer<> { std::unordered_map prep_info_map_; // preprocessing info for each input group bool debug_ = false; bool skippedInference_ = false; - constexpr static unsigned numParticleGroups_ = 3; + std::vector emptyJets_; + unsigned numParticleGroups_ = 0; + unsigned numVertexGroups_ = 0; + unsigned numLostTrackGroups_ = 0; + bool countedInputs = false; + std::string particleNameExample_; + std::string vertexNameExample_; + std::string losttrackNameExample_; }; ParticleNetSonicJetTagsProducer::ParticleNetSonicJetTagsProducer(const edm::ParameterSet &iConfig) @@ -86,6 +93,30 @@ ParticleNetSonicJetTagsProducer::ParticleNetSonicJetTagsProducer(const edm::Para for (const auto &flav_name : flav_names_) { produces(flav_name); } + + if (!countedInputs) { + int model_input_size = input_names_.size(); + for (int n = 0; n < model_input_size; n++) { + if (prep_info_map_.at(input_names_.at(n)).var_names.at(0).find("pf") != std::string::npos) { + if (numParticleGroups_ == 0) { + particleNameExample_ = prep_info_map_.at(input_names_.at(n)).var_names.at(0); + } + numParticleGroups_++; + } else if (prep_info_map_.at(input_names_.at(n)).var_names.at(0).find("sv") != std::string::npos) { + if (numVertexGroups_ == 0) { + vertexNameExample_ = prep_info_map_.at(input_names_.at(n)).var_names.at(0); + } + numVertexGroups_++; + } else if (prep_info_map_.at(input_names_.at(n)).var_names.at(0).find("lt") != std::string::npos) { + if (numLostTrackGroups_ == 0) { + losttrackNameExample_ = prep_info_map_.at(input_names_.at(n)).var_names.at(0); + } + numLostTrackGroups_++; + } + } + + countedInputs = true; + } } ParticleNetSonicJetTagsProducer::~ParticleNetSonicJetTagsProducer() {} @@ -131,26 +162,51 @@ void ParticleNetSonicJetTagsProducer::acquire(edm::Event const &iEvent, edm::Eve iEvent.getByToken(src_, tag_infos); client_->setBatchSize(tag_infos->size()); skippedInference_ = false; + + emptyJets_.clear(); + if (!tag_infos->empty()) { + emptyJets_.reserve(tag_infos->size()); unsigned int maxParticles = 0; unsigned int maxVertices = 0; + unsigned int maxLT = 0; + unsigned int numParticles; + unsigned int numVertices; for (unsigned jet_n = 0; jet_n < tag_infos->size(); ++jet_n) { - maxParticles = std::max(maxParticles, - static_cast(((*tag_infos)[jet_n]).features().get("pfcand_etarel").size())); - maxVertices = - std::max(maxVertices, static_cast(((*tag_infos)[jet_n]).features().get("sv_etarel").size())); + numParticles = static_cast(((*tag_infos)[jet_n]).features().get(particleNameExample_).size()); + numVertices = static_cast(((*tag_infos)[jet_n]).features().get(vertexNameExample_).size()); + maxParticles = std::max(maxParticles, numParticles); + maxVertices = std::max(maxVertices, numVertices); + + if (numParticles == 0 && numVertices == 0) { + emptyJets_.push_back(true); + } else { + emptyJets_.push_back(false); + } + + if (!(losttrackNameExample_.empty()) && numParticles > 0) { + maxLT = std::max(maxLT, + static_cast(((*tag_infos)[jet_n]).features().get(losttrackNameExample_).size())); + } } - if (maxParticles == 0 && maxVertices == 0) { + + if (maxParticles == 0 && maxVertices == 0 && maxLT == 0) { client_->setBatchSize(0); skippedInference_ = true; return; } + unsigned int minPartFromJSON = prep_info_map_.at(input_names_[0]).min_length; unsigned int maxPartFromJSON = prep_info_map_.at(input_names_[0]).max_length; - unsigned int minVertFromJSON = prep_info_map_.at(input_names_[3]).min_length; - unsigned int maxVertFromJSON = prep_info_map_.at(input_names_[3]).max_length; + unsigned int minVertFromJSON = prep_info_map_.at(input_names_[numParticleGroups_]).min_length; + unsigned int maxVertFromJSON = prep_info_map_.at(input_names_[numParticleGroups_]).max_length; maxParticles = std::clamp(maxParticles, minPartFromJSON, maxPartFromJSON); maxVertices = std::clamp(maxVertices, minVertFromJSON, maxVertFromJSON); + if (!(losttrackNameExample_.empty())) { + unsigned int minLTFromJSON = prep_info_map_.at(input_names_[numParticleGroups_ + numVertexGroups_]).min_length; + unsigned int maxLTFromJSON = prep_info_map_.at(input_names_[numParticleGroups_ + numVertexGroups_]).max_length; + maxLT = std::clamp(maxLT, minLTFromJSON, maxLTFromJSON); + } for (unsigned igroup = 0; igroup < input_names_.size(); ++igroup) { const auto &group_name = input_names_[igroup]; @@ -159,9 +215,12 @@ void ParticleNetSonicJetTagsProducer::acquire(edm::Event const &iEvent, edm::Eve if (igroup < numParticleGroups_) { input.setShape(1, maxParticles); target = maxParticles; - } else { + } else if (igroup < (numParticleGroups_ + numVertexGroups_)) { input.setShape(1, maxVertices); target = maxVertices; + } else { + input.setShape(1, maxLT); + target = maxLT; } auto tdata = input.allocate(true); for (unsigned jet_n = 0; jet_n < tag_infos->size(); ++jet_n) { @@ -172,7 +231,13 @@ void ParticleNetSonicJetTagsProducer::acquire(edm::Event const &iEvent, edm::Eve // transform/pad for (unsigned i = 0; i < prep_params.var_names.size(); ++i) { const auto &varname = prep_params.var_names[i]; - const auto &raw_value = taginfo.features().get(varname); + std::vector bare(0); + std::vector raw_value; + if (!emptyJets_.at(jet_n)) { + raw_value = taginfo.features().get(varname); + } else { + raw_value = bare; + } const auto &info = prep_params.info(varname); int insize = center_norm_pad_halfRagged(raw_value, info.center, @@ -234,7 +299,11 @@ void ParticleNetSonicJetTagsProducer::produce(edm::Event &iEvent, const auto &taginfo = (*tag_infos)[jet_n]; const auto &jet_ref = tag_infos->at(jet_n).jet(); - if (!taginfo.features().empty()) { + if (emptyJets_.at(jet_n)) { + for (std::size_t flav_n = 0; flav_n < flav_names_.size(); flav_n++) { + (*(output_tags[flav_n]))[jet_ref] = 0.; + } + } else if (!taginfo.features().empty()) { for (std::size_t flav_n = 0; flav_n < flav_names_.size(); flav_n++) { (*(output_tags[flav_n]))[jet_ref] = outputs_from_server[jet_n][flav_n]; } diff --git a/RecoBTag/ONNXRuntime/python/pfHiggsInteractionNet_cff.py b/RecoBTag/ONNXRuntime/python/pfHiggsInteractionNet_cff.py index 85387335873f6..3195f81c51b15 100644 --- a/RecoBTag/ONNXRuntime/python/pfHiggsInteractionNet_cff.py +++ b/RecoBTag/ONNXRuntime/python/pfHiggsInteractionNet_cff.py @@ -3,6 +3,8 @@ from RecoBTag.FeatureTools.pfDeepBoostedJetTagInfos_cfi import pfDeepBoostedJetTagInfos as _pfDeepBoostedJetTagInfos from RecoBTag.ONNXRuntime.boostedJetONNXJetTagsProducer_cfi import boostedJetONNXJetTagsProducer from RecoBTag.ONNXRuntime.Parameters.HiggsInteractionNet.V00.pfHiggsInteractionNetPreprocessParams_cfi import pfHiggsInteractionNetPreprocessParams +from RecoBTag.ONNXRuntime.particleNetSonicJetTagsProducer_cfi import particleNetSonicJetTagsProducer as _particleNetSonicJetTagsProducer +from Configuration.ProcessModifiers.particleNetSonicTriton_cff import particleNetSonicTriton # modify default parameters for tag infos pfHiggsInteractionNetTagInfos = _pfDeepBoostedJetTagInfos.clone( @@ -17,10 +19,27 @@ pfHiggsInteractionNetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfHiggsInteractionNetTagInfos', preprocessParams = pfHiggsInteractionNetPreprocessParams, - model_path = 'RecoBTag/Combined/data/HiggsInteractionNet/V00/IN.onnx', + model_path = 'RecoBTag/Combined/data/HiggsInteractionNet/V00/modelfile/model.onnx', flav_names = [ 'probQCD', 'probHbb' ] ) +particleNetSonicTriton.toReplaceWith(pfHiggsInteractionNetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfHiggsInteractionNetTagInfos', + preprocess_json = 'RecoBTag/Combined/data/models/higgsInteractionNet/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("higgsInteractionNet"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/higgsInteractionNet/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfHiggsInteractionNetTags.flav_names, +)) + # declare all the discriminators # nominal: probs _pfHiggsInteractionNetTagsProbs = ['pfHiggsInteractionNetTags:' + flav_name diff --git a/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK4_cff.py b/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK4_cff.py index 82356764f3818..dc3a8f746dfc1 100644 --- a/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK4_cff.py +++ b/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK4_cff.py @@ -4,6 +4,8 @@ from RecoBTag.ONNXRuntime.boostedJetONNXJetTagsProducer_cfi import boostedJetONNXJetTagsProducer from RecoBTag.FeatureTools.ParticleNetFeatureEvaluator_cfi import ParticleNetFeatureEvaluator from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4DiscriminatorsJetTags_cfi import * +from RecoBTag.ONNXRuntime.particleNetSonicJetTagsProducer_cfi import particleNetSonicJetTagsProducer as _particleNetSonicJetTagsProducer +from Configuration.ProcessModifiers.particleNetSonicTriton_cff import particleNetSonicTriton pfParticleNetFromMiniAODAK4CHSCentralTagInfos = ParticleNetFeatureEvaluator.clone( jets = "slimmedJets", @@ -41,31 +43,99 @@ pfParticleNetFromMiniAODAK4CHSCentralJetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfParticleNetFromMiniAODAK4CHSCentralTagInfos', preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Central/preprocess.json', - model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Central/particle-net.onnx', + model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Central/modelfile/model.onnx', flav_names = ['probmu','probele','probtaup1h0p','probtaup1h1p','probtaup1h2p','probtaup3h0p','probtaup3h1p','probtaum1h0p','probtaum1h1p','probtaum1h2p','probtaum3h0p','probtaum3h1p','probb','probc','probuds','probg','ptcorr','ptreshigh','ptreslow','ptnu'], ) +particleNetSonicTriton.toReplaceWith(pfParticleNetFromMiniAODAK4CHSCentralJetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfParticleNetFromMiniAODAK4CHSCentralTagInfos', + preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Central/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("particleNetFromMiniAODAK4CHSCentral"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/particleNetFromMiniAODAK4CHSCentral/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfParticleNetFromMiniAODAK4CHSCentralJetTags.flav_names, +)) + pfParticleNetFromMiniAODAK4CHSForwardJetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfParticleNetFromMiniAODAK4CHSForwardTagInfos', preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Forward/preprocess.json', - model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Forward/particle-net.onnx', + model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Forward/modelfile/model.onnx', flav_names = ['probq','probg','ptcorr','ptreshigh','ptreslow','ptnu'], ) +particleNetSonicTriton.toReplaceWith(pfParticleNetFromMiniAODAK4CHSForwardJetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfParticleNetFromMiniAODAK4CHSForwardTagInfos', + preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/CHS/Central/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("particleNetFromMiniAODAK4CHSForward"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/particleNetFromMiniAODAK4CHSForward/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfParticleNetFromMiniAODAK4CHSForwardJetTags.flav_names, +)) + pfParticleNetFromMiniAODAK4PuppiCentralJetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfParticleNetFromMiniAODAK4PuppiCentralTagInfos', preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Central/preprocess.json', - model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Central/particle-net.onnx', + model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Central/modelfile/model.onnx', flav_names = ['probmu','probele','probtaup1h0p','probtaup1h1p','probtaup1h2p','probtaup3h0p','probtaup3h1p','probtaum1h0p','probtaum1h1p','probtaum1h2p','probtaum3h0p','probtaum3h1p','probb','probc','probuds','probg','ptcorr','ptreshigh','ptreslow','ptnu'], ) +particleNetSonicTriton.toReplaceWith(pfParticleNetFromMiniAODAK4PuppiCentralJetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfParticleNetFromMiniAODAK4PuppiCentralTagInfos', + preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Central/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("particleNetFromMiniAODAK4PuppiCentral"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/particleNetFromMiniAODAK4PuppiCentral/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfParticleNetFromMiniAODAK4PuppiCentralJetTags.flav_names, +)) + pfParticleNetFromMiniAODAK4PuppiForwardJetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfParticleNetFromMiniAODAK4PuppiForwardTagInfos', preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Forward/preprocess.json', - model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Forward/particle-net.onnx', + model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Forward/modelfile/model.onnx', flav_names = ['probq','probg','ptcorr','ptreshigh','ptreslow','ptnu'], ) +particleNetSonicTriton.toReplaceWith(pfParticleNetFromMiniAODAK4PuppiForwardJetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfParticleNetFromMiniAODAK4PuppiForwardTagInfos', + preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK4/PUPPI/Forward/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("particleNetFromMiniAODAK4PuppiForward"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/particleNetFromMiniAODAK4PuppiForward/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfParticleNetFromMiniAODAK4PuppiForwardJetTags.flav_names, +)) + pfParticleNetFromMiniAODAK4CHSTask = cms.Task( pfParticleNetFromMiniAODAK4CHSCentralTagInfos, pfParticleNetFromMiniAODAK4CHSForwardTagInfos, pfParticleNetFromMiniAODAK4CHSCentralJetTags, pfParticleNetFromMiniAODAK4CHSForwardJetTags) pfParticleNetFromMiniAODAK4PuppiTask = cms.Task( pfParticleNetFromMiniAODAK4PuppiCentralTagInfos, pfParticleNetFromMiniAODAK4PuppiForwardTagInfos, pfParticleNetFromMiniAODAK4PuppiCentralJetTags, pfParticleNetFromMiniAODAK4PuppiForwardJetTags) diff --git a/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK8_cff.py b/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK8_cff.py index 2c9e3c62e4c94..50825e9abccd6 100644 --- a/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK8_cff.py +++ b/RecoBTag/ONNXRuntime/python/pfParticleNetFromMiniAODAK8_cff.py @@ -4,6 +4,8 @@ from RecoBTag.ONNXRuntime.boostedJetONNXJetTagsProducer_cfi import boostedJetONNXJetTagsProducer from RecoBTag.FeatureTools.ParticleNetFeatureEvaluator_cfi import ParticleNetFeatureEvaluator from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK8DiscriminatorsJetTags_cfi import pfParticleNetFromMiniAODAK8DiscriminatorsJetTags +from RecoBTag.ONNXRuntime.particleNetSonicJetTagsProducer_cfi import particleNetSonicJetTagsProducer as _particleNetSonicJetTagsProducer +from Configuration.ProcessModifiers.particleNetSonicTriton_cff import particleNetSonicTriton pfParticleNetFromMiniAODAK8TagInfos = ParticleNetFeatureEvaluator.clone( jets = "slimmedJetsAK8", @@ -17,10 +19,26 @@ pfParticleNetFromMiniAODAK8JetTags = boostedJetONNXJetTagsProducer.clone( src = 'pfParticleNetFromMiniAODAK8TagInfos', preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK8/preprocess.json', - model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK8/particle-net.onnx', + model_path = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK8/modelfile/model.onnx', flav_names = ['probHtt','probHtm','probHte','probHbb', 'probHcc', 'probHqq', 'probHgg','probQCD2hf','probQCD1hf','probQCD0hf','masscorr'], ) +particleNetSonicTriton.toReplaceWith(pfParticleNetFromMiniAODAK8JetTags, _particleNetSonicJetTagsProducer.clone( + src = 'pfParticleNetFromMiniAODAK8TagInfos', + preprocess_json = 'RecoBTag/Combined/data/ParticleNetFromMiniAODAK8/preprocess.json', + Client = cms.PSet( + timeout = cms.untracked.uint32(300), + mode = cms.string("Async"), + modelName = cms.string("particleNetFromMiniAODAK8"), + modelConfigPath = cms.FileInPath("RecoBTag/Combined/data/models/particleNetFromMiniAODAK8/config.pbtxt"), + modelVersion = cms.string(""), + verbose = cms.untracked.bool(False), + allowedTries = cms.untracked.uint32(0), + useSharedMemory = cms.untracked.bool(True), + compression = cms.untracked.string(""), + ), + flav_names = pfParticleNetFromMiniAODAK8JetTags.flav_names, +)) pfParticleNetFromMiniAODAK8Task = cms.Task( pfParticleNetFromMiniAODAK8TagInfos, pfParticleNetFromMiniAODAK8JetTags)