"""Helper to annotate metabolites and species."""fromcobra.core.formulaimportFormulaimportpandasaspdimportwarnings
[docs]defflatten(d):"""Flatten a dictionary into strings."""return{k:str(v)fork,vind.items()}
[docs]defannotate(ids,community,what="reaction"):"""Annotate a list of entities."""ifwhat=="reaction":elems=community.reactionselifwhat=="metabolite":elems=community.metaboliteselse:raiseValueError("Invalid value for `what` :(")objs=elems.get_by_any(ids)attr="global_id"ifhasattr(community.reactions[0],"global_id")else"id"ifwhat=="reaction":anns=[pd.Series({what:getattr(o,attr),"name":o.name,**flatten(o.annotation)})foroinobjs]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),})foroinobjs]returnpd.DataFrame.from_records(anns)
[docs]defannotate_metabolites_from_exchanges(com):"""Annotate exchange reactions by their metabolite."""ifhasattr(com.reactions[0],"global_id"):exs=com.internal_exchanges+com.exchangesattr="global_id"else:exs=com.exchangesattr="id"mets=pd.DataFrame.from_records([{"object":r.reactants[0],"metabolite":getattr(r.reactants[0],attr),"reaction":getattr(r,attr),}forrinexs]).drop_duplicates()withwarnings.catch_warnings():warnings.simplefilter("ignore",category=UserWarning)anns=annotate(mets.object.tolist(),com,"metabolite")anns["reaction"]=mets.reaction.valuesreturnanns.drop_duplicates(subset=["reaction"])