• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

APN-Pucky / feynamp / 9267239762

28 May 2024 09:53AM UTC coverage: 80.215% (-2.1%) from 82.348%
9267239762

Pull #67

github

APN-Pucky
fix: PREFACTOR
Pull Request #67: add: spin correlation

13 of 43 new or added lines in 5 files covered. (30.23%)

31 existing lines in 3 files now uncovered.

896 of 1117 relevant lines covered (80.21%)

0.8 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

93.84
/feynamp/form/momentum.py
1
import re
1✔
2
from typing import List
1✔
3

4
from feynml.feynmandiagram import FeynmanDiagram
1✔
5
from feynmodel.feyn_model import FeynModel
1✔
6

7
# from feynamp.form import *
8
from feynamp.form.form import init, run, run_parallel, string_to_form
1✔
9
from feynamp.leg import find_leg_in_model
1✔
10
from feynamp.log import warning
1✔
11
from feynamp.momentum import insert_mass, insert_momentum
1✔
12

13
momenta = """
1✔
14
repeat;
15
    id P(Mu1?,Moma?)*P(Mu1?,Momb?) = Moma.Momb;
16
endrepeat;
17
"""
18

19

20
def get_kinematics():
1✔
21
    return get_momenta() + get_denominators()
1✔
22

23

24
def apply_kinematics(string_expr):
1✔
25
    s = string_to_form(string_expr)
×
26
    return run(init + f"Local TMP = {s};" + get_kinematics())
×
27

28

29
def get_momenta():
1✔
30
    return momenta
1✔
31

32

33
def apply_momenta(string_expr):
1✔
34
    s = string_to_form(string_expr)
1✔
35
    return run(init + f"Local TMP = {s};" + momenta)
1✔
36

37

38
denominators = """
1✔
39
repeat;
40
    id Denom(Mom1?,Massa?) = Den(Mom1.Mom1-Massa^2);
41
endrepeat;
42
"""
43

44

45
def get_denominators():
1✔
46
    return denominators
1✔
47

48

49
def apply_denominators(string_expr):
1✔
50
    s = string_to_form(string_expr)
1✔
51
    return run(init + f"Local TMP = {s};" + denominators)
1✔
52

53

54
def apply_parallel(amps: List[str], operations: str):
1✔
55
    return run_parallel(init, operations, [string_to_form(a) for a in amps])
1✔
56

57

58
def apply(string_expr, str_a):
1✔
59
    s = string_to_form(string_expr)
1✔
60
    return run(init + f"Local TMP = {s};" + str_a)
1✔
61

62

63
def apply_den(string_expr, str_f):
1✔
64
    # re match all Dens
65
    s = string_expr
1✔
66
    # find all denominators
67
    res = re.findall(r"Den\(([a-zA-Z0-9_+*-\.^]+)\)", string_expr)
1✔
68

69
    # print(string_expr)
70
    # print("rDens: ", len(res), res)
71
    # only keep unique
72
    res = list(set(res))
1✔
73
    if res:
1✔
74
        new_gs = apply_parallel(res, str_f)
1✔
75
        # print("Dens: ", len(res), res)
76
        for og, g in zip(res, new_gs):
1✔
77
            s = s.replace("Den(" + og + ")", "1/(" + g + ")")
1✔
78
    return s
1✔
79

80

81
def get_onshell(fds: List[FeynmanDiagram], model: FeynModel):
1✔
82
    if isinstance(fds, FeynmanDiagram):
1✔
83
        warning(
1✔
84
            "get_onshell is deprecated, use get_onshell with list of FeynmanDiagram"
85
        )
86
        fds = [fds]
1✔
87
    r = ""
1✔
88
    # TODO might be redundant
89
    for fd in fds:
1✔
90
        for l in fd.legs:
1✔
91
            p = find_leg_in_model(fd, l, model)
1✔
92
            mom = insert_momentum(l.momentum.name)
1✔
93
            mass = insert_mass(string_to_form(p.mass.name))
1✔
94
            r += f"id {mom}.{mom} = {mass}^2;\n"
1✔
95
    return r
1✔
96

97

98
def apply_onshell(string_expr, fd, model):
1✔
99
    s = string_to_form(string_expr)
1✔
100
    return run(init + f"Local TMP = {s};" + get_onshell(fd, model))
1✔
101

102

103
def get_mandelstamm(fds: List[FeynmanDiagram], model: FeynModel, *args, **kwargs):
1✔
104
    if fds[0].get_externals_size() == (2, 2):
1✔
105
        return get_mandelstamm_2_to_2(fds, model, *args, **kwargs)
1✔
106
    elif fds[0].get_externals_size() == (2, 3):
1✔
107
        return get_mandelstamm_2_to_3(fds, model, *args, **kwargs)
1✔
108
    else:
109
        raise ValueError("Only 2 to 2 and 2 to 3 Mandelstamm are supported")
×
110

111

112
def get_mandelstamm_2_to_2(
1✔
113
    fds: List[FeynmanDiagram],
114
    model: FeynModel,
115
    replace_s=False,
116
    replace_t=False,
117
    replace_u=False,
118
):
119
    if isinstance(fds, FeynmanDiagram):
1✔
120
        warning(
1✔
121
            "get_onshell is deprecated, use get_onshell with list of FeynmanDiagram"
122
        )
123
        fds = [fds]
1✔
124
    r = ""
1✔
125
    for fd in fds:
1✔
126
        li = []
1✔
127
        lo = []
1✔
128
        for f in fd.legs:
1✔
129
            if f.is_incoming():
1✔
130
                li.append(f)
1✔
131
            elif f.is_outgoing():
1✔
132
                lo.append(f)
1✔
133
            else:
UNCOV
134
                raise ValueError("Leg is neither incoming nor outgoing")
×
135
        l1, l2 = li
1✔
136
        l3, l4 = lo
1✔
137
        p1 = find_leg_in_model(fd, l1, model)
1✔
138
        mom1 = insert_momentum(l1.momentum.name)
1✔
139
        mass1 = insert_mass(string_to_form(p1.mass.name))
1✔
140
        p2 = find_leg_in_model(fd, l2, model)
1✔
141
        mom2 = insert_momentum(l2.momentum.name)
1✔
142
        mass2 = insert_mass(string_to_form(p2.mass.name))
1✔
143
        p3 = find_leg_in_model(fd, l3, model)
1✔
144
        mom3 = insert_momentum(l3.momentum.name)
1✔
145
        mass3 = insert_mass(string_to_form(p3.mass.name))
1✔
146
        p4 = find_leg_in_model(fd, l4, model)
1✔
147
        mom4 = insert_momentum(l4.momentum.name)
1✔
148
        mass4 = insert_mass(string_to_form(p4.mass.name))
1✔
149
        r += f"id {mom1}.{mom2} = mss/2-{mass1}^2/2-{mass2}^2/2;\n"
1✔
150
        r += f"id {mom3}.{mom4} = mss/2-{mass3}^2/2-{mass4}^2/2;\n"
1✔
151
        r += f"id {mom1}.{mom3} = -mst/2+{mass1}^2/2+{mass3}^2/2;\n"
1✔
152
        r += f"id {mom4}.{mom2} = -mst/2+{mass4}^2/2+{mass2}^2/2;\n"
1✔
153
        r += f"id {mom1}.{mom4} = -msu/2+{mass1}^2/2+{mass4}^2/2;\n"
1✔
154
        r += f"id {mom2}.{mom3} = -msu/2+{mass2}^2/2+{mass3}^2/2;\n"
1✔
155
        if replace_s:
1✔
156
            r += f"id mss = -msu-mst+{mass2}^2+{mass3}^2+{mass4}^2+{mass1}^2;\n"
×
157
        if replace_t:
1✔
UNCOV
158
            r += f"id mst = -mss-msu+{mass2}^2+{mass3}^2+{mass4}^2+{mass1}^2;\n"
×
159
        if replace_u:
1✔
160
            r += f"id msu = -mss-mst+{mass2}^2+{mass3}^2+{mass4}^2+{mass1}^2;\n"
1✔
161
    return r
1✔
162

163

164
def get_mandelstamm_2_to_3(
1✔
165
    fds: List[FeynmanDiagram],
166
    model: FeynModel
167
    # , replace_s=False, replace_t=False, replace_u=False
168
):
169
    if isinstance(fds, FeynmanDiagram):
1✔
UNCOV
170
        warning(
×
171
            "get_onshell is deprecated, use get_onshell with list of FeynmanDiagram"
172
        )
UNCOV
173
        fds = [fds]
×
174
    r = ""
1✔
175

176
    for fd in fds:
1✔
177
        li = []
1✔
178
        lo = []
1✔
179
        for f in fd.legs:
1✔
180
            if f.is_incoming():
1✔
181
                li.append(f)
1✔
182
            elif f.is_outgoing():
1✔
183
                lo.append(f)
1✔
184
            else:
UNCOV
185
                raise ValueError("Leg is neither incoming nor outgoing")
×
186
        l1, l2 = li
1✔
187
        l3, l4, l5 = lo
1✔
188
        p1 = find_leg_in_model(fd, l1, model)
1✔
189
        mom1 = insert_momentum(l1.momentum.name)
1✔
190
        mass1 = insert_mass(string_to_form(p1.mass.name))
1✔
191
        p2 = find_leg_in_model(fd, l2, model)
1✔
192
        mom2 = insert_momentum(l2.momentum.name)
1✔
193
        mass2 = insert_mass(string_to_form(p2.mass.name))
1✔
194
        p3 = find_leg_in_model(fd, l3, model)
1✔
195
        mom3 = insert_momentum(l3.momentum.name)
1✔
196
        mass3 = insert_mass(string_to_form(p3.mass.name))
1✔
197
        p4 = find_leg_in_model(fd, l4, model)
1✔
198
        mom4 = insert_momentum(l4.momentum.name)
1✔
199
        mass4 = insert_mass(string_to_form(p4.mass.name))
1✔
200
        p5 = find_leg_in_model(fd, l5, model)
1✔
201
        mom5 = insert_momentum(l5.momentum.name)
1✔
202
        mass5 = insert_mass(string_to_form(p5.mass.name))
1✔
203

204
        # r += f"id {mom5} = {mom1} + {mom2} - {mom3} - {mom4};\n"
205
        r += f"id {mom1}.{mom2} = mss12/2-{mass1}^2/2-{mass2}^2/2;\n"
1✔
206
        r += f"id {mom3}.{mom4} = mss34/2-{mass3}^2/2-{mass4}^2/2;\n"
1✔
207
        r += f"id {mom3}.{mom5} = mss35/2-{mass3}^2/2-{mass5}^2/2;\n"
1✔
208
        r += f"id {mom4}.{mom5} = mss45/2-{mass4}^2/2-{mass5}^2/2;\n"
1✔
209

210
        r += f"id {mom1}.{mom3} = -mst13/2+{mass1}^2/2+{mass3}^2/2;\n"
1✔
211
        r += f"id {mom1}.{mom4} = -mst14/2+{mass1}^2/2+{mass4}^2/2;\n"
1✔
212
        r += f"id {mom1}.{mom5} = -mst15/2+{mass1}^2/2+{mass5}^2/2;\n"
1✔
213

214
        r += f"id {mom2}.{mom3} = -mst23/2+{mass2}^2/2+{mass3}^2/2;\n"
1✔
215
        r += f"id {mom2}.{mom4} = -mst24/2+{mass2}^2/2+{mass4}^2/2;\n"
1✔
216
        r += f"id {mom2}.{mom5} = -mst25/2+{mass2}^2/2+{mass5}^2/2;\n"
1✔
217

218
    return r
1✔
219

220

221
def apply_mandelstamm_2_to_2(
1✔
222
    string_expr,
223
    fd,
224
    model,
225
):
226
    s = string_to_form(string_expr)
1✔
227
    return run(init + f"Local TMP = {s};" + get_mandelstamm_2_to_2(fd, model))
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc