In the previous technical appendix, we analyzed signaling cascades with doubly-phosphorylated molecules and two levels of a cascade. Here, we model the general case where each step in the cascade may have arbitrarily many phophorylation sites and the cascade may have arbitrarily many levels. Again, the maximally phorphorylated signaling molecule at the end of the cascade leads to a change in gene expression in response to an inputted signal. We will again restrict ourselves to the case where all enzyme-catalyzed reactions are far from saturation and phosphorylation rate constants are the same, as are dephosphorylation rate constants.
Dynamics of multi-site phosphorylation by a signaling molecule
As in the previous technical appendix, we will approximate the rate of phosphorylation of species X catalyzed by species S as
\[
\begin{align}
\text{rate of phosphorylation} \approx k_+ s x,
\end{align}
\tag{1}\]
and the dephosphorylation of species X as
\[
\begin{align}
\text{rate of dephosphorylation} \approx k_- x.
\end{align}
\tag{2}\]
If a signaling molecule X has \(n\) sites that may be phosophorylated, each catalyzed by S, we have a reaction scheme
Similarly as in the previous technical appendix, we can nondimensionalize by scaling all concentrations by \(K = k_-/k_+\) and time by \(1/k_-\), to give
\[
\begin{align}
&\frac{\mathrm{d}x_0}{\mathrm{d}t} = - s x_0 + x_1,\\[1em]
&\frac{\mathrm{d}x_i}{\mathrm{d}t} = - s x_i + x_{i+1} + sx_{i-1} - x_i\;\;\text{for } 1 \le i \le n-1,\\[1em]
&\frac{\mathrm{d}x_n}{\mathrm{d}t} = s x_{n-1} - x_n.
\end{align}
\tag{5}\]
We will henceforth always work with dimensionless quantities. We will not solve these equations here, but rather will do numerical solutions of these equations when coupled to other reactions in a cascade.
Steady state of a catalyzed multi-step phosphorylation
We wish to compute the dimensionless steady state concentrations of each species \(x_0, \ldots x_n\). We accomplish this by noting at steady state the forward and reverse rate of each reaction are equal. Thus, we have
\[
\begin{align}
sx_{i-1} = x_i\;\;\text{for } 1 \le i \le n,
\end{align}
\tag{6}\]
where we have substituted the above expression for \(x_{n-1}\). We continue this process all the way until \(i = 0\) to get the result for all \(i \in [0, n]\).
To determine \(x_n\) (and therefore all of the \(x_i\)’s via the above equation for \(x_i\)), we note that the total amount of X molecules of all degrees of phosphorylation is conserved. Letting \(x_\mathrm{tot}\) be the total X concentration, we have
Since \(x_n\) is our quantity of interest, let us look at how it varies with signal intensity.
def f_infinite_n(s):# The result res = np.empty_like(s)# Indices where s greater than one inds = s >1# Compute result res[~inds] =0.0 res[inds] = (s[inds] -1) / s[inds]return resdef f(s, n):if np.isinf(n): res = f_infinite_n(s)else: res = np.empty_like(s)# Indices where s is not one inds =~np.isclose(s, 1)# Compute result for close to one and otherwise res[inds] = s[inds] ** n * (1- s[inds]) / (1- s[inds] ** (n +1)) res[~inds] = s[~inds] ** n / (1+ n)return res# Values of s and n for which we want a plots = np.logspace(-2, 2, 200)s_near_1 = np.logspace(0.0001, np.log10(1.011), 25)s = np.sort(np.concatenate((s, s_near_1)))n = [1, 2, 3, 4, np.inf]# Styling for figuresfig_kwargs =dict( frame_width=400, frame_height=200, x_axis_type="log", x_axis_label=r"$$s/K$$", y_axis_label=r"$$x_n/x_\mathrm{tot}$$", x_range=[s.min(), s.max()],)# Linear and log scale figuresp = bokeh.plotting.figure(**fig_kwargs)p_log = bokeh.plotting.figure(**fig_kwargs, y_axis_type="log", y_range=[1e-8, 3], visible=False)# Select log or linear y-scaleradio_button_group = bokeh.models.RadioButtonGroup( labels=["log", "linear"], active=1, width=60, orientation="vertical")radio_button_group.js_on_change("active", bokeh.models.CustomJS( args=dict(p_log=p_log, p=p), code=""" if (p_log.visible == true) { p_log.visible = false; p.visible = true; } else { p_log.visible = true; p.visible = false; }""", ),)# Populate glyphspalette =list(bokeh.palettes.Blues7[:4][::-1]) + ["black"]for n_val, color inzip(n, palette): label ="n → ∞"if np.isinf(n_val) elsef"n = {n_val}" yn = f(s, n_val) p.line(s, yn, line_width=2, color=color, legend_label=label) p_log.line(s, yn, line_width=2, color=color, legend_label=label)# Handle zero values on log plotif np.isinf(n_val): s1_ind = np.where(s >=1)[0][0] p_log.ray(1.0, yn[s1_ind], angle=-np.pi /2, line_width=2, color=color)# Position legendp.legend.location ="bottom_right"p_log.legend.location ="bottom_right"# Build and display layoutlayout = bokeh.layouts.row( bokeh.models.Spacer(width=10), bokeh.layouts.column(bokeh.models.Spacer(height=75), radio_button_group), bokeh.models.Spacer(width=10), bokeh.layouts.column(p, p_log),)bokeh.io.show(layout)
Cascade of multi-phosphorylation reactions
We have thus far considered a single multi-phosphorylation reaction. Now, imagine that the final product of this reaction catalyzes a separate multi-phosphorylation reaction. We label the first signaling molecule X⁽¹⁾ with a superscript (1) and the second, X⁽²⁾ with a superscript (2). Signaling molecule (1) has \(n_1\) phosphorylation sites and signaling molecule (2) has \(n_2\).
We can use the same arguments as above to write down the dimensionless dynamical equations (again with all concentrations in units of \(K\) and time in units of \(1/k_-\)) for the concentration of species in this set of reactions.
Our goal is to study the dynamics and steady state of \(x^{(m)}_{n_m}\) (the steady state being the transfer function of the signaling circuit), since this is the end of the signaling cascade leading ultimately to regulation of gene expression. In looking at the above equations, we see that the equations for \(x^{(m)}_{n_m}\) dynamics are analogous to those of \(x_n\) in the case we have already worked out for a single multiphosphorlyation reaction, except with \(x^{(m-1)}_{n_{m-1}}\) replacing \(s\). So, we have, at steady state,
It is easy to get confused reading this not-quite-composite (because of the presence of the \(x^{(\cdot)}_\mathrm{tot}\)’s) function, so here is the function for \(m = 1, 2\), and \(3\) as examples.
We have written down the dynamical equations and worked out the steady state transfer function for a multi-level signaling cascade. To gain insight to the nature of this signaling circuit, we wish to quantify
The transfer function,
The speed of the circuit response to a jump in input signal \(s\),
The gain of the circuit,
The derivative of the transfer function,
The sensitivity.
In order assess the speed of the response of the circuit, we need to solve the dynamical equations numerically, which we will do momentarily, and also compute the derivative of the transfer function. For the latter task, we can take advantage of the nested form of the transfer function using the chain rule. We define
As is often the case, it is valuable to investigate limiting behavior of the signaling circuit. First, we consider \(s \ll 1\) (that is that the input signal concentration is much less than \(K = k_- / k_+\)). In this regime, for finite \(n\),
So, the transfer function can decay very rapidly with decreasing input signal, e.g. like \(s^{-27}\) for a three-level cascade of triply phosphorylated signaling molecules. This leads to a threshold-like behavior. The input signal evokes almost no response from the signaling circuit until the input signal is of magnitude \(K\). However, if the signaling molecules only have a single phosphorylation site, such that \(n_j = 1\) for all levels of the cascade, then
\[\begin{align}
x^{(m)}_{n_m} \approx s \prod_{j=1}^m x_\mathrm{tot}^{(j)},
\end{align}\]
meaning that at low input signal, the gain is given by the product of the concentrations of the signaling molecules in the cascade.
Still considering the small input signal limit, the derivative of the transfer function is
Thus, for large \(s\), the dependence on the number of phosphorylation sites is eliminated and the transfer function is the same as for all \(n_j\to\infty\). We can investigate limiting behavior for large \(s\) be defining \(\xi = 1/s\) and writing the transfer function as a function of \(\xi\). The result is
This means that for very large input signal, nearly all of the signaling molecules are completely phosphorylated and the signal is given by how many molecules for the last level of the cascade are available.
According to the scaling of the transfer function, its derivative scales like
and the sensitivity therefore scales like \(1/s\) for large \(s\). To consider the gain, we divide both sides of the scaling relation of the transfer function by \(s\) to give
In summary, in the large \(s\) limit, the transfer function approaches unity, the gain decays like \(1/s\), as does the sensitivity, and the derivative of the transfer function scales like \(-1/s^2\).
Plotting the characterizations of the circuit
The above expressions for the transfer function, its derivative, the gain, and the sensitivity are challenging to code, and we will not show the details here. Rather, the interactive plot below shows how these functions vary with dimensionless input signal \(s\). The curves are colored for \(n = 1, 2, 3,\) and \(4\) going from light to dark blue. The gray curve represents the baseline response corresponding to the case where an input signal catalyzes a single phosphorylation of a single signaling molecule. (Note that some discontinuities will appear in plots of sensitivity for large cascade depths for small \(s\). This is an artifact due to machine precision and underflow issues.)