U-5R-RL
Derivation of equilibrium thermodynamic equations for U-5R-RL system: isomerization in the binding-incompetent state of the receptor (many states) and bound state (induced fit).
2. Basic equilibrium equations
3. Derivation of equations for equilibrium concentrations
4. Prepare equations for a numeric solution
5. Save results on disk for future use
In this document, I am developing equilibrium thermodynamic equations to calculate concentrations of species at all points in titrations
clean up workspace
reset()
Set path to save results into:
ProjectName:="U-5R-RL";
CurrentPath:="/Users/kovrigin_laptop/Documents/Workspace/Global_Analysis/IDAP/Mathematical_models/Equilibrium_thermodynamic_models/U-multi-path-models/nR/U-5R-RL";
Binding and isomerization constants
All binding constants I am using are association constants.
These relationships serve as restraints for solve(), but not restrict these values in calculations!
K_A
K_A ;
assumeAlso(K_A > 0):
assumeAlso(K_A , R_)
To denote "starred" species, I will use s1 for *, s2 for **, etc.
K_B_1_s_1
K_B_1_s_1 ;
assumeAlso(K_B_1_s_1 > 0):
assumeAlso(K_B_1_s_1 , R_):
K_B_1_s_2
K_B_1_s_2 ;
assumeAlso(K_B_1_s_2 > 0):
assumeAlso(K_B_1_s_2 , R_):
K_B_1_s_3
K_B_1_s_3 ;
assumeAlso(K_B_1_s_3 > 0):
assumeAlso(K_B_1_s_3 , R_):
K_B_1_s_4
K_B_1_s_4 ;
assumeAlso(K_B_1_s_4 > 0):
assumeAlso(K_B_1_s_4 , R_):
K_B_1_s_5
K_B_1_s_5 ;
assumeAlso(K_B_1_s_5 > 0):
assumeAlso(K_B_1_s_5 , R_):
Isomerization of the bound species
K_B_2
K_B_2 ;
assumeAlso(K_B_2 > 0):
assumeAlso(K_B_2 , R_):
Total concentrations
Rtot - total concentration of the receptor
Rtot;
assumeAlso(Rtot>0):
assumeAlso(Rtot,R_):
Ltot - total concentration of the ligand
Ltot;
assumeAlso(Ltot>0):
assumeAlso(Ltot,R_):
Equilibrium concentrations
Req - equilibrium concentration of the binding-competent receptor form
Req;
assumeAlso(Req>0):
assumeAlso(Req<=Rtot):
assumeAlso(Req,R_):
Equilibrium concentrations of the binding incompetent receptor isomers Rn*
R_s_1eq
R_s_1eq;
assumeAlso(R_s_1eq>0):
assumeAlso(R_s_1eq<=Rtot):
assumeAlso(R_s_1eq,R_):
R_s_2eq
R_s_2eq;
assumeAlso(R_s_2eq>0):
assumeAlso(R_s_2eq<=Rtot):
assumeAlso(R_s_2eq,R_):
R_s_3eq
R_s_3eq;
assumeAlso(R_s_3eq>0):
assumeAlso(R_s_3eq<=Rtot):
assumeAlso(R_s_3eq,R_):
R_s_4eq
R_s_4eq;
assumeAlso(R_s_4eq>0):
assumeAlso(R_s_4eq<=Rtot):
assumeAlso(R_s_4eq,R_):
R_s_5eq
R_s_5eq;
assumeAlso(R_s_5eq>0):
assumeAlso(R_s_5eq<=Rtot):
assumeAlso(R_s_5eq,R_):
Equilibrium concentrations of other species
Leq - equilibrium concentration of a free ligand
Leq;
assumeAlso(Leq>0):
assumeAlso(Leq<Ltot):
assumeAlso(Leq,R_):
RLeq - equilibrium concentration of the receptor-ligand complex
RLeq;
assumeAlso(RLeq>0):
assumeAlso(RLeq<Rtot):
assumeAlso(RLeq<Ltot):
assumeAlso(RLeq,R_):
R_sLeq - equilibrium concentration of the receptor-ligand complex, R*L
R_sLeq;
assumeAlso(R_sLeq>0):
assumeAlso(R_sLeq<Rtot):
assumeAlso(R_sLeq<Ltot):
assumeAlso(R_sLeq,R_):
Check what we defined
anames(Properties,User);
2. Basic equilibrium equations
Mass conservation equations
eq2_1:= Rtot = Req + R_s_1eq + R_s_2eq + R_s_3eq + R_s_4eq + R_s_5eq + RLeq + R_sLeq;
eq2_2:= Ltot = Leq + RLeq + R_sLeq;
Equilibrium constants
eq2_3:= K_A = RLeq / (Req*Leq);
HINT: When increasing number of species: do not increase equation number, add a, b, c, ... modifier instead
because then you do NOT need to modify equation numbers in most of the following derivation!
eq2_4:= K_B_1_s_1 = R_s_1eq/Req
eq2_5:= K_B_1_s_2 = R_s_2eq/Req
eq2_6:= K_B_1_s_3 = R_s_3eq/Req
eq2_7:= K_B_1_s_4 = R_s_4eq/Req
eq2_8:= K_B_1_s_5 = R_s_5eq/Req
eq2_9:= K_B_2 = R_sLeq/RLeq
3. Derivation of equations for equilibrium concentrations
Express Leq as a function of all constants and total concentrations. If insoluble ---express Rtot=f(Leq and all constants).
Express the terminal bound species first:
R*L
eq2_9;
solve(%,R_sLeq):
%[1][1]:
eq3_0:= R_sLeq=%
Substitute into the mass conservation laws:
eq2_1;
% | eq3_0:
eq3_2_0:= %
eq2_2;
% | eq3_0:
eq3_3_0:= %
First bound species
RL
eq2_3;
solve(%,RLeq):
%[1][1]:
eq3_1:= RLeq=%
Substitute into the mass conservation laws:
eq3_2_0;
% | eq3_1:
eq3_2:= %
eq3_3_0;
% | eq3_1:
eq3_3:= %
Express isomer concentrations
R*
eq2_4;
solve(%,R_s_1eq):
%[2][1]:
eq3_7:= R_s_1eq = %
-> conservation laws
eq3_2;
% | eq3_7:
eq3_8:= %
R**
eq2_5;
solve(%, R_s_2eq):
%[2][1]:
eq3_9:= R_s_2eq = %
-> conservation laws
eq3_8;
% | eq3_9:
eq3_10:= %
R***
eq2_6;
solve(%, R_s_3eq):
%[2][1]:
eq3_11:= R_s_3eq = %
-> conservation laws
eq3_10;
% | eq3_11:
eq3_12:= %
R****
eq2_7;
solve(%, R_s_4eq):
%[2][1]:
eq3_13:= R_s_4eq = %
-> conservation laws
eq3_12;
% | eq3_13:
eq3_14:= %
R*****
eq2_8;
solve(%, R_s_5eq):
%[2][1]:
eq3_15:= R_s_5eq = %
-> conservation laws
eq3_14;
% | eq3_15:
eq3_16:= %
Aim to obtain Rtot=f(Leq, constants) function
express Req from conservation law for ligand (Ltot=...)
eq3_3;
solve(%,Req):
%[1][1]:
eq3_17:= Req = %
substitute in the conservation law for receptor: (Rtot=...)
eq3_16;
% | eq3_17;
temp1:=%[2];
temp2:=Simplify(%);
// test
temp1=temp2;
Simplify(%);
// Assemble a final equation
eq3_18:= Rtot =temp2
Attempt to solve for Leq
solution3_18:=solve(eq3_18, Leq)
Extract solutions:
solution_lines:=6:
eq3_19:= solution3_18[i,1] $ i=1..solution_lines;
nops(%)
Extract solutions
solution1:=eq3_19[1][1];
solution2:=eq3_19[2][1] ;
solution3:=eq3_19[4][1];
solution4:=eq3_19[5][1];
Analysis of solutions
If having a sequence of roots: Is 1st solution a combination of 2nd and 3rd?
/*
solutionA:=eq3_13[1]; // a sequence of roots
if solution2 in solutionA
then print(Unquoted,"First set of roots contains the second root.");
else print(Unquoted,"First set of roots DOES NOT contain the second root!");
end_if;
if solution3 in solutionA
then print(Unquoted,"First set of roots contains the third root.");
else print(Unquoted,"First set of roots DOES NOT contain the third root!");
end_if;
*/
Check correctness of the solution by substitution
eq3_18;
// Check the 1st solution
test1:=eq3_18 | Leq=solution1;
normal(%);
Simplify(%);
bool(%)
odd!
eq3_18;
// Check the 2nd solution
test1:=eq3_18 | Leq=solution2;
normal(%);
Simplify(%);
bool(%)
odd!
eq3_18;
// Check the 3rd solution
test1:=eq3_18 | Leq=solution3;
normal(%);
Simplify(%);
bool(%)
works...
eq3_18;
// Check the 4th solution
test1:=eq3_18 | Leq=solution4;
normal(%);
Simplify(%);
bool(%)
works...
=> two last solutions are confirmed by substitution. Proceed with these checking solutions numerically.
Test which solution is meaningful numerically
solution1;
% | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningless
solution2;
% | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningful?
solution3;
% | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningless
solution4;
% | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(%)
meaningful and different from solution 2!
Re-check positive solutions by substitution and calculation:
// Solution 2
test1:=eq3_18 | Leq=solution2;
result:= % | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(result);
Simplify(result);
wrong solution!!!
Re-check by substitution and calculation:
// Solution 4
test1:=eq3_18 | Leq=solution4;
result:= % | K_A=1 | K_B_1_s_1=1 | K_B_1_s_2=1 | K_B_1_s_3=1 | K_B_1_s_4=1 | K_B_1_s_5=1 | K_B_2=1 | Rtot=1 | Ltot=1;
float(result);
Simplify(result);
CORRECT!!!
Choose as a final solution
eq3_20:= Leq = solution4
Summary of equations for all species
Show species names
anames(Properties,User);
Name equations to recognize them in a different context
Leq_U_5R_RL:=eq3_20
Req_U_5R_RL:=eq3_17
R_s_1eq_U_5R_RL:=eq3_7
R_s_2eq_U_5R_RL:=eq3_9
R_s_3eq_U_5R_RL:=eq3_11
R_s_4eq_U_5R_RL:=eq3_13
R_s_5eq_U_5R_RL:=eq3_15
RLeq_U_5R_RL:=eq3_1
R_sLeq_U_5R_RL:= eq3_0
Create functions for computing concentrations
Here I only check that the results are numerically meaningful--functions were created right. Scientific meaningfulness will be analyzed in a separate notebook 'Analysis'.
(use --> to force direct substitution):
fLeq_U_5R_RL:= (Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> Leq_U_5R_RL[2]
//test operation
fLeq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fReq_U_5R_RL:= (Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> Req_U_5R_RL[2] | Leq_U_5R_RL
//test operation
fReq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_s_1eq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_s_1eq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_s_1eq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_s_2eq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_s_2eq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_s_2eq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_s_3eq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_s_3eq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_s_3eq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_s_4eq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_s_4eq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_s_4eq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_s_5eq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_s_5eq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_s_5eq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fRLeq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> RLeq_U_5R_RL[2] | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fRLeq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
fR_sLeq_U_5R_RL:=(Rtot, Ltot, K_A, K_B_1_s_1, K_B_1_s_2, K_B_1_s_3, K_B_1_s_4, K_B_1_s_5, K_B_2) --> R_sLeq_U_5R_RL[2] | RLeq_U_5R_RL | Req_U_5R_RL | Leq_U_5R_RL
//test operation
fR_sLeq_U_5R_RL(1,1,1,1,1,1,1,1,1):
float(%)
=> OK
Check conservation laws (check the Rtot and Ltot are set to 1) :
fRLeq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fLeq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_sLeq_U_5R_RL(1,1,1,1,1,1,1,1,1);
float(%)
good
fRLeq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fReq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_s_1eq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_s_2eq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_s_3eq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_s_4eq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_s_5eq_U_5R_RL(1,1,1,1,1,1,1,1,1) + fR_sLeq_U_5R_RL(1,1,1,1,1,1,1,1,1);
float(%)
good!
(you can retrieve them later by executing: fread(filename,Quiet))
ProjectName
filename:=CurrentPath."/".ProjectName.".mb";
write(filename,
// Equations
Leq_U_5R_RL,
Req_U_5R_RL,
R_s_1eq_U_5R_RL,
R_s_2eq_U_5R_RL,
R_s_3eq_U_5R_RL,
R_s_4eq_U_5R_RL,
R_s_5eq_U_5R_RL,
RLeq_U_5R_RL,
R_sLeq_U_5R_RL,
// Analytical functions
fLeq_U_5R_RL,
fReq_U_5R_RL,
fR_s_1eq_U_5R_RL,
fR_s_2eq_U_5R_RL,
fR_s_3eq_U_5R_RL,
fR_s_4eq_U_5R_RL,
fR_s_5eq_U_5R_RL,
fRLeq_U_5R_RL,
fR_sLeq_U_5R_RL
)
Conclusions
1. Analytical solution obtained.
2. Functions for analysis of behavior of solutions are created and saved.