-
ext-rogers_c authoredext-rogers_c authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
PPSolveFactoryTestPlot.py 5.16 KiB
import glob
import matplotlib.pyplot
class PlotInterpolation(object):
"""
Make plots to support plotting of the PPSolveFactoryTest output
"""
def __init__(self, file_name_list):
"""
Initialise the plotter - file_name_list is the list of files that will
be plotted
"""
self.file_name_list = file_name_list
self.data = {}
self.plots = {}
self.setup_plots()
def setup_plots(self):
"""
Set up empty plots
"""
self.plots["fit_fig"] = matplotlib.pyplot.figure(0, (12.8, 9.6))
self.plots["fit_fig"].xlabel = "s"
self.plots["fit_fig"].ylabel = "value"
kwd = {"ylim":[-1, 1], "xlim":[-1.0, 20.0]}
ax = self.plots["fit_fig"].add_subplot(1, 1, 1, **kwd)
self.plots["residual_fig"] = matplotlib.pyplot.figure(1, (12.8, 9.6))
self.plots["residual_fig"].xlabel = "s"
self.plots["residual_fig"].ylabel = "residual"
kwd = {"yscale":"log", "ylim":[1e-6, 1000], "xlim":[-1.0, 25.0]}
ax = self.plots["residual_fig"].add_subplot(1, 1, 1, **kwd)
def get_fit_fig(self):
matplotlib.pyplot.figure(0)
return self.plots["fit_fig"]
def get_residual_fig(self):
matplotlib.pyplot.figure(1)
return self.plots["residual_fig"]
def finish_plots(self):
self.get_fit_fig()
matplotlib.pyplot.legend()
self.get_residual_fig()
matplotlib.pyplot.legend()
matplotlib.pyplot.show(block=False)
self.plots["fit_fig"].savefig("ppsolvefactorytest_fit.png")
self.plots["residual_fig"].savefig("ppsolvefactorytest_residual.png")
def load_file(self, file_name):
fin = open(file_name)
self.data = {}
self.data["title"] = fin.readline().rstrip()
smooth = self.data["title"].split("smooth")[1]
smooth = smooth.split("_")[1]
poly = self.data["title"].split("poly")[1]
poly = poly.split("_")[1]
self.data["smooth"] = int(smooth)
self.data["poly"] = int(poly)
columns = fin.readline()
columns.rstrip()
self.data["columns"] = columns.split()
for col in self.data["columns"]:
self.data[col] = []
for line in fin.readlines():
line.rstrip()
for i, a_word in enumerate(line.split()):
col = self.data["columns"][i]
self.data[col].append(float(a_word))
self.data["length"] = len(self.data[col])
self.get_s_data()
self.get_fit_errors()
def get_s_data(self):
s_list = [0.]
for i in range(self.data["length"]):
x, y, z = self.data["pos_x"][i], self.data["pos_y"][i], self.data["pos_z"][i]
if i == 0:
print("Stepping from", x, y, z, end=' ')
if i > 0:
s = ((x-x_old)**2+(y-y_old)**2+(z-z_old)**2)**0.5
s_list.append(s+s_list[-1])
x_old, y_old, z_old = x, y, z
print("to", x, y, z)
self.data["s_pos"] = s_list
def get_fit_errors(self):
for key in "x", "y", "z":
true = self.data["true_"+key]
fit = self.data["fit_"+key]
error = [abs(fit[i]-true[i]) for i in range(self.data["length"])]
self.data["residual_"+key] = error
def get_title_suffix(self):
return "t: "+ str(self.data["smooth"])+ " f: "+str(self.data["poly"])
def do_fit_plots(self):
self.get_fit_fig()
title = "Fitted - "+self.get_title_suffix()
abs_list = self.data["s_pos"]
ord_list = self.data["fit_x"]
matplotlib.pyplot.plot(abs_list, ord_list,
color=self.color(), marker=self.marker(),
fillstyle='none', label=title)
def color(self):
i = self.data['smooth']
c_list = ['red', 'blue', 'green', 'orange', 'magenta']
color = c_list[i%len(c_list)]
return color
def marker(self):
i = self.data['poly']
m_list = ['o', 'v', '^', 's', 'x']
marker = m_list[i%len(m_list)]
return marker
def do_truth_plot(self):
self.get_fit_fig()
abs_list = self.data["s_pos"]
ord_list = self.data["true_x"]
color = self.color()
matplotlib.pyplot.plot(abs_list, ord_list, label="True x")
def do_residual_plot(self):
self.get_residual_fig()
title = "Residual - "+self.get_title_suffix()
abs_list = self.data["s_pos"]
ord_list = self.data["residual_x"]
matplotlib.pyplot.semilogy(abs_list, ord_list,
color=self.color(), marker=self.marker(),
fillstyle='none', label=title)
def main(self):
for i, file_name in enumerate(sorted(self.file_name_list)):
self.load_file(file_name)
self.do_fit_plots()
if i == len(self.file_name_list)-1:
self.do_truth_plot()
self.do_residual_plot()
self.finish_plots()
def main():
plotter = PlotInterpolation(glob.glob("PPSolveFactoryTest_*"))
plotter.main()
input("Press <CR> to end")
if __name__ == "__main__":
main()