Module pk_gui
pk_GUI is a tool to compare, optimize, and visualize two compartment models of perfusion kinetics
Expand source code
#!/usr/bin/env python
# coding: utf-8
"""pk_GUI is a tool to compare, optimize, and visualize
two compartment models of perfusion kinetics"""
### import everything
import glob
import pathlib
import os
import tkinter as tk
from tkinter import Button, Label, ttk, Frame, StringVar, Scale, Grid, Entry, Tk
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
# Implement the default Matplotlib key bindings.
from matplotlib.backend_bases import key_press_handler
from matplotlib.figure import Figure
from pk_two_comp import pk_two_comp as pk2c
class StartPage():
"""The StartPage class is the first page of the pk_GUI application.
It has 4 buttons: Compare, Optimize, Visualize, and Exit Application.
Each button will create a new window leading to the specified action.
Exit will exit the whole application.
"""
def __init__(self, root):
"""Initializing the class with tkinter window object root
Parameters
----------
root : tkinter object
The Window which will show the application
Attributes
-----------
optimize_btn : tkinter button
Clicking on the button leads to the optimizer application
compare_btn : tkinter button
Clicking on the button leads to the compare application.
visualize_btn : tkinter button
Clicking on the button leads to the vizualize application.
quitMainWindow : tkinter button
Clicking ont he button closes and exits the application.
"""
self.root = root
self.root.title('PK Optimizer Tool')
# Calculating the center
width = self.root.winfo_reqwidth()
height = self.root.winfo_reqheight()
wids = self.root.winfo_screenwidth()
heights = self.root.winfo_screenheight()
xval = (wids/2) - (width/2)
yval = (heights/2) - (height/2)
self.root.geometry('+%d+%d' % (xval, yval))
# Making buttons
self.label = Label(self.root,
text="Please choose what application you'd like to explore: ",
width=30, wraplength=200)
self.label.grid(column=1, row=0, sticky='nwes')
self.compare_btn = Button(
self.root, text="Compare!", command=self.compare)
self.compare_btn.grid(column=1, row=1, sticky='nwes')
self.optimize_btn = Button(
self.root, text="Optimize!", command=self.optimize)
self.optimize_btn.grid(column=1, row=2, sticky='nwes')
self.visualize_btn = Button(
self.root, text="Visualize!", command=self.visualize)
self.visualize_btn.grid(column=1, row=3, sticky='nwes')
self.quit = Button(
self.root, text="Exit Application", command=self.on_cancel)
self.quit.grid(column=1, row=4, sticky='nwes')
def compare(self):
"""Opens compare function."""
my_gui = PkCompare(self)
def optimize(self):
"""Opens optimizer function."""
my_gui = PkOptimize(self)
def visualize(self):
"""Opens visualize function."""
my_gui = PkVisualize(self)
def on_cancel(self):
"""Exits and closes window"""
self.root.destroy()
class PkOptimize(tk.Toplevel):
"""Initializes the pk_optimize application GUI"""
def __init__(self, parent): # , master_root):
"""Initializes the pk_optimize application GUI
User selects a dataset from the dropdown box.
Pressing the load button will plot the data selected.
Once data is loaded, give your initial guesses for parameter values.
Press Optimize button, and the optimal values will be outputted.
Attributes
-----------
wd : path
Absolute path name to current directory. Defaults to ./Data
filename : string
Name of the data file you'd like to access
time : double[]
list of all timepoints
aorta : double[]
concentration of tracer in aorta (input function)
myo : double[]
concentration of tracer in myocardial tissue (conc_isf)
Flow : double
Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1/60.
Vp : double
Vp is the volume of plasma in mL. Defaults to 0.05.
Visf : double
Visf is the volume of interstitial fluid in mL. Defaults to 0.15.
PS : double
PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60.
ymax : int
Magnitude of Gamma-var peak.
tmax : double
Time of which highest peak in Gamma-var appears
alpha : double
Scale factor
delay : double
Delay to start Gamma-var curve.
"""
super().__init__(name='pk Optimizer tool')
self.parent = parent
# Making mainfraim to center the window to the screen
mainframe = ttk.Frame(self)
#mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
# Calculating the center
width = 1100
height = 600
wids = self.winfo_screenwidth()
heights = self.winfo_screenheight()
xval = (wids/2) - (width/2)
yval = (heights/2) - (height/2)
self.geometry('+%d+%d' % (xval, yval))
self.pk = pk2c()
self.geometry('1100x600')
self.frame1 = Frame(self)
self.frame2 = Frame(self, padx=10)
self.frame3 = Frame(self)
self.frame4 = Frame(self)
self.frame5 = Frame(self)
self.frame1.grid(column=0, row=1)
self.frame2.grid(column=0, row=0)
self.frame3.grid(column=2, row=1)
self.frame4.grid(column=2, row=0)
self.frame5.grid(column=1, row=0)
if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data':
os.chdir(pathlib.Path('Data').absolute())
# Get lists of files
self.filenames = glob.glob('*.{}'.format('csv'))
# Combobox creation
self.chosen_file = tk.StringVar()
self.file_combobox = ttk.Combobox(
self.frame5, width=20, textvariable=self.chosen_file)
# Adding combobox drop down list
self.file_combobox['values'] = self.filenames
self.file_combobox.grid(column=0, row=1)
self.file_combobox.current(0)
# Creating blank canvas to plot input function on
self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2)
self.canvas1.get_tk_widget().grid(row=0, column=0)
self.canvas1.draw()
# Creating blank canvas to plot output function on
self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame4)
self.canvas2.get_tk_widget().grid(row=0, column=0)
self.canvas2.draw()
# Creating a bunch of labels and input boxes for initial guesses for parameters
self.ymax_lbl = Label(self.frame1, text="ymax guess: ")
self.ymax_lbl.grid(column=0, row=0)
self.tmax_lbl = Label(self.frame1, text="tmax guess: ")
self.tmax_lbl.grid(column=0, row=1)
self.alpha_lbl = Label(self.frame1, text="alpha guess: ")
self.alpha_lbl.grid(column=0, row=2)
self.delay_lbl = Label(self.frame1, text="delay guess: ")
self.delay_lbl.grid(column=0, row=3)
self.ymax_input = Entry(self.frame1, width=50)
self.ymax_input.grid(column=1, row=0)
self.tmax_input = Entry(self.frame1, width=50)
self.tmax_input.grid(column=1, row=1)
self.alpha_input = Entry(self.frame1, width=50)
self.alpha_input.grid(column=1, row=2)
self.delay_input = Entry(self.frame1, width=50)
self.delay_input.grid(column=1, row=3)
self.ymax_opt_lbl = Label(self.frame1)
self.ymax_opt_lbl.grid(column=2, row=0)
self.tmax_opt_lbl = Label(self.frame1)
self.tmax_opt_lbl.grid(column=2, row=1)
self.alpha_opt_lbl = Label(self.frame1)
self.alpha_opt_lbl.grid(column=2, row=2)
self.delay_opt_lbl = Label(self.frame1)
self.delay_opt_lbl.grid(column=2, row=3)
self.flow_lbl = Label(self.frame3, text="flow guess: ")
self.flow_lbl.grid(column=0, row=0)
self.visf_lbl = Label(self.frame3, text="visf guess: ")
self.visf_lbl.grid(column=0, row=1)
self.baseline_lbl = Label(self.frame3, text="baseline guess: ")
self.baseline_lbl.grid(column=0, row=2)
self.flow_input = Entry(self.frame3, width=50)
self.flow_input.grid(column=1, row=0)
self.visf_input = Entry(self.frame3, width=50)
self.visf_input.grid(column=1, row=1)
self.baseline_input = Entry(self.frame3, width=50)
self.baseline_input.grid(column=1, row=2)
self.flow_opt_lbl = Label(self.frame3)
self.flow_opt_lbl.grid(column=2, row=0)
self.visf_opt_lbl = Label(self.frame3)
self.visf_opt_lbl.grid(column=2, row=1)
self.baseline_opt_lbl = Label(self.frame3)
self.baseline_opt_lbl.grid(column=2, row=2)
# Creating buttons to load data and perform optimization
self.load_btn_text = tk.StringVar()
self.load_btn = Button(
master=self.frame5, textvariable=self.load_btn_text, command=self.load_data)
self.load_btn_text.set("Load")
self.load_btn.grid(column=0, row=2)
self.opt_btn_text = tk.StringVar()
self.opt_btn = Button(
master=self.frame5, textvariable=self.opt_btn_text, command=self.perform_opt)
self.opt_btn_text.set("Perform Optimization")
self.opt_btn.grid(column=0, row=3)
# Creating button to go back to main page
self.back_btn = Button(
master=self.frame5, text="Go Back", command=self.go_back)
self.back_btn.grid(column=0, row=4)
# #-------------------------------------------------------------
# #-------------------------------------------------------------
# #-------------------------------------------------------------
def load_data(self):
"""Loads in the data selected in the combobox."""
file = self.file_combobox.get()
self.pk.get_data(file)
self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo')
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.fig1.canvas.draw()
self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro')
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas2.draw_idle()
def perform_opt(self):
"""Performs the optimization using the values taken from input boxes as inital guesses."""
# Performs function fitting, outputs optimized parameters in opt
opt = self.pk.inputFuncFit([self.ymax_input.get(), self.tmax_input.get(),
self.alpha_input.get(), self.delay_input.get()])
# Shows opt in new labels
self.ymax_opt_lbl.configure(text=opt[0])
self.tmax_opt_lbl.configure(text=opt[1])
self.alpha_opt_lbl.configure(text=opt[2])
self.delay_opt_lbl.configure(text=opt[3])
# Plots fitted gamma_var curve
self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01),
self.pk.gamma_var(np.arange(0, 25, 0.01),
opt[0], opt[1], opt[2], opt[3]), 'k-')
self.canvas1.draw_idle()
# Performs function fitting, outputs optimized parameters in opt
opt = self.pk.outputFuncFit([self.flow_input.get(),
self.visf_input.get(), self.baseline_input.get()])
# Shows opt in new labels
self.flow_opt_lbl.configure(text=opt[0])
self.visf_opt_lbl.configure(text=opt[1])
self.baseline_opt_lbl.configure(text=opt[2])
# Plots fitted gamma_var curve
deriv_sol = solve_ivp(self.pk.derivs, [0, 30],
[0, 0], t_eval=self.pk.time)
fit_myo = deriv_sol.y[0] + deriv_sol.y[1]
self.fig2.add_subplot(111).plot(self.pk.time, fit_myo + opt[2], 'm-')
self.canvas2.draw_idle()
def go_back(self):
"""Closes the optimize application and leads you to the start page"""
self.destroy()
class PkCompare(tk.Toplevel):
"""Initializes the pkCompare application GUI"""
def __init__(self, parent): # , master_root):
"""Initializes the pk_compare application GUI
User can select a dataset from the dropdown menu and plot it.
Plotting multiple datasets will overlay them.
Navigation bar is provided to zoom in/out of the plot.
"""
super().__init__(name='pk Optimizer tool')
self.parent = parent
self.legend = []
# Making mainfraim to center the window to the screen
mainframe = ttk.Frame(self)
#mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
width = 1100
height = 500
wids = self.winfo_screenwidth()
heights = self.winfo_screenheight()
xval = (wids/2) - (width/2)
yval = (heights/2) - (height/2)
self.geometry('+%d+%d' % (xval, yval))
self.pk = pk2c()
self.geometry('1100x500')
self.frame1 = Frame(self)
self.frame2 = Frame(self, padx=10)
self.frame3 = Frame(self)
self.frame4 = Frame(self)
self.frame5 = Frame(self)
self.frame6 = Frame(self)
self.frame7 = Frame(self)
self.frame1.grid(column=0, row=2)
self.frame2.grid(column=0, row=1)
self.frame3.grid(column=2, row=2)
self.frame4.grid(column=2, row=1)
self.frame5.grid(column=1, row=1)
self.frame6.grid(column=0, row=0)
self.frame7.grid(column=2, row=0)
if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data':
os.chdir(pathlib.Path('Data').absolute())
# Get lists of files
self.filenames = glob.glob('*.{}'.format('csv'))
# Combobox creation
self.chosen_file = tk.StringVar()
self.file_combobox = ttk.Combobox(
self.frame5, width=20, textvariable=self.chosen_file)
# Adding combobox drop down list
self.file_combobox['values'] = self.filenames
self.file_combobox.grid(column=0, row=1)
self.file_combobox.current(0)
# Creating blank canvas to plot input function on
self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2)
self.canvas1.get_tk_widget().grid(row=0, column=0)
self.canvas1.draw()
toolbar = NavigationToolbar2Tk(self.canvas1, self.frame6)
toolbar.update()
# Creating blank canvas to plot output function on
self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame4)
self.canvas2.get_tk_widget().grid(row=0, column=0)
self.canvas2.draw()
toolbar = NavigationToolbar2Tk(self.canvas2, self.frame7)
toolbar.update()
# Creating buttons to load data and perform optimization
self.load_btn_text = tk.StringVar()
self.load_btn = Button(
master=self.frame5, textvariable=self.load_btn_text, command=self.load_data)
self.load_btn_text.set("Load")
self.load_btn.grid(column=0, row=2)
# Creating button to go back to main page
self.back_btn = Button(
master=self.frame5, text="Go Back", command=self.go_back)
self.back_btn.grid(column=0, row=4)
# #-------------------------------------------------------------
# #-------------------------------------------------------------
# #-------------------------------------------------------------
def load_data(self):
"""Loads in the data selected in the combobox."""
file = self.file_combobox.get()
self.legend.append(file)
self.pk.time = []
self.pk.aorta = []
self.pk.myo = []
self.pk.get_data(file)
self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.fig1.canvas.draw()
self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas2.draw_idle()
plt.legend(self.legend)
def go_back(self):
"""Exits the compare window and goes back to the start page."""
self.destroy()
# ====================================================================
class PkVisualize(tk.Toplevel):
"""Initializes the pkVisualize application GUI"""
def __init__(self, parent): # , master_root):
"""Initializes the pk_visualize application GUI
User can select a dataset from the dropdown menu and load it.
Plotting multiple datasets will overlay them.
Navigation bar is provided to zoom in/out of the plot.
Using the sliders to change parameter values will result in different
Cin and Cout curves. You must hit plot after every change to see it.
"""
super().__init__(name='pk Optimizer tool')
self.parent = parent
# Making mainfraim to center the window to the screen
mainframe = ttk.Frame(self)
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)
# Calculating the center
width = 1280
height = 500
wids = self.winfo_screenwidth()
heights = self.winfo_screenheight()
xval = (wids/2) - (width/2)
yval = (heights/2) - (height/2)
self.geometry('+%d+%d' % (xval, yval))
self.pk = pk2c()
self.geometry('1280x500')
self.frame1 = Frame(self)
self.frame2 = Frame(self)
self.frame3 = Frame(self)
self.frame4 = Frame(self)
self.frame5 = Frame(self)
self.frame1.grid(column=1, row=0)
self.frame2.grid(column=1, row=1)
self.frame3.grid(column=2, row=1)
self.frame4.grid(column=3, row=0)
self.frame5.grid(column=3, row=1)
if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data':
os.chdir(pathlib.Path('Data').absolute())
# Get lists of files
self.filenames = glob.glob('*.{}'.format('csv'))
# Combobox creation
self.chosen_file = tk.StringVar()
self.file_combobox = ttk.Combobox(
self.frame3, width=20, textvariable=self.chosen_file)
# Adding combobox drop down list
self.file_combobox['values'] = self.filenames
self.file_combobox.grid(column=1, row=0)
self.file_combobox.current(0)
# Creating blank canvas to plot input function on
self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
# Creating blank canvas to plot output function on
self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100)
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2)
self.canvas1.get_tk_widget().grid(row=0, column=0)
self.canvas1.draw()
toolbar = NavigationToolbar2Tk(self.canvas1, self.frame1)
toolbar.update()
self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame5)
self.canvas2.get_tk_widget().grid(row=0, column=0)
self.canvas2.draw()
toolbar = NavigationToolbar2Tk(self.canvas2, self.frame4)
toolbar.update()
# Creating a bunch of labels and input boxes for initial guesses for parameters
self.ymax_lbl = Label(self.frame3, text="ymax: ")
self.ymax_lbl.grid(column=0, row=1)
self.tmax_lbl = Label(self.frame3, text="tmax: ")
self.tmax_lbl.grid(column=0, row=2)
self.alpha_lbl = Label(self.frame3, text="alpha: ")
self.alpha_lbl.grid(column=0, row=3)
self.delay_lbl = Label(self.frame3, text="delay: ")
self.delay_lbl.grid(column=0, row=4)
self.ymax_slider = Scale(
self.frame3, from_=10, to=500, orient='horizontal', length=250, resolution=1)
self.ymax_slider.set(250)
self.ymax_slider.grid(column=1, row=1)
self.tmax_slider = Scale(
self.frame3, from_=0.0, to=20, orient='horizontal', length=250, resolution=0.5)
self.tmax_slider.set(6)
self.tmax_slider.grid(column=1, row=2)
self.alpha_slider = Scale(
self.frame3, from_=0, to=10, orient='horizontal', length=250, resolution=0.25)
self.alpha_slider.set(2)
self.alpha_slider.grid(column=1, row=3)
self.delay_slider = Scale(
self.frame3, from_=0, to=10, orient='horizontal', length=250, resolution=1)
self.delay_slider.set(0)
self.delay_slider.grid(column=1, row=4)
self.flow_lbl = Label(self.frame3, text="flow:")
self.flow_lbl.grid(column=0, row=6)
self.visf_lbl = Label(self.frame3, text="visf:")
self.visf_lbl.grid(column=0, row=7)
self.baseline_lbl = Label(self.frame3, text="baseline: ")
self.baseline_lbl.grid(column=0, row=8)
self.flow_slider = Scale(
self.frame3, from_=0, to=.1, orient='horizontal', length=250, resolution=0.0025)
self.flow_slider.set(0.03)
self.flow_slider.grid(column=1, row=6)
self.visf_slider = Scale(
self.frame3, from_=0, to=10, length=250, orient='horizontal', resolution=0.1)
self.visf_slider.set(2)
self.visf_slider.grid(column=1, row=7)
self.baseline_slider = Scale(
self.frame3, from_=20, to=80, length=250, orient='horizontal', resolution=1)
self.baseline_slider.set(50)
self.baseline_slider.grid(column=1, row=8)
# Creating buttons to load data and perform optimization
self.load_btn_text = tk.StringVar()
self.load_btn = Button(
master=self.frame3, textvariable=self.load_btn_text, command=self.load_data, padx=15)
self.load_btn_text.set("Load")
self.load_btn.grid(column=2, row=0)
self.opt_btn_text = tk.StringVar()
self.opt_btn = Button(
master=self.frame3, textvariable=self.opt_btn_text, command=self.plot)
self.opt_btn_text.set("Plot")
self.opt_btn.grid(column=2, row=3)
# Creating button to go back to main page
self.back_btn = Button(
master=self.frame3, text="Go Back", command=self.go_back)
self.back_btn.grid(column=1, row=9)
# #-------------------------------------------------------------
# #-------------------------------------------------------------
# #-------------------------------------------------------------
def plot(self):
"""Plots Cin and Cout curve using parameters given from sliders."""
file = self.file_combobox.get()
self.pk.get_data(file)
self.pk.ymax = self.ymax_slider.get()
self.pk.tmax = self.tmax_slider.get()
self.pk.alpha = self.alpha_slider.get()
self.pk.delay = self.delay_slider.get()
self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01),
self.pk.gamma_var(np.arange(0, 25, 0.01),
self.ymax_slider.get(),
self.tmax_slider.get(),
self.alpha_slider.get(),
self.delay_slider.get()), 'k-')
self.fig1.canvas.draw()
self.pk.flow = self.flow_slider.get()
self.pk.visf = self.visf_slider.get()
self.pk.baseline = self.baseline_slider.get()
# Plots fitted gamma_var curve
deriv_sol = solve_ivp(self.pk.derivs, [0, 30],
[0, 0], t_eval=self.pk.time)
fit_myo = deriv_sol.y[0] + deriv_sol.y[1]
self.fig2.add_subplot(111).plot(
self.pk.time, fit_myo + self.pk.baseline, 'm-')
self.canvas2.draw_idle()
def load_data(self):
"""Loads in the data selected in the combobox."""
file = self.file_combobox.get()
self.pk.get_data(file)
self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo')
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.fig1.canvas.draw()
self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro')
plt.ylabel("Mass of Tracer (mg)")
plt.xlabel("Time (sec)")
self.canvas2.draw_idle()
def go_back(self):
"""Exits the compare window and goes back to the start page."""
self.destroy()
# =================================================================================================
if __name__ == "__main__":
MainWindow = Tk()
gui = StartPage(MainWindow)
MainWindow.mainloop()
# In[ ]:
Classes
class PkCompare (parent)
-
Initializes the pkCompare application GUI
Initializes the pk_compare application GUI User can select a dataset from the dropdown menu and plot it. Plotting multiple datasets will overlay them. Navigation bar is provided to zoom in/out of the plot.
Expand source code
class PkCompare(tk.Toplevel): """Initializes the pkCompare application GUI""" def __init__(self, parent): # , master_root): """Initializes the pk_compare application GUI User can select a dataset from the dropdown menu and plot it. Plotting multiple datasets will overlay them. Navigation bar is provided to zoom in/out of the plot. """ super().__init__(name='pk Optimizer tool') self.parent = parent self.legend = [] # Making mainfraim to center the window to the screen mainframe = ttk.Frame(self) #mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(0, weight=1) width = 1100 height = 500 wids = self.winfo_screenwidth() heights = self.winfo_screenheight() xval = (wids/2) - (width/2) yval = (heights/2) - (height/2) self.geometry('+%d+%d' % (xval, yval)) self.pk = pk2c() self.geometry('1100x500') self.frame1 = Frame(self) self.frame2 = Frame(self, padx=10) self.frame3 = Frame(self) self.frame4 = Frame(self) self.frame5 = Frame(self) self.frame6 = Frame(self) self.frame7 = Frame(self) self.frame1.grid(column=0, row=2) self.frame2.grid(column=0, row=1) self.frame3.grid(column=2, row=2) self.frame4.grid(column=2, row=1) self.frame5.grid(column=1, row=1) self.frame6.grid(column=0, row=0) self.frame7.grid(column=2, row=0) if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data': os.chdir(pathlib.Path('Data').absolute()) # Get lists of files self.filenames = glob.glob('*.{}'.format('csv')) # Combobox creation self.chosen_file = tk.StringVar() self.file_combobox = ttk.Combobox( self.frame5, width=20, textvariable=self.chosen_file) # Adding combobox drop down list self.file_combobox['values'] = self.filenames self.file_combobox.grid(column=0, row=1) self.file_combobox.current(0) # Creating blank canvas to plot input function on self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2) self.canvas1.get_tk_widget().grid(row=0, column=0) self.canvas1.draw() toolbar = NavigationToolbar2Tk(self.canvas1, self.frame6) toolbar.update() # Creating blank canvas to plot output function on self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame4) self.canvas2.get_tk_widget().grid(row=0, column=0) self.canvas2.draw() toolbar = NavigationToolbar2Tk(self.canvas2, self.frame7) toolbar.update() # Creating buttons to load data and perform optimization self.load_btn_text = tk.StringVar() self.load_btn = Button( master=self.frame5, textvariable=self.load_btn_text, command=self.load_data) self.load_btn_text.set("Load") self.load_btn.grid(column=0, row=2) # Creating button to go back to main page self.back_btn = Button( master=self.frame5, text="Go Back", command=self.go_back) self.back_btn.grid(column=0, row=4) # #------------------------------------------------------------- # #------------------------------------------------------------- # #------------------------------------------------------------- def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.legend.append(file) self.pk.time = [] self.pk.aorta = [] self.pk.myo = [] self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle() plt.legend(self.legend) def go_back(self): """Exits the compare window and goes back to the start page.""" self.destroy()
Ancestors
- tkinter.Toplevel
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Wm
Methods
def go_back(self)
-
Exits the compare window and goes back to the start page.
Expand source code
def go_back(self): """Exits the compare window and goes back to the start page.""" self.destroy()
def load_data(self)
-
Loads in the data selected in the combobox.
Expand source code
def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.legend.append(file) self.pk.time = [] self.pk.aorta = [] self.pk.myo = [] self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle() plt.legend(self.legend)
class PkOptimize (parent)
-
Initializes the pk_optimize application GUI
Initializes the pk_optimize application GUI User selects a dataset from the dropdown box. Pressing the load button will plot the data selected. Once data is loaded, give your initial guesses for parameter values. Press Optimize button, and the optimal values will be outputted.
Attributes
wd
:path
- Absolute path name to current directory. Defaults to ./Data
filename
:string
- Name of the data file you'd like to access
time
:double
[]- list of all timepoints
aorta
:double
[]- concentration of tracer in aorta (input function)
myo
:double
[]- concentration of tracer in myocardial tissue (conc_isf)
Flow
:double
- Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1/60.
Vp
:double
- Vp is the volume of plasma in mL. Defaults to 0.05.
Visf
:double
- Visf is the volume of interstitial fluid in mL. Defaults to 0.15.
PS
:double
- PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60.
ymax
:int
- Magnitude of Gamma-var peak.
tmax
:double
- Time of which highest peak in Gamma-var appears
alpha
:double
- Scale factor
delay
:double
- Delay to start Gamma-var curve.
Expand source code
class PkOptimize(tk.Toplevel): """Initializes the pk_optimize application GUI""" def __init__(self, parent): # , master_root): """Initializes the pk_optimize application GUI User selects a dataset from the dropdown box. Pressing the load button will plot the data selected. Once data is loaded, give your initial guesses for parameter values. Press Optimize button, and the optimal values will be outputted. Attributes ----------- wd : path Absolute path name to current directory. Defaults to ./Data filename : string Name of the data file you'd like to access time : double[] list of all timepoints aorta : double[] concentration of tracer in aorta (input function) myo : double[] concentration of tracer in myocardial tissue (conc_isf) Flow : double Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1/60. Vp : double Vp is the volume of plasma in mL. Defaults to 0.05. Visf : double Visf is the volume of interstitial fluid in mL. Defaults to 0.15. PS : double PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60. ymax : int Magnitude of Gamma-var peak. tmax : double Time of which highest peak in Gamma-var appears alpha : double Scale factor delay : double Delay to start Gamma-var curve. """ super().__init__(name='pk Optimizer tool') self.parent = parent # Making mainfraim to center the window to the screen mainframe = ttk.Frame(self) #mainframe.grid(column=0, row=0, sticky=(N, W, E, S)) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(0, weight=1) # Calculating the center width = 1100 height = 600 wids = self.winfo_screenwidth() heights = self.winfo_screenheight() xval = (wids/2) - (width/2) yval = (heights/2) - (height/2) self.geometry('+%d+%d' % (xval, yval)) self.pk = pk2c() self.geometry('1100x600') self.frame1 = Frame(self) self.frame2 = Frame(self, padx=10) self.frame3 = Frame(self) self.frame4 = Frame(self) self.frame5 = Frame(self) self.frame1.grid(column=0, row=1) self.frame2.grid(column=0, row=0) self.frame3.grid(column=2, row=1) self.frame4.grid(column=2, row=0) self.frame5.grid(column=1, row=0) if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data': os.chdir(pathlib.Path('Data').absolute()) # Get lists of files self.filenames = glob.glob('*.{}'.format('csv')) # Combobox creation self.chosen_file = tk.StringVar() self.file_combobox = ttk.Combobox( self.frame5, width=20, textvariable=self.chosen_file) # Adding combobox drop down list self.file_combobox['values'] = self.filenames self.file_combobox.grid(column=0, row=1) self.file_combobox.current(0) # Creating blank canvas to plot input function on self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2) self.canvas1.get_tk_widget().grid(row=0, column=0) self.canvas1.draw() # Creating blank canvas to plot output function on self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame4) self.canvas2.get_tk_widget().grid(row=0, column=0) self.canvas2.draw() # Creating a bunch of labels and input boxes for initial guesses for parameters self.ymax_lbl = Label(self.frame1, text="ymax guess: ") self.ymax_lbl.grid(column=0, row=0) self.tmax_lbl = Label(self.frame1, text="tmax guess: ") self.tmax_lbl.grid(column=0, row=1) self.alpha_lbl = Label(self.frame1, text="alpha guess: ") self.alpha_lbl.grid(column=0, row=2) self.delay_lbl = Label(self.frame1, text="delay guess: ") self.delay_lbl.grid(column=0, row=3) self.ymax_input = Entry(self.frame1, width=50) self.ymax_input.grid(column=1, row=0) self.tmax_input = Entry(self.frame1, width=50) self.tmax_input.grid(column=1, row=1) self.alpha_input = Entry(self.frame1, width=50) self.alpha_input.grid(column=1, row=2) self.delay_input = Entry(self.frame1, width=50) self.delay_input.grid(column=1, row=3) self.ymax_opt_lbl = Label(self.frame1) self.ymax_opt_lbl.grid(column=2, row=0) self.tmax_opt_lbl = Label(self.frame1) self.tmax_opt_lbl.grid(column=2, row=1) self.alpha_opt_lbl = Label(self.frame1) self.alpha_opt_lbl.grid(column=2, row=2) self.delay_opt_lbl = Label(self.frame1) self.delay_opt_lbl.grid(column=2, row=3) self.flow_lbl = Label(self.frame3, text="flow guess: ") self.flow_lbl.grid(column=0, row=0) self.visf_lbl = Label(self.frame3, text="visf guess: ") self.visf_lbl.grid(column=0, row=1) self.baseline_lbl = Label(self.frame3, text="baseline guess: ") self.baseline_lbl.grid(column=0, row=2) self.flow_input = Entry(self.frame3, width=50) self.flow_input.grid(column=1, row=0) self.visf_input = Entry(self.frame3, width=50) self.visf_input.grid(column=1, row=1) self.baseline_input = Entry(self.frame3, width=50) self.baseline_input.grid(column=1, row=2) self.flow_opt_lbl = Label(self.frame3) self.flow_opt_lbl.grid(column=2, row=0) self.visf_opt_lbl = Label(self.frame3) self.visf_opt_lbl.grid(column=2, row=1) self.baseline_opt_lbl = Label(self.frame3) self.baseline_opt_lbl.grid(column=2, row=2) # Creating buttons to load data and perform optimization self.load_btn_text = tk.StringVar() self.load_btn = Button( master=self.frame5, textvariable=self.load_btn_text, command=self.load_data) self.load_btn_text.set("Load") self.load_btn.grid(column=0, row=2) self.opt_btn_text = tk.StringVar() self.opt_btn = Button( master=self.frame5, textvariable=self.opt_btn_text, command=self.perform_opt) self.opt_btn_text.set("Perform Optimization") self.opt_btn.grid(column=0, row=3) # Creating button to go back to main page self.back_btn = Button( master=self.frame5, text="Go Back", command=self.go_back) self.back_btn.grid(column=0, row=4) # #------------------------------------------------------------- # #------------------------------------------------------------- # #------------------------------------------------------------- def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle() def perform_opt(self): """Performs the optimization using the values taken from input boxes as inital guesses.""" # Performs function fitting, outputs optimized parameters in opt opt = self.pk.inputFuncFit([self.ymax_input.get(), self.tmax_input.get(), self.alpha_input.get(), self.delay_input.get()]) # Shows opt in new labels self.ymax_opt_lbl.configure(text=opt[0]) self.tmax_opt_lbl.configure(text=opt[1]) self.alpha_opt_lbl.configure(text=opt[2]) self.delay_opt_lbl.configure(text=opt[3]) # Plots fitted gamma_var curve self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01), self.pk.gamma_var(np.arange(0, 25, 0.01), opt[0], opt[1], opt[2], opt[3]), 'k-') self.canvas1.draw_idle() # Performs function fitting, outputs optimized parameters in opt opt = self.pk.outputFuncFit([self.flow_input.get(), self.visf_input.get(), self.baseline_input.get()]) # Shows opt in new labels self.flow_opt_lbl.configure(text=opt[0]) self.visf_opt_lbl.configure(text=opt[1]) self.baseline_opt_lbl.configure(text=opt[2]) # Plots fitted gamma_var curve deriv_sol = solve_ivp(self.pk.derivs, [0, 30], [0, 0], t_eval=self.pk.time) fit_myo = deriv_sol.y[0] + deriv_sol.y[1] self.fig2.add_subplot(111).plot(self.pk.time, fit_myo + opt[2], 'm-') self.canvas2.draw_idle() def go_back(self): """Closes the optimize application and leads you to the start page""" self.destroy()
Ancestors
- tkinter.Toplevel
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Wm
Methods
def go_back(self)
-
Closes the optimize application and leads you to the start page
Expand source code
def go_back(self): """Closes the optimize application and leads you to the start page""" self.destroy()
def load_data(self)
-
Loads in the data selected in the combobox.
Expand source code
def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle()
def perform_opt(self)
-
Performs the optimization using the values taken from input boxes as inital guesses.
Expand source code
def perform_opt(self): """Performs the optimization using the values taken from input boxes as inital guesses.""" # Performs function fitting, outputs optimized parameters in opt opt = self.pk.inputFuncFit([self.ymax_input.get(), self.tmax_input.get(), self.alpha_input.get(), self.delay_input.get()]) # Shows opt in new labels self.ymax_opt_lbl.configure(text=opt[0]) self.tmax_opt_lbl.configure(text=opt[1]) self.alpha_opt_lbl.configure(text=opt[2]) self.delay_opt_lbl.configure(text=opt[3]) # Plots fitted gamma_var curve self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01), self.pk.gamma_var(np.arange(0, 25, 0.01), opt[0], opt[1], opt[2], opt[3]), 'k-') self.canvas1.draw_idle() # Performs function fitting, outputs optimized parameters in opt opt = self.pk.outputFuncFit([self.flow_input.get(), self.visf_input.get(), self.baseline_input.get()]) # Shows opt in new labels self.flow_opt_lbl.configure(text=opt[0]) self.visf_opt_lbl.configure(text=opt[1]) self.baseline_opt_lbl.configure(text=opt[2]) # Plots fitted gamma_var curve deriv_sol = solve_ivp(self.pk.derivs, [0, 30], [0, 0], t_eval=self.pk.time) fit_myo = deriv_sol.y[0] + deriv_sol.y[1] self.fig2.add_subplot(111).plot(self.pk.time, fit_myo + opt[2], 'm-') self.canvas2.draw_idle()
class PkVisualize (parent)
-
Initializes the pkVisualize application GUI
Initializes the pk_visualize application GUI User can select a dataset from the dropdown menu and load it. Plotting multiple datasets will overlay them. Navigation bar is provided to zoom in/out of the plot. Using the sliders to change parameter values will result in different Cin and Cout curves. You must hit plot after every change to see it.
Expand source code
class PkVisualize(tk.Toplevel): """Initializes the pkVisualize application GUI""" def __init__(self, parent): # , master_root): """Initializes the pk_visualize application GUI User can select a dataset from the dropdown menu and load it. Plotting multiple datasets will overlay them. Navigation bar is provided to zoom in/out of the plot. Using the sliders to change parameter values will result in different Cin and Cout curves. You must hit plot after every change to see it. """ super().__init__(name='pk Optimizer tool') self.parent = parent # Making mainfraim to center the window to the screen mainframe = ttk.Frame(self) mainframe.columnconfigure(0, weight=1) mainframe.rowconfigure(0, weight=1) # Calculating the center width = 1280 height = 500 wids = self.winfo_screenwidth() heights = self.winfo_screenheight() xval = (wids/2) - (width/2) yval = (heights/2) - (height/2) self.geometry('+%d+%d' % (xval, yval)) self.pk = pk2c() self.geometry('1280x500') self.frame1 = Frame(self) self.frame2 = Frame(self) self.frame3 = Frame(self) self.frame4 = Frame(self) self.frame5 = Frame(self) self.frame1.grid(column=1, row=0) self.frame2.grid(column=1, row=1) self.frame3.grid(column=2, row=1) self.frame4.grid(column=3, row=0) self.frame5.grid(column=3, row=1) if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != 'Data': os.chdir(pathlib.Path('Data').absolute()) # Get lists of files self.filenames = glob.glob('*.{}'.format('csv')) # Combobox creation self.chosen_file = tk.StringVar() self.file_combobox = ttk.Combobox( self.frame3, width=20, textvariable=self.chosen_file) # Adding combobox drop down list self.file_combobox['values'] = self.filenames self.file_combobox.grid(column=1, row=0) self.file_combobox.current(0) # Creating blank canvas to plot input function on self.fig1 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") # Creating blank canvas to plot output function on self.fig2 = plt.figure(figsize=(4.5, 4.5), dpi=100) plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas1 = FigureCanvasTkAgg(self.fig1, master=self.frame2) self.canvas1.get_tk_widget().grid(row=0, column=0) self.canvas1.draw() toolbar = NavigationToolbar2Tk(self.canvas1, self.frame1) toolbar.update() self.canvas2 = FigureCanvasTkAgg(self.fig2, master=self.frame5) self.canvas2.get_tk_widget().grid(row=0, column=0) self.canvas2.draw() toolbar = NavigationToolbar2Tk(self.canvas2, self.frame4) toolbar.update() # Creating a bunch of labels and input boxes for initial guesses for parameters self.ymax_lbl = Label(self.frame3, text="ymax: ") self.ymax_lbl.grid(column=0, row=1) self.tmax_lbl = Label(self.frame3, text="tmax: ") self.tmax_lbl.grid(column=0, row=2) self.alpha_lbl = Label(self.frame3, text="alpha: ") self.alpha_lbl.grid(column=0, row=3) self.delay_lbl = Label(self.frame3, text="delay: ") self.delay_lbl.grid(column=0, row=4) self.ymax_slider = Scale( self.frame3, from_=10, to=500, orient='horizontal', length=250, resolution=1) self.ymax_slider.set(250) self.ymax_slider.grid(column=1, row=1) self.tmax_slider = Scale( self.frame3, from_=0.0, to=20, orient='horizontal', length=250, resolution=0.5) self.tmax_slider.set(6) self.tmax_slider.grid(column=1, row=2) self.alpha_slider = Scale( self.frame3, from_=0, to=10, orient='horizontal', length=250, resolution=0.25) self.alpha_slider.set(2) self.alpha_slider.grid(column=1, row=3) self.delay_slider = Scale( self.frame3, from_=0, to=10, orient='horizontal', length=250, resolution=1) self.delay_slider.set(0) self.delay_slider.grid(column=1, row=4) self.flow_lbl = Label(self.frame3, text="flow:") self.flow_lbl.grid(column=0, row=6) self.visf_lbl = Label(self.frame3, text="visf:") self.visf_lbl.grid(column=0, row=7) self.baseline_lbl = Label(self.frame3, text="baseline: ") self.baseline_lbl.grid(column=0, row=8) self.flow_slider = Scale( self.frame3, from_=0, to=.1, orient='horizontal', length=250, resolution=0.0025) self.flow_slider.set(0.03) self.flow_slider.grid(column=1, row=6) self.visf_slider = Scale( self.frame3, from_=0, to=10, length=250, orient='horizontal', resolution=0.1) self.visf_slider.set(2) self.visf_slider.grid(column=1, row=7) self.baseline_slider = Scale( self.frame3, from_=20, to=80, length=250, orient='horizontal', resolution=1) self.baseline_slider.set(50) self.baseline_slider.grid(column=1, row=8) # Creating buttons to load data and perform optimization self.load_btn_text = tk.StringVar() self.load_btn = Button( master=self.frame3, textvariable=self.load_btn_text, command=self.load_data, padx=15) self.load_btn_text.set("Load") self.load_btn.grid(column=2, row=0) self.opt_btn_text = tk.StringVar() self.opt_btn = Button( master=self.frame3, textvariable=self.opt_btn_text, command=self.plot) self.opt_btn_text.set("Plot") self.opt_btn.grid(column=2, row=3) # Creating button to go back to main page self.back_btn = Button( master=self.frame3, text="Go Back", command=self.go_back) self.back_btn.grid(column=1, row=9) # #------------------------------------------------------------- # #------------------------------------------------------------- # #------------------------------------------------------------- def plot(self): """Plots Cin and Cout curve using parameters given from sliders.""" file = self.file_combobox.get() self.pk.get_data(file) self.pk.ymax = self.ymax_slider.get() self.pk.tmax = self.tmax_slider.get() self.pk.alpha = self.alpha_slider.get() self.pk.delay = self.delay_slider.get() self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01), self.pk.gamma_var(np.arange(0, 25, 0.01), self.ymax_slider.get(), self.tmax_slider.get(), self.alpha_slider.get(), self.delay_slider.get()), 'k-') self.fig1.canvas.draw() self.pk.flow = self.flow_slider.get() self.pk.visf = self.visf_slider.get() self.pk.baseline = self.baseline_slider.get() # Plots fitted gamma_var curve deriv_sol = solve_ivp(self.pk.derivs, [0, 30], [0, 0], t_eval=self.pk.time) fit_myo = deriv_sol.y[0] + deriv_sol.y[1] self.fig2.add_subplot(111).plot( self.pk.time, fit_myo + self.pk.baseline, 'm-') self.canvas2.draw_idle() def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle() def go_back(self): """Exits the compare window and goes back to the start page.""" self.destroy()
Ancestors
- tkinter.Toplevel
- tkinter.BaseWidget
- tkinter.Misc
- tkinter.Wm
Methods
def go_back(self)
-
Exits the compare window and goes back to the start page.
Expand source code
def go_back(self): """Exits the compare window and goes back to the start page.""" self.destroy()
def load_data(self)
-
Loads in the data selected in the combobox.
Expand source code
def load_data(self): """Loads in the data selected in the combobox.""" file = self.file_combobox.get() self.pk.get_data(file) self.fig1.add_subplot(111).plot(self.pk.time, self.pk.aorta, 'bo') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.fig1.canvas.draw() self.fig2.add_subplot(111).plot(self.pk.time, self.pk.myo, 'ro') plt.ylabel("Mass of Tracer (mg)") plt.xlabel("Time (sec)") self.canvas2.draw_idle()
def plot(self)
-
Plots Cin and Cout curve using parameters given from sliders.
Expand source code
def plot(self): """Plots Cin and Cout curve using parameters given from sliders.""" file = self.file_combobox.get() self.pk.get_data(file) self.pk.ymax = self.ymax_slider.get() self.pk.tmax = self.tmax_slider.get() self.pk.alpha = self.alpha_slider.get() self.pk.delay = self.delay_slider.get() self.fig1.add_subplot(111).plot(np.arange(0, 25, 0.01), self.pk.gamma_var(np.arange(0, 25, 0.01), self.ymax_slider.get(), self.tmax_slider.get(), self.alpha_slider.get(), self.delay_slider.get()), 'k-') self.fig1.canvas.draw() self.pk.flow = self.flow_slider.get() self.pk.visf = self.visf_slider.get() self.pk.baseline = self.baseline_slider.get() # Plots fitted gamma_var curve deriv_sol = solve_ivp(self.pk.derivs, [0, 30], [0, 0], t_eval=self.pk.time) fit_myo = deriv_sol.y[0] + deriv_sol.y[1] self.fig2.add_subplot(111).plot( self.pk.time, fit_myo + self.pk.baseline, 'm-') self.canvas2.draw_idle()
class StartPage (root)
-
The StartPage class is the first page of the pk_GUI application. It has 4 buttons: Compare, Optimize, Visualize, and Exit Application. Each button will create a new window leading to the specified action. Exit will exit the whole application.
Initializing the class with tkinter window object root Parameters
root
:tkinter
object
- The Window which will show the application
Attributes
optimize_btn
:tkinter
button
- Clicking on the button leads to the optimizer application
compare_btn
:tkinter
button
- Clicking on the button leads to the compare application.
visualize_btn
:tkinter
button
- Clicking on the button leads to the vizualize application.
quitMainWindow
:tkinter
button
- Clicking ont he button closes and exits the application.
Expand source code
class StartPage(): """The StartPage class is the first page of the pk_GUI application. It has 4 buttons: Compare, Optimize, Visualize, and Exit Application. Each button will create a new window leading to the specified action. Exit will exit the whole application. """ def __init__(self, root): """Initializing the class with tkinter window object root Parameters ---------- root : tkinter object The Window which will show the application Attributes ----------- optimize_btn : tkinter button Clicking on the button leads to the optimizer application compare_btn : tkinter button Clicking on the button leads to the compare application. visualize_btn : tkinter button Clicking on the button leads to the vizualize application. quitMainWindow : tkinter button Clicking ont he button closes and exits the application. """ self.root = root self.root.title('PK Optimizer Tool') # Calculating the center width = self.root.winfo_reqwidth() height = self.root.winfo_reqheight() wids = self.root.winfo_screenwidth() heights = self.root.winfo_screenheight() xval = (wids/2) - (width/2) yval = (heights/2) - (height/2) self.root.geometry('+%d+%d' % (xval, yval)) # Making buttons self.label = Label(self.root, text="Please choose what application you'd like to explore: ", width=30, wraplength=200) self.label.grid(column=1, row=0, sticky='nwes') self.compare_btn = Button( self.root, text="Compare!", command=self.compare) self.compare_btn.grid(column=1, row=1, sticky='nwes') self.optimize_btn = Button( self.root, text="Optimize!", command=self.optimize) self.optimize_btn.grid(column=1, row=2, sticky='nwes') self.visualize_btn = Button( self.root, text="Visualize!", command=self.visualize) self.visualize_btn.grid(column=1, row=3, sticky='nwes') self.quit = Button( self.root, text="Exit Application", command=self.on_cancel) self.quit.grid(column=1, row=4, sticky='nwes') def compare(self): """Opens compare function.""" my_gui = PkCompare(self) def optimize(self): """Opens optimizer function.""" my_gui = PkOptimize(self) def visualize(self): """Opens visualize function.""" my_gui = PkVisualize(self) def on_cancel(self): """Exits and closes window""" self.root.destroy()
Methods
def compare(self)
-
Opens compare function.
Expand source code
def compare(self): """Opens compare function.""" my_gui = PkCompare(self)
def on_cancel(self)
-
Exits and closes window
Expand source code
def on_cancel(self): """Exits and closes window""" self.root.destroy()
def optimize(self)
-
Opens optimizer function.
Expand source code
def optimize(self): """Opens optimizer function.""" my_gui = PkOptimize(self)
def visualize(self)
-
Opens visualize function.
Expand source code
def visualize(self): """Opens visualize function.""" my_gui = PkVisualize(self)