Skip to content

Commit e767d8d

Browse files
authored
Merge pull request #47173 from AlexDeMoor/UParT-v2
Introduce Unified Particle Transformer v2
2 parents e983e10 + eff5b69 commit e767d8d

File tree

10 files changed

+288
-9
lines changed

10 files changed

+288
-9
lines changed

PhysicsTools/NanoAOD/python/custom_jme_cff.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,11 @@
2727
from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll
2828
from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfParticleTransformerAK4JetTagsAll
2929
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll
30+
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4V1_cff import _pfUnifiedParticleTransformerAK4V1JetTagsAll
3031
bTagDiscriminatorsForAK4 = cms.PSet(foo = cms.vstring(
3132
bTagDeepJet+
3233
_pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll+_pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll+
33-
_pfParticleTransformerAK4JetTagsAll + _pfUnifiedParticleTransformerAK4JetTagsAll
34+
_pfParticleTransformerAK4JetTagsAll + _pfUnifiedParticleTransformerAK4JetTagsAll + _pfUnifiedParticleTransformerAK4V1JetTagsAll
3435
))
3536
run2_nanoAOD_ANY.toModify(
3637
bTagDiscriminatorsForAK4,

PhysicsTools/NanoAOD/python/jetsAK4_Puppi_cff.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@
9494
UParTAK4RegPtRawCorr = Var("?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptcorr')>0?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptcorr'):-1",float,precision=10,doc="UnifiedParT universal flavor-aware visible pT regression (no neutrinos), correction relative to raw jet pT"),
9595
UParTAK4RegPtRawCorrNeutrino = Var("?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptnu')>0?bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptnu'):-1",float,precision=10,doc="UnifiedParT universal flavor-aware pT regression neutrino correction, relative to visible. Correction relative to raw jet pT"),
9696
UParTAK4RegPtRawRes = Var("?(bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreshigh')+bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreslow'))>0?0.5*(bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreshigh')-bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:ptreslow')):-1",float,precision=10,doc="UnifiedParT universal flavor-aware jet pT resolution estimator, (q84 - q16)/2"),
97+
UParTAK4V1RegPtRawCorr = Var("?bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptcorr')>0?bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptcorr'):-1",float,precision=10,doc="UnifiedParT V1 universal flavor-aware visible pT regression (no neutrinos), correction relative to raw jet pT"),
98+
UParTAK4V1RegPtRawCorrNeutrino = Var("?bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptnu')>0?bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptnu'):-1",float,precision=10,doc="UnifiedParT V1 universal flavor-aware pT regression neutrino correction, relative to visible. Correction relative to raw jet pT"),
99+
UParTAK4V1RegPtRawRes = Var("?(bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptreshigh')+bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptreslow'))>0?0.5*(bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptreshigh')-bDiscriminator('pfUnifiedParticleTransformerAK4V1JetTags:ptreslow')):-1",float,precision=10,doc="UnifiedParT V1 universal flavor-aware jet pT resolution estimator, (q84 - q16)/2"),
97100
puIdDisc = Var("userFloat('pileupJetIdPuppi:fullDiscriminant')", float,doc="Pileup ID BDT discriminant with 133X Winter24 PuppiV18 training",precision=10),
98101
hfsigmaEtaEta = Var("userFloat('hfsigmaEtaEta')",float,doc="sigmaEtaEta for HF jets (noise discriminating variable)",precision=10),
99102
hfsigmaPhiPhi = Var("userFloat('hfsigmaPhiPhi')",float,doc="sigmaPhiPhi for HF jets (noise discriminating variable)",precision=10),
@@ -151,6 +154,9 @@ def nanoAOD_addDeepInfoAK4(process,addParticleNet,addRobustParTAK4=False,addUnif
151154
print("Updating process to run UnifiedParTAK4")
152155
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll as pfUnifiedParticleTransformerAK4JetTagsAll
153156
_btagDiscriminators += pfUnifiedParticleTransformerAK4JetTagsAll
157+
print("Updating process to run UnifiedParTAK4V1")
158+
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4V1_cff import _pfUnifiedParticleTransformerAK4V1JetTagsAll as pfUnifiedParticleTransformerAK4V1JetTagsAll
159+
_btagDiscriminators += pfUnifiedParticleTransformerAK4V1JetTagsAll
154160
if len(_btagDiscriminators)==0: return process
155161
print("Will recalculate the following discriminators: "+", ".join(_btagDiscriminators))
156162
updateJetCollection(
@@ -166,6 +172,7 @@ def nanoAOD_addDeepInfoAK4(process,addParticleNet,addRobustParTAK4=False,addUnif
166172
return process
167173

168174
nanoAOD_addDeepInfoAK4_switch = cms.PSet(
175+
169176
nanoAOD_addParticleNet_switch = cms.untracked.bool(False),
170177
nanoAOD_addRobustParTAK4Tag_switch = cms.untracked.bool(False),
171178
nanoAOD_addUnifiedParTAK4Tag_switch = cms.untracked.bool(False)

PhysicsTools/PatAlgos/python/recoLayer0/bTagging_cff.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
, 'pfParticleTransformerAK4TagInfos'
4646
# UnifiedParticleTransformerAK4 tag infos
4747
, 'pfUnifiedParticleTransformerAK4TagInfos'
48+
# UnifiedParticleTransformerAK4V1 tag infos
49+
, 'pfUnifiedParticleTransformerAK4V1TagInfos'
4850
# GlobalParticleTransformerAK8 tag infos
4951
, 'pfGlobalParticleTransformerAK8TagInfos'
5052
# DeepDoubleB/C tag infos
@@ -367,6 +369,17 @@
367369
supportedMetaDiscr[disc] = _pfUnifiedParticleTransformerAK4JetTagsProbs
368370
# -----------------------------------
369371

372+
# -----------------------------------
373+
# setup UnifiedParticleTransformer AK4 V1
374+
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4V1_cff import _pfUnifiedParticleTransformerAK4V1JetTagsProbs, _pfUnifiedParticleTransformerAK4V1JetTagsMetaDiscrs
375+
# update supportedBtagDiscr
376+
for disc in _pfUnifiedParticleTransformerAK4V1JetTagsProbs + _pfUnifiedParticleTransformerAK4V1JetTagsMetaDiscrs:
377+
supportedBtagDiscr[disc] = [["pfUnifiedParticleTransformerAK4V1TagInfos"]]
378+
# update supportedMetaDiscr
379+
for disc in _pfUnifiedParticleTransformerAK4V1JetTagsMetaDiscrs:
380+
supportedMetaDiscr[disc] = _pfUnifiedParticleTransformerAK4V1JetTagsProbs
381+
# -----------------------------------
382+
370383
# -----------------------------------
371384
# setup Negative ParticleTransformer AK4
372385
from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfNegativeParticleTransformerAK4JetTagsProbs

PhysicsTools/PatAlgos/python/slimming/applyDeepBtagging_cff.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ def applyDeepBtagging(process, postfix=""):
1313
from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll as pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll
1414
from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll as pfParticleNetFromMiniAODAK4CHSCentralJetTagsAll
1515
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll as pfUnifiedParticleTransformerAK4JetTagsAll
16-
16+
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4V1_cff import _pfUnifiedParticleTransformerAK4V1JetTagsAll as pfUnifiedParticleTransformerAK4V1JetTagsAll
17+
1718
# update slimmed jets to include DeepFlavour (keep same name)
1819
# make clone for DeepFlavour-less slimmed jets, so output name is preserved
1920
addToProcessAndTask('slimmedJetsNoDeepFlavour', slimmedJets.clone(), process, task)
@@ -56,6 +57,7 @@ def applyDeepBtagging(process, postfix=""):
5657
+ pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll
5758
+ pfParticleNetFromMiniAODAK4PuppiForwardJetTagsAll
5859
+ pfUnifiedParticleTransformerAK4JetTagsAll
60+
+ pfUnifiedParticleTransformerAK4V1JetTagsAll
5961
)
6062

6163
updateJetCollection(

PhysicsTools/PatAlgos/python/tools/jetTools.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,37 @@ def setupBTagging(process, jetSource, pfCandidates, explicitJTA, pvSource, svSou
730730
flip = flip),
731731
process, task)
732732

733+
if 'UnifiedParticleTransformerAK4V1TagInfos' in btagInfo:
734+
svUsed = svSource
735+
if btagInfo == 'pfNegativeUnifiedParticleTransformerAK4V1TagInfos':
736+
svUsed = cms.InputTag(btagPrefix+'inclusiveCandidateNegativeSecondaryVertices'+labelName+postfix)
737+
flip = True
738+
else:
739+
flip = False
740+
# use right input tags when running with RECO PF candidates, which actually
741+
# depends of whether jets use "particleFlow"
742+
if pfCandidates.value() == 'packedPFCandidates':
743+
puppi_value_map = setupPuppiForPackedPF(process)[0]
744+
vertex_associator = cms.InputTag("")
745+
else:
746+
puppi_value_map = cms.InputTag("puppi")
747+
vertex_associator = cms.InputTag("primaryVertexAssociation","original")
748+
749+
# If this jet is a puppi jet, then set is_weighted_jet to true.
750+
is_weighted_jet = False
751+
if ('puppi' in jetSource.value().lower()):
752+
is_weighted_jet = True
753+
addToProcessAndTask(btagPrefix+btagInfo+labelName+postfix,
754+
btag.pfUnifiedParticleTransformerAK4V1TagInfos.clone(
755+
jets = jetSource,
756+
vertices=pvSource,
757+
secondary_vertices=svUsed,
758+
puppi_value_map = puppi_value_map,
759+
vertex_associator = vertex_associator,
760+
is_weighted_jet = is_weighted_jet,
761+
flip = flip),
762+
process, task)
763+
733764
if btagInfo == 'pfDeepDoubleXTagInfos':
734765
# can only run on PAT jets, so the updater needs to be used
735766
if 'updated' not in jetSource.value().lower():

RecoBTag/Configuration/python/RecoBTag_cff.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from RecoBTag.ONNXRuntime.pfParticleNetAK4_cff import *
1616
from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import *
1717
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import *
18+
from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4V1_cff import *
1819
from RecoBTag.ONNXRuntime.pfGlobalParticleTransformerAK8_cff import *
1920
from RecoVertex.AdaptiveVertexFinder.inclusiveVertexing_cff import *
2021
from RecoBTag.PixelCluster.pixelClusterTagInfos_cfi import *

RecoBTag/FeatureTools/plugins/UnifiedParticleTransformerAK4TagInfoProducer.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ void UnifiedParticleTransformerAK4TagInfoProducer::fillDescriptions(edm::Configu
159159
desc.add<double>("min_candidate_pt", 0.10);
160160
desc.add<bool>("flip", false);
161161
desc.add<bool>("sort_cand_by_pt", false);
162-
desc.add<bool>("fix_lt_sorting", false);
162+
desc.add<bool>("fix_lt_sorting", true);
163163
desc.add<edm::InputTag>("vertices", edm::InputTag("offlinePrimaryVertices"));
164164
desc.add<edm::InputTag>("losttracks", edm::InputTag("lostTracks"));
165165
desc.add<edm::InputTag>("puppi_value_map", edm::InputTag("puppi"));

RecoBTag/ONNXRuntime/plugins/UnifiedParticleTransformerAK4ONNXJetTagsProducer.cc

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class UnifiedParticleTransformerAK4ONNXJetTagsProducer : public edm::stream::EDP
4040
const edm::EDGetTokenT<TagInfoCollection> src_;
4141
std::vector<std::string> flav_names_;
4242
std::vector<std::string> input_names_;
43+
bool use_dynamic_axes_ = false;
4344
std::vector<std::string> output_names_;
4445

4546
enum InputIndexes {
@@ -76,6 +77,8 @@ UnifiedParticleTransformerAK4ONNXJetTagsProducer::UnifiedParticleTransformerAK4O
7677
: src_(consumes<TagInfoCollection>(iConfig.getParameter<edm::InputTag>("src"))),
7778
flav_names_(iConfig.getParameter<std::vector<std::string>>("flav_names")),
7879
input_names_(iConfig.getParameter<std::vector<std::string>>("input_names")),
80+
use_dynamic_axes_(iConfig.getParameter<edm::FileInPath>("model_path").fullPath().find("v2.onnx") !=
81+
std::string::npos),
7982
output_names_(iConfig.getParameter<std::vector<std::string>>("output_names")) {
8083
// get output names from flav_names
8184
for (const auto& flav_name : flav_names_) {
@@ -89,7 +92,8 @@ void UnifiedParticleTransformerAK4ONNXJetTagsProducer::fillDescriptions(edm::Con
8992
desc.add<edm::InputTag>("src", edm::InputTag("pfUnifiedParticleTransformerAK4TagInfos"));
9093
desc.add<std::vector<std::string>>(
9194
"input_names", {"input_1", "input_2", "input_3", "input_4", "input_5", "input_6", "input_7", "input_8"});
92-
desc.add<edm::FileInPath>("model_path", edm::FileInPath("RecoBTag/Combined/data/UParTAK4/PUPPI/V00/UParTAK4.onnx"));
95+
desc.add<edm::FileInPath>("model_path",
96+
edm::FileInPath("RecoBTag/Combined/data/UParTAK4/PUPPI/V01/UParTAK4_v2.onnx"));
9397
desc.add<std::vector<std::string>>("output_names", {"softmax"});
9498
desc.add<std::vector<std::string>>(
9599
"flav_names",
@@ -164,11 +168,20 @@ void UnifiedParticleTransformerAK4ONNXJetTagsProducer::get_input_sizes(
164168
const reco::FeaturesTagInfo<btagbtvdeep::UnifiedParticleTransformerAK4Features> taginfo) {
165169
const auto& features = taginfo.features();
166170

167-
/// We require a fixed size due to an ONNX conversion issue (to be improved in the future ?) ///
168-
n_cpf_ = (unsigned int)29;
169-
n_lt_ = (unsigned int)5;
170-
n_npf_ = (unsigned int)25;
171-
n_sv_ = (unsigned int)5;
171+
if (use_dynamic_axes_) {
172+
// Use actual sizes for dynamic axes version
173+
n_cpf_ = std::clamp((unsigned int)features.c_pf_features.size(), (unsigned int)1, (unsigned int)29);
174+
n_lt_ = std::clamp((unsigned int)features.lt_features.size(), (unsigned int)1, (unsigned int)5);
175+
n_npf_ = std::clamp((unsigned int)features.n_pf_features.size(), (unsigned int)1, (unsigned int)25);
176+
n_sv_ = std::clamp((unsigned int)features.sv_features.size(), (unsigned int)1, (unsigned int)5);
177+
178+
} else {
179+
// Use fixed sizes for original version
180+
n_cpf_ = (unsigned int)29;
181+
n_lt_ = (unsigned int)5;
182+
n_npf_ = (unsigned int)25;
183+
n_sv_ = (unsigned int)5;
184+
}
172185

173186
input_sizes_ = {
174187
n_cpf_ * n_features_cpf_,

0 commit comments

Comments
 (0)