CMS 3D CMS Logo

lowPtElectrons_cff.py
Go to the documentation of this file.
1 import FWCore.ParameterSet.Config as cms
3 from PhysicsTools.NanoAOD.common_cff import Var,CandVars
4 
5 
8 
9 modifiedLowPtElectrons = cms.EDProducer(
10  "ModifiedElectronProducer",
11  src = cms.InputTag("slimmedLowPtElectrons"),
12  modifierConfig = cms.PSet(
13  modifications = cms.VPSet(cms.PSet(
14  addExtraUserVars = cms.bool(True),
15  beamSpot = cms.InputTag("offlineBeamSpot"),
16  conversions = cms.InputTag("gsfTracksOpenConversions","gsfTracksOpenConversions"),
17  modifierName = cms.string('LowPtElectronModifier'),
18  vertices = cms.InputTag("offlineSlimmedPrimaryVertices")
19  ))
20  )
21 )
22 
23 updatedLowPtElectrons = cms.EDProducer(
24  "PATElectronUpdater",
25  src = cms.InputTag("modifiedLowPtElectrons"),
26  vertices = cms.InputTag("offlineSlimmedPrimaryVertices"),
27  computeMiniIso = cms.bool(True),
28  fixDxySign = cms.bool(False),
29  pfCandsForMiniIso = cms.InputTag("packedPFCandidates"),
30  miniIsoParamsB = cms.vdouble(
31  0.05, 0.2, 10.0, 0.0, 0.0,
32  0.0, 0.0, 0.0, 0.0
33  ),
34  miniIsoParamsE = cms.vdouble(
35  0.05, 0.2, 10.0, 0.0, 0.015,
36  0.015, 0.08, 0.0, 0.0
37  )
38 )
39 
40 isoForLowPtEle = cms.EDProducer(
41  "EleIsoValueMapProducer",
42  src = cms.InputTag("updatedLowPtElectrons"),
43  relative = cms.bool(True),
44  rho_MiniIso = cms.InputTag("fixedGridRhoFastjetAll"),
45  rho_PFIso = cms.InputTag("fixedGridRhoFastjetAll"),
46  EAFile_MiniIso = cms.FileInPath("RecoEgamma/ElectronIdentification/data/Fall17/effAreaElectrons_cone03_pfNeuHadronsAndPhotons_94X.txt"),
47  EAFile_PFIso = cms.FileInPath("RecoEgamma/ElectronIdentification/data/Fall17/effAreaElectrons_cone03_pfNeuHadronsAndPhotons_94X.txt"),
48 )
49 
50 updatedLowPtElectronsWithUserData = cms.EDProducer(
51  "PATElectronUserDataEmbedder",
52  src = cms.InputTag("updatedLowPtElectrons"),
53  userFloats = cms.PSet(
54  miniIsoChg = cms.InputTag("isoForLowPtEle:miniIsoChg"),
55  miniIsoAll = cms.InputTag("isoForLowPtEle:miniIsoAll"),
56  ),
57  userIntFromBools = cms.PSet(),
58  userInts = cms.PSet(),
59  userCands = cms.PSet(),
60 )
61 
62 finalLowPtElectrons = cms.EDFilter(
63  "PATElectronRefSelector",
64  src = cms.InputTag("updatedLowPtElectronsWithUserData"),
65  cut = cms.string("pt > 1. && electronID('ID') > -0.25"),
66 )
67 
68 
71 
72 lowPtElectronTable = cms.EDProducer(
73  "SimpleCandidateFlatTableProducer",
74  src = cms.InputTag("linkedObjects","lowPtElectrons"),
75  cut = cms.string(""),
76  name= cms.string("LowPtElectron"),
77  doc = cms.string("slimmedLowPtElectrons after basic selection (" + finalLowPtElectrons.cut.value()+")"),
78  singleton = cms.bool(False), # the number of entries is variable
79  extension = cms.bool(False), # this is the main table for the electrons
80  variables = cms.PSet(
81  # Basic variables
82  CandVars,
83  # Overlaps with PF electron
84  electronIdx = Var("?overlaps('electrons').size()>0?overlaps('electrons')[0].key():-1", int, doc="index of the overlapping PF electron (-1 if none)"),
85  # BDT scores and WPs
86  ID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"),
87  unbiased = Var("electronID('unbiased')",float,doc="ElectronSeed, pT- and dxy- agnostic BDT (raw) score"),
88  ptbiased = Var("electronID('ptbiased')",float,doc="ElectronSeed, pT- and dxy- dependent BDT (raw) score"),
89  # Isolation
90  miniPFRelIso_chg = Var("userFloat('miniIsoChg')",float,
91  doc="mini PF relative isolation, charged component"),
92  miniPFRelIso_all = Var("userFloat('miniIsoAll')",float,
93  doc="mini PF relative isolation, total (with scaled rho*EA PU corrections)"),
94  # Conversions
95  convVeto = Var("passConversionVeto()",bool,doc="pass conversion veto"),
96  convWP = Var("userInt('convOpen')*1 + userInt('convLoose')*2 + userInt('convTight')*4",
97  int,doc="conversion flag bit map: 1=Veto, 2=Loose, 3=Tight"),
98  convVtxRadius = Var("userFloat('convVtxRadius')",float,doc="conversion vertex radius (cm)",precision=7),
99  # Tracking
100  lostHits = Var("gsfTrack.hitPattern.numberOfLostHits('MISSING_INNER_HITS')","uint8",doc="number of missing inner hits"),
101  # Cluster-related
102  energyErr = Var("p4Error('P4_COMBINATION')",float,doc="energy error of the cluster-track combination",precision=6),
103  deltaEtaSC = Var("superCluster().eta()-eta()",float,doc="delta eta (SC,ele) with sign",precision=10),
104  r9 = Var("full5x5_r9()",float,doc="R9 of the SC, calculated with full 5x5 region",precision=10),
105  sieie = Var("full5x5_sigmaIetaIeta()",float,doc="sigma_IetaIeta of the SC, calculated with full 5x5 region",precision=10),
106  eInvMinusPInv = Var("(1-eSuperClusterOverP())/ecalEnergy()",float,doc="1/E_SC - 1/p_trk",precision=10),
107  scEtOverPt = Var("(superCluster().energy()/(pt*cosh(superCluster().eta())))-1",float,doc="(SC energy)/pt-1",precision=8),
108  hoe = Var("hadronicOverEm()",float,doc="H over E",precision=8),
109  # Displacement
110  dxy = Var("dB('PV2D')",float,doc="dxy (with sign) wrt first PV, in cm",precision=10),
111  dxyErr = Var("edB('PV2D')",float,doc="dxy uncertainty, in cm",precision=6),
112  dz = Var("dB('PVDZ')",float,doc="dz (with sign) wrt first PV, in cm",precision=10),
113  dzErr = Var("abs(edB('PVDZ'))",float,doc="dz uncertainty, in cm",precision=6),
114  # Cross-referencing
115  #jetIdx
116  #photonIdx
117  ),
118 )
119 
120 
123 
124 # Depends on tautaggerForMatching being run in electrons_cff
125 matchingLowPtElecPhoton = cms.EDProducer(
126  "GenJetGenPartMerger",
127  srcJet =cms.InputTag("particleLevel:leptons"),
128  srcPart=cms.InputTag("particleLevel:photons"),
129  cut = cms.string(""),
130  hasTauAnc=cms.InputTag("tautaggerForMatching"),
131 )
132 
133 lowPtElectronsMCMatchForTableAlt = cms.EDProducer(
134  "GenJetMatcherDRPtByDR", # cut on deltaR, deltaPt/Pt; pick best by deltaR
135  src = lowPtElectronTable.src, # final reco collection
136  matched = cms.InputTag("matchingLowPtElecPhoton:merged"), # final mc-truth particle collection
137  mcPdgId = cms.vint32(11,22), # one or more PDG ID (11 = el, 22 = pho); absolute values (see below)
138  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
139  mcStatus = cms.vint32(),
140  maxDeltaR = cms.double(0.3), # Minimum deltaR for the match
141  maxDPtRel = cms.double(0.5), # Minimum deltaPt/Pt for the match
142  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
143  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
144 )
145 
146 lowPtElectronsMCMatchForTable = cms.EDProducer(
147  "MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
148  src = lowPtElectronTable.src, # final reco collection
149  matched = cms.InputTag("finalGenParticles"), # final mc-truth particle collection
150  mcPdgId = cms.vint32(11), # one or more PDG ID (11 = ele); absolute values (see below)
151  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
152  mcStatus = cms.vint32(1), # PYTHIA status code (1 = stable, 2 = shower, 3 = hard scattering)
153  maxDeltaR = cms.double(0.3), # Minimum deltaR for the match
154  maxDPtRel = cms.double(0.5), # Minimum deltaPt/Pt for the match
155  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
156  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
157 )
158 
159 from PhysicsTools.NanoAOD.V10.electrons_cff import electronMCTable
160 lowPtElectronMCTable = cms.EDProducer(
161  "CandMCMatchTableProducer",
162  src = lowPtElectronTable.src,
163  mcMapDressedLep = cms.InputTag("lowPtElectronsMCMatchForTableAlt"),
164  mcMap = cms.InputTag("lowPtElectronsMCMatchForTable"),
165  mapTauAnc = cms.InputTag("matchingLowPtElecPhoton:hasTauAnc"),
166  objName = lowPtElectronTable.name,
167  objType = electronMCTable.objType,
168  branchName = cms.string("genPart"),
169  docString = cms.string("MC matching to status==1 electrons or photons"),
170  genparticles = cms.InputTag("finalGenParticles"),
171 )
172 
173 
176 
177 lowPtElectronTask = cms.Task(modifiedLowPtElectrons,
178  updatedLowPtElectrons,
179  isoForLowPtEle,
180  updatedLowPtElectronsWithUserData,
181  finalLowPtElectrons)
182 
183 lowPtElectronTablesTask = cms.Task(lowPtElectronTable)
184 
185 lowPtElectronMCTask = cms.Task(
186  matchingLowPtElecPhoton,
187  lowPtElectronsMCMatchForTable,
188  lowPtElectronsMCMatchForTableAlt,
189  lowPtElectronMCTable)
190 
191 
194 
195 
196 # To preserve "nano v9" functionality ...
197 # dependency that might be dropped
198 from RecoEgamma.EgammaTools.lowPtElectronModifier_cfi import lowPtElectronModifier
199 from RecoEgamma.EgammaElectronProducers.lowPtGsfElectrons_cfi import lowPtRegressionModifier
200 
201 run2_nanoAOD_106Xv2.toModify(modifiedLowPtElectrons.modifierConfig,
202  modifications = cms.VPSet(lowPtElectronModifier,
203  lowPtRegressionModifier))
204 
205 run2_nanoAOD_106Xv2.toModify(updatedLowPtElectronsWithUserData.userFloats,
206  ID = cms.InputTag("lowPtPATElectronID"))
207 
208 run2_nanoAOD_106Xv2.toModify(finalLowPtElectrons,
209  cut = "pt > 1. && userFloat('ID') > -0.25")
210 
211 run2_nanoAOD_106Xv2.toModify(lowPtElectronTable.variables,
212  embeddedID = Var("electronID('ID')",float,doc="ID, BDT (raw) score"),
213  ID = Var("userFloat('ID')",float,doc="New ID, BDT (raw) score"))
214 
215 from RecoEgamma.EgammaElectronProducers.lowPtGsfElectronID_cfi import lowPtGsfElectronID
216 lowPtPATElectronID = lowPtGsfElectronID.clone(
217  usePAT = True,
218  electrons = "updatedLowPtElectrons",
219  unbiased = "",
220  ModelWeights = [
221  'RecoEgamma/ElectronIdentification/data/LowPtElectrons/LowPtElectrons_ID_2020Nov28.root',
222  ],
223 )
224 
225 _lowPtElectronTask = cms.Task(lowPtPATElectronID, lowPtElectronTask.copy())
226 
227 run2_nanoAOD_106Xv2.toReplaceWith(lowPtElectronTask,_lowPtElectronTask)
def Var(expr, valtype, doc=None, precision=-1)
Definition: common_cff.py:16