Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

To calculate steady-state enzyme state fractions in a catalytic cycle using the King-Altman method

  1. Calculate the kinetic matrix, where Ae = de (A is the matrix, e is the vector of enzyme states, and de is the time derivative of e)

  2. To find the weight of enzyme state i, make a (n-1)x(n-1) matrix by skipping the i-th row and i-th column of the input matrix

  3. Calculate the determinant of the matrix from step 2. That is the weight of enzyme state i.

  4. The fraction of enzyme state i is the weight of state i over the sum of all states.

using Symbolics
using LinearAlgebra # det()

Make a (n-1)x(n-1) matrix by skipping the i-th row and i-th column of the input matrix

function skip_colrow(mat, i::Int)
    rows = collect(1:size(mat, 1))
    cols = collect(1:size(mat, 2))
    return mat[rows.!=i, cols.!=i]
end
skip_colrow (generic function with 1 method)

Accumulate rates into the transition rate (kinectic) matrix

function accumulate_rate!(mat, rate, src::Int, dst::Int)
	mat[dst, src] += rate
	mat[src, src] -= rate
	return mat
end
accumulate_rate! (generic function with 1 method)

Take a complicated model as an example (Complex I model in Gauthier, 2013)

mat_c1g = let
	@variables a12 a21 a65 a56 a61 a16 a23 a32 a34 a43 a47 a74 a57 a75 a42 a24
	mat = fill(Num(0), 7, 7)
	accumulate_rate!(mat, a12, 1, 2)
	accumulate_rate!(mat, a21, 2, 1)
	accumulate_rate!(mat, a65, 6, 5)
	accumulate_rate!(mat, a56, 5, 6)
	accumulate_rate!(mat, a61, 6, 1)
	accumulate_rate!(mat, a16, 1, 6)
	accumulate_rate!(mat, a23, 2, 3)
	accumulate_rate!(mat, a32, 3, 2)
	accumulate_rate!(mat, a34, 3, 4)
	accumulate_rate!(mat, a43, 4, 3)
	accumulate_rate!(mat, a47, 4, 7)
	accumulate_rate!(mat, a74, 7, 4)
	accumulate_rate!(mat, a57, 5, 7)
	accumulate_rate!(mat, a75, 7, 5)
	accumulate_rate!(mat, a42, 4, 2)
	accumulate_rate!(mat, a24, 2, 4)
end
7×7 Matrix{Symbolics.Num}: -a12 - a16 a21 … 0 a61 0 a12 -a21 - a23 - a24 0 0 0 0 a23 0 0 0 0 a24 0 0 a74 0 0 -a56 - a57 a65 a75 a16 0 … a56 -a61 - a65 0 0 0 a57 0 -a74 - a75

The weight of each state:

@time weights_c1g = [(-1)^(7-1) * det(skip_colrow(mat_c1g, i)) |> expand for i in 1:7]
  1.639531 seconds (3.13 M allocations: 200.606 MiB, 2.41% gc time, 95.93% compilation time)
7-element Vector{Symbolics.Num}: a21*a32*a42*a56*a61*a74 + a21*a32*a42*a56*a61*a75 + a21*a32*a42*a57*a61*a74 + a21*a32*a42*a57*a65*a74 + a21*a32*a43*a56*a61*a74 + a21*a32*a43*a56*a61*a75 + a21*a32*a43*a57*a61*a74 + a21*a32*a43*a57*a65*a74 + a21*a32*a47*a56*a61*a75 + a21*a34*a42*a56*a61*a74 + a21*a34*a42*a56*a61*a75 + a21*a34*a42*a57*a61*a74 + a21*a34*a42*a57*a65*a74 + a21*a34*a47*a56*a61*a75 + a23*a34*a47*a56*a61*a75 + a24*a32*a47*a56*a61*a75 + a24*a34*a47*a56*a61*a75 a12*a32*a42*a56*a61*a74 + a12*a32*a42*a56*a61*a75 + a12*a32*a42*a57*a61*a74 + a12*a32*a42*a57*a65*a74 + a12*a32*a43*a56*a61*a74 + a12*a32*a43*a56*a61*a75 + a12*a32*a43*a57*a61*a74 + a12*a32*a43*a57*a65*a74 + a12*a32*a47*a56*a61*a75 + a12*a34*a42*a56*a61*a74 + a12*a34*a42*a56*a61*a75 + a12*a34*a42*a57*a61*a74 + a12*a34*a42*a57*a65*a74 + a12*a34*a47*a56*a61*a75 + a16*a32*a42*a57*a65*a74 + a16*a32*a43*a57*a65*a74 + a16*a34*a42*a57*a65*a74 a12*a23*a42*a56*a61*a74 + a12*a23*a42*a56*a61*a75 + a12*a23*a42*a57*a61*a74 + a12*a23*a42*a57*a65*a74 + a12*a23*a43*a56*a61*a74 + a12*a23*a43*a56*a61*a75 + a12*a23*a43*a57*a61*a74 + a12*a23*a43*a57*a65*a74 + a12*a23*a47*a56*a61*a75 + a12*a24*a43*a56*a61*a74 + a12*a24*a43*a56*a61*a75 + a12*a24*a43*a57*a61*a74 + a12*a24*a43*a57*a65*a74 + a16*a21*a43*a57*a65*a74 + a16*a23*a42*a57*a65*a74 + a16*a23*a43*a57*a65*a74 + a16*a24*a43*a57*a65*a74 a12*a23*a34*a56*a61*a74 + a12*a23*a34*a56*a61*a75 + a12*a23*a34*a57*a61*a74 + a12*a23*a34*a57*a65*a74 + a12*a24*a32*a56*a61*a74 + a12*a24*a32*a56*a61*a75 + a12*a24*a32*a57*a61*a74 + a12*a24*a32*a57*a65*a74 + a12*a24*a34*a56*a61*a74 + a12*a24*a34*a56*a61*a75 + a12*a24*a34*a57*a61*a74 + a12*a24*a34*a57*a65*a74 + a16*a21*a32*a57*a65*a74 + a16*a21*a34*a57*a65*a74 + a16*a23*a34*a57*a65*a74 + a16*a24*a32*a57*a65*a74 + a16*a24*a34*a57*a65*a74 a12*a23*a34*a47*a61*a75 + a12*a23*a34*a47*a65*a75 + a12*a24*a32*a47*a61*a75 + a12*a24*a32*a47*a65*a75 + a12*a24*a34*a47*a61*a75 + a12*a24*a34*a47*a65*a75 + a16*a21*a32*a42*a65*a74 + a16*a21*a32*a42*a65*a75 + a16*a21*a32*a43*a65*a74 + a16*a21*a32*a43*a65*a75 + a16*a21*a32*a47*a65*a75 + a16*a21*a34*a42*a65*a74 + a16*a21*a34*a42*a65*a75 + a16*a21*a34*a47*a65*a75 + a16*a23*a34*a47*a65*a75 + a16*a24*a32*a47*a65*a75 + a16*a24*a34*a47*a65*a75 a12*a23*a34*a47*a56*a75 + a12*a24*a32*a47*a56*a75 + a12*a24*a34*a47*a56*a75 + a16*a21*a32*a42*a56*a74 + a16*a21*a32*a42*a56*a75 + a16*a21*a32*a42*a57*a74 + a16*a21*a32*a43*a56*a74 + a16*a21*a32*a43*a56*a75 + a16*a21*a32*a43*a57*a74 + a16*a21*a32*a47*a56*a75 + a16*a21*a34*a42*a56*a74 + a16*a21*a34*a42*a56*a75 + a16*a21*a34*a42*a57*a74 + a16*a21*a34*a47*a56*a75 + a16*a23*a34*a47*a56*a75 + a16*a24*a32*a47*a56*a75 + a16*a24*a34*a47*a56*a75 a12*a23*a34*a47*a56*a61 + a12*a23*a34*a47*a57*a61 + a12*a23*a34*a47*a57*a65 + a12*a24*a32*a47*a56*a61 + a12*a24*a32*a47*a57*a61 + a12*a24*a32*a47*a57*a65 + a12*a24*a34*a47*a56*a61 + a12*a24*a34*a47*a57*a61 + a12*a24*a34*a47*a57*a65 + a16*a21*a32*a42*a57*a65 + a16*a21*a32*a43*a57*a65 + a16*a21*a32*a47*a57*a65 + a16*a21*a34*a42*a57*a65 + a16*a21*a34*a47*a57*a65 + a16*a23*a34*a47*a57*a65 + a16*a24*a32*a47*a57*a65 + a16*a24*a34*a47*a57*a65

Total weights:

total_weight_c1g = sum(weights_c1g)
a12*a23*a34*a47*a56*a61 + a12*a23*a34*a47*a56*a75 + a12*a23*a34*a47*a57*a61 + a12*a23*a34*a47*a57*a65 + a12*a23*a34*a47*a61*a75 + a12*a23*a34*a47*a65*a75 + a12*a23*a34*a56*a61*a74 + a12*a23*a34*a56*a61*a75 + a12*a23*a34*a57*a61*a74 + a12*a23*a34*a57*a65*a74 + a12*a23*a42*a56*a61*a74 + a12*a23*a42*a56*a61*a75 + a12*a23*a42*a57*a61*a74 + a12*a23*a42*a57*a65*a74 + a12*a23*a43*a56*a61*a74 + a12*a23*a43*a56*a61*a75 + a12*a23*a43*a57*a61*a74 + a12*a23*a43*a57*a65*a74 + a12*a23*a47*a56*a61*a75 + a12*a24*a32*a47*a56*a61 + a12*a24*a32*a47*a56*a75 + a12*a24*a32*a47*a57*a61 + a12*a24*a32*a47*a57*a65 + a12*a24*a32*a47*a61*a75 + a12*a24*a32*a47*a65*a75 + a12*a24*a32*a56*a61*a74 + a12*a24*a32*a56*a61*a75 + a12*a24*a32*a57*a61*a74 + a12*a24*a32*a57*a65*a74 + a12*a24*a34*a47*a56*a61 + a12*a24*a34*a47*a56*a75 + a12*a24*a34*a47*a57*a61 + a12*a24*a34*a47*a57*a65 + a12*a24*a34*a47*a61*a75 + a12*a24*a34*a47*a65*a75 + a12*a24*a34*a56*a61*a74 + a12*a24*a34*a56*a61*a75 + a12*a24*a34*a57*a61*a74 + a12*a24*a34*a57*a65*a74 + a12*a24*a43*a56*a61*a74 + a12*a24*a43*a56*a61*a75 + a12*a24*a43*a57*a61*a74 + a12*a24*a43*a57*a65*a74 + a12*a32*a42*a56*a61*a74 + a12*a32*a42*a56*a61*a75 + a12*a32*a42*a57*a61*a74 + a12*a32*a42*a57*a65*a74 + a12*a32*a43*a56*a61*a74 + a12*a32*a43*a56*a61*a75 + a12*a32*a43*a57*a61*a74 + a12*a32*a43*a57*a65*a74 + a12*a32*a47*a56*a61*a75 + a12*a34*a42*a56*a61*a74 + a12*a34*a42*a56*a61*a75 + a12*a34*a42*a57*a61*a74 + a12*a34*a42*a57*a65*a74 + a12*a34*a47*a56*a61*a75 + a16*a21*a32*a42*a56*a74 + a16*a21*a32*a42*a56*a75 + a16*a21*a32*a42*a57*a65 + a16*a21*a32*a42*a57*a74 + a16*a21*a32*a42*a65*a74 + a16*a21*a32*a42*a65*a75 + a16*a21*a32*a43*a56*a74 + a16*a21*a32*a43*a56*a75 + a16*a21*a32*a43*a57*a65 + a16*a21*a32*a43*a57*a74 + a16*a21*a32*a43*a65*a74 + a16*a21*a32*a43*a65*a75 + a16*a21*a32*a47*a56*a75 + a16*a21*a32*a47*a57*a65 + a16*a21*a32*a47*a65*a75 + a16*a21*a32*a57*a65*a74 + a16*a21*a34*a42*a56*a74 + a16*a21*a34*a42*a56*a75 + a16*a21*a34*a42*a57*a65 + a16*a21*a34*a42*a57*a74 + a16*a21*a34*a42*a65*a74 + a16*a21*a34*a42*a65*a75 + a16*a21*a34*a47*a56*a75 + a16*a21*a34*a47*a57*a65 + a16*a21*a34*a47*a65*a75 + a16*a21*a34*a57*a65*a74 + a16*a21*a43*a57*a65*a74 + a16*a23*a34*a47*a56*a75 + a16*a23*a34*a47*a57*a65 + a16*a23*a34*a47*a65*a75 + a16*a23*a34*a57*a65*a74 + a16*a23*a42*a57*a65*a74 + a16*a23*a43*a57*a65*a74 + a16*a24*a32*a47*a56*a75 + a16*a24*a32*a47*a57*a65 + a16*a24*a32*a47*a65*a75 + a16*a24*a32*a57*a65*a74 + a16*a24*a34*a47*a56*a75 + a16*a24*a34*a47*a57*a65 + a16*a24*a34*a47*a65*a75 + a16*a24*a34*a57*a65*a74 + a16*a24*a43*a57*a65*a74 + a16*a32*a42*a57*a65*a74 + a16*a32*a43*a57*a65*a74 + a16*a34*a42*a57*a65*a74 + a21*a32*a42*a56*a61*a74 + a21*a32*a42*a56*a61*a75 + a21*a32*a42*a57*a61*a74 + a21*a32*a42*a57*a65*a74 + a21*a32*a43*a56*a61*a74 + a21*a32*a43*a56*a61*a75 + a21*a32*a43*a57*a61*a74 + a21*a32*a43*a57*a65*a74 + a21*a32*a47*a56*a61*a75 + a21*a34*a42*a56*a61*a74 + a21*a34*a42*a56*a61*a75 + a21*a34*a42*a57*a61*a74 + a21*a34*a42*a57*a65*a74 + a21*a34*a47*a56*a61*a75 + a23*a34*a47*a56*a61*a75 + a24*a32*a47*a56*a61*a75 + a24*a34*a47*a56*a61*a75

And the fraction of each state: fi = wi / wTotal


This notebook was generated using Literate.jl.

References
  1. Qi, F., Dash, R. K., Han, Y., & Beard, D. A. (2009). Generating rate equations for complex enzyme systems by a computer-assisted systematic method. BMC Bioinformatics, 10(1). 10.1186/1471-2105-10-238