Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-03-14 23:36:35

0001 import FWCore.ParameterSet.Config as cms
0002 from PhysicsTools.PatAlgos.tools.coreTools import runOnData
0003 from PhysicsTools.PatAlgos.tools.jetTools import supportedJetAlgos, addJetCollection, updateJetCollection
0004 from PhysicsTools.PatAlgos.tools.jetTools import setupPuppiForPackedPF
0005 from PhysicsTools.PatAlgos.tools.helpers  import getPatAlgosToolsTask, addToProcessAndTask
0006 
0007 def puppiAK4METReclusterFromMiniAOD(process, runOnMC, useExistingWeights, btagDiscriminatorsAK4=None):
0008 
0009   task = getPatAlgosToolsTask(process)
0010 
0011   pfLabel = "packedPFCandidates"
0012   pvLabel = "offlineSlimmedPrimaryVertices"
0013   svLabel = "slimmedSecondaryVertices"
0014   muLabel = "slimmedMuons"
0015   elLabel = "slimmedElectrons"
0016   gpLabel = "prunedGenParticles"
0017 
0018   genJetsCollection = "slimmedGenJets"
0019 
0020   #########################
0021   #
0022   # Setup puppi weights
0023   # Two instances of PuppiProducer:
0024   # 1) puppi (for jet reclustering)
0025   # 2) puppiNoLep (for MET reclustering)
0026   #
0027   ########################
0028   puppiLabel, puppiNoLepLabel = setupPuppiForPackedPF(process, useExistingWeights)
0029 
0030   #########################
0031   #
0032   # AK4 Puppi jets
0033   #
0034   ########################
0035   #
0036   # Recluster jets
0037   #
0038   process.load("RecoJets.JetProducers.ak4PFJets_cfi")
0039   task.add(process.ak4PFJetsPuppi)
0040   process.ak4PFJetsPuppi.src = pfLabel
0041   process.ak4PFJetsPuppi.srcWeights = puppiLabel
0042 
0043   from RecoJets.JetAssociationProducers.j2tParametersVX_cfi import j2tParametersVX
0044   process.ak4PFJetsPuppiTracksAssociatorAtVertex = cms.EDProducer("JetTracksAssociatorAtVertex",
0045     j2tParametersVX,
0046     jets = cms.InputTag("ak4PFJetsPuppi")
0047   )
0048   task.add(process.ak4PFJetsPuppiTracksAssociatorAtVertex)
0049   process.patJetPuppiCharge = cms.EDProducer("JetChargeProducer",
0050     src = cms.InputTag("ak4PFJetsPuppiTracksAssociatorAtVertex"),
0051     var = cms.string("Pt"),
0052     exp = cms.double(1.0)
0053   )
0054 
0055   #
0056   # PATify jets
0057   #
0058   addJetCollection(
0059     process,
0060     postfix            = "",
0061     labelName          = "Puppi",
0062     jetSource          = cms.InputTag("ak4PFJetsPuppi"),
0063     algo               = "ak",
0064     rParam             = 0.4,
0065     pfCandidates       = cms.InputTag(pfLabel),
0066     pvSource           = cms.InputTag(pvLabel),
0067     svSource           = cms.InputTag(svLabel),
0068     muSource           = cms.InputTag(muLabel),
0069     elSource           = cms.InputTag(elLabel),
0070     genJetCollection   = cms.InputTag(genJetsCollection),
0071     genParticles       = cms.InputTag(gpLabel),
0072     jetCorrections     = ('AK4PFPuppi', cms.vstring(["L2Relative", "L3Absolute"]), ''),
0073     getJetMCFlavour    = runOnMC
0074   )
0075   process.patJetsPuppi.jetChargeSource = cms.InputTag("patJetPuppiCharge")
0076   process.selectedPatJetsPuppi.cut = cms.string("pt > 10")
0077   if hasattr(process,"patJetFlavourAssociationPuppi"):
0078     process.patJetFlavourAssociationPuppi.weights = cms.InputTag(puppiLabel)
0079 
0080   process.load("RecoJets.JetProducers.PileupJetID_cfi")
0081   task.add(process.pileUpJetIDPuppiTask)
0082   process.pileupJetIdPuppi.srcConstituentWeights = puppiLabel
0083   process.pileupJetIdPuppi.vertexes = pvLabel
0084   process.patJetsPuppi.userData.userFloats.src += [cms.InputTag("pileupJetIdPuppi:fullDiscriminant")]
0085   process.patJetsPuppi.userData.userInts.src += [cms.InputTag("pileupJetIdPuppi:fullId")]
0086 
0087   #=============================================
0088   #
0089   # Update the selectedPatJet collection.
0090   # This is where we setup
0091   # -  JEC
0092   # -  b-tagging discriminators
0093   #
0094   #=============================================
0095   # update slimmedJetsPuppi to include taggers
0096   from PhysicsTools.PatAlgos.slimming.slimmedJets_cfi import slimmedJets
0097   addToProcessAndTask('slimmedJetsPuppiNoDeepTags', slimmedJets.clone(
0098       src = "selectedPatJetsPuppi",
0099       packedPFCandidates = pfLabel,
0100       dropDaughters = "0",
0101       rekeyDaughters = "0",
0102     ),
0103     process, task
0104   )
0105 
0106   updateJetCollection(
0107     process,
0108     jetSource = cms.InputTag("slimmedJetsPuppiNoDeepTags"),
0109     # updateJetCollection defaults to MiniAOD inputs but
0110     # here it is made explicit (as in training or MINIAOD redoing)
0111     pfCandidates = cms.InputTag(pfLabel),
0112     pvSource = cms.InputTag(pvLabel),
0113     svSource = cms.InputTag(svLabel),
0114     muSource = cms.InputTag(muLabel),
0115     elSource = cms.InputTag(elLabel),
0116     jetCorrections = ("AK4PFPuppi", cms.vstring(["L2Relative", "L3Absolute"]), "None"),
0117     btagDiscriminators = btagDiscriminatorsAK4.names.value() if btagDiscriminatorsAK4 is not None else ['None'],
0118     postfix = 'SlimmedDeepFlavour',
0119     printWarning = False
0120   )
0121 
0122   addToProcessAndTask("slimmedJetsPuppi", process.selectedUpdatedPatJetsSlimmedDeepFlavour.clone(), process, task)
0123   del process.selectedUpdatedPatJetsSlimmedDeepFlavour
0124 
0125   ########################
0126   #
0127   # Recluster PuppiMET
0128   #
0129   ########################
0130   from PhysicsTools.PatUtils.tools.runMETCorrectionsAndUncertainties import runMetCorAndUncFromMiniAOD
0131   runMetCorAndUncFromMiniAOD(process,
0132     isData=not(runOnMC),
0133     jetCollUnskimmed="slimmedJetsPuppi",
0134     metType="Puppi",
0135     postfix="Puppi",
0136     jetFlavor="AK4PFPuppi",
0137     puppiProducerLabel=puppiLabel,
0138     puppiProducerForMETLabel=puppiNoLepLabel,
0139     recoMetFromPFCs=True
0140   )
0141 
0142   ########################
0143   #
0144   # Modify JECs when processing real Data
0145   # Disable any MC-only features.
0146   #
0147   ########################
0148   if not(runOnMC):
0149     runOnData(process, names=["Jets","METs"], outputModules = [])
0150 
0151   return process
0152 
0153 
0154 def puppiAK8ReclusterFromMiniAOD(process, runOnMC, useExistingWeights, btagDiscriminatorsAK8=None, btagDiscriminatorsAK8Subjets=None):
0155 
0156   task = getPatAlgosToolsTask(process)
0157 
0158   pfLabel = "packedPFCandidates"
0159   pvLabel = "offlineSlimmedPrimaryVertices"
0160   svLabel = "slimmedSecondaryVertices"
0161   muLabel = "slimmedMuons"
0162   elLabel = "slimmedElectrons"
0163   gpLabel = "prunedGenParticles"
0164 
0165   genJetsAK8Collection = "slimmedGenJetsAK8"
0166   genSubJetsForAK8Collection = "slimmedGenJetsAK8SoftDropSubJets"
0167 
0168   #########################
0169   #
0170   # Setup puppi weights
0171   # Two instances of PuppiProducer:
0172   # 1) puppi (for jet reclustering)
0173   # 2) puppiNoLep (for MET reclustering)
0174   #
0175   ########################
0176   puppiLabel, puppiNoLepLabel = setupPuppiForPackedPF(process, useExistingWeights)
0177 
0178   ########################
0179   #
0180   # AK8 Puppi jets
0181   #
0182   ########################
0183   #
0184   # Recluster jets and do soft-drop grooming
0185   #
0186   process.load("RecoJets.JetProducers.ak8PFJets_cfi")
0187   task.add(process.ak8PFJetsPuppi)
0188   task.add(process.ak8PFJetsPuppiSoftDrop)
0189 
0190   # AK8 jet constituents for softdrop
0191   process.ak8PFJetsPuppi.src = pfLabel
0192   process.ak8PFJetsPuppi.srcWeights = puppiLabel
0193 
0194   # AK8 jet constituents for softdrop
0195   from CommonTools.RecoAlgos.miniAODJetConstituentSelector_cfi import miniAODJetConstituentSelector
0196   addToProcessAndTask("ak8PFJetsPuppiConstituents", miniAODJetConstituentSelector.clone(
0197       src = cms.InputTag("ak8PFJetsPuppi"),
0198       cut = cms.string("pt > 100.0 && abs(rapidity()) < 2.4")
0199     ),
0200     process, task
0201   )
0202 
0203   # Soft-drop grooming
0204   process.ak8PFJetsPuppiSoftDrop.src = "ak8PFJetsPuppiConstituents:constituents"
0205   process.ak8PFJetsPuppiSoftDrop.srcWeights = puppiLabel
0206 
0207   # Soft-drop mass
0208   process.load("RecoJets.JetProducers.ak8PFJetsPuppi_groomingValueMaps_cfi")
0209   task.add(process.ak8PFJetsPuppiSoftDropMass)
0210   process.ak8PFJetsPuppiSoftDropMass.src = "ak8PFJetsPuppi"
0211   process.ak8PFJetsPuppiSoftDropMass.matched = "ak8PFJetsPuppiSoftDrop"
0212   #=============================================
0213   #
0214   # PATify
0215   #
0216   #=============================================
0217   #
0218   # AK8 jets
0219   #
0220   addJetCollection(
0221     process,
0222     labelName          = "AK8Puppi",
0223     jetSource          = cms.InputTag("ak8PFJetsPuppi"),
0224     algo               = "ak",
0225     rParam             = 0.8,
0226     pfCandidates       = cms.InputTag(pfLabel),
0227     pvSource           = cms.InputTag(pvLabel),
0228     svSource           = cms.InputTag(svLabel),
0229     muSource           = cms.InputTag(muLabel),
0230     elSource           = cms.InputTag(elLabel),
0231     genJetCollection   = cms.InputTag(genJetsAK8Collection),
0232     genParticles       = cms.InputTag(gpLabel),
0233     jetCorrections     = ("AK8PFPuppi", cms.vstring(["L2Relative", "L3Absolute"]), "None"),
0234     getJetMCFlavour    = runOnMC,
0235   )
0236   if hasattr(process,"patJetFlavourAssociationAK8Puppi"):
0237     process.patJetFlavourAssociationAK8Puppi.weights = cms.InputTag(puppiLabel)
0238 
0239   process.patJetsAK8Puppi.userData.userFloats.src = [] # start with empty list of user floats
0240   process.patJetsAK8Puppi.userData.userFloats.src += ["ak8PFJetsPuppiSoftDropMass"]
0241   process.patJetsAK8Puppi.addTagInfos = cms.bool(False)
0242 
0243   process.selectedPatJetsAK8Puppi.cut = cms.string("pt > 100")
0244   process.selectedPatJetsAK8Puppi.cutLoose = cms.string("pt > 30")
0245   process.selectedPatJetsAK8Puppi.nLoose = cms.uint32(3)
0246 
0247   #
0248   # Add AK8 Njetiness
0249   #
0250   from RecoJets.JetProducers.nJettinessAdder_cfi import Njettiness
0251   addToProcessAndTask("NjettinessAK8Puppi", Njettiness.clone(
0252       src = "ak8PFJetsPuppi",
0253       srcWeights = puppiLabel
0254     ),
0255     process, task
0256   )
0257   process.patJetsAK8Puppi.userData.userFloats.src += [
0258     "NjettinessAK8Puppi:tau1",
0259     "NjettinessAK8Puppi:tau2",
0260     "NjettinessAK8Puppi:tau3",
0261     "NjettinessAK8Puppi:tau4"
0262   ]
0263 
0264   #
0265   # AK8 soft-drop jets
0266   #
0267   addJetCollection(
0268     process,
0269     labelName = "AK8PFPuppiSoftDrop",
0270     jetSource = cms.InputTag("ak8PFJetsPuppiSoftDrop"),
0271     btagDiscriminators = ["None"],
0272     pfCandidates = cms.InputTag(pfLabel),
0273     pvSource = cms.InputTag(pvLabel),
0274     svSource = cms.InputTag(svLabel),
0275     muSource = cms.InputTag(muLabel),
0276     elSource = cms.InputTag(elLabel),
0277     genJetCollection = cms.InputTag(genJetsAK8Collection),
0278     genParticles = cms.InputTag(gpLabel),
0279     jetCorrections = ("AK8PFPuppi", cms.vstring(["L2Relative", "L3Absolute"]), "None"),
0280     getJetMCFlavour = False # jet flavor disabled regardless if running on MC or data
0281   )
0282 
0283   #
0284   # Soft-drop subjets
0285   #
0286   addJetCollection(
0287     process,
0288     labelName = "AK8PFPuppiSoftDropSubjets",
0289     jetSource = cms.InputTag("ak8PFJetsPuppiSoftDrop", "SubJets"),
0290     algo = "ak",  # needed for subjet flavor clustering
0291     rParam = 0.8, # needed for subjet flavor clustering
0292     explicitJTA = True,  # needed for subjet b tagging
0293     svClustering = True, # needed for subjet b tagging
0294     pfCandidates = cms.InputTag(pfLabel),
0295     pvSource = cms.InputTag(pvLabel),
0296     svSource = cms.InputTag(svLabel),
0297     muSource = cms.InputTag(muLabel),
0298     elSource = cms.InputTag(elLabel),
0299     genJetCollection = cms.InputTag(genSubJetsForAK8Collection),
0300     genParticles = cms.InputTag(gpLabel),
0301     fatJets = cms.InputTag("ak8PFJetsPuppi"),               # needed for subjet flavor clustering
0302     groomedFatJets = cms.InputTag("ak8PFJetsPuppiSoftDrop"), # needed for subjet flavor clustering
0303     jetCorrections = ("AK4PFPuppi", cms.vstring(["L2Relative", "L3Absolute"]), "None"),
0304   )
0305   if hasattr(process,"patJetFlavourAssociationAK8PFPuppiSoftDropSubjets"):
0306     process.patJetFlavourAssociationAK8PFPuppiSoftDropSubjets.weights = cms.InputTag(puppiLabel)
0307 
0308   #=============================================
0309   #
0310   #
0311   #
0312   #=============================================
0313   #
0314   # add groomed ECFs and N-subjettiness to soft dropped pat::Jets for fat jets and subjets
0315   #
0316   process.load('RecoJets.JetProducers.ECF_cff')
0317 
0318   addToProcessAndTask('nb1AK8PuppiSoftDrop', process.ecfNbeta1.clone(
0319       src = cms.InputTag("ak8PFJetsPuppiSoftDrop"),
0320       srcWeights = puppiLabel,
0321       cuts = cms.vstring('', '', 'pt > 250')
0322     ),
0323     process, task
0324   )
0325   process.patJetsAK8PFPuppiSoftDrop.userData.userFloats.src += [
0326     'nb1AK8PuppiSoftDrop:ecfN2',
0327     'nb1AK8PuppiSoftDrop:ecfN3',
0328   ]
0329 
0330   addToProcessAndTask('nb2AK8PuppiSoftDrop', process.ecfNbeta2.clone(
0331       src = cms.InputTag("ak8PFJetsPuppiSoftDrop"),
0332       srcWeights = puppiLabel,
0333       cuts = cms.vstring('', '', 'pt > 250')
0334     ),
0335     process, task
0336   )
0337   process.patJetsAK8PFPuppiSoftDrop.userData.userFloats.src += [
0338     'nb2AK8PuppiSoftDrop:ecfN2',
0339     'nb2AK8PuppiSoftDrop:ecfN3',
0340   ]
0341 
0342   #
0343   # add groomed ECFs and N-subjettiness to soft drop subjets
0344   #
0345   addToProcessAndTask("nb1AK8PuppiSoftDropSubjets", process.ecfNbeta1.clone(
0346       src = cms.InputTag("ak8PFJetsPuppiSoftDrop", "SubJets"),
0347       srcWeights = puppiLabel,
0348     ),
0349     process, task
0350   )
0351 
0352   process.patJetsAK8PFPuppiSoftDropSubjets.userData.userFloats.src += [
0353     'nb1AK8PuppiSoftDropSubjets:ecfN2',
0354     'nb1AK8PuppiSoftDropSubjets:ecfN3'
0355   ]
0356 
0357   addToProcessAndTask("nb2AK8PuppiSoftDropSubjets", process.ecfNbeta2.clone(
0358       src = cms.InputTag("ak8PFJetsPuppiSoftDrop", "SubJets"),
0359       srcWeights = puppiLabel,
0360     ),
0361     process, task
0362   )
0363 
0364   process.patJetsAK8PFPuppiSoftDropSubjets.userData.userFloats.src += [
0365     'nb2AK8PuppiSoftDropSubjets:ecfN2',
0366     'nb2AK8PuppiSoftDropSubjets:ecfN3'
0367   ]
0368 
0369   addToProcessAndTask("NjettinessAK8Subjets", Njettiness.clone(
0370       src = cms.InputTag("ak8PFJetsPuppiSoftDrop", "SubJets"),
0371       srcWeights = puppiLabel
0372     ),
0373     process, task
0374   )
0375   process.patJetsAK8PFPuppiSoftDropSubjets.userData.userFloats.src += [
0376     "NjettinessAK8Subjets:tau1",
0377     "NjettinessAK8Subjets:tau2",
0378     "NjettinessAK8Subjets:tau3",
0379     "NjettinessAK8Subjets:tau4",
0380   ]
0381 
0382   addToProcessAndTask("slimmedJetsAK8PFPuppiSoftDropSubjetsNoDeepTags", cms.EDProducer("PATJetSlimmer",
0383       src = cms.InputTag("selectedPatJetsAK8PFPuppiSoftDropSubjets"),
0384       packedPFCandidates = cms.InputTag(pfLabel),
0385       dropJetVars = cms.string("1"),
0386       dropDaughters = cms.string("0"),
0387       rekeyDaughters = cms.string("0"),
0388       dropTrackRefs = cms.string("1"),
0389       dropSpecific = cms.string("1"),
0390       dropTagInfos = cms.string("1"),
0391       modifyJets = cms.bool(True),
0392       mixedDaughters = cms.bool(False),
0393       modifierConfig = cms.PSet( modifications = cms.VPSet() )
0394     ),
0395     process, task
0396   )
0397 
0398   updateJetCollection(
0399     process,
0400     labelName = "AK8PFPuppiSoftDropSubjets",
0401     postfix = 'SlimmedDeepFlavour',
0402     jetSource = cms.InputTag("slimmedJetsAK8PFPuppiSoftDropSubjetsNoDeepTags"),
0403     # updateJetCollection defaults to MiniAOD inputs but
0404     # here it is made explicit (as in training or MINIAOD redoing)
0405     pfCandidates = cms.InputTag(pfLabel),
0406     pvSource = cms.InputTag(pvLabel),
0407     svSource = cms.InputTag(svLabel),
0408     muSource = cms.InputTag(muLabel),
0409     elSource = cms.InputTag(elLabel),
0410     jetCorrections = ("AK4PFPuppi", cms.vstring(["L2Relative", "L3Absolute"]), "None"),
0411     printWarning = False,
0412     btagDiscriminators = btagDiscriminatorsAK8Subjets.names.value() if btagDiscriminatorsAK8Subjets is not None else ['None'],
0413   )
0414 
0415   ## Establish references between PATified fat jets and subjets using the BoostedJetMerger
0416   addToProcessAndTask("slimmedJetsAK8PFPuppiSoftDropPacked", cms.EDProducer("BoostedJetMerger",
0417       jetSrc    = cms.InputTag("selectedPatJetsAK8PFPuppiSoftDrop"),
0418       subjetSrc = cms.InputTag("selectedUpdatedPatJetsAK8PFPuppiSoftDropSubjetsSlimmedDeepFlavour")
0419     ),
0420     process, task
0421   )
0422 
0423   addToProcessAndTask("packedPatJetsAK8", cms.EDProducer("JetSubstructurePacker",
0424       jetSrc = cms.InputTag("selectedPatJetsAK8Puppi"),
0425       distMax = cms.double(0.8),
0426       algoTags = cms.VInputTag(
0427         cms.InputTag("slimmedJetsAK8PFPuppiSoftDropPacked")
0428       ),
0429       algoLabels = cms.vstring(
0430         'SoftDropPuppi'
0431       ),
0432       fixDaughters = cms.bool(False),
0433       packedPFCandidates = cms.InputTag(pfLabel),
0434     ),
0435     process, task
0436   )
0437 
0438   #=============================================
0439   #
0440   # Update the selectedPatJet collection.
0441   # This is where we setup
0442   # -  JEC
0443   # -  b-tagging discriminators
0444   #
0445   #=============================================
0446   from PhysicsTools.PatAlgos.slimming.slimmedJets_cfi import slimmedJetsAK8
0447   addToProcessAndTask("slimmedJetsAK8NoDeepTags", slimmedJetsAK8.clone(rekeyDaughters = "0"), process, task)
0448   # Reconfigure the slimmedAK8 jet information to keep
0449   process.slimmedJetsAK8NoDeepTags.dropDaughters = cms.string("pt < 170")
0450   process.slimmedJetsAK8NoDeepTags.dropSpecific = cms.string("pt < 170")
0451   process.slimmedJetsAK8NoDeepTags.dropTagInfos = cms.string("pt < 170")
0452 
0453   updateJetCollection(
0454     process,
0455     jetSource = cms.InputTag("slimmedJetsAK8NoDeepTags"),
0456     # updateJetCollection defaults to MiniAOD inputs but
0457     # here it is made explicit (as in training or MINIAOD redoing)
0458     pfCandidates = cms.InputTag(pfLabel),
0459     pvSource = cms.InputTag(pvLabel),
0460     svSource = cms.InputTag(svLabel),
0461     muSource = cms.InputTag(muLabel),
0462     elSource = cms.InputTag(elLabel),
0463     rParam = 0.8,
0464     jetCorrections = ('AK8PFPuppi', cms.vstring(["L2Relative", "L3Absolute"]), 'None'),
0465     btagDiscriminators = btagDiscriminatorsAK8.names.value() if btagDiscriminatorsAK8 is not None else ['None'],
0466     postfix = "SlimmedAK8DeepTags",
0467     printWarning = False
0468   )
0469 
0470   addToProcessAndTask("slimmedJetsAK8", process.selectedUpdatedPatJetsSlimmedAK8DeepTags.clone(), process, task)
0471   del process.selectedUpdatedPatJetsSlimmedAK8DeepTags
0472 
0473   ########################
0474   #
0475   # Modify JECs when processing real Data
0476   # Disable any MC-only features.
0477   #
0478   ########################
0479   if not(runOnMC):
0480     runOnData(process, names=["Jets"], outputModules = [])
0481 
0482   return process
0483