CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
cutBasedPhotonID_tools.py
Go to the documentation of this file.
1 
2 import FWCore.ParameterSet.Config as cms
3 
4 # Barrel/endcap division in eta
5 ebCutOff = 1.479
6 
7 # ===============================================
8 # Define containers used by cut definitions
9 # ===============================================
10 
12  """
13  This is a container class to hold numerical cut values for either
14  the barrel or endcap set of cuts
15  """
16  def __init__(self,
17  idName,
18  hOverECut,
19  full5x5_sigmaIEtaIEtaCut,
20  # Isolation cuts are generally pt-dependent: cut = C1 + pt * C2
21  absPFChaHadIsoWithEACut_C1,
22  absPFChaHadIsoWithEACut_C2,
23  absPFNeuHadIsoWithEACut_C1,
24  absPFNeuHadIsoWithEACut_C2,
25  absPFPhoIsoWithEACut_C1,
26  absPFPhoIsoWithEACut_C2
27  ):
28  self.idName = idName
29  self.hOverECut = hOverECut
30  self.full5x5_sigmaIEtaIEtaCut = full5x5_sigmaIEtaIEtaCut
31  self.absPFChaHadIsoWithEACut_C1 = absPFChaHadIsoWithEACut_C1 # charged hadron isolation C1
32  self.absPFChaHadIsoWithEACut_C2 = absPFChaHadIsoWithEACut_C2 # ........ C2
33  self.absPFNeuHadIsoWithEACut_C1 = absPFNeuHadIsoWithEACut_C1 # neutral hadron isolation C1
34  self.absPFNeuHadIsoWithEACut_C2 = absPFNeuHadIsoWithEACut_C2 # ........ C2
35  self.absPFPhoIsoWithEACut_C1 = absPFPhoIsoWithEACut_C1 # photon isolation C1
36  self.absPFPhoIsoWithEACut_C2 = absPFPhoIsoWithEACut_C2 # ........ C2
37 
39  """
40  This is a container class to hold numerical cut values for either
41  the barrel or endcap set of cuts
42  This version of the container is different from the previous one
43  by the fact that it contains three constants instead of two for
44  the neutral hadron isolation cut, for exponantial parameterization
45  """
46  def __init__(self,
47  idName,
48  hOverECut,
49  full5x5_sigmaIEtaIEtaCut,
50  # Isolation cuts are generally pt-dependent: cut = C1 + pt * C2
51  # except for the neutral hadron isolation where it is cut = C1+exp(pt*C2+C3)
52  absPFChaHadIsoWithEACut_C1,
53  absPFChaHadIsoWithEACut_C2,
54  absPFNeuHadIsoWithEACut_C1,
55  absPFNeuHadIsoWithEACut_C2,
56  absPFNeuHadIsoWithEACut_C3,
57  absPFPhoIsoWithEACut_C1,
58  absPFPhoIsoWithEACut_C2
59  ):
60  self.idName = idName
61  self.hOverECut = hOverECut
62  self.full5x5_sigmaIEtaIEtaCut = full5x5_sigmaIEtaIEtaCut
63  self.absPFChaHadIsoWithEACut_C1 = absPFChaHadIsoWithEACut_C1 # charged hadron isolation C1
64  self.absPFChaHadIsoWithEACut_C2 = absPFChaHadIsoWithEACut_C2 # ........ C2
65  self.absPFNeuHadIsoWithEACut_C1 = absPFNeuHadIsoWithEACut_C1 # neutral hadron isolation C1
66  self.absPFNeuHadIsoWithEACut_C2 = absPFNeuHadIsoWithEACut_C2 # ........ C2
67  self.absPFNeuHadIsoWithEACut_C3 = absPFNeuHadIsoWithEACut_C3 # ........ C3
68  self.absPFPhoIsoWithEACut_C1 = absPFPhoIsoWithEACut_C1 # photon isolation C1
69  self.absPFPhoIsoWithEACut_C2 = absPFPhoIsoWithEACut_C2 # ........ C2
70 
72  """
73  A container class that holds the names of the isolation maps in the event record
74  and the names of the files with the effective area constants for pile-up corrections
75  """
76  def __init__(self,
77  chHadIsolationMapName,
78  chHadIsolationEffAreas,
79  neuHadIsolationMapName,
80  neuHadIsolationEffAreas,
81  phoIsolationMapName,
82  phoIsolationEffAreas
83  ):
84  self.chHadIsolationMapName = chHadIsolationMapName
85  self.chHadIsolationEffAreas = chHadIsolationEffAreas
86  self.neuHadIsolationMapName = neuHadIsolationMapName
87  self.neuHadIsolationEffAreas = neuHadIsolationEffAreas
88  self.phoIsolationMapName = phoIsolationMapName
89  self.phoIsolationEffAreas = phoIsolationEffAreas
90 
91 # ==============================================================
92 # Define individual cut configurations used by complete cut sets
93 # ==============================================================
94 
95 # The mininum pt cut is set to 5 GeV
97  return cms.PSet(
98  cutName = cms.string("MinPtCut"),
99  minPt = cms.double(5.0),
100  needsAdditionalProducts = cms.bool(False),
101  isIgnored = cms.bool(False)
102  )
103 
104 # Take all particles in the eta ranges 0-ebCutOff and ebCutOff-2.5
106  return cms.PSet(
107  cutName = cms.string("PhoSCEtaMultiRangeCut"),
108  useAbsEta = cms.bool(True),
109  allowedEtaRanges = cms.VPSet(
110  cms.PSet( minEta = cms.double(0.0),
111  maxEta = cms.double(ebCutOff) ),
112  cms.PSet( minEta = cms.double(ebCutOff),
113  maxEta = cms.double(2.5) )
114  ),
115  needsAdditionalProducts = cms.bool(False),
116  isIgnored = cms.bool(False)
117  )
118 
119 # Configure the cut on the single tower H/E
121  """
122  Arguments: two containers of working point cut values of the type WorkingPoint_*
123  """
124  return cms.PSet(
125  cutName = cms.string('PhoSingleTowerHadOverEmCut'),
126  hadronicOverEMCutValueEB = cms.double( wpEB.hOverECut ),
127  hadronicOverEMCutValueEE = cms.double( wpEE.hOverECut ),
128  barrelCutOff = cms.double(ebCutOff),
129  needsAdditionalProducts = cms.bool(False),
130  isIgnored = cms.bool(False)
131  )
132 
133 # Configure the cut on full5x5 sigmaIEtaIEta that uses a ValueMap,
134 # relying on an upstream producer that creates it. This was necessary
135 # for photons up to 7.2.0.
137  """
138  Arguments: two containers of working point cut values of the type WorkingPoint_*
139  """
140  return cms.PSet(
141  cutName = cms.string('PhoFull5x5SigmaIEtaIEtaValueMapCut'),
142  cutValueEB = cms.double( wpEB.full5x5_sigmaIEtaIEtaCut ),
143  cutValueEE = cms.double( wpEE.full5x5_sigmaIEtaIEtaCut ),
144  full5x5SigmaIEtaIEtaMap = cms.InputTag('photonIDValueMapProducer:phoFull5x5SigmaIEtaIEta'),
145  barrelCutOff = cms.double(ebCutOff),
146  needsAdditionalProducts = cms.bool(True),
147  isIgnored = cms.bool(False)
148  )
149 
150 # Configure the cut on full5x5 sigmaIEtaIEta that uses the native Photon field
151 # with this variable (works for releases past 7.2.0).
153  """
154  Arguments: two containers of working point cut values of the type WorkingPoint_*
155  """
156  return cms.PSet(
157  cutName = cms.string('PhoFull5x5SigmaIEtaIEtaCut'),
158  cutValueEB = cms.double( wpEB.full5x5_sigmaIEtaIEtaCut ),
159  cutValueEE = cms.double( wpEE.full5x5_sigmaIEtaIEtaCut ),
160  full5x5SigmaIEtaIEtaMap = cms.InputTag('photonIDValueMapProducer:phoFull5x5SigmaIEtaIEta'),
161  barrelCutOff = cms.double(ebCutOff),
162  needsAdditionalProducts = cms.bool(False),
163  isIgnored = cms.bool(False)
164  )
165 
166 # Configure the cut on the charged hadron isolation that uses
167 # the linear pt scaling for barrel and endcap
168 def psetChHadIsoWithEALinScalingCut(wpEB, wpEE, isoInputs):
169  """
170  Arguments: two containers of working point cut values of the type WorkingPoint_*
171  The third argument contains data for isolation calculation.
172  """
173  return cms.PSet(
174  cutName = cms.string('PhoAnyPFIsoWithEACut'),
175  # Both barrel and endcap: cut = c1 + pt*c2
176  C1_EB = cms.double( wpEB.absPFChaHadIsoWithEACut_C1 ),
177  C2_EB = cms.double( wpEB.absPFChaHadIsoWithEACut_C2 ),
178  C1_EE = cms.double( wpEE.absPFChaHadIsoWithEACut_C1 ),
179  C2_EE = cms.double( wpEE.absPFChaHadIsoWithEACut_C2 ),
180  anyPFIsoMap = cms.InputTag( isoInputs.chHadIsolationMapName ),
181  barrelCutOff = cms.double(ebCutOff),
182  useRelativeIso = cms.bool(False),
183  needsAdditionalProducts = cms.bool(True),
184  isIgnored = cms.bool(False),
185  rho = cms.InputTag("fixedGridRhoFastjetAll"),
186  effAreasConfigFile = cms.FileInPath( isoInputs.chHadIsolationEffAreas )
187  )
188 
189 # Configure the cut on the neutral hadron isolation that uses
190 # the linear pt scaling for barrel and endcap
191 def psetNeuHadIsoWithEALinScalingCut( wpEB, wpEE, isoInputs):
192  """
193  Arguments: two containers of working point cut values of the type WorkingPoint_*
194  The third argument contains data for isolation calculation.
195  """
196  return cms.PSet(
197  cutName = cms.string('PhoAnyPFIsoWithEACut'), # Neutral hadrons isolation block
198  # Both barrel and endcap: cut = c1 + pt*c2
199  C1_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C1 ),
200  C2_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C2 ),
201  C1_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C1 ),
202  C2_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C2 ),
203  anyPFIsoMap = cms.InputTag( isoInputs.neuHadIsolationMapName ),
204  barrelCutOff = cms.double(ebCutOff),
205  useRelativeIso = cms.bool(False),
206  needsAdditionalProducts = cms.bool(True),
207  isIgnored = cms.bool(False),
208  rho = cms.InputTag("fixedGridRhoFastjetAll"),
209  effAreasConfigFile = cms.FileInPath( isoInputs.neuHadIsolationEffAreas )
210  )
211 
212 # Configure the cut on the neutral hadron isolation that uses
213 # the exponential pt scaling for barrel and the linear pt scaling for endcap
214 def psetNeuHadIsoWithEAExpoScalingEBCut(wpEB, wpEE, isoInputs):
215  """
216  Arguments: two containers of working point cut values of the type WorkingPoint_*
217  The third argument contains data for isolation calculation.
218  """
219  return cms.PSet(
220  cutName = cms.string('PhoAnyPFIsoWithEAAndExpoScalingEBCut'), # Neutral hadrons isolation block
221  # Barrel: cut = c1 + expo(pt*c2+c3)
222  C1_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C1 ),
223  C2_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C2 ),
224  C3_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C3 ),
225  # Endcap: cut = c1 + pt*c2
226  C1_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C1 ),
227  C2_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C2 ),
228  anyPFIsoMap = cms.InputTag( isoInputs.neuHadIsolationMapName ),
229  barrelCutOff = cms.double(ebCutOff),
230  useRelativeIso = cms.bool(False),
231  needsAdditionalProducts = cms.bool(True),
232  isIgnored = cms.bool(False),
233  rho = cms.InputTag("fixedGridRhoFastjetAll"),
234  effAreasConfigFile = cms.FileInPath( isoInputs.neuHadIsolationEffAreas )
235  )
236 
237 # Configure the cut on the neutral hadron isolation that uses
238 # the exponential pt scaling for both barrel and endcap
239 def psetNeuHadIsoWithEAExpoScalingCut(wpEB, wpEE, isoInputs):
240  """
241  Arguments: two containers of working point cut values of the type WorkingPoint_*
242  The third argument contains data for isolation calculation.
243  """
244  return cms.PSet(
245  cutName = cms.string('PhoAnyPFIsoWithEAAndExpoScalingCut'), # Neutral hadrons isolation block
246  # Barrel: cut = c1 + expo(pt*c2+c3)
247  C1_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C1 ),
248  C2_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C2 ),
249  C3_EB = cms.double( wpEB.absPFNeuHadIsoWithEACut_C3 ),
250  # Endcap: cut = cut = c1 + expo(pt*c2+c3)
251  C1_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C1 ),
252  C2_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C2 ),
253  C3_EE = cms.double( wpEE.absPFNeuHadIsoWithEACut_C3 ),
254  anyPFIsoMap = cms.InputTag( isoInputs.neuHadIsolationMapName ),
255  barrelCutOff = cms.double(ebCutOff),
256  useRelativeIso = cms.bool(False),
257  needsAdditionalProducts = cms.bool(True),
258  isIgnored = cms.bool(False),
259  rho = cms.InputTag("fixedGridRhoFastjetAll"),
260  effAreasConfigFile = cms.FileInPath( isoInputs.neuHadIsolationEffAreas )
261  )
262 
263 # Configure the cut on the photon isolation that uses
264 # the linear pt scaling for barrel and endcap
265 def psetPhoIsoWithEALinScalingCut(wpEB, wpEE, isoInputs):
266  """
267  Arguments: two containers of working point cut values of the type WorkingPoint_*
268  The third argument contains data for isolation calculation.
269  """
270  return cms.PSet(
271  cutName = cms.string('PhoAnyPFIsoWithEACut'), # Photons isolation block
272  # Both barrel and endcap: cut = c1 + pt*c2
273  C1_EB = cms.double( wpEB.absPFPhoIsoWithEACut_C1 ),
274  C2_EB = cms.double( wpEB.absPFPhoIsoWithEACut_C2 ),
275  C1_EE = cms.double( wpEE.absPFPhoIsoWithEACut_C1 ),
276  C2_EE = cms.double( wpEE.absPFPhoIsoWithEACut_C2 ),
277  anyPFIsoMap = cms.InputTag( isoInputs.phoIsolationMapName ),
278  barrelCutOff = cms.double(ebCutOff),
279  useRelativeIso = cms.bool(False),
280  needsAdditionalProducts = cms.bool(True),
281  isIgnored = cms.bool(False),
282  rho = cms.InputTag("fixedGridRhoFastjetAll"),
283  effAreasConfigFile = cms.FileInPath( isoInputs.phoIsolationEffAreas )
284  )
285 
286 # ==============================================================
287 # Define the complete cut sets
288 # ==============================================================
289 
290 
291 def configureVIDCutBasedPhoID_V1( wpEB, wpEE, isoInputs ):
292  """
293  This function configures the full cms.PSet for a VID ID and returns it.
294  The inputs: two objects of the type WorkingPoint_V1, one
295  containing the cuts for the Barrel (EB) and the other one for the Endcap (EE).
296  The third argument contains data for isolation calculation.
297  """
298  # print "VID: Configuring cut set %s" % wpEB.idName
299  parameterSet = cms.PSet(
300  #
301  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
302  cutFlow = cms.VPSet(
303  psetMinPtCut(), # pt cut
304  psetPhoSCEtaMultiRangeCut(), # eta cut
305  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
306  psetPhoFull5x5SigmaIEtaIEtaValueMapCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
307  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
308  psetNeuHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
309  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
310  )
311  )
312  #
313  return parameterSet
314 
315 def configureVIDCutBasedPhoID_V2( wpEB, wpEE, isoInputs ):
316  """
317  This function configures the full cms.PSet for a VID ID and returns it.
318  The inputs: first object is of the type WorkingPoint_V2, second object
319  is of the type WorkingPoint_V1, containing the cuts for the Barrel (EB)
320  and the other one for the Endcap (EE).
321  The third argument contains data for isolation calculation.
322 
323  The V2 with respect to V1 has one change: the neutral hadron isolation
324  cut has an exponential pt scaling for the barrel.
325  """
326  # print "VID: Configuring cut set %s" % wpEB.idName
327  parameterSet = cms.PSet(
328  #
329  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
330  cutFlow = cms.VPSet(
331  psetMinPtCut(), # pt cut
332  psetPhoSCEtaMultiRangeCut(), # eta cut
333  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
334  psetPhoFull5x5SigmaIEtaIEtaValueMapCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
335  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
336  psetNeuHadIsoWithEAExpoScalingEBCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
337  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
338  )
339  )
340  #
341  return parameterSet
342 
343 def configureVIDCutBasedPhoID_V3( wpEB, wpEE, isoInputs ):
344  """
345  This function configures the full cms.PSet for a VID ID and returns it.
346  The inputs: first object is of the type WorkingPoint_V2, second object
347  is of the type WorkingPoint_V1, containing the cuts for the Barrel (EB)
348  and the other one for the Endcap (EE).
349  The third argument contains data for isolation calculation.
350 
351  The V3 with respect to V2 has one change: the full5x5 sigmaIEtaIEta
352  is taken from the native reco::Photon method and not from a ValueMap
353  produced upstream by some producer module.
354  """
355  # print "VID: Configuring cut set %s" % wpEB.idName
356  parameterSet = cms.PSet(
357  #
358  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
359  cutFlow = cms.VPSet(
360  psetMinPtCut(), # pt cut
361  psetPhoSCEtaMultiRangeCut(), # eta cut
362  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
363  psetPhoFull5x5SigmaIEtaIEtaCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
364  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
365  psetNeuHadIsoWithEAExpoScalingEBCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
366  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
367  )
368  )
369  #
370  return parameterSet
371 
372 def configureVIDCutBasedPhoID_V4( wpEB, wpEE, isoInputs ):
373  """
374  This function configures the full cms.PSet for a VID ID and returns it.
375  The inputs: first object is of the type WorkingPoint_V2, second object
376  is of the type WorkingPoint_V2 as well, first containing the cuts for the
377  Barrel (EB) and the other one for the Endcap (EE).
378  The third argument contains data for isolation calculation.
379 
380  The V4 with respect to V3 has one change: both barrel and endcap
381  use the exponential scaling for the neutral hadron isolation cut
382  (in V3 it was only done for the barrel)
383  """
384  # print "VID: Configuring cut set %s" % wpEB.idName
385  parameterSet = cms.PSet(
386  #
387  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
388  cutFlow = cms.VPSet(
389  psetMinPtCut(), # pt cut
390  psetPhoSCEtaMultiRangeCut(), # eta cut
391  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
392  psetPhoFull5x5SigmaIEtaIEtaCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
393  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
394  psetNeuHadIsoWithEAExpoScalingCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
395  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
396  )
397  )
398  #
399  return parameterSet
400