Module pk1Comp

Expand source code
#!/usr/bin/env python
# coding: utf-8

# In[1]:


# Import commands
from scipy.stats import gamma
import numpy as np
import matplotlib.pyplot as plt
#%matplotlib inline
from scipy.integrate import odeint 
import math as math

class pk1Comp:
    
    """The pk1Comp object is a one compartment PK model that outputs graphs of mass of tracer over time."""

    def __init__ (self, numParam = 4, Flow = 1, Vp = 0.1, Visf = 0.5, PS = 0.15):
        
        """Initializes the model with default parameter values for flow, Vp, Visf, and PS.
        Parameters
        ----------      
        numParam: int
            numParam is the number of parameters you want to optimize for the model. Defaults to 4.
            
        Flow : double
            Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1.
        
        Vp : double
            Vp is the volume of plasma in mL. Defaults to 0.1.
            
        Visf : double
            Visf is the volume of interstitial fluid in mL. Defaults to 0.5.
        
        PS : double
            PS is the permeability-surface area constant in mL/(g*min). Defaults to 0.15.      
        """
        
        # Declare Variables for initial conditions
        self.numParam = numParam
        self.Flow = Flow
        self.Vp = Vp
        self.Visf = Visf
        self.PS = PS
        C0 = 0 # Initial concentration of tracer in plasma
        tmax = 10 #Time in seconds
        dt = 0.1 #Time step
        a = 2. # Alpha for gamma distribution
        rv = gamma(a, loc = 2, scale = 0.65) #input function

        # Define the time array
        time = np.arange(0, tmax + dt, dt)
        
    # Derivative function
    def derivs(curr_vals, time):
        """Finds derivatives of ODEs.
        
        Parameters
        ----------      
        curr_vals : double[]
            curr_vals it he current values of the variables we wish to "update" from the curr_vals list.
            
        time : double[]
            time is our time array from 0 to tmax with timestep dt.
            
        Returns
        -------
        dc_dt : double[]
            contains the derivative of concentrations with respect to time.
        """

        # Define value of input function Cin
        Cin = rv.pdf(time)    

        # Unpack the current values of the variables we wish to "update" from the curr_vals list
        C = curr_vals

        # Right-hand side of odes, which are used to computer the derivative
        dC_dt = flow*(Cin - C)/Vol
        #Cout = C
        return dC_dt
    
    def getPlot(self):
        """Plots the solution of the solved ODEs.
        
        Parameters
        ----------      
        self : self
            Passes variables needed from self. 
        """
        
        # Plot the results using the values stored in the solution variable, "sol"
        # Plot Cp using the "0" element from the solution
        plt.figure(1)
        plt.plot(time, rv.pdf(time), color = 'blue', label = 'Input Function')
        plt.plot(time, sol[:,0],color="green", label = 'Cout')

        # Plot Cisf using the "1" element from the solution
        #plt.plot(time, sol[:,1],color="purple", label = 'Cisf')
        plt.xlabel('Time [s]')
        plt.ylabel('Concentration [mM]')
        plt.legend(loc = 'best')
        plt.grid()
        
    def main(self):
        """Main function to run and solve ODEs"""
        
        # Store the initial values in a list
        init = [C0]

        # Solve the odes with odeint
        sol = odeint(derivs, init, time)

        #Mass_plasma = Vp * sol[:,0] #mass of tracer in plasma
        #Mass_isf = Visf * sol[:,1] #mass of tracer in isf
        #Tp = Vp/(flow + PS) # mean transit time
        #E = 1 - np.exp(-PS/flow) #extraction fraction
        #Q = Mass_plasma + Mass_isf

        #print('The mean transit time is ' + str(Tp))
        #print('The extraction fraction is ' + str(E))

        # Plot mass of tracer using the "2" element from the solution
        #plt.figure(2)
        #plt.plot(time, Mass_plasma,color="red", label = 'Plasma')
        # Plot mass of tracer in tissue using the "3" element from the solution
        #plt.plot(time, Mass_isf,color="black", label = 'Interstitial Space')
        #plt.plot(time, Q, color="blue", label = 'Total mass')
        #plt.xlabel('Time [s]')
        #plt.ylabel('Mass [mg]')
        #plt.legend(loc = 'best')
        #plt.grid()


# In[ ]:

Classes

class pk1Comp (numParam=4, Flow=1, Vp=0.1, Visf=0.5, PS=0.15)

The pk1Comp object is a one compartment PK model that outputs graphs of mass of tracer over time.

Initializes the model with default parameter values for flow, Vp, Visf, and PS. Parameters


numParam: int numParam is the number of parameters you want to optimize for the model. Defaults to 4.

Flow : double Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1.

Vp : double Vp is the volume of plasma in mL. Defaults to 0.1.

Visf : double Visf is the volume of interstitial fluid in mL. Defaults to 0.5.

PS : double PS is the permeability-surface area constant in mL/(g*min). Defaults to 0.15.

Expand source code
class pk1Comp:
    
    """The pk1Comp object is a one compartment PK model that outputs graphs of mass of tracer over time."""

    def __init__ (self, numParam = 4, Flow = 1, Vp = 0.1, Visf = 0.5, PS = 0.15):
        
        """Initializes the model with default parameter values for flow, Vp, Visf, and PS.
        Parameters
        ----------      
        numParam: int
            numParam is the number of parameters you want to optimize for the model. Defaults to 4.
            
        Flow : double
            Flow is the flow of plasma through the blood vessel in mL/(mL*min). Defaults to 1.
        
        Vp : double
            Vp is the volume of plasma in mL. Defaults to 0.1.
            
        Visf : double
            Visf is the volume of interstitial fluid in mL. Defaults to 0.5.
        
        PS : double
            PS is the permeability-surface area constant in mL/(g*min). Defaults to 0.15.      
        """
        
        # Declare Variables for initial conditions
        self.numParam = numParam
        self.Flow = Flow
        self.Vp = Vp
        self.Visf = Visf
        self.PS = PS
        C0 = 0 # Initial concentration of tracer in plasma
        tmax = 10 #Time in seconds
        dt = 0.1 #Time step
        a = 2. # Alpha for gamma distribution
        rv = gamma(a, loc = 2, scale = 0.65) #input function

        # Define the time array
        time = np.arange(0, tmax + dt, dt)
        
    # Derivative function
    def derivs(curr_vals, time):
        """Finds derivatives of ODEs.
        
        Parameters
        ----------      
        curr_vals : double[]
            curr_vals it he current values of the variables we wish to "update" from the curr_vals list.
            
        time : double[]
            time is our time array from 0 to tmax with timestep dt.
            
        Returns
        -------
        dc_dt : double[]
            contains the derivative of concentrations with respect to time.
        """

        # Define value of input function Cin
        Cin = rv.pdf(time)    

        # Unpack the current values of the variables we wish to "update" from the curr_vals list
        C = curr_vals

        # Right-hand side of odes, which are used to computer the derivative
        dC_dt = flow*(Cin - C)/Vol
        #Cout = C
        return dC_dt
    
    def getPlot(self):
        """Plots the solution of the solved ODEs.
        
        Parameters
        ----------      
        self : self
            Passes variables needed from self. 
        """
        
        # Plot the results using the values stored in the solution variable, "sol"
        # Plot Cp using the "0" element from the solution
        plt.figure(1)
        plt.plot(time, rv.pdf(time), color = 'blue', label = 'Input Function')
        plt.plot(time, sol[:,0],color="green", label = 'Cout')

        # Plot Cisf using the "1" element from the solution
        #plt.plot(time, sol[:,1],color="purple", label = 'Cisf')
        plt.xlabel('Time [s]')
        plt.ylabel('Concentration [mM]')
        plt.legend(loc = 'best')
        plt.grid()
        
    def main(self):
        """Main function to run and solve ODEs"""
        
        # Store the initial values in a list
        init = [C0]

        # Solve the odes with odeint
        sol = odeint(derivs, init, time)

Methods

def derivs(curr_vals, time)

Finds derivatives of ODEs.

Parameters

curr_vals : double[] curr_vals it he current values of the variables we wish to "update" from the curr_vals list.

time : double[] time is our time array from 0 to tmax with timestep dt.

Returns

dc_dt : double[]
contains the derivative of concentrations with respect to time.
Expand source code
def derivs(curr_vals, time):
    """Finds derivatives of ODEs.
    
    Parameters
    ----------      
    curr_vals : double[]
        curr_vals it he current values of the variables we wish to "update" from the curr_vals list.
        
    time : double[]
        time is our time array from 0 to tmax with timestep dt.
        
    Returns
    -------
    dc_dt : double[]
        contains the derivative of concentrations with respect to time.
    """

    # Define value of input function Cin
    Cin = rv.pdf(time)    

    # Unpack the current values of the variables we wish to "update" from the curr_vals list
    C = curr_vals

    # Right-hand side of odes, which are used to computer the derivative
    dC_dt = flow*(Cin - C)/Vol
    #Cout = C
    return dC_dt
def getPlot(self)

Plots the solution of the solved ODEs.

Parameters

self : self Passes variables needed from self.

Expand source code
def getPlot(self):
    """Plots the solution of the solved ODEs.
    
    Parameters
    ----------      
    self : self
        Passes variables needed from self. 
    """
    
    # Plot the results using the values stored in the solution variable, "sol"
    # Plot Cp using the "0" element from the solution
    plt.figure(1)
    plt.plot(time, rv.pdf(time), color = 'blue', label = 'Input Function')
    plt.plot(time, sol[:,0],color="green", label = 'Cout')

    # Plot Cisf using the "1" element from the solution
    #plt.plot(time, sol[:,1],color="purple", label = 'Cisf')
    plt.xlabel('Time [s]')
    plt.ylabel('Concentration [mM]')
    plt.legend(loc = 'best')
    plt.grid()
def main(self)

Main function to run and solve ODEs

Expand source code
def main(self):
    """Main function to run and solve ODEs"""
    
    # Store the initial values in a list
    init = [C0]

    # Solve the odes with odeint
    sol = odeint(derivs, init, time)