Modeling
Modelling concentrations over multiple Lagoons
When transfer from one volume to the next is performed, new lagoon can be modelled with starting values calculated from the last lagoons end values. For each concentration from the previous lagoon \(c_{t}\), the concentration in the next lagoon \(c_{t+1}\) is calculated as $$ c_{t+1} = \frac{v_{t} }{v_{l} } \cdot c_{t} $$ with \(v_{l}\), the volume of a lagoon and \(v_{t}\), the volume that is transferred. If the transfered volume is spinned down before it is added to the new lagoon, the initial value for \(c_{P}\) is calculated this way. The initial concentration of uninfected E. coli is set to the initial cell density. Initial concentrations of infected and phage-producing E. coli are set to zero, because before the transfer, no phages are present in the new lagoon.
If the transfer volume is not spinned down, the concentration of infected and phage-producing E. coli are calculated, using the above formula. The initial concentration of uninfected E. coli is the calculated the same way, but the initial cell density is added.
In directed evolution the fitness should increase over time. A linear increase in fitness between to given values was implemented to show this. The problem with this approach is its basic assumption being that all phage-producing E. coli are infected by phages with the same fitness.
To make the model more plausible, a distribution of fitness was introduced. For a set of discrete fitness values each fitness values share of the phage-producing E. coli population is calculated.
That changes the equation for the change in the concentration of phage-producing E. coli to $$ \frac{\partial c_{P} (t)}{\partial t} = -k \cdot c_{u}(t) \cdot c_{P} (t) + \sum_{i = 0}^N f_{i} \cdot s_{i} \cdot \mu \cdot c_{p} (t) $$ The calculation is for \(N\) different fitness values \(f_{i}\) and their share of the total phage-producing E. coli population \(s_{i}\).
Numeric solutions
The problem described above is a system of four differential equations, of which two ( \(\frac{\partial c_{i} }{\partial t} \:, \: \frac{\partial c_{p} }{\partial t}\) ) are so called delayed differential equations. They contain a term that needs to be evaluated at a timepoint in the past \(t - t_{P}\). A custom script was used to solve the problem numerically, using the explicit Euler method.[Source!]
The basic idea is that from a point in time with all values and all derivatives values given, the next point in time can be calculated by assuming a linear progress between the two points. $$ f(t_{n+1}) = f(t_{n}) + (t_{n+1} - t_{n}) \cdot f'(t_{n}) $$ This is performed for \(c_{u}(t)\), \(c_{i}(t)\), \(c_{p}(t)\) and \(c_{P}(t)\) rotatory, to always have the needed values from \(t_{n}\) ready for \(t_{n+1}\).
To explore, how unprecise parameters and noise influence the outcome of the model, a mode was implemented, that adds gaussian noise to all parameters. It uses the function \(n\) that makes a value \(v\) noisy with a random parameter \(r\). $$ n(v) = \big(1 - 2r\big) \cdot \sigma_{G} \cdot \sigma_{v} \cdot v, \quad r \in (0, 1) $$ Here, \(\sigma_{G}\) is a factor that is the same for all \(v\), \(\sigma_{v}\) is specific for \(v\). This way, it is possible to have one parameter being noisier than another, while being able to tune the noise globally. [Results]
Table 2: Additional Variables and Parameters used in the numeric solution of the model List of all additional paramters and variables used in the numeric solution of this model. When possible values are given.
Symbol | Name in Source code | Value and Unit | Explanation |
---|---|---|---|
\(v_{l}\) | <code class="language-python">vl</code> |
[ml] | Volume of lagoon |
\(t_{l} \) | <code class="language-python">tl</code> |
[min] | Duration until transfer to the next lagoon |
\(c_{u}(t_{0})\) | <code class="language-python">ceu0</code> |
[cfu] | Concentration of E. coli in a lagoon when M13 phages are transfered to it |
\(c_{P}(t_{0})\) | <code class="language-python">cp0</code> |
[pfu] | Initial concentration of M13 phage in the first lagoon |
\(n\) | <code class="language-python">epochs</code> |
- | Number of epochs that are modelled, one epoch being everything that happens in one particular lagoon |
\(s\) | <code class="language-python">tsteps</code> |
- | Number of time steps for which numeric solutions are calculated, counted per epoch |
\(c_{P}^{min}\) | <code class="language-python">min_cp</code> |
[pfu] | Lower threshold for valid phage titers |
\(c_{P}^{max}\) | <code class="language-python">max_cp</code> |
[pfu] | Upper threshold for valid phage titers |