Two-State One-Site Coupled Binding and Conformational Change

Authors: Kyle G. Daniels and Terrence G. Oas
Duke University Department of Biochemistry
January 2015

This notebook contains code to simulate stopped-flow kinetic traces for a macromolecule that has two conformational states and one ligand binding site. Equilibrium data can also be simulated. Both types of data can be fit to determine the information content of the simulated data.

Ligand-Induced Conformational Change Kinetics

This module is used to simulate kinetic transients. Transients assume that at time 0, a solution of the unliganded macromulecule M is mixed with a solution of ligand.
Lt is the total ligand concentration. Mt is the total concentration of the macromlecule that has states C1 and C2. t is the time.

transim[Lt_,Mt_,t_]:=Module[{k21,k21L,ndsolve,F1,F2,kd1,kd2,Signal},
k21=(k12/K12);(*Rate constant for the C2⇀C1 reaction*)

k21L=((k12L Ka1)/(K12 Ka2));(*Rate constant for the C2L⇀C1L reaction*)

kd1=kon1/Ka1;(*Off rate/rate consant for dissociation from C1*)
kd2=kon2/Ka2;(*Off rate/rate consant for dissociation from C2*)

(*This solves the systems of differential equations to give the time-dependent populations of C1, C1L, C2, and C2L*)
ndsolve=NDSolve[{
C1'[τ]==-k12 C1[τ]-kon1 C1[τ] (Lt-C2L[τ]-C1L[τ]) + k21 C2[τ]  +kd1 C1L[τ] ,
C1L'[τ]==kon1 C1[τ] (Lt-C2L[τ]-C1L[τ] ) -kd1 C1L[τ]-k12L C1L[τ] +k21L C2L[τ] ,
C2'[τ]==k12 C1[τ] -k21 C2[τ]  -kon2 C2[τ]  (Lt-C2L[τ]-C1L[τ] )+kd2 C2L[τ] ,
C2L'[τ]==kon2 C2[τ]  (Lt-C2L[τ]-C1L[τ] )+k12L C1L[τ] -kd2 C2L[τ]-k21L C2L[τ] ,
C1[0]==(Mt/(1+K12)),C2[0]==((K12 Mt)/(1+K12)),C1L[0]==0,C1[0]+C1L[0]+C2[0]+C2L[0]==Mt},
{C1,C1L,C2,C2L},{τ,0,1.5ftp}]/.τ->t;

F1=((ndsolve[[1,1,2]][t]+ndsolve[[1,2,2]][t])/Mt);(*Fraction of macromolecule in state C1. This includes both C1 and C1L.*)
F2=((ndsolve[[1,3,2]][t]+ndsolve[[1,4,2]][t])/Mt);(*Fraction of macromolecule in state C2. This includes both C2 and C2L.*)
Signal=F1 SigC1+F2 SigC2 (*The observable signal assuming that only the state of the molecule contribute to what is detected*)
]

Ligand-Induced Conformational Change Kinetics - For NonlinearModelFit

This module is used to fit kinetic transients. Transients assume that at time 0, a solution of the unliganded macromulecule M is mixed with a solution of ligand.
Lt is the total ligand concentration. Mt is the total concentration of the macromlecule that has states C1 and C2. t is the time. Notations within the module are the same as above.

transimf[Lt_?NumericQ,Mt_?NumericQ,t_?NumericQ,SigC1_?NumericQ,SigC2_?NumericQ,kon1_?NumericQ,kon2_?NumericQ,Ka1_?NumericQ,Ka2_?NumericQ,K12_?NumericQ,k12_?NumericQ,k12L_?NumericQ]:=transimf[Lt,Mt,t,SigC1,SigC2,kon1,kon2,Ka1,Ka2,K12,k12,k12L]=Module[{R,Temp,k21,k21L,ndsolve,F1,F2,kd1,kd2,Signal},
R=1.9858775;
Temp=298;

k21=(k12/K12);

k21L=((k12L Ka1)/(K12 Ka2));

kd1=kon1/Ka1;
kd2=kon2/Ka2;

ndsolve=NDSolve[{
C1'[τ]==-k12 C1[τ]-kon1 C1[τ] (Lt-C2L[τ]-C1L[τ]) + k21 C2[τ]  +kd1 C1L[τ] ,
C1L'[τ]==kon1 C1[τ] (Lt-C2L[τ]-C1L[τ] ) -kd1 C1L[τ]-k12L C1L[τ] +k21L C2L[τ] ,
C2'[τ]==k12 C1[τ] -k21 C2[τ]  -kon2 C2[τ]  (Lt-C2L[τ]-C1L[τ] )+kd2 C2L[τ] ,
C2L'[τ]==kon2 C2[τ]  (Lt-C2L[τ]-C1L[τ] )+k12L C1L[τ] -kd2 C2L[τ]-k21L C2L[τ] ,
C1[0]==(Mt/(1+K12)),C2[0]==((K12 Mt)/(1+K12)),C1L[0]==0,C1[0]+C1L[0]+C2[0]+C2L[0]==Mt},
{C1,C1L,C2,C2L},{τ,0,1.5ftp}]/.τ->t;

F1=((ndsolve[[1,1,2]][t]+ndsolve[[1,2,2]][t])/Mt);
F2=((ndsolve[[1,3,2]][t]+ndsolve[[1,4,2]][t])/Mt);
Signal=F1 SigC1+F2 SigC2
]

Ligand-Induced Conformational Change Equilibrium

This module is used to simulate and fit equilibrium binding curves data. Lt is the total ligand concentration. Mt is the total concentration of the macromlecule that has states C1 and C2.

Eq[Lt_,Mt_]:=Module[{Lf,F1,F2,C1,C1L,C2,C2L,Signal,Fbound,Ffree},
Lf=Solve[L==Lt-(( Ka1 L+K12 Ka2 L)/(1+Ka1 L+K12+K12 Ka2 L))Mt,L][[-1,1,2]];(*Concentration of free ligand*)
F1=((1+ Ka1 Lf)/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M in state C1. Includes both C1 and C1L*)

F2=((K12+K12 Ka2 Lf)/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M in state C2. Includes both C2 and C2L*)

C1=(1/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M as C1*)
C1L=(( Ka1 Lf)/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M as C1L*)
C2=(K12/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M as C2*)
C2L=((K12 Ka2 Lf)/(1+Ka1 Lf+K12+K12 Ka2 Lf));(*Fraction of M as C2L*)
Fbound=((C1L+C2L)/(C1+C1L+C2+C2L));(*Fraction of M bound to ligand*)
Ffree=1-F2;(*Fraction of M not bound to ligand*)

Signal={SigC1 F1 +SigC2 F2 ,SigFree Ffree+SigBound Fbound}(*C1 list of two signls. The first signal is the signal if only the conformational state contributes to signal. The second signal is the signal if only the liganding state (free or bound) contributes to signal.*)
]

Simulate and Fit Kinetic Data

Simulate Data for A Macromolecule with Two Conformational States and One Binding Site per State

Define parameters and simulate two-state one-site kinetic data.

SigC1=1;(*Observable signal of state C1*)
SigC2=0;(*Observable signal of state C2*)

kon1=10^8;(*On rate for conformational state C1. Units of (M^(-1))(sec^(-1))*)
kon2=10^8;(*On rate for conformational state C2. Units of (M^(-1))(sec^(-1))*)

Ka1=10^3;(*Association constant for conformational state C1. Units of (M^(-1))*)
Ka2=10^7;(*Association constant for conformational state C2. Units of (M^(-1))*)

K12=0.1;(*Conformational equilibrium constant for the C1⇌C2 equilibrium when ligand is not bound*)
k12=10; (*Conformational rate constant for the C1⇀C2 reaction. Units of (sec^(-1))*)
k12L=25; (*Conformational rate constant for the C1L⇀C2L reaction. Units of (sec^(-1))*)

mt=1*10^-6; (*Macromolecular concentration*)
Merror=5;(*Error in macromolecule concentration*)
Lerror=5;(*Error in ligand concentrations*)

minlig=3.1*10^-8;(*Minimum ligand concentration. Units of M*)
maxlig=10^-4;(*Maximum ligand concentration. Units of M*)
nlc=9;(*Number of different ligand concentrations to use*)
ltable=Table[10^l,{l,Log[10,minlig],Log[10,maxlig],((Log[10,maxlig]-Log[10,minlig])/(Max[nlc,2]-1))}]//N;(*Generate table of ligand concentrations*)

ntp=10;(*Number of time points to sample per transient*)
ftp=1.5;(*Final time point*)
ttable=Table[10^t,{t,-3,Log[10,ftp],((Log[10,ftp]+3)/(Max[ntp,2]-1))}]//N;(*Table of time points for each transient*)
maxlig*Ka1(*This tells us how close we get to the Kd of the weak site*)
maxlig*Ka2(*This tells us far we go over the Kd of the tight site*)

mte=mt*RandomVariate[NormalDistribution[1,Merror/100]];(*Generate a macromolecule concentration for a simple with designated error.*)
ltablee=ltable*Table[RandomVariate[NormalDistribution[1,Lerror/100]],{Length[ltable]}];(*Generate errors in each ligand sample.*)
err=0.005;(*Error to be introduced in each individual run before averaging transients*)

(*Simulate three datasets to be averaged. The ligand and macromolecule concentrations in the datasets are the ideal (without error) concentrations designated by the user above. The ligand and macromolecule concentrations that were used to generate the transients were perturbed based on the error designated above. This mimics the discrepancy between the concentrations we think are in our samples and the concentrations that are in our samples. Additional error based on err represents variations in concentration that result from deviations in mixing within the instrument.*)presimdata=Flatten[Table[{ltable[[l]],mt,t,transim[ltablee[[l]],mte,t]+RandomVariate[NormalDistribution[0,err]],transim[ltablee[[l]],mte,t]+RandomVariate[NormalDistribution[0,err]],transim[ltablee[[l]],mte,t]+RandomVariate[NormalDistribution[0,err]]},{l,1,Length[ltable]},{t,ttable}],1];

(*Average simulation data*)simdata=Table[{presimdata[[j,1]],presimdata[[j,2]],presimdata[[j,3]],Mean[presimdata[[j,4;;6]]]},{j,1,Length[presimdata]}];

eqdata=Table[simdata[[j,{1,4}]],{j,ntp,Length[simdata],ntp}];(*Concentration versus signal at final time*)
simkinplot=ListLogLinearPlot[simdata[[All,{3,4}]],PlotRange->{0,1},PlotStyle->{PointSize[Small],Black}](*Plot kinetic data*)
simeqplot=ListLogLinearPlot[eqdata,PlotStyle->{PointSize[Medium],Black}];(*Plot equilibrium data*)

(*Show plot of equilibrium curve and final curve with final signal points from simulations. If the Blue and Red curves overlap, the system has come to equilibrium at all concentrations of ligand*)
Show[{LogLinearPlot[transim[lt,mt,ftp],{lt,minlig,maxlig},PlotRange->All,PlotStyle->{Red,Thick}],
LogLinearPlot[Eq[lt,mt],{lt,minlig,maxlig},PlotRange->All,PlotStyle->Blue],simeqplot},PlotRange->{0,1},AxesOrigin->{-18,0}]

Fit Kinetic Data Using NonlinearModelFit

This fits the simulated kinetic transients. Initial guesses for parameters and the boundaries of plots should be adjusted as necessary.

Clear[SigC1,SigC2,kon1,kon2,Ka1,Ka2,K12,k12,k12L]
fit=NonlinearModelFit[simdata,transimf[Lt,Mt,t,SigC1,SigC2,kon1,kon2,Ka1,Ka2,K12,k12,k12L],{{SigC1,1},{SigC2,0},{kon1,100000000},{kon2,100000000},{Ka1,1000},{Ka2,10000000},{K12,0.1`},{k12,25},{k12L,25}},{Lt,Mt,t}];
fit["ParameterConfidenceIntervalTable"]

Block[{SigC1,SigC2,kon1,kon2,Ka1,Ka2,K12,k12,k12L},
{SigC1,SigC2,kon1,kon2,Ka1,Ka2,K12,k12,k12L}=fit["BestFitParameters"][[All,2]];

Print[Show[{simkinplot,Table[LogLinearPlot[Evaluate[transim[ltable[[j]],mt,t]],{t,0.0001,ftp},PlotStyle->{Red,Thick},PlotRange->All],{j,1,Length[ltable]}][[All]]},PlotRange->All,AxesLabel->{"time (s)","Signal"},LabelStyle->Directive[Black,FontF1mily->"Helvetica",FontSize->18],AxesOrigin->{-9,-0.1},AxesStyle->Thickness[0.0075],PlotLabel->"Transient Fit"]];

Print[Show[{LogLinearPlot[Eq[lt,mt],{lt,minlig,maxlig},PlotRange->All,PlotStyle->{Red,Thick}],simeqplot},PlotRange->{-0.2,1.},AxesOrigin->{-18,-0.2},LabelStyle->Directive[Black,FontF1mily->"Helvetica",FontSize->18],AxesLabel->{"[ligand](M)","Signal"}]]

]

({{"", "Estimate", "Standard Error", "Confidence Interval"}, {SigC1, 1.003819291883295`, 0.0007674346366203828`, {1.0022923376826645`,1.0053462460839258`}}, {SigC2, -0.004017124012513998`, 0.002103720377967659`, {-0.008202867676933808`,0.00016861965190581238`}}, {kon1, 9.44724096209194`*^7, 46.69818947110845`, {9.447231670617048`*^7,9.447250253566833`*^7}}, {kon2, 9.538795323944151`*^7, 434.5178200633852`, {9.538708868527764`*^7,9.538881779360539`*^7}}, {Ka1, 760.1118888266714`, 20.66977461404464`, {718.9855209681704`,801.2382566851724`}}, {Ka2, 9.26195392568361`*^6, 129765.36476391778`, {9.003761554154448`*^6,9.520146297212772`*^6}}, {K12, 0.10336408917775808`, 1.1015740847295277`*^-8, {0.10336406725988917`,0.10336411109562699`}}, {k12, 10.059215119101015`, 0.10875266129082792`, {9.842831436291116`,10.275598801910915`}}, {k12L, 28.961486865805135`, 2.4288060993424674`, {24.12892458761475`,33.79404914399552`}}})

Simulate and Fit Equilibrium Data

Simulate and Fit Data for A Macromolecule with Two Conformational States and One Binding Site per State - Signal Comes from Conformation

SigC1=1;(*Observable signal of state C1*)
SigC2=0;(*Observable signal of state C2*)

Ka1=10^3;(*Association constant for conformational state C1. Units of (M^(-1))*)
Ka2=10^7;(*Association constant for conformational state C2. Units of (M^(-1))*)
K12=0.1;(*Conformational equilibrium constant for the C1⇌C2 equilibrium when ligand is not bound*)

mt=1*10^-6; (*Macromolecular concentration*)
Merror=5;(*Error in macromolecule concentration*)
Lerror=5;(*Error in ligand concentrations*)

minlig=3.1*10^-8;(*Minimum ligand concentration. Units of M*)
maxlig=10^-4;(*Maximum ligand concentration. Units of M*)
nlc=9;(*Number of different ligand concentrations to use*)
ltable=Table[10^l,{l,Log[10,minlig],Log[10,maxlig],((Log[10,maxlig]-Log[10,minlig])/(Max[nlc,2]-1))}]//N;(*Generate table of ligand concentrations*)
eqdata=Table[{ltable[[k]],mt,Eq[ltable[[k]],mt][[1]]+RandomVariate[NormalDistribution[0,0.01]]},{k,1,Length[ltable]}];
simeqplot=ListLogLinearPlot[eqdata[[All,{1,3}]],PlotStyle->{PointSize[Medium],Black}](*Plot equilibrium data*)

Clear[lt,pt,SigC1,SigC2,Ka1,Ka2,K12]
fit=NonlinearModelFit[eqdata,{Eq[Lt,Mt][[1]],Ka1>0&&Ka2>0&&K12>0},{{SigC1,2},{SigC2,0.2},{Ka1,2000},{Ka2,1000000},{K12,0.1`}},{Lt,Mt}];
fit["ParameterConfidenceIntervalTable"]

Block[{SigC1,SigC2,Ka1,Ka2,K12},
{SigC1,SigC2,Ka1,Ka2,K12}=fit["BestFitParameters"][[All,2]];

Print[Show[{LogLinearPlot[Eq[lt,mt][[1]],{lt,minlig,maxlig},PlotRange->All,PlotStyle->{Red,Thick}],simeqplot},PlotRange->{-0.2,1.},AxesOrigin->{-18,-0.2},LabelStyle->Directive[Black,FontF1mily->"Helvetica",FontSize->18],AxesLabel->{"[ligand](M)","Signal"}]];
]

Simulate and Fit Data for A Macromolecule with Two Conformational States and One Binding Site per State - Signal Change Comes from Binding

SigFree=1;(*Observable signal of free macromolecule*)
SigBound=0;(*Observable signal of bound macromolecule*)

Ka1=10^3;(*Association constant for conformational state C1. Units of (M^(-1))*)
Ka2=10^7;(*Association constant for conformational state C2. Units of (M^(-1))*)
K12=0.1;(*Conformational equilibrium constant for the C1⇌C2 equilibrium when ligand is not bound*)

mt=1*10^-6; (*Macromolecular concentration*)
Merror=5;(*Error in macromolecule concentration*)
Lerror=5;(*Error in ligand concentrations*)

minlig=3.1*10^-8;(*Minimum ligand concentration. Units of M*)
maxlig=10^-4;(*Maximum ligand concentration. Units of M*)
nlc=9;(*Number of different ligand concentrations to use*)
ltable=Table[10^l,{l,Log[10,minlig],Log[10,maxlig],((Log[10,maxlig]-Log[10,minlig])/(Max[nlc,2]-1))}]//N;(*Generate table of ligand concentrations*)
eqdata=Table[{ltable[[k]],mt,Eq[ltable[[k]],mt][[2]]+RandomVariate[NormalDistribution[0,0.01]]},{k,1,Length[ltable]}];
simeqplot=ListLogLinearPlot[eqdata[[All,{1,3}]],PlotStyle->{PointSize[Medium],Black}](*Plot equilibrium data*)

Clear[lt,pt,SigBound,SigFree,Ka1,Ka2,K12]
fit=NonlinearModelFit[eqdata,{Eq[Lt,Mt][[2]],Ka1>0&&Ka2>0&&K12>0},{{SigFree,2},{SigBound,0.2},{Ka1,2000},{Ka2,1000000},{K12,0.1`}},{Lt,Mt}];
fit["ParameterConfidenceIntervalTable"]

Block[{SigFree,SigBound,Ka1,Ka2,K12},
{SigFree,SigBound,Ka1,Ka2,K12}=fit["BestFitParameters"][[All,2]];

Print[Show[{LogLinearPlot[Eq[lt,mt][[2]],{lt,minlig,maxlig},PlotRange->All,PlotStyle->{Red,Thick}],simeqplot},PlotRange->{-0.2,1.},AxesOrigin->{-18,-0.2},LabelStyle->Directive[Black,FontF1mily->"Helvetica",FontSize->18],AxesLabel->{"[ligand](M)","Signal"}]];
]