Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-12-19 04:04:48

0001 import FWCore.ParameterSet.Config as cms
0002 from PhysicsTools.NanoAOD.run3scouting_cff import *
0003 from L1Trigger.Configuration.L1TRawToDigi_cff import *
0004 from EventFilter.L1TRawToDigi.gtStage2Digis_cfi import gtStage2Digis
0005 from PhysicsTools.NanoAOD.triggerObjects_cff import l1bits
0006 from PhysicsTools.NanoAOD.globals_cff import puTable
0007 
0008 ############################
0009 ### Sub Task Definitions ###
0010 ############################
0011 
0012 # Task contains all dependent tasks
0013 # ExtensionTask must be run on top of another Task
0014 
0015 #############################
0016 # Scouting Original Objects #
0017 #############################
0018 
0019 # Scouting Muon
0020 scoutingMuonTableTask = cms.Task(scoutingMuonTable)
0021 scoutingMuonDisplacedVertexTableTask = cms.Task(scoutingMuonDisplacedVertexTable)
0022 
0023 # from 2024, there are two muon collections
0024 from Configuration.Eras.Modifier_run3_scouting_nanoAOD_post2023_cff import run3_scouting_nanoAOD_post2023
0025 run3_scouting_nanoAOD_post2023.toReplaceWith(scoutingMuonTableTask, cms.Task(scoutingMuonVtxTable, scoutingMuonNoVtxTable))\
0026     .toReplaceWith(scoutingMuonDisplacedVertexTableTask, cms.Task(scoutingMuonVtxDisplacedVertexTable, scoutingMuonNoVtxDisplacedVertexTable))
0027 
0028 # other collections are directly from original Run3Scouting objects, so unnessary to define tasks
0029 
0030 ############################
0031 # Scouting Derived Objects #
0032 ############################
0033 
0034 scoutingPFCandidateTask = cms.Task(scoutingPFCandidate, scoutingPFCandidateTable)
0035 scoutingPFJetReclusterTask = cms.Task(
0036     scoutingPFCandidate, # translate to reco::PFCandidate, used as input
0037     scoutingPFJetRecluster, # jet clustering
0038     scoutingPFJetReclusterParticleNetJetTagInfos, scoutingPFJetReclusterParticleNetJetTags, # jet tagging
0039     scoutingPFJetReclusterTable
0040 )
0041 scoutingPFJetReclusterMatchGenExtensionTask = cms.Task(
0042     scoutingPFJetReclusterMatchGen, # gen jet matching
0043     scoutingPFJetReclusterMatchGenExtensionTable
0044 )
0045 
0046 scoutingFatPFJetReclusterTask = cms.Task(
0047     scoutingPFCandidate, # translate to reco::PFCandidate, used as input
0048     scoutingFatPFJetRecluster, # jet clustering
0049     scoutingFatPFJetReclusterParticleNetJetTagInfos, scoutingFatPFJetReclusterParticleNetJetTags, # jet tagging
0050     scoutingFatPFJetReclusterSoftDrop, scoutingFatPFJetReclusterSoftDropMass, # softdrop mass
0051     scoutingFatPFJetReclusterParticleNetJetTagInfos, scoutingFatPFJetReclusterParticleNetMassRegressionJetTags, # regressed mass
0052     scoutingFatPFJetReclusterEcfNbeta1, scoutingFatPFJetReclusterNjettiness, # substructure variables
0053     scoutingFatPFJetReclusterTable
0054 )
0055 scoutingFatPFJetReclusterMatchGenExtensionTask = cms.Task(
0056     scoutingFatPFJetReclusterMatchGen, # gen jet matching
0057     scoutingFatPFJetReclusterMatchGenExtensionTable
0058 )
0059 
0060 ############################
0061 # Trigger Bits and Objects #
0062 ############################
0063 
0064 ## L1 decisions
0065 gtStage2DigisScouting = gtStage2Digis.clone(InputLabel="hltFEDSelectorL1")
0066 l1bitsScouting = l1bits.clone(src="gtStage2DigisScouting") 
0067 
0068 ## L1 objects
0069 from PhysicsTools.NanoAOD.l1trig_cff import *
0070 l1MuScoutingTable = l1MuTable.clone(src=cms.InputTag("gtStage2DigisScouting", "Muon"))
0071 l1EGScoutingTable = l1EGTable.clone(src=cms.InputTag("gtStage2DigisScouting", "EGamma"))
0072 l1TauScoutingTable = l1TauTable.clone(src=cms.InputTag("gtStage2DigisScouting", "Tau"))
0073 l1JetScoutingTable = l1JetTable.clone(src=cms.InputTag("gtStage2DigisScouting", "Jet"))
0074 l1EtSumScoutingTable = l1EtSumTable.clone(src=cms.InputTag("gtStage2DigisScouting", "EtSum"))
0075 
0076 # reduce the variables to the core variables as only these are available in gtStage2Digis
0077 l1MuScoutingTable.variables = cms.PSet(l1MuonReducedVars)
0078 l1EGScoutingTable.variables = cms.PSet(l1EGReducedVars)
0079 l1TauScoutingTable.variables = cms.PSet(l1TauReducedVars)
0080 l1JetScoutingTable.variables = cms.PSet(l1JetReducedVars)
0081 l1EtSumScoutingTable.variables = cms.PSet(l1EtSumReducedVars)
0082 
0083 ##############################
0084 ### Main Tasks Definitions ###
0085 ##############################
0086 
0087 # default configuration for ScoutingNano common for both data and MC
0088 def prepareScoutingNanoTaskCommon():
0089     # Scouting original objects
0090     # all scouting objects are saved except PF Candidate and Track
0091     scoutingNanoTaskCommon = cms.Task()
0092     scoutingNanoTaskCommon.add(scoutingMuonTableTask, scoutingMuonDisplacedVertexTableTask)
0093     scoutingNanoTaskCommon.add(scoutingElectronTable)
0094     scoutingNanoTaskCommon.add(scoutingPhotonTable)
0095     scoutingNanoTaskCommon.add(scoutingPrimaryVertexTable)
0096     scoutingNanoTaskCommon.add(scoutingPFJetTable)
0097     scoutingNanoTaskCommon.add(scoutingMETTable, scoutingRhoTable)
0098     
0099     # Scouting derived objects
0100     scoutingNanoTaskCommon.add(scoutingPFJetReclusterTask)
0101     scoutingNanoTaskCommon.add(scoutingFatPFJetReclusterTask)
0102 
0103     return scoutingNanoTaskCommon
0104 
0105 # tasks related to trigger bits and objects
0106 def prepareScoutingTriggerTask():
0107     scoutingTriggerTask = cms.Task(gtStage2DigisScouting, l1bitsScouting)
0108     scoutingTriggerTask.add(cms.Task(l1MuScoutingTable, l1EGScoutingTable, l1TauScoutingTable, l1JetScoutingTable, l1EtSumScoutingTable))
0109     return scoutingTriggerTask
0110 
0111 # additional tasks for running on MC
0112 def prepareScoutingNanoTaskMC():
0113     scoutingNanoTaskMC = cms.Task()
0114     scoutingNanoTaskMC.add(scoutingPFJetReclusterMatchGenExtensionTask)
0115     scoutingNanoTaskMC.add(scoutingFatPFJetReclusterMatchGenExtensionTask)
0116 
0117     scoutingNanoTaskMC.add(puTable)
0118     return scoutingNanoTaskMC
0119 
0120 # Common tasks added to main scoutingNanoSequence
0121 scoutingNanoTaskCommon = prepareScoutingNanoTaskCommon()
0122 scoutingNanoSequence = cms.Sequence(scoutingNanoTaskCommon)
0123 
0124 # Specific tasks which will be added to sequence during customization
0125 scoutingTriggerTask = prepareScoutingTriggerTask()
0126 scoutingTriggerSequence = cms.Sequence(L1TRawToDigi+cms.Sequence(scoutingTriggerTask))
0127 scoutingNanoTaskMC = prepareScoutingNanoTaskMC()
0128 
0129 def customiseScoutingNano(process):
0130     # if running with standard NanoAOD, triggerSequence is already added
0131     # if running standalone, triggerSequence need to be added
0132     if not ((hasattr(process, "nanoSequence") and process.schedule.contains(process.nanoSequence))
0133             or hasattr(process, "nanoSequenceMC") and process.schedule.contains(process.nanoSequenceMC)):
0134         process.trigger_step = cms.Path(process.scoutingTriggerSequence)
0135         process.schedule.extend([process.trigger_step])
0136 
0137     # specific tasks when running on MC
0138     runOnMC = hasattr(process,"NANOEDMAODSIMoutput") or hasattr(process,"NANOAODSIMoutput")
0139     if runOnMC:
0140         process.scoutingNanoSequence.associate(scoutingNanoTaskMC)
0141     
0142     return process
0143 
0144 #####################
0145 ### Customisation ###
0146 #####################
0147 # these function are designed to be used with --customise flag in cmsDriver.py
0148 # e.g. --customise PhysicsTools/NanoAOD/python/custom_run3scouting_cff.addScoutingPFCandidate
0149 
0150 # reconfigure for running with ScoutingPFMonitor/MiniAOD inputs alone
0151 # should be used with default customiseScoutingNano
0152 def customiseScoutingNanoFromMini(process):
0153     # remove L1TRawToDigi
0154     process.scoutingTriggerSequence.remove(process.L1TRawToDigi)
0155 
0156     # remove gtStage2Digis since they are already run for Mini
0157     process.scoutingTriggerTask.remove(process.gtStage2DigisScouting)
0158 
0159     # change src for l1 bits
0160     process.l1bitsScouting.src = cms.InputTag("gtStage2Digis")
0161 
0162     # change src for l1 objects
0163     process.l1MuScoutingTable.src = cms.InputTag("gmtStage2Digis", "Muon")
0164     process.l1EGScoutingTable.src = cms.InputTag("caloStage2Digis", "EGamma")
0165     process.l1TauScoutingTable.src = cms.InputTag("caloStage2Digis", "Tau")
0166     process.l1JetScoutingTable.src = cms.InputTag("caloStage2Digis", "Jet")
0167     process.l1EtSumScoutingTable.src = cms.InputTag("caloStage2Digis", "EtSum")
0168 
0169     return process
0170 
0171 def addScoutingTrack(process):
0172     process.scoutingNanoSequence.associate(cms.Task(scoutingTrackTable))
0173     return process
0174 
0175 def addScoutingParticle(process):
0176     # original PF candidate without post-processing
0177     process.scoutingNanoSequence.associate(cms.Task(scoutingParticleTable))
0178     return process
0179 
0180 def addScoutingPFCandidate(process):
0181     # PF candidate after translation to reco::PFCandidate
0182     process.scoutingNanoSequence.associate(scoutingPFCandidateTask)
0183     return process