Source code for cameo.core.manipulation

# Copyright 2016 The Novo Nordisk Foundation Center for Biosustainability, DTU.

# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at

# http://www.apache.org/licenses/LICENSE-2.0

# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Manage manipulations such as swapping reaction cofactors, over-express or down-regulate genes and reactions.

"""

from cobra import Reaction


[docs]def increase_flux(reaction, ref_value, value): """ lb 0 ub |--------------------------- ' ---------------------------| <- - -|----------' '----------|- - - -> Parameters ---------- reaction: cobra.Reaction The reaction to over-express. ref_value: float The flux value to come from. value: float The flux value to achieve. """ if abs(value) < abs(ref_value): raise ValueError("'value' is lower than 'ref_value', this is increase_flux (%f < %f)" % (value, ref_value)) if value > 0: reaction.lower_bound = value elif value < 0: reaction.upper_bound = value else: reaction.knock_out()
[docs]def decrease_flux(reaction, ref_value, value): """ lb 0 ub |--------------------------- ' ---------------------------| |- - >----------' '----------<- - - -| Parameters ---------- reaction: cobra.Reaction The reaction to down_regulate. ref_value: float The flux value to come from. value: float The flux value to achieve. """ if abs(value) > abs(ref_value): raise ValueError("'value' is higher than 'ref_value', this is decrease_flux (%f < %f)" % (value, ref_value)) if value > 0: reaction.upper_bound = value elif value < 0: reaction.lower_bound = value else: reaction.knock_out()
[docs]def reverse_flux(reaction, ref_value, value): """ Forces a reaction to have a minimum flux level in the opposite direction of a reference state. lb 0 ub |--------------------------- ' ---------------------------| <----------'- - - - - - - -> Parameters ---------- reaction: cobra.Reaction The reaction that will be inverted. ref_value: float The flux value to come from. value: float The flux value to achieve. """ if (value >= 0) == (ref_value >= 0): raise ValueError("'value' and 'ref_value' cannot have the same sign (%.5f, %.5f)" % (value, ref_value)) if value > 0: reaction.upper_bound = value elif value < 0: reaction.lower_bound = value else: reaction.knock_out()
[docs]def swap_cofactors(reaction, model, swap_pairs, inplace=True): """ Swaps the cofactors of a reaction. For speed, it can be done inplace which just changes the coefficients. If not done inplace, it will create a new Reaction, add it to the model, and knockout the original reaction. Parameters ---------- reaction: cobra.Reaction The reaction to swap. model: cameo.cobra.Model A constraint-based model. swap_pairs: tuple A tuple of (cofactors, equivalent_cofactors) inplace: bool If replace is done inplace, it changes the coefficients in the matrix. Otherwise, it creates a new reaction with the other cofactors and adds it to the model. Returns ------- Reaction A reaction with swapped cofactors (the same if inplace). """ if all(reaction.metabolites.get(met, False) for met in swap_pairs[0]): new_coefficients = {met: -reaction.metabolites[met] for met in swap_pairs[0]} new_coefficients.update({new_met: reaction.metabolites[met] for met, new_met in zip(*swap_pairs)}) elif all(reaction.metabolites.get(met, False) for met in swap_pairs[1]): new_coefficients = {met: -reaction.metabolites[met] for met in swap_pairs[1]} new_coefficients.update({new_met: reaction.metabolites[met] for new_met, met in zip(*swap_pairs)}) else: raise ValueError("%s: Invalid swap pairs %s (%s)" % (reaction.id, str(swap_pairs), reaction.reaction)) def _inplace(rxn, stoichiometry): rxn.add_metabolites(stoichiometry, combine=True) def _replace(rxn, stoichiometry): new_reaction = Reaction(id="%s_swap" % rxn.id, name=rxn.name, lower_bound=rxn.lower_bound, upper_bound=rxn.upper_bound) new_reaction.stoichiometry = rxn new_reaction.add_metabolites(stoichiometry) return new_reaction if inplace: _inplace(reaction, new_coefficients) return reaction else: new_reaction = _replace(reaction, new_coefficients) model.add_reactions([new_reaction]) reaction.knock_out() return new_reaction