validateSBML.py
|
| validateSBML.py Language: Python |
| Summary | Example program that uses libSBML to check the validity of an SBML file |
| Author(s) | Akiya Jouraku, Ben Bornstein, Mike Hucka |
| Version | 8854 (15 Jan. 2009) |
| Needs | libSBML version 3+ |
| Source | This page |
Description
This is a simple program that uses libSBML to read SBML files, run validation on them, and report the results. The arguments provided on the command line should be paths to files in SBML format. Optionally, the first argument can be the flag -u to indicate that checking of units of measurement should be skipped. The default (i.e., without -u) is to check units.
This program comes from the libSBML distribution. It is provided here as an example of how to use SBML.org's Community Programs area for scripts displayed in-line on a web page. The original source to this program is in the libSBML SVN repository.
Code
#!/usr/bin/env python
##
## @file validateSBML.py
## @brief Validates one or more SBML files
## @author Akiya Jouraku (translated from libSBML C++ examples)
## @author Ben Bornstein
## @author Michael Hucka
##
## $Id: validateSBML.py 8854 2009-01-15 20:42:00Z ajouraku $
##
## This file is part of libSBML. Please visit http://sbml.org for more
## information about SBML, and the latest version of libSBML.
##
import sys
import os.path
import time
import libsbml
class validateSBML:
def __init__(self, ucheck):
self.reader = libsbml.SBMLReader()
self.ucheck = ucheck
self.numinvalid = 0
def validate(self, file):
if not os.path.exists(file):
print "[Error] %s : No such file." % (infile)
self.numinvalid += 1
return
start = time.time()
sbmlDoc = libsbml.readSBML(file)
stop = time.time()
timeRead = (stop - start)*1000
errors = sbmlDoc.getNumErrors()
seriousErrors = False
numReadErr = 0
numReadWarn = 0
errMsgRead = ""
if errors > 0:
for i in range(errors):
severity = sbmlDoc.getError(i).getSeverity()
if (severity == libsbml.LIBSBML_SEV_ERROR) or (severity == libsbml.LIBSBML_SEV_FATAL):
seriousErrors = True
numReadErr += 1
else:
numReadWarn += 1
oss = libsbml.ostringstream()
sbmlDoc.printErrors(oss)
errMsgRead = oss.str()
# If serious errors are encountered while reading an SBML document, it
# does not make sense to go on and do full consistency checking because
# the model may be nonsense in the first place.
numCCErr = 0
numCCWarn = 0
errMsgCC = ""
skipCC = False;
timeCC = 0.0
if seriousErrors:
skipCC = True;
errMsgRead += "Further consistency checking and validation aborted."
self.numinvalid += 1;
else:
sbmlDoc.setConsistencyChecks(libsbml.LIBSBML_CAT_UNITS_CONSISTENCY, self.ucheck)
start = time.time()
failures = sbmlDoc.checkConsistency()
stop = time.time()
timeCC = (stop - start)*1000
if failures > 0:
isinvalid = False;
for i in range(failures):
severity = sbmlDoc.getError(i).getSeverity()
if (severity == libsbml.LIBSBML_SEV_ERROR) or (severity == libsbml.LIBSBML_SEV_FATAL):
numCCErr += 1
isinvalid = True;
else:
numCCWarn += 1
if isinvalid:
self.numinvalid += 1;
oss = libsbml.ostringstream()
sbmlDoc.printErrors(oss)
errMsgCC = oss.str()
#
# print results
#
print " filename : %s" % (file)
print " file size (byte) : %d" % (os.path.getsize(file))
print " read time (ms) : %f" % (timeRead)
if not skipCC :
print " c-check time (ms) : %f" % (timeCC)
else:
print " c-check time (ms) : skipped"
print " validation error(s) : %d" % (numReadErr + numCCErr)
if not skipCC :
print " (consistency error(s)): %d" % (numCCErr)
else:
print " (consistency error(s)): skipped"
print " validation warning(s) : %d" % (numReadWarn + numCCWarn)
if not skipCC :
print " (consistency warning(s)): %d" % (numCCWarn)
else:
print " (consistency warning(s)): skipped"
if errMsgRead or errMsgCC:
print
print "===== validation error/warning messages =====\n"
if errMsgRead :
print errMsgRead
if errMsgCC :
print "*** consistency check ***\n"
print errMsgCC
def main (args):
"""usage: validateSBML.py [-u] inputfile1 [inputfile2 ...]
-u skips unit consistency check
"""
if len(args) < 2:
print main.__doc__
sys.exit(1)
elif (len(args) == 1) and (args[1] == "-u"):
print main.__doc__
sys.exit(1)
enableUnitCCheck = True
if args[1] == "-u":
enableUnitCCheck = False
validator = validateSBML(enableUnitCCheck)
fnum = 0
for i in range(1,len(args)):
if args[i] == "-u":
continue
print "---------------------------------------------------------------------------"
validator.validate(args[i])
fnum += 1
numinvalid = validator.numinvalid
print "---------------------------------------------------------------------------"
print "Validated %d files, %d valid files, %d invalid files" % (fnum, fnum - numinvalid, numinvalid)
if not enableUnitCCheck:
print "(Unit consistency checks skipped)"
if numinvalid > 0:
sys.exit(1)
if __name__ == '__main__':
main(sys.argv)
Usage
Save the script to a file named "validate.py" on your computer, make the script executable, and then invoke it on the command line:
validateSBML.py /path/to/file1.xml /path/to/file2.xml /path/to/file3.xml ...
or
validateSBML.py -u /path/to/file1.xml /path/to/file2.xml /path/to/file3.xml ...
The second form causes the program to skip verification of units in the SBML models.
Known problems/issues
None.
Licensing terms and distribution
This software is released under the terms of the LGPL.


