diff --git a/docs/pk_two_comp.html b/docs/pk_two_comp.html
new file mode 100644
index 0000000000000000000000000000000000000000..a7c4dbbe156bf2bd1d449fc445c47edd96923673
--- /dev/null
+++ b/docs/pk_two_comp.html
@@ -0,0 +1,1506 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1" />
+<meta name="generator" content="pdoc 0.7.4" />
+<title>pk_two_comp API documentation</title>
+<meta name="description" content="The pk2Comp object is a two compartment PK model
+that outputs graphs of concentration of tracer over time." />
+<link href='https://cdnjs.cloudflare.com/ajax/libs/normalize/8.0.0/normalize.min.css' rel='stylesheet'>
+<link href='https://cdnjs.cloudflare.com/ajax/libs/10up-sanitize.css/8.0.0/sanitize.min.css' rel='stylesheet'>
+<link href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/github.min.css" rel="stylesheet">
+<style>.flex{display:flex !important}body{line-height:1.5em}#content{padding:20px}#sidebar{padding:30px;overflow:hidden}.http-server-breadcrumbs{font-size:130%;margin:0 0 15px 0}#footer{font-size:.75em;padding:5px 30px;border-top:1px solid #ddd;text-align:right}#footer p{margin:0 0 0 1em;display:inline-block}#footer p:last-child{margin-right:30px}h1,h2,h3,h4,h5{font-weight:300}h1{font-size:2.5em;line-height:1.1em}h2{font-size:1.75em;margin:1em 0 .50em 0}h3{font-size:1.4em;margin:25px 0 10px 0}h4{margin:0;font-size:105%}a{color:#058;text-decoration:none;transition:color .3s ease-in-out}a:hover{color:#e82}.title code{font-weight:bold}h2[id^="header-"]{margin-top:2em}.ident{color:#900}pre code{background:#f8f8f8;font-size:.8em;line-height:1.4em}code{background:#f2f2f1;padding:1px 4px;overflow-wrap:break-word}h1 code{background:transparent}pre{background:#f8f8f8;border:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;margin:1em 0;padding:1ex}#http-server-module-list{display:flex;flex-flow:column}#http-server-module-list div{display:flex}#http-server-module-list dt{min-width:10%}#http-server-module-list p{margin-top:0}.toc ul,#index{list-style-type:none;margin:0;padding:0}#index code{background:transparent}#index h3{border-bottom:1px solid #ddd}#index ul{padding:0}#index h4{font-weight:bold}#index h4 + ul{margin-bottom:.6em}@media (min-width:200ex){#index .two-column{column-count:2}}@media (min-width:300ex){#index .two-column{column-count:3}}dl{margin-bottom:2em}dl dl:last-child{margin-bottom:4em}dd{margin:0 0 1em 3em}#header-classes + dl > dd{margin-bottom:3em}dd dd{margin-left:2em}dd p{margin:10px 0}.name{background:#eee;font-weight:bold;font-size:.85em;padding:5px 10px;display:inline-block;min-width:40%}.name:hover{background:#e0e0e0}.name > span:first-child{white-space:nowrap}.name.class > span:nth-child(2){margin-left:.4em}.inherited{color:#999;border-left:5px solid #eee;padding-left:1em}.inheritance em{font-style:normal;font-weight:bold}.desc h2{font-weight:400;font-size:1.25em}.desc h3{font-size:1em}.desc dt code{background:inherit}.source summary,.git-link-div{color:#666;text-align:right;font-weight:400;font-size:.8em;text-transform:uppercase}.source summary > *{white-space:nowrap;cursor:pointer}.git-link{color:inherit;margin-left:1em}.source pre{max-height:500px;overflow:auto;margin:0}.source pre code{font-size:12px;overflow:visible}.hlist{list-style:none}.hlist li{display:inline}.hlist li:after{content:',\2002'}.hlist li:last-child:after{content:none}.hlist .hlist{display:inline;padding-left:1em}img{max-width:100%}.admonition{padding:.1em .5em;margin-bottom:1em}.admonition-title{font-weight:bold}.admonition.note,.admonition.info,.admonition.important{background:#aef}.admonition.todo,.admonition.versionadded,.admonition.tip,.admonition.hint{background:#dfd}.admonition.warning,.admonition.versionchanged,.admonition.deprecated{background:#fd4}.admonition.error,.admonition.danger,.admonition.caution{background:lightpink}</style>
+<style media="screen and (min-width: 700px)">@media screen and (min-width:700px){#sidebar{width:30%}#content{width:70%;max-width:100ch;padding:3em 4em;border-left:1px solid #ddd}pre code{font-size:1em}.item .name{font-size:1em}main{display:flex;flex-direction:row-reverse;justify-content:flex-end}.toc ul ul,#index ul{padding-left:1.5em}.toc > ul > li{margin-top:.5em}}</style>
+<style media="print">@media print{#sidebar h1{page-break-before:always}.source{display:none}}@media print{*{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a[href]:after{content:" (" attr(href) ")";font-size:90%}a[href][title]:after{content:none}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}@page{margin:0.5cm}p,h2,h3{orphans:3;widows:3}h1,h2,h3,h4,h5,h6{page-break-after:avoid}}</style>
+</head>
+<body>
+<main>
+<article id="content">
+<header>
+<h1 class="title">Module <code>pk_two_comp</code></h1>
+</header>
+<section id="section-intro">
+<p>The pk2Comp object is a two compartment PK model
+that outputs graphs of concentration of tracer over time.</p>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">#!/usr/bin/env python
+# coding: utf-8
+
+# In[1]:
+
+
+&#34;&#34;&#34;The pk2Comp object is a two compartment PK model
+    that outputs graphs of concentration of tracer over time.
+&#34;&#34;&#34;
+#!/usr/bin/env python
+# coding: utf-8
+
+# In[1]:
+import pathlib
+import os
+import csv
+import re
+import math
+import numpy as np
+import matplotlib.pyplot as plt
+
+from scipy.integrate import solve_ivp
+from scipy.optimize import fmin
+
+class pk_two_comp:
+    &#34;&#34;&#34;The pk2Comp object is a two compartment PK model
+    that outputs graphs of concentration of tracer over time.
+    &#34;&#34;&#34;
+
+    def __init__(self, wd=pathlib.Path(&#39;Data&#39;).absolute(), filename=&#39;CTPERF005_stress.csv&#39;):
+        &#34;&#34;&#34;Initializes the model with default parameter values for flow, Vp, Visf, and PS.
+        Parameters
+        ----------
+        wd : path
+            Absolute path name to current directory. Defaults to ./Data
+        filename : String
+            Name of the data file you&#39;d like to access
+
+        Attributes
+        -----------
+        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.
+
+        &#34;&#34;&#34;
+        # Subject Data
+        if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != &#39;Data&#39;:
+            self.wd = pathlib.Path(&#39;Data&#39;).absolute()
+        else:
+            self.wd = wd
+
+        if not isinstance(filename, str):
+            raise ValueError(&#39;Filename must be a string&#39;)
+
+        self.filename = filename
+        self.time = []
+        self.aorta = []
+        self.myo = []
+
+        # Declare Variables for initial conditions
+        # Compartment variables to be fitted
+        self.flow = 1/60
+        self.visf = 0.15
+        self.baseline = 60
+
+        # Other Compartmental Modelvariables
+        self.perm_surf = 0.35
+        self.vol_plasma = 0.10
+
+        # Solved ode
+        self.sol = []
+
+        # Gamma variables
+        self.ymax = 250
+        self.tmax = 6.5
+        self.alpha = 2.5
+        self.delay = 0
+
+        self.deriv_sol = np.array([])
+        self.fit_myo = np.array([])
+
+    def get_data(self, filename):
+        &#34;&#34;&#34;Imports data from all .csv files in directory.
+        Parameters
+        ----------
+        filename : string
+            Name of the data file you&#39;d like to access
+        wd : str
+            wd is the working directory path
+
+        Attributes
+        ----------
+        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)
+
+        Returns
+        -------
+        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)
+        &#34;&#34;&#34;
+        self.time = []
+        self.aorta = []
+        self.myo = []
+
+        os.chdir(self.wd)
+        # File not found error
+        if not os.path.isfile(filename):
+            raise ValueError(
+                &#34;Input file does not exist: {0}. I&#39;ll quit now.&#34;.format(filename))
+
+        data = list(csv.reader(open(filename), delimiter=&#39;\t&#39;))
+
+        for i in range(12):
+            self.time.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][0])[0]))
+            self.aorta.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][1])[0]))
+            self.myo.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][2])[0]))
+
+        return self.time, self.aorta, self.myo
+
+    # gamma_var distribution curve
+    def gamma_var(self, time=np.arange(0, 25), ymax=10, tmax=10, alpha=2, delay=0):
+        &#34;&#34;&#34;Creates a gamma variate probability density function with given alpha,
+        location, and scale values.
+        Parameters
+        ----------
+        t : double[]
+            array of timepoints
+        ymax : double
+            peak y value of gamma distribution
+        tmax : double
+            location of 50th percentile of function
+        alpha : double
+            scale parameter
+        delay : double
+            time delay of which to start gamma distribution
+
+        Returns
+        -------
+        y : double[]
+            probability density function of your gamma variate.
+        &#34;&#34;&#34;
+        # Following Madsen 1992 simplified parameterization for gamma variate
+        t = time
+        self.ymax = ymax
+        self.tmax = tmax
+        self.alpha = alpha
+        self.delay = delay
+
+        y = np.zeros(np.size(t))  # preallocate output
+
+        # For odeint, checks if t input is array or float
+        if isinstance(t, (list, np.ndarray)):
+            for i in range(np.size(y)):
+                if t[i] &lt; delay:
+                    y[i] = 0
+                else:
+                    y[i] = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t[i]-delay)
+                                 ** alpha*math.exp(-alpha*(t[i]-delay)/tmax), 3)
+        else:
+            y = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t-delay)
+                      ** alpha*math.exp(-alpha*(t-delay)/tmax), 3)
+        return y
+
+    # gamma_var_error
+    def input_mse(self, guess=[10, 10, 2, 5]):
+        &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+        gamma variate with given parameters values.
+        Parameters
+        ----------
+        param : ndarray[]
+            time : double[]
+                array of timepoints
+            ymax : double
+                peak y value of gamma distribution
+            tmax : double
+                location of 50th percentile of function
+            alpha : double
+                scale parameter
+            delay : double
+                time delay of which to start gamma distribution
+
+        Returns
+        -------
+        MSE : double
+            Mean squared error
+        &#34;&#34;&#34;
+        if len(guess) &lt; 1:
+            self.ymax = 10
+            self.tmax = 10
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 2:
+            self.ymax = guess[0]
+            self.tmax = 10
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 3:
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 4:
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = guess[2]
+            self.delay = 5
+        else:
+            # Mean squared error (MSE) between data and gamma variate with given parameters
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = guess[2]
+            self.delay = guess[3]
+
+        mse = 0
+
+        if self.tmax &lt;= 0 or self.ymax &lt;= 10 or self.delay &lt; 0 or self.alpha &lt; 0 \
+            or self.alpha &gt; 1000 or self.tmax &gt; 1000:
+            mse = 1000000  # just return a big number
+
+        else:
+            model_vals = self.gamma_var(
+                self.time, self.ymax, self.tmax, self.alpha, self.delay)
+
+            for i in range(len(self.aorta)):
+                mse = (self.aorta[i] - model_vals[i])**2 + mse
+            mse = mse / len(self.aorta)
+        return round(mse, 3)
+
+    def input_func_fit(self, initGuesses):
+        &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to
+        minimize loss function (MSE) of input function.
+        Parameters
+        ----------
+        initGuesses : ndarray[]
+            Array of initial guesses containing:
+                time : double[]
+                    array of timepoints
+                ymax : double
+                    peak y value of gamma distribution
+                tmax : double
+                    location of 50th percentile of function
+                alpha : double
+                    scale parameter
+                delay : double
+                    time delay of which to start gamma distribution
+        Returns
+        -------
+        opt : double[]
+            optimized parameters
+        &#34;&#34;&#34;
+        # Mean squared error (MSE) between data and gamma variate with given parameters
+        opt = fmin(self.input_mse, initGuesses, maxiter=1000)
+
+        self.ymax = opt[0]
+        self.tmax = opt[1]
+        self.alpha = opt[2]
+        self.delay = opt[3]
+
+        return opt.round(2)
+
+    # Derivative function
+    def derivs(self, time, curr_vals):
+        &#34;&#34;&#34;Finds derivatives of ODEs.
+
+        Parameters
+        ----------
+        curr_vals : double[]
+            curr_vals it he current values of the variables we wish to
+            &#34;update&#34; from the curr_vals list.
+
+        time : double[]
+            time is our time array from 0 to tmax with timestep dt.
+
+        Returns
+        -------
+        dconc_plasma_dt : double[]
+            contains the derivative of concentration in plasma with respect to time.
+        dconc_isf_dt : double[]
+            contains the derivative of concentration in interstitial fluid with respect to time.
+        &#34;&#34;&#34;
+        # Unpack the current values of the variables we wish to &#34;update&#34; from the curr_vals list
+        conc_plasma, conc_isf = curr_vals
+
+        # Define value of input function conc_in
+        conc_in = self.gamma_var(time, self.ymax, self.tmax,
+                                 self.alpha, self.delay)
+
+        # Right-hand side of odes, which are used to computer the derivative
+        dconc_plasma_dt = (self.flow/self.vol_plasma)*(conc_in - conc_plasma) + \
+            (self.perm_surf/self.vol_plasma)*(conc_isf - conc_plasma)
+        dconc_isf_dt = (self.perm_surf/self.visf)*(conc_plasma - conc_isf)
+        return dconc_plasma_dt, dconc_isf_dt
+
+    def output_mse(self, guess):
+        &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+        output derivs with given parameters values.
+        Parameters
+        ----------
+        guess : ndarray[]
+
+            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.
+        Returns
+        -------
+        MSE : double
+            Mean squared error
+        &#34;&#34;&#34;
+        self.flow = guess[0]
+        self.visf = guess[1]
+        self.baseline = guess[2]
+
+        mse = 0
+
+        if self.flow &lt;= 0 or self.flow &gt;= 25 or self.visf &gt; 100 \
+            or self.visf &lt; 0 or self.baseline &gt; 150 or self.baseline &lt; 0:
+            mse = 100000  # just return a big number
+
+        else:
+            sol = solve_ivp(self.derivs, [0, 30], [0, 0], t_eval=self.time)
+            MBF = sol.y[0] + sol.y[1]
+
+            temp = np.asarray(self.myo) - self.baseline
+
+            for i in range(len(self.myo)):
+                mse = (temp[i] - MBF[i])**2 + mse
+
+            mse = mse / len(self.myo)
+        return mse
+
+    def output_func_fit(self, initGuesses):
+        &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to minimize
+        loss function (MSE) of output function.
+        Parameters
+        ----------
+        initGuesses : ndarray[]
+            Array of initial guesses containing:
+                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.
+        Returns
+        -------
+        opt : double[]
+            optimized parameters
+        &#34;&#34;&#34;
+        # Mean squared error (MSE) between data and gamma variate with given parameters
+        opt1 = fmin(self.output_mse, initGuesses, maxiter=10000)
+
+        self.flow = opt1[0].round(4)
+        self.visf = opt1[1].round(4)
+        self.baseline = opt1[2].round(4)
+
+        return opt1.round(4)
+
+    def main(self):
+
+        # Gets data from file
+        self.get_data(self.filename)
+
+        # Plots original data
+        plt.plot(self.time, self.aorta, &#39;bo&#39;)
+        plt.plot(self.time, self.myo, &#39;ro&#39;)
+
+        # Fit gamma_var input function and plots it
+        opt = self.input_func_fit([250, 7, 4, 0])
+        plt.plot(np.arange(0, 25, 0.01), self.gamma_var(np.arange(0, 25, 0.01),
+                                                        opt[0], opt[1], opt[2], opt[3]), &#39;k-&#39;)
+
+        # Fit uptake function and plot it
+        opt2 = self.output_func_fit([.011418, .62, self.myo[0]])
+        self.deriv_sol = solve_ivp(self.derivs, [0, 30],
+                                   [0, 0], t_eval=self.time)
+        self.fit_myo = self.deriv_sol.y[0] + self.deriv_sol.y[1]
+        plt.plot(self.time, self.fit_myo + self.baseline, &#39;m-&#39;)
+        </code></pre>
+</details>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+</section>
+<section>
+<h2 class="section-title" id="header-classes">Classes</h2>
+<dl>
+<dt id="pk_two_comp.pk_two_comp"><code class="flex name class">
+<span>class <span class="ident">pk_two_comp</span></span>
+<span>(</span><span>wd=WindowsPath('C:/Users/Ethan/OneDrive - Michigan State University/MSU/Classwork/Computational Modeling/Models/Data'), filename='CTPERF005_stress.csv')</span>
+</code></dt>
+<dd>
+<section class="desc"><p>The pk2Comp object is a two compartment PK model
+that outputs graphs of concentration of tracer over time.</p>
+<p>Initializes the model with default parameter values for flow, Vp, Visf, and PS.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>wd</code></strong> :&ensp;<code>path</code></dt>
+<dd>Absolute path name to current directory. Defaults to ./Data</dd>
+<dt><strong><code>filename</code></strong> :&ensp;<code>String</code></dt>
+<dd>Name of the data file you'd like to access</dd>
+</dl>
+<h2 id="attributes">Attributes</h2>
+<dl>
+<dt><strong><code>time</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>list of all timepoints</dd>
+<dt><strong><code>aorta</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in aorta (input function)</dd>
+<dt><strong><code>myo</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in myocardial tissue (conc_isf)</dd>
+<dt><strong><code>Flow</code></strong> :&ensp;<code>double</code></dt>
+<dd>Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1/60.</dd>
+<dt><strong><code>Vp</code></strong> :&ensp;<code>double</code></dt>
+<dd>Vp is the volume of plasma in mL. Defaults to 0.05.</dd>
+<dt><strong><code>Visf</code></strong> :&ensp;<code>double</code></dt>
+<dd>Visf is the volume of interstitial fluid in mL. Defaults to 0.15.</dd>
+<dt><strong><code>PS</code></strong> :&ensp;<code>double</code></dt>
+<dd>PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60.</dd>
+<dt><strong><code>ymax</code></strong> :&ensp;<code>int</code></dt>
+<dd>Magnitude of Gamma-var peak.</dd>
+<dt><strong><code>tmax</code></strong> :&ensp;<code>double</code></dt>
+<dd>Time of which highest peak in Gamma-var appears</dd>
+<dt><strong><code>alpha</code></strong> :&ensp;<code>double</code></dt>
+<dd>Scale factor</dd>
+<dt><strong><code>delay</code></strong> :&ensp;<code>double</code></dt>
+<dd>Delay to start Gamma-var curve.</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">class pk_two_comp:
+    &#34;&#34;&#34;The pk2Comp object is a two compartment PK model
+    that outputs graphs of concentration of tracer over time.
+    &#34;&#34;&#34;
+
+    def __init__(self, wd=pathlib.Path(&#39;Data&#39;).absolute(), filename=&#39;CTPERF005_stress.csv&#39;):
+        &#34;&#34;&#34;Initializes the model with default parameter values for flow, Vp, Visf, and PS.
+        Parameters
+        ----------
+        wd : path
+            Absolute path name to current directory. Defaults to ./Data
+        filename : String
+            Name of the data file you&#39;d like to access
+
+        Attributes
+        -----------
+        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.
+
+        &#34;&#34;&#34;
+        # Subject Data
+        if os.path.basename(os.path.normpath(pathlib.Path().absolute())) != &#39;Data&#39;:
+            self.wd = pathlib.Path(&#39;Data&#39;).absolute()
+        else:
+            self.wd = wd
+
+        if not isinstance(filename, str):
+            raise ValueError(&#39;Filename must be a string&#39;)
+
+        self.filename = filename
+        self.time = []
+        self.aorta = []
+        self.myo = []
+
+        # Declare Variables for initial conditions
+        # Compartment variables to be fitted
+        self.flow = 1/60
+        self.visf = 0.15
+        self.baseline = 60
+
+        # Other Compartmental Modelvariables
+        self.perm_surf = 0.35
+        self.vol_plasma = 0.10
+
+        # Solved ode
+        self.sol = []
+
+        # Gamma variables
+        self.ymax = 250
+        self.tmax = 6.5
+        self.alpha = 2.5
+        self.delay = 0
+
+        self.deriv_sol = np.array([])
+        self.fit_myo = np.array([])
+
+    def get_data(self, filename):
+        &#34;&#34;&#34;Imports data from all .csv files in directory.
+        Parameters
+        ----------
+        filename : string
+            Name of the data file you&#39;d like to access
+        wd : str
+            wd is the working directory path
+
+        Attributes
+        ----------
+        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)
+
+        Returns
+        -------
+        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)
+        &#34;&#34;&#34;
+        self.time = []
+        self.aorta = []
+        self.myo = []
+
+        os.chdir(self.wd)
+        # File not found error
+        if not os.path.isfile(filename):
+            raise ValueError(
+                &#34;Input file does not exist: {0}. I&#39;ll quit now.&#34;.format(filename))
+
+        data = list(csv.reader(open(filename), delimiter=&#39;\t&#39;))
+
+        for i in range(12):
+            self.time.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][0])[0]))
+            self.aorta.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][1])[0]))
+            self.myo.append(
+                float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][2])[0]))
+
+        return self.time, self.aorta, self.myo
+
+    # gamma_var distribution curve
+    def gamma_var(self, time=np.arange(0, 25), ymax=10, tmax=10, alpha=2, delay=0):
+        &#34;&#34;&#34;Creates a gamma variate probability density function with given alpha,
+        location, and scale values.
+        Parameters
+        ----------
+        t : double[]
+            array of timepoints
+        ymax : double
+            peak y value of gamma distribution
+        tmax : double
+            location of 50th percentile of function
+        alpha : double
+            scale parameter
+        delay : double
+            time delay of which to start gamma distribution
+
+        Returns
+        -------
+        y : double[]
+            probability density function of your gamma variate.
+        &#34;&#34;&#34;
+        # Following Madsen 1992 simplified parameterization for gamma variate
+        t = time
+        self.ymax = ymax
+        self.tmax = tmax
+        self.alpha = alpha
+        self.delay = delay
+
+        y = np.zeros(np.size(t))  # preallocate output
+
+        # For odeint, checks if t input is array or float
+        if isinstance(t, (list, np.ndarray)):
+            for i in range(np.size(y)):
+                if t[i] &lt; delay:
+                    y[i] = 0
+                else:
+                    y[i] = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t[i]-delay)
+                                 ** alpha*math.exp(-alpha*(t[i]-delay)/tmax), 3)
+        else:
+            y = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t-delay)
+                      ** alpha*math.exp(-alpha*(t-delay)/tmax), 3)
+        return y
+
+    # gamma_var_error
+    def input_mse(self, guess=[10, 10, 2, 5]):
+        &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+        gamma variate with given parameters values.
+        Parameters
+        ----------
+        param : ndarray[]
+            time : double[]
+                array of timepoints
+            ymax : double
+                peak y value of gamma distribution
+            tmax : double
+                location of 50th percentile of function
+            alpha : double
+                scale parameter
+            delay : double
+                time delay of which to start gamma distribution
+
+        Returns
+        -------
+        MSE : double
+            Mean squared error
+        &#34;&#34;&#34;
+        if len(guess) &lt; 1:
+            self.ymax = 10
+            self.tmax = 10
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 2:
+            self.ymax = guess[0]
+            self.tmax = 10
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 3:
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = 2
+            self.delay = 5
+        elif len(guess) &lt; 4:
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = guess[2]
+            self.delay = 5
+        else:
+            # Mean squared error (MSE) between data and gamma variate with given parameters
+            self.ymax = guess[0]
+            self.tmax = guess[1]
+            self.alpha = guess[2]
+            self.delay = guess[3]
+
+        mse = 0
+
+        if self.tmax &lt;= 0 or self.ymax &lt;= 10 or self.delay &lt; 0 or self.alpha &lt; 0 \
+            or self.alpha &gt; 1000 or self.tmax &gt; 1000:
+            mse = 1000000  # just return a big number
+
+        else:
+            model_vals = self.gamma_var(
+                self.time, self.ymax, self.tmax, self.alpha, self.delay)
+
+            for i in range(len(self.aorta)):
+                mse = (self.aorta[i] - model_vals[i])**2 + mse
+            mse = mse / len(self.aorta)
+        return round(mse, 3)
+
+    def input_func_fit(self, initGuesses):
+        &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to
+        minimize loss function (MSE) of input function.
+        Parameters
+        ----------
+        initGuesses : ndarray[]
+            Array of initial guesses containing:
+                time : double[]
+                    array of timepoints
+                ymax : double
+                    peak y value of gamma distribution
+                tmax : double
+                    location of 50th percentile of function
+                alpha : double
+                    scale parameter
+                delay : double
+                    time delay of which to start gamma distribution
+        Returns
+        -------
+        opt : double[]
+            optimized parameters
+        &#34;&#34;&#34;
+        # Mean squared error (MSE) between data and gamma variate with given parameters
+        opt = fmin(self.input_mse, initGuesses, maxiter=1000)
+
+        self.ymax = opt[0]
+        self.tmax = opt[1]
+        self.alpha = opt[2]
+        self.delay = opt[3]
+
+        return opt.round(2)
+
+    # Derivative function
+    def derivs(self, time, curr_vals):
+        &#34;&#34;&#34;Finds derivatives of ODEs.
+
+        Parameters
+        ----------
+        curr_vals : double[]
+            curr_vals it he current values of the variables we wish to
+            &#34;update&#34; from the curr_vals list.
+
+        time : double[]
+            time is our time array from 0 to tmax with timestep dt.
+
+        Returns
+        -------
+        dconc_plasma_dt : double[]
+            contains the derivative of concentration in plasma with respect to time.
+        dconc_isf_dt : double[]
+            contains the derivative of concentration in interstitial fluid with respect to time.
+        &#34;&#34;&#34;
+        # Unpack the current values of the variables we wish to &#34;update&#34; from the curr_vals list
+        conc_plasma, conc_isf = curr_vals
+
+        # Define value of input function conc_in
+        conc_in = self.gamma_var(time, self.ymax, self.tmax,
+                                 self.alpha, self.delay)
+
+        # Right-hand side of odes, which are used to computer the derivative
+        dconc_plasma_dt = (self.flow/self.vol_plasma)*(conc_in - conc_plasma) + \
+            (self.perm_surf/self.vol_plasma)*(conc_isf - conc_plasma)
+        dconc_isf_dt = (self.perm_surf/self.visf)*(conc_plasma - conc_isf)
+        return dconc_plasma_dt, dconc_isf_dt
+
+    def output_mse(self, guess):
+        &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+        output derivs with given parameters values.
+        Parameters
+        ----------
+        guess : ndarray[]
+
+            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.
+        Returns
+        -------
+        MSE : double
+            Mean squared error
+        &#34;&#34;&#34;
+        self.flow = guess[0]
+        self.visf = guess[1]
+        self.baseline = guess[2]
+
+        mse = 0
+
+        if self.flow &lt;= 0 or self.flow &gt;= 25 or self.visf &gt; 100 \
+            or self.visf &lt; 0 or self.baseline &gt; 150 or self.baseline &lt; 0:
+            mse = 100000  # just return a big number
+
+        else:
+            sol = solve_ivp(self.derivs, [0, 30], [0, 0], t_eval=self.time)
+            MBF = sol.y[0] + sol.y[1]
+
+            temp = np.asarray(self.myo) - self.baseline
+
+            for i in range(len(self.myo)):
+                mse = (temp[i] - MBF[i])**2 + mse
+
+            mse = mse / len(self.myo)
+        return mse
+
+    def output_func_fit(self, initGuesses):
+        &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to minimize
+        loss function (MSE) of output function.
+        Parameters
+        ----------
+        initGuesses : ndarray[]
+            Array of initial guesses containing:
+                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.
+        Returns
+        -------
+        opt : double[]
+            optimized parameters
+        &#34;&#34;&#34;
+        # Mean squared error (MSE) between data and gamma variate with given parameters
+        opt1 = fmin(self.output_mse, initGuesses, maxiter=10000)
+
+        self.flow = opt1[0].round(4)
+        self.visf = opt1[1].round(4)
+        self.baseline = opt1[2].round(4)
+
+        return opt1.round(4)
+
+    def main(self):
+
+        # Gets data from file
+        self.get_data(self.filename)
+
+        # Plots original data
+        plt.plot(self.time, self.aorta, &#39;bo&#39;)
+        plt.plot(self.time, self.myo, &#39;ro&#39;)
+
+        # Fit gamma_var input function and plots it
+        opt = self.input_func_fit([250, 7, 4, 0])
+        plt.plot(np.arange(0, 25, 0.01), self.gamma_var(np.arange(0, 25, 0.01),
+                                                        opt[0], opt[1], opt[2], opt[3]), &#39;k-&#39;)
+
+        # Fit uptake function and plot it
+        opt2 = self.output_func_fit([.011418, .62, self.myo[0]])
+        self.deriv_sol = solve_ivp(self.derivs, [0, 30],
+                                   [0, 0], t_eval=self.time)
+        self.fit_myo = self.deriv_sol.y[0] + self.deriv_sol.y[1]
+        plt.plot(self.time, self.fit_myo + self.baseline, &#39;m-&#39;)</code></pre>
+</details>
+<h3>Methods</h3>
+<dl>
+<dt id="pk_two_comp.pk_two_comp.derivs"><code class="name flex">
+<span>def <span class="ident">derivs</span></span>(<span>self, time, curr_vals)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Finds derivatives of ODEs.</p>
+<h2 id="parameters">Parameters</h2>
+<dl>
+<dt><strong><code>curr_vals</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>curr_vals it he current values of the variables we wish to
+"update" from the curr_vals list.</dd>
+<dt><strong><code>time</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>time is our time array from 0 to tmax with timestep dt.</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>dconc_plasma_dt</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>contains the derivative of concentration in plasma with respect to time.</dd>
+<dt><strong><code>dconc_isf_dt</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>contains the derivative of concentration in interstitial fluid with respect to time.</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def derivs(self, time, curr_vals):
+    &#34;&#34;&#34;Finds derivatives of ODEs.
+
+    Parameters
+    ----------
+    curr_vals : double[]
+        curr_vals it he current values of the variables we wish to
+        &#34;update&#34; from the curr_vals list.
+
+    time : double[]
+        time is our time array from 0 to tmax with timestep dt.
+
+    Returns
+    -------
+    dconc_plasma_dt : double[]
+        contains the derivative of concentration in plasma with respect to time.
+    dconc_isf_dt : double[]
+        contains the derivative of concentration in interstitial fluid with respect to time.
+    &#34;&#34;&#34;
+    # Unpack the current values of the variables we wish to &#34;update&#34; from the curr_vals list
+    conc_plasma, conc_isf = curr_vals
+
+    # Define value of input function conc_in
+    conc_in = self.gamma_var(time, self.ymax, self.tmax,
+                             self.alpha, self.delay)
+
+    # Right-hand side of odes, which are used to computer the derivative
+    dconc_plasma_dt = (self.flow/self.vol_plasma)*(conc_in - conc_plasma) + \
+        (self.perm_surf/self.vol_plasma)*(conc_isf - conc_plasma)
+    dconc_isf_dt = (self.perm_surf/self.visf)*(conc_plasma - conc_isf)
+    return dconc_plasma_dt, dconc_isf_dt</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.gamma_var"><code class="name flex">
+<span>def <span class="ident">gamma_var</span></span>(<span>self, time=array([ 0,
+1,
+2,
+3,
+4,
+5,
+6,
+7,
+8,
+9, 10, 11, 12, 13, 14, 15, 16,
+17, 18, 19, 20, 21, 22, 23, 24]), ymax=10, tmax=10, alpha=2, delay=0)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Creates a gamma variate probability density function with given alpha,
+location, and scale values.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>t</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>array of timepoints</dd>
+<dt><strong><code>ymax</code></strong> :&ensp;<code>double</code></dt>
+<dd>peak y value of gamma distribution</dd>
+<dt><strong><code>tmax</code></strong> :&ensp;<code>double</code></dt>
+<dd>location of 50th percentile of function</dd>
+<dt><strong><code>alpha</code></strong> :&ensp;<code>double</code></dt>
+<dd>scale parameter</dd>
+<dt><strong><code>delay</code></strong> :&ensp;<code>double</code></dt>
+<dd>time delay of which to start gamma distribution</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>y</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>probability density function of your gamma variate.</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def gamma_var(self, time=np.arange(0, 25), ymax=10, tmax=10, alpha=2, delay=0):
+    &#34;&#34;&#34;Creates a gamma variate probability density function with given alpha,
+    location, and scale values.
+    Parameters
+    ----------
+    t : double[]
+        array of timepoints
+    ymax : double
+        peak y value of gamma distribution
+    tmax : double
+        location of 50th percentile of function
+    alpha : double
+        scale parameter
+    delay : double
+        time delay of which to start gamma distribution
+
+    Returns
+    -------
+    y : double[]
+        probability density function of your gamma variate.
+    &#34;&#34;&#34;
+    # Following Madsen 1992 simplified parameterization for gamma variate
+    t = time
+    self.ymax = ymax
+    self.tmax = tmax
+    self.alpha = alpha
+    self.delay = delay
+
+    y = np.zeros(np.size(t))  # preallocate output
+
+    # For odeint, checks if t input is array or float
+    if isinstance(t, (list, np.ndarray)):
+        for i in range(np.size(y)):
+            if t[i] &lt; delay:
+                y[i] = 0
+            else:
+                y[i] = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t[i]-delay)
+                             ** alpha*math.exp(-alpha*(t[i]-delay)/tmax), 3)
+    else:
+        y = round((ymax*tmax**(-alpha)*math.exp(alpha))*(t-delay)
+                  ** alpha*math.exp(-alpha*(t-delay)/tmax), 3)
+    return y</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.get_data"><code class="name flex">
+<span>def <span class="ident">get_data</span></span>(<span>self, filename)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Imports data from all .csv files in directory.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>filename</code></strong> :&ensp;<code>string</code></dt>
+<dd>Name of the data file you'd like to access</dd>
+<dt><strong><code>wd</code></strong> :&ensp;<code>str</code></dt>
+<dd>wd is the working directory path</dd>
+</dl>
+<h2 id="attributes">Attributes</h2>
+<dl>
+<dt><strong><code>time</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>list of all timepoints</dd>
+<dt><strong><code>aorta</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in aorta (input function)</dd>
+<dt><strong><code>myo</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in myocardial tissue (conc_isf)</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>time</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>list of all timepoints</dd>
+<dt><strong><code>aorta</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in aorta (input function)</dd>
+<dt><strong><code>myo</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>concentration of tracer in myocardial tissue (conc_isf)</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def get_data(self, filename):
+    &#34;&#34;&#34;Imports data from all .csv files in directory.
+    Parameters
+    ----------
+    filename : string
+        Name of the data file you&#39;d like to access
+    wd : str
+        wd is the working directory path
+
+    Attributes
+    ----------
+    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)
+
+    Returns
+    -------
+    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)
+    &#34;&#34;&#34;
+    self.time = []
+    self.aorta = []
+    self.myo = []
+
+    os.chdir(self.wd)
+    # File not found error
+    if not os.path.isfile(filename):
+        raise ValueError(
+            &#34;Input file does not exist: {0}. I&#39;ll quit now.&#34;.format(filename))
+
+    data = list(csv.reader(open(filename), delimiter=&#39;\t&#39;))
+
+    for i in range(12):
+        self.time.append(
+            float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][0])[0]))
+        self.aorta.append(
+            float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][1])[0]))
+        self.myo.append(
+            float(re.compile(r&#39;\d+[.]+\d+|\d+&#39;).findall(data[i+1][2])[0]))
+
+    return self.time, self.aorta, self.myo</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.input_func_fit"><code class="name flex">
+<span>def <span class="ident">input_func_fit</span></span>(<span>self, initGuesses)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Uses fmin algorithm (Nelder-Mead simplex algorithm) to
+minimize loss function (MSE) of input function.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>initGuesses</code></strong> :&ensp;<code>ndarray</code>[]</dt>
+<dd>Array of initial guesses containing:
+time : double[]
+array of timepoints
+ymax : double
+peak y value of gamma distribution
+tmax : double
+location of 50th percentile of function
+alpha : double
+scale parameter
+delay : double
+time delay of which to start gamma distribution</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>opt</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>optimized parameters</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def input_func_fit(self, initGuesses):
+    &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to
+    minimize loss function (MSE) of input function.
+    Parameters
+    ----------
+    initGuesses : ndarray[]
+        Array of initial guesses containing:
+            time : double[]
+                array of timepoints
+            ymax : double
+                peak y value of gamma distribution
+            tmax : double
+                location of 50th percentile of function
+            alpha : double
+                scale parameter
+            delay : double
+                time delay of which to start gamma distribution
+    Returns
+    -------
+    opt : double[]
+        optimized parameters
+    &#34;&#34;&#34;
+    # Mean squared error (MSE) between data and gamma variate with given parameters
+    opt = fmin(self.input_mse, initGuesses, maxiter=1000)
+
+    self.ymax = opt[0]
+    self.tmax = opt[1]
+    self.alpha = opt[2]
+    self.delay = opt[3]
+
+    return opt.round(2)</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.input_mse"><code class="name flex">
+<span>def <span class="ident">input_mse</span></span>(<span>self, guess=[10, 10, 2, 5])</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Calculates Mean squared error (MSE) between data and
+gamma variate with given parameters values.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>param</code></strong> :&ensp;<code>ndarray</code>[]</dt>
+<dd>time : double[]
+array of timepoints
+ymax : double
+peak y value of gamma distribution
+tmax : double
+location of 50th percentile of function
+alpha : double
+scale parameter
+delay : double
+time delay of which to start gamma distribution</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>MSE</code></strong> :&ensp;<code>double</code></dt>
+<dd>Mean squared error</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def input_mse(self, guess=[10, 10, 2, 5]):
+    &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+    gamma variate with given parameters values.
+    Parameters
+    ----------
+    param : ndarray[]
+        time : double[]
+            array of timepoints
+        ymax : double
+            peak y value of gamma distribution
+        tmax : double
+            location of 50th percentile of function
+        alpha : double
+            scale parameter
+        delay : double
+            time delay of which to start gamma distribution
+
+    Returns
+    -------
+    MSE : double
+        Mean squared error
+    &#34;&#34;&#34;
+    if len(guess) &lt; 1:
+        self.ymax = 10
+        self.tmax = 10
+        self.alpha = 2
+        self.delay = 5
+    elif len(guess) &lt; 2:
+        self.ymax = guess[0]
+        self.tmax = 10
+        self.alpha = 2
+        self.delay = 5
+    elif len(guess) &lt; 3:
+        self.ymax = guess[0]
+        self.tmax = guess[1]
+        self.alpha = 2
+        self.delay = 5
+    elif len(guess) &lt; 4:
+        self.ymax = guess[0]
+        self.tmax = guess[1]
+        self.alpha = guess[2]
+        self.delay = 5
+    else:
+        # Mean squared error (MSE) between data and gamma variate with given parameters
+        self.ymax = guess[0]
+        self.tmax = guess[1]
+        self.alpha = guess[2]
+        self.delay = guess[3]
+
+    mse = 0
+
+    if self.tmax &lt;= 0 or self.ymax &lt;= 10 or self.delay &lt; 0 or self.alpha &lt; 0 \
+        or self.alpha &gt; 1000 or self.tmax &gt; 1000:
+        mse = 1000000  # just return a big number
+
+    else:
+        model_vals = self.gamma_var(
+            self.time, self.ymax, self.tmax, self.alpha, self.delay)
+
+        for i in range(len(self.aorta)):
+            mse = (self.aorta[i] - model_vals[i])**2 + mse
+        mse = mse / len(self.aorta)
+    return round(mse, 3)</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.main"><code class="name flex">
+<span>def <span class="ident">main</span></span>(<span>self)</span>
+</code></dt>
+<dd>
+<section class="desc"></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def main(self):
+
+    # Gets data from file
+    self.get_data(self.filename)
+
+    # Plots original data
+    plt.plot(self.time, self.aorta, &#39;bo&#39;)
+    plt.plot(self.time, self.myo, &#39;ro&#39;)
+
+    # Fit gamma_var input function and plots it
+    opt = self.input_func_fit([250, 7, 4, 0])
+    plt.plot(np.arange(0, 25, 0.01), self.gamma_var(np.arange(0, 25, 0.01),
+                                                    opt[0], opt[1], opt[2], opt[3]), &#39;k-&#39;)
+
+    # Fit uptake function and plot it
+    opt2 = self.output_func_fit([.011418, .62, self.myo[0]])
+    self.deriv_sol = solve_ivp(self.derivs, [0, 30],
+                               [0, 0], t_eval=self.time)
+    self.fit_myo = self.deriv_sol.y[0] + self.deriv_sol.y[1]
+    plt.plot(self.time, self.fit_myo + self.baseline, &#39;m-&#39;)</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.output_func_fit"><code class="name flex">
+<span>def <span class="ident">output_func_fit</span></span>(<span>self, initGuesses)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Uses fmin algorithm (Nelder-Mead simplex algorithm) to minimize
+loss function (MSE) of output function.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>initGuesses</code></strong> :&ensp;<code>ndarray</code>[]</dt>
+<dd>
+<p>Array of initial guesses containing:
+flow : double
+Flow is the flow of plasma through the blood vessel in mL/(mL*min).
+Defaults to 1/60.</p>
+<p>Vp : double
+Vp is the volume of plasma in mL. Defaults to 0.05.</p>
+<p>Visf : double
+Visf is the volume of interstitial fluid in mL. Defaults to 0.15.</p>
+<p>PS : double
+PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60.</p>
+</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>opt</code></strong> :&ensp;<code>double</code>[]</dt>
+<dd>optimized parameters</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def output_func_fit(self, initGuesses):
+    &#34;&#34;&#34;Uses fmin algorithm (Nelder-Mead simplex algorithm) to minimize
+    loss function (MSE) of output function.
+    Parameters
+    ----------
+    initGuesses : ndarray[]
+        Array of initial guesses containing:
+            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.
+    Returns
+    -------
+    opt : double[]
+        optimized parameters
+    &#34;&#34;&#34;
+    # Mean squared error (MSE) between data and gamma variate with given parameters
+    opt1 = fmin(self.output_mse, initGuesses, maxiter=10000)
+
+    self.flow = opt1[0].round(4)
+    self.visf = opt1[1].round(4)
+    self.baseline = opt1[2].round(4)
+
+    return opt1.round(4)</code></pre>
+</details>
+</dd>
+<dt id="pk_two_comp.pk_two_comp.output_mse"><code class="name flex">
+<span>def <span class="ident">output_mse</span></span>(<span>self, guess)</span>
+</code></dt>
+<dd>
+<section class="desc"><p>Calculates Mean squared error (MSE) between data and
+output derivs with given parameters values.
+Parameters</p>
+<hr>
+<dl>
+<dt><strong><code>guess</code></strong> :&ensp;<code>ndarray</code>[]</dt>
+<dd>
+<p>Flow : double
+Flow is the flow of plasma through the blood vessel in mL/(mL*min).
+Defaults to 1/60.</p>
+<p>Vp : double
+Vp is the volume of plasma in mL. Defaults to 0.05.</p>
+<p>Visf : double
+Visf is the volume of interstitial fluid in mL. Defaults to 0.15.</p>
+<p>PS : double
+PS is the permeability-surface area constant in mL/(g*min). Defaults to 1/60.</p>
+</dd>
+</dl>
+<h2 id="returns">Returns</h2>
+<dl>
+<dt><strong><code>MSE</code></strong> :&ensp;<code>double</code></dt>
+<dd>Mean squared error</dd>
+</dl></section>
+<details class="source">
+<summary>
+<span>Expand source code</span>
+</summary>
+<pre><code class="python">def output_mse(self, guess):
+    &#34;&#34;&#34;Calculates Mean squared error (MSE) between data and
+    output derivs with given parameters values.
+    Parameters
+    ----------
+    guess : ndarray[]
+
+        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.
+    Returns
+    -------
+    MSE : double
+        Mean squared error
+    &#34;&#34;&#34;
+    self.flow = guess[0]
+    self.visf = guess[1]
+    self.baseline = guess[2]
+
+    mse = 0
+
+    if self.flow &lt;= 0 or self.flow &gt;= 25 or self.visf &gt; 100 \
+        or self.visf &lt; 0 or self.baseline &gt; 150 or self.baseline &lt; 0:
+        mse = 100000  # just return a big number
+
+    else:
+        sol = solve_ivp(self.derivs, [0, 30], [0, 0], t_eval=self.time)
+        MBF = sol.y[0] + sol.y[1]
+
+        temp = np.asarray(self.myo) - self.baseline
+
+        for i in range(len(self.myo)):
+            mse = (temp[i] - MBF[i])**2 + mse
+
+        mse = mse / len(self.myo)
+    return mse</code></pre>
+</details>
+</dd>
+</dl>
+</dd>
+</dl>
+</section>
+</article>
+<nav id="sidebar">
+<h1>Index</h1>
+<div class="toc">
+<ul></ul>
+</div>
+<ul id="index">
+<li><h3><a href="#header-classes">Classes</a></h3>
+<ul>
+<li>
+<h4><code><a title="pk_two_comp.pk_two_comp" href="#pk_two_comp.pk_two_comp">pk_two_comp</a></code></h4>
+<ul class="two-column">
+<li><code><a title="pk_two_comp.pk_two_comp.derivs" href="#pk_two_comp.pk_two_comp.derivs">derivs</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.gamma_var" href="#pk_two_comp.pk_two_comp.gamma_var">gamma_var</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.get_data" href="#pk_two_comp.pk_two_comp.get_data">get_data</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.input_func_fit" href="#pk_two_comp.pk_two_comp.input_func_fit">input_func_fit</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.input_mse" href="#pk_two_comp.pk_two_comp.input_mse">input_mse</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.main" href="#pk_two_comp.pk_two_comp.main">main</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.output_func_fit" href="#pk_two_comp.pk_two_comp.output_func_fit">output_func_fit</a></code></li>
+<li><code><a title="pk_two_comp.pk_two_comp.output_mse" href="#pk_two_comp.pk_two_comp.output_mse">output_mse</a></code></li>
+</ul>
+</li>
+</ul>
+</li>
+</ul>
+</nav>
+</main>
+<footer id="footer">
+<p>Generated by <a href="https://pdoc3.github.io/pdoc"><cite>pdoc</cite> 0.7.4</a>.</p>
+</footer>
+<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/highlight.min.js"></script>
+<script>hljs.initHighlightingOnLoad()</script>
+</body>
+</html>
\ No newline at end of file