예제 #1
0
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
예제 #2
0
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)
예제 #3
0
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
예제 #4
0
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)
예제 #5
0
파일: tradeoff.py 프로젝트: micom-dev/paper
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")
예제 #6
0
"""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)
예제 #7
0
파일: knockouts.py 프로젝트: diegoibt/paper
"""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")
예제 #8
0
    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)
예제 #9
0
"""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)