From 192ae46af2cc903c223f284bb0909d6b10e85851 Mon Sep 17 00:00:00 2001 From: Alexander Puck Neuwirth Date: Sat, 4 Nov 2023 15:47:01 +0100 Subject: [PATCH] First mermaid render working --- debug/demo.svg | 1 + debug/mermaid.ipynb | 127 +++++++++++++++++++++++++++++++++++ pyfeyn2/render/js/mermaid.py | 17 +++-- 3 files changed, 141 insertions(+), 4 deletions(-) create mode 100644 debug/demo.svg create mode 100644 debug/mermaid.ipynb diff --git a/debug/demo.svg b/debug/demo.svg new file mode 100644 index 000000000..a84ad617c --- /dev/null +++ b/debug/demo.svg @@ -0,0 +1 @@ +
vertex
vertex
leg
leg
leg
leg
diff --git a/debug/mermaid.ipynb b/debug/mermaid.ipynb new file mode 100644 index 000000000..dc8686ff6 --- /dev/null +++ b/debug/mermaid.ipynb @@ -0,0 +1,127 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "0979974d-ce8f-4ebb-8653-62335681e221", + "metadata": {}, + "outputs": [], + "source": [ + "import pyfeyn2\n", + "from feynml import *\n", + "from pyfeyn2.render.js.mermaid import MermaidRender" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "3a08b0f2-2131-4811-8486-c0a03cecd126", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "graph LR;\n", + "Vertex9(vertex);\n", + "Vertex10(vertex);\n", + "Leg12(leg);\n", + "Leg13(leg);\n", + "Leg14(leg);\n", + "Leg15(leg);\n", + "Leg12 --> Vertex9;\n", + "Leg13 --> Vertex9;\n", + "Vertex10 --> Leg14;\n", + "Vertex10 --> Leg15;\n", + "Vertex9 --> Vertex10;\n", + "\n", + "graph: graph LR;\n", + "Vertex9(vertex);\n", + "Vertex10(vertex);\n", + "Leg12(leg);\n", + "Leg13(leg);\n", + "Leg14(leg);\n", + "Leg15(leg);\n", + "Leg12 --> Vertex9;\n", + "Leg13 --> Vertex9;\n", + "Vertex10 --> Leg14;\n", + "Vertex10 --> Leg15;\n", + "Vertex9 --> Vertex10;\n", + "\n", + "b64: Z3JhcGggTFI7ClZlcnRleDkodmVydGV4KTsKVmVydGV4MTAodmVydGV4KTsKTGVnMTIobGVnKTsKTGVnMTMobGVnKTsKTGVnMTQobGVnKTsKTGVnMTUobGVnKTsKTGVnMTIgLS0+IFZlcnRleDk7CkxlZzEzIC0tPiBWZXJ0ZXg5OwpWZXJ0ZXgxMCAtLT4gTGVnMTQ7ClZlcnRleDEwIC0tPiBMZWcxNTsKVmVydGV4OSAtLT4gVmVydGV4MTA7Cg==\n" + ] + }, + { + "data": { + "image/svg+xml": [ + "
vertex
vertex
leg
leg
leg
leg
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "image/svg+xml": [ + "
vertex
vertex
leg
leg
leg
leg
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "\n", + "\n", + "fd = FeynmanDiagram().add(\n", + " v1 := Vertex(),\n", + " v2 := Vertex(),\n", + " Propagator(pdgid=23).connect(v1,v2),\n", + " Leg(pdgid=1,target=v1,sense='incoming'),\n", + " Leg(pdgid=-1,target=v1).with_incoming(),\n", + " Leg(pdgid=11,sense='outgoing').with_target(v2),\n", + " Leg(pdgid=-11).with_target(v2).with_outgoing(),\n", + ")\n", + "\n", + "\n", + "MermaidRender(fd).render(file=\"demo\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5060382d-34ca-4d23-862b-0deddc422fb0", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/pyfeyn2/render/js/mermaid.py b/pyfeyn2/render/js/mermaid.py index 9193ed5b1..0fb60de70 100644 --- a/pyfeyn2/render/js/mermaid.py +++ b/pyfeyn2/render/js/mermaid.py @@ -2,7 +2,7 @@ from typing import List import requests -from IPython.display import Image, display +from IPython.display import SVG, display from pyfeyn2.render.render import Render @@ -11,6 +11,8 @@ def mm(graph): graphbytes = graph.encode("utf8") base64_bytes = base64.b64encode(graphbytes) base64_string = base64_bytes.decode("ascii") + # print("graph: ", graph) + # print("b64: ", base64_string) r = requests.get("https://mermaid.ink/svg/" + base64_string) return r.content @@ -24,9 +26,15 @@ def feynman_to_mm(fd): for l in fd.legs: src += f"{l.id}(leg);\n" for l in fd.legs: - src += f"{l.id} --> {l.target};\n" + if l.is_incoming(): + src += f"{l.id} --> {l.target};\n" + elif l.is_outgoing(): + src += f"{l.target} --> {l.id};\n" + else: + raise Exception("Unknown leg sense. Should be either incoming or outgoing.") for p in fd.propagators: src += f"{p.source} --> {p.target};\n" + # print(src) return src @@ -37,7 +45,8 @@ def __init__( *args, **kwargs, ): - super().__init__(self, fd) + super().__init__(fd) + self.set_feynman_diagram(fd) def render( self, @@ -48,7 +57,7 @@ def render( if file: with open(file + ".svg", "wb") as f: f.write(svg) - img = Image(data=svg) + img = SVG(data=svg) if show: display(img) return img