CMS 3D CMS Logo

muons_cff.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
2 from Configuration.Eras.Modifier_run2_miniAOD_80XLegacy_cff import run2_miniAOD_80XLegacy
3 from Configuration.Eras.Modifier_run2_nanoAOD_92X_cff import run2_nanoAOD_92X
6 
7 # this below is used only in some eras
8 slimmedMuonsUpdated = cms.EDProducer("PATMuonUpdater",
9  src = cms.InputTag("slimmedMuons"),
10  vertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
11  computeMiniIso = cms.bool(False),
12  pfCandsForMiniIso = cms.InputTag("packedPFCandidates"),
13  miniIsoParams = PhysicsTools.PatAlgos.producersLayer1.muonProducer_cfi.patMuons.miniIsoParams, # so they're in sync
14  recomputeMuonBasicSelectors = cms.bool(False),
15 )
16 run2_nanoAOD_92X.toModify( slimmedMuonsUpdated, recomputeMuonBasicSelectors = True )
17 run2_miniAOD_80XLegacy.toModify( slimmedMuonsUpdated, computeMiniIso = True, recomputeMuonBasicSelectors = True )
18 
19 isoForMu = cms.EDProducer("MuonIsoValueMapProducer",
20  src = cms.InputTag("slimmedMuons"),
21  relative = cms.bool(False),
22  rho_MiniIso = cms.InputTag("fixedGridRhoFastjetAll"),
23  EAFile_MiniIso = cms.FileInPath("PhysicsTools/NanoAOD/data/effAreaMuons_cone03_pfNeuHadronsAndPhotons_94X.txt"),
24 )
25 run2_miniAOD_80XLegacy.toModify(isoForMu, src = "slimmedMuonsUpdated", EAFile_MiniIso = "PhysicsTools/NanoAOD/data/effAreaMuons_cone03_pfNeuHadronsAndPhotons_80X.txt")
26 run2_nanoAOD_92X.toModify(isoForMu, src = "slimmedMuonsUpdated")
27 
28 ptRatioRelForMu = cms.EDProducer("MuonJetVarProducer",
29  srcJet = cms.InputTag("slimmedJets"),
30  srcLep = cms.InputTag("slimmedMuons"),
31  srcVtx = cms.InputTag("offlineSlimmedPrimaryVertices"),
32 )
33 run2_miniAOD_80XLegacy.toModify(ptRatioRelForMu, srcLep = "slimmedMuonsUpdated")
34 run2_nanoAOD_92X.toModify(ptRatioRelForMu, srcLep = "slimmedMuonsUpdated")
35 
36 slimmedMuonsWithUserData = cms.EDProducer("PATMuonUserDataEmbedder",
37  src = cms.InputTag("slimmedMuons"),
38  userFloats = cms.PSet(
39  miniIsoChg = cms.InputTag("isoForMu:miniIsoChg"),
40  miniIsoAll = cms.InputTag("isoForMu:miniIsoAll"),
41  ptRatio = cms.InputTag("ptRatioRelForMu:ptRatio"),
42  ptRel = cms.InputTag("ptRatioRelForMu:ptRel"),
43  jetNDauChargedMVASel = cms.InputTag("ptRatioRelForMu:jetNDauChargedMVASel"),
44  ),
45  userCands = cms.PSet(
46  jetForLepJetVar = cms.InputTag("ptRatioRelForMu:jetForLepJetVar") # warning: Ptr is null if no match is found
47  ),
48 )
49 run2_miniAOD_80XLegacy.toModify(slimmedMuonsWithUserData, src = "slimmedMuonsUpdated")
50 run2_nanoAOD_92X.toModify(slimmedMuonsWithUserData, src = "slimmedMuonsUpdated")
51 
52 finalMuons = cms.EDFilter("PATMuonRefSelector",
53  src = cms.InputTag("slimmedMuonsWithUserData"),
54  cut = cms.string("pt > 3 && track.isNonnull && isLooseMuon")
55 )
56 
57 muonMVATTH= cms.EDProducer("MuonBaseMVAValueMapProducer",
58  src = cms.InputTag("linkedObjects","muons"),
59  weightFile = cms.FileInPath("PhysicsTools/NanoAOD/data/mu_BDTG_94X.weights.xml"),
60  name = cms.string("muonMVATTH"),
61  isClassifier = cms.bool(True),
62  variablesOrder = cms.vstring(["LepGood_pt","LepGood_eta","LepGood_jetNDauChargedMVASel","LepGood_miniRelIsoCharged","LepGood_miniRelIsoNeutral","LepGood_jetPtRelv2","LepGood_jetBTagCSV","LepGood_jetPtRatio","LepGood_sip3d","LepGood_dxy","LepGood_dz","LepGood_segmentCompatibility"]),
63  variables = cms.PSet(
64  LepGood_pt = cms.string("pt"),
65  LepGood_eta = cms.string("eta"),
66  LepGood_jetNDauChargedMVASel = cms.string("?userCand('jetForLepJetVar').isNonnull()?userFloat('jetNDauChargedMVASel'):0"),
67  LepGood_miniRelIsoCharged = cms.string("userFloat('miniIsoChg')/pt"),
68  LepGood_miniRelIsoNeutral = cms.string("(userFloat('miniIsoAll')-userFloat('miniIsoChg'))/pt"),
69  LepGood_jetPtRelv2 = cms.string("?userCand('jetForLepJetVar').isNonnull()?userFloat('ptRel'):0"),
70  LepGood_jetPtRatio = cms.string("?userCand('jetForLepJetVar').isNonnull()?min(userFloat('ptRatio'),1.5):1.0/(1.0+(pfIsolationR04().sumChargedHadronPt + max(pfIsolationR04().sumNeutralHadronEt + pfIsolationR04().sumPhotonEt - pfIsolationR04().sumPUPt/2,0.0))/pt)"),
71  LepGood_jetBTagCSV = cms.string("?userCand('jetForLepJetVar').isNonnull()?max(userCand('jetForLepJetVar').bDiscriminator('pfCombinedInclusiveSecondaryVertexV2BJetTags'),0.0):0.0"),
72  LepGood_sip3d = cms.string("abs(dB('PV3D')/edB('PV3D'))"),
73  LepGood_dxy = cms.string("log(abs(dB('PV2D')))"),
74  LepGood_dz = cms.string("log(abs(dB('PVDZ')))"),
75  LepGood_segmentCompatibility = cms.string("segmentCompatibility"),
76  )
77 )
78 run2_miniAOD_80XLegacy.toModify(muonMVATTH.variables,
79  LepGood_jetPtRatio = cms.string("?userCand('jetForLepJetVar').isNonnull()?min(userFloat('ptRatio'),1.5):1"),
80 )
81 run2_miniAOD_80XLegacy.toModify(muonMVATTH,
82  weightFile = "PhysicsTools/NanoAOD/data/mu_BDTG.weights.xml",
83  variablesOrder = ["LepGood_pt","LepGood_eta","LepGood_jetNDauChargedMVASel","LepGood_miniRelIsoCharged","LepGood_miniRelIsoNeutral","LepGood_jetPtRelv2","LepGood_jetPtRatio","LepGood_jetBTagCSV","LepGood_sip3d","LepGood_dxy","LepGood_dz","LepGood_segmentCompatibility"],
84 )
85 
86 muonTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
87  src = cms.InputTag("linkedObjects","muons"),
88  cut = cms.string(""), #we should not filter on cross linked collections
89  name = cms.string("Muon"),
90  doc = cms.string("slimmedMuons after basic selection (" + finalMuons.cut.value()+")"),
91  singleton = cms.bool(False), # the number of entries is variable
92  extension = cms.bool(False), # this is the main table for the muons
93  variables = cms.PSet(CandVars,
94  ptErr = Var("bestTrack().ptError()", float, doc = "ptError of the muon track", precision=6),
95  dz = Var("dB('PVDZ')",float,doc="dz (with sign) wrt first PV, in cm",precision=10),
96  dzErr = Var("abs(edB('PVDZ'))",float,doc="dz uncertainty, in cm",precision=6),
97  dxy = Var("dB('PV2D')",float,doc="dxy (with sign) wrt first PV, in cm",precision=10),
98  dxyErr = Var("edB('PV2D')",float,doc="dxy uncertainty, in cm",precision=6),
99  ip3d = Var("abs(dB('PV3D'))",float,doc="3D impact parameter wrt first PV, in cm",precision=10),
100  sip3d = Var("abs(dB('PV3D')/edB('PV3D'))",float,doc="3D impact parameter significance wrt first PV",precision=10),
101  segmentComp = Var("segmentCompatibility()", float, doc = "muon segment compatibility", precision=14), # keep higher precision since people have cuts with 3 digits on this
102  nStations = Var("numberOfMatchedStations", int, doc = "number of matched stations with default arbitration (segment & track)"),
103  nTrackerLayers = Var("innerTrack().hitPattern().trackerLayersWithMeasurement()", int, doc = "number of layers in the tracker"),
104  jetIdx = Var("?hasUserCand('jet')?userCand('jet').key():-1", int, doc="index of the associated jet (-1 if none)"),
105  miniPFRelIso_chg = Var("userFloat('miniIsoChg')/pt",float,doc="mini PF relative isolation, charged component"),
106  miniPFRelIso_all = Var("userFloat('miniIsoAll')/pt",float,doc="mini PF relative isolation, total (with scaled rho*EA PU corrections)"),
107  pfRelIso03_chg = Var("pfIsolationR03().sumChargedHadronPt/pt",float,doc="PF relative isolation dR=0.3, charged component"),
108  pfRelIso03_all = Var("(pfIsolationR03().sumChargedHadronPt + max(pfIsolationR03().sumNeutralHadronEt + pfIsolationR03().sumPhotonEt - pfIsolationR03().sumPUPt/2,0.0))/pt",float,doc="PF relative isolation dR=0.3, total (deltaBeta corrections)"),
109  pfRelIso04_all = Var("(pfIsolationR04().sumChargedHadronPt + max(pfIsolationR04().sumNeutralHadronEt + pfIsolationR04().sumPhotonEt - pfIsolationR04().sumPUPt/2,0.0))/pt",float,doc="PF relative isolation dR=0.4, total (deltaBeta corrections)"),
110  tightCharge = Var("?(muonBestTrack().ptError()/muonBestTrack().pt() < 0.2)?2:0",int,doc="Tight charge criterion using pterr/pt of muonBestTrack (0:fail, 2:pass)"),
111  isPFcand = Var("isPFMuon",bool,doc="muon is PF candidate"),
112  mediumId = Var("passed('CutBasedIdMedium')",bool,doc="cut-based ID, medium WP"),
113  tightId = Var("passed('CutBasedIdTight')",bool,doc="cut-based ID, tight WP"),
114  softId = Var("passed('SoftCutBasedId')",bool,doc="soft cut-based ID"),
115  highPtId = Var("?passed('CutBasedIdGlobalHighPt')?2:passed('CutBasedIdTrkHighPt')","uint8",doc="high-pT cut-based ID (1 = tracker high pT, 2 = global high pT, which includes tracker high pT)"),
116  ),
117  externalVariables = cms.PSet(
118  mvaTTH = ExtVar(cms.InputTag("muonMVATTH"),float, doc="TTH MVA lepton ID score",precision=14),
119  ),
120 )
121 
122 muonsMCMatchForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
123  src = muonTable.src, # final reco collection
124  matched = cms.InputTag("finalGenParticles"), # final mc-truth particle collection
125  mcPdgId = cms.vint32(13), # one or more PDG ID (13 = mu); absolute values (see below)
126  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
127  mcStatus = cms.vint32(1), # PYTHIA status code (1 = stable, 2 = shower, 3 = hard scattering)
128  maxDeltaR = cms.double(0.3), # Minimum deltaR for the match
129  maxDPtRel = cms.double(0.5), # Minimum deltaPt/Pt for the match
130  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
131  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
132 )
133 
134 muonMCTable = cms.EDProducer("CandMCMatchTableProducer",
135  src = muonTable.src,
136  mcMap = cms.InputTag("muonsMCMatchForTable"),
137  objName = muonTable.name,
138  objType = muonTable.name, #cms.string("Muon"),
139  branchName = cms.string("genPart"),
140  docString = cms.string("MC matching to status==1 muons"),
141 )
142 
143 muonSequence = cms.Sequence(isoForMu + ptRatioRelForMu + slimmedMuonsWithUserData + finalMuons)
144 muonMC = cms.Sequence(muonsMCMatchForTable + muonMCTable)
145 muonTables = cms.Sequence(muonMVATTH + muonTable)
146 
147 _withUpdate_sequence = muonSequence.copy()
148 _withUpdate_sequence.replace(isoForMu, slimmedMuonsUpdated+isoForMu)
149 run2_nanoAOD_92X.toReplaceWith(muonSequence, _withUpdate_sequence)
150 run2_miniAOD_80XLegacy.toReplaceWith(muonSequence, _withUpdate_sequence)
def ExtVar(tag, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:31
def Var(expr, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:20