CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
autovars.py
Go to the documentation of this file.
1 #!/bin/env python
2 #
3 # Objects to be used with AutoFillTreeProducer
4 #
5 # the variable declaration contains both the booking information and a function to fill the variable
6 #
7 # TODO: more documentation needed here!
8 
10  def __init__(self, name, function, type=float, help="", default=-99, mcOnly=False, filler=None):
11  self.name = name
12  self.function = function
13  self.type = type
14  self.help = help
15  self.default = default
16  self.mcOnly = mcOnly
17  self.filler = filler
18  def __call__(self,object):
19  ret = self.function(object)
20  return ret
21  def makeBranch(self,treeNumpy,isMC):
22  if self.mcOnly and not isMC: return
23  treeNumpy.var(self.name, type=self.type, default=self.default, title=self.help, filler=self.filler)
24  def fillBranch(self,treeNumpy,object,isMC):
25  if self.mcOnly and not isMC: return
26  treeNumpy.fill(self.name, self(object))
27  def __repr__(self):
28  return "<NTupleVariable[%s]>" % self.name
29 
31  def __init__(self,name,baseObjectTypes=[],mcOnly=[],variables=[]):
32  self.name = name
33  self.baseObjectTypes = baseObjectTypes
34  self.mcOnly = mcOnly
35  self.variables = variables
36  def ownVars(self,isMC):
37  """Return only my vars, not including the ones from the bases"""
38  return [ v for v in self.variables if (isMC or not v.mcOnly) ]
39  def allVars(self,isMC):
40  """Return all vars, including the base ones. Duplicate bases are not added twice"""
41  ret = []; names = {}
42  if not isMC and self.mcOnly: return []
43  for base in self.allBases():
44  if not isMC and base.mcOnly: continue
45  for var in base.ownVars(isMC):
46  if var.name in names: raise RuntimeError, "Duplicate definition of variable %s from %s and %s" % (var.name, base.name, names[var.name])
47  names[var.name] = base.name
48  ret.append(var)
49  for var in self.ownVars(isMC):
50  if var.name in names: raise RuntimeError, "Duplicate definition of variable %s from %s and %s" % (var.name, self.name, names[var.name])
51  names[var.name] = self.name
52  ret.append(var)
53  return ret
54  def allBases(self):
55  ret = []
56  for b in self.baseObjectTypes:
57  if b not in ret:
58  ret.append(b)
59  for b2 in b.allBases():
60  if b2 not in ret:
61  ret.append(b2)
62  return ret
63  def removeVariable(self,name):
64  self.variables = [ v for v in self.variables if v.name != name]
65  def __repr__(self):
66  return "<NTupleObjectType[%s]>" % self.name
67 
69  def __init__(self, name, objectType, help="", mcOnly=False):
70  self.name = name
71  self.objectType = objectType
72  self.mcOnly = mcOnly
73  self.help = ""
74  def makeBranches(self,treeNumpy,isMC):
75  if not isMC and self.mcOnly: return
76  allvars = self.objectType.allVars(isMC)
77  for v in allvars:
78  h = v.help
79  if self.help: h = "%s for %s" % ( h if h else v.name, self.help )
80  treeNumpy.var("%s_%s" % (self.name, v.name), type=v.type, default=v.default, title=h, filler=v.filler)
81  def fillBranches(self,treeNumpy,object,isMC):
82  if self.mcOnly and not isMC: return
83  allvars = self.objectType.allVars(isMC)
84  for v in allvars:
85  treeNumpy.fill("%s_%s" % (self.name, v.name), v(object))
86  def __repr__(self):
87  return "<NTupleObject[%s]>" % self.name
88 
89 
91  def __init__(self, name, objectType, maxlen, help="", mcOnly=False, sortAscendingBy=None, sortDescendingBy=None, filter=None):
92  self.name = name
93  self.objectType = objectType
94  self.maxlen = maxlen
95  self.help = help
96  if objectType.mcOnly and mcOnly == False:
97  print "collection %s is set to mcOnly since the type %s is mcOnly" % (name, objectType.name)
98  mcOnly = True
99  self.mcOnly = mcOnly
100  if sortAscendingBy != None and sortDescendingBy != None:
101  raise RuntimeError, "Cannot specify two sort conditions"
102  self.filter = filter
103  self.sortAscendingBy = sortAscendingBy
104  self.sortDescendingBy = sortDescendingBy
105  def makeBranchesScalar(self,treeNumpy,isMC):
106  if not isMC and self.objectType.mcOnly: return
107  treeNumpy.var("n"+self.name, int)
108  allvars = self.objectType.allVars(isMC)
109  for v in allvars:
110  for i in xrange(1,self.maxlen+1):
111  h = v.help
112  if self.help: h = "%s for %s [%d]" % ( h if h else v.name, self.help, i-1 )
113  treeNumpy.var("%s%d_%s" % (self.name, i, v.name), type=v.type, default=v.default, title=h, filler=v.filler)
114  def makeBranchesVector(self,treeNumpy,isMC):
115  if not isMC and self.objectType.mcOnly: return
116  treeNumpy.var("n"+self.name, int)
117  allvars = self.objectType.allVars(isMC)
118  for v in allvars:
119  h = v.help
120  if self.help: h = "%s for %s" % ( h if h else v.name, self.help )
121  name="%s_%s" % (self.name, v.name) if v.name != "" else self.name
122  treeNumpy.vector(name, "n"+self.name, self.maxlen, type=v.type, default=v.default, title=h, filler=v.filler)
123  def fillBranchesScalar(self,treeNumpy,collection,isMC):
124  if not isMC and self.objectType.mcOnly: return
125  if self.filter != None: collection = [ o for o in collection if self.filter(o) ]
126  if self.sortAscendingBy != None: collection = sorted(collection, key=self.sortAscendingBy)
127  if self.sortDescendingBy != None: collection = sorted(collection, key=self.sortDescendingBy, reverse=True)
128  num = min(self.maxlen,len(collection))
129  treeNumpy.fill("n"+self.name, num)
130  allvars = self.objectType.allVars(isMC)
131  for i in xrange(num):
132  o = collection[i]
133  for v in allvars:
134  treeNumpy.fill("%s%d_%s" % (self.name, i+1, v.name), v(o))
135  def fillBranchesVector(self,treeNumpy,collection,isMC):
136  if not isMC and self.objectType.mcOnly: return
137  if self.filter != None: collection = [ o for o in collection if self.filter(o) ]
138  if self.sortAscendingBy != None: collection = sorted(collection, key=self.sortAscendingBy)
139  if self.sortDescendingBy != None: collection = sorted(collection, key=self.sortDescendingBy, reverse=True)
140  num = min(self.maxlen,len(collection))
141  treeNumpy.fill("n"+self.name, num)
142  allvars = self.objectType.allVars(isMC)
143  for v in allvars:
144  name="%s_%s" % (self.name, v.name) if v.name != "" else self.name
145  treeNumpy.vfill(name, [ v(collection[i]) for i in xrange(num) ])
146  def __repr__(self):
147  return "<NTupleCollection[%s]>" % self.name
148 
149  def get_cpp_declaration(self, isMC):
150  s = []
151  for v in self.objectType.allVars(isMC):
152  s += ["{0} {1}__{2}[{3}];".format(v.type.__name__, self.name, v.name, self.maxlen)]
153  return "\n".join(s)
154 
155  def get_cpp_wrapper_class(self, isMC):
156  s = "class %s {\n" % self.name
157  s += "public:\n"
158  for v in self.objectType.allVars(isMC):
159  s += " {0} {1};\n".format(v.type.__name__, v.name)
160  s += "};\n"
161  return s
162 
163  def get_py_wrapper_class(self, isMC):
164  s = "class %s:\n" % self.name
165  s += " def __init__(self, tree, n):\n"
166  for v in self.objectType.allVars(isMC):
167  if len(v.name)>0:
168  s += " self.{0} = tree.{1}_{2}[n];\n".format(v.name, self.name, v.name)
169  else:
170  s += " self.{0} = tree.{0}[n];\n".format(self.name)
171 
172  s += " @staticmethod\n"
173  s += " def make_array(event):\n"
174  s += " return [{0}(event.input, i) for i in range(event.input.n{0})]\n".format(self.name)
175  return s
176 
177 
T min(T a, T b)
Definition: MathUtil.h:58
static std::string join(char **cmd)
Definition: RemoteFile.cc:18