def find_gene_knockout_reactions_fast(cobra_model, gene_list): compiled_rules = delete.get_compiled_gene_reaction_rules( cobra_model) return find_gene_knockout_reactions( cobra_model, gene_list, compiled_gene_reaction_rules=compiled_rules)
def escape_ID(cobra_model): """makes all ids SBML compliant""" for x in chain([cobra_model], cobra_model.metabolites, cobra_model.reactions, cobra_model.genes): x.id = _escape_str_id(x.id) cobra_model.repair() gene_renamer = _GeneEscaper() for rxn, rule in get_compiled_gene_reaction_rules(cobra_model).items(): if rule is not None: rxn._gene_reaction_rule = ast2str(gene_renamer.visit(rule))
def escape_ID(cobra_model): """makes all ids SBML compliant""" for x in chain([cobra_model], cobra_model.metabolites, cobra_model.reactions, cobra_model.genes): x.id = _escape_str_id(x.id) cobra_model.repair() gene_renamer = _GeneEscaper() for rxn, rule in iteritems(get_compiled_gene_reaction_rules(cobra_model)): if rule is not None: rxn._gene_reaction_rule = ast2str(gene_renamer.visit(rule))
def rename_genes(cobra_model, rename_dict): """renames genes in a model from the rename_dict""" recompute_reactions = set() # need to recomptue related genes remove_genes = [] for old_name, new_name in rename_dict.items(): # undefined if there a value matches a different key # because dict is unordered try: gene_index = cobra_model.genes.index(old_name) except ValueError: gene_index = None old_gene_present = gene_index is not None new_gene_present = new_name in cobra_model.genes if old_gene_present and new_gene_present: old_gene = cobra_model.genes.get_by_id(old_name) # Added in case not renaming some genes: if old_gene is not cobra_model.genes.get_by_id(new_name): remove_genes.append(old_gene) recompute_reactions.update(old_gene._reaction) elif old_gene_present and not new_gene_present: # rename old gene to new gene gene = cobra_model.genes[gene_index] # trick DictList into updating index cobra_model.genes._dict.pop(gene.id) # ugh gene.id = new_name cobra_model.genes[gene_index] = gene elif not old_gene_present and new_gene_present: pass else: # if not old gene_present and not new_gene_present # the new gene's _model will be set by repair # This would add genes from rename_dict # that are not associated with a rxn # cobra_model.genes.append(Gene(new_name)) pass cobra_model.repair() class Renamer(NodeTransformer): def visit_Name(self, node): node.id = rename_dict.get(node.id, node.id) return node gene_renamer = Renamer() for rxn, rule in get_compiled_gene_reaction_rules(cobra_model).items(): if rule is not None: rxn._gene_reaction_rule = ast2str(gene_renamer.visit(rule)) for rxn in recompute_reactions: rxn.gene_reaction_rule = rxn._gene_reaction_rule for i in remove_genes: cobra_model.genes.remove(i)
def rename_genes(cobra_model, rename_dict): """renames genes in a model from the rename_dict""" recompute_reactions = set() # need to recomptue related genes remove_genes = [] for old_name, new_name in iteritems(rename_dict): # undefined if there a value matches a different key # because dict is unordered try: gene_index = cobra_model.genes.index(old_name) except ValueError: gene_index = None old_gene_present = gene_index is not None new_gene_present = new_name in cobra_model.genes if old_gene_present and new_gene_present: old_gene = cobra_model.genes.get_by_id(old_name) remove_genes.append(old_gene) recompute_reactions.update(old_gene._reaction) elif old_gene_present and not new_gene_present: # rename old gene to new gene gene = cobra_model.genes[gene_index] # trick DictList into updating index cobra_model.genes._dict.pop(gene.id) # ugh gene.id = new_name cobra_model.genes[gene_index] = gene elif not old_gene_present and new_gene_present: pass else: # not old gene_present and not new_gene_present # the new gene's _model will be set by repair cobra_model.genes.append(Gene(new_name)) cobra_model.repair() class Renamer(NodeTransformer): def visit_Name(self, node): node.id = rename_dict.get(node.id, node.id) return node gene_renamer = Renamer() for rxn, rule in iteritems(get_compiled_gene_reaction_rules(cobra_model)): if rule is not None: rxn._gene_reaction_rule = ast2str(gene_renamer.visit(rule)) for rxn in recompute_reactions: rxn.gene_reaction_rule = rxn._gene_reaction_rule for i in remove_genes: cobra_model.genes.remove(i)
def _double_gene_deletion_moma(cobra_model, gene_ids1, gene_ids2, gene_id_to_result, solver, number_of_processes=1, zero_cutoff=1e-12, wt_growth_rate=None, no_flux_reaction_indexes=set(), **kwargs): """compute double gene deletions using moma cobra_model: model gene_ids1, gene_ids2: lists of id's to be knocked out gene_id_to_result: maps each gene identifier to the entry in the result matrix number_of_processes: must be 1. Parallel MOMA not yet implemented no_flux_reaction_indexes: set of indexes for reactions in the model which carry no flux in an optimal solution. For deletions only in this set, the result will beset to wt_growth_rate. returns an upper triangular square matrix """ if number_of_processes > 1: raise NotImplementedError("parallel MOMA not implemented") if moma is None: raise RuntimeError("scipy required for MOMA") # Because each gene reaction rule will be evaluated multiple times # the reaction has multiple associated genes being deleted, compiling # the gene reaction rules ahead of time increases efficiency greatly. compiled_rules = get_compiled_gene_reaction_rules(cobra_model) # function to compute reaction knockouts with moma moma_model, moma_obj = moma.create_euclidian_moma_model(cobra_model) def run(gene_ids): ko_reactions = find_gene_knockout_reactions(cobra_model, gene_ids) ko_indexes = map(cobra_model.reactions.index, ko_reactions) # If all the reactions carry no flux, deletion will have no effect. if no_flux_reaction_indexes.issuperset(gene_ids): return wt_growth_rate return moma.moma_knockout(moma_model, moma_obj, ko_indexes, solver=solver, **kwargs).f n_results = len(gene_id_to_result) results = numpy.empty((n_results, n_results)) results.fill(numpy.nan) # precompute all single deletions and store them along the diagonal for gene_id, result_index in iteritems(gene_id_to_result): value = run((gene_id, )) value = value if abs(value) > zero_cutoff else 0. results[result_index, result_index] = value # If singly lethal, the entire row and column are set to 0. if value == 0.: results[result_index, :] = 0. results[:, result_index] = 0. # Run double knockouts in the upper triangle index_selector = yield_upper_tria_indexes(gene_ids1, gene_ids2, gene_id_to_result) for result_index, (gene1, gene2) in index_selector: # if singly lethal the results have already been set if results[result_index] == 0: continue results[result_index] = run((gene1, gene2)) return results
def _double_gene_deletion_fba(cobra_model, gene_ids1, gene_ids2, gene_id_to_result, solver, number_of_processes=None, zero_cutoff=1e-12, wt_growth_rate=None, no_flux_reaction_indexes=set(), **kwargs): """compute double gene deletions using fba cobra_model: model gene_ids1, gene_ids2: lists of id's to be knocked out gene_id_to_result: maps each gene identifier to the entry in the result matrix no_flux_reaction_indexes: set of indexes for reactions in the model which carry no flux in an optimal solution. For deletions only in this set, the result will beset to wt_growth_rate. returns an upper triangular square matrix """ # Because each gene reaction rule will be evaluated multiple times # the reaction has multiple associated genes being deleted, compiling # the gene reaction rules ahead of time increases efficiency greatly. compiled_rules = get_compiled_gene_reaction_rules(cobra_model) n_results = len(gene_id_to_result) results = numpy.empty((n_results, n_results)) results.fill(numpy.nan) if number_of_processes == 1: # explicitly disable multiprocessing PoolClass = CobraDeletionMockPool else: PoolClass = CobraDeletionPool with PoolClass(cobra_model, n_processes=number_of_processes, solver=solver, **kwargs) as pool: # precompute all single deletions in the pool and store them along # the diagonal for gene_id, gene_result_index in iteritems(gene_id_to_result): ko_reactions = find_gene_knockout_reactions( cobra_model, (cobra_model.genes.get_by_id(gene_id), )) ko_indexes = [cobra_model.reactions.index(i) for i in ko_reactions] pool.submit(ko_indexes, label=gene_result_index) for result_index, value in pool.receive_all(): # if singly lethal, set everything in row and column to 0 value = value if abs(value) > zero_cutoff else 0. if value == 0.: results[result_index, :] = 0. results[:, result_index] = 0. else: # only the diagonal needs to be set results[result_index, result_index] = value # Run double knockouts in the upper triangle index_selector = yield_upper_tria_indexes(gene_ids1, gene_ids2, gene_id_to_result) for result_index, (gene1, gene2) in index_selector: # if singly lethal the results have already been set if results[result_index] == 0: continue ko_reactions = find_gene_knockout_reactions( cobra_model, (gene1, gene2), compiled_rules) ko_indexes = [cobra_model.reactions.index(i) for i in ko_reactions] # if all removed gene indexes carry no flux if len(set(ko_indexes) - no_flux_reaction_indexes) == 0: results[result_index] = wt_growth_rate continue pool.submit(ko_indexes, label=result_index) for result in pool.receive_all(): value = result[1] if value < zero_cutoff: value = 0 results[result[0]] = value return results