def minimal_medium(models: CommunityModelDirectory, min_growth: float = 0.1, threads: int = 1) -> pd.DataFrame: """Calculate the minimal medium for a set of community models.""" samples = models.manifest.view(pd.DataFrame).sample_id.unique() paths = [models.model_files.path_maker(model_id=s) for s in samples] args = [[p, min_growth] for p in paths] results = workflow(_medium, args, threads) results = pd.concat(results, axis=0) medium = results.groupby("reaction").flux.max().reset_index() medium["metabolite"] = medium.reaction.str.replace("EX_", "") return medium
def fix_community_medium( tax, medium, min_growth=0.1, max_import=1, minimize_components=True, n_jobs=4, ): """Augment a growth medium so all community members can grow in it. Arguments --------- tax : pandas.Dataframe A taxonomy specification as passed to `micom.Community`. medium : pandas.Series A growth medium with exchange reaction IDs as index and positive import fluxes as values. min_growth : positive float The minimum biomass production required for growth. max_import : positive float The maximum import rate for added imports. minimize_components : boolean Whether to minimize the number of media components rather than the total flux. n_jobs: int The number of processes to use. Returns ------- pandas.Series A new growth medium with the smallest amount of augmentations such that all members of the community can grow in it. """ if medium[medium < 1e-6].any(): medium[medium < 1e-6] = 1e-6 logger.info( "Some import rates were to small and were adjusted to 1e-6.") args = [(row.id, row.file, medium, min_growth, max_import, minimize_components) for _, row in tax.iterrows()] res = workflow(_fix_medium, args, n_jobs=n_jobs, unit="model(s)") return pd.concat(res, axis=1).max(axis=1)
def tradeoff( models: CommunityModelDirectory, medium: MicomMediumFile, tradeoff_min: float = 0.1, tradeoff_max: float = 1.0, step: float = 0.1, threads: int = 1, ) -> pd.DataFrame: """Run tradeoff analysis.""" samples = models.manifest.view(pd.DataFrame).sample_id.unique() paths = {s: models.model_files.path_maker(model_id=s) for s in samples} if tradeoff_min >= tradeoff_max: raise ValueError( "`tradeoff_min` must be smaller than `tradeoff_max` :(") tradeoffs = np.arange(tradeoff_min, tradeoff_max + 1e-6, step) medium = process_medium(medium, samples) args = [[p, tradeoffs, medium.flux[medium.sample_id == s]] for s, p in paths.items()] results = workflow(_tradeoff, args, threads) results = pd.concat(results) return results
from micom.workflows import workflow micom.logger.file_logger("micom.log") max_procs = 16 taxonomy = pd.read_csv("species.csv").dropna(subset=["agora_id"]) taxonomy["file"] = taxonomy.agora_id.apply( lambda ids: ["agora/" + i + ".xml" for i in ids.split("|")]) taxonomy.name = taxonomy.name.replace(r"[^A-Za-z0-9_\s]", "", regex=True) taxonomy.name = taxonomy.name.replace(r"\s+", "_", regex=True) assert not taxonomy.name.str.contains(" ").any() taxonomy = taxonomy.rename(columns={ "id": "samples", "name": "id", "reads": "abundance" }) def build_and_save(args): s, tax = args filename = "models/" + s + ".pickle" if isfile(filename): return com = Community(tax, id=s, progress=False) com.to_pickle(filename) samples = taxonomy.samples.unique() args = [(s, taxonomy[taxonomy.samples == s]) for s in samples] workflow(build_and_save, args, max_procs)
def growth_rates(sam): com = load_pickle("data/models/" + sam + ".pickle") sol = com.optimize() rates = sol.members rates["tradeoff"] = np.nan rates["sample"] = sam df = [rates] # Get growth rates try: sol = com.cooperative_tradeoff(fraction=tradeoffs) except Exception as e: logger.warning("Sample %s could not be optimized\n %s" % (sam, str(e))) return pd.DataFrame( {"tradeoff": tradeoffs, "growth_rate": np.nan, "sample": sam} ) for i, s in enumerate(sol.solution): rates = s.members rates["tradeoff"] = sol.tradeoff[i] rates["sample"] = sam df.append(rates) df = pd.concat(df) return df samples = pd.read_csv("data/recent.csv") rates = workflow(growth_rates, samples.run_accession, max_procs) rates = pd.concat(rates) rates.to_csv("data/tradeoff.csv")
"""Calculate the elasticities for a set of built models.""" from os.path import isfile import micom from micom import load_pickle from micom.elasticity import elasticities from micom.workflows import workflow micom.logger.file_logger("micom.log") logger = micom.logger.logger try: max_procs = snakemake.threads except NameError: max_procs = 20 def elasticity_worker(sam): """Get the exchange elasticities for a sample.""" model_file = "data/models/" + sam + ".pickle" out_file = "data/elasticities_" + sam + ".csv" if isfile(out_file): return com = load_pickle(model_file) elast = elasticities(com, fraction=0.5) elast.to_csv(out_file, index=False) samples = ["ERR260275", "ERR260214", "ERR260174"] workflow(elasticity_worker, samples, max_procs)
"""Perform taxa knockouts.""" import pandas as pd import micom from micom import load_pickle from micom.media import minimal_medium from micom.workflows import workflow logger = micom.logger.logger logger.add("micom.log") try: max_procs = snakemake.threads except NameError: max_procs = 20 def knockout(sam): com = load_pickle("data/models/" + sam + ".pickle") ko = com.knockout_species(fraction=0.5) ko["sample"] = sam return ko samples = pd.read_csv("data/recent.csv") kos = workflow(knockout, samples.run_accession, max_procs) pd.concat(kos).to_csv("data/knockouts.csv")
lambda ids: ["data/agora/" + i for i in ids.split("|")] ) taxonomy["name"] = taxonomy.genus assert not taxonomy.name.str.contains(" ").any() taxonomy = taxonomy.rename(columns={"name": "id", "reads": "abundance"}) diet = pd.read_csv("data/western_diet.csv") diet.index = diet.reaction = diet.reaction.str.replace("_e", "_m") diet = diet.flux * diet.dilution def build_and_save(args): s, tax = args filename = "data/models/" + s + ".pickle" if isfile(filename): return com = Community(tax, id=s, progress=False) ex_ids = [r.id for r in com.exchanges] logger.info( "%d/%d import reactions found in model.", diet.index.isin(ex_ids).sum(), len(diet), ) com.medium = diet[diet.index.isin(ex_ids)] com.to_pickle(filename) samples = taxonomy.samples.unique() args = [(s, taxonomy[taxonomy.samples == s]) for s in samples] workflow(build_and_save, args, max_procs)
"""Calculate the elasticities for a set of built models.""" from os.path import isfile from micom import load_pickle from micom.elasticity import exchange_elasticities from micom.workflows import workflow max_procs = 24 def elasticities(sam): """Get the exchange elasticities for a sample.""" model_file = "models/" + sam + ".pickle" out_file = "intervention/" + sam + ".csv" if isfile(out_file): return com = load_pickle(model_file) elast = exchange_elasticities(com, fraction=0.5, progress=False) elast.to_csv(out_file, index=False) samples = ["ERR260275", "ERR260214", "ERR260174"] workflow(elasticities, samples, max_procs)