8.15. Multi-cellular transport

Integration of membrane protein and transport of substrates between multiple cellular compartments using BioCRNpyler membrane components and transport mechanisms

All the examples below show the use of the membrane transport mechanism of Simple Diffusion, Simple Transport, Facilitated Transport, and Primary Active Transport occurring between two cells sharing the same external environment. Although each example uses the exact transport mechanism, the mechanisms used do not have to be the same. However, the membrane protein cannot start from DNA in both cells for this multi-cellular transport to function correctly. The compartment of the monomer needs to be indicated when expressing the membrane protein from DNA.

Packages

[1]:
import numpy as np
%matplotlib inline
import bokeh.io
import bokeh.plotting
bokeh.io.output_notebook()
from bokeh.themes import Theme
from bokeh.layouts import row

#Modules needed from Bokeh.
from bokeh.io import output_file, show
from bokeh.plotting import gridplot,figure
from bokeh.models import LinearAxis, Range1d
color=bokeh.palettes.Accent[6]

from bokeh.io import export_png
Loading BokehJS ...
[2]:
#Function with some standard Bokeh plot settings
def create_custom_plot(title_text, x_max=8,y_max=2, yname=None):
    custom_plot = figure(
        toolbar_location='right',
        outline_line_color=None,
        min_border_right=10,
        height=400,
        width=400,
    )

    custom_plot.title.text = title_text
    custom_plot.xaxis.axis_label = 'Time (hours)'
    custom_plot.yaxis.axis_label = yname
    custom_plot.y_range = Range1d(0, y_max)
    custom_plot.x_range = Range1d(0, x_max)
    custom_plot.outline_line_color = None

    #custom_plot.yaxis
    custom_plot.ygrid.visible = False
    custom_plot.yaxis.axis_label_text_font_size = '15pt'
    custom_plot.yaxis.major_label_text_font_size = '15pt'
    custom_plot.yaxis.major_label_text_font = 'Work Sans'
    custom_plot.yaxis.axis_label_standoff = 15
    custom_plot.yaxis.axis_label_text_font_style = 'normal'

    #custom_plot.xaxis
    custom_plot.xgrid.visible = False
    custom_plot.xaxis.axis_label_text_font_size = '15pt'
    custom_plot.xaxis.major_label_text_font_size = '15pt'
    custom_plot.xaxis.major_label_text_font = 'Work Sans'
    custom_plot.xaxis.axis_label_standoff = 15
    custom_plot.xaxis.axis_label_text_font_style = 'normal'

    #custom_plot.title
    custom_plot.title.text_font_size = '18pt'
    custom_plot.title.align = 'left'
    custom_plot.title.offset = -50.0

    return custom_plot

Example 1: Simple diffusion across multiple compartments

Simple_Diffusion_Communication.png

Consider the following diffusion step:

  1. Diffusion of small molecules (i.e. Nitrate):

    \[\begin{aligned} \text{NO3}_{\text{internal}_0} \rightleftharpoons \text{NO3}_\text{external} \rightleftharpoons \text{NO3}_{\text{internal}_1} \end{aligned}\]

Create the cells: Cell 0 and Cell 1

[3]:
from biocrnpyler.core import Mixture, ChemicalReactionNetwork, Compartment
from biocrnpyler.components import DiffusibleMolecule
from biocrnpyler.mechanisms import Simple_Diffusion

#Identify the compartments
Internal_0 = Compartment(name='Internal_0')
Internal_1 = Compartment(name='Internal_1')

#Identify the diffusible molecule
NO3_cell_0 = DiffusibleMolecule('NO3', internal_compartment='Internal_0')
NO3_cell_1 = DiffusibleMolecule('NO3', internal_compartment='Internal_1')

#Mechanisms
mech_tra = Simple_Diffusion()
tra_mechanisms = {mech_tra.mechanism_type:mech_tra}

#Create mixture and compile
M = Mixture("Cell0-Cell1", components = [NO3_cell_0, NO3_cell_1],
            mechanisms = tra_mechanisms,
            parameter_file = "membrane_toolbox_parameters.txt")
CRN0 = M.compile_crn()
CRN0.write_sbml_file("N03_cells.xml")
print(CRN0.pretty_print(show_keys=False, show_compartment=True))
Species(N = 3) = {
    NO3 in Internal_1. (@ 0),
    NO3 in External. (@ 0),
    NO3 in Internal_0. (@ 0),
}

Reactions (2) = [
0. NO3 <--> NO3
 Kf=k_forward * NO3_Internal_0
 Kr=k_reverse * NO3_External
  k_forward=0.0002
  k_reverse=0.0002

1. NO3 <--> NO3
 Kf=k_forward * NO3_Internal_1
 Kr=k_reverse * NO3_External
  k_forward=0.0002
  k_reverse=0.0002

]
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[4]:
#Simulate CRN
try:
    import bioscrape
    import bokeh
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')
else:
    import numpy as np
    import pandas as pd
    maxtime = 300000
    timepoints = np.arange(0, maxtime, 100)

    #Inital conditions
    x0_dict= {'NO3_Internal_0':2}

    #Run Simulation
    R = CRN0.simulate_with_bioscrape_via_sbml(timepoints = timepoints, initial_condition_dict = x0_dict)

    #Plot NO3 diffusion
    pNO3 =create_custom_plot("NO3 Diffusion", x_max=8,y_max= 2, yname='NO3 (uM)')
    pNO3.line(R["time"]/3600,  R['NO3_Internal_0'], line_width = 3, color=color[0], legend_label='Internal_0')
    pNO3.line(R["time"]/3600,  R['NO3_Internal_1'], line_width = 3, color=color[1],legend_label='Internal_1')
    pNO3.line(R["time"]/3600,  R['NO3_External'], line_width = 3, color=color[2],legend_label='External',line_dash = 'dashed')

    #Display the layout
    pNO3.legend.click_policy="hide"
    show(pNO3)

Example 2: Simple transport across multiple compartments

Simple_Transport_Communication.png

Consider the following substrate transport steps for each cell:

  1. Assemble into a homoheptamer:

    \[\begin{aligned} 7 \text{$\alpha$HL}_\text{monomer} \rightarrow \text{$\alpha$HL}_\text{homoheptamer} \end{aligned}\]
  2. Integration of membrane protein in membrane:

    \[\begin{aligned} \text{$\alpha$HL}_\text{homoheptamer} \rightarrow \text{$\alpha$HL}_\text{channel}. \end{aligned}\]

Followed by the transport reactions specific to each cell:

  1. Diffusion of small molecules (i.e. ATP) across membrane:

    \[\begin{split}\begin{aligned} \text{ATP}_{\text{internal}_0} +\text{$\alpha$HL}_{\text{channel}_0} \rightleftharpoons \text{ATP}_\text{external }+ \text{$\alpha$HL}_{\text{channel}_0}\\ \text{ATP}_{\text{internal}_1} +\text{$\alpha$HL}_{\text{channel}_1} \rightleftharpoons \text{ATP}_\text{external} + \text{$\alpha$HL}_{\text{channel}_1} \end{aligned}\end{split}\]

Identify the membrane protein monomer

[5]:
from biocrnpyler.components import IntegralMembraneProtein
from biocrnpyler.mechanisms import Membrane_Protein_Integration
from biocrnpyler.core import Mixture

#Identify the compartments
Internal_0 = Compartment(name='Internal_0')
Internal_1 = Compartment(name='Internal_1')
Membrane_0 = Compartment(name='Membrane_0')
Membrane_1 = Compartment(name='Membrane_1')

#Identify the membrane protein monomer
alphaHL_monomer_0 = IntegralMembraneProtein('alphaHL_monomer',
                                          product='alphaHL',
                                          compartment=Internal_0,
                                          membrane_compartment=Membrane_0,
                                          size=7)
alphaHL_monomer_1 = IntegralMembraneProtein('alphaHL_monomer',
                                          product='alphaHL_1',
                                          compartment=Internal_1,
                                          membrane_compartment=Membrane_1,
                                          size=7)

#Mechanism
mech_int = Membrane_Protein_Integration()
int_mechanisms = {mech_int.mechanism_type:mech_int}

#Create mixture and compile
M1 = Mixture("Integration_Cell0_Cell1", components = [alphaHL_monomer_0,
                                                      alphaHL_monomer_1],
             mechanisms = int_mechanisms,
             parameter_file = "membrane_toolbox_parameters.txt")
CRN_cell0_and_cell1 = M1.compile_crn()
CRN_cell0_and_cell1.write_sbml_file("alphaHL_cell0.xml")
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[5]:
True

Define membrane channel and transport mechanism

[6]:
from biocrnpyler.components import MembraneChannel
from biocrnpyler.mechanisms import Simple_Transport

#Define membrane channel and transport mechanism
alphaHL_channel_0 = MembraneChannel(alphaHL_monomer_0.product,
                                    substrate='ATP',
                                    internal_compartment=Internal_0)
alphaHL_channel_1 = MembraneChannel(alphaHL_monomer_1.product,
                                    substrate='ATP',
                                    internal_compartment=Internal_1)

#Mechanism
mech_tra = Simple_Transport()
tra_mechanisms = {mech_tra.mechanism_type:mech_tra}

#Create mixture and compile
M2_c0 = Mixture("Channel_Cell0_1", components = [alphaHL_channel_0, alphaHL_channel_1],
               mechanisms = tra_mechanisms,
               parameter_file = "membrane_toolbox_parameters.txt")
CRN2_cell0_and_1 = M2_c0.compile_crn()
CRN2_cell0_and_1.write_sbml_file("alphaHL_channel_cell0.xml")
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[6]:
True
[7]:
# Create combined mixture
M = Mixture("Transport_Multiple_Compartments_alphaHL",
            components = [alphaHL_monomer_0, alphaHL_monomer_1,
                          alphaHL_channel_0, alphaHL_channel_1],
            mechanisms = int_mechanisms | tra_mechanisms,
            parameter_file = "membrane_toolbox_parameters.txt")
CRN_transport = M.compile_crn()
CRN_transport.write_sbml_file("alphaHL_transport_multiple_compartments.xml")
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[7]:
True
[8]:
#Simulate CRN
try:
    import bioscrape
    import bokeh
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')
else:
    import numpy as np
    import pandas as pd
    maxtime = 300000
    timepoints = np.arange(0, maxtime, 100)

    #Inital conditions
    x0_dict= {'ATP_Internal_1':1,'protein_alphaHL_monomer_Internal_1':.5,
              'protein_alphaHL_monomer_Internal_0':.3,}

    #Run Simulation
    R = CRN_transport.simulate_with_bioscrape_via_sbml(timepoints = timepoints, initial_condition_dict = x0_dict)

    #Plot the transport of substrate ATP
    paHL =create_custom_plot("Simple Transport of ATP", x_max=8,y_max= 1, yname='ATP (uM)')
    paHL.line(R["time"]/3600,  R['ATP_Internal_0'], line_width = 3, legend_label = "Internal_0", color =  color[0])
    paHL.line(R["time"]/3600,  R['ATP_Internal_1'], line_width = 3, legend_label = "Internal_1", color =  color[1])
    paHL.line(R["time"]/3600,  R['ATP_External'], line_width = 3, legend_label = "Enternal", color = color[2], line_dash = 'dashed')

    #Show Figure
    paHL.legend.click_policy="hide"
    show(paHL)

Example 3: Facilitated transport across multiple compartments

Facilitated_Transport_Communication.png

In this example, the membrane channel is found in two different orientations: native orientation in Cell_0 and inverted orientation in Cell_1, thus acting as an exporter.

Consider the following substrate transport steps for cell_0:

  1. Integration of membrane protein in membrane:

    \[\begin{aligned} \text{GLUT1}_\text{monomer} \rightarrow \text{GLUT1}_{\text{channel}_0} \end{aligned}\]

while Glut1 in Cell_1 is modeled as an incorporated membrane channel. Without going into all the reactions of the Glut1 transport of glucose in Cell_1 the overarching reaction is:

\[\begin{split}\begin{aligned} \text{glucose}_{\text{internal}_1} + \text{GLUT1}_{\text{channel}_1} \longrightarrow \text{GLUT1}_{\text{channel}_1} + \text{glucose}_{\text{external}}. \\ \end{aligned}\end{split}\]

Then glucose exported by Cell_1 is then imported by Cell_0 following the simplified reaction:

\[\begin{aligned} \text{glucose}_\text{external} + \text{GLUT1}_{\text{channel}_0} \longrightarrow \text{GLUT1}_{\text{channel}_0} + glucose_{\text{internal}_0}. \end{aligned}\]

Identify the membrane protein monomers

[9]:
#Identify the compartments
Internal_0 = Compartment(name='Internal_0')
Internal_1 = Compartment(name='Internal_1')
Membrane_0 = Compartment(name='Membrane_0')
Membrane_1 = Compartment(name='Membrane_1')

#Identify the membrane protein monomer
glut1_cell0 = IntegralMembraneProtein('glut1', product='glut1_channel',
                                      direction='Importer', size= 1,
                                      compartment=Internal_0,
                                      membrane_compartment=Membrane_0)
glut1_cell1 = IntegralMembraneProtein('glut1', product='glut1_channel',
                                      direction='Exporter', size= 1,
                                      compartment=Internal_1,
                                      membrane_compartment=Membrane_1)

#Mechanism
mech_int = Membrane_Protein_Integration()
int_mechanisms = {mech_int.mechanism_type:mech_int}

#Create mixture and compile
M1 = Mixture("Integration_Cell0_Cell1", components = [glut1_cell0, glut1_cell1],
               mechanisms = int_mechanisms,
               parameter_file = "membrane_toolbox_parameters.txt")
CRN_cell0_cell1 = M1.compile_crn()
CRN_cell0_cell1.write_sbml_file("glut1_cell0_cell1.xml")

/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[9]:
True

Define membrane channels and the transport mechanism

[10]:
from biocrnpyler.mechanisms import Facilitated_Transport_MM
from biocrnpyler.components import MembraneChannel

#Define membrane channel and transport mechanism
glut1_channel_cell0 = MembraneChannel(glut1_cell0.product, substrate='glucose',
                                      internal_compartment=Internal_0)
glut1_channel_cell1 = MembraneChannel(glut1_cell1.product, substrate='glucose',
                                      internal_compartment=Internal_1)

#Mechanism
mech_tra = Facilitated_Transport_MM()
tra_mechanisms = {mech_tra.mechanism_type:mech_tra}

#Create mixture and compile
M2 = Mixture("Channel_Cell0_Cell1",
             components = [glut1_channel_cell0, glut1_channel_cell1],
             mechanisms = tra_mechanisms,
             parameter_file = "membrane_toolbox_parameters.txt")
CRN2_cell0_cell1 = M2.compile_crn()
CRN2_cell0_cell1.write_sbml_file("glut1_channel_cell0_cell1.xml")
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[10]:
True

Combine these CRNs

[11]:
# Create combined mixture
M = Mixture("Transport_Multiple_Compartments_Glut1",
            components = [glut1_cell0, glut1_cell1,
                          glut1_channel_cell0, glut1_channel_cell1],
            mechanisms = int_mechanisms | tra_mechanisms,
            parameter_file = "membrane_toolbox_parameters.txt")
CRN_transport = M.compile_crn()
CRN_transport.write_sbml_file("glut1_facilitated_transport_multiple_compartments.xml")
/Users/murray/Library/CloudStorage/Dropbox/macosx/src/biocrnpyler/biocrnpyler/core/parameter.py:1550: UserWarning: parameter file contains no unit column! Please add a column named ['unit', 'units'].
  warn(
[11]:
True
[12]:
#Simulate CRN
try:
    import bioscrape
    import bokeh
except ModuleNotFoundError:
    print('please install the plotting libraries: pip install biocrnpyler[all]')
else:
    import numpy as np
    import pandas as pd
    maxtime = 300000
    timepoints = np.arange(0, maxtime, 100)

    #Inital conditions
    x0_dict= {'glucose_Internal_1': 1, 'glucose_External': 0.5,
              'protein_glut1_Internal_0':.2,
              'protein_glut1_channel_Exporter_Membrane_1':.5,}

    #Run Simulation
    R = CRN_transport.simulate_with_bioscrape_via_sbml(timepoints = timepoints, initial_condition_dict = x0_dict)

    #Plot the transport of substrate ATP
    pglut =create_custom_plot("Facilitated Transport of Glucose", x_max=8,y_max= 1, yname='Glucose (uM)')
    pglut.line(R["time"]/3600,  R['glucose_Internal_0'], line_width = 3, legend_label = "Internal_0", color =  color[0])
    pglut.line(R["time"]/3600,  R['glucose_Internal_1'], line_width = 3, legend_label = "Internal_1", color =  color[1])
    pglut.line(R["time"]/3600,  R['glucose_External'], line_width = 3, legend_label = "External", color = color[2], line_dash = 'dashed')

    #Show Figure
    pglut.legend.click_policy="hide"
    show(pglut)
[13]:
# End