1 from PhysicsTools.Heppy.analyzers.core.TreeAnalyzerNumpy
import TreeAnalyzerNumpy
2 from PhysicsTools.Heppy.analyzers.core.AutoHandle
import AutoHandle
13 def __init__(self, cfg_ana, cfg_comp, looperName):
14 super(AutoFillTreeProducer,self).
__init__(cfg_ana, cfg_comp, looperName)
17 self.
scalar =
not self.cfg_ana.vectorTree
20 if not getattr(self.cfg_ana,
'saveTLorentzVectors',
False):
21 fourVectorType.removeVariable(
"p4")
27 if hasattr(cfg_ana,
"collections"):
28 self.collections.update(cfg_ana.collections)
29 if hasattr(cfg_ana,
"globalObjects"):
30 self.globalObjects.update(cfg_ana.globalObjects)
31 if hasattr(cfg_ana,
"globalVariables"):
35 super(AutoFillTreeProducer, self).
beginLoop(setup)
40 self.mchandles[
'GenInfo'] = AutoHandle( (
'generator',
'',
''),
'GenEventInfoProduct' )
41 for k,v
in self.collections.iteritems():
42 if type(v) == tuple
and isinstance(v[0], AutoHandle):
43 self.handles[k] = v[0]
46 """Here we declare the variables that we always want and that are hard-coded"""
47 tr.var(
'run', int, storageType=
"i")
48 tr.var(
'lumi', int, storageType=
"i")
49 tr.var(
'evt', int, storageType=
"l")
62 tr.var(
'intLumi', int, storageType=
"i")
70 tr.var(
"nTrueInt",int)
75 if hasattr(self.cfg_ana,
"PDFWeights")
and len(self.cfg_ana.PDFWeights) > 0:
76 self.pdfWeights = self.cfg_ana.PDFWeights
77 for (pdf,nvals)
in self.pdfWeights:
79 for i
in range(nvals): tr.var(
'pdfWeight_%s_%d' % (pdf,i))
81 tr.vector(
'pdfWeight_%s' % pdf, nvals)
84 isMC = self.cfg_comp.isMC
88 if not hasattr(self.cfg_ana,
"ignoreAnalyzerBookings")
or not self.cfg_ana.ignoreAnalyzerBookings :
90 if hasattr(setup,
"globalVariables"):
92 if hasattr(setup,
"globalObjects"):
93 self.globalObjects.update(setup.globalObjects)
94 if hasattr(setup,
"collections"):
95 self.collections.update(setup.collections)
98 v.makeBranch(tree, isMC)
99 for o
in self.globalObjects.itervalues():
100 o.makeBranches(tree, isMC)
101 for c
in self.collections.itervalues():
102 if type(c) == tuple: c = c[-1]
104 c.makeBranchesScalar(tree, isMC)
106 c.makeBranchesVector(tree, isMC)
109 """Here we fill the variables that we always want and that are hard-coded"""
110 tr.fill(
'run', event.input.eventAuxiliary().id().
run())
111 tr.fill(
'lumi',event.input.eventAuxiliary().id().luminosityBlock())
112 tr.fill(
'evt', event.input.eventAuxiliary().id().
event())
113 tr.fill(
'isData', 0
if isMC
else 1)
120 tr.fill(
'intLumi', getattr(self.cfg_comp,
'intLumi',1.0))
124 tr.fill(
'xsec', getattr(self.cfg_comp,
'xSection',1.0))
126 if hasattr(event,
"nPU"):
127 tr.fill(
"nTrueInt", event.nPU)
128 tr.fill(
"puWeight", event.puWeight)
130 tr.fill(
"nTrueInt", -1)
131 tr.fill(
"puWeight", 1.0)
133 tr.fill(
"genWeight", self.mchandles[
'GenInfo'].product().
weight())
135 if hasattr(event,
"pdfWeights") :
136 for (pdf,nvals)
in self.pdfWeights:
137 if len(event.pdfWeights[pdf]) != nvals:
138 raise RuntimeError(
"PDF lenght mismatch for %s, declared %d but the event has %d" % (pdf,nvals,event.pdfWeights[pdf]))
140 for i,w
in enumerate(event.pdfWeights[pdf]):
141 tr.fill(
'pdfWeight_%s_%d' % (pdf,i), w)
143 tr.vfill(
'pdfWeight_%s' % pdf, event.pdfWeights[pdf])
146 if hasattr(self.cfg_ana,
"filter") :
147 if not self.cfg_ana.filter(event) :
149 self.readCollections( event.input)
153 isMC = self.cfg_comp.isMC
154 if resetFirst: self.tree.reset()
159 if not isMC
and v.mcOnly:
continue
160 v.fillBranch(self.tree, event, isMC)
162 for on, o
in self.globalObjects.iteritems():
163 if not isMC
and o.mcOnly:
continue
164 o.fillBranches(self.tree, getattr(event, on), isMC)
166 for cn, c
in self.collections.iteritems():
167 if type(c) == tuple
and isinstance(c[0], AutoHandle):
168 if not isMC
and c[-1].mcOnly:
continue
169 objects = self.handles[cn].product()
170 setattr(event, cn, [objects[i]
for i
in xrange(objects.size())])
172 if not isMC
and c.mcOnly:
continue
174 c.fillBranchesScalar(self.tree, getattr(event, cn), isMC)
176 c.fillBranchesVector(self.tree, getattr(event, cn), isMC)
178 self.tree.tree.Fill()
182 This function produces a string that contains a Python wrapper for the event.
183 The wrapper is automatically generated based on the collections and allows the full
184 event contents to be accessed from subsequent Analyzers using e.g.
186 leps = event.selLeptons #is of type selLeptons
189 One just needs to add the EventAnalyzer to the sequence.
192 isMC = self.cfg_comp.isMC
196 anclass +=
"from PhysicsTools.HeppyCore.framework.analyzer import Analyzer\n"
197 anclass +=
"class EventAnalyzer(Analyzer):\n"
198 anclass +=
" def __init__(self, cfg_ana, cfg_comp, looperName):\n"
199 anclass +=
" super(EventAnalyzer, self).__init__(cfg_ana, cfg_comp, looperName)\n"
201 anclass +=
" def process(self, event):\n"
203 for cname, coll
in self.collections.items():
204 classes += coll.get_py_wrapper_class(isMC)
205 anclass +=
" event.{0} = {0}.make_array(event)\n".
format(coll.name)
207 return classes +
"\n" + anclass
def declareVariables
cross section
scalar
Read whether we want vectors or flat trees.
collections
Read whether we want 4-vectors.