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)