Skip to content

Commit b50e58e

Browse files
authored
Merge pull request #47800 from patinkaew/scouting_nano_dev_filter_15_0_2
[15_0_X] Backport of #47739 (Add filter to skip events without scouting objects in ScoutingNano for ScoutingPFMonitor dataset)
2 parents 5514c8d + c5b140f commit b50e58e

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

Configuration/PyReleaseValidation/python/relval_nano.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,7 @@ def subnext(self):
257257
steps['scoutingNANO_data14.0'] = merge([{'-s': 'NANO:@Scout'},
258258
steps['NANO_data14.0']])
259259

260-
# Process.options.TryToContinue = cms.untracked.vstring(\'ProductNotFound\') is needed here because some events in ScoutingPFMonitor in 2024 do not contain scouting objects.
261-
# This should be fixed in 2025 (https://its.cern.ch/jira/browse/CMSHLT-3331) so customise_commands won't be needed for 2025 workflow.
262-
steps['scoutingNANO_withPrompt_data14.0'] = merge([{'-s': 'NANO:@Prompt+@Scout',
263-
'--customise_commands': '"process.options.TryToContinue = cms.untracked.vstring(\'ProductNotFound\')"'},
260+
steps['scoutingNANO_withPrompt_data14.0'] = merge([{'-s': 'NANO:@Prompt+@ScoutMonitor'},
264261
steps['NANO_data14.0']])
265262

266263
# DPG custom NANO

PhysicsTools/NanoAOD/python/autoNANO.py

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ def expandNanoMapping(seqList, mapping, key):
3434
# Scouting nano
3535
'Scout' : {'sequence': 'PhysicsTools/NanoAOD/custom_run3scouting_cff.scoutingNanoSequence',
3636
'customize': 'PhysicsTools/NanoAOD/custom_run3scouting_cff.customiseScoutingNano'},
37+
'ScoutMonitor' : {'sequence': '@Scout',
38+
'customize': '@Scout+PhysicsTools/NanoAOD/custom_run3scouting_cff.customiseScoutingNanoForScoutingPFMonitor'},
3739
'ScoutFromMini' : {'sequence': '@Scout',
3840
'customize': '@Scout+PhysicsTools/NanoAOD/custom_run3scouting_cff.customiseScoutingNanoFromMini'},
3941
# JME nano

PhysicsTools/NanoAOD/python/custom_run3scouting_cff.py

+68-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import FWCore.ParameterSet.Config as cms
22
from PhysicsTools.NanoAOD.run3scouting_cff import *
3-
from L1Trigger.Configuration.L1TRawToDigi_cff import *
43
from EventFilter.L1TRawToDigi.gtStage2Digis_cfi import gtStage2Digis
54
from PhysicsTools.NanoAOD.triggerObjects_cff import l1bits
65
from PhysicsTools.NanoAOD.globals_cff import puTable
@@ -123,7 +122,7 @@ def prepareScoutingNanoTaskMC():
123122

124123
# Specific tasks which will be added to sequence during customization
125124
scoutingTriggerTask = prepareScoutingTriggerTask()
126-
scoutingTriggerSequence = cms.Sequence(L1TRawToDigi+cms.Sequence(scoutingTriggerTask))
125+
scoutingTriggerSequence = cms.Sequence(scoutingTriggerTask)
127126
scoutingNanoTaskMC = prepareScoutingNanoTaskMC()
128127

129128
def customiseScoutingNano(process):
@@ -147,17 +146,53 @@ def customiseScoutingNano(process):
147146
# these function are designed to be used with --customise flag in cmsDriver.py
148147
# e.g. --customise PhysicsTools/NanoAOD/python/custom_run3scouting_cff.addScoutingPFCandidate
149148

150-
# reconfigure for running with ScoutingPFMonitor/MiniAOD inputs alone
149+
# additional customisation for running with ScoutingPFMonitor/RAW inputs
151150
# should be used with default customiseScoutingNano
151+
# this is suitable when ScoutingPFMonitor/RAW is involved, e.g. RAW, RAW-MiniAOD two-file solution, full chain RAW-MiniAOD-NanoAOD
152+
# when running full chain RAW-MiniAOD-NanoAOD, this ensures that gtStage2Digis, gmtStage2Digis, and caloStage2Digis are run
153+
def customiseScoutingNanoForScoutingPFMonitor(process):
154+
process = skipEventsWithoutScouting(process)
155+
156+
# replace gtStage2DigisScouting with standard gtStage2Digis
157+
process.scoutingTriggerTask.remove(process.gtStage2DigisScouting)
158+
process.scoutingTriggerTask.add(process.gtStage2Digis)
159+
160+
# add gmtStage2Digis
161+
process.load("EventFilter.L1TRawToDigi.gmtStage2Digis_cfi")
162+
process.scoutingTriggerTask.add(process.gmtStage2Digis)
163+
164+
# add caloStage2Digis
165+
process.load("EventFilter.L1TRawToDigi.caloStage2Digis_cfi")
166+
process.scoutingTriggerTask.add(process.caloStage2Digis)
167+
168+
# replace l1bitsScouting with standard l1bits
169+
process.scoutingTriggerTask.remove(process.l1bitsScouting)
170+
process.scoutingTriggerTask.add(process.l1bits)
171+
172+
# change src for l1 objects
173+
process.l1MuScoutingTable.src = cms.InputTag("gmtStage2Digis", "Muon")
174+
process.l1EGScoutingTable.src = cms.InputTag("caloStage2Digis", "EGamma")
175+
process.l1TauScoutingTable.src = cms.InputTag("caloStage2Digis", "Tau")
176+
process.l1JetScoutingTable.src = cms.InputTag("caloStage2Digis", "Jet")
177+
process.l1EtSumScoutingTable.src = cms.InputTag("caloStage2Digis", "EtSum")
178+
179+
return process
180+
181+
# additional customisation for running with ScoutingPFMonitor/MiniAOD inputs alone
182+
# can also be used on MC input
183+
# should be used with default customiseScoutingNano and NOT with customiseScoutingNanoForScoutingPFMonitor
152184
def customiseScoutingNanoFromMini(process):
153-
# remove L1TRawToDigi
154-
process.scoutingTriggerSequence.remove(process.L1TRawToDigi)
185+
# when running on data, assume ScoutingPFMonitor/MiniAOD dataset as inputs
186+
runOnData = hasattr(process,"NANOAODSIMoutput") or hasattr(process,"NANOAODoutput")
187+
if runOnData:
188+
process = skipEventsWithoutScouting(process)
155189

156190
# remove gtStage2Digis since they are already run for Mini
157191
process.scoutingTriggerTask.remove(process.gtStage2DigisScouting)
158192

159-
# change src for l1 bits
160-
process.l1bitsScouting.src = cms.InputTag("gtStage2Digis")
193+
# replace l1bitsScouting with standard l1bits
194+
process.scoutingTriggerTask.remove(process.l1bitsScouting)
195+
process.scoutingTriggerTask.add(process.l1bits)
161196

162197
# change src for l1 objects
163198
process.l1MuScoutingTable.src = cms.InputTag("gmtStage2Digis", "Muon")
@@ -168,6 +203,32 @@ def customiseScoutingNanoFromMini(process):
168203

169204
return process
170205

206+
# skip events without scouting object products
207+
# this may be needed since for there are some events which do not contain scouting object products in 2022-24
208+
# this is fixed for 2025: https://its.cern.ch/jira/browse/CMSHLT-3331
209+
def skipEventsWithoutScouting(process):
210+
# if scouting paths are triggered, scouting objects will be reconstructed
211+
# so we select events passing scouting paths
212+
import HLTrigger.HLTfilters.hltHighLevel_cfi
213+
214+
process.scoutingTriggerPathFilter = HLTrigger.HLTfilters.hltHighLevel_cfi.hltHighLevel.clone(
215+
HLTPaths = cms.vstring("Dataset_ScoutingPFRun3")
216+
)
217+
218+
process.nanoSkim_step = cms.Path(process.scoutingTriggerPathFilter)
219+
process.schedule.extend([process.nanoSkim_step])
220+
221+
if hasattr(process, "NANOAODoutput"):
222+
process.NANOAODoutput.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring("nanoSkim_step"))
223+
224+
if hasattr(process, "NANOAODEDMoutput"):
225+
process.NANOEDMAODoutput.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring("nanoSkim_step"))
226+
227+
if hasattr(process, "write_NANOAOD"): # PromptReco
228+
process.write_NANOAOD.SelectEvents = cms.untracked.PSet(SelectEvents = cms.vstring("nanoSkim_step"))
229+
230+
return process
231+
171232
def addScoutingTrack(process):
172233
process.scoutingNanoSequence.associate(cms.Task(scoutingTrackTable))
173234
return process

0 commit comments

Comments
 (0)