def _fix_medium(args): """Get the fixed medium for a model.""" sid, p, growth, min_growth, max_import, mip, medium, weights = args com = load_pickle(p) try: fixed = mm.complete_medium( com, medium, growth=growth, min_growth=min_growth, max_import=max_import, minimize_components=mip, weights=weights ) except Exception: logger.error( "Can't reach the specified growth rates for model %s." % sid ) return None fixed = pd.DataFrame({"reaction": fixed.index, "flux": fixed.values}) fixed["metabolite"] = [ list(com.reactions.get_by_id(r).metabolites.keys())[0].id for r in fixed.reaction ] fixed["description"] = [ list(com.reactions.get_by_id(r).metabolites.keys())[0].name for r in fixed.reaction ] fixed["sample_id"] = sid return fixed
def _growth(args): p, tradeoff, medium, weights, atol, rtol = args com = load_pickle(p) if atol is None: atol = com.solver.configuration.tolerances.optimality if rtol is None: rtol = com.solver.configuration.tolerances.optimality com = load_pickle(p) if "glpk" in interface_to_str(com.solver.interface): logger.error( "Community models were not built with a QP-capable solver. " "This means that you did not install CPLEX or Gurobi. " "If you did install one of the two please file a bug report " "at https://github.com/micom-dev/micom/issues." ) return None ex_ids = [r.id for r in com.exchanges] logger.info( "%d/%d import reactions found in model.", medium.index.isin(ex_ids).sum(), len(medium), ) com.medium = medium[medium.index.isin(ex_ids)] # Get growth rates try: sol = com.cooperative_tradeoff(fraction=tradeoff) rates = sol.members rates["taxon"] = rates.index rates["tradeoff"] = tradeoff rates["sample_id"] = com.id except Exception: logger.warning( "Could not solve cooperative tradeoff for %s. " "This can often be fixed by chosing ore permissive atol and rtol " "arguments." % com.id) return None # Get the minimal medium and the solution at the same time sol = minimal_medium( com, exchanges=None, community_growth=sol.growth_rate, min_growth=rates.growth_rate.drop("medium"), solution=True, weights=weights, atol=atol, rtol=rtol )["solution"] fluxes = sol.fluxes.loc[:, sol.fluxes.columns.str.startswith("EX_")].copy() fluxes["sample_id"] = com.id fluxes["tolerance"] = atol anns = annotate_metabolites_from_exchanges(com) return {"growth": rates, "exchanges": fluxes, "annotations": anns}
def _medium(args): """Get minimal medium for a single model.""" s, p, min_growth = args com = load_pickle(p) # open the bounds for ex in com.exchanges: ex.bounds = (-1000.0, 1000.0) try: medium = mm.minimal_medium(com, 0.0, min_growth=min_growth).to_frame() except Exception: logger.error("Could not get a minimal medium for sample %s." % s) return None medium.columns = ["flux"] medium["sample_id"] = s medium.index.name = "reaction" return medium.reset_index()
def _tradeoff(args): p, tradeoffs, medium = args com = load_pickle(p) ex_ids = [r.id for r in com.exchanges] logger.info( "%d/%d import reactions found in model.", medium.index.isin(ex_ids).sum(), len(medium), ) com.medium = medium[medium.index.isin(ex_ids)] try: sol = com.optimize() except Exception: logger.error( "Sample %s could not be optimized (%s)." % (com.id, com.solver.status), ) return None rates = sol.members rates["taxon"] = rates.index rates["tradeoff"] = np.nan rates["sample_id"] = com.id df = [rates] # Get growth rates try: sol = com.cooperative_tradeoff(fraction=tradeoffs) except Exception: logger.warning( "Sample %s could not be optimized with cooperative tradeoff (%s)." % (com.id, com.solver.status), ) return None for i, s in enumerate(sol.solution): rates = s.members rates["taxon"] = rates.index rates["tradeoff"] = sol.tradeoff[i] rates["sample_id"] = com.id df.append(rates) df = pd.concat(df) return df[df.taxon != "medium"]