Source code for feynml.interface.formcalc.insertions

import re
from dataclasses import dataclass
from typing import List

from feynml.interface.formcalc.feynmangraph import FeynmanGraph
from feynml.interface.formcalc.field import Field


[docs]@dataclass class Insertions: generic: FeynmanGraph classes: FeynmanGraph def get_pdgid(self, f: Field) -> int: for r in self.classes.rules: if f == r.lhs: return r.rhs.get_pdgid() raise Exception(f"Field {f} not found in Insertions {self}") def __str__(self): return f"Insertions[Generic][{self.generic} -> Insertions[Classes][{self.classes}]]" @classmethod def re(cls): rgraph = ( r"\s*Insertions\[Generic\]\[(" + FeynmanGraph.re() + r")\s*->\s*Insertions\[Classes\]\[(" + FeynmanGraph.re() + r")\]\]\s*" ) return rgraph
[docs] @classmethod def n(cls): """ Example >>> Insertions.n() == Insertions.re().count('(') - Insertions.re().count('(?') True """ return 1 + FeynmanGraph.n() + 1 + FeynmanGraph.n()
[docs] @classmethod def from_str(cls, insertions: str): """ Example >>> str(Insertions.from_str('Insertions[Generic][\ FeynmanGraph[1, Generic == 1][\ Field[1] -> F[3, {1, SequenceForm["Col", 1]}]] -> \ Insertions[Classes][\ FeynmanGraph[1, Classes == 1][\ Field[1] -> F[3, {1, SequenceForm["Col", 1]}]]]]')) 'Insertions[Generic][FeynmanGraph[1, Generic == 1][Field[1] -> F[3, {1, SequenceForm["Col", 1]}]] -> Insertions[Classes][FeynmanGraph[1, Classes == 1][Field[1] -> F[3, {1, SequenceForm["Col", 1]}]]]]' >>> str(Insertions.from_str('Insertions[Generic][\ FeynmanGraph[1, Generic == 1][\ Field[1] -> F[3, {1, SequenceForm["Col", 1]}], \ Field[2] -> -F[3, {1, SequenceForm["Col", 2]}], Field[3] -> V[1], \ Field[4] -> V[5, {\ SequenceForm["Glu", 4]}], Field[5] -> F] -> \ Insertions[Classes][\ FeynmanGraph[1, Classes == 1][\ Field[1] -> F[3, {1, SequenceForm["Col", 1]}], \ Field[2] -> -F[3, {1, SequenceForm["Col", 2]}], Field[3] -> V[1], \ Field[4] -> V[5, {\ SequenceForm["Glu", 4]}], \ Field[5] -> F[3, {1, SequenceForm["Col", 2]}]]]]')) 'Insertions[Generic][FeynmanGraph[1, Generic == 1][Field[1] -> F[3, {1, SequenceForm["Col", 1]}], Field[2] -> -F[3, {1, SequenceForm["Col", 2]}], Field[3] -> V[1], Field[4] -> V[5, {SequenceForm["Glu", 4]}], Field[5] -> F] -> Insertions[Classes][FeynmanGraph[1, Classes == 1][Field[1] -> F[3, {1, SequenceForm["Col", 1]}], Field[2] -> -F[3, {1, SequenceForm["Col", 2]}], Field[3] -> V[1], Field[4] -> V[5, {SequenceForm["Glu", 4]}], Field[5] -> F[3, {1, SequenceForm["Col", 2]}]]]]' """ res = re.search(cls.re(), insertions) return cls._handle_match(res) generic = FeynmanGraph.from_str(res.group(1)) # print(res.groups()) classes = None classes = FeynmanGraph.from_str(res.group(FeynmanGraph.n() + 2)) return Insertions(generic, classes)
@classmethod def _handle_match(cls, res): generic = FeynmanGraph.from_str(res.group(1)) classes = FeynmanGraph.from_str(res.group(FeynmanGraph.n() + 2)) return Insertions(generic, classes)