feat: first version of scan_fitrange

This commit is contained in:
Fabian Joswig 2022-05-26 18:54:30 +01:00
parent e7f5961cd6
commit 89e2967cf5

View file

@ -3,6 +3,8 @@ from itertools import permutations
import numpy as np import numpy as np
import autograd.numpy as anp import autograd.numpy as anp
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import matplotlib.cm as cm
import matplotlib.colors as mcolors
import scipy.linalg import scipy.linalg
from .obs import Obs, reweight, correlate, CObs from .obs import Obs, reweight, correlate, CObs
from .misc import dump_object, _assert_equal_properties from .misc import dump_object, _assert_equal_properties
@ -1194,6 +1196,57 @@ class Corr:
newcontent = [None if (self.content[t] is None) else rmat[t] for t in range(self.T)] newcontent = [None if (self.content[t] is None) else rmat[t] for t in range(self.T)]
return Corr(newcontent) return Corr(newcontent)
def scan_fitrange(self, func, fitrange=None, dt_min=None, p_filter=0.05, **kwargs):
for i in range(25):
try:
func(np.arange(i), np.array([1]))
except Exception:
pass
else:
break
n_parms = i
if dt_min < n_parms:
raise Exception("dt_min cannot be smaller than the number of fit parameters.")
if dt_min > fitrange[1] - fitrange[0]:
raise Exception("dt_min has to fit into the fitrange.")
results = {}
for tstart in range(fitrange[0], fitrange[1] - dt_min + 1):
if tstart not in results:
results[tstart] = {}
for tstop in range(tstart + dt_min, fitrange[1] + 1):
try:
results[tstart][tstop] = self.fit(func, [tstart, tstop], silent=True, **kwargs)
except Exception:
pass
colormap = cm.coolwarm
for parm in range(n_parms):
for key, subdict in results.items():
entries = len(subdict)
e_count = 0.5
d_length = 0.5
for skey, fresult in subdict.items():
if fresult.p_value > p_filter:
fresult.gamma_method()
plt.errorbar(key - d_length / 2 + e_count / entries * d_length,
fresult[parm].value, fresult[parm].dvalue,
color=colormap((skey - fitrange[0] - dt_min) / (fitrange[1] - fitrange[0] - dt_min)),
ms=3)
e_count += 1
plt.xlabel(r"$x_{0,\mathrm{start}}/a$")
values = np.arange(fitrange[0] + dt_min, fitrange[1] + 1)
normalize = mcolors.Normalize(vmin=values.min(), vmax=values.max())
scalarmappaple = cm.ScalarMappable(norm=normalize, cmap=colormap)
scalarmappaple.set_array(values)
cbar = plt.colorbar(scalarmappaple)
cbar.ax.get_yaxis().labelpad = 25
cbar.ax.invert_yaxis()
cbar.set_label(r"$x_{0,\mathrm{stop}}/a$", rotation=270)
plt.title("Parameter " + str(parm))
plt.show()
def _sort_vectors(vec_set, ts): def _sort_vectors(vec_set, ts):
"""Helper function used to find a set of Eigenvectors consistent over all timeslices""" """Helper function used to find a set of Eigenvectors consistent over all timeslices"""