Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-10-16 05:06:29

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