From 3e56d6e0f642da21fe59d82735168ef8a341f92a Mon Sep 17 00:00:00 2001 From: Alexander Puck Neuwirth Date: Sat, 2 Dec 2023 00:37:13 +0100 Subject: [PATCH] move ps to feynml --- docs/source/interfaces/madgraph/index.rst | 13 ++ pyfeyn2/interface/eps.py | 145 ---------------------- pyfeyn2/render/all.py | 2 +- pyfeyn2/render/latex/latex.py | 4 +- pyfeyn2/render/latex/tikzfeynman.py | 1 + pyfeyn2/render/{eps => ps}/madgraph.py | 0 tests/interface/born.ps | Bin 0 -> 13836 bytes tests/interface/born_matrix.ps | Bin 0 -> 12739 bytes tests/interface/loop_matrix.ps | Bin 0 -> 21951 bytes tests/interface/matrix_1.ps | Bin 0 -> 25738 bytes tests/interface/matrix_2.ps | Bin 0 -> 16093 bytes tests/interface/test_eps.py | 6 - tests/interface/test_ps.py | 43 +++++++ 13 files changed, 60 insertions(+), 154 deletions(-) delete mode 100644 pyfeyn2/interface/eps.py rename pyfeyn2/render/{eps => ps}/madgraph.py (100%) create mode 100644 tests/interface/born.ps create mode 100644 tests/interface/born_matrix.ps create mode 100644 tests/interface/loop_matrix.ps create mode 100644 tests/interface/matrix_1.ps create mode 100644 tests/interface/matrix_2.ps delete mode 100644 tests/interface/test_eps.py create mode 100644 tests/interface/test_ps.py diff --git a/docs/source/interfaces/madgraph/index.rst b/docs/source/interfaces/madgraph/index.rst index e26989321..f92d4c199 100644 --- a/docs/source/interfaces/madgraph/index.rst +++ b/docs/source/interfaces/madgraph/index.rst @@ -1,7 +1,20 @@ +======================================= +MadGraph Post-Script Reader +======================================= + +Transforms a MadGraph postscript file into a FeynML file. + +.. code-block:: python + + from feynml.interface.madgraph.ps import ps_to_feynml + fml = ps_to_feynml("tests/interface/lo.ps") + ======================================= MadGraph Export Plugin Integration ======================================= +Export FeynML files directly from MadGraph by following these steps: + .. code-block:: bash pip install --upgrade feynml[interfaces] diff --git a/pyfeyn2/interface/eps.py b/pyfeyn2/interface/eps.py deleted file mode 100644 index c085142d4..000000000 --- a/pyfeyn2/interface/eps.py +++ /dev/null @@ -1,145 +0,0 @@ -import re - -from feynml import FeynmanDiagram, FeynML, Head, Leg, Meta, Propagator, Vertex - -# TODO move this to feynml interface module - -# MadGraph -def eps_to_feynml(filename: str, Nincoming=2): - """Read Feynman diagram from eps file""" - - # read full file into string list - lines = "" - with open(filename, "r") as f: - lines = "".join(f.readlines()) - # drop all before "%%PageFonts: Helvetica" - # print(lines) - reg = re.search(r".*%%PageFonts: Helvetica(.*)%%trailer.*", lines, flags=re.DOTALL) - # print(reg.group(1)) - diags = reg.group(1).split("diagram") - # print(diags) - diagrams = [] - idd = 0 - for d in diags: - vertices = [] - lines = [] - legs = [] - props = [] - ll = d.split("\n") - for i, l in enumerate(ll): - match = re.search( - r"([0-9\.]+)\s([0-9\.]+)\s([0-9\.]+)\s([0-9\.]+)\s([0-9\.]+)?\s?F([a-zA-Z]+).*", - l, - flags=re.DOTALL, - ) - match2 = ( - re.search(r"\((.+)\)\s+show.*", ll[i + 2]) if i + 2 < len(ll) else None - ) - match3 = ( - re.search(r"\(([0-9]+)\)\s+show.*", ll[i + 4]) - if i + 4 < len(ll) - else None - ) - if match: - x1, y1, x2, y2 = ( - round(float(match.group(1)), 5), - round(float(match.group(2)), 5), - round(float(match.group(3)), 5), - round(float(match.group(4)), 5), - ) - line = match.group(6) - idd += 1 - id1 = idd - for v in vertices: - if x1 == v.x and y1 == v.y: - id1 = v.id - v1 = v - break - if id1 == idd: - vertices.append(v1 := Vertex(id=id1, x=x1, y=y1)) - idd += 1 - id2 = idd - for v in vertices: - if x2 == v.x and y2 == v.y: - id2 = v.id - v2 = v - break - if id2 == idd: - vertices.append(v2 := Vertex(id=id2, x=x2, y=y2)) - idd += 1 - plabel = None - num = None - if match2: - plabel = match2.group(1) - if plabel == "a": - plabel = "gamma" - if plabel == "z": - plabel = "Z0" - if match3: - num = int(match3.group(1)) - lines.append([idd, v1, v2, line, "prop", plabel, num]) - for l1 in lines: - inc = True - exl = True - for l2 in lines: - if l1 != l2: - if l1[1] == l2[1] or l1[1] == l2[2]: - inc = False - if l1[2] == l2[1] or l1[2] == l2[2]: - exl = False - if inc: - l1[4] = "incoming" if l1[6] <= Nincoming else "outgoing" - if l1[4] == "outgoing": - if l1[3] == "fermion": - l1[3] = "anti fermion" - legs.append( - Leg( - id=l1[0], - x=l1[1].x, - y=l1[1].y, - target=l1[2].id, - sense=l1[4], - type=l1[3], - name=l1[5], - ) - ) - vertices.remove(l1[1]) - elif exl: - l1[4] = "incoming" if l1[6] <= Nincoming else "outgoing" - if l1[4] == "incoming": - if l1[3] == "fermion": - l1[3] = "anti fermion" - legs.append( - Leg( - id=l1[0], - x=l1[2].x, - y=l1[2].y, - target=l1[1].id, - sense=l1[4], - type=l1[3], - name=l1[5], - ) - ) - vertices.remove(l1[2]) - elif not inc and not exl: - props.append( - Propagator( - id=l1[0], source=l1[1], target=l1[2], type=l1[3], name=l1[5] - ) - ) - elif inc and exl: - raise Exception("Unknown sense, seems stray") - else: - raise Exception("Unknown line case") - diagrams.append(FeynmanDiagram().add(*vertices, *legs, *props)) - - fml = FeynML( - head=Head( - metas=[ - Meta(name="pyfeyn2", content="test"), - Meta(name="description", content="Simple single test diagram"), - ], - ), - diagrams=diagrams, - ) - return fml diff --git a/pyfeyn2/render/all.py b/pyfeyn2/render/all.py index b2871ca30..03de46b50 100644 --- a/pyfeyn2/render/all.py +++ b/pyfeyn2/render/all.py @@ -9,13 +9,13 @@ from matplotlib import pyplot as plt from pylatex import Figure, NoEscape, SubFigure -from pyfeyn2.render.eps.madgraph import MadGraphRender from pyfeyn2.render.js.mermaid import MermaidRender from pyfeyn2.render.latex.dot import DotRender from pyfeyn2.render.latex.feynmp import FeynmpRender from pyfeyn2.render.latex.latex import LatexRender from pyfeyn2.render.latex.tikzfeynman import TikzFeynmanRender from pyfeyn2.render.mpl.feynmanrender import FeynmanRender +from pyfeyn2.render.ps.madgraph import MadGraphRender from pyfeyn2.render.pyx.pyxrender import PyxRender from pyfeyn2.render.text.ascii import ASCIIRender from pyfeyn2.render.text.asciipdf import ASCIIPDFRender diff --git a/pyfeyn2/render/latex/latex.py b/pyfeyn2/render/latex/latex.py index 3dfbceb1f..4ff2bf4fc 100644 --- a/pyfeyn2/render/latex/latex.py +++ b/pyfeyn2/render/latex/latex.py @@ -76,8 +76,8 @@ def render( # os.rename(tfile + ".pdf", file) # if delete: # os.remove(tfile + ".pdf") - if clean_up and temp_dir: - temp_dir.cleanup() if show: display(wi) + if clean_up and temp_dir: + temp_dir.cleanup() return wi diff --git a/pyfeyn2/render/latex/tikzfeynman.py b/pyfeyn2/render/latex/tikzfeynman.py index d8f3ba7ae..5a41b63c3 100644 --- a/pyfeyn2/render/latex/tikzfeynman.py +++ b/pyfeyn2/render/latex/tikzfeynman.py @@ -16,6 +16,7 @@ type_map = { "gluon": ["gluon"], "ghost": ["ghost"], + "anti ghost": ["ghost"], "photon": ["photon"], "boson": ["photon"], "fermion": ["fermion"], diff --git a/pyfeyn2/render/eps/madgraph.py b/pyfeyn2/render/ps/madgraph.py similarity index 100% rename from pyfeyn2/render/eps/madgraph.py rename to pyfeyn2/render/ps/madgraph.py diff --git a/tests/interface/born.ps b/tests/interface/born.ps new file mode 100644 index 0000000000000000000000000000000000000000..17b72f52f560abadeff616b855c84ffbaea561ca GIT binary patch literal 13836 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 C7tI*} literal 0 HcmV?d00001 diff --git a/tests/interface/loop_matrix.ps b/tests/interface/loop_matrix.ps new file mode 100644 index 0000000000000000000000000000000000000000..455fa909de2925350610b48cf1fc743bee1438f9 GIT binary patch literal 21951 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 X+axa1#OpI|qgr$N-&$|*n{WRMO2gVl literal 0 HcmV?d00001 diff --git a/tests/interface/matrix_2.ps b/tests/interface/matrix_2.ps new file mode 100644 index 0000000000000000000000000000000000000000..99c5215d3ff85aab7fd41318c351219e2dc50e75 GIT binary patch literal 16093 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 literal 0 HcmV?d00001 diff --git a/tests/interface/test_eps.py b/tests/interface/test_eps.py deleted file mode 100644 index f0f47e880..000000000 --- a/tests/interface/test_eps.py +++ /dev/null @@ -1,6 +0,0 @@ -from pyfeyn2.interface.eps import eps_to_feynml - - -def test_load_eps(): - fml = eps_to_feynml("tests/interface/lo.ps") - assert fml != None diff --git a/tests/interface/test_ps.py b/tests/interface/test_ps.py new file mode 100644 index 000000000..2bbef5dcf --- /dev/null +++ b/tests/interface/test_ps.py @@ -0,0 +1,43 @@ +from feynml.interface.madgraph.ps import ps_to_feynml + + +def test_load_ps_lo(): + fml = ps_to_feynml("tests/interface/lo.ps") + assert fml != None + assert len(fml.diagrams) == 2 + fml.render() + + +def test_load_ps_born(): + fml = ps_to_feynml("tests/interface/born.ps") + assert fml != None + assert len(fml.diagrams) == 3 + fml.render() + + +def test_load_ps_born_matrix(): + fml = ps_to_feynml("tests/interface/born_matrix.ps") + assert fml != None + assert len(fml.diagrams) == 1 + fml.render() + + +def test_load_ps_matrix_1(): + fml = ps_to_feynml("tests/interface/matrix_1.ps") + assert fml != None + assert len(fml.diagrams) == 6 + 6 + 4 + fml.render() + + +def test_load_ps_matrix_2(): + fml = ps_to_feynml("tests/interface/matrix_2.ps") + assert fml != None + assert len(fml.diagrams) == 5 + fml.render() + + +def test_load_ps_loop_matrix(): + fml = ps_to_feynml("tests/interface/loop_matrix.ps") + assert fml != None + assert len(fml.diagrams) == 6 + 5 + fml.render()