コード例 #1
0
class SimulationPage(tk.Frame):

    def __init__(self, master=None):
        super(SimulationPage, self).__init__(master)
        self.parameter_frame = tk.LabelFrame(self, text="parameters")
        self.build_parameters()

        self.result_frame = tk.LabelFrame(self, text="result")
        self.fig = Figure()
        self.ax = self.fig.add_subplot(111)
        self.plot_window = FigureCanvasTkAgg(self.fig, self.result_frame)
        self.plot_window.draw()
        self.plot_window.get_tk_widget().pack()
        self.pack()

        self.run = tk.Button(self, text="Run algorithm", command=self.run)
        self.parameter_frame.grid(column=0, row=0)
        self.run.grid(column=0, row=1)
        self.result_frame.grid(column=1, row=0, columnspan=2, rowspan=2)



    def build_parameters(self):
        self.video = Parameter("video", bool, True)
        self.save_video = Parameter("save video", bool, True)
        self.parameters  = [
            Parameter("time_sim", int, 1000),
            Parameter("number_of_molecules", int, 100000),
            Parameter("monomer_pool", int, 3100000),
            Parameter("p_growth", float, 0.5),
            Parameter("p_death", float, 0.00005),
            Parameter("p_dead_react", float, 0.5),
            Parameter("l_exponent", float, 0.5),
            Parameter("d_exponent", float, 0.5),
            Parameter("l_naked", float, 0.5),
            Parameter("kill_spawns_new", bool, True),
            self.video,
            self.save_video
        ]

        [x.set_var(self) for x in self.parameters]
        for param in self.parameters:
            control = None
            param_type = param.get_type()
            if param_type in [int, str, float]:
                lab = tk.Label(self.parameter_frame, text=param.get_name())
                lab.pack()
                control = tk.Entry(self.parameter_frame,
                                   validate='all',
                                   validatecommand=(validation[param_type], '%s', '%P', '%W'),
                                   name=param.get_name(),
                                   textvar=param.get_var())
            elif param_type is bool:
                control = tk.Checkbutton(self.parameter_frame, text=param.get_name(), name=param.get_name())


            control.pack()



    def run(self):
        values = [x.get_value() for x in self.parameters if x.get_name() not in ["video", "save video"]]

        self.run["text"] = "running"
        self.update()
        if self.save_video.get_value() and self.video.get_value():
            name = str(round(time.time()))
            self.writer = imageio.get_writer(name + '.gif', mode='I', duration=0.3)
        if self.video.get_value():
            result = polymer(*values, UI_vid=self.make_hist)
        else:
            result = polymer(*values)
            self.make_hist(result)

        if self.save_video.get_value() and self.video.get_value():
            self.writer.close()

        self.run["text"] = "run"


    def make_hist(self, results, state=None, coloured=1):
        self.ax.clear()
        living, dead,coupled = results
        if state is not None:
            current_monomer, initial_monomer, time = state
            conversion = 1 - current_monomer / initial_monomer
        d = np.hstack((living, dead, coupled))
        DPn = np.mean(d)
        DPw = np.sum(np.square(d)) / (DPn * d.shape[0])
        PDI = DPw / DPn
        # dlmwrite('polymerOutput.txt',[time, conversion, DPn, DPw, PDI], '-append');
        if coloured == 0:
            self.ax.hist(d, bins=int(np.max(d) - np.min(d)), facecolor='b')
        else:
            step = np.ceil((np.max(d) - np.min(d)) / 1000)
            binEdges = np.arange(np.min(d) - 0.5, np.max(d) + 0.5, step)
            midbins = binEdges[0:-1] + (binEdges[1:] - binEdges[0:-1]) / 2
            if coupled.size == 0:
                c,b,e = self.ax.hist([dead, living], bins=midbins, histtype='barstacked', stacked=False, label=['Dead', 'Living'])
                # e[0]["color"] = "blue"
                # e[1]["color"] = "orange"
                matplotlib.pyplot.setp(e[0], color="blue")
                matplotlib.pyplot.setp(e[1], color="orange")
                # setp(e[0], color='blue')
                # setp(e[1], color='orange')


            else:
                self.ax.hist([coupled, dead, living], bins=midbins, histtype='bar', stacked=True,
                             label=['Terminated', 'Dead', 'Living'])

        self.ax.set_xlabel('Length in units')
        self.ax.set_ylabel('Frequency')
        digits = 3
        if state is not None:
            title = "conversion={}, t={}, DPI={}, DPn={}, DPw={}".format(
                round(conversion, digits), time, round(PDI, digits),round(DPn, digits),round(DPw, digits)
            )
            self.ax.set_title(title)

        self.ax.legend()
        self.plot_window.draw()

        if self.save_video.get_value():
            width, height = self.plot_window.get_width_height()
            image = np.fromstring(self.plot_window.tostring_rgb(), dtype=np.uint8).reshape((height, width, 3))
            self.writer.append_data(image)