JHUGen MELA  v2.4.1
Matrix element calculations as used in JHUGen. MELA is an important tool that was used for the Higgs boson discovery and for precise measurements of its structure and interactions. Please see the website https://spin.pha.jhu.edu/ and papers cited there for more details, and kindly cite those papers when using this code.
pythonmelautils.py
Go to the documentation of this file.
1 from collections import OrderedDict
2 import os
3 import tempfile
4 
5 import ROOT
6 
7 def include(filename):
8  ROOT.gROOT.ProcessLine("#include <{}>".format(filename))
9 
10 def compile(filename, loadMELA=True):
11 
13  command = "echo '\n"
14  if loadMELA: command += ".x " + os.path.join(os.path.dirname(__file__), "..", "test", "loadMELA.C+") + "\n"
15  if filename: command += ".L " + filename + "+\n"
16  command += "' | root -l -b "
17  os.system(command)
18 
19  if filename: ROOT.gROOT.ProcessLine(".L {}+".format(filename))
20 
21 
22 class NamedTemporaryMacro(object):
23  def __init__(self):
24  self.f = tempfile.NamedTemporaryFile(suffix=".C", bufsize=0)
25  self.compiled = False
26  def write(self, contents):
27  self.f.write(contents)
28  self.compiled = False
29  def compile(self):
30  if not self.compiled:
31  compile(self.f.name)
32  self.compiled = True
33 
34 ROOT.gROOT.Macro(os.path.join(os.path.dirname(__file__), "..", "test", "loadMELA.C+"))
35 include("Mela.h")
36 include("TCouplingsBase.hh")
37 
38 #extract all the enums from the anonymous namespace in TCouplingsBase.hh
39 contents = """
40  #include <TCouplingsBase.hh>
41  #include <TMCFM.hh>
42 """
43 with open(os.path.join(os.path.dirname(__file__), "..", "interface", "TCouplingsBase.hh")) as f:
44  tcouplingsbasecontents = f.read()
45  for enumcontents in tcouplingsbasecontents.split("enum")[1:]:
46  enumcontents = enumcontents.strip()
47  assert enumcontents.startswith("{")
48  enumcontents = enumcontents.split("{")[1].split("}")[0]
49  for enumitem in enumcontents.split(","):
50  enumitem = enumitem.split("=")[0].strip()
51  contents += "\n auto py_"+enumitem+" = ::"+enumitem+";"
52 
53 tcouplingsbase = NamedTemporaryMacro()
54 tcouplingsbase.write(contents)
55 tcouplingsbase.compile()
56 
58  functionfiletemplate = """
59  #include <type_traits>
60  {includes}
61  auto {name}_getitem({cppargs}) -> std::remove_reference<decltype({cppvariable}[item])>::type {{return {cppvariable}[item];}}
62  void {name}_setitem({cppargs}, std::remove_reference<decltype({cppvariable}[item])>::type value) {{{cppvariable}[item] = value;}}
63  """
64 
65  uniqueids = []
66  functionfiles = {}
67  getitems = {}
68  setitems = {}
69 
70  def __init__(self, uniqueid, cppvariable, includes, othercppargs, *dimensions):
71 
72  self.uniqueid = uniqueid
73  for i in self.uniqueids:
74  if i == uniqueid:
75  raise ValueError("Two MultiDimensionalCppArrays can't have the same id\n{}".format(i, self.uniqueid))
76  self.uniqueids.append(uniqueid)
77 
78  self.cppvariable = cppvariable
79  self.dimensions = dimensions
80  self.ndim = len(self.dimensions)
81  if self.ndim == 0:
82  raise TypeError("Can't have a 0 dimensional array!")
83 
84  if self.ndim > 1:
85  self.subarrays = []
86  for i in range(dimensions[0]):
87  othercppargs["int index{}".format(len(dimensions))] = i
88  self.subarrays.append(
90  "{}_{}".format(self.uniqueid, i),
91  "{}[index{}]".format(cppvariable, len(dimensions)),
92  includes,
93  othercppargs,
94  *dimensions[1:]
95  )
96  )
97  else:
98  self.othercppargs = OrderedDict(othercppargs)
100  name="NAME",
101  cppvariable=self.cppvariable,
102  cppargs=",".join([key for key in self.othercppargs]+["int item"]),
103  includes="\n".join("#include <{}>".format(_) for _ in includes),
104  )
105  self.includes = includes
106  self.functionfile = self.getitem = self.setitem = None
107 
108  def writecpp(self, f=None):
109  if self.ndim > 1:
110  for subarray in self.subarrays:
111  f = subarray.writecpp(f)
112  return f
113 
114  if self.functionfilecontents not in self.functionfiles:
115  if f is None:
116  f = NamedTemporaryMacro()
117  self.functionfiles[self.functionfilecontents] = f
118  f.write(self.functionfilecontents.replace("NAME", self.uniqueid))
119  return f
120  else:
121  return self.functionfiles[self.functionfilecontents]
122 
123  def compilecpp(self, f):
124  if self.ndim > 1:
125  for subarray in self.subarrays:
126  subarray.compilecpp(f)
127  return
128 
129  if self.functionfilecontents not in self.getitems:
130  f.compile()
131  self.functionfiles[self.functionfilecontents] = f
132  self.getitems[self.functionfilecontents] = getattr(ROOT, "{}_getitem".format(self.uniqueid))
133  self.setitems[self.functionfilecontents] = getattr(ROOT, "{}_setitem".format(self.uniqueid))
134 
136  self.getitem = self.getitems[self.functionfilecontents]
137  self.setitem = self.setitems[self.functionfilecontents]
138 
139 
140  def __getitem__(self, item):
141  if self.ndim > 1:
142  return self.subarrays[item]
143  else:
144  if self.getitem is None: self.compilecpp(self.writecpp())
145  if item >= self.dimensions[0]:
146  raise IndexError("Index {} out of range (0-{})".format(item, self.dimensions[0]))
147  return self.getitem(*(list(self.othercppargs.values())+[item]))
148 
149  def __setitem__(self, item, value):
150  if self.ndim > 1:
151  raise TypeError("Need to specify all indices to write to the array.")
152  else:
153  if self.setitem is None: self.compilecpp()
154  if item >= self.dimensions[0]:
155  raise IndexError("Index {} out of range (0-{})".format(item, self.dimensions[0]))
156  self.setitem(*(list(self.othercppargs.values())+[item, value]))
157 
158 class SelfDParameter(object):
159  def __init__(self, arrayname, *indices):
160  self.arrayname = arrayname
161  self.indices = indices
162 
163  def __get__(self, obj, objtype):
164  if obj is None: return self
165  array = getattr(obj, self.arrayname)
166  if not self.indices: return array
167  for index in self.indices[:-1]:
168  array = array[index]
169  return array[self.indices[-1]]
170 
171  def __set__(self, obj, val):
172  if not self.indices: return setattr(obj, self.arrayname, val)
173  array = getattr(obj, self.arrayname)
174  for index in self.indices[:-1]:
175  array = array[index]
176  array[self.indices[-1]] = val
177 
178 class SelfDCoupling(object):
179  def __init__(self, arrayname, *indices):
180  self.arrayname = arrayname
181  self.indices = indices
182  self.real = SelfDParameter(arrayname, *indices+(0,))
183  self.imag = SelfDParameter(arrayname, *indices+(1,))
184 
185  def __get__(self, obj, objtype):
186  if obj is None: return self
187  #self.real does not call __get__ on real, because it's an instance variable not a class variable
188  return complex(self.real.__get__(obj, objtype), self.imag.__get__(obj, objtype))
189 
190  def __set__(self, obj, val):
191  self.real.__set__(obj, val.real)
192  self.imag.__set__(obj, val.imag)
193 
pythonmelautils.MultiDimensionalCppArray.setitems
dictionary setitems
Definition: pythonmelautils.py:68
pythonmelautils.NamedTemporaryMacro.write
def write(self, contents)
Definition: pythonmelautils.py:26
pythonmelautils.SelfDParameter.indices
indices
Definition: pythonmelautils.py:161
pythonmelautils.MultiDimensionalCppArray.getitems
dictionary getitems
Definition: pythonmelautils.py:67
pythonmelautils.MultiDimensionalCppArray.functionfiles
dictionary functionfiles
Definition: pythonmelautils.py:66
pythonmelautils.MultiDimensionalCppArray.cppvariable
cppvariable
Definition: pythonmelautils.py:78
pythonmelautils.SelfDCoupling
Definition: pythonmelautils.py:178
pythonmelautils.MultiDimensionalCppArray.functionfile
functionfile
Definition: pythonmelautils.py:106
pythonmelautils.MultiDimensionalCppArray.includes
includes
Definition: pythonmelautils.py:105
pythonmelautils.MultiDimensionalCppArray.setitem
setitem
Definition: pythonmelautils.py:106
pythonmelautils.SelfDCoupling.__set__
def __set__(self, obj, val)
Definition: pythonmelautils.py:190
pythonmelautils.include
def include(filename)
Definition: pythonmelautils.py:7
pythonmelautils.compile
def compile(filename, loadMELA=True)
Definition: pythonmelautils.py:10
pythonmelautils.MultiDimensionalCppArray.functionfiletemplate
string functionfiletemplate
Definition: pythonmelautils.py:58
pythonmelautils.MultiDimensionalCppArray.functionfilecontents
functionfilecontents
Definition: pythonmelautils.py:99
pythonmelautils.NamedTemporaryMacro.f
f
Definition: pythonmelautils.py:24
pythonmelautils.MultiDimensionalCppArray.writecpp
def writecpp(self, f=None)
Definition: pythonmelautils.py:108
pythonmelautils.NamedTemporaryMacro.__init__
def __init__(self)
Definition: pythonmelautils.py:23
pythonmelautils.NamedTemporaryMacro.compiled
compiled
Definition: pythonmelautils.py:25
pythonmelautils.SelfDParameter.__get__
def __get__(self, obj, objtype)
Definition: pythonmelautils.py:163
pythonmelautils.SelfDParameter.__set__
def __set__(self, obj, val)
Definition: pythonmelautils.py:171
pythonmelautils.NamedTemporaryMacro
Definition: pythonmelautils.py:22
pythonmelautils.SelfDCoupling.real
real
Definition: pythonmelautils.py:182
open
with open("/mnt/sda1/RandomRantings/JHU/Andrei_Research/DocumentingMELA/raw_couplings.txt") as f
Definition: write_bindings.txt:1
pythonmelautils.MultiDimensionalCppArray.__getitem__
def __getitem__(self, item)
Definition: pythonmelautils.py:140
pythonmelautils.MultiDimensionalCppArray.uniqueid
uniqueid
Definition: pythonmelautils.py:72
pythonmelautils.MultiDimensionalCppArray.uniqueids
list uniqueids
Definition: pythonmelautils.py:65
pythonmelautils.SelfDCoupling.__init__
def __init__(self, arrayname, *indices)
Definition: pythonmelautils.py:179
pythonmelautils.SelfDCoupling.indices
indices
Definition: pythonmelautils.py:181
pythonmelautils.SelfDParameter.arrayname
arrayname
Definition: pythonmelautils.py:160
pythonmelautils.SelfDCoupling.imag
imag
Definition: pythonmelautils.py:183
pythonmelautils.MultiDimensionalCppArray.dimensions
dimensions
Definition: pythonmelautils.py:79
pythonmelautils.MultiDimensionalCppArray.__init__
def __init__(self, uniqueid, cppvariable, includes, othercppargs, *dimensions)
Definition: pythonmelautils.py:70
pythonmelautils.MultiDimensionalCppArray
Definition: pythonmelautils.py:57
pythonmelautils.MultiDimensionalCppArray.getitem
getitem
Definition: pythonmelautils.py:106
pythonmelautils.MultiDimensionalCppArray.ndim
ndim
Definition: pythonmelautils.py:80
pythonmelautils.SelfDParameter.__init__
def __init__(self, arrayname, *indices)
Definition: pythonmelautils.py:159
pythonmelautils.MultiDimensionalCppArray.subarrays
subarrays
Definition: pythonmelautils.py:85
pythonmelautils.MultiDimensionalCppArray.compilecpp
def compilecpp(self, f)
Definition: pythonmelautils.py:123
pythonmelautils.MultiDimensionalCppArray.othercppargs
othercppargs
Definition: pythonmelautils.py:98
pythonmelautils.SelfDCoupling.__get__
def __get__(self, obj, objtype)
Definition: pythonmelautils.py:185
pythonmelautils.SelfDCoupling.arrayname
arrayname
Definition: pythonmelautils.py:180
pythonmelautils.SelfDParameter
Definition: pythonmelautils.py:158
pythonmelautils.NamedTemporaryMacro.compile
def compile(self)
Definition: pythonmelautils.py:29
pythonmelautils.MultiDimensionalCppArray.__setitem__
def __setitem__(self, item, value)
Definition: pythonmelautils.py:149