Skip to content

Commit

Permalink
possibility to store variables with half-precision floats (16bits)
Browse files Browse the repository at this point in the history
  • Loading branch information
emanueledimarco committed Jul 18, 2018
1 parent 4a01229 commit 464c6dd
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 16 deletions.
21 changes: 11 additions & 10 deletions PhysicsTools/Heppy/python/analyzers/core/autovars.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class NTupleVariable:
- name, type, help, default: obvious
- function: a function that taken an object computes the value to fill (e.g. lambda event : len(event.goodVertices))
"""
def __init__(self, name, function, type=float, help="", default=-99, mcOnly=False, filler=None, nillable=False):
def __init__(self, name, function, type=float, help="", default=-99, mcOnly=False, filler=None, nillable=False, storageType="default"):
self.name = name
self.function = function
self.type = type
Expand All @@ -20,15 +20,16 @@ def __init__(self, name, function, type=float, help="", default=-99, mcOnly=Fals
self.mcOnly = mcOnly
self.filler = filler
self.nillable = nillable
self.storageType = storageType
def __call__(self,object):
ret = self.function(object)
return ret
def makeBranch(self,treeNumpy,isMC):
if self.mcOnly and not isMC: return
treeNumpy.var(self.name, type=self.type, default=self.default, title=self.help, filler=self.filler)
treeNumpy.var(self.name, type=self.type, default=self.default, title=self.help, storageType=self.storageType, filler=self.filler)
def fillBranch(self,treeNumpy,object,isMC):
if self.mcOnly and not isMC: return
treeNumpy.fill(self.name, self(object))
treeNumpy.fill(self.name, self(object), storageType=self.storageType)
def __repr__(self):
return "<NTupleVariable[%s]>" % self.name

Expand Down Expand Up @@ -62,7 +63,7 @@ def ownVars(self,isMC):
# ^-- lambda object : subvar(so(object)) doesn't work due to scoping, see
# http://stackoverflow.com/questions/2295290/what-do-lambda-function-closures-capture-in-python/2295372#2295372
type = subvar.type, help = subvar.help, default = subvar.default, mcOnly = subvar.mcOnly,
filler = subvar.filler))
filler = subvar.filler, storageType = subvar.storageType))
self._subObjectVars[isMC] = subvars
vars += self._subObjectVars[isMC]
return vars
Expand Down Expand Up @@ -151,15 +152,15 @@ def makeBranches(self,treeNumpy,isMC):
for v in allvars:
h = v.help
if self.help: h = "%s for %s" % ( h if h else v.name, self.help )
treeNumpy.var("%s_%s" % (self.name, v.name), type=v.type, default=v.default, title=h, filler=v.filler)
treeNumpy.var("%s_%s" % (self.name, v.name), type=v.type, default=v.default, title=h, filler=v.filler, storageType=v.storageType)
def fillBranches(self,treeNumpy,object,isMC):
if self.mcOnly and not isMC: return
if object is None:
if self.nillable: return
raise RuntimeError, "Error, object not found or None when filling branch %s" % self.name
allvars = self.objectType.allVars(isMC)
for v in allvars:
treeNumpy.fill("%s_%s" % (self.name, v.name), v(object))
treeNumpy.fill("%s_%s" % (self.name, v.name), v(object), storageType=v.storageType)
def __repr__(self):
return "<NTupleObject[%s]>" % self.name

Expand Down Expand Up @@ -188,7 +189,7 @@ def makeBranchesScalar(self,treeNumpy,isMC):
for i in xrange(1,self.maxlen+1):
h = v.help
if self.help: h = "%s for %s [%d]" % ( h if h else v.name, self.help, i-1 )
treeNumpy.var("%s%d_%s" % (self.name, i, v.name), type=v.type, default=v.default, title=h, filler=v.filler)
treeNumpy.var("%s%d_%s" % (self.name, i, v.name), type=v.type, default=v.default, title=h, storageType=v.storageType, filler=v.filler)
def makeBranchesVector(self,treeNumpy,isMC):
if not isMC and self.objectType.mcOnly: return
treeNumpy.var("n"+self.name, int)
Expand All @@ -197,7 +198,7 @@ def makeBranchesVector(self,treeNumpy,isMC):
h = v.help
if self.help: h = "%s for %s" % ( h if h else v.name, self.help )
name="%s_%s" % (self.name, v.name) if v.name != "" else self.name
treeNumpy.vector(name, "n"+self.name, self.maxlen, type=v.type, default=v.default, title=h, filler=v.filler)
treeNumpy.vector(name, "n"+self.name, self.maxlen, type=v.type, default=v.default, title=h, storageType=v.storageType, filler=v.filler)
def fillBranchesScalar(self,treeNumpy,collection,isMC):
if not isMC and self.objectType.mcOnly: return
if self.filter != None: collection = [ o for o in collection if self.filter(o) ]
Expand All @@ -209,7 +210,7 @@ def fillBranchesScalar(self,treeNumpy,collection,isMC):
for i in xrange(num):
o = collection[i]
for v in allvars:
treeNumpy.fill("%s%d_%s" % (self.name, i+1, v.name), v(o))
treeNumpy.fill("%s%d_%s" % (self.name, i+1, v.name), v(o), storageType=v.storageType)
def fillBranchesVector(self,treeNumpy,collection,isMC):
if not isMC and self.objectType.mcOnly: return
if self.filter != None: collection = [ o for o in collection if self.filter(o) ]
Expand All @@ -220,7 +221,7 @@ def fillBranchesVector(self,treeNumpy,collection,isMC):
allvars = self.objectType.allVars(isMC)
for v in allvars:
name="%s_%s" % (self.name, v.name) if v.name != "" else self.name
treeNumpy.vfill(name, [ v(collection[i]) for i in xrange(num) ])
treeNumpy.vfill(name, [ v(collection[i]) for i in xrange(num) ], storageType=v.storageType)
def __repr__(self):
return "<NTupleCollection[%s]>" % self.name

Expand Down
3 changes: 2 additions & 1 deletion PhysicsTools/Heppy/python/analyzers/gen/LHEWeightAnalyzer.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ class LHEWeightAnalyzer( Analyzer ):
"""
def __init__(self, cfg_ana, cfg_comp, looperName ):
super(LHEWeightAnalyzer,self).__init__(cfg_ana,cfg_comp,looperName)

self.normLHEWeights = getattr(cfg_ana, "normLHEWeights", False)
self.LHEWeightsNames=[]

def declareHandles(self):
Expand Down Expand Up @@ -66,6 +66,7 @@ def process(self, event):
# Check if id is string or int and convert to int if it's a string
try:
int(w.id)
if self.normLHEWeights: w.wgt = w.wgt/event.LHE_originalWeight
event.LHE_weights.append(w)
except ValueError:
if not type(w.id) == str:
Expand Down
11 changes: 6 additions & 5 deletions PhysicsTools/HeppyCore/python/statistics/tree.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def branch_(self, selfmap, varName, type, len, postfix="", storageType="default"
if storageType == "default":
storageType = self.defaultIntType if type is int else self.defaultFloatType
if type is float :
if storageType == "F":
if storageType in ["F","H"]:
selfmap[varName]=numpy.zeros(len,numpy.float32)
self.tree.Branch(varName,selfmap[varName],varName+postfix+'/F')
elif storageType == "D":
Expand Down Expand Up @@ -113,20 +113,21 @@ def reset(self):
if isinstance(value, ROOT.TObject) and value.ClassName() == "TClonesArray":
value.ExpandCreateFast(0)

def fill(self, varName, value ):
def fill(self, varName, value, storageType="default" ):
if isinstance(value,float) and storageType=="H": value=np.float16(value)
if isinstance(self.vars[varName], numpy.ndarray):
self.vars[varName][0]=value
else:
self.fillers[varName](self.vars[varName],value)

def vfill(self, varName, values ):
def vfill(self, varName, values, storageType="default" ):
a = self.vecvars[varName]
if isinstance(a, numpy.ndarray):
for (i,v) in enumerate(values):
a[i]=v
a[i]=numpy.float16(v) if storageType=="H" else v
else:
if isinstance(a, ROOT.TObject) and a.ClassName() == "TClonesArray":
a.ExpandCreateFast(len(values))
fillit = self.fillers[varName]
for (i,v) in enumerate(values):
fillit(a[i],v)
fillit(a[i],numpy.float16(v) if storageType=="H" else v)

0 comments on commit 464c6dd

Please sign in to comment.