Source code for cobra.io.mat

#This section is used to load the appropriate package for writing mat files
#from Python or Jython.  Currently, only the section for Python that depends
#on scipy has been written.
try:
    from numpy import array, object as np_object
    from scipy.io import loadmat, savemat
    from scipy.sparse import coo_matrix


except ImportError, e:
    raise e


# try to use an ordered dict
try:
    from scipy.version import short_version
    scipy_version = int(short_version.split(".")[1])
    # if scipy version is earlier than 0.11, OrderedDict will not work, so use dict
    if scipy_version < 11:
        dicttype = dict
    else:
        from collections import OrderedDict as dicttype
    del short_version, scipy_version
except ImportError:
    dicttype = dict



    


from .. import Model, Metabolite, Reaction, Formula


def _cell(x):
    """translate an array x into a MATLAB cell array"""
    return array(x, dtype=np_object)


[docs]def load_matlab_model(infile_path, variable_name=None): """Load a cobra model stored as a .mat file .. warning:: INCOMPLETE, does not load GPR's Parameters ---------- infile_path : str variable_name : str, optional The variable name of the model in the .mat file. If this is not specified, then the first MATLAB variable which looks like a COBRA model will be used """ data = loadmat(infile_path) if variable_name is not None: possible_names = [variable_name] else: # will try all of the variables in the dict possible_names = {} for key in data.keys(): possible_names[key] = None # skip meta variables to_remove = ["__globals__", "__header__", "__version__"] to_pop = [] for name in possible_names: if name in to_remove: to_pop.append(name) for i in to_pop: possible_names.pop(i) possible_names = possible_names.keys() for possible_name in possible_names: m = data[possible_name] # TODO: generalize if m.dtype.names is None: continue if not set(["rxns", "mets", "S", "lb", "ub"]) \ <= set(m.dtype.names): continue model = Model() model.id = m["description"][0, 0][0] model.description = model.id for i, name in enumerate(m["mets"][0, 0]): new_metabolite = Metabolite() new_metabolite.id = str(name[0][0]) try: new_metabolite.name = str(m["metNames"][0, 0][i][0][0]) new_metabolite.formula = Formula(str(m["metFormulas"][0][0][i][0][0])) except: pass model.add_metabolites([new_metabolite]) for i, name in enumerate(m["rxns"][0, 0]): new_reaction = Reaction() new_reaction.id = str(name[0][0]) new_reaction.lower_bound = float(m["lb"][0, 0][i][0]) new_reaction.upper_bound = float(m["ub"][0, 0][i][0]) new_reaction.objective_coefficient = float(m["c"][0, 0][i][0]) try: new_reaction.name = str(m["rxnNames"][0, 0][i][0][0]) except: pass model.add_reactions(new_reaction) coo = coo_matrix(m["S"][0, 0]) for i, j, v in zip(coo.row, coo.col, coo.data): model.reactions[j].add_metabolites({model.metabolites[i]: v}) # TODO finish adding GPR's return model # If code here is executed, then no model was found. raise Exception("no COBRA model found")
[docs]def save_matlab_model(model, file_name): """Save the cobra model as a .mat file. This .mat file can be used directly in the MATLAB version of COBRA. .. note:: This function works best with scipy 0.11b1 or later Parameters ---------- model : cobra.Model file_name : str or file-like object """ model = model.to_array_based_model() rxns = model.reactions mets = model.metabolites mat = dicttype() csense = "" for m in mets: csense += m._constraint_sense mat["mets"] = _cell(mets.list_attr("id")) mat["metNames"] = _cell(mets.list_attr("name")) mat["metFormulas"] = _cell([str(m.formula) for m in mets]) mat["genes"] = _cell(model.genes.list_attr("id")) mat["grRules"] = _cell(rxns.list_attr("gene_reaction_rule")) mat["rxns"] = _cell(rxns.list_attr("id")) mat["rxnNames"] = _cell(rxns.list_attr("name")) mat["subSystems"] = _cell(rxns.list_attr("subsystem")) mat["csense"] = csense mat["S"] = model.S mat["lb"] = array(rxns.list_attr("lower_bound")) mat["ub"] = array(rxns.list_attr("upper_bound")) mat["b"] = array(mets.list_attr("_bound")) mat["c"] = array(rxns.list_attr("objective_coefficient")) mat["rev"] = array(rxns.list_attr("reversibility")) mat["description"] = str(model.description) savemat(file_name, {str(model.description): mat}, appendmat=True, oned_as="column")