Source code for cameo.core.utils
import csv
from pandas import DataFrame
[docs]def get_reaction_for(model, value, add=True):
"""Get or create a reaction for a metabolite or a reaction.
If value is a Metabolite or a Metabolite id, return any already existing demand or exchange reaction.
If *add* is true, add a demand reaction if it does not already exist.
Parameters
----------
model : cobra.Model
The model to for which to get / create a reaction
value: str, Reaction or Metabolite
A reaction identifier, a Reaction or a Metabolite for which an exchange reaction is to be created.
add: bool
Adds a demand reaction for a metabolite if a metabolite is found for *value*
Returns
-------
Reaction
Raises
------
KeyError
If *value* does not match any Reaction or Metabolite
"""
try:
reactions = model.reactions.get_by_any(value)
except (ValueError, KeyError, TypeError):
metabolite = model.metabolites.get_by_any(value)[0]
reactions = model.reactions.query("^(EX|DM)_{}$".format(metabolite.id))
if len(reactions) == 0:
if add:
reactions = [model.add_boundary(metabolite, type='demand')]
else:
raise KeyError('Invalid target %s' % value)
return reactions[0]
[docs]def medium(model):
"""Current medium for this model."""
reaction_ids = []
reaction_names = []
lower_bounds = []
upper_bounds = []
for ex in model.boundary:
metabolite = list(ex.metabolites.keys())[0]
coeff = ex.metabolites[metabolite]
if coeff * ex.lower_bound > 0:
reaction_ids.append(ex.id)
reaction_names.append(ex.name)
lower_bounds.append(ex.lower_bound)
upper_bounds.append(ex.upper_bound)
return DataFrame({'reaction_id': reaction_ids,
'reaction_name': reaction_names,
'lower_bound': lower_bounds,
'upper_bound': upper_bounds},
index=None, columns=['reaction_id', 'reaction_name', 'lower_bound', 'upper_bound'])
[docs]def load_medium(model, medium_def, copy=False, delimiter="\t"):
"""
Loads a medium into the model. If copy is true it will return
a copy of the model. Otherwise it applies the medium to itself.
Supported formats
TODO
Parameters
----------
model : cobra.Model
The model to load medium for
medium_def: str, pandas.DataFrame, dict.
The medium to load
copy: boolean, optional
If True copies the model, otherwise the changes will happen inplace.
delimiter: str
Only if loading the medium from a file.
Returns
-------
cobra.Model
If copy=True, returns a copy of the model.
"""
if copy:
model = model.copy()
else:
model = model
if isinstance(medium_def, dict):
_load_medium_from_dict(model, medium_def)
elif isinstance(medium_def, DataFrame):
_load_medium_from_dataframe(model, medium_def)
elif isinstance(medium_def, str):
_load_medium_from_file(model, medium_def, delimiter=delimiter)
else:
raise AssertionError("input type (%s) is not valid" % type(medium))
return model
def _load_medium_from_dict(model, medium_def):
assert isinstance(medium_def, dict)
for ex_reaction in model.boundary:
ex_reaction.lower_bound = medium_def.get(ex_reaction.id, 0)
def _load_medium_from_file(model, file_path, delimiter="\t"):
this_medium = {}
with open(file_path, "rb") as csv_file:
reader = csv.reader(csv_file, delimiter=delimiter)
for row in reader:
model.reactions.get_by_id(row[0])
this_medium[row[0]] = row[1]
_load_medium_from_dict(model, this_medium)
def _load_medium_from_dataframe(model, medium_df):
assert isinstance(medium_df, DataFrame)
for ex_reaction in model.boundary:
if ex_reaction.id in medium_df.reaction_id.values:
medium_row = medium_df[medium_df.reaction_id == ex_reaction.id]
ex_reaction.lower_bound = medium_row.lower_bound.values[0]
else:
ex_reaction.lower_bound = 0