Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-06-06 01:33:32

0001 import FWCore.ParameterSet.Config as cms
0002 from PhysicsTools.NanoAOD.common_cff import *
0003 from PhysicsTools.NanoAOD.nano_eras_cff import *
0004 from PhysicsTools.NanoAOD.jetsAK4_CHS_cff import *
0005 from PhysicsTools.NanoAOD.jetsAK4_Puppi_cff import *
0006 from PhysicsTools.NanoAOD.jetsAK8_cff import *
0007 from PhysicsTools.NanoAOD.jetMC_cff import *
0008 from PhysicsTools.NanoAOD.jetConstituents_cff import *
0009 from PhysicsTools.NanoAOD.muons_cff import *
0010 from PhysicsTools.NanoAOD.taus_cff import *
0011 from PhysicsTools.NanoAOD.boostedTaus_cff import *
0012 from PhysicsTools.NanoAOD.electrons_cff import *
0013 from PhysicsTools.NanoAOD.lowPtElectrons_cff import *
0014 from PhysicsTools.NanoAOD.photons_cff import *
0015 from PhysicsTools.NanoAOD.globals_cff import *
0016 from PhysicsTools.NanoAOD.extraflags_cff import *
0017 from PhysicsTools.NanoAOD.ttbarCategorization_cff import *
0018 from PhysicsTools.NanoAOD.genparticles_cff import *
0019 from PhysicsTools.NanoAOD.particlelevel_cff import *
0020 from PhysicsTools.NanoAOD.genWeightsTable_cfi import *
0021 from PhysicsTools.NanoAOD.tauSpinnerTable_cfi import *
0022 from PhysicsTools.NanoAOD.genVertex_cff import *
0023 from PhysicsTools.NanoAOD.vertices_cff import *
0024 from PhysicsTools.NanoAOD.met_cff import *
0025 from PhysicsTools.NanoAOD.triggerObjects_cff import *
0026 from PhysicsTools.NanoAOD.isotracks_cff import *
0027 from PhysicsTools.NanoAOD.protons_cff import *
0028 from PhysicsTools.NanoAOD.NanoAODEDMEventContent_cff import *
0029 from PhysicsTools.NanoAOD.fsrPhotons_cff import *
0030 from PhysicsTools.NanoAOD.softActivity_cff import *
0031 
0032 nanoMetadata = cms.EDProducer("UniqueStringProducer",
0033     strings = cms.PSet(
0034         tag = cms.string("untagged"),
0035     )
0036 )
0037 
0038 linkedObjects = cms.EDProducer("PATObjectCrossLinker",
0039    jets=cms.InputTag("finalJetsPuppi"),
0040    muons=cms.InputTag("finalMuons"),
0041    electrons=cms.InputTag("finalElectrons"),
0042    lowPtElectrons=cms.InputTag("finalLowPtElectrons"),
0043    taus=cms.InputTag("finalTaus"),
0044    boostedTaus=cms.InputTag("finalBoostedTaus"),
0045    photons=cms.InputTag("finalPhotons"),
0046    vertices=cms.InputTag("slimmedSecondaryVertices")
0047 )
0048 
0049 from PhysicsTools.NanoAOD.lhcInfoProducer_cfi import lhcInfoProducer
0050 lhcInfoTable = lhcInfoProducer.clone()
0051 (~run3_common).toModify(
0052     lhcInfoTable, useNewLHCInfo=False
0053 )
0054 
0055 nanoTableTaskCommon = cms.Task(
0056     cms.Task(nanoMetadata),
0057     jetPuppiTask, jetPuppiForMETTask, jetAK8Task, jetConstituentsTask,
0058     extraFlagsProducersTask, muonTask, tauTask, boostedTauTask,
0059     electronTask , lowPtElectronTask, photonTask,
0060     vertexTask, isoTrackTask, jetAK8LepTask,  # must be after all the leptons
0061     softActivityTask,
0062     cms.Task(linkedObjects),
0063     jetPuppiTablesTask, jetAK8TablesTask, jetConstituentsTablesTask,
0064     muonTablesTask, fsrTablesTask, tauTablesTask, boostedTauTablesTask,
0065     electronTablesTask, lowPtElectronTablesTask, photonTablesTask,
0066     globalTablesTask, vertexTablesTask, metTablesTask, extraFlagsTableTask,
0067     isoTrackTablesTask,softActivityTablesTask
0068 )
0069 
0070 (run2_muon | run2_egamma).toReplaceWith(
0071     nanoTableTaskCommon,
0072     nanoTableTaskCommon.copyAndAdd(chsJetUpdateTask)
0073 )
0074 
0075 nanoSequenceCommon = cms.Sequence(nanoTableTaskCommon)
0076 
0077 nanoSequenceOnlyFullSim = cms.Sequence(triggerObjectTablesTask)
0078 nanoSequenceOnlyData = cms.Sequence(cms.Sequence(protonTablesTask) + lhcInfoTable)
0079 
0080 nanoSequence = cms.Sequence(nanoSequenceCommon + nanoSequenceOnlyData + nanoSequenceOnlyFullSim)
0081 
0082 nanoTableTaskFS = cms.Task(
0083     genParticleTask, particleLevelTask, jetMCTask, muonMCTask, electronMCTask, lowPtElectronMCTask, photonMCTask,
0084     tauMCTask, boostedTauMCTask,
0085     metMCTable, ttbarCatMCProducersTask, globalTablesMCTask, ttbarCategoryTableTask,
0086     genWeightsTableTask, genVertexTablesTask, genParticleTablesTask, genProtonTablesTask, particleLevelTablesTask, tauSpinnerTableTask
0087 )
0088 
0089 nanoSequenceFS = cms.Sequence(nanoSequenceCommon + cms.Sequence(nanoTableTaskFS))
0090 
0091 # GenVertex only stored in newer MiniAOD
0092 nanoSequenceMC = nanoSequenceFS.copy()
0093 nanoSequenceMC.insert(nanoSequenceFS.index(nanoSequenceCommon)+1,nanoSequenceOnlyFullSim)
0094 
0095 
0096 def _fixPNetInputCollection(process):
0097     # fix circular module dependency in ParticleNetFromMiniAOD TagInfos when slimmedTaus is updated
0098     if hasattr(process, 'slimmedTaus'):
0099         for mod in process.producers.keys():
0100             if 'ParticleNetFromMiniAOD' in mod and 'TagInfos' in mod:
0101                 getattr(process, mod).taus = 'slimmedTaus::@skipCurrentProcess'
0102 
0103 
0104 # modifier which adds new tauIDs
0105 import RecoTauTag.RecoTau.tools.runTauIdMVA as tauIdConfig
0106 def nanoAOD_addTauIds(process, idsToRun=[], addPNetCHS=False, addUParTPuppi=False):
0107     originalTauName = 'slimmedTaus::@skipCurrentProcess'
0108     updatedTauName = None
0109 
0110     if idsToRun:  # no-empty list of tauIDs to run
0111         updatedTauName = 'slimmedTausUpdated'
0112         tauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False,
0113                                                   originalTauName=originalTauName,
0114                                                   updatedTauName=updatedTauName,
0115                                                   postfix="ForNano",
0116                                                   toKeep=idsToRun)
0117         tauIdEmbedder.runTauID()
0118         process.tauTask.add(process.rerunMvaIsolationTaskForNano, getattr(process, updatedTauName))
0119         originalTauName = updatedTauName
0120 
0121     from PhysicsTools.PatAlgos.patTauHybridProducer_cfi import patTauHybridProducer
0122     if addPNetCHS:
0123         jetCollection = "updatedJets"
0124         TagName = "pfParticleNetFromMiniAODAK4CHSCentralJetTags"
0125         tag_prefix = "byUTagCHS"
0126         updatedTauName = originalTauName.split(':')[0] + 'WithPNetCHS'
0127         # PNet tagger used for CHS jets
0128         from RecoBTag.ONNXRuntime.pfParticleNetFromMiniAODAK4_cff import pfParticleNetFromMiniAODAK4CHSCentralJetTags
0129         Discriminators = [TagName + ":" + tag for tag in pfParticleNetFromMiniAODAK4CHSCentralJetTags.flav_names.value()]
0130 
0131         # Define "hybridTau" producer
0132         setattr(process, updatedTauName, patTauHybridProducer.clone(
0133             src=originalTauName,
0134             jetSource=jetCollection,
0135             dRMax=0.4,
0136             jetPtMin=15,
0137             jetEtaMax=2.5,
0138             UTagLabel=TagName,
0139             UTagScoreNames=Discriminators,
0140             tagPrefix=tag_prefix,
0141             tauScoreMin=-1,
0142             vsJetMin=0.05,
0143             checkTauScoreIsBest=False,
0144             chargeAssignmentProbMin=0.2,
0145             addGenJetMatch=False,
0146             genJetMatch=""
0147         ))
0148         process.tauTask.add(process.chsJetUpdateTask, getattr(process, updatedTauName))
0149         originalTauName = updatedTauName
0150 
0151     if addUParTPuppi:
0152         jetCollection = "updatedJetsPuppi"
0153         TagName = "pfUnifiedParticleTransformerAK4JetTags"
0154         tag_prefix = "byUTagPUPPI"
0155         updatedTauName = originalTauName.split(':')[0] + 'WithUParTPuppi'
0156         # Unified ParT Tagger used for PUPPI jets
0157         from RecoBTag.ONNXRuntime.pfUnifiedParticleTransformerAK4JetTags_cfi import pfUnifiedParticleTransformerAK4JetTags
0158         Discriminators = [TagName + ":" + tag for tag in pfUnifiedParticleTransformerAK4JetTags.flav_names.value()]
0159 
0160         # Define "hybridTau" producer
0161         setattr(process, updatedTauName, patTauHybridProducer.clone(
0162             src=originalTauName,
0163             jetSource=jetCollection,
0164             dRMax=0.4,
0165             jetPtMin=15,
0166             jetEtaMax=2.5,
0167             UTagLabel=TagName,
0168             UTagScoreNames=Discriminators,
0169             tagPrefix=tag_prefix,
0170             tauScoreMin=-1,
0171             vsJetMin=0.05,
0172             checkTauScoreIsBest=False,
0173             chargeAssignmentProbMin=0.2,
0174             addGenJetMatch=False,
0175             genJetMatch=""
0176         ))
0177         process.tauTask.add(getattr(process, updatedTauName))
0178         originalTauName = updatedTauName
0179 
0180     if updatedTauName is not None:
0181         process.slimmedTaus = getattr(process, updatedTauName).clone()
0182         process.tauTask.replace(getattr(process, updatedTauName), process.slimmedTaus)
0183         delattr(process, updatedTauName)
0184         _fixPNetInputCollection(process)
0185 
0186     return process
0187 
0188 
0189 def nanoAOD_addBoostedTauIds(process, idsToRun=[]):
0190     if idsToRun:  # no-empty list of tauIDs to run
0191         boostedTauIdEmbedder = tauIdConfig.TauIDEmbedder(process, debug=False,
0192                                                          originalTauName="slimmedTausBoosted::@skipCurrentProcess",
0193                                                          updatedTauName="slimmedTausBoostedNewID",
0194                                                          postfix="BoostedForNano",
0195                                                          toKeep=idsToRun)
0196         boostedTauIdEmbedder.runTauID()
0197 
0198         process.slimmedTausBoosted = process.slimmedTausBoostedNewID.clone()
0199         del process.slimmedTausBoostedNewID
0200         process.boostedTauTask.add(process.rerunMvaIsolationTaskBoostedForNano, process.slimmedTausBoosted)
0201 
0202     return process
0203 
0204 
0205 from PhysicsTools.SelectorUtils.tools.vid_id_tools import *
0206 def nanoAOD_activateVID(process):
0207 
0208     switchOnVIDElectronIdProducer(process, DataFormat.MiniAOD, electronTask)
0209     for modname in electron_id_modules_WorkingPoints_nanoAOD.modules:
0210         setupAllVIDIdsInModule(process, modname, setupVIDElectronSelection)
0211 
0212     process.electronTask.add(process.egmGsfElectronIDTask)
0213 
0214     # do not call this to avoid resetting photon IDs in VID, if called before inside makePuppiesFromMiniAOD
0215     switchOnVIDPhotonIdProducer(process, DataFormat.MiniAOD, photonTask)
0216     for modname in photon_id_modules_WorkingPoints_nanoAOD.modules:
0217         setupAllVIDIdsInModule(process, modname, setupVIDPhotonSelection)
0218 
0219     process.photonTask.add(process.egmPhotonIDTask)
0220 
0221     return process
0222 
0223 
0224 def nanoAOD_customizeCommon(process):
0225 
0226     process = nanoAOD_activateVID(process)
0227 
0228     nanoAOD_rePuppi_switch = cms.PSet(
0229         useExistingWeights=cms.bool(False),
0230         reclusterAK4MET=cms.bool(False),
0231         reclusterAK8=cms.bool(False),
0232     )
0233 
0234     # recompute Puppi weights, and remake AK4, AK8 Puppi jets and PuppiMET
0235     (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X | nanoAOD_rePuppi).toModify(
0236         nanoAOD_rePuppi_switch, useExistingWeights=False, reclusterAK4MET=True, reclusterAK8=True
0237     )
0238 
0239     runOnMC = True
0240     if hasattr(process, "NANOEDMAODoutput") or hasattr(process, "NANOAODoutput"):
0241         runOnMC = False
0242     from PhysicsTools.PatAlgos.tools.puppiJetMETReclusteringFromMiniAOD_cff import puppiJetMETReclusterFromMiniAOD
0243     puppiJetMETReclusterFromMiniAOD(process,
0244                                     runOnMC=runOnMC,
0245                                     useExistingWeights=nanoAOD_rePuppi_switch.useExistingWeights.value(),
0246                                     reclusterAK4MET=nanoAOD_rePuppi_switch.reclusterAK4MET.value(),
0247                                     reclusterAK8=nanoAOD_rePuppi_switch.reclusterAK8.value(),
0248                                     )
0249 
0250     # This function is defined in jetsAK4_Puppi_cff.py
0251     process = nanoAOD_addDeepInfoAK4(process,
0252                                      addParticleNet=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addParticleNet_switch,
0253                                      addRobustParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addRobustParTAK4Tag_switch,
0254                                      addUnifiedParTAK4=nanoAOD_addDeepInfoAK4_switch.nanoAOD_addUnifiedParTAK4Tag_switch
0255                                      )
0256 
0257     # Needs to run PNet on CHS jets to update the tau collections
0258     run2_nanoAOD_106Xv2.toModify(
0259         nanoAOD_addDeepInfoAK4CHS_switch, nanoAOD_addParticleNet_switch=True,
0260     )
0261     # This function is defined in jetsAK4_CHS_cff.py
0262     process = nanoAOD_addDeepInfoAK4CHS(
0263         process, addDeepBTag=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepBTag_switch,
0264         addDeepFlavour=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addDeepFlavourTag_switch,
0265         addParticleNet=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addParticleNet_switch,
0266         addRobustParTAK4=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addRobustParTAK4Tag_switch,
0267         addUnifiedParTAK4=nanoAOD_addDeepInfoAK4CHS_switch.nanoAOD_addUnifiedParTAK4Tag_switch)
0268 
0269     # This function is defined in jetsAK8_cff.py
0270     process = nanoAOD_addDeepInfoAK8(
0271         process, addDeepBTag=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBTag_switch,
0272         addDeepBoostedJet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepBoostedJet_switch,
0273         addDeepDoubleX=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleX_switch,
0274         addDeepDoubleXV2=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addDeepDoubleXV2_switch,
0275         addParticleNetMassLegacy=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetMassLegacy_switch,
0276         addParticleNetLegacy=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNetLegacy_switch,
0277         addParticleNet=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addParticleNet_switch,
0278         addGlobalParT=nanoAOD_addDeepInfoAK8_switch.nanoAOD_addGlobalParT_switch,
0279         jecPayload=nanoAOD_addDeepInfoAK8_switch.jecPayload)
0280 
0281     nanoAOD_tau_switch = cms.PSet(
0282         idsToAdd=cms.vstring(),
0283         addPNetCHS=cms.bool(False),
0284         addUParTPuppi=cms.bool(False)
0285     )
0286     (run2_nanoAOD_106Xv2).toModify(
0287         nanoAOD_tau_switch, idsToAdd=["deepTau2018v2p5"]
0288     )
0289     (run2_nanoAOD_106Xv2 | run3_nanoAOD_pre142X).toModify(
0290         nanoAOD_tau_switch, addPNetCHS=True, addUParTPuppi=True,
0291     )
0292     nanoAOD_addTauIds(process,
0293                       idsToRun=nanoAOD_tau_switch.idsToAdd.value(),
0294                       addPNetCHS=nanoAOD_tau_switch.addPNetCHS.value(),
0295                       addUParTPuppi=nanoAOD_tau_switch.addUParTPuppi.value(),
0296                       )
0297 
0298     nanoAOD_boostedTau_switch = cms.PSet(
0299         idsToAdd=cms.vstring()
0300     )
0301     run2_nanoAOD_106Xv2.toModify(
0302         nanoAOD_boostedTau_switch,
0303         idsToAdd=["mvaIso", "mvaIsoNewDM", "mvaIsoDR0p3", "againstEle", "boostedDeepTauRunIIv2p0"])
0304     run3_nanoAOD_pre142X.toModify(
0305         nanoAOD_boostedTau_switch, idsToAdd=["boostedDeepTauRunIIv2p0"]
0306     )
0307     nanoAOD_addBoostedTauIds(process, nanoAOD_boostedTau_switch.idsToAdd.value())
0308 
0309     # Add lepton time-life info
0310     from PhysicsTools.NanoAOD.leptonTimeLifeInfo_common_cff import addTimeLifeInfoBase
0311     process = addTimeLifeInfoBase(process)
0312 
0313     return process
0314 
0315 ###increasing the precision of selected GenParticles.
0316 def nanoWmassGenCustomize(process):
0317     pdgSelection="?(abs(pdgId) == 11|| abs(pdgId)==13 || abs(pdgId)==15 ||abs(pdgId)== 12 || abs(pdgId)== 14 || abs(pdgId)== 16|| abs(pdgId)== 24|| pdgId== 23)"
0318     # Keep precision same as default RECO for selected particles
0319     ptPrecision="{}?{}:{}".format(pdgSelection, CandVars.pt.precision.value(),genParticleTable.variables.pt.precision.value())
0320     process.genParticleTable.variables.pt.precision=cms.string(ptPrecision)
0321     phiPrecision="{} ? {} : {}".format(pdgSelection, CandVars.phi.precision.value(), genParticleTable.variables.phi.precision.value())
0322     process.genParticleTable.variables.phi.precision=cms.string(phiPrecision)
0323     etaPrecision="{} ? {} : {}".format(pdgSelection, CandVars.eta.precision.value(), genParticleTable.variables.eta.precision.value())
0324     process.genParticleTable.variables.eta.precision=cms.string(etaPrecision)
0325     return process
0326