diff --git a/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_MLM_5f_max4j_LHE_pythia8_cff.py b/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_MLM_5f_max4j_LHE_pythia8_cff.py index 3c71590a6d19d..c14b48312c6e1 100644 --- a/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_MLM_5f_max4j_LHE_pythia8_cff.py +++ b/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_MLM_5f_max4j_LHE_pythia8_cff.py @@ -3,6 +3,7 @@ from Configuration.Generator.Pythia8CommonSettings_cfi import * from Configuration.Generator.MCTunes2017.PythiaCP5Settings_cfi import * +from Configuration.Generator.PSweightsPythia.PythiaPSweightsSettings_cfi import * generator = cms.EDFilter("Pythia8ConcurrentHadronizerFilter", maxEventsToPrint = cms.untracked.int32(1), @@ -13,6 +14,7 @@ PythiaParameters = cms.PSet( pythia8CommonSettingsBlock, pythia8CP5SettingsBlock, + pythia8PSweightsSettingsBlock, JetMatchingParameters = cms.vstring( 'JetMatching:setMad = off', 'JetMatching:scheme = 1', @@ -28,6 +30,7 @@ ), parameterSets = cms.vstring('pythia8CommonSettings', 'pythia8CP5Settings', + 'pythia8PSweightsSettings', 'JetMatchingParameters' ) diff --git a/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_powhegEmissionVeto2p_pythia8_cff.py b/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_powhegEmissionVeto2p_pythia8_cff.py index 36492389bbf99..020c25e857e2a 100644 --- a/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_powhegEmissionVeto2p_pythia8_cff.py +++ b/Configuration/Generator/python/Hadronizer_TuneCP5_13TeV_powhegEmissionVeto2p_pythia8_cff.py @@ -2,6 +2,7 @@ from Configuration.Generator.Pythia8CommonSettings_cfi import * from Configuration.Generator.MCTunes2017.PythiaCP5Settings_cfi import * from Configuration.Generator.Pythia8PowhegEmissionVetoSettings_cfi import * +from Configuration.Generator.PSweightsPythia.PythiaPSweightsSettings_cfi import * generator = cms.EDFilter("Pythia8ConcurrentHadronizerFilter", maxEventsToPrint = cms.untracked.int32(1), @@ -12,6 +13,7 @@ PythiaParameters = cms.PSet( pythia8CommonSettingsBlock, pythia8CP5SettingsBlock, + pythia8PSweightsSettingsBlock, pythia8PowhegEmissionVetoSettingsBlock, processParameters = cms.vstring( 'POWHEG:nFinal = 2', ## Number of final state particles @@ -21,6 +23,7 @@ ), parameterSets = cms.vstring('pythia8CommonSettings', 'pythia8CP5Settings', + 'pythia8PSweightsSettings', 'pythia8PowhegEmissionVetoSettings', 'processParameters' ) diff --git a/Configuration/PyReleaseValidation/python/relval_generator.py b/Configuration/PyReleaseValidation/python/relval_generator.py index 2ff02c90f5e43..27c92c690d119 100644 --- a/Configuration/PyReleaseValidation/python/relval_generator.py +++ b/Configuration/PyReleaseValidation/python/relval_generator.py @@ -40,3 +40,6 @@ workflows[545]=['',['BsToMuMu_forSTEAM_13TeV','HARVESTGEN']] # Miscellaneous +workflows[546]=['',['DYToLL_M-50_13TeV_pythia8','NANOGENFromGen']] +workflows[547]=['',['DYToll01234Jets_5f_LO_MLM_Madgraph_LHE_13TeV','Hadronizer_TuneCP5_13TeV_MLM_5f_max4j_LHE_pythia8','NANOGENFromGen']] +workflows[548]=['',['TTbar_Pow_LHE_13TeV','Hadronizer_TuneCP5_13TeV_powhegEmissionVeto2p_pythia8','NANOGENFromGen']] diff --git a/Configuration/PyReleaseValidation/python/relval_steps.py b/Configuration/PyReleaseValidation/python/relval_steps.py index 177a00c628ab7..90f316fbb5b69 100644 --- a/Configuration/PyReleaseValidation/python/relval_steps.py +++ b/Configuration/PyReleaseValidation/python/relval_steps.py @@ -3059,11 +3059,16 @@ def gen2021HiMix(fragment,howMuch): steps['MINIAODMCUP18ml'] =merge([concurrentLumis,steps['MINIAODMCUP18']]) stepNanoAODDefaults = { '-s': 'NANO,DQM:@nanoAODDQM', '-n': 1000 } +stepNanoGenDefaults = { '-s': 'NANOGEN,DQM:@nanogenDQM', '-n': 1000 } stepNanoAODData = merge([{ '--data':'', '--eventcontent' : 'NANOAOD,DQM' ,'--datatier': 'NANOAOD,DQMIO' }, stepNanoAODDefaults ]) stepNanoAODMC = merge([{ '--mc':'' , '--eventcontent' : 'NANOAODSIM,DQM','--datatier': 'NANOAODSIM,DQMIO' }, stepNanoAODDefaults ]) stepNanoEDMData = merge([{ '--data':'', '--eventcontent' : 'NANOEDMAOD,DQM' ,'--datatier': 'NANOAOD,DQMIO' }, stepNanoAODDefaults ]) stepNanoEDMMC = merge([{ '--mc':'' , '--eventcontent' : 'NANOEDMAODSIM,DQM','--datatier': 'NANOAODSIM,DQMIO' }, stepNanoAODDefaults ]) stepNanoEDMMCProd = merge([{ '--mc':'', '-s': 'NANO', '--eventcontent' : 'NANOEDMAODSIM','--datatier': 'NANOAODSIM' }, stepNanoAODDefaults ]) +stepNanoGen = merge([{ '--mc':'' , '--eventcontent' : 'NANOAODGEN,DQM','--datatier': 'NANOAODSIM,DQMIO' }, stepNanoGenDefaults ]) + +steps['NANOGENFromGen'] = merge([{'--conditions': 'auto:run2_mc', '--customise' : 'PhysicsTools/NanoAOD/nanogen_cff.customizeNanoGEN'}, stepNanoGen ]) +steps['NANOGENFromMini'] = merge([{'--conditions': 'auto:run2_mc'}, stepNanoGen ]) steps['NANOAOD2016'] = merge([{'--conditions': 'auto:run2_data_relval', '--era': 'Run2_2016'}, stepNanoAODData ]) steps['NANOAOD2017'] = merge([{'--conditions': 'auto:run2_data_relval', '--era': 'Run2_2017'}, stepNanoAODData ]) diff --git a/DQMOffline/Configuration/python/DQMOffline_cff.py b/DQMOffline/Configuration/python/DQMOffline_cff.py index b00a5b93181b7..f91223247653a 100644 --- a/DQMOffline/Configuration/python/DQMOffline_cff.py +++ b/DQMOffline/Configuration/python/DQMOffline_cff.py @@ -244,3 +244,5 @@ from PhysicsTools.NanoAOD.nanoDQM_cff import nanoDQM DQMOfflineNanoAOD = cms.Sequence(nanoDQM) #PostDQMOfflineNanoAOD = cms.Sequence(nanoDQM) +from PhysicsTools.NanoAOD.nanogenDQM_cff import nanogenDQM +DQMOfflineNanoGen = cms.Sequence(nanogenDQM) diff --git a/DQMOffline/Configuration/python/autoDQM.py b/DQMOffline/Configuration/python/autoDQM.py index 600e825af3493..85387999b37a6 100644 --- a/DQMOffline/Configuration/python/autoDQM.py +++ b/DQMOffline/Configuration/python/autoDQM.py @@ -181,6 +181,10 @@ 'PostDQMOffline', 'DQMHarvestNanoAOD'], + 'nanogenDQM': ['DQMOfflineNanoGen', + 'PostDQMOffline', + 'DQMHarvestNanoAOD'], + 'pfDQM': ['DQMOfflinePF+DQMOfflinePFExtended', 'PostDQMOffline', 'DQMHarvestPF'], diff --git a/PhysicsTools/NanoAOD/python/NanoAODEDMEventContent_cff.py b/PhysicsTools/NanoAOD/python/NanoAODEDMEventContent_cff.py index fa1144ac41330..d2e1f939d795e 100644 --- a/PhysicsTools/NanoAOD/python/NanoAODEDMEventContent_cff.py +++ b/PhysicsTools/NanoAOD/python/NanoAODEDMEventContent_cff.py @@ -19,7 +19,12 @@ compressionLevel = cms.untracked.int32(9), compressionAlgorithm = cms.untracked.string("LZMA"), ) -NANOAODGENEventContent = NanoAODEDMEventContent.clone( + +NanoGenOutput = NanoAODEDMEventContent.outputCommands[:] +NanoGenOutput.remove("keep edmTriggerResults_*_*_*") + +NANOAODGENEventContent = cms.PSet( compressionLevel = cms.untracked.int32(9), compressionAlgorithm = cms.untracked.string("LZMA"), + outputCommands = cms.untracked.vstring(NanoGenOutput) ) diff --git a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py index 33a6b8ea6633c..85dc60079f0a0 100644 --- a/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py +++ b/PhysicsTools/NanoAOD/python/nanoDQM_cfi.py @@ -351,6 +351,31 @@ Plot1D('rawFactor', 'rawFactor', 20, -0.5, 0.5, '1 - Factor to get back to raw pT'), ) ), + LHEPart = cms.PSet( + sels = cms.PSet(), + plots = cms.VPSet( + Count1D('_size', 20, 0, 20, 'LHE particles'), + Plot1D('eta', 'eta', 20, -30000, 30000, 'eta'), + Plot1D('pdgId', 'pdgId', 20, -6000, 6000, 'PDG id'), + Plot1D('phi', 'phi', 20, -3.14159, 3.14159, 'phi'), + Plot1D('pt', 'pt', 20, 0, 200, 'pt'), + ) + ), + LHEPdfWeight = cms.PSet( + sels = cms.PSet(), + plots = cms.VPSet( + Count1D('_size', 1000, 0, 2000, 'LHE PDF weights'), + Plot1D('', '', 100, 0, 2, 'all weights'), + ) + ), + LHEScaleWeight = cms.PSet( + sels = cms.PSet(), + plots = cms.VPSet( + Count1D('_size', 20, 0, 20, 'LHE scale weights'), + Plot1D('', '', 100, 0, 2, 'all weights'), + ) + ), + MET = cms.PSet( sels = cms.PSet(), plots = cms.VPSet( diff --git a/PhysicsTools/NanoAOD/python/nanogenDQM_cff.py b/PhysicsTools/NanoAOD/python/nanogenDQM_cff.py new file mode 100644 index 0000000000000..b7f8b408df4c2 --- /dev/null +++ b/PhysicsTools/NanoAOD/python/nanogenDQM_cff.py @@ -0,0 +1,32 @@ +import FWCore.ParameterSet.Config as cms +import copy + +from PhysicsTools.NanoAOD.nanoDQM_cfi import nanoDQM +from PhysicsTools.NanoAOD.nanoDQM_tools_cff import * +from DQMServices.Core.DQMEDAnalyzer import DQMEDAnalyzer + +nanogenDQM = DQMEDAnalyzer("NanoAODDQM", + vplots = cms.PSet(GenDressedLepton = nanoDQM.vplots.GenDressedLepton, + GenIsolatedPhoton = nanoDQM.vplots.GenIsolatedPhoton, + GenJet = nanoDQM.vplots.GenJet, + GenJetAK8 = nanoDQM.vplots.GenJetAK8, + GenMET = nanoDQM.vplots.GenMET, + GenPart = nanoDQM.vplots.GenPart, + GenVisTau = nanoDQM.vplots.GenVisTau, + LHEPart = nanoDQM.vplots.LHEPart, + LHEScaleWeight = nanoDQM.vplots.LHEScaleWeight, + LHEPdfWeight = nanoDQM.vplots.LHEPdfWeight, + PSWeight = nanoDQM.vplots.PSWeight, + ) +) + +from DQMServices.Core.DQMQualityTester import DQMQualityTester +nanoDQMQTester = DQMQualityTester( + qtList = cms.untracked.FileInPath('PhysicsTools/NanoAOD/test/dqmQualityTests.xml'), + prescaleFactor = cms.untracked.int32(1), + testInEventloop = cms.untracked.bool(False), + qtestOnEndLumi = cms.untracked.bool(False), + verboseQT = cms.untracked.bool(True) +) + +nanogenHarvest = cms.Sequence( nanoDQMQTester ) diff --git a/PhysicsTools/NanoAOD/python/nanogen_cff.py b/PhysicsTools/NanoAOD/python/nanogen_cff.py index 6c13502ea8f2d..201d6eb95eff7 100644 --- a/PhysicsTools/NanoAOD/python/nanogen_cff.py +++ b/PhysicsTools/NanoAOD/python/nanogen_cff.py @@ -1,10 +1,12 @@ from PhysicsTools.NanoAOD.taus_cff import * from PhysicsTools.NanoAOD.jets_cff import * -from PhysicsTools.NanoAOD.globals_cff import * +from PhysicsTools.NanoAOD.globals_cff import genTable +from PhysicsTools.NanoAOD.met_cff import metMCTable from PhysicsTools.NanoAOD.genparticles_cff import * from PhysicsTools.NanoAOD.particlelevel_cff import * from PhysicsTools.NanoAOD.lheInfoTable_cfi import * from PhysicsTools.NanoAOD.genWeightsTable_cfi import * +from PhysicsTools.NanoAOD.common_cff import CandVars nanoMetadata = cms.EDProducer("UniqueStringProducer", strings = cms.PSet( @@ -12,18 +14,6 @@ ) ) -metGenTable = cms.EDProducer("SimpleCandidateFlatTableProducer", - src = cms.InputTag("genMetTrue"), - name = cms.string("GenMET"), - doc = cms.string("Gen MET"), - singleton = cms.bool(True), - extension = cms.bool(False), - variables = cms.PSet( - pt = Var("pt", float, doc="pt", precision=10), - phi = Var("phi", float, doc="phi", precision=10), - ), -) - nanogenSequence = cms.Sequence( nanoMetadata+ particleLevel+ @@ -43,29 +33,13 @@ tautagger+ rivetProducerHTXS+ particleLevelTables+ - metGenTable+ + metMCTable+ genWeightsTable+ lheInfoTable ) -NANOAODGENoutput = cms.OutputModule("NanoAODOutputModule", - compressionAlgorithm = cms.untracked.string('LZMA'), - compressionLevel = cms.untracked.int32(9), - dataset = cms.untracked.PSet( - dataTier = cms.untracked.string('NANOAODSIM'), - filterName = cms.untracked.string('') - ), - fileName = cms.untracked.string('nanogen.root'), - outputCommands = cms.untracked.vstring( - 'drop *', - "keep nanoaodFlatTable_*Table_*_*", # event data - "keep String_*_genModel_*", # generator model data - "keep nanoaodMergeableCounterTable_*Table_*_*", # accumulated per/run or per/lumi data - "keep nanoaodUniqueString_nanoMetadata_*_*", # basic metadata - ) -) - def nanoGenCommonCustomize(process): + process.rivetMetTable.extension = False process.lheInfoTable.storeLHEParticles = True process.lheInfoTable.precision = 14 process.genJetFlavourAssociation.jets = process.genJetTable.src @@ -76,12 +50,20 @@ def nanoGenCommonCustomize(process): process.particleLevel.lepMinPt = 0. process.particleLevel.lepMaxEta = 999. process.genJetFlavourTable.jetFlavourInfos = "genJetFlavourAssociation" + # Same as default RECO + setGenPhiPrecision(process, CandVars.pt.precision) + setGenPtPrecision(process, CandVars.eta.precision) + setGenPhiPrecision(process, CandVars.phi.precision) def customizeNanoGENFromMini(process): process.nanoAOD_step.insert(0, process.genParticles2HepMCHiggsVtx) process.nanoAOD_step.insert(0, process.genParticles2HepMC) process.nanoAOD_step.insert(0, process.mergedGenParticles) + process.metMCTable.src = "slimmedMETs" + process.metMCTable.variables.pt = Var("genMET.pt", float, doc="pt", precision=10) + process.metMCTable.variables.phi = Var("genMET.phi", float, doc="phi", precision=10) + process.rivetProducerHTXS.HepMCCollection = "genParticles2HepMCHiggsVtx:unsmeared" process.genParticleTable.src = "prunedGenParticles" process.patJetPartons.particles = "prunedGenParticles" @@ -96,6 +78,10 @@ def customizeNanoGENFromMini(process): return process def customizeNanoGEN(process): + process.metMCTable.src = "genMetTrue" + process.metMCTable.variables.pt = Var("pt", float, doc="pt", precision=10) + process.metMCTable.variables.phi = Var("phi", float, doc="phi", precision=10) + process.rivetProducerHTXS.HepMCCollection = "generatorSmeared" process.genParticleTable.src = "genParticles" process.patJetPartons.particles = "genParticles" @@ -105,6 +91,11 @@ def customizeNanoGEN(process): process.genJetAK8Table.src = "ak8GenJets" process.tauGenJets.GenParticles = "genParticles" process.genVisTaus.srcGenParticles = "genParticles" + + # In case customizeNanoGENFromMini has already been called + process.nanoAOD_step.remove(process.genParticles2HepMCHiggsVtx) + process.nanoAOD_step.remove(process.genParticles2HepMC) + process.nanoAOD_step.remove(process.mergedGenParticles) nanoGenCommonCustomize(process) return process @@ -129,14 +120,26 @@ def pruneGenParticlesMini(process): return process def setGenFullPrecision(process): - process.genParticleTable.variables.pt.precision = 23 - process.genParticleTable.variables.eta.precision = 23 - process.genParticleTable.variables.phi.precision = 23 - process.genJetTable.variables.pt.precision = 23 - process.genJetTable.variables.eta.precision = 23 - process.genJetTable.variables.phi.precision = 23 - process.metGenTable.variables.pt.precision = 23 - process.metGenTable.variables.phi.precision = 23 + setGenPtPrecision(process, 23) + setGenEtaPrecision(process, 23) + setGenPhiPrecision(process, 23) + +def setGenPtPrecision(process, precision): + process.genParticleTable.variables.pt.precision = precision + process.genJetTable.variables.pt.precision = precision + process.metMCTable.variables.pt.precision = precision + return process + +def setGenEtaPrecision(process, precision): + process.genParticleTable.variables.eta.precision = precision + process.genJetTable.variables.eta.precision = precision + process.metMCTable.variables.eta.precision = precision + return process + +def setGenPhiPrecision(process, precision): + process.genParticleTable.variables.phi.precision = precision + process.genJetTable.variables.phi.precision = precision + process.metMCTable.variables.phi.precision = precision return process def setLHEFullPrecision(process):