from . import trisurf
|
|
|
def analysis(*args):
|
"""Decorator for adding the analysis functions to function lists"""
|
def analysis_decorator(analysis_function):
|
trisurf._analysis_list[analysis_name]=analysis_function
|
def wrapper(*args, **kwargs):
|
analysis_function(*args,**kwargs)
|
return wrapper
|
if len(args) == 1 and callable(args[0]): #no arguments
|
analysis_name=args[0].__name__
|
return analysis_decorator(args[0])
|
else:
|
analysis_name=args[0]
|
return analysis_decorator
|
|
|
@analysis
|
def demo(run, **kwargs):
|
host=kwargs.get('host', None)
|
print("Demo analysis")
|
print("Analysis on host "+host['name']+" for run "+run.Dir.fullpath()+" completed")
|
print("here comes info on the run variable:")
|
print(run)
|
print("here comes info on the host variable:")
|
print(host)
|
print("here comes info on the args variable:")
|
print(kwargs.get('args',None))
|
|
|
# can be wrapped to specify scalar_field)
|
@analysis('plotrunningavginteractive')
|
def plotrunningavginteractive(run, scalar_field='hbar', ylabel="1/n sum_i=niter^n(hbar_i)", **kwargs):
|
import matplotlib.pyplot as plt
|
from trisurf import VTKRendering as vtk
|
import math
|
from multiprocessing import Process
|
table=trisurf.Statistics(run.Dir.fullpath(),filename='data_tspoststat.csv').getTable()
|
def running_avg(col):
|
import numpy as np
|
avg=[]
|
for i in range(0,len(col)):
|
avg.append(np.average(col[:-i]))
|
return avg
|
def spawned_viewer(n):
|
vtk.Renderer(kwargs.get('args', None),kwargs.get('host',None),run, timestep=n,scalar_field=scalar_field)
|
|
fig=plt.figure(1)
|
ra=running_avg(table[scalar_field])
|
l=len(table[scalar_field])
|
plt.plot(ra)
|
plt.title('Running average')
|
plt.ylabel(ylabel)
|
plt.xlabel('n')
|
def onclick(event):
|
#print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % (event.button, event.x, event.y, event.xdata, event.ydata))
|
p=Process(target=spawned_viewer, args=(l-math.floor(event.xdata)-1,))
|
p.start()
|
cid = fig.canvas.mpl_connect('button_press_event', onclick)
|
plt.show()
|
plt.close(1)
|
|
|
# -------------------------------
|
# these functions should be wrapped
|
# -------------------------------
|
@analysis('plotColumnFromPostProcess')
|
def plotColumnFromPostProcess(run, filename='data_tspoststat.csv', column='hbar', **kwargs):
|
import matplotlib.pyplot as plt
|
|
def smooth(y, box_pts):
|
import numpy as np
|
box = np.ones(box_pts)/box_pts
|
y_smooth = np.convolve(y, box, mode='same')
|
return y_smooth
|
table=trisurf.Statistics(run.Dir.fullpath(),filename=filename).getTable()
|
plt.plot(table[column], '.')
|
plt.title(run.Dir.fullpath())
|
plt.xlabel('Iteration')
|
plt.ylabel(column)
|
smooth_window=10
|
smoothed=smooth(table[column],smooth_window)
|
plt.plot(tuple(range(int(smooth_window/2),len(smoothed)-int(smooth_window/2))),smoothed[int(smooth_window/2):-int(smooth_window/2)])
|
plt.show()
|
print
|
#if return False or no return statement, the analysis will continue with next running instance in the list. if return True, the analysis will stop after this run.
|
return False
|