from pyparsing import Word, Suppress, Optional, alphanums, Group, ZeroOrMore
from bionetgen.atomizer.utils.util import pmemoize as memoize
[docs]class CycleError(Exception):
"""Exception raised for errors in the input.
Attributes:
expr -- input expression in which the error occurred
msg -- explanation of the error
"""
def __init__(self, memory):
self.memory = memory
[docs]def addToDependencyGraph(dependencyGraph, label, value):
if label not in dependencyGraph:
dependencyGraph[label] = []
if value not in dependencyGraph[label] and value != []:
dependencyGraph[label].append(value)
[docs]def getURIFromSBML(moleculeName, parser, filterString=None):
"""
filters a list of URI's so that we get only filterString ID's
"""
annotationList = []
if parser:
annotations = parser.getSpeciesAnnotation()
if annotations[moleculeName]:
for annotation in annotations[moleculeName]:
annotationList.extend(getAnnotations(annotation))
if filterString:
annotationList = [
x
for x in annotationList
if any(filterstr in x for filterstr in filterString)
]
return annotationList
[docs]def addAssumptions(assumptionType, assumption, assumptions):
assumptions[assumptionType].add(assumption)
speciesNameGrammar = (
Word(alphanums + "_" + ":#-")
+ Suppress("()")
+ Optional(Suppress("@" + Word(alphanums + "_-")))
) + ZeroOrMore(
Suppress("+")
+ Word(alphanums + "_" + ":#-")
+ Suppress("()")
+ Optional(Suppress("@" + Word(alphanums + "_-")))
)
nameGrammar = Word(alphanums + "_-") + ":"
rateGrammar = Word("-" + alphanums + "()")
grammar = Suppress(Optional(nameGrammar)) + (
(Group(speciesNameGrammar) | "0")
+ Suppress(Optional("<") + "->")
+ (Group(speciesNameGrammar) | "0")
+ Suppress(rateGrammar)
) ^ (speciesNameGrammar + Suppress(Optional("<") + "->") + Suppress(rateGrammar))
[docs]@memoize
def parseReactions(reaction):
"""
given a reaction string definition it separates the elements into reactants and products
>>> parseReactions('A() + B() -> C() k1()')
[['A', 'B'], ['C']]
>>> parseReactions('A()@EC + B()@PM -> C()@PM k1()')
[['A', 'B'], ['C']]
>>> parseReactions('0 -> A() k1()')
['0', ['A']]
"""
result = grammar.parseString(reaction).asList()
if len(result) < 2:
result = [result, []]
if "<->" in reaction and len(result[0]) == 1 and len(result[1]) == 2:
result2 = [result[1], result[0]]
result = result2
return result
[docs]def getAnnotations(annotation):
"""
parses a libsbml.XMLAttributes annotation object into a list of annotations
"""
annotationDictionary = []
if annotation == [] or annotation is None:
return []
for index in range(0, annotation.getNumAttributes()):
annotationDictionary.append(annotation.getValue(index))
return annotationDictionary