Experimental data

  • The Final proteomics data in the model has units of \(\frac{\text{mmol}}{\text{gDW}}\).

  • geckopy provides the transformation from copies per cell.

\[\begin{split}\begin{align} \frac{\text{mmol}}{\text{cell}} &= \frac{\bf{molecules}}{\bf{cell}} \frac{10^3\text{mol}}{\text{molecules}} \\ \frac{\text{mmol}}{\text{gDW}} &= \frac{\bf{mmol}}{\bf{cell}} \frac{\text{cell}}{fL} \frac{fL}{g}\frac{g}{\text{gDW}} \end{align}\end{split}\]
from os.path import join, pardir

import geckopy
import pandas as pd

ROOT = pardir
DATA = join(ROOT, "tests", "data")

ec_model = geckopy.io.read_sbml_ec_model(join(DATA, "eciML1515.xml.gz"))
raw_proteomics = pd.read_csv(join(DATA, "ecoli_proteomics_schmidt2016S5.tsv"))

ec_model_exp = geckopy.experimental.from_copy_number(
    ec_model,
    index=raw_proteomics["uniprot"],
    cell_copies = raw_proteomics["copies_per_cell"],
    stdev = raw_proteomics["stdev"],
    vol=2.3, dens=1.105e-12, water=0.3
)
ec_model_exp.slim_optimize()
nan

After the proteomics data is applied, it is often the case that the model requires some relaxation of the experimental constraints to be able to grow.

Relaxation

Geckopy provides elastic filtering (see apply_proteomics_elastic_relaxation()) as implemented in Chinnek and Dravnieks, 1990).

from geckopy.experimental.relaxation import (
    apply_proteomics_elastic_relaxation,
    apply_proteomics_relaxation,
)

This method returns the relaxed model with the Irreducibly Inconsistent Set of functional constraints (IIS); that is, all the proteins that affect the feasibility of the problem.

Please note that not all proteins variables in the ISS must be relaxed for the model to be feasible, but all of the proteins in the ISS are part of one set of proteins that makes the model feasible.

relaxed_model, iiset = apply_proteomics_elastic_relaxation(ec_model_exp)
relaxed_model.slim_optimize()
0.8588931565514887

Alternatively, the relaxation can be applied to just the first found subset of the ISS with apply_proteomics_relaxation():

relaxed_model, iset = apply_proteomics_relaxation(ec_model_exp)
relaxed_model.slim_optimize()
0.8588940541385824

Pool constraint

ec_model = geckopy.io.read_sbml_ec_model(join(DATA, "eciML1515.xml.gz"))

A pool constraint can be applied to the Proteinss to account for protein crowding. This is useful when there are proteins with missing concentrations in the model but the total amount of protein that the cell can allocate is known

The amount of flux a protein can take from the pool is their \(M_W 10^{-3}\). This value can be scrapped with extract_proteins()

from geckopy.experimental.molecular_weights import extract_proteins
df = extract_proteins(ec_model)
for row in df.itertuples():
    ec_model.proteins.get_by_id(row[2]).mw = row[3]

As explained in the Appendix of Sánchez et al., 2017,

  • sigma_saturation_factor is the parameter adjusting how much of a protein pool can take part in reactions.

  • fn_mass_fraction_unmeasured_matched is \(\frac{f_n}{1 - f_m}\), where \(f_n\) is the mass fraction of unmeasured protein divided and \(f_m\) is the fraction of proteins measured.

ec_model.constrain_pool(
    p_total=0.2,
    sigma_saturation_factor=0.8,
    fn_mass_fraction_unmeasured_matched=1
)
ec_model.protein_pool_exchange
Reaction identifierprot_pool_exchange
Name
Memory address 0x07fe6339ac760
Stoichiometry

--> prot_pool

-->

GPR
Lower bound0
Upper bound0.16000000000000003
ec_model.slim_optimize()
0.26126914095190934