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
[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
Consider the following diffusion step:
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
Consider the following substrate transport steps for each cell:
Assemble into a homoheptamer:
\[\begin{aligned} 7 \text{$\alpha$HL}_\text{monomer} \rightarrow \text{$\alpha$HL}_\text{homoheptamer} \end{aligned}\]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:
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
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:
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:
Then glucose exported by Cell_1 is then imported by Cell_0 following the simplified reaction:
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