Skip to content

Commit 920aef0

Browse files
authored
Merge pull request #53 from robertvi/test_xml3
added simple sbml test with example xml
2 parents 04fe4cd + 2b92351 commit 920aef0

File tree

5 files changed

+533
-0
lines changed

5 files changed

+533
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<sbml xmlns="http://www.sbml.org/sbml/level3/version1/core" level="3" version="1">
3+
<model substanceUnits="mole" timeUnits="second" extentUnits="mole">
4+
<listOfUnitDefinitions>
5+
<unitDefinition id="per_second">
6+
<listOfUnits>
7+
<unit kind="second" exponent="-1" scale="0" multiplier="1"/>
8+
</listOfUnits>
9+
</unitDefinition>
10+
</listOfUnitDefinitions>
11+
</model>
12+
</sbml>

examples/sbml/sbml32spec.py

Lines changed: 379 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,379 @@
1+
#!/usr/bin/env python3
2+
3+
'''
4+
initial attempt at creating an SBML API using modelspec
5+
https://github.com/combine-org/compbiolibs/issues/28
6+
7+
based on sbml.level-3.version-2.core.release-2.pdf
8+
'''
9+
10+
import modelspec
11+
from modelspec import field, instance_of, optional
12+
from modelspec.base_types import Base
13+
from typing import List
14+
15+
from sbml_validators import *
16+
17+
@modelspec.define
18+
class Notes(Base):
19+
'''
20+
XHTML field of SBase
21+
22+
Args:
23+
xmlns: str fixed "http://www.w3.org/1999/xhtml"
24+
content: str valid XHTML
25+
'''
26+
xmlns: str = field(default="http://www.w3.org/1999/xhtml",validator=[instance_of(str),xmlns_notes])
27+
content: str = field(default=None,validator=optional([instance_of(str),valid_xhtml]))
28+
29+
@modelspec.define
30+
class Math(Base):
31+
'''
32+
Subset of MathML 2.0 used to define all formulae in SBML
33+
'''
34+
xmlns: str = field(default="http://www.w3.org/1998/Math/MathML",validator=[instance_of(str),xmlns_math])
35+
content: str = field(default=None,validator=optional([instance_of(str),valid_mathml]))
36+
37+
@modelspec.define
38+
class SBase(Base):
39+
"""
40+
Abstract base class for all SBML objects
41+
42+
Args:
43+
sid: SId optional
44+
name: string optional
45+
metaid: XML ID optional
46+
sboTerm: SBOTerm optional
47+
48+
notes: XHTML 1.0 optional
49+
annotation: XML content optional
50+
"""
51+
52+
sid: str = field(default=None,validator=optional([instance_of(str),valid_sid]))
53+
name: str = field(default=None,validator=optional(instance_of(str)))
54+
metaid: str = field(default=None,validator=optional([instance_of(str),valid_xml_id]))
55+
sboTerm: str = field(default=None,validator=optional([instance_of(str),valid_sbo]))
56+
57+
notes: Notes = field(default=None,validator=optional(instance_of(Notes)))
58+
annotation: str = field(default=None,validator=optional([instance_of(str),valid_xml_content]))
59+
60+
@modelspec.define
61+
class Trigger(SBase):
62+
initialValue: bool = field(default=None,validator=instance_of(bool))
63+
persistent: bool = field(default=None,validator=instance_of(bool))
64+
math: str = field(default=None,validator=optional(instance_of(str)))
65+
66+
@modelspec.define
67+
class Priority(SBase):
68+
math: str = field(default=None,validator=optional(instance_of(str)))
69+
70+
@modelspec.define
71+
class Delay(SBase):
72+
math: str = field(default=None,validator=optional(instance_of(str)))
73+
74+
@modelspec.define
75+
class EventAssignment(SBase):
76+
'''
77+
Args:
78+
variable: SIdRef
79+
'''
80+
math: str = field(default=None,validator=optional(instance_of(str)))
81+
variable: str = field(default=None,validator=optional(instance_of(str)))
82+
83+
@modelspec.define
84+
class Event(SBase):
85+
useValuesFromTriggerTime: bool = field(default=None,validator=instance_of(bool))
86+
trigger: Trigger = field(default=None, validator=optional(instance_of(Trigger)))
87+
priority: Priority = field(default=None, validator=optional(instance_of(Priority)))
88+
delay: Delay = field(default=None, validator=optional(instance_of(Delay)))
89+
listOfEventAssignments: List[EventAssignment] = field(factory=list)
90+
91+
@modelspec.define
92+
class SimpleSpeciesReference(SBase):
93+
"""
94+
Base class used by SpeciesReference and ModifierSpeciesReference
95+
96+
Args:
97+
species: SIdRef
98+
"""
99+
100+
species: str = field(default=None,validator=instance_of(str))
101+
102+
@modelspec.define
103+
class ModifierSpeciesReference(SimpleSpeciesReference):
104+
''
105+
106+
@modelspec.define
107+
class SpeciesReference(SimpleSpeciesReference):
108+
"""
109+
Args:
110+
stoichiometry: double optional
111+
constant: boolean
112+
"""
113+
114+
stoichiometry: float = field(default=None,validator=optional(instance_of(float)))
115+
constant: bool = field(default=None,validator=instance_of(bool))
116+
117+
@modelspec.define
118+
class LocalParameter(SBase):
119+
"""
120+
Args:
121+
units: UnitSIdRef optional
122+
"""
123+
124+
value: float = field(default=None,validator=optional(instance_of(float)))
125+
units: str = field(default=None,validator=optional(instance_of(str)))
126+
127+
@modelspec.define
128+
class KineticLaw(SBase):
129+
"""
130+
"""
131+
132+
math: str = field(default=None,validator=optional(instance_of(str)))
133+
134+
listOfLocalParameters: List[LocalParameter] = field(factory=list)
135+
136+
@modelspec.define
137+
class Reaction(SBase):
138+
"""
139+
A model reaction
140+
141+
Args:
142+
reversible: boolean
143+
compartment: SIdRef optional
144+
"""
145+
146+
reversible: bool = field(default=None,validator=instance_of(bool))
147+
compartment: str = field(default=None,validator=optional(instance_of(str)))
148+
149+
listOfReactants: List[SpeciesReference] = field(factory=list)
150+
listOfProducts: List[SpeciesReference] = field(factory=list)
151+
listOfModifiers: List[ModifierSpeciesReference] = field(factory=list)
152+
153+
kineticLaw: KineticLaw = field(default=None, validator=optional(instance_of(KineticLaw)))
154+
155+
@modelspec.define
156+
class Constraint(SBase):
157+
"""
158+
A model constraint
159+
160+
Args:
161+
math: MathML optional
162+
message: XHTML 1.0 optional
163+
"""
164+
165+
math: str = field(default=None,validator=optional(instance_of(str)))
166+
message: str = field(default=None,validator=optional(instance_of(str)))
167+
168+
@modelspec.define
169+
class Rule(SBase):
170+
"""
171+
A rule, either algebraic, assignment or rate
172+
173+
Args:
174+
math: MathML optional
175+
"""
176+
177+
math: str = field(default=None,validator=optional(instance_of(str)))
178+
179+
@modelspec.define
180+
class AlgebraicRule(Rule):
181+
"""
182+
An algebraic rule
183+
"""
184+
185+
@modelspec.define
186+
class AssignmentRule(Rule):
187+
"""
188+
An assignment rule
189+
190+
Args:
191+
variable: SIdRef required
192+
"""
193+
194+
variable: str = field(default=None,validator=instance_of(str))
195+
196+
@modelspec.define
197+
class RateRule(Rule):
198+
"""
199+
A rate rule
200+
201+
Args:
202+
variable: SIdRef required
203+
"""
204+
205+
variable: str = field(default=None,validator=instance_of(str))
206+
207+
@modelspec.define
208+
class InitialAssignment(SBase):
209+
"""
210+
An initial assignment
211+
212+
Args:
213+
symbol: SIdRef required
214+
math: MathML optional
215+
"""
216+
217+
symbol: str = field(default=None,validator=instance_of(str))
218+
math: str = field(default=None,validator=optional(instance_of(str)))
219+
220+
@modelspec.define
221+
class Parameter(SBase):
222+
"""
223+
A parameter
224+
225+
Args:
226+
value: double optional
227+
units: UnitSIdRef optional
228+
constant: boolean
229+
"""
230+
231+
constant: bool = field(default=None,validator=instance_of(bool))
232+
233+
value: float = field(default=None,validator=optional(instance_of(float)))
234+
units: str = field(default=None,validator=optional(instance_of(str)))
235+
236+
@modelspec.define
237+
class Species(SBase):
238+
"""
239+
A species: entities of the same kind participating in reactions within a specific compartment
240+
241+
Args:
242+
compartment: SIdRef
243+
initialAmount: double optional
244+
initialConcentration: double optional
245+
substanceUnits: UnitSIdRef optional
246+
hasOnlySubstanceUnits: boolean
247+
boundaryCondition: boolean
248+
constant: boolean
249+
conversionFactor: SIdRef optional
250+
"""
251+
252+
compartment: str = field(default=None,validator=instance_of(str))
253+
hasOnlySubstanceUnits: bool = field(default=None,validator=instance_of(bool))
254+
boundaryCondition: bool = field(default=None,validator=instance_of(bool))
255+
constant: bool = field(default=None,validator=instance_of(bool))
256+
257+
initialAmount: float = field(default=None, validator=optional(instance_of(float)))
258+
initialConcentration: float = field(default=None, validator=optional(instance_of(float)))
259+
substanceUnits: str = field(default=None, validator=optional(instance_of(str)))
260+
conversionFactor: str = field(default=None, validator=optional(instance_of(str)))
261+
262+
@modelspec.define
263+
class Compartment(SBase):
264+
"""
265+
A compartment
266+
267+
Args:
268+
spatialDimensions: eg 3 for three dimensional space etc
269+
size: initial size of compartment
270+
units: units being used to define the compartment's size
271+
constant: whether size is fixed
272+
"""
273+
274+
constant: bool = field(default=None,validator=instance_of(bool))
275+
276+
spatialDimensions: float = field(default=None,validator=optional(instance_of(float)))
277+
size: float = field(default=None,validator=optional(instance_of(float)))
278+
units: str = field(default=None,validator=optional(instance_of(str)))
279+
280+
@modelspec.define
281+
class Unit(SBase):
282+
"""
283+
A unit used to compose a unit definition.
284+
unit = (multiplier x 10^scale x kind)^exponent
285+
286+
Args:
287+
kind: base unit (base or derived SI units only, see Table 2 of the SBML spec)
288+
exponent: double
289+
scale: integer
290+
multiplier: double
291+
"""
292+
293+
kind: str = field(default=None,validator=[instance_of(str),valid_kind])
294+
exponent: str = field(default=1.0, validator=instance_of(float))
295+
scale: str = field(default=0, validator=instance_of(int))
296+
multiplier: str = field(default=1.0, validator=instance_of(float))
297+
298+
@modelspec.define
299+
class UnitDefinition(SBase):
300+
"""
301+
A unit definition
302+
303+
Args:
304+
sid: UnitSid required (overrides SBase sid)
305+
listOfUnits: List of units used to compose the definition
306+
"""
307+
308+
sid: str = field(default=None,validator=[instance_of(str),valid_unitsid])
309+
listOfUnits: List[Unit] = field(factory=list)
310+
311+
@modelspec.define
312+
class FunctionDefinition(SBase):
313+
"""
314+
A function definition using MathML
315+
316+
Args:
317+
sid: SId required
318+
319+
math: MathML function definition optional
320+
"""
321+
322+
sid: str = field(default=None,validator=[instance_of(str),valid_sid])
323+
324+
math: Math = field(default=None, validator=optional(instance_of(Math)))
325+
326+
@modelspec.define
327+
class Model(SBase):
328+
"""
329+
The model
330+
331+
Args:
332+
substanceUnits: UnitSIdRef optional
333+
timeUnits: UnitSIdRef optional
334+
volumeUnits: UnitSIdRef optional
335+
areaUnits: UnitSIdRef optional
336+
lengthUnits: UnitSIdRef optional
337+
extentUnits: UnitSIdRef optional
338+
conversionFactor: SIdRef optional
339+
"""
340+
341+
substanceUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
342+
timeUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
343+
volumeUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
344+
areaUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
345+
lengthUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
346+
extentUnits: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
347+
conversionFactor: str = field(default=None, validator=optional([instance_of(str),valid_unitsid]))
348+
349+
listOfFunctionDefinitions: List[FunctionDefinition] = field(factory=list)
350+
listOfUnitDefinitions: List[UnitDefinition] = field(factory=list)
351+
listOfCompartments: List[Compartment] = field(factory=list)
352+
listOfSpecies: List[Species] = field(factory=list)
353+
listOfParameters: List[Parameter] = field(factory=list)
354+
listOfInitialAssignments: List[InitialAssignment] = field(factory=list)
355+
listOfRules: List[Rule] = field(factory=list)
356+
listOfConstraints: List[Constraint] = field(factory=list)
357+
listOfReactions: List[Reaction] = field(factory=list)
358+
listOfEvents: List[Event] = field(factory=list)
359+
360+
@modelspec.define
361+
class SBML(SBase):
362+
"""
363+
The top-level SBML container implementing SBML 3.2.
364+
See sbml.level-3.version-2.core.release-2.pdf section 4.
365+
http://www.sbml.org/sbml/level3/version2/core
366+
367+
Args:
368+
xmlns: string, fixed to "http://www.sbml.org/sbml/level3/version2/core"
369+
level: SBML level, fixed to 3
370+
version: SBML version, fixed to 2
371+
372+
model: Optional model
373+
"""
374+
375+
xmlns: str = field(default="http://www.sbml.org/sbml/level3/version2/core",validator=[instance_of(str),xmlns_sbml])
376+
level: str = field(default="3",validator=[instance_of(str),fixed_level])
377+
version: str = field(default="2",validator=[instance_of(str),fixed_version])
378+
379+
model: Model = field(default=None, validator=optional(instance_of(Model)))

0 commit comments

Comments
 (0)