feat: hadrons fourquark function can now read tensor operators

This commit is contained in:
Fabian Joswig 2022-02-25 16:41:02 +00:00
parent 24a0df6a2a
commit 542296099f

View file

@ -4,6 +4,7 @@ import h5py
import numpy as np import numpy as np
from ..obs import Obs, CObs from ..obs import Obs, CObs
from ..correlators import Corr from ..correlators import Corr
from ..dirac import epsilon_tensor_rank4
def _get_files(path, filestem, idl): def _get_files(path, filestem, idl):
@ -280,10 +281,14 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
for vertex in vertices: for vertex in vertices:
lorentz_names = _get_lorentz_names(vertex) lorentz_names = _get_lorentz_names(vertex)
for v_name in lorentz_names: for v_name in lorentz_names:
if vertex not in intermediate_dict: if v_name in [('SigmaXZ', 'SigmaYT'), ('SigmaYT', 'SigmaXZ')]:
intermediate_dict[vertex] = np.array(corr_data[v_name]) sign = -1
else: else:
intermediate_dict[vertex] += np.array(corr_data[v_name]) sign = 1
if vertex not in intermediate_dict:
intermediate_dict[vertex] = sign * np.array(corr_data[v_name])
else:
intermediate_dict[vertex] += sign * np.array(corr_data[v_name])
result_dict = {} result_dict = {}
@ -303,12 +308,27 @@ def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
def _get_lorentz_names(name): def _get_lorentz_names(name):
assert len(name) == 2 lorentz_index = ['X', 'Y', 'Z', 'T']
res = [] res = []
if not set(name) <= set(['S', 'P', 'V', 'A', 'T']): if name == "TT":
raise Exception("Name can only contain 'S', 'P', 'V', 'A' or 'T'") for i in range(4):
for j in range(i + 1, 4):
res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[i] + lorentz_index[j]))
return res
if name == "TTtilde":
for i in range(4):
for j in range(i + 1, 4):
for k in range(4):
for o in range(k + 1, 4):
fac = epsilon_tensor_rank4(i, j, k, o)
if not np.isclose(fac, 0.0):
res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[k] + lorentz_index[o]))
return res
assert len(name) == 2
if 'S' in name or 'P' in name: if 'S' in name or 'P' in name:
if not set(name) <= set(['S', 'P']): if not set(name) <= set(['S', 'P']):
@ -319,14 +339,9 @@ def _get_lorentz_names(name):
res.append((g_names[name[0]], g_names[name[1]])) res.append((g_names[name[0]], g_names[name[1]]))
elif 'T' in name:
if not set(name) <= set(['T']):
raise Exception("'" + name + "' is not a Lorentz scalar")
raise Exception("Tensor operators not yet implemented.")
else: else:
if not set(name) <= set(['V', 'A']): if not set(name) <= set(['V', 'A']):
raise Exception("'" + name + "' is not a Lorentz scalar") raise Exception("'" + name + "' is not a Lorentz scalar")
lorentz_index = ['X', 'Y', 'Z', 'T']
for ind in lorentz_index: for ind in lorentz_index:
res.append(('Gamma' + ind + (name[0] == 'A') * 'Gamma5', res.append(('Gamma' + ind + (name[0] == 'A') * 'Gamma5',