Source code for micom.annotation

"""Helper to annotate metabolites and species."""

from cobra.core.formula import Formula
import pandas as pd
from micom import Community
import warnings


[docs] def flatten(d): """Flatten a dictionary into strings.""" return {k: str(v) for k, v in d.items()}
[docs] def annotate(ids, community, what="reaction"): """Annotate a list of entities.""" if what == "reaction": elems = community.reactions elif what == "metabolite": elems = community.metabolites else: raise ValueError("Invalid value for `what` :(") objs = elems.get_by_any(ids) attr = "global_id" if isinstance(community, Community) else "id" if what == "reaction": anns = [ pd.Series({what: getattr(o, attr), "name": o.name, **flatten(o.annotation)}) for o in objs ] else: anns = [ pd.Series( { what: getattr(o, attr), "name": o.name, "molecular_weight": Formula(o.formula).weight, "C_number": Formula(o.formula).elements.get("C", 0), "N_number": Formula(o.formula).elements.get("N", 0), **flatten(o.annotation), } ) for o in objs ] return pd.DataFrame.from_records(anns)
[docs] def annotate_metabolites_from_exchanges(com): """Annotate exchange reactions by their metabolite.""" if isinstance(com, Community): exs = com.internal_exchanges + com.exchanges attr = "global_id" else: exs = com.exchanges attr = "id" mets = pd.DataFrame.from_records( [ { "object": r.reactants[0], "metabolite": getattr(r.reactants[0], attr), "reaction": getattr(r, attr), } for r in exs ] ).drop_duplicates() with warnings.catch_warnings(): warnings.simplefilter("ignore", category=UserWarning) anns = annotate(mets.object.tolist(), com, "metabolite") anns["reaction"] = mets.reaction.values return anns.drop_duplicates(subset=["reaction"])