diff --git a/Configuration/PyReleaseValidation/python/relval_nano.py b/Configuration/PyReleaseValidation/python/relval_nano.py index 733a813456ed0..a218d505d26bf 100644 --- a/Configuration/PyReleaseValidation/python/relval_nano.py +++ b/Configuration/PyReleaseValidation/python/relval_nano.py @@ -195,7 +195,7 @@ def subnext(self): steps['jmeNano_data13.0'] = merge([{'-s':'NANO:@JME', '-n' : '1000'}, steps['NANO_data13.0']]) -steps['lepTimeLifeNANO_data13.0']=merge([{'-s' : 'NANO:@LepTimeLife,DQM:@nanoAODDQM', +steps['lepTrackInfoNANO_data13.0']=merge([{'-s' : 'NANO:@LepTrackInfo,DQM:@nanoAODDQM', '-n' : '1000'}, steps['NANO_data13.0']]) @@ -218,7 +218,7 @@ def subnext(self): '-n' : '1000'}, steps['NANO_mc13.2']]) -steps['lepTimeLifeNANO_mc13.2']=merge([{'-s' : 'NANO:@LepTimeLife,DQM:@nanoAODDQM', '-n' : '1000'}, +steps['lepTrackInfoNANO_mc13.2']=merge([{'-s' : 'NANO:@LepTrackInfo,DQM:@nanoAODDQM', '-n' : '1000'}, steps['NANO_mc13.2']]) steps['jmeNANO_mc13.2']=merge([{'-s' : 'NANO:@JME ', '-n' : '1000'}, @@ -283,7 +283,7 @@ def subnext(self): workflows[_wfn()] = ['EGMNANOdata130Xrun3', ['MuonEG2023MINIAOD13.0', 'EGMNano_data13.0']] workflows[_wfn()] = ['BTVNANO_data13.0', ['MuonEG2023MINIAOD13.0', 'BTVNANO_data13.0']] workflows[_wfn()] = ['jmeNANOdata130Xrun3', ['MuonEG2023MINIAOD13.0', 'jmeNano_data13.0']] -workflows[_wfn()] = ['lepTimeLifeNANOdata130Xrun3', ['MuonEG2023MINIAOD13.0', 'lepTimeLifeNANO_data13.0']] +workflows[_wfn()] = ['lepTrackInfoNANOdata130Xrun3', ['MuonEG2023MINIAOD13.0', 'lepTrackInfoNANO_data13.0']] _wfn.next() ################ @@ -293,7 +293,7 @@ def subnext(self): workflows[_wfn()] = ['EGMNANOmc132X', ['TTBarMINIAOD13.2', 'EGMNano_mc13.2']] workflows[_wfn()] = ['BTVNANO_mc13.2', ['TTBarMINIAOD13.2', 'BTVNANO_mc13.2']] workflows[_wfn()] = ['jmeNANOmc132X', ['TTBarMINIAOD13.2', 'jmeNANO_mc13.2']] -workflows[_wfn()] = ['lepTimeLifeNANOmc132X', ['TTBarMINIAOD13.2', 'lepTimeLifeNANO_mc13.2']] +workflows[_wfn()] = ['lepTrackInfoNANOmc132X', ['TTBarMINIAOD13.2', 'lepTrackInfoNANO_mc13.2']] _wfn.next() ################ diff --git a/PhysicsTools/NanoAOD/python/autoNANO.py b/PhysicsTools/NanoAOD/python/autoNANO.py index f9ed4bbb924b7..776ef963b06a5 100644 --- a/PhysicsTools/NanoAOD/python/autoNANO.py +++ b/PhysicsTools/NanoAOD/python/autoNANO.py @@ -53,9 +53,9 @@ def expandNanoMapping(seqList, mapping, key): # PromptReco config: PHYS+L1 'Prompt' : {'sequence': '@PHYS', 'customize': '@PHYS+@L1'}, - # Add lepton time-life info tables through customize combined with PHYS - 'LepTimeLife' : {'sequence': '@PHYS', - 'customize': '@PHYS+PhysicsTools/NanoAOD/leptonTimeLifeInfo_common_cff.addTimeLifeInfo'}, + # Add lepton track parameters through customize combined with PHYS + 'LepTrackInfo' : {'sequence': '@PHYS', + 'customize': '@PHYS+PhysicsTools/NanoAOD/leptonTimeLifeInfo_common_cff.addTrackVarsToTimeLifeInfo'}, # Custom BTV Nano for SF measurements or tagger training 'BTV' : {'sequence': '@PHYS', 'customize':'@PHYS+PhysicsTools/NanoAOD/custom_btv_cff.BTVCustomNanoAOD'} diff --git a/PhysicsTools/NanoAOD/python/leptonTimeLifeInfo_common_cff.py b/PhysicsTools/NanoAOD/python/leptonTimeLifeInfo_common_cff.py index e8001da6fbab7..1c9c6aa3dbd29 100644 --- a/PhysicsTools/NanoAOD/python/leptonTimeLifeInfo_common_cff.py +++ b/PhysicsTools/NanoAOD/python/leptonTimeLifeInfo_common_cff.py @@ -22,7 +22,7 @@ # impact parameter ipVars = cms.PSet( - ipLength = Var("ipLength().value()", float, doc="lenght of impact parameter (3d)", precision=10), + #ipLength = Var("ipLength().value()", float, doc="lenght of impact parameter (3d)", precision=10),#MB: redundant ipLengthSig = Var("ipLength().significance()", float, doc="significance of impact parameter", precision=10), IPx = Var("ipVector().x()", float, doc="x coordinate of impact parameter vector", precision=10), IPy = Var("ipVector().y()", float, doc="y coordinate of impact parameter vector", precision=10), @@ -52,8 +52,8 @@ refitSVx = Var("?hasSV()?sv().x():0", float, doc="x coordinate of SV", precision=10), refitSVy = Var("?hasSV()?sv().y():0", float, doc="y coordinate of SV", precision=10), refitSVz = Var("?hasSV()?sv().z():0", float, doc="z coordinate of SV", precision=10), - refitSVchi2 = Var("?hasSV()?sv().chi2():0", float, doc="chi2 of SV fit", precision=8), - refitSVndof = Var("?hasSV()?sv().ndof():0", float, doc="ndof of SV fit", precision=8), + refitSVchi2 = Var("?hasSV()?sv().normalizedChi2():0", float, doc="reduced chi2, i.e. chi2/ndof, of SV fit", precision=8), + #refitSVndof = Var("?hasSV()?sv().ndof():0", float, doc="ndof of SV fit", precision=8),#MB: not important # flight-length #refitFlightLength = Var("?hasSV()?flightLength().value():0", float, doc="flight-length,i.e. the PV to SV distance", precision=10), #refitFlightLengthSig = Var("?hasSV()?flightLength().significance():0", float, doc="Significance of flight-length", precision=10) @@ -80,7 +80,7 @@ # Definition of DQM plots ipVarsPlots = cms.VPSet( - Plot1D('ipLength', 'ipLength', 25, -0.25, 0.25, 'signed lenght of impact parameter (3d)'), + #Plot1D('ipLength', 'ipLength', 25, -0.25, 0.25, 'signed lenght of impact parameter (3d)'), Plot1D('ipLengthSig', 'ipLengthSig', 60, -5, 10, 'signed significance of impact parameter'), Plot1D('IPx', 'IPx', 40, -0.02, 0.02, 'x coordinate of impact parameter vector'), Plot1D('IPy', 'IPy', 40, -0.02, 0.02, 'y coordinate of impact parameter vector'), @@ -103,8 +103,8 @@ Plot1D('refitSVx', 'refitSVx', 20, -0.1, 0.1, 'x coordinate of refitted SV'), Plot1D('refitSVy', 'refitSVy', 20, -0.1, 0.1, 'y coordinate of refitted SV'), Plot1D('refitSVz', 'refitSVz', 20, -20, 20, 'z coordinate of refitted SV'), - Plot1D('refitSVchi2', 'refitSVchi2', 20, 0, 100, 'chi2 of SV fit'), - Plot1D('refitSVndof', 'refitSVndof', 10, 0, 10, 'ndof of SV fit') + Plot1D('refitSVchi2', 'refitSVchi2', 20, 0, 40, 'reduced chi2 of SV fit'), + #Plot1D('refitSVndof', 'refitSVndof', 10, 0, 10, 'ndof of SV fit') ) #no plots for SV covariance elements, but store placeholders for i in range(0,3): @@ -115,13 +115,7 @@ # Customization sequences and functions # # electrons -electronVars = cms.PSet( - ipVars, - trackVars -) -for var in electronVars.parameters_(): - setattr(getattr(electronVars, var), "src", cms.InputTag("electronTimeLifeInfos")) -def addTimeLifeInfoToElectrons(process): +def addElectronTimeLifeInfoTask(process): process.electronTimeLifeInfos = patElectronTimeLifeInfoProducer.clone( src = process.electronTable.src, selection = 'pt > 15', @@ -133,7 +127,7 @@ def addTimeLifeInfoToElectrons(process): src = process.electronTable.src, doc = cms.string("Additional time-life info for non-prompt electrons"), extension = True, - externalTypedVariables = electronVars + externalTypedVariables = cms.PSet() ) process.electronTimeLifeInfoTask = cms.Task( process.electronTimeLifeInfos, @@ -147,20 +141,46 @@ def addTimeLifeInfoToElectrons(process): run2_nanoAOD_ANY.toReplaceWith(process.electronTimeLifeInfoTask, _electronTimeLifeInfoTaskRun2) process.electronTablesTask.add(process.electronTimeLifeInfoTask) + return process +#base vars +electronVars = cms.PSet( + ipVars +) +for var in electronVars.parameters_(): + setattr(getattr(electronVars, var), "src", cms.InputTag("electronTimeLifeInfos")) +def addTimeLifeInfoToElectrons(process): + if not hasattr(process,'electronTimeLifeInfoTask'): + process = addElectronTimeLifeInfoTask(process) + electronExtVars = cms.PSet( + process.electronTimeLifeInfoTable.externalTypedVariables, + electronVars + ) + process.electronTimeLifeInfoTable.externalTypedVariables = electronExtVars # add DQM plots if needed if hasattr(process,'nanoDQM'): process.nanoDQM.vplots.Electron.plots.extend(ipVarsPlots) + return process +#track vars +electronTrackVars = cms.PSet( + trackVars +) +for var in electronTrackVars.parameters_(): + setattr(getattr(electronTrackVars, var), "src", cms.InputTag("electronTimeLifeInfos")) +def addElectronTrackVarsToTimeLifeInfo(process): + if not hasattr(process,'electronTimeLifeInfoTask'): + process = addElectronTimeLifeInfoTask(process) + electronExtVars = cms.PSet( + process.electronTimeLifeInfoTable.externalTypedVariables, + electronTrackVars + ) + process.electronTimeLifeInfoTable.externalTypedVariables = electronExtVars + # add DQM plots if needed + if hasattr(process,'nanoDQM'): process.nanoDQM.vplots.Electron.plots.extend(trackVarsPlots) return process # muons -muonVars = cms.PSet( - ipVars, - trackVars -) -for var in muonVars.parameters_(): - setattr(getattr(muonVars, var), "src", cms.InputTag("muonTimeLifeInfos")) -def addTimeLifeInfoToMuons(process): +def addMuonTimeLifeInfoTask(process): process.muonTimeLifeInfos = patMuonTimeLifeInfoProducer.clone( src = process.muonTable.src, selection = 'pt > 15', @@ -172,7 +192,7 @@ def addTimeLifeInfoToMuons(process): src = process.muonTable.src, doc = cms.string("Additional time-life info for non-prompt muon"), extension = True, - externalTypedVariables = muonVars + externalTypedVariables = cms.PSet() ) process.muonTimeLifeInfoTask = cms.Task( process.muonTimeLifeInfos, @@ -186,21 +206,46 @@ def addTimeLifeInfoToMuons(process): run2_nanoAOD_ANY.toReplaceWith(process.muonTimeLifeInfoTask, _muonTimeLifeInfoTaskRun2) process.muonTablesTask.add(process.muonTimeLifeInfoTask) + return process +#base vars +muonVars = cms.PSet( + ipVars +) +for var in muonVars.parameters_(): + setattr(getattr(muonVars, var), "src", cms.InputTag("muonTimeLifeInfos")) +def addTimeLifeInfoToMuons(process): + if not hasattr(process,'muonTimeLifeInfoTask'): + process = addMuonTimeLifeInfoTask(process) + muonExtVars = cms.PSet( + process.muonTimeLifeInfoTable.externalTypedVariables, + muonVars + ) + process.muonTimeLifeInfoTable.externalTypedVariables = muonExtVars # add DQM plots if needed if hasattr(process,'nanoDQM'): process.nanoDQM.vplots.Muon.plots.extend(ipVarsPlots) + return process +#track vars +muonTrackVars = cms.PSet( + trackVars +) +for var in muonTrackVars.parameters_(): + setattr(getattr(muonTrackVars, var), "src", cms.InputTag("muonTimeLifeInfos")) +def addMuonTrackVarsToTimeLifeInfo(process): + if not hasattr(process,'muonTimeLifeInfoTask'): + process = addMuonTimeLifeInfoTask(process) + muonExtVars = cms.PSet( + process.muonTimeLifeInfoTable.externalTypedVariables, + muonTrackVars + ) + process.muonTimeLifeInfoTable.externalTypedVariables = muonExtVars + # add DQM plots if needed + if hasattr(process,'nanoDQM'): process.nanoDQM.vplots.Muon.plots.extend(trackVarsPlots) return process # taus -tauVars = cms.PSet( - svVars, - ipVars, - trackVars -) -for var in tauVars.parameters_(): - setattr(getattr(tauVars, var), "src", cms.InputTag("tauTimeLifeInfos")) -def addTimeLifeInfoToTaus(process): +def addTauTimeLifeInfoTask(process): process.tauTimeLifeInfos = patTauTimeLifeInfoProducer.clone( src = process.tauTable.src, pvSource = prod_common.pvSource, @@ -211,7 +256,7 @@ def addTimeLifeInfoToTaus(process): src = process.tauTable.src, doc = cms.string("Additional tau time-life info"), extension = True, - externalTypedVariables = tauVars + externalTypedVariables = cms.PSet() ) process.tauTimeLifeInfoTask = cms.Task( process.tauTimeLifeInfos, @@ -225,12 +270,45 @@ def addTimeLifeInfoToTaus(process): run2_nanoAOD_ANY.toReplaceWith(process.tauTimeLifeInfoTask, _tauTimeLifeInfoTaskRun2) process.tauTablesTask.add(process.tauTimeLifeInfoTask) + return process +# base vars +tauVars = cms.PSet( + svVars, + ipVars +) +for var in tauVars.parameters_(): + setattr(getattr(tauVars, var), "src", cms.InputTag("tauTimeLifeInfos")) +def addTimeLifeInfoToTaus(process): + if not hasattr(process,'tauTimeLifeInfoTask'): + process = addTauTimeLifeInfoTask(process) + tauExtVars = cms.PSet( + process.tauTimeLifeInfoTable.externalTypedVariables, + tauVars + ) + process.tauTimeLifeInfoTable.externalTypedVariables = tauExtVars # add DQM plots if needed if hasattr(process,'nanoDQM'): process.nanoDQM.vplots.Tau.plots.extend(ipVarsPlots) - process.nanoDQM.vplots.Tau.plots.extend(trackVarsPlots) process.nanoDQM.vplots.Tau.plots.extend(svVarsPlots) return process +#track vars +tauTrackVars = cms.PSet( + trackVars +) +for var in tauTrackVars.parameters_(): + setattr(getattr(tauTrackVars, var), "src", cms.InputTag("tauTimeLifeInfos")) +def addTauTrackVarsToTimeLifeInfo(process): + if not hasattr(process,'tauTimeLifeInfoTask'): + process = addTauTimeLifeInfoTask(process) + tauExtVars = cms.PSet( + process.tauTimeLifeInfoTable.externalTypedVariables, + tauTrackVars + ) + process.tauTimeLifeInfoTable.externalTypedVariables = tauExtVars + # add DQM plots if needed + if hasattr(process,'nanoDQM'): + process.nanoDQM.vplots.Tau.plots.extend(trackVarsPlots) + return process # Vertices def addExtendVertexInfo(process): @@ -244,7 +322,7 @@ def addExtendVertexInfo(process): x = Var("position().x()", float, doc = "position x coordinate, in cm", precision = 10), y = Var("position().y()", float, doc = "position y coordinate, in cm", precision = 10), z = Var("position().z()", float, doc = "position z coordinate, in cm", precision = 16), - ndof = Var("ndof()", float, doc = "number of degrees of freedom", precision = 8), + #ndof = Var("ndof()", float, doc = "number of degrees of freedom", precision = 8),#MB: not important chi2 = Var("normalizedChi2()", float, doc = "reduced chi2, i.e. chi2/ndof", precision = 8), ), ) @@ -259,10 +337,21 @@ def addExtendVertexInfo(process): process.vertexTablesTask.add(process.pvbsTableTask) return process -# Full -def addTimeLifeInfo(process): +# Time-life info without track parameters +def addTimeLifeInfoBase(process): addTimeLifeInfoToElectrons(process) addTimeLifeInfoToMuons(process) addTimeLifeInfoToTaus(process) addExtendVertexInfo(process) return process +# Add track parameters to time-life info +def addTrackVarsToTimeLifeInfo(process): + addElectronTrackVarsToTimeLifeInfo(process) + addMuonTrackVarsToTimeLifeInfo(process) + addTauTrackVarsToTimeLifeInfo(process) + return process +# Full +def addTimeLifeInfo(process): + addTimeLifeInfoBase(process) + addTrackVarsToTimeLifeInfo(process) + return process diff --git a/PhysicsTools/NanoAOD/python/nano_cff.py b/PhysicsTools/NanoAOD/python/nano_cff.py index ca0a71442debf..cf78f216004f9 100644 --- a/PhysicsTools/NanoAOD/python/nano_cff.py +++ b/PhysicsTools/NanoAOD/python/nano_cff.py @@ -263,6 +263,10 @@ def nanoAOD_customizeCommon(process): process, lambda p : nanoAOD_addBoostedTauIds(p, nanoAOD_boostedTau_switch.idsToAdd.value()) ) + # Add lepton time-life info + from PhysicsTools.NanoAOD.leptonTimeLifeInfo_common_cff import addTimeLifeInfoBase + process = addTimeLifeInfoBase(process) + return process ###increasing the precision of selected GenParticles.