CADET-Core icon indicating copy to clipboard operation
CADET-Core copied to clipboard

Simple Michaelis-Menten reaction kinetics

Open sleweke-bayer opened this issue 11 months ago • 10 comments

Implements liquid phase Michaelis-Menten reaction kinetics of the form

    S \nu,

where $S$ is the stoichiometric matrix and the fluxes are given by

    \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S}.

The substrate component $c_S$ is identified by the index of the first negative entry in the stoichiometry of this reaction.

In addition, the reaction might be inhibited by other components. In this case, the flux has the form

    \nu_i = \frac{\mu_{\mathrm{max},i} c_S}{k_{\mathrm{MM},i} + c_S} \prod_j \frac{k_{\mathrm{I},i,j}}{k_{\mathrm{I},i,j} + c_{\mathrm{I},j}}.

The value of $k_{\mathrm{I},i,j}$ decides whether component $j$ inhibits reaction $i$. If $k_{\mathrm{I},i,j} < 0$, the component does not inhibit the reaction.

sleweke-bayer avatar Mar 15 '24 13:03 sleweke-bayer

Tests pass, Jacobian appears to be correct. Please perform some tests to see if the model works or what should be changed.

sleweke-bayer avatar Mar 15 '24 13:03 sleweke-bayer

What if $k_{I,i,j}=0$? Wouldn't it make sense to say that compoent $j$ then also doesn't inhibit reaction $i$?

lieres avatar Mar 15 '24 13:03 lieres

What if kI,i,j=0? Wouldn't it make sense to say that compoent j then also doesn't inhibit reaction i?

Changed it to use <= 0 instad of < 0.

sleweke-bayer avatar Mar 15 '24 16:03 sleweke-bayer

I will provide some examples and Python code from my lecture on computational biotechnology for the testing.

lieres avatar Mar 15 '24 16:03 lieres

The tests can also be based on the existing implementation which is based on micro-kinetics. e.g., with $k_r=0$ and $E_0=1$ such that $\mu_{max}=k_{cat} and $K_{MM}=\frac{1}{k_f}$.

Moreover, we could easily cover Hill kinetics by including an exponent.

lieres avatar Mar 19 '24 11:03 lieres

mm_reaction.zip So I am currently testing this with an example from Erics lecture, and I want to make sure I set it up correctly.

The example given is: image

image with image

I calculated B to be 100.65 in steady state where B_dot = u-v = 0.

I set up my CSTR (V = 1000) with a reaction model following Sams entry post as

vmax_A = 400
vmax_B = 100
KA = 2.5
KB = 5.0
IB = 35
A = 30.0
B = 100.65

init_c = [A, B]

#Reaction i = rows ?
#Component j = columns ?

model.root.input.model.unit_000.reaction_model = 'MICHAELIS_MENTEN'
model.root.input.model.unit_000.reaction_bulk.mm_kmm = [KA, KB]
model.root.input.model.unit_000.reaction_bulk.mm_ki = [-1.0,  IB, #Component B Inhibits Reaction 1
                                                       -1.0, -1.0]
model.root.input.model.unit_000.reaction_bulk.mm_vmax = [vmax_A, vmax_B]
model.root.input.model.unit_000.reaction_bulk.mm_stoichiometry_bulk = [-1.0, 0.0, #Substrate in Reaction 1 is A, so -1.0?
                                                                        0.0, 1.0] #Product of Reaction 2 is B, so 1.0?


from my understanding I would now expect to see Components A (blue) and B (orange) in steady state, but I get image

which looks like I set up the stoichiometry wrong. I played around a little and found in the documentation of the other reaction models, that there the components are noted in the rows and the reactions in the columns, which confused me as here reactions are noted as i and components as j and I could not find a documentation for the mm reaction yet. Playing around I managed to get different profiles, but not what I expected.

I don't understand the sentence "The substrate component is identified by the index of the first negative entry in the stoichiometry of this reaction." because for the S-Matrix it seems like the opposite, negative entry gets produced and positive entry is consumed.

So first I want to make sure I understand the parameters right and set up the matrices correctly.

hannahlanzrath avatar Mar 25 '24 15:03 hannahlanzrath

@sleweke-bayer

We now broke it down to a MRE, that shows that although A is marked as a substrate, A is synthesized while B is consumed. Maybe a sign error in the implementation of the reaction in CADET? The notebook is attached. MichalelisMenten_MRE.zip

# Variables
vmax_A = 400
KA = 2.5
A = 100.0
B = 0.0

init_c = [A, B]


# Reaction
model.root.input.model.unit_000.reaction_model = 'MICHAELIS_MENTEN'
model.root.input.model.unit_000.reaction_bulk.mm_kmm = [KA]
model.root.input.model.unit_000.reaction_bulk.mm_ki = [-1.0]
model.root.input.model.unit_000.reaction_bulk.mm_vmax = [vmax_A]
model.root.input.model.unit_000.reaction_bulk.mm_stoichiometry_bulk = [-1.0,
                                                                        1.0] 

image

hannahlanzrath avatar Apr 17 '24 07:04 hannahlanzrath

mm_MRE_fix.zip

Sam and I could not reproduce the error based solely on the h5 file. Will check my files again and come back to this.

hannahlanzrath avatar Apr 19 '24 08:04 hannahlanzrath

I cannot reproduce the problem. The simple Michaelis-Menten test case appears to work for me. SimpleMM

sleweke-bayer avatar Apr 19 '24 08:04 sleweke-bayer

Found the issue, I was on another (outdated) feature/michaelis_menten branch... Thanks for taking the time today Sam, at least we know now that it seems to be working! Will continue testing and report.

hannahlanzrath avatar Apr 19 '24 09:04 hannahlanzrath

I created the basics for a test that checks the mm kinetics against mass action law microcinetics. It seems to work just fine!

michaelis_menten_test.zip

´mm_gt.h5´ uses the new michaelis menten reaction model, ´mm_microkinetics_test.h5´ uses microkinetics and the old mass action law reaction model to get the same results within a very tight error tolerance (<1e-5) (component 1 and 2 of the michaelis menten solution equal component 2 and 4 of the microcinetics solution ).

Now this has to be integrated into a test where the solutions are compared. As I am not super familiar with C++ I would either need help (and some time) to do this or give this last task to someone else.

image image

hannahlanzrath avatar May 28 '24 12:05 hannahlanzrath

Rebased branch and added microkinetics reference test with Jan

hannahlanzrath avatar Jun 03 '24 08:06 hannahlanzrath

We added a Numerical Reference Test comparing a case from Erics Lecture calculated with FD against a simulation.

From our side the branch is now ready to merge

hannahlanzrath avatar Jun 05 '24 14:06 hannahlanzrath

I just realized that this PR didn't contain any documentation or interface specification. In future, we should make sure to add that before merging. Or at least create a separate issue/PR.

This could also be a good idea for a template @ronald-jaepel

schmoelder avatar Jun 24 '24 19:06 schmoelder