diff --git a/Makefile.in b/Makefile.in index 95c2c3ba41..67ee39d0e2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -290,6 +290,7 @@ examples = \ examples/python/renameSId.py \ examples/python/stringInput.py \ examples/python/setIdFromNames.py \ + examples/python/setNamesFromIds.py \ examples/python/translateMath.py \ examples/python/unsetAnnotation.py \ examples/python/unsetNotes.py \ diff --git a/docs/src/libsbml-python-example-files.txt b/docs/src/libsbml-python-example-files.txt index 9bbee5d196..b542c50a24 100644 --- a/docs/src/libsbml-python-example-files.txt +++ b/docs/src/libsbml-python-example-files.txt @@ -85,6 +85,10 @@ Promote all local parameters in the model to global parameters. Program that renames all SIds that also have names specified. The new identifiers will be derived from the name, with all invalid characters removed. +@li @ref setNamesFromId.py "setNamesFromId.py": +Program that changes all objects' "name" attribute values to match +their "id" attribute values. + @li @ref stripPackage.py "stripPackage.py": Strips the given SBML Level 3 package from the given SBML file. @@ -302,6 +306,10 @@ An example of creating a model using SBML Level 3 Qualitative Models. @example createSimpleModel.py An example of creating a simple SBML Level 3 model. +@example setNamesFromIds.py +Program that changes all objects' "name" attribute values to match +their "id" attribute values. + */ diff --git a/examples/python/setNamesFromIds.py b/examples/python/setNamesFromIds.py new file mode 100644 index 0000000000..3c97859c00 --- /dev/null +++ b/examples/python/setNamesFromIds.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python3 +## +## @file setNamesFromIds.py +## @brief Utility program, renaming all Names to match their ids. +## +## @author Frank T. Bergmann +## +## +## +## +## + +import sys +import os.path +import time +import libsbml + +# This class implements an identifier transformer, that means it can be used +# to rename all sbase elements. +class SetNamesFromId(libsbml.IdentifierTransformer): + def __init__(self): + # call the constructor of the base class + libsbml.IdentifierTransformer.__init__(self) + + # The function actually doing the transforming. This function is called + # once for each SBase element in the model. + def transform(self, element): + # return in case we don't have a valid element + if element is None or element.getTypeCode() == libsbml.SBML_LOCAL_PARAMETER: + return libsbml.LIBSBML_OPERATION_SUCCESS + + # or if there is nothing to do + if element.isSetId() == False or element.getId() == element.getName(): + return libsbml.LIBSBML_OPERATION_SUCCESS + + # set it + element.setName(element.getId()) + + return libsbml.LIBSBML_OPERATION_SUCCESS + +def main (args): + """Usage: setNamesFromIds filename output + """ + if len(args) != 3: + print(main.__doc__) + sys.exit(1) + + filename = args[1] + output = args[2] + + # read the document + start = time.time() * 1000 + document = libsbml.readSBMLFromFile(filename) + stop = time.time() * 1000 + + print ("") + print (" filename: {0}".format( filename)) + print (" read time (ms): {0}".format( stop - start)) + + # stop in case of serious errors + errors = document.getNumErrors(libsbml.LIBSBML_SEV_ERROR) + if errors > 0: + print (" error(s): {0}".format(errors)) + document.printErrors() + sys.exit (errors) + + # get a list of all elements, as we will need to know all identifiers + allElements = document.getListOfAllElements() + + # create the transformer + trans = SetNamesFromId() + + # rename the identifiers (using the elements we already gathered before) + start = time.time() * 1000 + document.getModel().renameIDs(allElements, trans) + stop = time.time() * 1000 + print (" rename time (ms): {0}".format(stop - start)) + + # write to file + start = time.time() * 1000 + libsbml.writeSBMLToFile(document, output) + stop = time.time() * 1000 + print (" write time (ms): {0}".format(stop - start)) + print ("") + + # if we got here all went well ... + +if __name__ == '__main__': + main(sys.argv) diff --git a/src/bindings/python/CMakeLists.txt b/src/bindings/python/CMakeLists.txt index 07a1add012..352e56c0de 100644 --- a/src/bindings/python/CMakeLists.txt +++ b/src/bindings/python/CMakeLists.txt @@ -623,6 +623,13 @@ if(WITH_CHECK) setIdFromNames.out.xml ) ADJUST_PYTHONPATH(test_python_setIdFromNames) + + add_test(NAME test_python_setNamesFromIds + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/examples/python/setNamesFromIds.py + ${CMAKE_SOURCE_DIR}/examples/sample-models/from-spec/level-3/enzymekinetics.xml + setNamesFromIds.out.xml + ) + ADJUST_PYTHONPATH(test_python_setNamesFromIds) add_test(NAME test_python_unsetAnnotation COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/examples/python/unsetAnnotation.py