CMS 3D CMS Logo

VertexAnalyzer.py
Go to the documentation of this file.
1 import itertools
2 
3 from PhysicsTools.Heppy.analyzers.core.VertexHistograms import VertexHistograms
4 from PhysicsTools.Heppy.analyzers.core.Analyzer import Analyzer
5 from PhysicsTools.Heppy.analyzers.core.AutoHandle import AutoHandle
6 from PhysicsTools.HeppyCore.statistics.average import Average
7 from PhysicsTools.Heppy.physicsutils.PileUpSummaryInfo import PileUpSummaryInfo
8 import PhysicsTools.HeppyCore.framework.config as cfg
9 
10 class VertexAnalyzer( Analyzer ):
11  """selects a list of good primary vertices,
12  and optionally add a pile-up weight to MC events.
13 
14  The list of good primary vertices is put in event.goodVertices.
15  if no good vertex is found, the process function returns False.
16 
17  The weight is put in event.vertexWeight, and is multiplied to
18  the global event weight, event.eventWeight.
19 
20  Example:
21 
22  vertexAna = cfg.Analyzer(
23  'VertexAnalyzer',
24  goodVertices = 'goodPVFilter',
25  vertexWeight = 'vertexWeightFall112011AB',
26  # uncomment the following line if you want a vertex weight = 1 (no weighting)
27  # fixedWeight = 1,
28  verbose = False
29  )
30 
31  If fixedWeight is set to None, the vertex weight is read from the EDM collection with module name
32  'vertexWeightFall112011AB'.
33  Otherwise, the weight is set to fixedWeight.
34 
35  The vertex weight collection was at some point produced in the PAT+CMG step,
36  and could directly be accessed from the PAT or CMG tuple.
37  In the most recent versions of the PAT+CMG tuple, this collection is not present anymore,
38  and an additional full framework process must be ran to produce this collection,
39  so that this analyzer can read it. An example cfg to do that can be found here:
40  http://cmssw.cvs.cern.ch/cgi-bin/cmssw.cgi/UserCode/CMG/CMGTools/H2TauTau/prod/vertexWeight2011_cfg.py?view=markup
41 
42 
43  """
44 
45  def __init__(self, cfg_ana, cfg_comp, looperName):
46  super(VertexAnalyzer, self).__init__(cfg_ana, cfg_comp, looperName)
47 
48  self.doHists=True
49  if (hasattr(self.cfg_ana,'makeHists')) and (not self.cfg_ana.makeHists):
50  self.doHists=False
51  if self.doHists:
52  self.pileup = VertexHistograms('/'.join([self.dirName,
53  'pileup.root']))
54 
55  self.allVertices = self.cfg_ana.allVertices if (hasattr(self.cfg_ana,'allVertices')) else "_AUTO_"
56 
57  def declareHandles(self):
58  super(VertexAnalyzer, self).declareHandles()
59  if self.allVertices == '_AUTO_':
60  self.handles['vertices'] = AutoHandle( "offlineSlimmedPrimaryVertices", 'std::vector<reco::Vertex>', fallbackLabel="offlinePrimaryVertices" )
61  else:
62  self.handles['vertices'] = AutoHandle( self.allVertices, 'std::vector<reco::Vertex>' )
63  self.fixedWeight = None
64  if self.cfg_comp.isMC:
65  if hasattr( self.cfg_ana, 'fixedWeight'):
66  self.fixedWeight = self.cfg_ana.fixedWeight
67  else:
68  self.mchandles['vertexWeight'] = AutoHandle( self.cfg_ana.vertexWeight,
69  'double' )
70 
71  self.mchandles['pusi'] = AutoHandle(
72  'slimmedAddPileupInfo',
73  'std::vector<PileupSummaryInfo>',
74  fallbackLabel='addPileupInfo',
75  )
76 
77  self.handles['rho'] = AutoHandle(
78  ('fixedGridRhoFastjetAll',''),
79  'double'
80  )
81  self.handles['rhoCN'] = AutoHandle(
82  ('fixedGridRhoFastjetCentralNeutral',''),
83  'double'
84  )
85  self.handles['sigma'] = AutoHandle(
86  ('fixedGridSigmaFastjetAll',''),
87  'double',
88  mayFail=True
89  )
90 
91  def beginLoop(self, setup):
92  super(VertexAnalyzer,self).beginLoop(setup)
93  self.averages.add('vertexWeight', Average('vertexWeight') )
94  self.counters.addCounter('GoodVertex')
95  self.count = self.counters.counter('GoodVertex')
96  self.count.register('All Events')
97  self.count.register('Events With Good Vertex')
98 
99 
100  def process(self, event):
101  self.readCollections(event.input )
102  event.rho = self.handles['rho'].product()[0]
103  event.rhoCN = self.handles['rhoCN'].product()[0]
104  event.sigma = self.handles['sigma'].product()[0] if self.handles['sigma'].isValid() else -999
105  event.vertices = self.handles['vertices'].product()
106  event.goodVertices = list(filter(self.testGoodVertex,event.vertices))
107 
108 
109  self.count.inc('All Events')
110 
111 
112  event.vertexWeight = 1
113  if self.cfg_comp.isMC:
114  event.pileUpInfo = map( PileUpSummaryInfo,
115  self.mchandles['pusi'].product() )
116  if self.fixedWeight is None:
117  event.vertexWeight = self.mchandles['vertexWeight'].product()[0]
118  else:
119  event.vertexWeight = self.fixedWeight
120  event.eventWeight *= event.vertexWeight
121 
122  self.averages['vertexWeight'].add( event.vertexWeight )
123  if self.verbose:
124  print 'VertexAnalyzer: #vert = ', len(event.vertices), \
125  ', weight = ', event.vertexWeight
126 
127  # Check if events needs to be skipped if no good vertex is found (useful for generator level studies)
128  keepFailingEvents = False
129  if hasattr( self.cfg_ana, 'keepFailingEvents'):
130  keepFailingEvents = self.cfg_ana.keepFailingEvents
131  if len(event.goodVertices)==0:
132  event.passedVertexAnalyzer=False
133  if not keepFailingEvents:
134  return False
135  else:
136  event.passedVertexAnalyzer=True
137 
138  if self.doHists:
139  self.pileup.hist.Fill( len(event.goodVertices) )
140 #A.R. mindist is one of the slowest functions, default commented
141 # self.pileup.mindist.Fill( self.mindist(event.goodVertices) )
142 
143  self.count.inc('Events With Good Vertex')
144  return True
145 
146 
147  def testGoodVertex(self,vertex):
148  if vertex.isFake():
149  return False
150  if vertex.ndof()<=4:
151  return False
152  if abs(vertex.z())>24:
153  return False
154  if vertex.position().Rho()>2:
155  return False
156 
157  return True
158 
159  def mindist(self, vertices):
160  mindist = 999999
161  for comb in itertools.combinations(vertices, 2):
162  dist = abs(comb[0].z() - comb[1].z())
163  if dist<mindist:
164  mindist = dist
165  return mindist
166 
167  def write(self, setup):
168  super(VertexAnalyzer, self).write(setup)
169  if self.doHists:
170  self.pileup.write()
171 
172 setattr(VertexAnalyzer,"defaultConfig",cfg.Analyzer(
173  class_object=VertexAnalyzer,
174  vertexWeight = None,
175  fixedWeight = 1,
176  verbose = False
177  )
178 )
def __init__(self, cfg_ana, cfg_comp, looperName)
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
void add(std::map< std::string, TH1 * > &h, TH1 *hist)
static std::string join(char **cmd)
Definition: RemoteFile.cc:18
How EventSelector::AcceptEvent() decides whether to accept an event for output otherwise it is excluding the probing of A single or multiple positive and the trigger will pass if any such matching triggers are PASS or EXCEPTION[A criterion thatmatches no triggers at all is detected and causes a throw.] A single negative with an expectation of appropriate bit checking in the decision and the trigger will pass if any such matching triggers are FAIL or EXCEPTION A wildcarded negative criterion that matches more than one trigger in the trigger list("!*","!HLTx*"if it matches 2 triggers or more) will accept the event if all the matching triggers are FAIL.It will reject the event if any of the triggers are PASS or EXCEPTION(this matches the behavior of"!*"before the partial wildcard feature was incorporated).Triggers which are in the READY state are completely ignored.(READY should never be returned since the trigger paths have been run