Code indexing in gitaly is broken and leads to code not being visible to the user. We work on the issue with highest priority.

Skip to content
Snippets Groups Projects
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()