Python wrapper for running instances of trisurf-ng
Miha
2019-03-25 158201fce4bc84680f979e8353ccb98225befc34
commit | author | age
d2f7b0 1 from . import trisurf
SP 2
3
29660c 4 def analysis(*args):
c1504d 5     """Decorator for adding the analysis functions to function lists"""
SP 6     def analysis_decorator(analysis_function):
7         trisurf._analysis_list[analysis_name]=analysis_function
8         def wrapper(*args, **kwargs):
9             analysis_function(*args,**kwargs)
10         return wrapper
29660c 11     if len(args) == 1 and callable(args[0]): #no arguments
SP 12         analysis_name=args[0].__name__
13         return analysis_decorator(args[0])
14     else:
15         analysis_name=args[0]
16         return analysis_decorator
c1504d 17
SP 18
29660c 19 @analysis
d2f7b0 20 def demo(run, **kwargs):
SP 21     host=kwargs.get('host', None)
22     print("Demo analysis")
23     print("Analysis on host "+host['name']+" for run "+run.Dir.fullpath()+" completed")
24     print("here comes info on the run variable:")
25     print(run)
26     print("here comes info on the host variable:")
27     print(host)
28     print("here comes info on the args variable:")
29     print(kwargs.get('args',None))
30
31
d55834 32 # can be wrapped to specify scalar_field)
c1504d 33 @analysis('plotrunningavginteractive')
158201 34 def plotrunningavginteractive(run, scalar_field='hbar', ylabel="1/n sum_i=niter^n(hbar_i)", **kwargs):
d2f7b0 35     import matplotlib.pyplot as plt
SP 36     from trisurf import VTKRendering as vtk
37     import math
38     from multiprocessing import Process
39     table=trisurf.Statistics(run.Dir.fullpath(),filename='data_tspoststat.csv').getTable()
40     def running_avg(col):
41         import numpy as np
42         avg=[]    
43         for i in range(0,len(col)):
44             avg.append(np.average(col[:-i]))
45         return avg
46     def spawned_viewer(n):
d55834 47         vtk.Renderer(kwargs.get('args', None),kwargs.get('host',None),run, timestep=n,scalar_field=scalar_field)
d2f7b0 48
SP 49     fig=plt.figure(1)
158201 50     ra=running_avg(table[scalar_field])
M 51     l=len(table[scalar_field])
d2f7b0 52     plt.plot(ra)
SP 53     plt.title('Running average')
158201 54     plt.ylabel(ylabel)
d2f7b0 55     plt.xlabel('n')
SP 56     def onclick(event):
57         #print('button=%d, x=%d, y=%d, xdata=%f, ydata=%f' % (event.button, event.x, event.y, event.xdata, event.ydata))
58         p=Process(target=spawned_viewer, args=(l-math.floor(event.xdata)-1,))
59         p.start()
60     cid = fig.canvas.mpl_connect('button_press_event', onclick)
61     plt.show()
62     plt.close(1)
63
64
65 # -------------------------------
66 # these functions should be wrapped
67 # -------------------------------
c1504d 68 @analysis('plotColumnFromPostProcess')
d2f7b0 69 def plotColumnFromPostProcess(run, filename='data_tspoststat.csv', column='hbar', **kwargs):
SP 70     import matplotlib.pyplot as plt
71
72     def smooth(y, box_pts):
73         import numpy as np
74         box = np.ones(box_pts)/box_pts
75         y_smooth = np.convolve(y, box, mode='same')
76         return y_smooth
77     table=trisurf.Statistics(run.Dir.fullpath(),filename=filename).getTable()
78     plt.plot(table[column], '.')
79     plt.title(run.Dir.fullpath())
80     plt.xlabel('Iteration')
81     plt.ylabel(column)
82     smooth_window=10
83     smoothed=smooth(table[column],smooth_window)
84     plt.plot(tuple(range(int(smooth_window/2),len(smoothed)-int(smooth_window/2))),smoothed[int(smooth_window/2):-int(smooth_window/2)])
85     plt.show()
86     print
87     #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.
88     return False
89
90