mirror of
https://github.com/fjosw/pyerrors.git
synced 2025-05-14 11:33:42 +02:00
correlators module cleaned up, GUI_range_finder commented out for now
This commit is contained in:
parent
44cd3d52bd
commit
c09a56b9c0
3 changed files with 348 additions and 371 deletions
File diff suppressed because one or more lines are too long
|
@ -66,9 +66,6 @@ class Corr:
|
|||
for j in range(self.N):
|
||||
item[i,j].gamma_method()
|
||||
|
||||
|
||||
|
||||
|
||||
#We need to project the Correlator with a Vector to get a single value at each timeslice.
|
||||
#The method can use one or two vectors.
|
||||
#If two are specified it returns v1@G@v2 (the order might be very important.)
|
||||
|
@ -236,16 +233,16 @@ class Corr:
|
|||
|
||||
xs = [x for x in range(fitrange[0], fitrange[1]) if not self.content[x] is None]
|
||||
ys = [self.content[x][0] for x in range(fitrange[0], fitrange[1]) if not self.content[x] is None]
|
||||
result = standard_fit(xs, ys,function,silent=(True))
|
||||
result = standard_fit(xs, ys, function, silent=True)
|
||||
[item.gamma_method() for item in result if isinstance(item,Obs)]
|
||||
return result
|
||||
|
||||
#we want to quickly get a plateau
|
||||
def plateau(self, plateau_range, method="fit"):
|
||||
if self.N != 1:
|
||||
raise Exception("Correlator must be projected before getting a plateau")
|
||||
raise Exception("Correlator must be projected before getting a plateau.")
|
||||
if(all([self.content[t] is None for t in range(plateau_range[0], plateau_range[1])])):
|
||||
raise Exception("plateau is undefined at all timeslices in plateaurange")
|
||||
raise Exception("plateau is undefined at all timeslices in plateaurange.")
|
||||
if method == "fit":
|
||||
def const_func(a, t):
|
||||
return a[0] + a[1] * 0 # At some point pe.standard fit had an issue with single parameter fits. Being careful does not hurt
|
||||
|
@ -291,8 +288,6 @@ class Corr:
|
|||
return
|
||||
|
||||
|
||||
|
||||
|
||||
def __repr__(self):
|
||||
return("Corr[T="+str(self.T)+" , N="+str(self.N)+" , content="+str(self.content)+"]")
|
||||
def __str__(self):
|
||||
|
@ -541,113 +536,113 @@ class Corr:
|
|||
|
||||
|
||||
|
||||
#One of the most common tasks is to select a range for a plateau or a fit. This is best done visually.
|
||||
def GUI_range_finder(corr, current_range=None):
|
||||
T=corr.T
|
||||
if corr.N!=1:
|
||||
raise Exception("The Corr needs to be projected to select a range.")
|
||||
#We need to define few helper functions for the Gui
|
||||
def get_figure(corr,values):
|
||||
fig = matplotlib.figure.Figure(figsize=(7, 4), dpi=100)
|
||||
fig.clf()
|
||||
x,y,err=corr.plottable()
|
||||
ax=fig.add_subplot(111,label="main")#.plot(t, 2 * np.sin(2 * np.pi * t))
|
||||
end=int(max(values["range_start"],values["range_end"]))
|
||||
start=int(min(values["range_start"],values["range_end"]))
|
||||
db=[0.1,0.2,0.8]
|
||||
ax.errorbar(x,y,err, fmt="-o",color=[0.4,0.6,0.8])
|
||||
ax.errorbar(x[start:end],y[start:end],err[start:end], fmt="-o",color=db)
|
||||
offset=int(0.3*(end-start))
|
||||
xrange=[max(min(start-1,int(start-offset)),0),min(max(int(end+offset),end+1),T-1)]
|
||||
ax.grid()
|
||||
if values["Plateau"]:
|
||||
plateau=corr.plateau([start,end])
|
||||
ax.hlines(plateau.value,0,T+1,lw=plateau.dvalue,color="red",alpha=0.5)
|
||||
ax.hlines(plateau.value,0,T+1,lw=1,color="red")
|
||||
ax.set_title(r"Current Plateau="+str(plateau)[4:-1])
|
||||
if(values["Crop X"]):
|
||||
ax.set_xlim(xrange)
|
||||
ax.set_xticks([x for x in ax.get_xticks() if (x-int(x)==0) and (0<=x<T)])
|
||||
if(values["Crop Y"]):
|
||||
y_min=min([ (x[0].value-x[0].dvalue) for x in corr.content[xrange[0]:xrange[1]] if(not x is None)])
|
||||
y_max=max([ (x[0].value+x[0].dvalue) for x in corr.content[xrange[0]:xrange[1]] if(not x is None)])
|
||||
ax.set_ylim([y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])
|
||||
else:
|
||||
y_min=min([ (x[0].value-x[0].dvalue) for x in corr.content if(not x is None)])
|
||||
y_max=max([ (x[0].value+x[0].dvalue) for x in corr.content if(not x is None)])
|
||||
ax.set_ylim([y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])
|
||||
ax.vlines(values["range_start"]-0.5,-2*abs(y_min),2*y_max,color=db)
|
||||
ax.vlines(values["range_end"]-0.5,-2*abs(y_min),2*y_max,color=db)
|
||||
return fig
|
||||
|
||||
def draw_figure(canvas, figure):
|
||||
#matplotlib.use('TkAgg')
|
||||
figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
|
||||
figure_canvas_agg.draw()
|
||||
figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
|
||||
return figure_canvas_agg
|
||||
|
||||
def delete_figure_agg(figure_agg):
|
||||
figure_agg.get_tk_widget().forget()
|
||||
plt.close('all')
|
||||
|
||||
#We change settings for mpl only inside the function
|
||||
#matplotlib.use('TkAgg')
|
||||
|
||||
#now we can call our gui
|
||||
# define window layout
|
||||
default_values={}
|
||||
default_values["Crop X"]=False
|
||||
default_values["Crop Y"]=False
|
||||
default_values["Plateau"]=False
|
||||
if current_range is None:
|
||||
default_values["range_start"]=1
|
||||
default_values["range_end"]=int(T/2)
|
||||
else:
|
||||
default_values["range_start"]=current_range[0]
|
||||
default_values["range_end"]=current_range[1]
|
||||
|
||||
|
||||
layout = [
|
||||
[sg.Canvas(key='-CANVAS-')],
|
||||
[sg.Slider(range=(0,T),default_value=default_values["range_start"],size=(40,15),orientation='horizontal',key="range_start",enable_events = True)],
|
||||
[sg.Slider(range=(0,T),default_value=default_values["range_end"],size=(40,15),orientation='horizontal',key="range_end",enable_events = True)],
|
||||
[sg.Checkbox('Crop X',key="Crop X",default=default_values["Crop X"],enable_events = True),sg.Checkbox('Crop Y',key="Crop Y",default=default_values["Crop Y"],enable_events = True),sg.Checkbox('Plateau', key="Plateau",default=default_values["Plateau"],enable_events = True),sg.Button('Return')]]
|
||||
|
||||
#Calling a theme after the layout is set, preserves default sliders and Buttons
|
||||
|
||||
window = sg.Window('Range Finder', layout, finalize=True, element_justification='center', font='Helvetica 18',return_keyboard_events=True)
|
||||
|
||||
# add the plot to the window
|
||||
fig = get_figure(corr,default_values)
|
||||
fig_canvas_agg =draw_figure(window['-CANVAS-'].TKCanvas, fig)
|
||||
while True:
|
||||
event, values = window.read()
|
||||
if event is None or event=="Return" or event=="\r":
|
||||
break
|
||||
else:
|
||||
if values["range_end"]<=values["range_start"]+2:
|
||||
if values["range_start"]+3<T:
|
||||
window["range_end"].update(values["range_start"]+3)
|
||||
else:
|
||||
window["range_start"].update(T-3)
|
||||
window["range_end"].update(values["range_start"]+3)
|
||||
# we need a distance of 2 fo a plateau
|
||||
if values["range_end"]<=values["range_start"]+1:
|
||||
values["Plateau"]=False
|
||||
window["Plateau"].update(False)
|
||||
if fig_canvas_agg:
|
||||
delete_figure_agg(fig_canvas_agg)
|
||||
fig = get_figure(corr,values)
|
||||
fig_canvas_agg =draw_figure(window['-CANVAS-'].TKCanvas, fig)
|
||||
|
||||
|
||||
window.close()
|
||||
#It is easier to read the last event, that occurred
|
||||
if event=="Return" or event=="\r":
|
||||
end=int(max(values["range_start"],values["range_end"]))
|
||||
start=int(min(values["range_start"],values["range_end"]))
|
||||
window.close()
|
||||
return [start,end]
|
||||
else:
|
||||
return
|
||||
##One of the most common tasks is to select a range for a plateau or a fit. This is best done visually.
|
||||
#def GUI_range_finder(corr, current_range=None):
|
||||
# T=corr.T
|
||||
# if corr.N!=1:
|
||||
# raise Exception("The Corr needs to be projected to select a range.")
|
||||
# #We need to define few helper functions for the Gui
|
||||
# def get_figure(corr,values):
|
||||
# fig = matplotlib.figure.Figure(figsize=(7, 4), dpi=100)
|
||||
# fig.clf()
|
||||
# x,y,err=corr.plottable()
|
||||
# ax=fig.add_subplot(111,label="main")#.plot(t, 2 * np.sin(2 * np.pi * t))
|
||||
# end=int(max(values["range_start"],values["range_end"]))
|
||||
# start=int(min(values["range_start"],values["range_end"]))
|
||||
# db=[0.1,0.2,0.8]
|
||||
# ax.errorbar(x,y,err, fmt="-o",color=[0.4,0.6,0.8])
|
||||
# ax.errorbar(x[start:end],y[start:end],err[start:end], fmt="-o",color=db)
|
||||
# offset=int(0.3*(end-start))
|
||||
# xrange=[max(min(start-1,int(start-offset)),0),min(max(int(end+offset),end+1),T-1)]
|
||||
# ax.grid()
|
||||
# if values["Plateau"]:
|
||||
# plateau=corr.plateau([start,end])
|
||||
# ax.hlines(plateau.value,0,T+1,lw=plateau.dvalue,color="red",alpha=0.5)
|
||||
# ax.hlines(plateau.value,0,T+1,lw=1,color="red")
|
||||
# ax.set_title(r"Current Plateau="+str(plateau)[4:-1])
|
||||
# if(values["Crop X"]):
|
||||
# ax.set_xlim(xrange)
|
||||
# ax.set_xticks([x for x in ax.get_xticks() if (x-int(x)==0) and (0<=x<T)])
|
||||
# if(values["Crop Y"]):
|
||||
# y_min=min([ (x[0].value-x[0].dvalue) for x in corr.content[xrange[0]:xrange[1]] if(not x is None)])
|
||||
# y_max=max([ (x[0].value+x[0].dvalue) for x in corr.content[xrange[0]:xrange[1]] if(not x is None)])
|
||||
# ax.set_ylim([y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])
|
||||
# else:
|
||||
# y_min=min([ (x[0].value-x[0].dvalue) for x in corr.content if(not x is None)])
|
||||
# y_max=max([ (x[0].value+x[0].dvalue) for x in corr.content if(not x is None)])
|
||||
# ax.set_ylim([y_min-0.1*(y_max-y_min),y_max+0.1*(y_max-y_min)])
|
||||
# ax.vlines(values["range_start"]-0.5,-2*abs(y_min),2*y_max,color=db)
|
||||
# ax.vlines(values["range_end"]-0.5,-2*abs(y_min),2*y_max,color=db)
|
||||
# return fig
|
||||
#
|
||||
# def draw_figure(canvas, figure):
|
||||
# #matplotlib.use('TkAgg')
|
||||
# figure_canvas_agg = FigureCanvasTkAgg(figure, canvas)
|
||||
# figure_canvas_agg.draw()
|
||||
# figure_canvas_agg.get_tk_widget().pack(side='top', fill='both', expand=1)
|
||||
# return figure_canvas_agg
|
||||
#
|
||||
# def delete_figure_agg(figure_agg):
|
||||
# figure_agg.get_tk_widget().forget()
|
||||
# plt.close('all')
|
||||
#
|
||||
# #We change settings for mpl only inside the function
|
||||
# #matplotlib.use('TkAgg')
|
||||
#
|
||||
# #now we can call our gui
|
||||
# # define window layout
|
||||
# default_values={}
|
||||
# default_values["Crop X"]=False
|
||||
# default_values["Crop Y"]=False
|
||||
# default_values["Plateau"]=False
|
||||
# if current_range is None:
|
||||
# default_values["range_start"]=1
|
||||
# default_values["range_end"]=int(T/2)
|
||||
# else:
|
||||
# default_values["range_start"]=current_range[0]
|
||||
# default_values["range_end"]=current_range[1]
|
||||
#
|
||||
#
|
||||
# layout = [
|
||||
# [sg.Canvas(key='-CANVAS-')],
|
||||
# [sg.Slider(range=(0,T),default_value=default_values["range_start"],size=(40,15),orientation='horizontal',key="range_start",enable_events = True)],
|
||||
# [sg.Slider(range=(0,T),default_value=default_values["range_end"],size=(40,15),orientation='horizontal',key="range_end",enable_events = True)],
|
||||
# [sg.Checkbox('Crop X',key="Crop X",default=default_values["Crop X"],enable_events = True),sg.Checkbox('Crop Y',key="Crop Y",default=default_values["Crop Y"],enable_events = True),sg.Checkbox('Plateau', key="Plateau",default=default_values["Plateau"],enable_events = True),sg.Button('Return')]]
|
||||
#
|
||||
# #Calling a theme after the layout is set, preserves default sliders and Buttons
|
||||
#
|
||||
# window = sg.Window('Range Finder', layout, finalize=True, element_justification='center', font='Helvetica 18',return_keyboard_events=True)
|
||||
#
|
||||
# # add the plot to the window
|
||||
# fig = get_figure(corr,default_values)
|
||||
# fig_canvas_agg =draw_figure(window['-CANVAS-'].TKCanvas, fig)
|
||||
# while True:
|
||||
# event, values = window.read()
|
||||
# if event is None or event=="Return" or event=="\r":
|
||||
# break
|
||||
# else:
|
||||
# if values["range_end"]<=values["range_start"]+2:
|
||||
# if values["range_start"]+3<T:
|
||||
# window["range_end"].update(values["range_start"]+3)
|
||||
# else:
|
||||
# window["range_start"].update(T-3)
|
||||
# window["range_end"].update(values["range_start"]+3)
|
||||
# # we need a distance of 2 fo a plateau
|
||||
# if values["range_end"]<=values["range_start"]+1:
|
||||
# values["Plateau"]=False
|
||||
# window["Plateau"].update(False)
|
||||
# if fig_canvas_agg:
|
||||
# delete_figure_agg(fig_canvas_agg)
|
||||
# fig = get_figure(corr,values)
|
||||
# fig_canvas_agg =draw_figure(window['-CANVAS-'].TKCanvas, fig)
|
||||
#
|
||||
#
|
||||
# window.close()
|
||||
# #It is easier to read the last event, that occurred
|
||||
# if event=="Return" or event=="\r":
|
||||
# end=int(max(values["range_start"],values["range_end"]))
|
||||
# start=int(min(values["range_start"],values["range_end"]))
|
||||
# window.close()
|
||||
# return [start,end]
|
||||
# else:
|
||||
# return
|
||||
|
|
4
setup.py
4
setup.py
|
@ -3,11 +3,11 @@
|
|||
from setuptools import setup, find_packages
|
||||
|
||||
setup(name='pyerrors',
|
||||
version='1.0.1_forked_JN',
|
||||
version='1.1.0',
|
||||
description='Error analysis for lattice QCD',
|
||||
author='Fabian Joswig',
|
||||
author_email='fabian.joswig@wwu.de',
|
||||
packages=find_packages(),
|
||||
python_requires='>=3.5.0',
|
||||
install_requires=['numpy>=1.16', 'autograd>=1.2', 'numdifftools', 'matplotlib', 'scipy', 'iminuit','PySimpleGUI']
|
||||
install_requires=['numpy>=1.16', 'autograd>=1.2', 'numdifftools', 'matplotlib', 'scipy', 'iminuit']
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue