Skip to content

Commit

Permalink
Merge pull request #217 from jonls/sbml-compartment
Browse files Browse the repository at this point in the history
sbml: Parse compartment entries
  • Loading branch information
jonls committed Mar 3, 2017
2 parents 6cdb5ea + e050d89 commit b53e578
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 2 deletions.
2 changes: 1 addition & 1 deletion psamm/datasource/entry.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
# You should have received a copy of the GNU General Public License
# along with PSAMM. If not, see <http://www.gnu.org/licenses/>.
#
# Copyright 2016 Jon Lund Steffensen <jon_steffensen@uri.edu>
# Copyright 2016-2017 Jon Lund Steffensen <jon_steffensen@uri.edu>

"""Representation of compound/reaction entries in models."""

Expand Down
45 changes: 44 additions & 1 deletion psamm/datasource/sbml.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@

from .context import FileMark
from .entry import (CompoundEntry as BaseCompoundEntry,
ReactionEntry as BaseReactionEntry)
ReactionEntry as BaseReactionEntry,
CompartmentEntry as BaseCompartmentEntry)
from ..reaction import Reaction, Compound, Direction
from ..metabolicmodel import create_exchange_id
from ..expression.boolean import Expression, And, Or, Variable
Expand Down Expand Up @@ -385,6 +386,29 @@ def filemark(self):
return self._filemark


class CompartmentEntry(_SBMLEntry, BaseCompartmentEntry):
"""Compartment entry in the SBML file"""

def __init__(self, reader, root, filemark=None):
super(CompartmentEntry, self).__init__(reader, root)

self._name = self._root.get('name')
self._filemark = filemark

@property
def properties(self):
"""All compartment properties as a dict."""
properties = {'id': self._id}
if self._name is not None:
properties['name'] = self._name

return properties

@property
def filemark(self):
return self._filemark


class ObjectiveEntry(object):
"""Flux objective defined with FBC"""

Expand Down Expand Up @@ -582,6 +606,16 @@ def __init__(self, file, strict=False, ignore_boundary=False,
entry.reaction, [])
entries.append(entry)

# Compartments
self._model_compartments = {}
self._compartments = self._model.find(
self._sbml_tag('listOfCompartments'))
for compartment in self._compartments.iterfind(
self._sbml_tag('compartment')):
filemark = FileMark(self._context, None, None)
entry = CompartmentEntry(self, compartment, filemark=filemark)
self._model_compartments[entry.id] = entry

# Species
self._model_species = {}
self._species = self._model.find(self._sbml_tag('listOfSpecies'))
Expand Down Expand Up @@ -621,6 +655,10 @@ def __init__(self, file, strict=False, ignore_boundary=False,

self._active_objective = self._model_objectives[active]

def get_compartment(self, compartment_id):
"""Return :class:`.CompartmentEntry` corresponding to id."""
return self._model_compartments[compartment_id]

def get_reaction(self, reaction_id):
"""Return :class:`.ReactionEntry` corresponding to reaction_id"""
return self._model_reactions[reaction_id]
Expand All @@ -636,6 +674,11 @@ def get_objective(self, objective_id):
def get_active_objective(self):
return self._active_objective

@property
def compartments(self):
"""Iterator over :class:`.CompartmentEntry` entries."""
return itervalues(self._model_compartments)

@property
def reactions(self):
"""Iterator over :class:`ReactionEntries <.ReactionEntry>`"""
Expand Down
30 changes: 30 additions & 0 deletions psamm/tests/test_datasource_sbml.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,12 @@ def setUp(self):
def test_model_name(self):
self.assertEqual(self.reader.name, 'Test model')

def test_compartment_exists(self):
compartments = {entry.id: entry for entry in self.reader.compartments}
self.assertEqual(len(compartments), 1)
self.assertEqual(compartments['cell'].id, 'cell')
self.assertEqual(compartments['cell'].name, 'cell')

def test_compounds_exist(self):
species = {entry.id: entry for entry in self.reader.species}
self.assertEqual(len(species), 5)
Expand Down Expand Up @@ -189,6 +195,12 @@ def test_model_name(self):
self.assertEqual(self.reader.id, 'test_model')
self.assertEqual(self.reader.name, 'Test model')

def test_compartment_exists(self):
compartments = {entry.id: entry for entry in self.reader.compartments}
self.assertEqual(len(compartments), 1)
self.assertEqual(compartments['C_c'].id, 'C_c')
self.assertEqual(compartments['C_c'].name, 'cell')

def test_compounds_exist(self):
species = {entry.id: entry for entry in self.reader.species}
self.assertEqual(len(species), 5)
Expand Down Expand Up @@ -303,6 +315,12 @@ def test_model_name(self):
self.assertEqual(self.reader.id, 'test_model')
self.assertEqual(self.reader.name, 'Test model')

def test_compartment_exists(self):
compartments = {entry.id: entry for entry in self.reader.compartments}
self.assertEqual(len(compartments), 1)
self.assertEqual(compartments['C_c'].id, 'C_c')
self.assertEqual(compartments['C_c'].name, 'cell')

def test_compounds_exist(self):
species = {entry.id: entry for entry in self.reader.species}
self.assertEqual(len(species), 5)
Expand Down Expand Up @@ -429,6 +447,12 @@ def test_model_name(self):
self.assertEqual(self.reader.id, 'test_model')
self.assertEqual(self.reader.name, 'Test model')

def test_compartment_exists(self):
compartments = {entry.id: entry for entry in self.reader.compartments}
self.assertEqual(len(compartments), 1)
self.assertEqual(compartments['C_c'].id, 'C_c')
self.assertEqual(compartments['C_c'].name, 'cell')

def test_compounds_exist(self):
species = {entry.id: entry for entry in self.reader.species}
self.assertEqual(len(species), 5)
Expand Down Expand Up @@ -583,6 +607,12 @@ def test_model_name(self):
self.assertEqual(self.reader.id, 'test_model')
self.assertEqual(self.reader.name, 'Test model')

def test_compartment_exists(self):
compartments = {entry.id: entry for entry in self.reader.compartments}
self.assertEqual(len(compartments), 1)
self.assertEqual(compartments['C_c'].id, 'C_c')
self.assertEqual(compartments['C_c'].name, 'cell')

def test_compounds_exist(self):
species = {entry.id: entry for entry in self.reader.species}
self.assertEqual(len(species), 5)
Expand Down

0 comments on commit b53e578

Please sign in to comment.