Skip to content

SMEFT Wilson coefficient qqql not correctly symmetrized #129

@peterstangl

Description

@peterstangl

According to arXiv:1405.0486, Eqs. (10) and (13), the SMEFT Wilson coefficient C_qqql should satisfy

$C_{prst}^{qqql} + C_{rpst}^{qqql} = C_{sprt}^{qqql} + C_{srpt}^{qqql}$

The code below sets all non-redundant qqql coefficients to 1, uses smeftutil.wcxf2arrays_symmetrized to obtain the symmetrized coefficient in the redundant basis, and then evaluates the difference between the LHS and RHS in the equation above:

import numpy as np
from wilson import Wilson
from wilson.util import smeftutil

def check_qqql_sym(T):
    lhs = T + T.transpose(1,0,2,3)
    rhs = T.transpose(2,0,1,3) + T.transpose(2,1,0,3)
    return np.max(np.abs(lhs - rhs))

qqql_coefficients = [
    'qqql_1111',
    'qqql_1121',
    'qqql_1131',
    'qqql_1211',
    'qqql_1221',
    'qqql_1231',
    'qqql_1311',
    'qqql_1321',
    'qqql_1331',
    'qqql_2121',
    'qqql_2131',
    'qqql_2221',
    'qqql_2231',
    'qqql_2311',
    'qqql_2321',
    'qqql_2331',
    'qqql_3131',
    'qqql_3231',
    'qqql_3331',
]
wc = Wilson({k: 1 for k in qqql_coefficients}, 1000, 'SMEFT', 'Warsaw').wc

C_qqql_redundant_symmetrized = smeftutil.wcxf2arrays_symmetrized(wc.dict)['qqql']

print(check_qqql_sym(C_qqql_redundant_symmetrized))

The result should be close to 0, but is actually 0.5. There might be a bug in smeftutil.scale_8,

def scale_8(b):
"""Translations necessary for class-8 coefficients
to go from a basis with only non-redundant WCxf
operators to a basis where the Wilson coefficients are symmetrized like
the operators."""
a = np.array(b, copy=True, dtype=complex)
for i in range(3):
a[0, 0, 1, i] = 1 / 2 * b[0, 0, 1, i]
a[0, 0, 2, i] = 1 / 2 * b[0, 0, 2, i]
a[0, 1, 1, i] = 1 / 2 * b[0, 1, 1, i]
a[0, 1, 2, i] = (
2 / 3 * b[0, 1, 2, i]
- 1 / 6 * b[0, 2, 1, i]
- 1 / 6 * b[1, 0, 2, i]
+ 1 / 6 * b[1, 2, 0, i]
)
a[0, 2, 1, i] = (
-(1 / 6) * b[0, 1, 2, i]
+ 2 / 3 * b[0, 2, 1, i]
+ 1 / 6 * b[1, 0, 2, i]
+ 1 / 3 * b[1, 2, 0, i]
)
a[0, 2, 2, i] = 1 / 2 * b[0, 2, 2, i]
a[1, 0, 2, i] = (
-(1 / 6) * b[0, 1, 2, i]
+ 1 / 6 * b[0, 2, 1, i]
+ 2 / 3 * b[1, 0, 2, i]
- 1 / 6 * b[1, 2, 0, i]
)
a[1, 1, 2, i] = 1 / 2 * b[1, 1, 2, i]
a[1, 2, 0, i] = (
1 / 6 * b[0, 1, 2, i]
+ 1 / 3 * b[0, 2, 1, i]
- 1 / 6 * b[1, 0, 2, i]
+ 2 / 3 * b[1, 2, 0, i]
)
a[1, 2, 2, i] = 1 / 2 * b[1, 2, 2, i]
return a

and/or smeftutil.symmetrize_8,
def symmetrize_8(b):
"""Symmetrize class-8 coefficients.
Note that this function does not correctly take into account the
translation between a basis where Wilson coefficients are symmetrized
like the operators and the non-redundant WCxf basis!
"""
a = np.array(b, copy=True, dtype=complex)
a[1, 0, 0, 0] = a[0, 0, 1, 0]
a[1, 0, 0, 1] = a[0, 0, 1, 1]
a[1, 0, 0, 2] = a[0, 0, 1, 2]
a[1, 1, 0, 0] = a[0, 1, 1, 0]
a[1, 1, 0, 1] = a[0, 1, 1, 1]
a[1, 1, 0, 2] = a[0, 1, 1, 2]
a[2, 0, 0, 0] = a[0, 0, 2, 0]
a[2, 0, 0, 1] = a[0, 0, 2, 1]
a[2, 0, 0, 2] = a[0, 0, 2, 2]
a[2, 0, 1, 0] = a[1, 2, 0, 0] + a[1, 0, 2, 0] - a[0, 2, 1, 0]
a[2, 0, 1, 1] = a[1, 2, 0, 1] + a[1, 0, 2, 1] - a[0, 2, 1, 1]
a[2, 0, 1, 2] = a[1, 2, 0, 2] + a[1, 0, 2, 2] - a[0, 2, 1, 2]
a[2, 1, 0, 0] = a[0, 2, 1, 0] + a[0, 1, 2, 0] - a[1, 2, 0, 0]
a[2, 1, 0, 1] = a[0, 2, 1, 1] + a[0, 1, 2, 1] - a[1, 2, 0, 1]
a[2, 1, 0, 2] = a[0, 2, 1, 2] + a[0, 1, 2, 2] - a[1, 2, 0, 2]
a[2, 1, 1, 0] = a[1, 1, 2, 0]
a[2, 1, 1, 1] = a[1, 1, 2, 1]
a[2, 1, 1, 2] = a[1, 1, 2, 2]
a[2, 2, 0, 0] = a[0, 2, 2, 0]
a[2, 2, 0, 1] = a[0, 2, 2, 1]
a[2, 2, 0, 2] = a[0, 2, 2, 2]
a[2, 2, 1, 0] = a[1, 2, 2, 0]
a[2, 2, 1, 1] = a[1, 2, 2, 1]
a[2, 2, 1, 2] = a[1, 2, 2, 2]
return a

used in smeftutil.symmetrize_nonred,
def symmetrize_nonred(self, C):
"""Symmetrize the Wilson coefficient arrays.
This function takes into account the symmetry factors
that occur when transitioning from a basis with only non-redundant operators
(like in WCxf) to a basis where the Wilson coefficients are symmetrized
like the operators."""
C_symm = {}
C = self.pad_C(C)
for i, v in C.items():
if i in self.C_symm_keys.get(0, ()):
C_symm[i] = v.real
elif i in self.C_symm_keys.get(1, []) + self.C_symm_keys.get(
3, []
):
C_symm[i] = v # nothing to do
elif i in self.C_symm_keys.get(2, ()):
C_symm[i] = self.symmetrize_2(C[i])
elif i in self.C_symm_keys.get(4, ()):
C_symm[i] = self.symmetrize_4(C[i])
C_symm[i] = C_symm[i] / self._d_4
elif i in self.C_symm_keys.get(41, ()):
C_symm[i] = self.symmetrize_41(C[i])
C_symm[i] = C_symm[i] / self._d_4
elif i in self.C_symm_keys.get(5, ()):
C_symm[i] = self.symmetrize_5(C[i])
elif i in self.C_symm_keys.get(6, ()):
C_symm[i] = self.symmetrize_6(C[i])
C_symm[i] = C_symm[i] / self._d_6
elif i in self.C_symm_keys.get(7, ()):
C_symm[i] = self.symmetrize_7(C[i])
C_symm[i] = C_symm[i] / self._d_7
elif i in self.C_symm_keys.get(71, ()):
C_symm[i] = self.symmetrize_71(C[i])
C_symm[i] = C_symm[i] / self._d_7
elif i in self.C_symm_keys.get(8, ()):
C_symm[i] = self.scale_8(C[i])
C_symm[i] = self.symmetrize_8(C_symm[i])
elif i in self.C_symm_keys.get(9, ()):
C_symm[i] = self.symmetrize_9(C[i])
C_symm = self.unpad_C(C_symm)
return C_symm

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions