SBML.org — the global portal for all things SBML

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.

Retrieved from "http://sbml.org/Community/Programs/validateSBML.py"

This page was last modified 15:30, 23 March 2009.



Please use our issue tracking system for any questions or suggestions about this website. This page was last modified 15:30, 23 March 2009.