From 3c887969793f584ff146fb82eadfc89ef4ee67e8 Mon Sep 17 00:00:00 2001 From: harveymannering Date: Thu, 30 Mar 2023 15:00:03 +0100 Subject: [PATCH 1/2] converted setNamesFromIds.cpp example into a python file --- Makefile.in | 1 + docs/src/libsbml-python-example-files.txt | 8 ++ examples/python/setNamesFromIds.py | 121 ++++++++++++++++++++++ src/bindings/python/CMakeLists.txt | 9 +- 4 files changed, 138 insertions(+), 1 deletion(-) create mode 100644 examples/python/setNamesFromIds.py 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..2b27e9080e 100644 --- a/src/bindings/python/CMakeLists.txt +++ b/src/bindings/python/CMakeLists.txt @@ -622,7 +622,14 @@ if(WITH_CHECK) ${CMAKE_SOURCE_DIR}/examples/sample-models/from-spec/level-3/enzymekinetics.xml setIdFromNames.out.xml ) - ADJUST_PYTHONPATH(test_python_setIdFromNames) + ADJUST_PYTHONPATH(test_python_setNamesFromIds) + + 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 From dee2acb49172c9f7f519f28a97e095b89158e9d5 Mon Sep 17 00:00:00 2001 From: harveymannering Date: Fri, 31 Mar 2023 10:34:38 +0100 Subject: [PATCH 2/2] fixed erroneous change in CMake file --- src/bindings/python/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bindings/python/CMakeLists.txt b/src/bindings/python/CMakeLists.txt index 2b27e9080e..352e56c0de 100644 --- a/src/bindings/python/CMakeLists.txt +++ b/src/bindings/python/CMakeLists.txt @@ -622,7 +622,7 @@ if(WITH_CHECK) ${CMAKE_SOURCE_DIR}/examples/sample-models/from-spec/level-3/enzymekinetics.xml setIdFromNames.out.xml ) - ADJUST_PYTHONPATH(test_python_setNamesFromIds) + ADJUST_PYTHONPATH(test_python_setIdFromNames) add_test(NAME test_python_setNamesFromIds COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_SOURCE_DIR}/examples/python/setNamesFromIds.py