mirror of
https://github.com/fjosw/pyerrors.git
synced 2025-03-15 14:50:25 +01:00
feat: first version of scan_fitrange
This commit is contained in:
parent
e7f5961cd6
commit
89e2967cf5
1 changed files with 53 additions and 0 deletions
|
@ -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"""
|
||||||
|
|
Loading…
Add table
Reference in a new issue