Receptor models#

\[\def\b{\mathsf{b}} \def\c{\mathsf{c}} \def\kappab{\kappa_{\b}} \def\kappac{\kappa_{\c}} \def\kappabstar{\hat{\kappa}_{\b}} \def\kappacstar{\hat{\kappa}_{\c}}\]

Quantitative pharmacologists construct models of relationship between ligand concentration and the fraction of cell surface receptors in each of several molecular conformations. These models give insight into the action of natural ligands and drugs on receptor-mediated cell responses.

The modeling process begings by specifying the molecular conformations (states) to be considered and the transitions between these states.

A three-state receptor model#

As a simple example, consider a receptor model with three states arranged as follows.

G = DiGraph({0: {1:'a01'}, 1: {0:'a10', 2:'a12'}, 2: {1:'a21'}})
pos = {0: (0, 0), 1: (1, 0), 2: (2, 0)}
G.plot(figsize=4,edge_labels=True,pos=pos,graph_border=True)
_images/c1beef36f66b3a1f284f45113d1e3663a67852181ccafc6d3d3f7dd3d6515b7c.png
G = DiGraph({'R': {'RL':'kap*L'}, 'RL': {'R':'kam', 'RLL':'kbp*L'}, 'RLL': {'RL':'kbm'}})
pos = {'R': (0, 0), 'RL': (1, 0), 'RLL': (2, 0)}
G.plot(figsize=4,edge_labels=True,pos=pos,graph_border=True,vertex_size=1000)
_images/27bfbaab0f28da1555bd4c0a1f9de76f4e8137cc90c4997da83f2cf2b12148b7.png

When both forward and reverse transitions are explicit, the state-transition diagram has the topology of a symmetric directed version of the path graph with 3 vertices.

Here is the (undirected) path graph \(P_3\):

G = Graph({0: [1], 1: [2]})
G.plot(figsize=4)
_images/6477b62ff15128e59cc9aae6f0b220838e13a70d4726b3a2dd38070405bfcdca.png

The symmetric directed version is

Hide code cell source

G = DiGraph({0: [1], 1: [0,2], 2: [1]})
G.plot(figsize=4)
_images/6e0bb9d20f553cf18598ec23ae828a3a32881adfca7ef2f4271ce1dd6366e357.png

Our practice will be to define symbolic variables and put these on the vertices and edges.

var('a b c kappa_b_plus kappa_b_minus kappa_c_plus kappa_c_minus')
G = DiGraph([[a,b,c],[(a,b),(b,a),(b,c),(c,b)]])
G.set_edge_label(a,b,kappa_b_plus)
G.set_edge_label(b,a,kappa_b_minus)
G.set_edge_label(b,c,kappa_c_plus)
G.set_edge_label(c,b,kappa_c_minus)
G.plot(figsize=4,edge_labels=True)
_images/f53c8f6c0a1ef906f23758ee73d37aee3f08df858508ad2ee2fa3b242e2fd517.png

In the state-transition diagram shown above, \(\kappab\) and \(\kappac\) are dimensionless equilibrium constants, \(\kappabstar\) and \(\kappacstar\) are association constants with physical dimension of inverse concentration, and \(x\) is ligand concentration. The solid harpoons indicate the forward reaction direction. For example, the reaction labelled \(\kappab\) has \(a\) as reactant and \(b\) as product; consequently, increasing \(\kappab\) decreases the equilibrium probability (relative fraction) of state \(a\) and increases the probability of state \(b\). The three states of Equation XXX are labelled so that the reactant comes before the product in dictionary order (\(a\) to \(b\) to \(c\)). The subscript of the equilibrium constants \(\kappab\) and \(\kappac\) are chosen to match the label of the reaction products.

For an isolated monomer with a state-transition diagram given by Equation XXX, the probability of state \(i\) is given by \(\pi_i = z_i / z_T\) where \(z_T= \textstyle \sum_i z_i\), \(z_a = 1\), \(z_b = \kappab = \kappabstar x\), and \(z_c =\kappab \kappac = \kappabstar \kappacstar x^2\). That is,

()#\[\begin{equation} \pi_a = \frac{1}{1+ \kappabstar x + \kappabstar \kappacstar x^2} \, , \quad \pi_b = \frac{\kappabstar x}{1+ \kappabstar x + \kappabstar \kappacstar x^2} \quad \mbox{and} \quad \pi_c = \frac{\kappabstar \kappacstar x^2 }{1+ \kappabstar x + \kappabstar \kappacstar x^2 } \, . \end{equation}\]

It is helpful to present this set of rational functions using the following compact notation:

()#\[\begin{equation} [ \pi_a : \pi_b : \pi_c ] = [1 :\kappab : \kappab \kappac ] = [1 : \kappabstar x :\kappabstar \kappacstar x^2 ] \, . \end{equation}\]

In expressions of this kind, it is understood that

()#\[\begin{equation} [ x_1 \! : \! x_2 : \! \cdots \! : \! x_n ] = [ \lambda x_1 \! : \! \lambda x_2 : \! \cdots \! : \! \lambda x_n ] \end{equation}\]

for any \(\lambda \neq 0\). Furthermore, \(\lambda = 1/\sum_i x_n\) gives the probability distribution \(\pi = (\pi_1, \pi_2, \ldots, \pi_n)\) where \(1=\sum_i \pi_i\).

One reason for using symbolic variables is that we can produce symbolic expressions important quantities using module for graphs and digraphs available in Sagemath. For example, the weighted adjacency matrix associated with graph {math}`G$ above is

A = G.weighted_adjacency_matrix()
print(A)
[            0  kappa_b_plus             0]
[kappa_b_minus             0  kappa_c_plus]
[            0 kappa_c_minus             0]

If we are interested in the equilibrium probability of each state of the receptor model, it is sufficient to consider the rooted spanning tree

var('a b c kappa_b kappa_c')
T = DiGraph([[a,b,c],[(b,a),(c,b)]])
T.set_edge_label(b,a,kappa_b)
T.set_edge_label(c,b,kappa_c)
T.plot(figsize=4,edge_labels=True)
_images/1bb64d51aed5ba392a80f50f1422d24b16cb4d7c931ce051a9d14c2814233f18.png

[To be completed]

Scraps#

B = T.weighted_adjacency_matrix()
print(B)
print(B**2)
print(B**3)
[      0       0       0]
[kappa_b       0       0]
[      0 kappa_c       0]
[              0               0               0]
[              0               0               0]
[kappa_b*kappa_c               0               0]
[0 0 0]
[0 0 0]
[0 0 0]
print(B)
print(B**2)
print(B**3)
[      0       0       0]
[kappa_b       0       0]
[      0 kappa_c       0]
[              0               0               0]
[              0               0               0]
[kappa_b*kappa_c               0               0]
[0 0 0]
[0 0 0]
[0 0 0]
G=graphs.PathGraph(3)
G.show(figsize=4)
_images/94136b0564259a3daff0e440b840a5a1ed4c554c9053e8ef7d46c4c893a93c9a.png
G.relabel(dict({0: 'a', 1: 'b', 2: 'c'}))
G.show(figsize=4)
_images/5b1fe698f09186658b15aa5712e3a90b1c08e67d49068300a00e6c13c664dbad.png
kappab = var("kappab", latex_name=r"\kappa_b")
kappac = var("kappac", latex_name=r"\kappa_c")
x = var("x", latex_name=r"x")
G.set_edge_label('a','b',kappab*x)
G.set_edge_label('b','c',kappab*kappac*x^2)
G.show(edge_labels=True,figsize=8)
f=kappab*kappac*x^2
f.show()
show(f)
print(f)
_images/52df1bb41b73dbf4fe6c13f593149b6f8dddd4b953b63dfd9f2d815f6a63972f.png
\(\displaystyle {\kappa_b} {\kappa_c} {x}^{2}\)
\(\displaystyle {\kappa_b} {\kappa_c} {x}^{2}\)
kappab*kappac*x^2
G=graphs.PathGraph(3).to_directed()
G.relabel({0:'R',1:'LR',2:'LLR'})
G.set_edge_label('R','LR','kap*L')
G.set_edge_label('LR','R','kam')
G.set_edge_label('LR','LLR','kbp*L')
G.set_edge_label('LLR','LR','kbm')
G.show(edge_labels=True,figsize=4,talk=True)
G.plot(edge_labels=True,figsize=4,talk=True)
_images/feff635616a810f9367d5d92d90e0c26202d52afe9530bd2e0b4fb6ba318baf2.png _images/feff635616a810f9367d5d92d90e0c26202d52afe9530bd2e0b4fb6ba318baf2.png

References#