Team:Groningen/Modelling/Characterization

From 2009.igem.org

(Difference between revisions)
(Undo revision 80257 by Kbover (Talk))
m ({{anchor|Optimization}}Optimization procedure)
 
(102 intermediate revisions not shown)
Line 1: Line 1:
{{Team:Groningen/Modelling/Header}}
{{Team:Groningen/Modelling/Header}}
 +
<div style="float:left" >{{linkedImage|GroningenPrevious.png|Team:Groningen/Modelling/Arsenic}}</div>
-
{{todo|TODO: Talk about the devices we have and in what way we want to characterize them.}}
+
<div title="Arsie Says UP TO ACCUMULATION" style="float:right" >{{linkedImage|Next.JPG|Team:Groningen/Modelling/Downloads}}</div>
 +
 
 +
<div style="clear:both;"></div>
 +
 
 +
<html><style type="text/css">
 +
.intro { margin-left:0px; margin-top:10px; padding:10px; border-left:solid 5px #FFF6D5; border-right:solid 5px #FFF6D5; text-align:justify;background:#FFFFE5; }
 +
</style></html>
 +
<div class="intro introduction">
 +
==Characterization==
 +
We have four kinds of parts we would like to characterize: Importers, Accumulators, Sensors and the GVP cluster.
 +
For this we have a number of methods to estimate ''specific parameters'' (detailed below), as well as a ''[[Team:Groningen/Modelling/Characterization#Optimization|stochastic tool to fit our model]]'' to experimental data based on simulated annealing.
 +
</div>
 +
 
 +
We have the following parts that we can characterize (RPS stands for Relative Promoter Strength)
 +
{|class="ourtable"
 +
|-style="text-align:left"
 +
!style="width:15%" style="text-align:left"|&nbsp;&nbsp;&nbsp;&nbsp; Input/Output
 +
!style="text-align:left"|Subject
 +
|-
 +
|||!style="width:15%" style="text-align:left"|'''Importers'''
 +
|-
 +
|&nbsp;&nbsp;&nbsp;&nbsp; RPS &rarr; &Delta;v<sub>max</sub> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 +
|
 +
We can measure how much v5 (v<sub>max</sub> for As(III) import via GlpF) is in wild-type E.coli and when we over express GlpF at a certain promoter strength <code>S</code> (measured in RPUs). As v5 is a constant times the amount of (active) GlpF this leads to a simple equation for &Delta;v5, if we assume the amount of (active) GlpF produced by our construct is linearly dependent on the promoter strength (v5(0) and v5(1) would be measured):
 +
 
 +
<pre>
 +
v5(RPS) = v5wt + &Delta;v5*RPS
 +
 
 +
v5(0) = v5wt + &Delta;v5*0
 +
v5(S) = v5wt + &Delta;v5*S
 +
 
 +
&Delta;v5 = (v5(1) - v5(0))/S
 +
</pre>
 +
[[Team:Groningen/Literature#Meng2004|Meng 2004]] was able to knock out all efflux of arsenic. If there is no efflux of arsenic the dervative of the accumulation graph is the speed at wich arsenic is pumped inside the cell. The maximum speed would be v5. In such a senario two measurements would be enough to determine the relative promoter strength. One could even determine the reaction rate k6 and GlpF with a simple calculation, since v5 = k6 GlpFT (Vs/Vc). However we do have efflux, not only do we have efflux, but we have efflux that is dependent on the total amount of arsenic inside the cell. Also a portion arsenic gets bound to ArsR.
 +
|-
 +
|||!style="width:15%" style="text-align:left"|'''Accumulators'''
 +
|-
 +
|&nbsp;&nbsp;&nbsp;&nbsp; RPS &rarr; As<sub>bound</sub>(As(III)<sub>in</sub>)
 +
|
 +
For both MBPArsR and fMT we assume the amount of bound As(III) for a given relative promoter strength S obeys (for MBPArsR n=1):
 +
<pre>
 +
Asbound(As(III)in)
 +
= S Bmax As(III)in^n
 +
    / (K^n + As(III)in^n)
 +
</pre>
 +
The constants B<sub>max</sub>, K and n can be determined from uptake experiments comparing E. coli with and without fMT expression. Of course this can be done in general by fitting our model to experimental data, if enough data is provided the fit will be tight enough to allow this. However, even without fitting the full model it should be possible to make a fair estimation from equilibrium measurements.{{infoBox|If the total cell volume is much smaller than the volume of the solution it is reasonable to assume a constant import rate. Also, regardless of whether they feature fMT or not, in equilibrium the amount of ArsR is the same, as is the amount of ArsB, leading to the same amount of unbound arsenic being present. This means that any difference in uptake of arsenic is completely due to arsenic being bound to fMT or MBPArsR. By measuring the amount of arsenic in equilibrium in wild-type cells as well as in cells expressing fMT/MBPArsR for several different (inital) concentrations of As(III), at one or more (known) levels of expression, it is possible to determine the constants Bmax, K and n.}}
 +
|-
 +
|||!style="width:15%" style="text-align:left"|'''Sensors'''
 +
|-
 +
|&nbsp;&nbsp;&nbsp;&nbsp; metal(t) &rarr; RPS(t)
 +
|
 +
The ars promoter is part of a feedback loop, so it is not a simple matter of defining the (instantaneous) promoter strength. Instead we suggest using the relevant equations from [[Team:Groningen/Modelling/Arsenic|our model]]. The necessary parameters can be determined by fitting uptake measurement data to our model. Specifically, if the RPS is measured without arsenic present and with enough arsenic present to keep the promoter fully active during the experiment we can determine <code>&beta;RN &tau;R</code> as follows (under the assumption that the RPS is linearly dependent on arsT/ars and using the fact that without any arsenic present the cells will be in equilibrium):
 +
<pre>
 +
S(max) / S(0) = ars(max) / ars(0)
 +
S(max) / S(0) = arsT / ars(0)
 +
S(max) / S(0) = 1 + ArsR(0)²/KAd²
 +
      ArsR(0) = KAd &radic;(S(max)/S(0) - 1)
 +
 
 +
0 = &beta;RN ars1(0) - (ln(2)/&tau;R) ArsR(0)
 +
0 = &beta;RN ars1T S(0)/S(max)
 +
    - (ln(2)/&tau;R) KAd &radic;(S(max)/S(0) - 1)
 +
&beta;RN ars1T S(0)/S(max)
 +
= (ln(2)/&tau;R) KAd &radic;(S(max)/S(0) - 1)
 +
&beta;RN &tau;R = (ln(2)/ars1T) KAd
 +
  (S(max)/S(0)) &radic;(S(max)/S(0) - 1)
 +
</pre>
 +
|-
 +
|||!style="width:15%" style="text-align:left"|'''GVP cluster'''
 +
|-
 +
|&nbsp;&nbsp;&nbsp;&nbsp; RPS &rarr; GV
 +
|
 +
RPS &rarr; GV
 +
The amount of gas vesicles can be expressed in terms of buoyant density, as volume fraction, using the total mass of the vesicles, etc. No matter how it is expressed, we assume a simple linear dependency between the RPS and the amount of gas vesicles. By taking (T)EM pictures of slices the amount of gas vesicles formed under influence of different RPSes can be determined and a straightforward fit made.
 +
|-
 +
|}
==Uptake measurements==
==Uptake measurements==
Line 51: Line 126:
|x
|x
|}
|}
-
To efficiently look at both time and concentration dependent processes we took samples as in the table on the right.
 
-
Below we list all results, which have been used for fitting all necessary parameters.
 
-
{{todo|TODO: List results. Take conversion from nmol/mg and mg/ml to &micro;M and Vc/Vs into account.}}
+
To obtain data for the optimization procedure described above we conducted ICP-MS measurements on our cells containing various devices/parts. To optimize our findings we have conducted measurements both in time and in concentration.
 +
Details on ICP-MS the experiments can be found on our [[Team:Groningen/Protocols|Protocol Page]]. Measurements have been conducted at times and concentrations as indicated in the table on the right. Results can be seen below.
 +
 
 +
'''First Uptake Measurement'''<br>
 +
In this case we looked at the arsenic uptake of our wildtype and of our wildtype with a lot of pArs promoters with RFP. The raw data can be found at our [[Team:Groningen/Modelling/Downloads| Download Section]]
 +
{|
 +
|[[Image:AsUptakeWildTypeConcentration.png|400px]]||[[Image:AsUptakePArsRFPConcentration.png|400px]]
 +
|-
 +
|[[Image:AsUptakeWildTypeTime.png|400px]]||[[Image:AsUptakePArsRFPTime.png|400px]]
 +
|-
 +
|}
 +
 
 +
'''Getting (Vc/Vs) and other conditions'''<br>
 +
To effectively determine our constants we need to give our model some extra information. For instance what kind of constructs are inside the cel for a given experiment. Also we need to give the model the volume of cells per liter of fluid. To optain this we use the obtained dry weight and calculate how much wet weight it would have been (assuming dry weight/wet weight = 0.3) and then use the density of ''E. coli'' (1100kg/m<sup>3</sup>) to obtain the cell volume for our sample and eventually the desired volume of cells per liter.
 +
Also we need the absolute value of Arsenic taken up by the cells in the assumption that we have one liter of sample and we know (Vc/Vs). Once we know all these parameters the optimization procedure can start.
 +
 
 +
'''Fluorescence Measurements'''<br>
 +
Apart from giving our model all the conditions it needs to calculate all the constants by means of the optimization procedure, we have also conducted some fluorescence measurements and made growth curves of our construct with the pArs promoter with RFP. The cells where put into a solution with either no arsenic in it or at a concentration of 100 micromolair. On the left side one can see the graph of the luminance and on right side and on the right side one can see the coresponding grow curves. The raw data of these measurements can again be found under our  [[Team:Groningen/Modelling/Downloads|Downloads]]
 +
{|
 +
|[[Image:ArsFluorescence.png|400px]]||[[Image:ArsOD.png|400px]]
 +
|-
 +
|}
 +
Using a formula similar to the formula below{{infoBox|In actuality we did not compute the derivative of the fluorescence and then corrected for the OD, instead we first computed the fluorescence normalized for the OD (correlates with RFP per cell) and then fitted a linear function to the data. This leads to a much more robust fit in the presence of noise and few measurements.}} we where able to derive a RPU of 2.3. This means that on average the ars promoter is 2.3 times more active at 100 micromolarity of arsenic (outside the cell) than if there is no arsenic in the solution. For a detailed calculation I would like to refer to our [[Team:Groningen/Modelling/Downloads|Downloads]] section under the RPU sheet.
 +
{|style=float:center;
 +
|[[Image:RPUcalculation.png|300px]]
 +
|}
 +
 
 +
'''Second ICPMS measurement'''
 +
For our second measurement I would like to refer to our [[Team:Groningen/Project/Accumulation|Accumulation]] page. These measerments where higher than expected and they need further analyses before we can use them in tha characterization of our parts.
 +
 
 +
=={{anchor|Optimization}}Optimization procedure==
 +
To fit our model to experimental data from different uptake experiments and/or papers we have implemented an optimization procedure that allows for experiments with different genotypes and circumstances by letting constants be overridden per experiment. It aims to optimize the sum of the RMS errors for each experiment using Simulated Annealing. By clicking the button "Fit" the optimization is started and its progress can be followed by looking at the table of constants and the graphs shown below the table (which are updated in real-time as the best solution is improved). In the optimizations procedure the ratio between v5 and K5 is kept constant. This is done because this ratio could be determined exactly using the data from the experiments done by [[Team:Groningen/Literature#Meng2004|Meng 2004]] v5 itself is not fixed and may vary. (Note that in the code different experiments and graphs can be enabled/disabled, we have entered data from Kostal, Meng and our first ICP-MS measurements.)
{|
{|
Line 64: Line 168:
|-
|-
|v5/K5
|v5/K5
-
|id="v5K5"|
+
|id="v5_K5"|
-
|id="v5K5cur"|
+
|id="v5_K5cur"|
-
|id="v5K5curgradient"|
+
|id="v5_K5curgradient"|
-
|id="v5K5sol"|
+
|id="v5_K5sol"|
|-
|-
|v5
|v5
Line 82: Line 186:
|-
|-
|k8/K7
|k8/K7
-
|id="k8K7"|
+
|id="k8_K7"|
-
|id="k8K7cur"|
+
|id="k8_K7cur"|
-
|id="k8K7curgradient"|
+
|id="k8_K7curgradient"|
-
|id="k8K7sol"|
+
|id="k8_K7sol"|
|-
|-
|k8
|k8
Line 98: Line 202:
|id="K7curgradient"|
|id="K7curgradient"|
|id="K7sol"|
|id="K7sol"|
 +
|-
 +
|tauBbetaB
 +
|id="tauBbeta4"|
 +
|id="tauBbeta4cur"|
 +
|id="tauBbeta4curgradient"|
 +
|id="tauBbeta4sol"|
 +
|-
 +
|tauB
 +
|id="tauB"|
 +
|id="tauBcur"|
 +
|id="tauBcurgradient"|
 +
|id="tauBsol"|
 +
|-
 +
|betaB
 +
|id="beta4"|
 +
|id="beta4cur"|
 +
|id="beta4curgradient"|
 +
|id="beta4sol"|
 +
|-
 +
|tauR
 +
|id="tauR"|
 +
|id="tauRcur"|
 +
|id="tauRcurgradient"|
 +
|id="tauRsol"|
 +
|-
 +
|betaRN
 +
|id="beta1"|
 +
|id="beta1cur"|
 +
|id="beta1curgradient"|
 +
|id="beta1sol"|
 +
|-
 +
|tauFbetaF
 +
|id="tauFbetaF"|
 +
|id="tauFbetaFcur"|
 +
|id="tauFbetaFcurgradient"|
 +
|id="tauFbetaFsol"|
 +
|-
 +
|tauF
 +
|id="tauF"|
 +
|id="tauFcur"|
 +
|id="tauFcurgradient"|
 +
|id="tauFsol"|
 +
|-
 +
|betaF
 +
|id="betaF"|
 +
|id="betaFcur"|
 +
|id="betaFcurgradient"|
 +
|id="betaFsol"|
 +
|-
 +
|tauKbetaK
 +
|id="tauKbetaK"|
 +
|id="tauKbetaKcur"|
 +
|id="tauKbetaKcurgradient"|
 +
|id="tauKbetaKsol"|
 +
|-
 +
|tauK
 +
|id="tauK"|
 +
|id="tauKcur"|
 +
|id="tauKcurgradient"|
 +
|id="tauKsol"|
 +
|-
 +
|betaK
 +
|id="betaK"|
 +
|id="betaKcur"|
 +
|id="betaKcurgradient"|
 +
|id="betaKsol"|
 +
|-
 +
|tauGbeta5
 +
|id="tauGbeta5"|
 +
|id="tauGbeta5cur"|
 +
|id="tauGbeta5curgradient"|
 +
|id="tauGbeta5sol"|
 +
|-
 +
|tauG
 +
|id="tauG"|
 +
|id="tauGcur"|
 +
|id="tauGcurgradient"|
 +
|id="tauGsol"|
 +
|-
 +
|beta5
 +
|id="beta5"|
 +
|id="beta5cur"|
 +
|id="beta5curgradient"|
 +
|id="beta5sol"|
 +
|-
 +
|ars2T
 +
|id="ars2T"|
 +
|id="ars2Tcur"|
 +
|id="ars2Tcurgradient"|
 +
|id="ars2Tsol"|
|-
|-
|E
|E
Line 110: Line 304:
<script type="text/javascript" src="/Team:Groningen/Modelling/Model.js?action=raw"></script>
<script type="text/javascript" src="/Team:Groningen/Modelling/Model.js?action=raw"></script>
<script type="text/javascript">
<script type="text/javascript">
-
var experiments = [{constants:{Vc:0.0073,Vs:(1.1-0.0073),beta4:0},AsT:10e-6,
+
var experiments = {/*Meng2004:
-
                     AsinT:[101.917808219178e-6,394.520547945205e-6,723.287671232877e-6,
+
                  {constants:{Vc:0.0073,Vs:(1.1-0.0073),beta4:0,pro:0,ars2T:0},AsT:10e-6,
-
                          1111.23287671233e-6,1229.58904109589e-6],
+
                     data:{AsinT:[101.917808219178e-6,394.520547945205e-6,723.287671232877e-6,
-
                    time:[60,600,1200,2400,3600]},
+
                                1111.23287671233e-6,1229.58904109589e-6],
-
                   {constants:{Vc:0.004545455,Vs:(1-0.004545455)},AsT:0.467154987e-6,
+
                          time:[60,600,1200,2400,3600]}},
-
                     AsinT:[10.49961532e-6,16.62049351e-6,19.44416512e-6,23.07460003e-6,
+
                  Singh2008: // We assume 5g/L wet cells were used... (at 1100kg/m^3)
-
                            29.40009211e-6,32.06299566e-6],
+
                   {constants:{Vc:(0.004545455),Vs:(1-(0.004545455)),pro:0,ars2T:0,
-
                    time:[1.127*60,4.993*60,9.986*60,20.159*60,30.181*60,60.035*60]}];   
+
                              proF:1.6605e-9},AsT:0.467154987e-6,
 +
                     data:{AsexT:[0.419211538e-6,0.391262322e-6,0.378368845e-6,
 +
                                0.361791516e-6,0.332907991e-6,0.320748614e-6],
 +
                          time:[1.127*60,4.993*60,9.986*60,20.159*60,30.181*60,60.035*60]}},
 +
                  Kostal2004fig3A:  //  fig 3A
 +
                  {constants:{Vc:0.006666667,Vs:(1-0.006666667),pro:0,ars2T:0,proK:1.6605e-9},time:3600,
 +
                    data:{AsinT:[28.71e-6,78.87e-6,144.21e-6,377.19e-6,490.38e-6,617.76e-6,649.11e-6],
 +
                          AsT:[0.4e-6,1e-6,2e-6,5e-6,20e-6,50e-6,100e-6]}},
 +
                  Kostal2004fig3B:  //fig 3B
 +
                  {constants:{Vc:0.006666667,Vs:(1-0.006666667),pro:0,ars2T:0,proK:1.6605e-9},AsT:20e-6,
 +
                    data:{AsinT:[2.25e-4,3.47e-4,4.19e-4,3.93e-4,4.19e-4,4.82e-4,4.82e-4,4.95e-4],
 +
                          time:[582,1212,1890,2514,3144,3828,4260,6036]}},*/
 +
                  pSB1A2con:    //  concentration mode this is our first icps measerment wild type
 +
                  {constants:{Vc:0.000808081,Vs:(1-0.000808081),pro:0,ars2T:0},time:3600,
 +
                    data:{AsinT:[207.0208222e-6,229.0443139e-6,493.3262146e-6,585.8248799e-6],
 +
                          AsT:[10e-6,20e-6,50e-6,100e-6]}},
 +
                  pSB1A2time:  //  concentration mode this is our first icps measerment wild type
 +
                  {constants:{Vc:0.002320346,Vs:(1-0.002320346),pro:0,ars2T:0},AsT:10e-6,
 +
                    data:{AsinT:[66.07047517e-6,83.68926855e-6,114.522157e-6,132.1409503e-6,207.0208222e-6],
 +
                          time:[180,600,1200,2400,3600]}}/*,
 +
                  pArsRRFPcon: // here the cell only contains extra RFP behind the the extra ArsR promoters.
 +
                                //    We incorporate this in our model by pretending RFP=GVP (1st icps)
 +
                  {constants:{Vc:0.001272727,Vs:(1-0.001272727),pro:0},time:3600,
 +
                    data:{AsinT:[136.5456487e-6,277.4959957e-6,290.7100908e-6,343.5664709e-6],
 +
                          AsT:[10e-6,20e-6,50e-6,100e-6]}},
 +
                  pArsRRFPtime:  // here the cell only contains extra RFP behind the the extra ArsR promoters.
 +
                                  // We incorporate this in our model by pretending RFP=GVP (1st icps)
 +
                  {constants:{Vc:0.003333333,Vs:(1-0.003333333),pro:0},AsT:10e-6,
 +
                    data:{AsinT:[52.85638014e-6,92.49866524e-6,88.0939669e-6,136.5456487e-6],
 +
                          time:[180,600,2400,3600]}}*/};   
-
var varsToMutate = ['v5K5','K5','k8K7','K7'];
+
/*var varsToMutate = ['K5','v5','K7','k8','tauB','beta4','tauR','beta1','tauF','betaF',
-
var mutateFuncs = {v5: function(v){return v.v5K5*v.K5;},
+
                    'tauK','betaK','tauG','beta5'];
 +
var mutateFuncs = {v5: function(v){return v.v5;},
                   K5: function(v){return v.K5;},
                   K5: function(v){return v.K5;},
-
                   k8: function(v){return v.k8K7*v.K7;},
+
                   k8: function(v){return v.k8;},
-
                   K7: function(v){return v.K7;}};
+
                  K7: function(v){return v.K7;},
 +
                   tauB: function(v){return v.tauB;},
 +
                  tauR: function(v){return v.tauR;},
 +
                  beta4: function(v){return v.beta4;},
 +
                  beta1: function(v){return v.beta1;},
 +
                  tauF: function(v){return v.tauF;},
 +
                  betaF: function(v){return v.betaF;},
 +
                  tauK: function(v){return v.tauK;},
 +
                  betaK: function(v){return v.betaK;},
 +
                  tauG: function(v){return v.tauG;},
 +
                  beta5: function(v){return v.beta5;}};*/
 +
 
 +
var varsToMutate = [/*'v5_K5',*/'v5','k8_K7','k8','tauBbeta4','beta4',
 +
                    'tauRbeta1_tauBbeta4','beta1_beta4'/*,'tauFbetaF','betaF',
 +
                    'tauKbetaK','betaK','tauGbeta5','beta5','tauF','betaF','tauK','betaK','tauG','beta5','ars2T'*/];
 +
var mutateFuncs = {v5: function(v){return v.v5;},
 +
                  K5: function(v){return v.v5/0.11495;},
 +
                  k8: function(v){return v.k8;},
 +
                  K7: function(v){return v.k8/v.k8_K7;},
 +
                  tauB: function(v){return v.tauBbeta4/v.beta4;},
 +
                  beta4: function(v){return v.beta4;},
 +
                  tauR: function(v){return v.tauRbeta1_tauBbeta4*v.tauBbeta4/(v.beta4*v.beta1_beta4);},
 +
                  beta1: function(v){return v.beta4*v.beta1_beta4;}/*,
 +
                  //tauF: function(v){return v.tauF;},
 +
                  //betaF: function(v){return v.betaF;},
 +
                  //tauK: function(v){return v.tauK;},
 +
                  //betaK: function(v){return v.betaK;},
 +
                  //tauG: function(v){return v.tauG;},
 +
                  //ars2T: function(v){return v.ars2T;},
 +
                  //beta5: function(v){return v.beta5;},
 +
                  tauF: function(v){return v.tauFbetaF/v.betaF;},
 +
                  betaF: function(v){return v.betaF;},
 +
                  tauK: function(v){return v.tauKbetaK/v.betaK;},
 +
                  betaK: function(v){return v.betaK;},
 +
                  tauG: function(v){return v.tauGbeta5/v.beta5;},
 +
                  beta5: function(v){return v.beta5;}*/};
function computeCost(v,e) {
function computeCost(v,e) {
Line 131: Line 390:
   // Go through all experiments
   // Go through all experiments
-
   var cost = 0, n = 0, x0, xt, times;
+
   var cost = 0, weight = 0, x0, xt, times;
   for(var i in e) {
   for(var i in e) {
     // Set up constants for this experiment
     // Set up constants for this experiment
Line 138: Line 397:
     for(var a in e[i].constants) nc[a] = e[i].constants[a];
     for(var a in e[i].constants) nc[a] = e[i].constants[a];
-
     // Simulate
+
     if (e[i].AsT!=undefined) { // Vary time, with fixed AsT
-
    x0 = arsenicModelInitialization(nc,e[i].AsT);
+
      // Simulate
-
     xt = simulate(x0,e[i].time,function(t,d){return arsenicModelGradient(nc,d);});
+
      x0 = arsenicModelInitialization(nc,e[i].AsT);
 +
      xt = simulate(x0,e[i].data.time,function(t,d){return arsenicModelGradient(nc,d);});
 +
 
 +
      // Sum of (squares of) errors, divided by the average value
 +
      var curcost = 0, n = 0;
 +
      for(var xn in e[i].data) {
 +
        if (xn=='time') continue;
 +
        var avgv = 0;
 +
        for(var j in e[i].data[xn]) avgv += e[i].data[xn][j];
 +
        avgv /= e[i].data[xn].length;
 +
        for(var j in xt.timeKey) {
 +
          curcost += Math.pow((e[i].data[xn][j]-xt[xn][xt.timeKey[j]])/avgv,2);
 +
          n++;
 +
        }
 +
      }
 +
      cost += Math.sqrt(curcost/n); // Compute the square root of the average of the squares (RMS)
 +
      weight++;
 +
 
 +
      // Set last solution
 +
      e[i].solution = {'cost':Math.sqrt(curcost/n), 'xt':xt};
 +
     } else if (e[i].time==Infinity) { // Vary AsT, with equilibrium
 +
      var avgv = {};
 +
      for(var xn in e[i].data) {
 +
        avgv[xn] = 0;
 +
        for(var j in e[i].data[xn]) avgv[xn] += e[i].data[xn][j];
 +
        avgv[xn] /= e[i].data[xn].length;
 +
      }
 +
      e[i].solution = {'xt':{'AsT':[]}};
 +
      var curcost = 0, n = 0;
 +
      for(var j in e[i].data.AsT) {
 +
        // Simulate
 +
        xt = arsenicModelEquilibrium(nc,e[i].data.AsT[j]);
 +
        e[i].solution.xt.AsT[j] = e[i].data.AsT[j];
 +
 
 +
        // Fill solution
 +
        for(var xn in xt) {
 +
          if (e[i].solution.xt[xn]==undefined) e[i].solution.xt[xn] = [];
 +
          e[i].solution.xt[xn][j] = xt[xn];
 +
        }
 +
 
 +
        // Sum of (squares of) errors, divided by the average value
 +
        for(var xn in e[i].data) {
 +
          if (xn=='AsT') continue;
 +
          curcost += Math.pow((e[i].data[xn][j]-xt[xn])/avgv[xn],2);
 +
          n++;
 +
        }
 +
      }
 +
      cost += Math.sqrt(curcost/n); // Compute the square root of the average of the squares (RMS)
 +
      weight++;
 +
      e[i].solution.cost = Math.sqrt(curcost/n);
 +
    } else if (!isNaN(e[i].time)) { // Vary AsT, with t = e[i].time
 +
      var avgv = {};
 +
      for(var xn in e[i].data) {
 +
        avgv[xn] = 0;
 +
        for(var j in e[i].data[xn]) avgv[xn] += e[i].data[xn][j];
 +
        avgv[xn] /= e[i].data[xn].length;
 +
      }
 +
      e[i].solution = {'xt':{'AsT':[]}};
 +
      var curcost = 0, n = 0;
 +
      for(var j in e[i].data.AsT) {
 +
        // Simulate
 +
        x0 = arsenicModelInitialization(nc,e[i].data.AsT[j]);
 +
        xt = simulate(x0,e[i].time,function(t,d){return arsenicModelGradient(nc,d);});
 +
        e[i].solution.xt.AsT[j] = e[i].data.AsT[j];
 +
 
 +
        // Fill solution
 +
        for(var xn in xt) {
 +
          if (e[i].solution.xt[xn]==undefined) e[i].solution.xt[xn] = [];
 +
          e[i].solution.xt[xn][j] = xt[xn][xt[xn].length-1];
 +
        }
-
    // Sum (squares of) errors, divided by the average value
+
        // Sum of (squares of) errors, divided by the average value
-
    var avgv = 0;
+
        for(var xn in e[i].data) {
-
    for(var j in e[i].AsinT) avgv += e[i].AsinT[j];
+
          if (xn=='AsT') continue;
-
    avgv /= e[i].AsinT.length;
+
          curcost += Math.pow((e[i].data[xn][j]-xt[xn][xt[xn].length-1])/avgv[xn],2);
-
    for(var j in xt.timeKey) {
+
          n++;
-
      cost += Math.pow((e[i].AsinT[j]-xt.AsinT[xt.timeKey[j]])/avgv,2);
+
        }
-
       n++;
+
       }
 +
      cost += Math.sqrt(curcost/n); // Compute the square root of the average of the squares (RMS)
 +
      weight++;
 +
      e[i].solution.cost = Math.sqrt(curcost/n);
     }
     }
   }
   }
-
   return Math.sqrt(cost/n); // Compute the square root of the average of the squares (RMS)
+
   return cost/weight; // Take the average of the RMS values for all graphs, making it "easier" to disregard certain experiments in favour of the rest.
 +
}
 +
 
 +
function randomLogNormal(mu,sigma) {
 +
  var N = Math.random()+Math.random()+Math.random()+Math.random()+Math.random()+Math.random()
 +
          - (Math.random()+Math.random()+Math.random()+Math.random()+Math.random()+Math.random());
 +
  return Math.exp(mu+sigma*N);
}
}
Line 160: Line 497:
   // Mutate
   // Mutate
-
   var factor = 2-Math.exp(-Math.random());
+
   /*var factor = 1+0.01*(1-Math.exp(-Math.random()));
   if (Math.random()<0.5+Math.atan(dc[vn])/Math.PI) {
   if (Math.random()<0.5+Math.atan(dc[vn])/Math.PI) {
     factor = 1 / factor;
     factor = 1 / factor;
-
   }
+
   }*/
 +
  var sigma = 0.1;
 +
  var factor = randomLogNormal(0,sigma);
   nc[vn] *= factor;
   nc[vn] *= factor;
   return nc;
   return nc;
}
}
-
function showOutputs(mode,E,c,dc) {
+
function fitConstants() {
-
   setOutput('v5K5'+mode,mutateFuncs.v5(c)/mutateFuncs.K5(c));
+
   // Construct plots
-
   setOutput('v5'+mode,mutateFuncs.v5(c));
+
   //constructPlot('v5K5plot');
-
  setOutput('K5'+mode,mutateFuncs.K5(c));
+
   constructPlot('k8K7plot');
-
  setOutput('k8K7'+mode,mutateFuncs.k8(c)/mutateFuncs.K7(c));
+
-
  setOutput('k8'+mode,mutateFuncs.k8(c));
+
-
   setOutput('K7'+mode,mutateFuncs.K7(c));
+
-
  setOutput('E'+mode,computeCost(c,experiments));
+
-
  if (dc!=undefined) {
+
-
    setOutput('v5K5'+mode+'gradient',dc.v5K5);
+
-
    setOutput('v5'+mode+'gradient',dc.v5K5*c.K5-dc.K5*c.v5K5);
+
-
    setOutput('K5'+mode+'gradient',dc.K5);
+
-
    setOutput('k8K7'+mode+'gradient',dc.k8K7);
+
-
    setOutput('k8'+mode+'gradient',dc.k8K7*c.K7-dc.K7*c.k8K7);
+
-
    setOutput('K7'+mode+'gradient',dc.K7);
+
-
  }
+
-
}
+
-
function fitConstants() {
 
   // Show mathematica solution
   // Show mathematica solution
   var orgC = arsenicModelConstants();
   var orgC = arsenicModelConstants();
   var cSol = {};
   var cSol = {};
   for(var i in varsToMutate) cSol[varsToMutate[i]] = 1;
   for(var i in varsToMutate) cSol[varsToMutate[i]] = 1;
-
   cSol.v5K5 = orgC.v5/orgC.K5;
+
   //cSol.v5_K5 = orgC.v5/orgC.K5;
-
   cSol.K5 = orgC.K5;
+
   cSol.v5 = orgC.v5*2;
-
   cSol.k8K7= orgC.k8/orgC.K7;
+
   cSol.k8 = 10;
-
   cSol.K7 = orgC.K7;
+
  cSol.k8_K7 = 2e5;
 +
  cSol.tauBbeta4 = 55;
 +
   cSol.beta4 = 18;
 +
  cSol.tauRbeta1_tauBbeta4 = 400;
 +
  cSol.beta1_beta4 = 2;
 +
//  cSol.tauBbeta4 = 180000;
 +
//  cSol.tauB = 180;
 +
//  cSol.beta4 = 1000;
 +
//  cSol.tauR = 60;
 +
//  cSol.beta1 = 1000;
 +
//  cSol.tauFbetaF = 120000;
 +
//  cSol.tauF = 60;
 +
//  cSol.betaF = 2000;
 +
//  cSol.tauKbetaK = 9240;
 +
//  cSol.tauK = 60;
 +
//  cSol.betaK = 154;
 +
//  cSol.tauGbeta5 = 3960;
 +
//  cSol.tauG = 60;
 +
//  cSol.beta5 = 66;
   showOutputs('sol',computeCost(cSol,experiments),cSol);
   showOutputs('sol',computeCost(cSol,experiments),cSol);
Line 200: Line 543:
   var c = {};
   var c = {};
   for(var i in varsToMutate) c[varsToMutate[i]] = 1;
   for(var i in varsToMutate) c[varsToMutate[i]] = 1;
 +
  //c.v5_K5 = orgC.v5/orgC.K5;
 +
  c.v5 = orgC.v5*2;
 +
  c.k8 = 20;
 +
  c.k8_K7 = 4e5;
 +
  c.tauBbeta4 = 55;
 +
  c.beta4 = 18;
 +
  c.tauRbeta1_tauBbeta4 = 400;
 +
  c.beta1_beta4 = 2;
 +
//  cSol.tauBbeta4 = 180000;
 +
//  cSol.tauB = 180;
 +
//  cSol.beta4 = 1000;
 +
//  cSol.tauR = 60;
 +
//  cSol.beta1 = 1000;
 +
//  cSol.tauFbetaF = 120000;
 +
//  cSol.tauF = 60;
 +
//  cSol.betaF = 2000;
 +
//  cSol.tauKbetaK = 9240;
 +
//  cSol.tauK = 60;
 +
//  cSol.betaK = 154;
 +
//  cSol.tauGbeta5 = 3960;
 +
//  cSol.tauG = 60;
 +
//  cSol.beta5 = 66; 
   var dc = {};
   var dc = {};
   for(var a in c) dc[a] = 0;
   for(var a in c) dc[a] = 0;
   var E = computeCost(c,experiments);
   var E = computeCost(c,experiments);
   var cBest = c, EBest = E;
   var cBest = c, EBest = E;
 +
  for(var i in experiments) experiments[i].bestSolution = experiments[i].solution;
 +
 +
  // Show initial situation
 +
  showOutputs('cur',E,c,dc);
 +
  showOutputs('',EBest,cBest);
 +
  refreshGraphs();
   // Set up iteration
   // Set up iteration
-
   var numiter = 10000;
+
   var numiter = 100000;
   var iter = 0;
   var iter = 0;
   var timer = setInterval(function(){
   var timer = setInterval(function(){
Line 228: Line 599:
       cBest = cNew;
       cBest = cNew;
       EBest = ENew;
       EBest = ENew;
 +
      for(var i in experiments) experiments[i].bestSolution = experiments[i].solution;
       showOutputs('',EBest,cBest);
       showOutputs('',EBest,cBest);
 +
      refreshGraphs();
     }
     }
     // Compute (decaying) "temperature" and accept new solution as current if it's not "too" bad
     // Compute (decaying) "temperature" and accept new solution as current if it's not "too" bad
     var T = 1 - (iter/numiter);
     var T = 1 - (iter/numiter);
-
     if (ENew<E || Math.exp((E-ENew)/(1e-3*T))>=Math.random()) {
+
     if (ENew<E || Math.exp((E-ENew)/(T))>=Math.random()) {
       c = cNew;
       c = cNew;
       E = ENew;
       E = ENew;
Line 239: Line 612:
     }
     }
   },1);
   },1);
 +
}
 +
 +
function refreshGraphs() {
 +
  //document.getElementById('Meng2004Graph').refresh();
 +
  //document.getElementById('Singh2008Graph').refresh();
 +
  //document.getElementById('Kostal2004fig3BGraph').refresh();
 +
  document.getElementById('pSB1A2timeGraph').refresh();
 +
  //document.getElementById('pArsRRFPtimeGraph').refresh();
 +
  //document.getElementById('Kostal2004fig3AGraph').refresh();
 +
  document.getElementById('pSB1A2conGraph').refresh();
 +
  //document.getElementById('pArsRRFPconGraph').refresh();
 +
}
 +
 +
function showOutputs(mode,E,c,dc) {
 +
  //plotMin(v5K5plot,mutateFuncs.v5(c),mutateFuncs.K5(c),E);
 +
  plotMin(k8K7plot,mutateFuncs.k8(c),mutateFuncs.K7(c),E);
 +
  for(var a in c) {
 +
    setOutput(a+mode,c[a]);
 +
  }
 +
  for(var a in mutateFuncs) {
 +
    setOutput(a+mode,mutateFuncs[a](c));
 +
  }
 +
  setOutput('E'+mode,E);
 +
  if (dc!=undefined) {
 +
    for(var a in dc) {
 +
      setOutput(a+mode+'gradient',dc[a]);
 +
    }
 +
  }
 +
}
 +
 +
function constructPlot(id) {
 +
  var width = 100, height = 100;
 +
  var t = document.getElementById(id);
 +
  t.minx = Number.NaN;
 +
  t.miny = Number.NaN;
 +
  t.maxx = Number.NaN;
 +
  t.maxy = Number.NaN;
 +
  t.points = [];
 +
  t.createCaption();
 +
  t.style.width = width + 'px';
 +
  t.style.width = height + 'px';
 +
  t.style.border = 'solid 1px #000';
 +
  t.style.borderCollapse = 'collapse';
 +
  for(var r=0; r<height; r++) {
 +
    var newRow = t.insertRow(0);
 +
    for(var c=0; c<width; c++) {
 +
      var newCell = newRow.insertCell(0);
 +
      newCell.style.width = '1px';
 +
      newCell.style.height = '1px';
 +
      newCell.style.background = '#fff';
 +
      newCell.style.padding = '0px';
 +
    }
 +
  }
 +
}
 +
 +
function plotMin(t,x,y,v) {
 +
  if (x<0) return;
 +
  if (y<0) return;
 +
  var regrid = false;
 +
  t.points.push({'x':x,'y':y,'v':v});
 +
  if (isNaN(t.minx) || x<t.minx) { t.minx = x/1.5; regrid = true; }
 +
  if (isNaN(t.maxx) || x>t.maxx) { t.maxx = x*1.5; regrid = true; }
 +
  if (isNaN(t.miny) || y<t.miny) { t.miny = y/1.5; regrid = true; }
 +
  if (isNaN(t.maxy) || y>t.maxy) { t.maxy = y*1.5; regrid = true; }
 +
  if (regrid==true) {
 +
    //alert('regridding' + [x,y,t.minx,t.miny,t.maxx,t.maxy,regrid]);
 +
    setCaption(t,'x = ['+formatNumberToHTML(t.minx,3)+','+formatNumberToHTML(t.maxx,3)+']<br/>y = ['+formatNumberToHTML(t.miny,3)+','+formatNumberToHTML(t.maxy,3)+']');
 +
    for(var r=0; r<t.rows.length; r++) {
 +
      var row = t.rows[r];
 +
      for(var c=0; c<row.cells.length; c++) {
 +
        var cell = row.cells[c];
 +
        cell.background = '#fff';
 +
      }
 +
    }
 +
    for(var i in t.points) plotMinWork(t,t.points[i].x,t.points[i].y,t.points[i].v);
 +
  } else {
 +
    plotMinWork(t,x,y,v);
 +
  }
 +
}
 +
 +
function plotMinWork(t,x,y,v) {
 +
  var r = Math.floor((y-t.miny)/(t.maxy-t.miny)*t.rows.length);
 +
  var c = Math.floor((x-t.minx)/(t.maxx-t.minx)*t.rows[0].cells.length);
 +
  var cell = t.rows[r].cells[c];
 +
  if (cell.value==undefined || v<cell.value) {
 +
    cell.value = v;
 +
    cell.style.background = 'rgb('+Math.max(0,100*v)+'%,'+Math.min(100,100*(1-v))+'%,0%)';
 +
  }
 +
}
 +
 +
function setCaption(t,cap) {
 +
  if (!t) return;
 +
  var caps = t.getElementsByTagName('caption');
 +
  if (caps.length>0) {
 +
    caps[0].innerHTML = cap;
 +
    return;
 +
  }
 +
  if (t.caption) {
 +
    t.caption = cap;
 +
    return;
 +
  }
}
}
</script>
</script>
</html>
</html>
 +
{|
 +
|
 +
{|id="v5K5plot"
 +
|}
 +
|
 +
{|id="k8K7plot"
 +
|}
 +
|}
 +
 +
<!-- Model graphs start here -->
 +
<html>
 +
<script type="text/javascript" src="/Team:Groningen/Modelling/Model.js?action=raw"></script>
 +
<script type="text/javascript" src="/Team:Groningen/Modelling/Arsenic.js?action=raw"></script>
 +
</html>
 +
{{GraphHeader}}
 +
{|
 +
<!--|{{graph|Team:Groningen/Graphs/Characterization/GlpF|id=Meng2004Graph}}
 +
|{{graph|Team:Groningen/Graphs/Characterization/Singh2008|id=Singh2008Graph}}
 +
|-
 +
|{{graph|Team:Groningen/Graphs/Characterization/Kostal2004fig3B|id=Kostal2004fig3BGraph}}-->
 +
|{{graph|Team:Groningen/Graphs/Characterization/pSB1A2time|id=pSB1A2timeGraph}}
 +
<!--|-
 +
|{{graph|Team:Groningen/Graphs/Characterization/pArsRRFPtime|id=pArsRRFPtimeGraph}}
 +
|{{graph|Team:Groningen/Graphs/Characterization/Kostal2004fig3A|id=Kostal2004fig3AGraph}}
 +
|- -->
 +
|{{graph|Team:Groningen/Graphs/Characterization/pSB1A2con|id=pSB1A2conGraph}}
 +
<!--|{{graph|Team:Groningen/Graphs/Characterization/pArsRRFPcon|id=pArsRRFPconGraph}}-->
 +
|}
 +
<!-- Don't forget to update the refreshGraphs function above! -->
 +
 +
{{Team:Groningen/Footer}}

Latest revision as of 00:13, 22 October 2009

Igemhomelogo.png
GroningenPrevious.png
Next.JPG

Characterization

We have four kinds of parts we would like to characterize: Importers, Accumulators, Sensors and the GVP cluster. For this we have a number of methods to estimate specific parameters (detailed below), as well as a stochastic tool to fit our model to experimental data based on simulated annealing.

We have the following parts that we can characterize (RPS stands for Relative Promoter Strength)

     Input/Output Subject
Importers
     RPS → Δvmax                                             

We can measure how much v5 (vmax for As(III) import via GlpF) is in wild-type E.coli and when we over express GlpF at a certain promoter strength S (measured in RPUs). As v5 is a constant times the amount of (active) GlpF this leads to a simple equation for Δv5, if we assume the amount of (active) GlpF produced by our construct is linearly dependent on the promoter strength (v5(0) and v5(1) would be measured):

v5(RPS) = v5wt + Δv5*RPS

v5(0) = v5wt + Δv5*0
v5(S) = v5wt + Δv5*S

Δv5 = (v5(1) - v5(0))/S

Meng 2004 was able to knock out all efflux of arsenic. If there is no efflux of arsenic the dervative of the accumulation graph is the speed at wich arsenic is pumped inside the cell. The maximum speed would be v5. In such a senario two measurements would be enough to determine the relative promoter strength. One could even determine the reaction rate k6 and GlpF with a simple calculation, since v5 = k6 GlpFT (Vs/Vc). However we do have efflux, not only do we have efflux, but we have efflux that is dependent on the total amount of arsenic inside the cell. Also a portion arsenic gets bound to ArsR.

Accumulators
     RPS → Asbound(As(III)in)

For both MBPArsR and fMT we assume the amount of bound As(III) for a given relative promoter strength S obeys (for MBPArsR n=1):

Asbound(As(III)in)
 = S Bmax As(III)in^n
    / (K^n + As(III)in^n)
The constants Bmax, K and n can be determined from uptake experiments comparing E. coli with and without fMT expression. Of course this can be done in general by fitting our model to experimental data, if enough data is provided the fit will be tight enough to allow this. However, even without fitting the full model it should be possible to make a fair estimation from equilibrium measurements.
If the total cell volume is much smaller than the volume of the solution it is reasonable to assume a constant import rate. Also, regardless of whether they feature fMT or not, in equilibrium the amount of ArsR is the same, as is the amount of ArsB, leading to the same amount of unbound arsenic being present. This means that any difference in uptake of arsenic is completely due to arsenic being bound to fMT or MBPArsR. By measuring the amount of arsenic in equilibrium in wild-type cells as well as in cells expressing fMT/MBPArsR for several different (inital) concentrations of As(III), at one or more (known) levels of expression, it is possible to determine the constants Bmax, K and n.
 i 
Sensors
     metal(t) → RPS(t)

The ars promoter is part of a feedback loop, so it is not a simple matter of defining the (instantaneous) promoter strength. Instead we suggest using the relevant equations from our model. The necessary parameters can be determined by fitting uptake measurement data to our model. Specifically, if the RPS is measured without arsenic present and with enough arsenic present to keep the promoter fully active during the experiment we can determine βRN τR as follows (under the assumption that the RPS is linearly dependent on arsT/ars and using the fact that without any arsenic present the cells will be in equilibrium):

S(max) / S(0) = ars(max) / ars(0)
S(max) / S(0) = arsT / ars(0)
S(max) / S(0) = 1 + ArsR(0)²/KAd²
      ArsR(0) = KAd √(S(max)/S(0) - 1)

0 = βRN ars1(0) - (ln(2)/τR) ArsR(0)
0 = βRN ars1T S(0)/S(max)
     - (ln(2)/τR) KAd √(S(max)/S(0) - 1)
βRN ars1T S(0)/S(max)
 = (ln(2)/τR) KAd √(S(max)/S(0) - 1)
βRN τR = (ln(2)/ars1T) KAd
   (S(max)/S(0)) √(S(max)/S(0) - 1)
GVP cluster
     RPS → GV

RPS → GV The amount of gas vesicles can be expressed in terms of buoyant density, as volume fraction, using the total mass of the vesicles, etc. No matter how it is expressed, we assume a simple linear dependency between the RPS and the amount of gas vesicles. By taking (T)EM pictures of slices the amount of gas vesicles formed under influence of different RPSes can be determined and a straightforward fit made.

Uptake measurements

Sampling scheme
Time (min)
0 10 20 40 60
As(III)exT(0)
(µM)
0 x
10 x x x x x
20 x
50 x
100 x

To obtain data for the optimization procedure described above we conducted ICP-MS measurements on our cells containing various devices/parts. To optimize our findings we have conducted measurements both in time and in concentration. Details on ICP-MS the experiments can be found on our Protocol Page. Measurements have been conducted at times and concentrations as indicated in the table on the right. Results can be seen below.

First Uptake Measurement
In this case we looked at the arsenic uptake of our wildtype and of our wildtype with a lot of pArs promoters with RFP. The raw data can be found at our Download Section

AsUptakeWildTypeConcentration.pngAsUptakePArsRFPConcentration.png
AsUptakeWildTypeTime.pngAsUptakePArsRFPTime.png

Getting (Vc/Vs) and other conditions
To effectively determine our constants we need to give our model some extra information. For instance what kind of constructs are inside the cel for a given experiment. Also we need to give the model the volume of cells per liter of fluid. To optain this we use the obtained dry weight and calculate how much wet weight it would have been (assuming dry weight/wet weight = 0.3) and then use the density of E. coli (1100kg/m3) to obtain the cell volume for our sample and eventually the desired volume of cells per liter. Also we need the absolute value of Arsenic taken up by the cells in the assumption that we have one liter of sample and we know (Vc/Vs). Once we know all these parameters the optimization procedure can start.

Fluorescence Measurements
Apart from giving our model all the conditions it needs to calculate all the constants by means of the optimization procedure, we have also conducted some fluorescence measurements and made growth curves of our construct with the pArs promoter with RFP. The cells where put into a solution with either no arsenic in it or at a concentration of 100 micromolair. On the left side one can see the graph of the luminance and on right side and on the right side one can see the coresponding grow curves. The raw data of these measurements can again be found under our Downloads

ArsFluorescence.pngArsOD.png
Using a formula similar to the formula below
In actuality we did not compute the derivative of the fluorescence and then corrected for the OD, instead we first computed the fluorescence normalized for the OD (correlates with RFP per cell) and then fitted a linear function to the data. This leads to a much more robust fit in the presence of noise and few measurements.
 i 
we where able to derive a RPU of 2.3. This means that on average the ars promoter is 2.3 times more active at 100 micromolarity of arsenic (outside the cell) than if there is no arsenic in the solution. For a detailed calculation I would like to refer to our Downloads section under the RPU sheet.
RPUcalculation.png

Second ICPMS measurement For our second measurement I would like to refer to our Accumulation page. These measerments where higher than expected and they need further analyses before we can use them in tha characterization of our parts.

Optimization procedure

To fit our model to experimental data from different uptake experiments and/or papers we have implemented an optimization procedure that allows for experiments with different genotypes and circumstances by letting constants be overridden per experiment. It aims to optimize the sum of the RMS errors for each experiment using Simulated Annealing. By clicking the button "Fit" the optimization is started and its progress can be followed by looking at the table of constants and the graphs shown below the table (which are updated in real-time as the best solution is improved). In the optimizations procedure the ratio between v5 and K5 is kept constant. This is done because this ratio could be determined exactly using the data from the experiments done by Meng 2004 v5 itself is not fixed and may vary. (Note that in the code different experiments and graphs can be enabled/disabled, we have entered data from Kostal, Meng and our first ICP-MS measurements.)

best cur gradient solved
v5/K5
v5
K5
k8/K7
k8
K7
tauBbetaB
tauB
betaB
tauR
betaRN
tauFbetaF
tauF
betaF
tauKbetaK
tauK
betaK
tauGbeta5
tauG
beta5
ars2T
E

Loading graph...
Loading graph...