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")
p1.set_source(v1)
p1.set_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 id="p1" style="" pdgid="21" type="" source="v1" target="v2"/>
  <vertex id="v1" style=""/>
  <vertex id="v2" style=""/>
  <leg id="l1" style="" pdgid="21" type="" target="" sense=""/>
</diagram>

Write FeynML

[3]:
fml = FeynML(
        head=Head(
            metas=Meta(name="pyfeyn2", value="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 id="p1" style="" pdgid="21" type="" source="v1" target="v2"/>
    <vertex id="v1" style=""/>
    <vertex id="v2" style=""/>
    <leg id="l1" style="" pdgid="21" type="" target="" sense=""/>
  </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='P2', style=cssutils.css.CSSStyleDeclaration(cssText=''), pdgid=21, type='photon', latexname=None, bend=None, label='Z', momentum=None, tension=None, length=None, source='V0', target='V1'), Propagator(id='P4', style=cssutils.css.CSSStyleDeclaration(cssText=''), pdgid=21, type='fermion', latexname=None, bend=None, label=None, momentum=None, tension=None, length=None, source='V5', target='V1'), Propagator(id='P5', style=cssutils.css.CSSStyleDeclaration(cssText=''), pdgid=21, type='fermion', latexname=None, bend=None, label=None, momentum=None, tension=None, length=None, source='V1', target='V6'), Propagator(id='P7', style=cssutils.css.CSSStyleDeclaration(cssText='parallel-arrow-displace: 0.2'), pdgid=21, type='gluon', latexname=None, bend=0.5, label='g', momentum=None, tension=None, length=None, source='V5', target='V6')], vertices=[Vertex(id='V0', style=cssutils.css.CSSStyleDeclaration(cssText=''), x=-2.0, y=0.0, z=None, label=None), Vertex(id='V1', style=cssutils.css.CSSStyleDeclaration(cssText=''), x=2.0, y=0.0, z=None, label=None), Vertex(id='V5', style=cssutils.css.CSSStyleDeclaration(cssText=''), x=3.0, y=-1.0, z=None, label=None), Vertex(id='V6', style=cssutils.css.CSSStyleDeclaration(cssText=''), x=3.0, y=1.0, z=None, label=None)], legs=[Leg(id='E0', style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53'), pdgid=21, type='fermion', latexname=None, bend=None, label='e-', momentum=None, tension=None, length=None, target='V0', x=-4.0, y=2.0, z=None, sense='incoming'), Leg(id='E1', style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53; parallel-arrow-displace: -0.06; parallel-arrow-sense: -1'), pdgid=21, type='fermion', latexname=None, bend=None, label='e+', momentum=None, tension=None, length=None, target='V0', x=-4.0, y=-2.0, z=None, sense='outgoing'), Leg(id='E2', style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53; parallel-arrow-displace: -0.06; parallel-arrow-sense: -1'), pdgid=21, type='fermion', latexname=None, bend=None, label='q+', momentum=None, tension=None, length=None, target='V5', x=4.0, y=-2.0, z=None, sense='incoming'), Leg(id='E3', style=cssutils.css.CSSStyleDeclaration(cssText='arrow-pos: 0.53'), pdgid=21, type='fermion', latexname=None, bend=None, label='q-', momentum=None, tension=None, length=None, target='V6', x=4.0, y=2.0, z=None, sense='outgoing')], labels=[Label(id='L0', text='Drell-Yan QCD vertex correction', x=0.0, y=2.0, z=None)])])
../_images/feynml_FeynML_7_1.png
[ ]: