forked from IPKM/nmreval
newer FC scripts are working, now older ones fail
This commit is contained in:
parent
3793f67951
commit
29518b9ea0
@ -42,6 +42,7 @@ AppDir:
|
||||
- python3.9-minimal
|
||||
- python3-numpy
|
||||
- python3-scipy
|
||||
- gnuplot-nox
|
||||
- python3-bsddb3
|
||||
- python3-h5py
|
||||
- python3-pyqt5
|
||||
@ -57,7 +58,6 @@ AppDir:
|
||||
- qtbase5-dev-tools
|
||||
- qtchooser
|
||||
- pyqt5-dev-tools
|
||||
- qtchooser
|
||||
- libavahi-client3
|
||||
- libavahi-common-data
|
||||
- libavahi-common3
|
||||
|
@ -2,6 +2,7 @@ from __future__ import annotations
|
||||
|
||||
import pathlib
|
||||
|
||||
from matplotlib import pyplot as plt
|
||||
# import matplotlib.pyplot as plt
|
||||
from scipy.optimize import curve_fit
|
||||
import numpy as np
|
||||
@ -14,6 +15,7 @@ from nmreval.utils.utils import get_temperature, roundrobin
|
||||
|
||||
class FCReader:
|
||||
def __init__(self, fname: (list | str | pathlib.Path)):
|
||||
print('Hello')
|
||||
if isinstance(fname, (str, pathlib.Path)):
|
||||
self.fnames = [fname]
|
||||
else:
|
||||
@ -25,8 +27,6 @@ class FCReader:
|
||||
self.t_params = {}
|
||||
self.f_params = {}
|
||||
|
||||
self._scipt_type = 'old'
|
||||
|
||||
def __call__(self, fname: (list | str | pathlib.Path)):
|
||||
if isinstance(fname, (str, pathlib.Path)):
|
||||
self.fnames = [fname]
|
||||
@ -77,7 +77,14 @@ class FCReader:
|
||||
def _read_from_hdf(self, filename: (str | pathlib.Path)) -> dict:
|
||||
_temp = {}
|
||||
reader = HdfReader(filename)
|
||||
mag_directory = 'mag' if self._scipt_type == 'old' else 'Magnetization'
|
||||
|
||||
mag_directory = 'Magnetization'
|
||||
for m in ['Magnetization', 'mag']:
|
||||
try:
|
||||
mag_directory = m
|
||||
except KeyError:
|
||||
continue
|
||||
|
||||
for mag in reader.get_selected(mag_directory, dtype='points'):
|
||||
_temp[mag.value] = mag
|
||||
|
||||
@ -97,21 +104,15 @@ class FCReader:
|
||||
|
||||
return _temp
|
||||
|
||||
@staticmethod
|
||||
def _read_signals(filename, region: tuple = None) -> dict:
|
||||
def _read_signals(self, filename, region: tuple = None) -> dict:
|
||||
reader = HdfReader(filename)
|
||||
start = 0
|
||||
stop = 30e-5
|
||||
|
||||
# This is one set with attributes to find default start:stop values
|
||||
try:
|
||||
# This is one set with attributes to find default start:stop values (with some
|
||||
p = reader.parameters('/ABS_ACC_FID')
|
||||
start = p['start']
|
||||
stop = p['stop']
|
||||
except:
|
||||
pass
|
||||
start = p.get('stainte') or p.get('start') or 0
|
||||
stop = p.get('stointe') or p.get('stop') or 30e-5
|
||||
|
||||
if region is None:
|
||||
if region == (None, None) or region is None:
|
||||
region = (start, stop)
|
||||
|
||||
if region[0] is None:
|
||||
@ -119,15 +120,35 @@ class FCReader:
|
||||
if region[1] is None:
|
||||
region = (region[0], stop)
|
||||
|
||||
sig = reader.get_selected('/data/B=*/ACC_ABS_FID*', dtype='signal')
|
||||
_temp = {}
|
||||
for s in sig:
|
||||
pts = s.points([region])
|
||||
b = s.group
|
||||
if b not in _temp:
|
||||
_temp[b] = []
|
||||
bevo_groups = reader['data'].children
|
||||
for grp in bevo_groups.values():
|
||||
for k in grp.data():
|
||||
print(k)
|
||||
if str(k.parent) != 'ACC_ABS_FID_sig (group)':
|
||||
continue
|
||||
|
||||
_temp[b].append([s.value, *[pp[1] for pp in pts]])
|
||||
print(k.path, k, k.parent, k.parameter['bevo'], k.parameter['tevo'])
|
||||
bevo = k.parameter['bevo']
|
||||
tevo = k.parameter['tevo']
|
||||
|
||||
s = reader.make_signal(k, flag='fid', value='tevo', group='bevo')
|
||||
pts = s.points([region])
|
||||
|
||||
if bevo not in _temp:
|
||||
_temp[bevo] = []
|
||||
|
||||
_temp[bevo].append((tevo, *[pp[1] for pp in pts]))
|
||||
|
||||
# sig = reader.get_selected('/data/B=*/ACC_ABS_FID*', dtype='signal')
|
||||
# _temp = {}
|
||||
# for s in sig:
|
||||
# pts = s.points([region])
|
||||
# b = s.group
|
||||
# if b not in _temp:
|
||||
# _temp[b] = []
|
||||
#
|
||||
# _temp[b].append([s.value, *[pp[1] for pp in pts]])
|
||||
|
||||
for b, m in sorted(_temp.items()):
|
||||
m = np.array(m)
|
||||
@ -148,9 +169,9 @@ class FCReader:
|
||||
fit_path = fname_no_ext.joinpath('fit')
|
||||
fit_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# if save_fig:
|
||||
# image_path = fname_no_ext.joinpath('png')
|
||||
# image_path.mkdir(parents=True, exist_ok=True)
|
||||
if save_fig:
|
||||
image_path = fname_no_ext.joinpath('png')
|
||||
image_path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
header = 'm0\tt1\tbeta\toff\n'
|
||||
|
||||
@ -189,16 +210,16 @@ class FCReader:
|
||||
np.savetxt(fit_path.joinpath(save_name), np.c_[xplot, yplot],
|
||||
header=header+'\t'.join([f'{p}+/-{err}' for p, err in zip(p0, perr)]))
|
||||
|
||||
# if save_fig:
|
||||
# fig, ax = plt.subplots()
|
||||
# ax.set_xlabel('t / s')
|
||||
# ax.set_ylabel('M')
|
||||
# axheader = f'T1: {p0[2]:.4g}(+/-{perr[2]:.4g}) beta: {p0[3]:.4g}(+/-{perr[3]:.4g})'
|
||||
# ax.set_title(f'f = {k:.4g} Hz\n{axheader}')
|
||||
# ax.semilogx(v.x, v.y, 'o')
|
||||
# ax.semilogx(xplot, yplot, '-')
|
||||
# fig.savefig(image_path.joinpath(save_name).with_suffix('.png'))
|
||||
# plt.close(fig)
|
||||
if save_fig:
|
||||
fig, ax = plt.subplots()
|
||||
ax.set_xlabel('t / s')
|
||||
ax.set_ylabel('M')
|
||||
axheader = f'T1: {p0[2]:.4g}(+/-{perr[2]:.4g}) beta: {p0[3]:.4g}(+/-{perr[3]:.4g})'
|
||||
ax.set_title(f'f = {k:.4g} Hz\n{axheader}')
|
||||
ax.semilogx(v.x, v.y, 'o')
|
||||
ax.semilogx(xplot, yplot, '-')
|
||||
fig.savefig(image_path.joinpath(save_name).with_suffix('.png'))
|
||||
plt.close(fig)
|
||||
|
||||
freqs = np.asanyarray(freqs)
|
||||
params = np.asanyarray(params)
|
||||
@ -290,45 +311,45 @@ class FCReader:
|
||||
path = pathlib.Path(path)
|
||||
path.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# fig_mag, ax_mag = plt.subplots()
|
||||
# fig_t1, ax_t1 = plt.subplots()
|
||||
# fig_beta, ax_beta = plt.subplots()
|
||||
#
|
||||
# if kind == 'temp':
|
||||
# _params = self.t_params
|
||||
# else:
|
||||
# _params = self.f_params
|
||||
#
|
||||
# save_path = path.joinpath(kind)
|
||||
# if not save_path.exists():
|
||||
# save_path.mkdir(parents=True)
|
||||
#
|
||||
# for key, par in _params.items():
|
||||
# pl, = ax_mag.plot(par[:, 0], par[:, 1], 'o', label=key)
|
||||
# ax_mag.plot(par[:, 0], par[:, 3], 's', color=pl.get_color())
|
||||
# ax_t1.plot(par[:, 0], par[:, 5], 'o', label=key)
|
||||
# ax_beta.plot(par[:, 0], par[:, 7], 'o', label=key)
|
||||
#
|
||||
# for a in [ax_mag, ax_t1, ax_beta]:
|
||||
# if kind == 'freq':
|
||||
# a.legend(loc='upper left', bbox_to_anchor=(1, 1), ncol=2)
|
||||
# a.set_xlabel('T / K')
|
||||
# else:
|
||||
# a.set_xscale('log')
|
||||
# a.legend(loc='upper left', bbox_to_anchor=(1, 1))
|
||||
# a.set_xlabel('f / Hz')
|
||||
#
|
||||
# ax_t1.set_yscale('log')
|
||||
# ax_t1.set_ylabel('T1 / s')
|
||||
# ax_beta.set_ylabel('beta')
|
||||
# ax_mag.set_ylabel('M0 (squares), Offset (circles)')
|
||||
#
|
||||
# fig_beta.savefig(path.joinpath(f'beta_{kind}.png'), bbox_inches="tight")
|
||||
# fig_mag.savefig(path.joinpath(f'mag_{kind}.png'), bbox_inches="tight")
|
||||
# fig_t1.savefig(path.joinpath(f't1_{kind}.png'), bbox_inches="tight")
|
||||
# plt.close(fig_mag)
|
||||
# plt.close(fig_beta)
|
||||
# plt.close(fig_t1)
|
||||
fig_mag, ax_mag = plt.subplots()
|
||||
fig_t1, ax_t1 = plt.subplots()
|
||||
fig_beta, ax_beta = plt.subplots()
|
||||
|
||||
if kind == 'temp':
|
||||
_params = self.t_params
|
||||
else:
|
||||
_params = self.f_params
|
||||
|
||||
save_path = path.joinpath(kind)
|
||||
if not save_path.exists():
|
||||
save_path.mkdir(parents=True)
|
||||
|
||||
for key, par in _params.items():
|
||||
pl, = ax_mag.plot(par[:, 0], par[:, 1], 'o', label=key)
|
||||
ax_mag.plot(par[:, 0], par[:, 3], 's', color=pl.get_color())
|
||||
ax_t1.plot(par[:, 0], par[:, 5], 'o', label=key)
|
||||
ax_beta.plot(par[:, 0], par[:, 7], 'o', label=key)
|
||||
|
||||
for a in [ax_mag, ax_t1, ax_beta]:
|
||||
if kind == 'freq':
|
||||
a.legend(loc='upper left', bbox_to_anchor=(1, 1), ncol=2)
|
||||
a.set_xlabel('T / K')
|
||||
else:
|
||||
a.set_xscale('log')
|
||||
a.legend(loc='upper left', bbox_to_anchor=(1, 1))
|
||||
a.set_xlabel('f / Hz')
|
||||
|
||||
ax_t1.set_yscale('log')
|
||||
ax_t1.set_ylabel('T1 / s')
|
||||
ax_beta.set_ylabel('beta')
|
||||
ax_mag.set_ylabel('M0 (squares), Offset (circles)')
|
||||
|
||||
fig_beta.savefig(path.joinpath(f'beta_{kind}.png'), bbox_inches="tight")
|
||||
fig_mag.savefig(path.joinpath(f'mag_{kind}.png'), bbox_inches="tight")
|
||||
fig_t1.savefig(path.joinpath(f't1_{kind}.png'), bbox_inches="tight")
|
||||
plt.close(fig_mag)
|
||||
plt.close(fig_beta)
|
||||
plt.close(fig_t1)
|
||||
|
||||
def get_parameter(self, parameter='all', kind='freq', path=None, write=True, plot=True):
|
||||
param_list = []
|
||||
@ -391,99 +412,10 @@ class FCReader:
|
||||
return m0 * np.exp(-(x/t1)**beta) + off
|
||||
|
||||
|
||||
class FCFileReader:
|
||||
def __init__(self, fname: str):
|
||||
self.filename = pathlib.Path(fname)
|
||||
self._is_dir = self.filename.is_dir()
|
||||
self._script_type = None
|
||||
self.reader = None
|
||||
if not self._is_dir:
|
||||
self.reader = HdfReader(self.filename)
|
||||
if 'mag' in self.reader:
|
||||
self._script_type = 'old'
|
||||
elif 'Magnetization' in self.reader:
|
||||
self._script_type = '2022_09'
|
||||
|
||||
self._temperature = get_temperature(self.filename.stem)
|
||||
|
||||
def load_magnetization(self, region=None):
|
||||
if self._is_dir:
|
||||
_temp = self._read_from_dir()
|
||||
|
||||
else:
|
||||
if region is None:
|
||||
_temp = self._read_from_hdf()
|
||||
else:
|
||||
_temp = self._read_signals(region)
|
||||
|
||||
if not _temp:
|
||||
raise OSError(-666, f'No magnetization found for {self.filename.name}.', self.filename.name)
|
||||
|
||||
|
||||
def _read_from_hdf(self) -> dict:
|
||||
_temp = {}
|
||||
mag_directory = 'mag' if self._script_type == 'old' else 'Magnetization'
|
||||
for mag in self.reader.get_selected(mag_directory, dtype='points'):
|
||||
_temp[mag.value] = mag
|
||||
|
||||
return _temp
|
||||
|
||||
def _read_from_dir(self) -> dict:
|
||||
fname_no_ext = self.filename.with_suffix('')
|
||||
data_path = fname_no_ext / 'data'
|
||||
_temp = {}
|
||||
|
||||
for mag in data_path.glob('*.dat'):
|
||||
d = AsciiReader(mag).export()
|
||||
for v in d:
|
||||
_temp[v.value] = v
|
||||
break
|
||||
|
||||
return _temp
|
||||
|
||||
def _read_signals(self, region: tuple = None) -> dict:
|
||||
start = 0
|
||||
stop = 30e-5
|
||||
|
||||
# This is one set with attributes to find default start:stop values
|
||||
try:
|
||||
p = self.reader.parameters('/ABS_ACC_FID')
|
||||
start = p['start']
|
||||
stop = p['stop']
|
||||
except:
|
||||
pass
|
||||
|
||||
if region is None:
|
||||
region = (start, stop)
|
||||
|
||||
if region[0] is None:
|
||||
region = (start, region[1])
|
||||
if region[1] is None:
|
||||
region = (region[0], stop)
|
||||
|
||||
sig = self.reader.get_selected('/data/B=*/ACC_ABS_FID*', dtype='signal')
|
||||
_temp = {}
|
||||
for s in sig:
|
||||
pts = s.points([region])
|
||||
b = s.group
|
||||
if b not in _temp:
|
||||
_temp[b] = []
|
||||
|
||||
_temp[b].append([s.value, *[pp[1] for pp in pts]])
|
||||
|
||||
for b, m in sorted(_temp.items()):
|
||||
m = np.array(m)
|
||||
_temp[b] = Points(x=m[:, 0], y=m[:, 1], value=b, name=f'B={b}').sort()
|
||||
|
||||
return _temp
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from pprint import pprint
|
||||
test = FCReader('/autohome/dominik/nmreval/testdata/fc_test/2022-09-15_1344_new_script.h5')
|
||||
# test = FCReader('/autohome/dominik/nmreval/testdata/fc_test/314K_2015-09-03_1605.h5')
|
||||
test = FCReader('/autohome/dominik/nmreval/testdata/fc_test/314K_2015-09-03_1605.h5')
|
||||
test.load_magnetization(region=(None, None))
|
||||
|
||||
test.load_magnetization()
|
||||
test.load_magnetization(region=(0, 10e-6))
|
||||
# pprint(test.data)
|
||||
# test = FCReader('/autohome/dominik/nmreval/testdata/fc_test/2023-03-16_1423.h5')
|
||||
# test.load_magnetization(region=(None, None))
|
||||
print(test.data)
|
||||
|
@ -27,7 +27,7 @@ class HdfNode:
|
||||
'num_signals', 'num_pts', 'num_grp',
|
||||
'title_parameter', 'parameter']
|
||||
|
||||
def __init__(self, name, ref, parent):
|
||||
def __init__(self, name: str, ref, parent: HdfNode | None):
|
||||
self.name = name
|
||||
self.type = 'group'
|
||||
self.reference = ref
|
||||
@ -59,7 +59,6 @@ class HdfNode:
|
||||
|
||||
return key in self.children
|
||||
|
||||
|
||||
def clear(self):
|
||||
self.name = ''
|
||||
self.type = 'group'
|
||||
@ -281,16 +280,16 @@ class HdfReader(HdfNode):
|
||||
for child in val.data(dtype=dtype):
|
||||
try:
|
||||
if child.type == 'points':
|
||||
ret_val.append(self._make_point(child))
|
||||
ret_val.append(self.make_point(child))
|
||||
elif child.type == 'signal':
|
||||
ret_val.append(self._make_signal(child, flag=flag, value=value, group=group))
|
||||
ret_val.append(self.make_signal(child, flag=flag, value=value, group=group))
|
||||
except IOError:
|
||||
print('something went wrong for ' + child.name)
|
||||
continue
|
||||
|
||||
return ret_val
|
||||
|
||||
def _make_point(self, node):
|
||||
def make_point(self, node):
|
||||
data = self.file[node.reference]
|
||||
|
||||
val = None
|
||||
@ -300,7 +299,7 @@ class HdfReader(HdfNode):
|
||||
|
||||
return Points(x=data['x'], y=data['y'], yerr=data['y_err'], name=node.name, value=val)
|
||||
|
||||
def _make_signal(self, node, flag: str = 'fid', value: str = None, group: str = None):
|
||||
def make_signal(self, node, flag: str = 'fid', value: str = None, group: str = None):
|
||||
if value is None:
|
||||
value = self._get_parameter_values(node, node.parameter)
|
||||
else:
|
||||
|
Loading…
Reference in New Issue
Block a user