Source code for cobra.core.summary.metabolite_summary
# -*- coding: utf-8 -*-
"""Define the MetaboliteSummary class."""
from __future__ import absolute_import, division
from operator import attrgetter
import pandas as pd
from cobra.core import get_solution
from cobra.core.summary import Summary
from cobra.flux_analysis.variability import flux_variability_analysis
[docs]class MetaboliteSummary(Summary):
"""
Define the metabolite summary.
Attributes
----------
metabolite: cobra.Metabolite
The metabolite to summarize.
See Also
--------
Summary : Parent that defines further attributes.
ReactionSummary
ModelSummary
"""
def __init__(self, metabolite, model, **kwargs):
"""
Initialize a metabolite summary.
Parameters
----------
metabolite: cobra.Metabolite
The metabolite object whose summary we intend to get.
model : cobra.Model
The metabolic model for which to generate a metabolite summary.
Other Parameters
----------------
kwargs :
Further keyword arguments are passed on to the parent class.
See Also
--------
Summary : Parent that has further default parameters.
ReactionSummary
ModelSummary
"""
super(MetaboliteSummary, self).__init__(model=model, **kwargs)
self.metabolite = metabolite
[docs] def _generate(self):
"""
Returns
-------
flux_summary: pandas.DataFrame
The DataFrame of flux summary data.
"""
if self.names:
emit = attrgetter('name')
else:
emit = attrgetter('id')
if self.solution is None:
self.metabolite.model.slim_optimize(error_value=None)
self.solution = get_solution(self.metabolite.model,
reactions=self.metabolite.reactions)
rxns = sorted(self.metabolite.reactions, key=attrgetter('id'))
data = [
(
emit(rxn),
self.solution[rxn.id] * rxn.metabolites[self.metabolite],
rxn.build_reaction_string(use_metabolite_names=self.names),
rxn
) for rxn in rxns
]
flux_summary = pd.DataFrame.from_records(
data=data,
index=[rxn.id for rxn in rxns],
columns=['id', 'flux', 'reaction_string', 'reaction']
)
assert flux_summary['flux'].sum() < self.metabolite.model.tolerance, \
'Error in flux balance'
if self.fva is not None:
if hasattr(self.fva, 'columns'):
fva_results = self.fva
else:
fva_results = flux_variability_analysis(
self.metabolite.model, list(self.metabolite.reactions),
fraction_of_optimum=self.fva)
flux_summary = pd.concat([flux_summary, fva_results],
axis=1, sort=False)
flux_summary.rename(columns={'maximum': 'fmax', 'minimum': 'fmin'},
inplace=True)
def set_min_and_max(row):
"""Scale and set proper min and max values for flux."""
fmax = row.reaction.metabolites[self.metabolite] * row.fmax
fmin = row.reaction.metabolites[self.metabolite] * row.fmin
if abs(fmin) <= abs(fmax):
row.fmax = fmax
row.fmin = fmin
else:
# Reverse fluxes
row.fmax = fmin
row.fmin = fmax
return row
flux_summary = flux_summary.apply(set_min_and_max, axis=1)
flux_summary = self._process_flux_dataframe(flux_summary)
total_flux = flux_summary.loc[flux_summary.is_input, 'flux'].sum()
# Calculate flux percentage
flux_summary['percent'] = (flux_summary['flux'] / total_flux) * 100
return flux_summary
[docs] def to_frame(self):
"""
Returns
-------
A pandas.DataFrame of the summary.
"""
flux_df = self._generate()
flux_df['is_input'] = flux_df['is_input']\
.apply(lambda x: 'PRODUCING' if x is True else 'CONSUMING')
flux_df.columns = [col.upper() for col in flux_df.columns]
if self.fva is not None:
flux_df.rename(columns={'IS_INPUT': 'RXN_STAT',
'FMIN': 'FLUX_MIN',
'FMAX': 'FLUX_MAX'}, inplace=True)
flux_df = flux_df[['RXN_STAT', 'ID', 'PERCENT', 'FLUX', 'FLUX_MIN',
'FLUX_MAX', 'REACTION_STRING']]
else:
flux_df.rename(columns={'IS_INPUT': 'RXN_STAT'}, inplace=True)
flux_df = flux_df[['RXN_STAT', 'ID', 'PERCENT', 'FLUX',
'REACTION_STRING']]
flux_df.set_index(['RXN_STAT', 'ID'], inplace=True)
return flux_df
[docs] def _to_table(self):
"""
Returns
-------
A string of the summary table.
"""
return self.to_frame().to_string(header=True, index=True, na_rep='',
float_format=self.float_format,
sparsify=True, justify='center')