Getting started¶
Loading models¶
framed supports different kinds of metabolic models. In any case, loading a model is quite simple.
For constraint-based (cobra) models:
from framed import load_cbmodel
model = load_cbmodel('my_model.xml')
Note that different people have been using different modeling conventions to store constraint-based models in SBML format. framed handles this problem using flavors. We currently support two flavors:
- cobra: This is the format adopted by the cobra toolbox.
- fbc2: This is the new fbc2 extension for SBML.
If can optionally specify the flavor of the model you are loading and framed will automatically apply a set of rules to improve compatibility (for example, removing boundary metabolites):
model = load_cbmodel('my_model.xml', flavor='fbc2')
For kinetic models:
from framed import load_odemodel
model = load_odemodel('my_model.xml')
Saving models¶
If you apply any kind of changes to a model, you can easily save your model as follows:
from framed import save_sbml_model
save_sbml_model(model, 'my_output_file.xml')
For constraint-based models you can also specify a specific flavor (this is useful for converting between different flavors):
save_sbml_model(model, 'my_output_file.xml', flavor='cobra')
Human readable format¶
Additionally, framed introduces a new shorthand notation for import/export of models in an human-readable format
(You can see this format by typing print model
).
from framed import read_cbmodel_from_file, write_model_to_file
model = read_cbmodel_from_file('my_file.txt')
write_model_to_file(model, 'my_new_file.txt')
Note: This format is not yet available for kinetic models.
Model manipulation¶
Once you load a model you can easily access the model’s attributes perform different kinds of operations using the model object. Note that some operations might be specific to constraint-based or kinetic models.
You can quickly look at your model by printing it:
print model
R_ACALD: M_acald_c + M_coa_c + M_nad_c <-> M_accoa_c + M_h_c + M_nadh_c
R_ACALDt: M_acald_e <-> M_acald_c
R_ACKr: M_ac_c + M_atp_c <-> M_actp_c + M_adp_c
R_ACONTa: M_cit_c <-> M_acon_C_c + M_h2o_c
R_ACONTb: M_acon_C_c + M_h2o_c <-> M_icit_c
(...)
You can also inspect particular metabolites and reactions.
print model.reactions.R_PGI
R_PGI: M_g6p_c <-> M_f6p_c
print model.metabolites.M_g6p_c
D-Glucose-6-phosphate
print model.reactions.R_TKT1.gpr
(G_b2465 or G_b2935)
You can easily make changes to a model. For instance, let’s change the maximum glucose uptake rate:
model.reactions.R_EX_glc_e.lb = -10
But for programmatic access, you may want to use reactions as a dictionary instead:
for reaction in model.reactions.values():
reaction.lb = 0
For convenience, you can access some methods from the model class directly:
for r_id in model.reactions:
model.set_lower_bound(r_id, 0)
You can easily add a new reaction to a model (or replace an existing reaction with the same id):
model.add_reaction_from_str('R_new: A + 0.5 B --> 2 C')
For constraint-based models you can optionally define the flux bounds as well:
model.add_reaction_from_str('R_new: S + M_atp_c <-> P + M_adp_c [-10, 10]')
You can also remove reactions (as well as metabolites, genes or compartments):
model.remove_reaction('R_PGI')
model.remove_metabolites(['M_h2o_c', 'M_h_c'])
There is a lot more you can try! Just take a look into our API.
Model transformations¶
There are some utilities to make some overall model transformations. One obvious one is to remove blocked reactions and dead-end metabolites (only for constraint-based models):
from framed import simplify
simplify(model)
You can also create a fully irreversible model by splitting reversible reactions in two directions (useful for some applications):
from framed import make_irreversible
make_irreversible(model)
If you don’t want to change your original model, in both cases you can generate a new model:
new_model = simplify(model, inplace=False)