can now read and write simple sfcf measurements
This commit is contained in:
parent
5ec34ad98b
commit
c3aa7577fb
7 changed files with 408 additions and 0 deletions
195
backlogger/input/sfcf.py
Normal file
195
backlogger/input/sfcf.py
Normal file
|
@ -0,0 +1,195 @@
|
|||
import pyerrors as pe
|
||||
import datalad.api as dl
|
||||
|
||||
|
||||
def read_param(path, project, file_in_project):
|
||||
"""
|
||||
Read the parameters from the sfcf file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
file : str
|
||||
The path to the sfcf file.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dict
|
||||
The parameters in the sfcf file.
|
||||
|
||||
"""
|
||||
|
||||
file = path + "/projects/" + project + '/' + file_in_project
|
||||
dl.get(file, dataset=path)
|
||||
with open(file, 'r') as f:
|
||||
lines = f.readlines()
|
||||
|
||||
params = {}
|
||||
params['wf_offsets'] = []
|
||||
params['wf_basis'] = []
|
||||
params['wf_coeff'] = []
|
||||
params['qr'] = {}
|
||||
params['mrr'] = []
|
||||
params['crr'] = []
|
||||
params['qs'] = {}
|
||||
params['mrs'] = []
|
||||
params['crs'] = []
|
||||
|
||||
for line in lines:
|
||||
if line.startswith('#'):
|
||||
continue
|
||||
if line.startswith('\n'):
|
||||
continue
|
||||
if line.startswith('wf_offsets'):
|
||||
num_wf_offsets = line.split()[1]
|
||||
for i in range(int(num_wf_offsets)):
|
||||
params['wf_offsets'].append([float(x) for x in lines[lines.index(line) + i + 1].split("#")[0].split()])
|
||||
|
||||
if line.startswith('wf_basis'):
|
||||
num_wf_basis = line.split()[1]
|
||||
for i in range(int(num_wf_basis)):
|
||||
params['wf_basis'].append([float(x) for x in lines[lines.index(line) + i + 1].split("#")[0].split()])
|
||||
|
||||
if line.startswith('wf_coeff'):
|
||||
num_wf_coeff = line.split()[1]
|
||||
for i in range(int(num_wf_coeff)):
|
||||
params['wf_coeff'].append([float(x) for x in lines[lines.index(line) + i + 1].split("#")[0].split()])
|
||||
|
||||
if line.startswith('qr'):
|
||||
num_qr = line.split()[1]
|
||||
for i in range(int(num_qr)):
|
||||
dat = lines[lines.index(line) + i + 1].split("#")[0].strip().split()[:-1]
|
||||
params['qr'][dat[0]] = {}
|
||||
params['qr'][dat[0]]['mass'] = float(dat[1])
|
||||
params['qr'][dat[0]]['thetas'] = [float(x) for x in dat[2:5]]
|
||||
|
||||
if line.startswith('mrr'):
|
||||
num_mrr = line.split()[1]
|
||||
for i in range(int(num_mrr)):
|
||||
params['mrr'].append(lines[lines.index(line) + i + 1].split("#")[0].strip())
|
||||
|
||||
if line.startswith('crr'):
|
||||
num_crr = line.split()[1]
|
||||
for i in range(int(num_crr)):
|
||||
params['crr'].append(lines[lines.index(line) + i + 1].split("#")[0].strip())
|
||||
|
||||
if line.startswith('qs'):
|
||||
num_qs = line.split()[1]
|
||||
for i in range(int(num_qs)):
|
||||
dat = lines[lines.index(line) + i + 1].split("#")[0].strip().split()[:-1]
|
||||
params['qs'][dat[0]] = {}
|
||||
params['qs'][dat[0]]['mass'] = float(dat[1])
|
||||
params['qs'][dat[0]]['thetas'] = [float(x) for x in dat[2:5]]
|
||||
|
||||
if line.startswith('mrs'):
|
||||
num_mrs = line.split()[1]
|
||||
for i in range(int(num_mrs)):
|
||||
params['mrs'].append(lines[lines.index(line) + i + 1].split("#")[0].strip())
|
||||
|
||||
if line.startswith('crs'):
|
||||
num_crs = line.split()[1]
|
||||
for i in range(int(num_crs)):
|
||||
params['mrs'].append(lines[lines.index(line) + i + 1].split("#")[0].strip())
|
||||
|
||||
# catch standard cases
|
||||
if params['wf_offsets'] == []:
|
||||
params['wf_offsets'] = [[0, 0, 0]]
|
||||
|
||||
if params['wf_coeff'] == []:
|
||||
params['wf_coeff'] = [[0, -1]]
|
||||
|
||||
return params
|
||||
|
||||
|
||||
def _map_params(params, spec_list):
|
||||
"""
|
||||
Map the extracted parameters to the extracted data.
|
||||
|
||||
"""
|
||||
|
||||
new_specs = {}
|
||||
# quarks
|
||||
quarks = spec_list[0].split(" ")
|
||||
|
||||
new_specs['quarks'] = (params['qr'][quarks[0]], params['qr'][quarks[1]])
|
||||
|
||||
# offset
|
||||
new_specs['offset'] = (params['wf_offsets'][int(spec_list[1])])
|
||||
# wf1
|
||||
contribs = []
|
||||
for i, coeff in enumerate(params['wf_coeff'][int(spec_list[2])]):
|
||||
if not coeff == 0:
|
||||
contrib = (coeff, params['wf_basis'][i])
|
||||
contribs.append(contrib)
|
||||
new_specs['wf1'] = contribs
|
||||
|
||||
if len(spec_list) == 4:
|
||||
# wf2
|
||||
contribs = []
|
||||
for i, coeff in enumerate(params['wf_coeff'][int(spec_list[3])]):
|
||||
if not coeff == 0:
|
||||
contrib = (coeff, params['wf_basis'][i])
|
||||
contribs.append(contrib)
|
||||
new_specs['wf2'] = contribs
|
||||
return new_specs
|
||||
|
||||
|
||||
def read_data(path, project, dir_in_project, prefix, param, version='1.0c', cfg_seperator='n', sep='/', **kwargs):
|
||||
"""
|
||||
Extract the data from the sfcf file.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dict
|
||||
The data from the sfcf file.
|
||||
|
||||
"""
|
||||
names = kwargs.get('names', None)
|
||||
corr_types = {
|
||||
'f_A': 'bi',
|
||||
'f_P': 'bi',
|
||||
'g_A': 'bi',
|
||||
'g_P': 'bi',
|
||||
'f_1': 'bb',
|
||||
'k_1': 'bb',
|
||||
}
|
||||
directory = path + "/projects/" + project + '/' + dir_in_project
|
||||
dl.get(directory, dataset=path)
|
||||
corr_type_list = []
|
||||
for corr_name in param['crr']:
|
||||
if corr_name not in corr_types:
|
||||
raise ValueError('Correlator type not known.')
|
||||
corr_type_list.append(corr_types[corr_name])
|
||||
|
||||
if not param['crr'] == []:
|
||||
if names is not None:
|
||||
data_crr = pe.input.sfcf.read_sfcf_multi(directory, prefix, param['crr'], param['mrr'], corr_type_list, range(len(param['wf_offsets'])),
|
||||
range(len(param['wf_basis'])), range(len(param['wf_basis'])), version, cfg_seperator, keyed_out=True, names=names)
|
||||
else:
|
||||
data_crr = pe.input.sfcf.read_sfcf_multi(directory, prefix, param['crr'], param['mrr'], corr_type_list, range(len(param['wf_offsets'])),
|
||||
range(len(param['wf_basis'])), range(len(param['wf_basis'])), version, cfg_seperator, keyed_out=True)
|
||||
|
||||
if not param['crs'] == []:
|
||||
data_crs = pe.input.sfcf.read_sfcf_multi(directory, param['crs'])
|
||||
|
||||
data = {}
|
||||
if not param['crr'] == []:
|
||||
for key in data_crr.keys():
|
||||
data[key] = data_crr[key]
|
||||
|
||||
if not param['crs'] == []:
|
||||
for key in data_crs.keys():
|
||||
data[key] = data_crs[key]
|
||||
|
||||
# sort data by correlator
|
||||
sorted_data = {}
|
||||
for key in data.keys():
|
||||
key_parts = key.split(sep)
|
||||
corr = key_parts[0]
|
||||
if corr_types[corr] == 'bi':
|
||||
specs = _map_params(param, key_parts[1:-1])
|
||||
else:
|
||||
specs = _map_params(param, key_parts[1:])
|
||||
if corr not in sorted_data:
|
||||
sorted_data[corr] = {}
|
||||
sorted_data[corr][sep.join(key_parts[1:])] = data[key]
|
||||
return sorted_data, specs
|
Loading…
Add table
Add a link
Reference in a new issue