def save_sbml_model(model, filename, flavor=None): """ Save a model to an SBML file. Arguments: model (Model): model filename (str): file path flavor (str): adapt to different modeling conventions (optional, currently available: 'cobra', 'fbc2') """ document = SBMLDocument(DEFAULT_SBML_LEVEL, DEFAULT_SBML_VERSION) sbml_model = document.createModel(model.id) if flavor in {Flavor.BIGG, Flavor.FBC2}: document.enablePackage(FbcExtension.getXmlnsL3V1V2(), 'fbc', True) fbc_model = sbml_model.getPlugin('fbc') fbc_model.setStrict(True) document.setPackageRequired('fbc', False) _save_compartments(model, sbml_model) _save_metabolites(model, sbml_model, flavor) _save_reactions(model, sbml_model) if isinstance(model, CBModel): _save_cb_parameters(model, sbml_model, flavor) _save_gpr_associations(model, sbml_model, flavor) if isinstance(model, ODEModel): _save_concentrations(model, sbml_model) _save_global_parameters(model, sbml_model) _save_kineticlaws(model, sbml_model) _save_assignment_rules(model, sbml_model) _save_metadata(model, sbml_model) writer = SBMLWriter() writer.writeSBML(document, filename)
def flatten_external_model_definitions( doc: libsbml.SBMLDocument, validate: bool = False) -> libsbml.SBMLDocument: """Converts all ExternalModelDefinitions to ModelDefinitions. I.e. the definition of models in external files are read and directly included in the top model. The resulting comp model consists than only of a single file. The model refs in the submodel do not change in the process, so no need to update the submodels. :param doc: SBMLDocument :param validate: validation flag :return: SBMLDocument with ExternalModelDefinitions replaced """ logger.debug("* flattenExternalModelDefinitions") # FIXME: handle multiple levels of hierarchies. Recursively to handle the ExternalModelDefinitions of submodels logger.warning( "flattenExternalModelDefinitions is experimental and does not work recursively!" ) comp_doc = doc.getPlugin("comp") if comp_doc is None: logger.warning( "Model is not a comp model, no ExternalModelDefinitions") return doc emd_list = comp_doc.getListOfExternalModelDefinitions() if (emd_list is None) or (len(emd_list) == 0): # no ExternalModelDefinitions logger.warning("Model does not contain any ExternalModelDefinitions") return doc else: emd_ids = [] for emd in emd_list: logger.debug(emd) emd_ids.append(emd.getId()) # get the model definition from the model ref_model = emd.getReferencedModel() ref_doc = ref_model.getSBMLDocument() # print(ref_model) for k in range(ref_doc.getNumPlugins()): plugin = ref_doc.getPlugin(k) # print(k, plugin) # enable the package on the main SBMLDocument uri = plugin.getURI() prefix = plugin.getPrefix() doc.enablePackage(uri, prefix, True) # print("\n") # add model definition for model md = libsbml.ModelDefinition(ref_model) comp_doc.addModelDefinition(md) # remove the emds afterwards for emd_id in emd_ids: # remove the emd from the model comp_doc.removeExternalModelDefinition(emd_id) # validate if validate: validate_doc(doc) return doc