|
| 1 | + |
| 2 | + |
| 3 | +def leak_test(ensemble,metabolites_to_test=[],\ |
| 4 | + exchange_prefix='EX_',verbose=False,num_models=[],**kwargs): |
| 5 | + ''' |
| 6 | + Checks for leaky metabolites in every member of the ensemble by opening |
| 7 | + and optimizing a demand reaction while all exchange reactions are closed. |
| 8 | +
|
| 9 | + By default, checks for leaks for every metabolite for all models. |
| 10 | + ''' |
| 11 | + |
| 12 | + if not num_models: |
| 13 | + # if the number of models wasn't specified, test all |
| 14 | + num_models = len(self.reaction_diffs.keys()) |
| 15 | + |
| 16 | + if not metabolites_to_test: |
| 17 | + metabolites_to_test = [met for met in self.base_model.metabolites] |
| 18 | + |
| 19 | + old_objective = ensemble.base_model.objective |
| 20 | + dm_rxns = [] |
| 21 | + for met in metabolites_to_test: |
| 22 | + rxn = cobra.Reaction(id='leak_DM_' + met.id) |
| 23 | + rxn.lower_bound = 0.0 |
| 24 | + rxn.upper_bound = 0.0 |
| 25 | + rxn.add_metabolites({met:-1}) |
| 26 | + dm_rxns.append(rxn) |
| 27 | + ensemble.base_model.add_reactions(dm_rxns) |
| 28 | + ensemble.base_model.repair() |
| 29 | + |
| 30 | + leaks = {} |
| 31 | + |
| 32 | + for rxn in dm_rxns: |
| 33 | + rxn.upper_bound = 1000.0 |
| 34 | + ensemble.base_model.objective = ensemble.base_model.reactions.get_by_id(rxn.id) |
| 35 | + |
| 36 | + if verbose: |
| 37 | + print('checking leak for ' + rxn.id) |
| 38 | + solutions = ensemble.optimize_ensemble(return_flux=[rxn.id],num_models=num_models,**kwargs) |
| 39 | + leaks[rxn.id.split('_DM_')[1]] = {} |
| 40 | + for model in solutions.keys(): |
| 41 | + leaks[rxn.id.split('_DM_')[1]][model] = solutions[model][rxn.id] > 0.0001 |
| 42 | + #rxn.objective_coefficient = 0.0 |
| 43 | + rxn.upper_bound = 0.0 |
| 44 | + |
| 45 | + # remove the demand reactions and restore the original objective |
| 46 | + ensemble.base_model.remove_reactions(dm_rxns,remove_orphans=True) |
| 47 | + ensemble.base_model.repair() |
| 48 | + ensemble.base_model.objective = old_objective |
| 49 | + |
| 50 | + return leaks |
0 commit comments