Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-22 05:03:22

0001 import FWCore.ParameterSet.Config as cms
0002 from PhysicsTools.NanoAOD.common_cff import Var
0003 from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import jetPuppiTable, jetPuppiCorrFactorsNano, updatedJetsPuppi, updatedJetsPuppiWithUserData
0004 from PhysicsTools.NanoAOD.jetsAK8_cff import fatJetTable, subJetTable
0005 from PhysicsTools.PatAlgos.tools.jetTools import updateJetCollection
0006 from PhysicsTools.PatAlgos.tools.helpers import addToProcessAndTask, getPatAlgosToolsTask
0007 from PhysicsTools.NanoAOD.common_cff import Var, CandVars
0008 from PhysicsTools.NanoAOD.simpleCandidateFlatTableProducer_cfi import simpleCandidateFlatTableProducer
0009 from PhysicsTools.NanoAOD.btvMC_cff import allPFPFCandsMCSequence,ak4ak8PFCandsMCSequence,ak8onlyPFCandsMCSequence,ak4onlyPFCandsMCSequence
0010 ## Move PFNano (https://github.com/cms-jet/PFNano/) to NanoAOD
0011 
0012 ## From: https://github.com/cms-jet/PFNano/blob/13_0_7_from124MiniAOD/python/addBTV.py
0013 def update_jets_AK4(process):
0014     # Based on ``nanoAOD_addDeepInfo``
0015     # in https://github.com/cms-sw/cmssw/blob/master/PhysicsTools/NanoAOD/python/nano_cff.py
0016     # DeepJet flav_names as found in
0017     # https://github.com/cms-sw/cmssw/blob/master/RecoBTag/ONNXRuntime/plugins/DeepFlavourONNXJetTagsProducer.cc#L86
0018     # and https://twiki.cern.ch/twiki/bin/view/CMS/DeepJet
0019     from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfParticleTransformerAK4JetTagsAll as pfParticleTransformerAK4JetTagsAll
0020     from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsAll as pfUnifiedParticleTransformerAK4JetTagsAll
0021     from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll as pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll
0022     from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfNegativeParticleTransformerAK4JetTagsProbs as pfNegativeParticleTransformerAK4JetTagsProbs
0023     
0024     from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfUnifiedParticleTransformerAK4JetTagsProbs as pfUnifiedParticleTransformerAK4JetTagsProbs 
0025     from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import _pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTagsProbs as pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTagsProbs
0026     from RecoBTag.ONNXRuntime.pfParticleTransformerAK4_cff import _pfNegativeParticleTransformerAK4JetTagsProbs as pfNegativeParticleTransformerAK4JetTagsProbs
0027     from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4_cff import _pfNegativeUnifiedParticleTransformerAK4JetTagsProbs as pfNegativeUnifiedParticleTransformerAK4JetTagsProbs
0028     
0029     _btagDiscriminators = [
0030         'pfJetProbabilityBJetTags',
0031         'pfJetBProbabilityBJetTags',
0032         'pfNegativeOnlyJetProbabilityBJetTags',
0033         'pfNegativeOnlyJetBProbabilityBJetTags',
0034         'pfDeepFlavourJetTags:probb',
0035         'pfDeepFlavourJetTags:probbb',
0036         'pfDeepFlavourJetTags:problepb',
0037         'pfDeepFlavourJetTags:probc',
0038         'pfDeepFlavourJetTags:probuds',
0039         'pfDeepFlavourJetTags:probg',
0040         'pfNegativeDeepFlavourJetTags:probb',
0041         'pfNegativeDeepFlavourJetTags:probbb',
0042         'pfNegativeDeepFlavourJetTags:problepb',
0043         'pfNegativeDeepFlavourJetTags:probc',
0044         'pfNegativeDeepFlavourJetTags:probuds',
0045         'pfNegativeDeepFlavourJetTags:probg',
0046     ]        + pfParticleNetFromMiniAODAK4PuppiCentralJetTagsAll + pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTagsProbs + pfUnifiedParticleTransformerAK4JetTagsAll + pfNegativeUnifiedParticleTransformerAK4JetTagsProbs
0047     # \ #+ pfParticleTransformerAK4JetTagsAll + pfNegativeParticleTransformerAK4JetTagsProbs \
0048     updateJetCollection(
0049         process,
0050         jetSource=cms.InputTag('slimmedJetsPuppi'),
0051         jetCorrections=('AK4PFPuppi',
0052                         cms.vstring(
0053                             ['L1FastJet', 'L2Relative', 'L3Absolute',
0054                              'L2L3Residual']), 'None'),
0055         btagDiscriminators=_btagDiscriminators,
0056         postfix='PuppiWithDeepInfo',
0057     )
0058     process.load("Configuration.StandardSequences.MagneticField_cff")
0059     process.jetPuppiCorrFactorsNano.src = "selectedUpdatedPatJetsPuppiWithDeepInfo"
0060     process.updatedJetsPuppi.jetSource = "selectedUpdatedPatJetsPuppiWithDeepInfo"
0061     
0062     
0063     process.updatedPatJetsTransientCorrectedPuppiWithDeepInfo.tagInfoSources.append(cms.InputTag("pfDeepFlavourTagInfosPuppiWithDeepInfo"))
0064     process.updatedPatJetsTransientCorrectedPuppiWithDeepInfo.addTagInfos = cms.bool(True)
0065 
0066     
0067     
0068     return process
0069 
0070 def update_jets_AK8(process):
0071     # Based on ``nanoAOD_addDeepInfoAK8``
0072     # in https://github.com/cms-sw/cmssw/blob/master/PhysicsTools/NanoAOD/python/nano_cff.py
0073     # Care needs to be taken to make sure no discriminators from stock Nano are excluded -> would results in unfilled vars
0074     _btagDiscriminators = [
0075         'pfMassIndependentDeepDoubleBvLV2JetTags:probHbb',
0076         'pfMassIndependentDeepDoubleCvLV2JetTags:probHcc',
0077         'pfMassIndependentDeepDoubleCvBV2JetTags:probHcc',
0078         ]
0079     from RecoBTag.ONNXRuntime.pfParticleNet_cff import _pfParticleNetJetTagsAll as pfParticleNetJetTagsAll
0080     _btagDiscriminators += pfParticleNetJetTagsAll
0081     updateJetCollection(
0082         process,
0083         jetSource=cms.InputTag('slimmedJetsAK8'),
0084         pvSource=cms.InputTag('offlineSlimmedPrimaryVertices'),
0085         svSource=cms.InputTag('slimmedSecondaryVertices'),
0086         rParam=0.8,
0087         jetCorrections=('AK8PFPuppi',
0088                         cms.vstring([
0089                             'L1FastJet', 'L2Relative', 'L3Absolute',
0090                             'L2L3Residual'
0091                         ]), 'None'),
0092         btagDiscriminators=_btagDiscriminators,
0093         postfix='AK8WithDeepInfo',
0094         # this should work but doesn't seem to enable the tag info with addTagInfos
0095         # btagInfos=['pfDeepDoubleXTagInfos'],
0096         printWarning=False)
0097     process.jetCorrFactorsAK8.src = "selectedUpdatedPatJetsAK8WithDeepInfo"
0098     process.updatedJetsAK8.jetSource = "selectedUpdatedPatJetsAK8WithDeepInfo"
0099     # add DeepDoubleX taginfos
0100     process.updatedPatJetsTransientCorrectedAK8WithDeepInfo.tagInfoSources.append(cms.InputTag("pfDeepDoubleXTagInfosAK8WithDeepInfo"))
0101     process.updatedPatJetsTransientCorrectedAK8WithDeepInfo.addTagInfos = cms.bool(True)
0102     return process
0103 
0104 def update_jets_AK8_subjet(process):
0105     # Based on ``nanoAOD_addDeepInfoAK8``
0106     # in https://github.com/cms-sw/cmssw/blob/master/PhysicsTools/NanoAOD/python/nano_cff.py
0107     # and https://github.com/alefisico/RecoBTag-PerformanceMeasurements/blob/10_2_X_boostedCommissioning/test/runBTagAnalyzer_cfg.py
0108     _btagDiscriminators = [
0109         'pfJetProbabilityBJetTags',
0110         'pfDeepCSVJetTags:probb',
0111         'pfDeepCSVJetTags:probc',
0112         'pfDeepCSVJetTags:probbb',
0113         'pfDeepCSVJetTags:probudsg',
0114         ]
0115     updateJetCollection(
0116         process,
0117         labelName='SoftDropSubjetsPF',
0118         jetSource=cms.InputTag("slimmedJetsAK8PFPuppiSoftDropPacked", "SubJets"),
0119         jetCorrections=('AK4PFPuppi',
0120                         ['L2Relative', 'L3Absolute'], 'None'),
0121         btagDiscriminators=list(_btagDiscriminators),
0122         explicitJTA=True,  # needed for subjet b tagging
0123         svClustering=False,  # needed for subjet b tagging (IMPORTANT: Needs to be set to False to disable ghost-association which does not work with slimmed jets)
0124         fatJets=cms.InputTag('slimmedJetsAK8'),  # needed for subjet b tagging
0125         rParam=0.8,  # needed for subjet b tagging
0126         sortByPt=False, # Don't change order (would mess with subJetIdx for FatJets)
0127         postfix='AK8SubjetsWithDeepInfo')
0128 
0129     process.subJetTable.src = 'selectedUpdatedPatJetsSoftDropSubjetsPFAK8SubjetsWithDeepInfo' 
0130     
0131 
0132     return process
0133 
0134 def get_DDX_vars():
0135     # retreive 27 jet-level features used in double-b and deep double-x taggers
0136     # defined in arXiv:1712.07158
0137     DDXVars = cms.PSet(
0138         DDX_jetNTracks = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.jetNTracks", int, doc="number of tracks associated with the jet"),
0139         DDX_jetNSecondaryVertices = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.jetNSecondaryVertices", int, doc="number of SVs associated with the jet"),
0140         DDX_tau1_trackEtaRel_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_trackEtaRel_0", float, doc="1st smallest track pseudorapidity, relative to the jet axis, associated to the 1st N-subjettiness axis", precision=10),
0141         DDX_tau1_trackEtaRel_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_trackEtaRel_1", float, doc="2nd smallest track pseudorapidity, relative to the jet axis, associated to the 1st N-subjettiness axis", precision=10),
0142         DDX_tau1_trackEtaRel_2 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_trackEtaRel_2", float, doc="3rd smallest track pseudorapidity, relative to the jet axis, associated to the 1st N-subjettiness axis", precision=10),
0143         DDX_tau2_trackEtaRel_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_trackEtaRel_0", float, doc="1st smallest track pseudorapidity, relative to the jet axis, associated to the 2nd N-subjettiness axis", precision=10),
0144         DDX_tau2_trackEtaRel_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_trackEtaRel_1", float, doc="2nd smallest track pseudorapidity, relative to the jet axis, associated to the 2nd N-subjettiness axis", precision=10),
0145         DDX_tau2_trackEtaRel_3 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_trackEtaRel_2", float, doc="3rd smallest track pseudorapidity, relative to the jet axis, associated to the 2nd N-subjettiness axis", precision=10),
0146         DDX_tau1_flightDistance2dSig = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_flightDistance2dSig", float, doc="transverse distance significance between primary and secondary vertex associated to the 1st N-subjettiness axis", precision=10),
0147         DDX_tau2_flightDistance2dSig = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_flightDistance2dSig", float, doc="transverse distance significance between primary and secondary vertex associated to the 2nd N-subjettiness axis", precision=10),
0148         DDX_tau1_vertexDeltaR = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_vertexDeltaR", float, doc="deltaR between the 1st N-subjettiness axis and secondary vertex direction", precision=10),
0149         DDX_tau1_vertexEnergyRatio = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_vertexEnergyRatio", float, doc="ratio of energy at secondary vertex over total energy associated to the 1st N-subjettiness axis", precision=10),
0150         DDX_tau2_vertexEnergyRatio = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_vertexEnergyRatio", float, doc="ratio of energy at secondary vertex over total energy associated to the 2nd N-subjettiness axis", precision=10),
0151         DDX_tau1_vertexMass = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_vertexMass", float, doc="mass of track sum at secondary vertex associated to the 1st N-subjettiness axis", precision=10),
0152         DDX_tau2_vertexMass = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_vertexMass", float, doc="mass of track sum at secondary vertex associated to the 2nd N-subjettiness axis", precision=10),
0153         DDX_trackSip2dSigAboveBottom_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip2dSigAboveBottom_0", float, doc="track 2D signed impact parameter significance of 1st track lifting mass above bottom", precision=10),
0154         DDX_trackSip2dSigAboveBottom_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip2dSigAboveBottom_1", float, doc="track 2D signed impact parameter significance of 2nd track lifting mass above bottom", precision=10),
0155         DDX_trackSip2dSigAboveCharm = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip2dSigAboveCharm", float, doc="track 2D signed impact parameter significance of 1st track lifting mass above charm", precision=10),
0156         DDX_trackSip3dSig_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip3dSig_0", float, doc="1st largest track 3D signed impact parameter significance", precision=10),
0157         DDX_tau1_trackSip3dSig_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_trackSip3dSig_0", float, doc="1st largest track 3D signed impact parameter significance associated to the 1st N-subjettiness axis", precision=10),
0158         DDX_tau1_trackSip3dSig_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau1_trackSip3dSig_1", float, doc="2nd largest track 3D signed impact parameter significance associated to the 1st N-subjettiness axis", precision=10),
0159         DDX_trackSip3dSig_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip3dSig_1", float, doc="2nd largest track 3D signed impact parameter significance", precision=10),
0160         DDX_tau2_trackSip3dSig_0 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_trackSip3dSig_0", float, doc="1st largest track 3D signed impact parameter significance associated to the 2nd N-subjettiness axis", precision=10),
0161         DDX_tau2_trackSip3dSig_1 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.tau2_trackSip3dSig_1", float, doc="2nd largest track 3D signed impact parameter significance associated to the 2nd N-subjettiness axis", precision=10),
0162         DDX_trackSip3dSig_2 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip3dSig_2", float, doc="3rd largest track 3D signed impact parameter significance", precision=10),
0163         DDX_trackSip3dSig_3 = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.trackSip3dSig_3", float, doc="4th largest track 3D signed impact parameter significance", precision=10),
0164         DDX_z_ratio = Var("tagInfo(\'pfDeepDoubleX\').features().tag_info_features.z_ratio", float, doc="z = deltaR(SV0,SV1)*pT(SV1)/m(SV0,SV1), defined in Eq. 7 of arXiv:1712.07158", precision=10)
0165     )
0166     return DDXVars
0167 
0168 def get_DeepCSV_vars():
0169     DeepCSVVars = cms.PSet(
0170         # Tagger inputs also include jet pt and eta
0171         # Track based (keep only jet-based features for DeepCSV from Run 3 commissioning)
0172         # DeepCSV_trackPtRel_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[0]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0173         # DeepCSV_trackPtRel_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[1]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0174         # DeepCSV_trackPtRel_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[2]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0175         # DeepCSV_trackPtRel_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[3]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0176         # DeepCSV_trackPtRel_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[4]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0177         # DeepCSV_trackPtRel_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRel\')[5]:-999", float, doc="track transverse momentum, relative to the jet axis", precision=10),
0178         # DeepCSV_trackJetDistVal_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[0]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0179         # DeepCSV_trackJetDistVal_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[1]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0180         # DeepCSV_trackJetDistVal_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[2]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0181         # DeepCSV_trackJetDistVal_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[3]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0182         # DeepCSV_trackJetDistVal_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[4]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0183         # DeepCSV_trackJetDistVal_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackJetDistVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackJetDistVal\')[5]:-999", float, doc="minimum track approach distance to jet axis", precision=10),
0184         # DeepCSV_trackDeltaR_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[0]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0185         # DeepCSV_trackDeltaR_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[1]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0186         # DeepCSV_trackDeltaR_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[2]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0187         # DeepCSV_trackDeltaR_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[3]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0188         # DeepCSV_trackDeltaR_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[4]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0189         # DeepCSV_trackDeltaR_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDeltaR\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDeltaR\')[5]:-999", float, doc="track pseudoangular distance from the jet axis", precision=10),
0190         # DeepCSV_trackPtRatio_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[0]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0191         # DeepCSV_trackPtRatio_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[1]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0192         # DeepCSV_trackPtRatio_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[2]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0193         # DeepCSV_trackPtRatio_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[3]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0194         # DeepCSV_trackPtRatio_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[4]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0195         # DeepCSV_trackPtRatio_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackPtRatio\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackPtRatio\')[5]:-999", float, doc="track transverse momentum, relative to the jet axis, normalized to its energy", precision=10),
0196         # DeepCSV_trackSip3dSig_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[0]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0197         # DeepCSV_trackSip3dSig_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[1]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0198         # DeepCSV_trackSip3dSig_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[2]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0199         # DeepCSV_trackSip3dSig_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[3]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0200         # DeepCSV_trackSip3dSig_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[4]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0201         # DeepCSV_trackSip3dSig_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip3dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip3dSig\')[5]:-999", float, doc="track 3D signed impact parameter significance", precision=10),
0202         # DeepCSV_trackSip2dSig_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[0]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0203         # DeepCSV_trackSip2dSig_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[1]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0204         # DeepCSV_trackSip2dSig_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[2]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0205         # DeepCSV_trackSip2dSig_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[3]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0206         # DeepCSV_trackSip2dSig_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[4]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0207         # DeepCSV_trackSip2dSig_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackSip2dSig\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackSip2dSig\')[5]:-999", float, doc="track 2D signed impact parameter significance", precision=10),
0208         # DeepCSV_trackDecayLenVal_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[0]:-999", float, doc="track decay length", precision=10),
0209         # DeepCSV_trackDecayLenVal_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[1]:-999", float, doc="track decay length", precision=10),
0210         # DeepCSV_trackDecayLenVal_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[2]:-999", float, doc="track decay length", precision=10),
0211         # DeepCSV_trackDecayLenVal_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[3]:-999", float, doc="track decay length", precision=10),
0212         # DeepCSV_trackDecayLenVal_4 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[4]:-999", float, doc="track decay length", precision=10),
0213         # DeepCSV_trackDecayLenVal_5 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackDecayLenVal\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackDecayLenVal\')[5]:-999", float, doc="track decay length", precision=10),
0214         # DeepCSV_trackEtaRel_0 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackEtaRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackEtaRel\')[0]:-999", float, doc="track pseudorapidity, relative to the jet axis", precision=10),
0215         # DeepCSV_trackEtaRel_1 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackEtaRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackEtaRel\')[1]:-999", float, doc="track pseudorapidity, relative to the jet axis", precision=10),
0216         # DeepCSV_trackEtaRel_2 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackEtaRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackEtaRel\')[2]:-999", float, doc="track pseudorapidity, relative to the jet axis", precision=10),
0217         # DeepCSV_trackEtaRel_3 = Var("?tagInfo(\'pfDeepCSV\').taggingVariables.checkTag(\'trackEtaRel\')?tagInfo(\'pfDeepCSV\').taggingVariables.getList(\'trackEtaRel\')[3]:-999", float, doc="track pseudorapidity, relative to the jet axis", precision=10),
0218         # Jet based
0219         DeepCSV_trackJetPt = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackJetPt\', -999)", float, doc="track-based jet transverse momentum", precision=10),
0220         DeepCSV_vertexCategory = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'vertexCategory\', -999)", float, doc="category of secondary vertex (Reco, Pseudo, No)", precision=10),
0221         DeepCSV_jetNSecondaryVertices = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'jetNSecondaryVertices\', -999)", int, doc="number of reconstructed possible secondary vertices in jet"),
0222         DeepCSV_jetNSelectedTracks = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'jetNSelectedTracks\', -999)", int, doc="selected tracks in the jet"), 
0223         DeepCSV_jetNTracksEtaRel = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'jetNTracksEtaRel\', -999)", int, doc="number of tracks for which etaRel is computed"), 
0224         DeepCSV_trackSumJetEtRatio = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSumJetEtRatio\', -999)", float, doc="ratio of track sum transverse energy over jet energy", precision=10),
0225         DeepCSV_trackSumJetDeltaR = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSumJetDeltaR\', -999)", float, doc="pseudoangular distance between jet axis and track fourvector sum", precision=10),
0226         DeepCSV_trackSip2dValAboveCharm = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSip2dValAboveCharm\', -999)", float, doc="track 2D signed impact parameter of first track lifting mass above charm", precision=10),
0227         DeepCSV_trackSip2dSigAboveCharm = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSip2dSigAboveCharm\', -999)", float, doc="track 2D signed impact parameter significance of first track lifting mass above charm", precision=10),
0228         DeepCSV_trackSip3dValAboveCharm = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSip3dValAboveCharm\', -999)", float, doc="track 3D signed impact parameter of first track lifting mass above charm", precision=10),
0229         DeepCSV_trackSip3dSigAboveCharm = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'trackSip3dSigAboveCharm\', -999)", float, doc="track 3D signed impact parameter significance of first track lifting mass above charm", precision=10),
0230         DeepCSV_vertexMass = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'vertexMass\', -999)", float, doc="mass of track sum at secondary vertex", precision=10),
0231         DeepCSV_vertexNTracks = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'vertexNTracks\', -999)", int, doc="number of tracks at secondary vertex"),
0232         DeepCSV_vertexEnergyRatio = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'vertexEnergyRatio\', -999)", float, doc="ratio of energy at secondary vertex over total energy", precision=10),
0233         DeepCSV_vertexJetDeltaR = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'vertexJetDeltaR\', -999)", float, doc="pseudoangular distance between jet axis and secondary vertex direction", precision=10),
0234         DeepCSV_flightDistance2dVal = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'flightDistance2dVal\', -999)", float, doc="transverse distance between primary and secondary vertex", precision=10),
0235         DeepCSV_flightDistance2dSig = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'flightDistance2dSig\', -999)", float, doc="transverse distance significance between primary and secondary vertex", precision=10),
0236         DeepCSV_flightDistance3dVal = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'flightDistance3dVal\', -999)", float, doc="distance between primary and secondary vertex", precision=10),
0237         DeepCSV_flightDistance3dSig = Var("tagInfo(\'pfDeepCSV\').taggingVariables.get(\'flightDistance3dSig\', -999)", float, doc="distance significance between primary and secondary vertex", precision=10),
0238     )
0239     return DeepCSVVars
0240 
0241 ## Store all output nodes, negative tagger for SF 
0242 def get_DeepJet_outputs():
0243     DeepJetOutputVars = cms.PSet(
0244         btagDeepFlavB_b=Var("bDiscriminator('pfDeepFlavourJetTags:probb')",
0245                             float,
0246                             doc="DeepJet b tag probability",
0247                             precision=10),
0248         btagDeepFlavB_bb=Var("bDiscriminator('pfDeepFlavourJetTags:probbb')",
0249                             float,
0250                             doc="DeepJet bb tag probability",
0251                             precision=10),
0252         btagDeepFlavB_lepb=Var("bDiscriminator('pfDeepFlavourJetTags:problepb')",
0253                             float,
0254                             doc="DeepJet lepb tag probability",
0255                             precision=10),
0256         btagDeepFlavC=Var("bDiscriminator('pfDeepFlavourJetTags:probc')",
0257                             float,
0258                             doc="DeepJet c tag probability",
0259                             precision=10),
0260         btagDeepFlavUDS=Var("bDiscriminator('pfDeepFlavourJetTags:probuds')",
0261                             float,
0262                             doc="DeepJet uds tag probability",
0263                             precision=10),
0264         btagDeepFlavG=Var("bDiscriminator('pfDeepFlavourJetTags:probg')",
0265                             float,
0266                             doc="DeepJet gluon tag probability",
0267                             precision=10),
0268         # discriminators are already part of jets_cff.py from NanoAOD and therefore not added here     
0269 
0270         # negative taggers
0271         btagNegDeepFlavB = Var("bDiscriminator('pfNegativeDeepFlavourJetTags:probb')+bDiscriminator('pfNegativeDeepFlavourJetTags:probbb')+bDiscriminator('pfNegativeDeepFlavourJetTags:problepb')",
0272                             float,
0273                             doc="Negative DeepJet b+bb+lepb tag discriminator",
0274                             precision=10),
0275         btagNegDeepFlavCvL = Var("?(bDiscriminator('pfNegativeDeepFlavourJetTags:probc')+bDiscriminator('pfNegativeDeepFlavourJetTags:probuds')+bDiscriminator('pfNegativeDeepFlavourJetTags:probg'))>0?bDiscriminator('pfNegativeDeepFlavourJetTags:probc')/(bDiscriminator('pfNegativeDeepFlavourJetTags:probc')+bDiscriminator('pfNegativeDeepFlavourJetTags:probuds')+bDiscriminator('pfNegativeDeepFlavourJetTags:probg')):-1",
0276                             float,
0277                             doc="Negative DeepJet c vs uds+g discriminator",
0278                             precision=10),
0279         btagNegDeepFlavCvB = Var("?(bDiscriminator('pfNegativeDeepFlavourJetTags:probc')+bDiscriminator('pfNegativeDeepFlavourJetTags:probb')+bDiscriminator('pfNegativeDeepFlavourJetTags:probbb')+bDiscriminator('pfNegativeDeepFlavourJetTags:problepb'))>0?bDiscriminator('pfNegativeDeepFlavourJetTags:probc')/(bDiscriminator('pfNegativeDeepFlavourJetTags:probc')+bDiscriminator('pfNegativeDeepFlavourJetTags:probb')+bDiscriminator('pfNegativeDeepFlavourJetTags:probbb')+bDiscriminator('pfNegativeDeepFlavourJetTags:problepb')):-1",
0280                             float,
0281                             doc="Negative DeepJet c vs b+bb+lepb discriminator",
0282                             precision=10),
0283         btagNegDeepFlavQG = Var("?(bDiscriminator('pfNegativeDeepFlavourJetTags:probg')+bDiscriminator('pfNegativeDeepFlavourJetTags:probuds'))>0?bDiscriminator('pfNegativeDeepFlavourJetTags:probg')/(bDiscriminator('pfNegativeDeepFlavourJetTags:probg')+bDiscriminator('pfNegativeDeepFlavourJetTags:probuds')):-1",
0284                             float,
0285                             doc="Negative DeepJet g vs uds discriminator",
0286                             precision=10),
0287         btagNegDeepFlavB_b = Var("bDiscriminator('pfNegativeDeepFlavourJetTags:probb')",
0288                             float,
0289                             doc="Negative DeepJet b tag probability",
0290                             precision=10),
0291         btagNegDeepFlavB_bb = Var("bDiscriminator('pfNegativeDeepFlavourJetTags:probbb')",
0292                             float,
0293                             doc="Negative DeepJet bb tag probability",
0294                             precision=10),
0295         btagNegDeepFlavB_lepb = Var("bDiscriminator('pfNegativeDeepFlavourJetTags:problepb')",
0296                             float,
0297                             doc="Negative DeepJet lepb tag probability",
0298                             precision=10),
0299         btagNegDeepFlavG = Var("bDiscriminator('pfNegativeDeepFlavourJetTags:probg')",
0300                             float,
0301                             doc="Negative DeepJet gluon tag probability",
0302                             precision=10),
0303     )
0304     return DeepJetOutputVars
0305 
0306 def get_ParticleNetAK4_outputs():
0307     ## default scores in jetAK4_Puppi_cff.py collections
0308     ParticleNetAK4OutputVars = cms.PSet(
0309         # raw scores
0310         btagPNetProbB = Var("?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probb')>0?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probb'):-1",
0311                             float,
0312                             doc="ParticleNet b tag probability",
0313                             precision=10),
0314         btagPNetProbC = Var("?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')>0?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probc'):-1",
0315                             float,
0316                             doc="ParticleNet c tag probability",
0317                             precision=10),
0318         btagPNetProbUDS = Var("?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')>0?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds'):-1",
0319                             float,
0320                             doc="ParticleNet uds tag probability",
0321                             precision=10),
0322         btagPNetProbG = Var("?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probg')>0?bDiscriminator('pfParticleNetFromMiniAODAK4PuppiCentralJetTags:probg'):-1",
0323                             float,
0324                             doc="ParticleNet gluon tag probability",
0325                             precision=10),
0326         
0327         # negative taggers
0328         btagNegPNetB = Var("?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probb')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg'))>0?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probb'))/(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probb')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg')):-1",
0329                             float,
0330                             doc="Negative ParticleNet b vs. udscg",
0331                             precision=10),
0332         btagNegPNetCvL = Var("?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg'))>0?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc'))/(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg')):-1",
0333                             float,
0334                             doc="Negative ParticleNet c vs. udsg",
0335                             precision=10),
0336         btagNegPNetCvB = Var("?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probb'))>0?(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc'))/(bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probc')+bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probb')):-1",
0337                             float,
0338                             doc="Negative ParticleNet c vs. b",
0339                             precision=10),
0340         btagNegPNetProbUDS = Var("?bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds')>0?bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probuds'):-1",
0341                             float,
0342                             doc="Negative ParticleNet uds tag probability",
0343                             precision=10),
0344         btagNegPNetProbG = Var("?bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg')>0?bDiscriminator('pfNegativeParticleNetFromMiniAODAK4PuppiCentralJetTags:probg'):-1",
0345                             float,
0346                             doc="Negative ParticleNet gluon tag probability",
0347                             precision=10),
0348     )
0349 
0350     return ParticleNetAK4OutputVars
0351 
0352 def get_ParticleTransformerAK4_outputs():
0353     ParticleTransformerAK4OutputVars = cms.PSet(       
0354         btagRobustParTAK4B_b=Var("bDiscriminator('pfParticleTransformerAK4JetTags:probb')",
0355                             float,
0356                             doc="RobustParTAK4 b tag probability",
0357                             precision=10),
0358         btagRobustParTAK4B_bb=Var("bDiscriminator('pfParticleTransformerAK4JetTags:probbb')",
0359                             float,
0360                             doc="RobustParTAK4 bb tag probability",
0361                             precision=10),
0362         btagRobustParTAK4B_lepb=Var("bDiscriminator('pfParticleTransformerAK4JetTags:problepb')",
0363                             float,
0364                             doc="RobustParTAK4 lepb tag probability",
0365                             precision=10),
0366         btagRobustParTAK4UDS=Var("bDiscriminator('pfParticleTransformerAK4JetTags:probuds')",
0367                             float,
0368                             doc="RobustParTAK4 uds tag probability",
0369                             precision=10),
0370         btagRobustParTAK4G=Var("bDiscriminator('pfParticleTransformerAK4JetTags:probg')",
0371                             float,
0372                             doc="RobustParTAK4 gluon tag probability",
0373                             precision=10),
0374 
0375         # negative taggers
0376         btagNegRobustParTAK4B = Var("bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:problepb')",
0377                             float,
0378                             doc="Negative RobustParTAK4 b+bb+lepb tag discriminator",
0379                             precision=10),
0380         btagNegRobustParTAK4CvL = Var("?(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg'))>0?bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg')):-1",
0381                             float,
0382                             doc="Negative RobustParTAK4 c vs uds+g discriminator",
0383                             precision=10),
0384         btagNegRobustParTAK4CvB = Var("?(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:problepb'))>0?bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:problepb')):-1",
0385                             float,
0386                             doc="Negative RobustParTAK4 c vs b+bb+lepb discriminator",
0387                             precision=10),
0388         btagNegRobustParTAK4QG = Var("?(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probuds'))>0?bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg')/(bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg')+bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probuds')):-1",
0389                             float,
0390                             doc="Negative RobustParTAK4 g vs uds discriminator",
0391                             precision=10),
0392         btagNegRobustParTAK4B_b = Var("bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probb')",
0393                             float,
0394                             doc="Negative RobustParTAK4 b tag probability",
0395                             precision=10),
0396         btagNegRobustParTAK4B_bb = Var("bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probbb')",
0397                             float,
0398                             doc="Negative RobustParTAK4 bb tag probability",
0399                             precision=10),
0400         btagNegRobustParTAK4B_lepb = Var("bDiscriminator('pfNegativeParticleTransformerAK4JetTags:problepb')",
0401                             float,
0402                             doc="Negative RobustParTAK4 lepb tag probability",
0403                             precision=10),
0404         btagNegRobustParTAK4G = Var("bDiscriminator('pfNegativeParticleTransformerAK4JetTags:probg')",
0405                             float,
0406                             doc="Negative RobustParTAK4 gluon tag probability",
0407                             precision=10),
0408     )
0409 
0410     return ParticleTransformerAK4OutputVars
0411 
0412 def get_UnifiedParticleTransformerAK4_outputs():
0413     UnifiedParticleTransformerAK4OutputVars = cms.PSet(       
0414         btagUParTAK4B_b=Var("bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:probb')",
0415                             float,
0416                             doc="UnifiedParT b tag probability",
0417                             precision=10),
0418         btagUParTAK4B_bb=Var("bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:probbb')",
0419                             float,
0420                             doc="UnifiedParT bb tag probability",
0421                             precision=10),
0422         btagUParTAK4B_lepb=Var("bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:problepb')",
0423                             float,
0424                             doc="UnifiedParT lepb tag probability",
0425                             precision=10),
0426         btagUParTAK4UDS=Var("bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:probuds')",
0427                             float,
0428                             doc="UnifiedParT uds tag probability",
0429                             precision=10),
0430         btagUParTAK4G=Var("bDiscriminator('pfUnifiedParticleTransformerAK4JetTags:probg')",
0431                             float,
0432                             doc="UnifiedParT gluon tag probability",
0433                             precision=10),
0434 
0435         # negative taggers
0436         btagNegUParTAK4B = Var("bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:problepb')",
0437                             float,
0438                             doc="Negative UnifiedParT b+bb+lepb tag discriminator",
0439                             precision=10),
0440         btagNegUParTAK4CvL = Var("?(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg'))>0?bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probuds')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg')):-1",
0441                             float,
0442                             doc="Negative UnifiedParT c vs uds+g discriminator",
0443                             precision=10),
0444         btagNegUParTAK4CvB = Var("?(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:problepb'))>0?bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')/(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probc')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probbb')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:problepb')):-1",
0445                             float,
0446                             doc="Negative UnifiedParT c vs b+bb+lepb discriminator",
0447                             precision=10),
0448         btagNegUParTAK4QG = Var("?(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probuds'))>0?bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg')/(bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg')+bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probuds')):-1",
0449                             float,
0450                             doc="Negative UnifiedParT g vs uds discriminator",
0451                             precision=10),
0452         btagNegUParTAK4B_b = Var("bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probb')",
0453                             float,
0454                             doc="Negative UnifiedParT b tag probability",
0455                             precision=10),
0456         btagNegUParTAK4B_bb = Var("bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probbb')",
0457                             float,
0458                             doc="Negative UnifiedParT bb tag probability",
0459                             precision=10),
0460         btagNegUParTAK4B_lepb = Var("bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:problepb')",
0461                             float,
0462                             doc="Negative UnifiedParT lepb tag probability",
0463                             precision=10),
0464         btagNegUParTAK4G = Var("bDiscriminator('pfNegativeUnifiedParticleTransformerAK4JetTags:probg')",
0465                             float,
0466                             doc="Negative UnifiedParT gluon tag probability",
0467                             precision=10),
0468     )
0469 
0470     return UnifiedParticleTransformerAK4OutputVars
0471 
0472 
0473 
0474 def add_BTV(process,  addAK4=False, addAK8=False, scheme="btvSF"):
0475     process.customizeJetTask = cms.Task()
0476     process.schedule.associate(process.customizeJetTask)
0477     
0478     CommonVars = cms.PSet(
0479         Proba=Var("bDiscriminator('pfJetProbabilityBJetTags')",
0480                   float,
0481                   doc="Jet Probability (Usage:BTV)",
0482                   precision=10),
0483         ProbaN=Var("bDiscriminator('pfNegativeOnlyJetProbabilityBJetTags')",
0484                   float,
0485                   doc="Negative-only Jet Probability (Usage:BTV)",
0486                   precision=10),
0487         Bprob=Var("bDiscriminator('pfJetBProbabilityBJetTags')",
0488                   float,
0489                   doc="Jet B Probability (Usage:BTV)",
0490                   precision=10),
0491         BprobN=Var("bDiscriminator('pfNegativeOnlyJetBProbabilityBJetTags')",
0492                   float,
0493                   doc="Negative-only Jet B Probability (Usage:BTV)",
0494                   precision=10),
0495     )
0496     
0497     # decouple these from CommonVars, not relevant for data
0498     HadronCountingVars = cms.PSet(
0499         nBHadrons=Var("jetFlavourInfo().getbHadrons().size()",
0500                       int,
0501                       doc="number of b-hadrons"),
0502         nCHadrons=Var("jetFlavourInfo().getcHadrons().size()",
0503                       int,
0504                       doc="number of c-hadrons")
0505     )
0506 
0507     # AK4
0508     if addAK4:
0509         if scheme == "btvSF":
0510             _n_cpf = 3 
0511             _n_npf = 3
0512             _n_sv = 4
0513         elif scheme == "DeepJet":
0514             _n_cpf = 25 
0515             _n_npf = 25
0516             _n_sv = 4
0517         elif scheme == "RobustParTAK4":
0518             _n_cpf = 25 
0519             _n_npf = 25
0520             _n_sv = 12
0521         process = update_jets_AK4(process)
0522             
0523         process.customJetExtTable = cms.EDProducer(
0524             "SimplePATJetFlatTableProducer",
0525             src=jetPuppiTable.src,
0526             cut=jetPuppiTable.cut,
0527             name=jetPuppiTable.name,
0528             doc=jetPuppiTable.doc,
0529             singleton=cms.bool(False),  # the number of entries is variable
0530             extension=cms.bool(True),  # this is the extension table for Jets
0531             variables=cms.PSet(
0532                 CommonVars,
0533                 get_DeepCSV_vars(),
0534                 get_DeepJet_outputs(),  # outputs are added in any case, inputs only if requested
0535                 get_ParticleNetAK4_outputs(),
0536                 get_UnifiedParticleTransformerAK4_outputs(),
0537                 get_ParticleTransformerAK4_outputs(),# removed in 2024
0538             ))
0539     
0540          # from Run3 onwards, always set storeAK4Truth to True for MC
0541         process.customAK4ConstituentsForDeepJetTable = cms.EDProducer("PatJetDeepJetTableProducer",
0542                                                                         jets = cms.InputTag("linkedObjects","jets"),
0543                                                                         n_cpf=cms.uint32(_n_cpf),
0544                                                                         n_npf=cms.uint32(_n_npf),
0545                                                                         n_sv=cms.uint32(_n_sv)
0546                                                                       )
0547         process.customizeJetTask.add(process.customJetExtTable)
0548         process.customizeJetTask.add(process.customAK4ConstituentsForDeepJetTable)
0549     # AK8
0550     if addAK8:
0551         process = update_jets_AK8(process)
0552         process = update_jets_AK8_subjet(process)
0553         process.customFatJetExtTable = cms.EDProducer(
0554             "SimplePATJetFlatTableProducer",
0555             src=fatJetTable.src,
0556             cut=fatJetTable.cut,
0557             name=fatJetTable.name,
0558             doc=fatJetTable.doc,
0559             singleton=cms.bool(False),  # the number of entries is variable
0560             extension=cms.bool(True),  # this is the extension table for FatJets
0561             variables=cms.PSet(
0562                 CommonVars,
0563                 #HadronCountingVars if runOnMC else cms.PSet(), # only necessary before 106x
0564                 get_DDX_vars() ,
0565             ))
0566 
0567 
0568         # Subjets
0569         process.customSubJetExtTable = cms.EDProducer(
0570             "SimplePATJetFlatTableProducer",
0571             src=subJetTable.src,
0572             cut=subJetTable.cut,
0573             name=subJetTable.name,
0574             doc=subJetTable.doc,
0575             singleton=cms.bool(False),  # the number of entries is variable
0576             extension=cms.bool(True),  # this is the extension table for FatJets
0577             variables=cms.PSet(
0578                 CommonVars,
0579                 #HadronCountingVars if runOnMC else cms.PSet(), # only necessary before 106x
0580         ))
0581 
0582         process.customizeJetTask.add(process.customFatJetExtTable)
0583         process.customizeJetTask.add(process.customSubJetExtTable)
0584 
0585 
0586 
0587 #  From https://github.com/cms-jet/PFNano/blob/13_0_7_from124MiniAOD/python/addPFCands_cff.py
0588 def addPFCands(process, allPF = False, addAK4=False, addAK8=False):
0589     process.customizedPFCandsTask = cms.Task()
0590     process.schedule.associate(process.customizedPFCandsTask)
0591 
0592     process.finalJetsAK8Constituents = cms.EDProducer("PatJetConstituentPtrSelector",
0593                                             src = cms.InputTag("finalJetsAK8"),
0594                                             cut = cms.string("")
0595                                             )
0596     process.finalJetsAK4Constituents = cms.EDProducer("PatJetConstituentPtrSelector",
0597                                             src = cms.InputTag("finalJetsPuppi"),
0598                                             cut = cms.string("")
0599                                             )
0600     if allPF:
0601         candInput = cms.InputTag("packedPFCandidates")
0602     elif not addAK8:
0603         candList = cms.VInputTag(cms.InputTag("finalJetsAK4Constituents", "constituents"))
0604         process.customizedPFCandsTask.add(process.finalJetsAK4Constituents)
0605         process.finalJetsConstituentsTable = cms.EDProducer("PackedCandidatePtrMerger", src = candList, skipNulls = cms.bool(True), warnOnSkip = cms.bool(True))
0606         candInput = cms.InputTag("finalJetsConstituentsTable")
0607     elif not addAK4:
0608         candList = cms.VInputTag(cms.InputTag("finalJetsAK8Constituents", "constituents"))
0609         process.customizedPFCandsTask.add(process.finalJetsAK8Constituents)
0610         process.finalJetsConstituentsTable = cms.EDProducer("PackedCandidatePtrMerger", src = candList, skipNulls = cms.bool(True), warnOnSkip = cms.bool(True))
0611         candInput = cms.InputTag("finalJetsConstituentsTable")
0612     else:
0613         candList = cms.VInputTag(cms.InputTag("finalJetsAK4Constituents", "constituents"), cms.InputTag("finalJetsAK8Constituents", "constituents"))
0614         process.customizedPFCandsTask.add(process.finalJetsAK4Constituents)
0615         process.customizedPFCandsTask.add(process.finalJetsAK8Constituents)
0616         process.finalJetsConstituentsTable = cms.EDProducer("PackedCandidatePtrMerger", src = candList, skipNulls = cms.bool(True), warnOnSkip = cms.bool(True))
0617         candInput = cms.InputTag("finalJetsConstituentsTable")
0618     
0619     process.customConstituentsExtTable = cms.EDProducer("SimplePATCandidateFlatTableProducer",
0620                                                         src = candInput,
0621                                                         cut = cms.string(""), #we should not filter after pruning
0622                                                         name = cms.string("PFCands"),
0623                                                         doc = cms.string("interesting particles from AK4 and AK8 jets"),
0624                                                         singleton = cms.bool(False), # the number of entries is variable
0625                                                         extension = cms.bool(False), # this is the extension table for the AK8 constituents
0626                                                         variables = cms.PSet(CandVars,
0627                                                             puppiWeight = Var("puppiWeight()", float, doc="Puppi weight",precision=10),
0628                                                             puppiWeightNoLep = Var("puppiWeightNoLep()", float, doc="Puppi weight removing leptons",precision=10),
0629                                                             vtxChi2 = Var("?hasTrackDetails()?vertexChi2():-1", float, doc="vertex chi2",precision=10),
0630                                                             trkChi2 = Var("?hasTrackDetails()?pseudoTrack().normalizedChi2():-1", float, doc="normalized trk chi2", precision=10),
0631                                                             dz = Var("?hasTrackDetails()?dz():-1", float, doc="pf dz", precision=10),
0632                                                             dzErr = Var("?hasTrackDetails()?dzError():-1", float, doc="pf dz err", precision=10),
0633                                                             d0 = Var("?hasTrackDetails()?dxy():-1", float, doc="pf d0", precision=10),
0634                                                             d0Err = Var("?hasTrackDetails()?dxyError():-1", float, doc="pf d0 err", precision=10),
0635                                                             pvAssocQuality = Var("pvAssociationQuality()", int, doc="primary vertex association quality. 0: NotReconstructedPrimary, 1: OtherDeltaZ, 4: CompatibilityBTag, 5: CompatibilityDz, 6: UsedInFitLoose, 7: UsedInFitTight"),
0636                                                             lostInnerHits = Var("lostInnerHits()", int, doc="lost inner hits. -1: validHitInFirstPixelBarrelLayer, 0: noLostInnerHits, 1: oneLostInnerHit, 2: moreLostInnerHits"),
0637                                                             lostOuterHits = Var("?hasTrackDetails()?pseudoTrack().hitPattern().numberOfLostHits('MISSING_OUTER_HITS'):0", int, doc="lost outer hits"),
0638                                                             numberOfHits = Var("numberOfHits()", int, doc="number of hits"),
0639                                                             numberOfPixelHits = Var("numberOfPixelHits()", int, doc="number of pixel hits"),
0640                                                             trkQuality = Var("?hasTrackDetails()?pseudoTrack().qualityMask():0", int, doc="track quality mask"),
0641                                                             trkHighPurity = Var("?hasTrackDetails()?pseudoTrack().quality('highPurity'):0", bool, doc="track is high purity"),
0642                                                             trkAlgo = Var("?hasTrackDetails()?pseudoTrack().algo():-1", int, doc="track algorithm"),
0643                                                             trkP = Var("?hasTrackDetails()?pseudoTrack().p():-1", float, doc="track momemtum", precision=-1),
0644                                                             trkPt = Var("?hasTrackDetails()?pseudoTrack().pt():-1", float, doc="track pt", precision=-1),
0645                                                             trkEta = Var("?hasTrackDetails()?pseudoTrack().eta():-1", float, doc="track pt", precision=12),
0646                                                             trkPhi = Var("?hasTrackDetails()?pseudoTrack().phi():-1", float, doc="track phi", precision=12),
0647                                                          )
0648                                     )
0649     process.customAK8ConstituentsTable = cms.EDProducer("PatJetConstituentTableProducer",
0650                                                         candidates = candInput,
0651                                                         jets = cms.InputTag("finalJetsAK8"),
0652                                                         jet_radius = cms.double(0.8),
0653                                                         name = cms.string("FatJetPFCands"),
0654                                                         idx_name = cms.string("pFCandsIdx"),
0655                                                         nameSV = cms.string("FatJetSVs"),
0656                                                         idx_nameSV = cms.string("sVIdx"),
0657                                                         )
0658     process.customAK4ConstituentsTable = cms.EDProducer("PatJetConstituentTableProducer",
0659                                                         candidates = candInput,
0660                                                         jets = cms.InputTag("finalJetsPuppi"), # was finalJets before
0661                                                         jet_radius = cms.double(0.4),
0662                                                         name = cms.string("JetPFCands"),
0663                                                         idx_name = cms.string("pFCandsIdx"),
0664                                                         nameSV = cms.string("JetSVs"),
0665                                                         idx_nameSV = cms.string("sVIdx"),
0666                                                         )
0667     process.customizedPFCandsTask.add(process.customConstituentsExtTable)
0668 
0669     if not allPF:
0670         process.customizedPFCandsTask.add(process.finalJetsConstituentsTable)
0671     # linkedObjects are WIP for Run3
0672     if addAK8:
0673         process.customizedPFCandsTask.add(process.customAK8ConstituentsTable)
0674     if addAK4: 
0675         process.customizedPFCandsTask.add(process.customAK4ConstituentsTable)
0676     
0677         
0678     return process
0679 
0680 ## Switches for BTV nano
0681 # Default(store SFs PFCands+TaggerInputs) for both AK4 & AK8 jets
0682 # btvNano_addAK4_switch, btvNano_addAK8_switch True, btvNano_addPF_switch  False, TaggerInput = "btvSF"
0683 
0684 btvNano_switch = cms.PSet(
0685     btvNano_addAK4_switch = cms.untracked.bool(True),
0686     btvNano_addAK8_switch = cms.untracked.bool(False),
0687     btvNano_addallPF_switch = cms.untracked.bool(False),
0688     TaggerInput = cms.string("btvSF")
0689   )
0690 
0691 def BTVCustomNanoAOD(process):
0692     
0693     addPFCands(process,btvNano_switch.btvNano_addallPF_switch,btvNano_switch.btvNano_addAK4_switch,btvNano_switch.btvNano_addAK8_switch)
0694     add_BTV(process, btvNano_switch.btvNano_addAK4_switch,btvNano_switch.btvNano_addAK8_switch,btvNano_switch.TaggerInput)
0695     process.load("PhysicsTools.NanoAOD.btvMC_cff")
0696     ### for MC
0697     if btvNano_switch.btvNano_addallPF_switch:
0698         process.nanoSequenceMC+=allPFPFCandsMCSequence
0699     else:
0700         if btvNano_switch.btvNano_addAK4_switch and btvNano_switch.btvNano_addAK8_switch :
0701             process.nanoSequenceMC+=ak4ak8PFCandsMCSequence
0702         elif btvNano_switch.btvNano_addAK4_switch and not btvNano_switch.btvNano_addAK8_switch :
0703             process.nanoSequenceMC+=ak4onlyPFCandsMCSequence
0704         elif not btvNano_switch.btvNano_addAK4_switch and btvNano_switch.btvNano_addAK8_switch:
0705             process.nanoSequenceMC+=ak8onlyPFCandsMCSequence
0706     
0707     return process