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
[ ]: