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(True),
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 photon isolation that uses
238 # the linear pt scaling for barrel and endcap
239 def psetPhoIsoWithEALinScalingCut(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('PhoAnyPFIsoWithEACut'), # Photons isolation block
246  # Both barrel and endcap: cut = c1 + pt*c2
247  C1_EB = cms.double( wpEB.absPFPhoIsoWithEACut_C1 ),
248  C2_EB = cms.double( wpEB.absPFPhoIsoWithEACut_C2 ),
249  C1_EE = cms.double( wpEE.absPFPhoIsoWithEACut_C1 ),
250  C2_EE = cms.double( wpEE.absPFPhoIsoWithEACut_C2 ),
251  anyPFIsoMap = cms.InputTag( isoInputs.phoIsolationMapName ),
252  barrelCutOff = cms.double(ebCutOff),
253  useRelativeIso = cms.bool(False),
254  needsAdditionalProducts = cms.bool(True),
255  isIgnored = cms.bool(False),
256  rho = cms.InputTag("fixedGridRhoFastjetAll"),
257  effAreasConfigFile = cms.FileInPath( isoInputs.phoIsolationEffAreas )
258  )
259 
260 # ==============================================================
261 # Define the complete cut sets
262 # ==============================================================
263 
264 
265 def configureVIDCutBasedPhoID_V1( wpEB, wpEE, isoInputs ):
266  """
267  This function configures the full cms.PSet for a VID ID and returns it.
268  The inputs: two objects of the type WorkingPoint_V1, one
269  containing the cuts for the Barrel (EB) and the other one for the Endcap (EE).
270  The third argument contains data for isolation calculation.
271  """
272  # print "VID: Configuring cut set %s" % wpEB.idName
273  parameterSet = cms.PSet(
274  #
275  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
276  cutFlow = cms.VPSet(
277  psetMinPtCut(), # pt cut
278  psetPhoSCEtaMultiRangeCut(), # eta cut
279  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
280  psetPhoFull5x5SigmaIEtaIEtaValueMapCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
281  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
282  psetNeuHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
283  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
284  )
285  )
286  #
287  return parameterSet
288 
289 def configureVIDCutBasedPhoID_V2( wpEB, wpEE, isoInputs ):
290  """
291  This function configures the full cms.PSet for a VID ID and returns it.
292  The inputs: first object is of the type WorkingPoint_V2, second object
293  is of the type WorkingPoint_V1, containing the cuts for the Barrel (EB)
294  and the other one for the Endcap (EE).
295  The third argument contains data for isolation calculation.
296 
297  The V2 with respect to V1 has one change: the neutral hadron isolation
298  cut has an exponential pt scaling for the barrel.
299  """
300  # print "VID: Configuring cut set %s" % wpEB.idName
301  parameterSet = cms.PSet(
302  #
303  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
304  cutFlow = cms.VPSet(
305  psetMinPtCut(), # pt cut
306  psetPhoSCEtaMultiRangeCut(), # eta cut
307  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
308  psetPhoFull5x5SigmaIEtaIEtaValueMapCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
309  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
310  psetNeuHadIsoWithEAExpoScalingEBCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
311  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
312  )
313  )
314  #
315  return parameterSet
316 
317 def configureVIDCutBasedPhoID_V3( wpEB, wpEE, isoInputs ):
318  """
319  This function configures the full cms.PSet for a VID ID and returns it.
320  The inputs: first object is of the type WorkingPoint_V2, second object
321  is of the type WorkingPoint_V1, containing the cuts for the Barrel (EB)
322  and the other one for the Endcap (EE).
323  The third argument contains data for isolation calculation.
324 
325  The V3 with respect to V2 has one change: the full5x5 sigmaIEtaIEta
326  is taken from the native reco::Photon method and not from a ValueMap
327  produced upstream by some producer module.
328  """
329  # print "VID: Configuring cut set %s" % wpEB.idName
330  parameterSet = cms.PSet(
331  #
332  idName = cms.string( wpEB.idName ), # same name stored in the _EB and _EE objects
333  cutFlow = cms.VPSet(
334  psetMinPtCut(), # pt cut
335  psetPhoSCEtaMultiRangeCut(), # eta cut
336  psetPhoSingleTowerHadOverEmCut(wpEB,wpEE), # H/E cut
337  psetPhoFull5x5SigmaIEtaIEtaCut(wpEB,wpEE), # full 5x5 sigmaIEtaIEta cut
338  psetChHadIsoWithEALinScalingCut(wpEB,wpEE,isoInputs), # charged hadron isolation cut
339  psetNeuHadIsoWithEAExpoScalingEBCut(wpEB,wpEE,isoInputs), # neutral hadron isolation cut
340  psetPhoIsoWithEALinScalingCut(wpEB,wpEE,isoInputs) # photon isolation cut
341  )
342  )
343  #
344  return parameterSet
345