Write FeynmanDiagram

Convenient saving and loading of style independent feynman diagrams as XML or FeynML.

[1]:
from xsdata.formats.dataclass.parsers import XmlParser
from xsdata.formats.dataclass.serializers import XmlSerializer
from xsdata.formats.dataclass.serializers.config import SerializerConfig

from pyfeyn2.feynmandiagram import (
    FeynmanDiagram,
    FeynML,
    Head,
    Leg,
    Meta,
    Propagator,
    Vertex,
)
[2]:
fd = FeynmanDiagram()
v1 = Vertex("v1")
v2 = Vertex("v2")
p1 = Propagator("p1")
l1 = Leg("l1").with_incoming()
p1.with_source(v1)
p1.with_target(v2)
fd.propagators.append(p1)
fd.vertices.append(v1)
fd.vertices.append(v2)
fd.legs.append(l1)

config = SerializerConfig(pretty_print=True)
serializer = XmlSerializer(config=config)
print(serializer.render(fd))
<?xml version="1.0" encoding="UTF-8"?>
<diagram>
  <propagator style="">
    <id>p1</id>
    <source>v1</source>
    <target>v2</target>
  </propagator>
  <vertex style="">
    <id>v1</id>
  </vertex>
  <vertex style="">
    <id>v2</id>
  </vertex>
  <leg style="">
    <id>l1</id>
    <target/>
    <sense>incoming</sense>
  </leg>
</diagram>

Write FeynML

[3]:
fml = FeynML(
        head=Head(
            metas=[Meta(name="pyfeyn2", content="test")],
            description="Simple single test diagram",
        ),
        diagrams=fd,
    )

config = SerializerConfig(pretty_print=True)
serializer = XmlSerializer(config=config)
print(serializer.render(fml))
<?xml version="1.0" encoding="UTF-8"?>
<feynml>
  <head>
    <meta name="pyfeyn2" value="test"/>
    <description>Simple single test diagram</description>
  </head>
  <diagram>
    <propagator style="">
      <id>p1</id>
      <source>v1</source>
      <target>v2</target>
    </propagator>
    <vertex style="">
      <id>v1</id>
    </vertex>
    <vertex style="">
      <id>v2</id>
    </vertex>
    <leg style="">
      <id>l1</id>
      <target/>
      <sense>incoming</sense>
    </leg>
  </diagram>
</feynml>

Read FeynML

[4]:
from pathlib import Path
from pyfeyn2.render.pyx.pyxrender import PyxRender

xml_string = Path("test.fml").read_text()
parser = XmlParser()
fml = parser.from_string(xml_string, FeynML)
print(fml)
wimg = PyxRender(fml.diagrams[0]).render()
FeynML(head=[Head(metas=[Meta(name='creator', value='PyFeyn')], description='\n   A sample diagram showing a QCD correction to the Drell-Yan process.\n   ')], diagrams=[FeynmanDiagram(propagators=[Propagator(id='Propagator5', id2=None, pdgid=None, name=None, type='photon', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), bend=None, label='Z', momentum=None, tension=None, length=None, source='', target=''), Propagator(id='Propagator7', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), bend=None, label=None, momentum=None, tension=None, length=None, source='', target=''), Propagator(id='Propagator9', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), bend=None, label=None, momentum=None, tension=None, length=None, source='', target=''), Propagator(id='Propagator10', id2=None, pdgid=None, name=None, type='gluon', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText='parallel-arrow-displace: 0.2'), bend=0.5, label='g', momentum=None, tension=None, length=None, source='', target='')], vertices=[Vertex(id='Vertex1', id2=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), x=-2.0, y=0.0, z=None, label=None), Vertex(id='Vertex2', id2=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), x=2.0, y=0.0, z=None, label=None), Vertex(id='Vertex6', id2=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), x=3.0, y=-1.0, z=None, label=None), Vertex(id='Vertex8', id2=None, style=cssutils.css.CSSStyleDeclaration(cssText=''), x=3.0, y=1.0, z=None, label=None)], legs=[Leg(id='Leg3', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53'), bend=None, label='e-', momentum=None, tension=None, length=None, target='', x=-4.0, y=2.0, z=None, sense=''), Leg(id='Leg4', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53; parallel-arrow-displace: -0.06; parallel-arrow-sense: -1'), bend=None, label='e+', momentum=None, tension=None, length=None, target='', x=-4.0, y=-2.0, z=None, sense=''), Leg(id='Leg11', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53; parallel-arrow-displace: -0.06; parallel-arrow-sense: -1'), bend=None, label='q+', momentum=None, tension=None, length=None, target='', x=4.0, y=-2.0, z=None, sense=''), Leg(id='Leg12', id2=None, pdgid=None, name=None, type='fermion', particle=None, style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53'), bend=None, label='q-', momentum=None, tension=None, length=None, target='', x=4.0, y=2.0, z=None, sense='')], labels=[Label(id='Label0', id2=None, text='Drell-Yan QCD vertex correction', x=0.0, y=2.0, z=None)])])
---------------------------------------------------------------------------
UnboundLocalError                         Traceback (most recent call last)
Cell In[4], line 8
      6 fml = parser.from_string(xml_string, FeynML)
      7 print(fml)
----> 8 wimg = PyxRender(fml.diagrams[0]).render()

File ~/data/de.neuwirthinformatik.Alexander/Development/git/pyfeyn2/pyfeyn2/render/pyx/pyxrender.py:38, in PyxRender.render(self, file, show, resolution, width, height, clean_up)
     36 elif l.sense[:3] == "out" or l.sense[:9] == "anti-in":
     37     nl = NamedLine[l.type](Point(tar.x, tar.y), Point(l.x, l.y))
---> 38 nl = nl.bend(l.bend)
     39 nl = self.apply_layout(v.raw_style(), nl)
     40 nl = nl.addLabel(l.label)

UnboundLocalError: local variable 'nl' referenced before assignment
[ ]: