CMS 3D CMS Logo

photons_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
4 from math import ceil,log
5 
6 from Configuration.Eras.Modifier_run2_miniAOD_80XLegacy_cff import run2_miniAOD_80XLegacy
7 from Configuration.Eras.Modifier_run2_nanoAOD_92X_cff import run2_nanoAOD_92X
8 from Configuration.Eras.Modifier_run2_nanoAOD_94XMiniAODv1_cff import run2_nanoAOD_94XMiniAODv1
9 from Configuration.Eras.Modifier_run2_nanoAOD_94XMiniAODv2_cff import run2_nanoAOD_94XMiniAODv2
10 
11 from PhysicsTools.SelectorUtils.tools.vid_id_tools import setupVIDSelection
17 egmPhotonIDSequence = cms.Sequence(cms.Task(egmPhotonIsolationMiniAODTask,photonIDValueMapProducer,photonMVAValueMapProducer,egmPhotonIDs,photonRegressionValueMapProducer))
18 egmPhotonIDs.physicsObjectIDs = cms.VPSet()
19 egmPhotonIDs.physicsObjectSrc = cms.InputTag('slimmedPhotons')
20 
21 _photon_id_vid_modules_WorkingPoints = cms.PSet(
22  modules = cms.vstring(
23  'RecoEgamma.PhotonIdentification.Identification.cutBasedPhotonID_Fall17_94X_V1_TrueVtx_cff',
24  'RecoEgamma.PhotonIdentification.Identification.mvaPhotonID_Fall17_94X_V1_cff',
25  ),
26  WorkingPoints = cms.vstring(
27 # can run only for one working point for the moment, as the working points are not nested
28 # "egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-loose",
29  "egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-medium",
30 # "egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-tight",
31  )
32 )
33 run2_miniAOD_80XLegacy.toModify(_photon_id_vid_modules_WorkingPoints,
34  modules = cms.vstring(
35  'RecoEgamma.PhotonIdentification.Identification.cutBasedPhotonID_Spring16_V2p2_cff',
36  'RecoEgamma.PhotonIdentification.Identification.mvaPhotonID_Spring16_nonTrig_V1_cff',
37  ),
38  WorkingPoints = cms.vstring(
39  "egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-loose",
40  "egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-medium",
41  "egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-tight",
42  )
43 )
44 
45 _bitmapVIDForPho_docstring = ''
46 for modname in _photon_id_vid_modules_WorkingPoints.modules:
47  ids= __import__(modname, globals(), locals(), ['idName','cutFlow'])
48  for name in dir(ids):
49  _id = getattr(ids,name)
50  if hasattr(_id,'idName') and hasattr(_id,'cutFlow'):
51  setupVIDSelection(egmPhotonIDs,_id)
52  if (len(_photon_id_vid_modules_WorkingPoints.WorkingPoints)>0 and _id.idName==_photon_id_vid_modules_WorkingPoints.WorkingPoints[0].split(':')[-1]):
53  _bitmapVIDForPho_docstring = 'VID compressed bitmap (%s), %d bits per cut'%(','.join([cut.cutName.value() for cut in _id.cutFlow]),int(ceil(log(len(_photon_id_vid_modules_WorkingPoints.WorkingPoints)+1,2))))
54 
55 bitmapVIDForPho = cms.EDProducer("PhoVIDNestedWPBitmapProducer",
56  src = cms.InputTag("slimmedPhotons"),
57  WorkingPoints = _photon_id_vid_modules_WorkingPoints.WorkingPoints,
58 )
59 
60 isoForPho = cms.EDProducer("PhoIsoValueMapProducer",
61  src = cms.InputTag("slimmedPhotons"),
62  relative = cms.bool(False),
63  rho_PFIso = cms.InputTag("fixedGridRhoFastjetAll"),
64  mapIsoChg = cms.InputTag("photonIDValueMapProducer:phoChargedIsolation"),
65  mapIsoNeu = cms.InputTag("photonIDValueMapProducer:phoNeutralHadronIsolation"),
66  mapIsoPho = cms.InputTag("photonIDValueMapProducer:phoPhotonIsolation"),
67  EAFile_PFIso_Chg = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Fall17/effAreaPhotons_cone03_pfChargedHadrons_90percentBased_TrueVtx.txt"),
68  EAFile_PFIso_Neu = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Fall17/effAreaPhotons_cone03_pfNeutralHadrons_90percentBased_TrueVtx.txt"),
69  EAFile_PFIso_Pho = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Fall17/effAreaPhotons_cone03_pfPhotons_90percentBased_TrueVtx.txt"),
70 )
71 run2_miniAOD_80XLegacy.toModify(isoForPho,
72  EAFile_PFIso_Chg = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Spring16/effAreaPhotons_cone03_pfChargedHadrons_90percentBased.txt"),
73  EAFile_PFIso_Neu = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Spring16/effAreaPhotons_cone03_pfNeutralHadrons_90percentBased.txt"),
74  EAFile_PFIso_Pho = cms.FileInPath("RecoEgamma/PhotonIdentification/data/Spring16/effAreaPhotons_cone03_pfPhotons_90percentBased.txt"),
75 )
76 
77 import EgammaAnalysis.ElectronTools.calibratedPhotonsRun2_cfi
78 calibratedPatPhotons80X = EgammaAnalysis.ElectronTools.calibratedPhotonsRun2_cfi.calibratedPatPhotons.clone(
79  correctionFile = cms.string("PhysicsTools/NanoAOD/data/80X_ichepV2_2016_pho"), # hack, should go somewhere in EgammaAnalysis
80  semiDeterministic = cms.bool(True),
81 )
82 energyCorrForPhoton80X = cms.EDProducer("PhotonEnergyVarProducer",
83  srcRaw = cms.InputTag("slimmedPhotons"),
84  srcCorr = cms.InputTag("calibratedPatPhotons80X"),
85 )
86 import RecoEgamma.EgammaTools.calibratedEgammas_cff
87 calibratedPatPhotons94Xv1 = RecoEgamma.EgammaTools.calibratedEgammas_cff.calibratedPatPhotons.clone(
88  produceCalibratedObjs = False
89 )
90 
91 
92 slimmedPhotonsWithUserData = cms.EDProducer("PATPhotonUserDataEmbedder",
93  src = cms.InputTag("slimmedPhotons"),
94  userFloats = cms.PSet(
95  mvaID = cms.InputTag("photonMVAValueMapProducer:PhotonMVAEstimatorRunIIFall17v1Values"),
96  PFIsoChg = cms.InputTag("isoForPho:PFIsoChg"),
97  PFIsoAll = cms.InputTag("isoForPho:PFIsoAll"),
98  ),
99  userIntFromBools = cms.PSet(
100  cutbasedID_loose = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-loose"),
101  cutbasedID_medium = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-medium"),
102  cutbasedID_tight = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Fall17-94X-V1-tight"),
103  mvaID_WP90 = cms.InputTag("egmPhotonIDs:mvaPhoID-RunIIFall17-v1-wp90"),
104  mvaID_WP80 = cms.InputTag("egmPhotonIDs:mvaPhoID-RunIIFall17-v1-wp80"),
105  ),
106  userInts = cms.PSet(
107  VIDNestedWPBitmap = cms.InputTag("bitmapVIDForPho"),
108  ),
109 )
110 run2_miniAOD_80XLegacy.toModify(slimmedPhotonsWithUserData.userFloats,
111  mvaID = cms.InputTag("photonMVAValueMapProducer:PhotonMVAEstimatorRun2Spring16NonTrigV1Values"),
112  eCorr = cms.InputTag("energyCorrForPhoton80X","eCorr")
113 )
114 run2_miniAOD_80XLegacy.toModify(slimmedPhotonsWithUserData.userIntFromBools,
115  cutbasedID_loose = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-loose"),
116  cutbasedID_medium = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-medium"),
117  cutbasedID_tight = cms.InputTag("egmPhotonIDs:cutBasedPhotonID-Spring16-V2p2-tight"),
118  mvaID_WP90 = cms.InputTag("egmPhotonIDs:mvaPhoID-Spring16-nonTrig-V1-wp90"),
119  mvaID_WP80 = cms.InputTag("egmPhotonIDs:mvaPhoID-Spring16-nonTrig-V1-wp80"),
120 )
121 run2_nanoAOD_94XMiniAODv1.toModify(slimmedPhotonsWithUserData.userFloats,
122  ecalEnergyErrPostCorr = cms.InputTag("calibratedPatPhotons94Xv1","ecalEnergyErrPostCorr"),
123  ecalEnergyPreCorr = cms.InputTag("calibratedPatPhotons94Xv1","ecalEnergyPreCorr"),
124  ecalEnergyPostCorr = cms.InputTag("calibratedPatPhotons94Xv1","ecalEnergyPostCorr"),
125 )
126 
127 finalPhotons = cms.EDFilter("PATPhotonRefSelector",
128  src = cms.InputTag("slimmedPhotonsWithUserData"),
129  cut = cms.string("pt > 5 ")
130 )
131 
132 photonTable = cms.EDProducer("SimpleCandidateFlatTableProducer",
133  src = cms.InputTag("linkedObjects","photons"),
134  cut = cms.string(""), #we should not filter on cross linked collections
135  name= cms.string("Photon"),
136  doc = cms.string("slimmedPhotons after basic selection (" + finalPhotons.cut.value()+")"),
137  singleton = cms.bool(False), # the number of entries is variable
138  extension = cms.bool(False), # this is the main table for the photons
139  variables = cms.PSet(CandVars,
140  jetIdx = Var("?hasUserCand('jet')?userCand('jet').key():-1", int, doc="index of the associated jet (-1 if none)"),
141  electronIdx = Var("?hasUserCand('electron')?userCand('electron').key():-1", int, doc="index of the associated electron (-1 if none)"),
142  energyErr = Var("getCorrectedEnergyError('regression2')",float,doc="energy error of the cluster from regression",precision=6),
143  r9 = Var("full5x5_r9()",float,doc="R9 of the supercluster, calculated with full 5x5 region",precision=10),
144  sieie = Var("full5x5_sigmaIetaIeta()",float,doc="sigma_IetaIeta of the supercluster, calculated with full 5x5 region",precision=10),
145  cutBasedBitmap = Var("userInt('cutbasedID_loose')+2*userInt('cutbasedID_medium')+4*userInt('cutbasedID_tight')",int,doc="cut-based ID bitmap, 2^(0:loose, 1:medium, 2:tight)"),
146  vidNestedWPBitmap = Var("userInt('VIDNestedWPBitmap')",int,doc=_bitmapVIDForPho_docstring),
147  electronVeto = Var("passElectronVeto()",bool,doc="pass electron veto"),
148  pixelSeed = Var("hasPixelSeed()",bool,doc="has pixel seed"),
149  mvaID = Var("userFloat('mvaID')",float,doc="MVA ID score",precision=10),
150  mvaID_WP90 = Var("userInt('mvaID_WP90')",bool,doc="MVA ID WP90"),
151  mvaID_WP80 = Var("userInt('mvaID_WP80')",bool,doc="MVA ID WP80"),
152  pfRelIso03_chg = Var("userFloat('PFIsoChg')/pt",float,doc="PF relative isolation dR=0.3, charged component (with rho*EA PU corrections)"),
153  pfRelIso03_all = Var("userFloat('PFIsoAll')/pt",float,doc="PF relative isolation dR=0.3, total (with rho*EA PU corrections)"),
154  hoe = Var("hadronicOverEm()",float,doc="H over E",precision=8),
155  isScEtaEB = Var("abs(superCluster().eta()) < 1.4442",bool,doc="is supercluster eta within barrel acceptance"),
156  isScEtaEE = Var("abs(superCluster().eta()) > 1.566 && abs(superCluster().eta()) < 2.5",bool,doc="is supercluster eta within endcap acceptance"),
157  )
158 )
159 for modifier in run2_nanoAOD_94XMiniAODv1, run2_nanoAOD_94XMiniAODv2:
160  modifier.toModify(photonTable.variables,
161  pt = Var("pt*userFloat('ecalEnergyPostCorr')/userFloat('ecalEnergyPreCorr')", float, precision=-1, doc="p_{T}"),
162  energyErr = Var("userFloat('ecalEnergyErrPostCorr')",float,doc="energy error of the cluster from regression",precision=6),
163  eCorr = Var("userFloat('ecalEnergyPostCorr')/userFloat('ecalEnergyPreCorr')",float,doc="ratio of the calibrated energy/miniaod energy"),
164  )
165 
166 run2_miniAOD_80XLegacy.toModify(photonTable.variables,
167  cutBasedBitmap = None,
168  cutBased = Var("userInt('cutbasedID_loose')+userInt('cutbasedID_medium')+userInt('cutbasedID_tight')",int,doc="cut-based ID (0:fail, 1::loose, 2:medium, 3:tight)"),
169  pt = Var("pt*userFloat('eCorr')", float, precision=-1, doc="p_{T} (no energy correction & smearing)"),
170  energyErr = Var("getCorrectedEnergyError('regression2')*userFloat('eCorr')",float,doc="energy error of the cluster from regression",precision=6),
171  eCorr = Var("userFloat('eCorr')",float,doc="ratio of the calibrated energy/miniaod energy"),
172 )
173 
174 
175 photonsMCMatchForTable = cms.EDProducer("MCMatcher", # cut on deltaR, deltaPt/Pt; pick best by deltaR
176  src = photonTable.src, # final reco collection
177  matched = cms.InputTag("finalGenParticles"), # final mc-truth particle collection
178  mcPdgId = cms.vint32(11,22), # one or more PDG ID (11 = el, 22 = pho); absolute values (see below)
179  checkCharge = cms.bool(False), # True = require RECO and MC objects to have the same charge
180  mcStatus = cms.vint32(1), # PYTHIA status code (1 = stable, 2 = shower, 3 = hard scattering)
181  maxDeltaR = cms.double(0.3), # Minimum deltaR for the match
182  maxDPtRel = cms.double(0.5), # Minimum deltaPt/Pt for the match
183  resolveAmbiguities = cms.bool(True), # Forbid two RECO objects to match to the same GEN object
184  resolveByMatchQuality = cms.bool(True), # False = just match input in order; True = pick lowest deltaR pair first
185 )
186 
187 photonMCTable = cms.EDProducer("CandMCMatchTableProducer",
188  src = photonTable.src,
189  mcMap = cms.InputTag("photonsMCMatchForTable"),
190  objName = photonTable.name,
191  objType = photonTable.name, #cms.string("Photon"),
192  branchName = cms.string("genPart"),
193  docString = cms.string("MC matching to status==1 photons or electrons"),
194 )
195 
196 photonSequence = cms.Sequence(egmPhotonIDSequence + bitmapVIDForPho + isoForPho + slimmedPhotonsWithUserData + finalPhotons)
197 photonTables = cms.Sequence ( photonTable)
198 photonMC = cms.Sequence(photonsMCMatchForTable + photonMCTable)
199 
200 _with80XScale_sequence = photonSequence.copy()
201 _with80XScale_sequence.replace(slimmedPhotonsWithUserData, calibratedPatPhotons80X + energyCorrForPhoton80X + slimmedPhotonsWithUserData)
202 run2_miniAOD_80XLegacy.toReplaceWith(photonSequence, _with80XScale_sequence)
203 
204 _with94Xv1Scale_sequence = photonSequence.copy()
205 _with94Xv1Scale_sequence.replace(slimmedPhotonsWithUserData, calibratedPatPhotons94Xv1 + slimmedPhotonsWithUserData)
206 run2_nanoAOD_94XMiniAODv1.toReplaceWith(photonSequence, _with94Xv1Scale_sequence)
207 
def Var(expr, valtype, compression=None, doc=None, mcOnly=False, precision=-1)
Definition: common_cff.py:20
def setupVIDSelection(vidproducer, cutflow)
Definition: vid_id_tools.py:11
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
dbl *** dir
Definition: mlp_gen.cc:35
double split
Definition: MVATrainer.cc:139