Source code for pyfeyn2.render.tikzfeynman

from pylatex import Command, Document, Section, Subsection
from pylatex.utils import NoEscape, italic

from pyfeyn2.render.latex import LatexRender
from pyfeyn2.render.render import Render

# converte FeynmanDiagram to tikz-feynman

[docs]type_map = { "gluon": "gluon", "ghost": "ghost", "photon": "boson", "boson": "boson", "fermion": "fermion", "anti fermion": "anti fermion", "charged boson": "charged boson", "anti charged boson": "anti charged boson", "scalar": "scalar", "charged scalar": "charged scalar", "anti charged scalar": "anti charged scalar", "majorana": "majorana", "anti majorana": "anti majorana", # SUSY "gaugino": "plain,boson", "chargino": "plain,boson", "neutralino": "plain,boson", "squark": "charged scalar", "slepton": "charged scalar", "gluino": "plain,gluon", }
[docs]def feynman_to_tikz_feynman(fd): src = "\\begin{tikzpicture}\n" src += "\\begin{feynman}\n" for v in fd.vertices: src += f"\t\\vertex ({v.id}) [label={v.label}] at ({v.x},{v.y});\n" for l in fd.legs: src += f"\t\\vertex ({l.id}) [label={l.label}] at ({l.x},{l.y});\n" src += "\t\\diagram*{\n" for p in fd.propagators: ttype = type_map[p.type] src += f"\t\t({p.source}) -- [{ttype}] ({p.target}),\n" for l in fd.legs: ttype = type_map[l.type] if l.sense == "incoming": src += f"\t\t({l.id}) -- [{ttype}] ({l.target}),\n" elif l.sense == "outgoing": src += f"\t\t({l.target}) -- [{ttype}] ({l.id}),\n" else: raise Exception("Unknown sense") src += "\t};\n" src += "\\end{feynman}\n" src += "\\end{tikzpicture}\n" return src
[docs]class TikzFeynmanRender(LatexRender): def __init__( self, fd, documentclass="standalone", document_options=["preview", "crop", "tikz"], *args, **kwargs, ): super().__init__( *args, fd=fd, documentclass=documentclass, document_options=document_options, **kwargs, ) self.preamble.append(Command("RequirePackage", "luatex85")) self.preamble.append( Command("usepackage", NoEscape("tikz-feynman"), "compat=1.1.0") ) self.set_src_diag(NoEscape(feynman_to_tikz_feynman(fd)))
[docs] def valid_type(typ): if typ.lower() in type_map: return True return False