From 782b645c7c7dd34a01ff849b0f105e7daadc9d0b Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 4 Jun 2020 22:14:25 +0530
Subject: [PATCH 01/76] added annotation class
---
cobra/core/__init__.py | 1 +
cobra/core/annotation.py | 159 +++++++++++++++++++++++++++++++++++++++
2 files changed, 160 insertions(+)
create mode 100644 cobra/core/annotation.py
diff --git a/cobra/core/__init__.py b/cobra/core/__init__.py
index 9ced664ae..22ef3fea3 100644
--- a/cobra/core/__init__.py
+++ b/cobra/core/__init__.py
@@ -13,3 +13,4 @@
from cobra.core.solution import Solution, LegacySolution, get_solution
from cobra.core.species import Species
from cobra.core.summary import MetaboliteSummary, ReactionSummary, Summary
+from cobra.core.annotation import Annotation
diff --git a/cobra/core/annotation.py b/cobra/core/annotation.py
new file mode 100644
index 000000000..01ce35b9b
--- /dev/null
+++ b/cobra/core/annotation.py
@@ -0,0 +1,159 @@
+import libsbml
+import collections
+from cobra.core.object import Object
+
+QUALIFIER_TYPES = (
+ "is", "hasPart", "isPartOf", "isVersionOf", "hasVersion",
+ "isHomologTo", "isDescribedBy", "isEncodedBy", "encodes",
+ "occursIn", "hasProperty", "isPropertyOf", "hasTaxon",
+ "unknown", "bqm_is", "bqm_isDescribedBy", "bqm_isDerivedFrom",
+ "bqm_isInstanceOf", "bqm_hasInstance", "bqm_unknown",
+)
+
+class Annotation:
+ """Annotation is a class used to hold the annotation
+ information of each component of SBML model derived from SBase
+
+ """
+
+ def __init__(self):
+ self._cvTerms = []
+ self.history = History()
+ self.listofKeyValue = []
+
+
+
+
+ class MyDict(dict):
+ def __setitem__(self, key, value):
+ if key == 'resource':
+ if isinstance(value, list):
+ for item in value:
+ if not isinstance(item, list) or len(item) != 2:
+ raise TypeError("Each resource must be of the "
+ "form ['resource', 'provider']")
+
+ super().__setitem__(key, value)
+ else:
+ raise TypeError("All the resources must be present inside a list")
+ elif key == "cvTerm":
+ if not isinstance(value, CVTerm):
+ raise TypeError("value must be of the form CVTerm")
+ else:
+ super().__setitem__(key, value)
+ else:
+ raise ValueError("Can't accept keys other than 'resource' and 'cvTerm'")
+
+
+ class CVTerm:
+
+ def __init__(self):
+ self._qualifier = ""
+ self._groupResource = []
+
+ @property
+ def qualifier(self):
+ return getattr(self, "_qualifier", None)
+
+ @qualifier.setter
+ def qualifier(self, value):
+ if value == self.qualifier:
+ pass
+ elif not isinstance(value, string_types):
+ raise TypeError("qualifier must be a string")
+ elif value not in QUALIFIER_TYPES:
+ raise ValueError("%s is not a valid qualifier", qualifier)
+ else:
+ self._qualifier = value
+
+ @property
+ def groupResource(self):
+ return getattr(self, "_groupResource")
+
+
+ class History:
+
+ def __init__(self):
+ self.creator = {
+ "first_name" : "",
+ "last_name" : "",
+ "email" : "",
+ "organization_name" : ""
+ }
+ self._created = libsbml.Date()
+ self._modified = []
+
+ @property
+ def created(self):
+ return self._created.getDateAsString()
+
+ @created.setter
+ def created(self, value):
+ if not isinstance(value, str):
+ raise TypeError("date passed must be a string")
+ else:
+ result = self._created.setDateAsString(value)
+ if result != 0:
+ raise ValueError(libsbml.OperationReturnValue_toString(result))
+
+ @property
+ def modified(self):
+ return getattr(self, "_modified", [])
+
+ @modified.setter
+ def modified(self, value):
+ if not isinstance(value, list):
+ raise TypeError("value passed must be a list")
+ else:
+ date = libsbml.Date()
+ modified_list = []
+ for item in value:
+ if isinstance(item, str):
+ result = date.setDateAsString(item)
+ if result != 0:
+ raise ValueError(libsbml.OperationReturnValue_toString(result))
+ modified_list.append(date.getDateAsString())
+ else:
+ raise TypeError("%s must be of type string")
+ self._modified = modified_list
+
+ def add_modified_date(self, date):
+ if not isinstance(date, str):
+ raise TypeError("date passed must be a string")
+ lib_date = libsbml.Date()
+ result = lib_date.setDateAsString(date)
+ if result != 0:
+ raise ValueError(libsbml.OperationReturnValue_toString(result))
+ self._modified.append(lib_date.getDateAsString())
+
+
+
+ class KeyValuePairs(Object):
+
+ def __init__(self, id=None, name=None):
+ Object.__init__(self, id, name)
+ self._key = ''
+ self._value = ''
+ self.uri = ''
+
+ @property
+ def key(self):
+ return getattr(self, "_key", '')
+
+ @key.setter
+ def key(self, inKey):
+ if not isinstance(inKey, string_types):
+ raise TypeError("the key must be of type string")
+ else:
+ self._key = inKey
+
+ @property
+ def value(self):
+ return getattr(self, "_key", '')
+
+ @value.setter
+ def value(self, inValue):
+ if not isinstance(inValue, string_types):
+ raise TypeError("the value must be of type string")
+ else:
+ self._value = inValue
From 970997455636cbb0d39a4136b23a65039441a91a Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Fri, 5 Jun 2020 00:23:10 +0530
Subject: [PATCH 02/76] made some modifications
---
cobra/core/annotation.py | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cobra/core/annotation.py b/cobra/core/annotation.py
index 01ce35b9b..0f9dffd22 100644
--- a/cobra/core/annotation.py
+++ b/cobra/core/annotation.py
@@ -138,7 +138,7 @@ def __init__(self, id=None, name=None):
@property
def key(self):
- return getattr(self, "_key", '')
+ return getattr(self, "_key", None)
@key.setter
def key(self, inKey):
@@ -149,7 +149,7 @@ def key(self, inKey):
@property
def value(self):
- return getattr(self, "_key", '')
+ return getattr(self, "_key", None)
@value.setter
def value(self, inValue):
From a7af772c5731b2a0591f630874286c6e1c04c694 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Tue, 9 Jun 2020 18:13:15 +0530
Subject: [PATCH 03/76] made the complete metadata package
---
cobra/core/__init__.py | 2 +-
cobra/core/annotation.py | 159 ----------------------
cobra/core/meta_data/__init__.py | 8 ++
cobra/core/meta_data/cvTerm.py | 189 +++++++++++++++++++++++++++
cobra/core/meta_data/history.py | 176 +++++++++++++++++++++++++
cobra/core/meta_data/keyValuePair.py | 95 ++++++++++++++
cobra/core/meta_data/metaData.py | 100 ++++++++++++++
7 files changed, 569 insertions(+), 160 deletions(-)
delete mode 100644 cobra/core/annotation.py
create mode 100644 cobra/core/meta_data/__init__.py
create mode 100644 cobra/core/meta_data/cvTerm.py
create mode 100644 cobra/core/meta_data/history.py
create mode 100644 cobra/core/meta_data/keyValuePair.py
create mode 100644 cobra/core/meta_data/metaData.py
diff --git a/cobra/core/__init__.py b/cobra/core/__init__.py
index 22ef3fea3..a52915fbb 100644
--- a/cobra/core/__init__.py
+++ b/cobra/core/__init__.py
@@ -13,4 +13,4 @@
from cobra.core.solution import Solution, LegacySolution, get_solution
from cobra.core.species import Species
from cobra.core.summary import MetaboliteSummary, ReactionSummary, Summary
-from cobra.core.annotation import Annotation
+from cobra.core.meta_data import *
diff --git a/cobra/core/annotation.py b/cobra/core/annotation.py
deleted file mode 100644
index 0f9dffd22..000000000
--- a/cobra/core/annotation.py
+++ /dev/null
@@ -1,159 +0,0 @@
-import libsbml
-import collections
-from cobra.core.object import Object
-
-QUALIFIER_TYPES = (
- "is", "hasPart", "isPartOf", "isVersionOf", "hasVersion",
- "isHomologTo", "isDescribedBy", "isEncodedBy", "encodes",
- "occursIn", "hasProperty", "isPropertyOf", "hasTaxon",
- "unknown", "bqm_is", "bqm_isDescribedBy", "bqm_isDerivedFrom",
- "bqm_isInstanceOf", "bqm_hasInstance", "bqm_unknown",
-)
-
-class Annotation:
- """Annotation is a class used to hold the annotation
- information of each component of SBML model derived from SBase
-
- """
-
- def __init__(self):
- self._cvTerms = []
- self.history = History()
- self.listofKeyValue = []
-
-
-
-
- class MyDict(dict):
- def __setitem__(self, key, value):
- if key == 'resource':
- if isinstance(value, list):
- for item in value:
- if not isinstance(item, list) or len(item) != 2:
- raise TypeError("Each resource must be of the "
- "form ['resource', 'provider']")
-
- super().__setitem__(key, value)
- else:
- raise TypeError("All the resources must be present inside a list")
- elif key == "cvTerm":
- if not isinstance(value, CVTerm):
- raise TypeError("value must be of the form CVTerm")
- else:
- super().__setitem__(key, value)
- else:
- raise ValueError("Can't accept keys other than 'resource' and 'cvTerm'")
-
-
- class CVTerm:
-
- def __init__(self):
- self._qualifier = ""
- self._groupResource = []
-
- @property
- def qualifier(self):
- return getattr(self, "_qualifier", None)
-
- @qualifier.setter
- def qualifier(self, value):
- if value == self.qualifier:
- pass
- elif not isinstance(value, string_types):
- raise TypeError("qualifier must be a string")
- elif value not in QUALIFIER_TYPES:
- raise ValueError("%s is not a valid qualifier", qualifier)
- else:
- self._qualifier = value
-
- @property
- def groupResource(self):
- return getattr(self, "_groupResource")
-
-
- class History:
-
- def __init__(self):
- self.creator = {
- "first_name" : "",
- "last_name" : "",
- "email" : "",
- "organization_name" : ""
- }
- self._created = libsbml.Date()
- self._modified = []
-
- @property
- def created(self):
- return self._created.getDateAsString()
-
- @created.setter
- def created(self, value):
- if not isinstance(value, str):
- raise TypeError("date passed must be a string")
- else:
- result = self._created.setDateAsString(value)
- if result != 0:
- raise ValueError(libsbml.OperationReturnValue_toString(result))
-
- @property
- def modified(self):
- return getattr(self, "_modified", [])
-
- @modified.setter
- def modified(self, value):
- if not isinstance(value, list):
- raise TypeError("value passed must be a list")
- else:
- date = libsbml.Date()
- modified_list = []
- for item in value:
- if isinstance(item, str):
- result = date.setDateAsString(item)
- if result != 0:
- raise ValueError(libsbml.OperationReturnValue_toString(result))
- modified_list.append(date.getDateAsString())
- else:
- raise TypeError("%s must be of type string")
- self._modified = modified_list
-
- def add_modified_date(self, date):
- if not isinstance(date, str):
- raise TypeError("date passed must be a string")
- lib_date = libsbml.Date()
- result = lib_date.setDateAsString(date)
- if result != 0:
- raise ValueError(libsbml.OperationReturnValue_toString(result))
- self._modified.append(lib_date.getDateAsString())
-
-
-
- class KeyValuePairs(Object):
-
- def __init__(self, id=None, name=None):
- Object.__init__(self, id, name)
- self._key = ''
- self._value = ''
- self.uri = ''
-
- @property
- def key(self):
- return getattr(self, "_key", None)
-
- @key.setter
- def key(self, inKey):
- if not isinstance(inKey, string_types):
- raise TypeError("the key must be of type string")
- else:
- self._key = inKey
-
- @property
- def value(self):
- return getattr(self, "_key", None)
-
- @value.setter
- def value(self, inValue):
- if not isinstance(inValue, string_types):
- raise TypeError("the value must be of type string")
- else:
- self._value = inValue
diff --git a/cobra/core/meta_data/__init__.py b/cobra/core/meta_data/__init__.py
new file mode 100644
index 000000000..a10d61c67
--- /dev/null
+++ b/cobra/core/meta_data/__init__.py
@@ -0,0 +1,8 @@
+
+
+from __future__ import absolute_import
+
+from cobra.core.meta_data.metaData import MetaData
+from cobra.core.meta_data.cvTerm import CVTerm
+from cobra.core.meta_data.history import History
+from cobra.core.meta_data.keyValuePair import KeyValuePair
diff --git a/cobra/core/meta_data/cvTerm.py b/cobra/core/meta_data/cvTerm.py
new file mode 100644
index 000000000..8a02ecedd
--- /dev/null
+++ b/cobra/core/meta_data/cvTerm.py
@@ -0,0 +1,189 @@
+# -*- coding: utf-8 -*-
+
+"""
+Define the Controlled Vocabulary term class for refering to external
+resources
+"""
+
+from __future__ import absolute_import
+
+
+class CVTerm(dict) :
+ """
+ Class representation of Controlled Vocabulary term inside Annotation.
+ It will look similar to a dictionary, but will have restrictions on the
+ type of keys and values
+
+ Parameters
+ ----------
+ cvterm : dict
+ A dictionary that maps the provider to its corresponding CVList
+
+ Attributes
+ ----------
+ The providers are set as keys for accessing their CVLists
+
+ """
+
+ def __init__(self, cvterm={}):
+ if not isinstance(cvterm, dict):
+ raise TypeError("The annotation data must be in a dict form")
+ else:
+ for key, value in cvterm.items():
+ if not isinstance(key, str):
+ raise TypeError("the provider must be of type string")
+ if isinstance(value, list):
+ dict.__setitem__(self, key, self.CVList(value))
+ else:
+ dict.__setitem__(self, key, value)
+
+ def __getitem__(self,key):
+ return dict.__getitem__(self,key)
+
+ def __setitem__(self, key, value):
+ """Make sure that key passed is of type string and value
+ passed confirms to CVList type (CVList or list)
+ """
+ if not isinstance(key, str):
+ raise TypeError("The key passed must be a string")
+ if isinstance(value, list):
+ dict.__setitem__(self, key, self.CVList(value))
+ elif isinstance(value, self.CVList):
+ dict.__setitem__(self, key, value)
+ else:
+ raise TypeError("The value passed does not confirm to CVList type")
+
+ def __delitem__(self, key):
+ dict.__delitem__(self,key)
+
+ def __iter__(self):
+ return dict.__iter__(self)
+
+ def __len__(self):
+ return dict.__len__(self)
+
+ def __contains__(self, x):
+ return dict.__contains__(self,x)
+
+
+ class CVList(list):
+ """
+ Class representation of all sets of resources and their nested
+ annotation corresponding to a given qualifier. It have similar
+ structure like that of a list but has only restricted type of
+ entries (of type ExternalResources) within it
+
+ Parameters
+ ----------
+ cvlist : list
+ a list containing entries confirming to ExternalResources structure
+
+ """
+
+ def __init__(self, cvlist=[]):
+ if not isinstance(cvlist, list):
+ raise TypeError("The resources passed must be inside a list")
+ for item in cvlist:
+ if isinstance(item, self.ExternalResources):
+ list.append(self, item)
+ elif isinstance(item, dict):
+ list.append(self, CVTerm.ExternalResources(item))
+ else:
+ raise TypeError("All items must confirm to ExternalResources structure")
+
+ def __len__(self):
+ return list.__len__(self)
+
+ def __delitem__(self, index):
+ list.__delitem__(self, index)
+
+ def insert(self, index, value):
+ list.insert(self, index, CVTerm.ExternalResources(value))
+
+ def append(self, value):
+ list.append(self, CVTerm.ExternalResources(value))
+
+ def __setitem__(self, index, value):
+ list.__setitem__(self, index, CVTerm.ExternalResources(value))
+
+ def __getitem__(self, index):
+ return list.__getitem__(self, index)
+
+
+ class ExternalResources(dict):
+ """
+ Class representation of a single set of resources and its nested
+ annotation. Its a special type of dict with restricted keys and
+ values
+
+ Parameters
+ ----------
+ data : dict
+ A dictionary containing the resources and nested annotation
+ {
+ "resources" : [],
+ "nested_data" : CVTerm
+ }
+
+ Allowed Keys
+ ----------
+ "resources" : string
+ for accessing the mapped resources
+ "nested_data" : string
+ for accessing the nested annotation data
+
+ """
+
+ ANNOTATION_KEYS = ['resources', 'nested_data']
+
+ def __init__(self, data={}):
+ self._resources = []
+ self._nested_data = None
+ if not isinstance(data, dict):
+ raise TypeError("The value passed must be of type dict.")
+ for key, value in data.items():
+ if key not in ANNOTATION_KEYS:
+ raise ValueError("Key '%s' is not allowed. Only allowed keys are 'resource', 'nested_data'." %key)
+ if key == 'resources':
+ if not isinstance(value, list):
+ raise TypeError("Resources must be put in a list")
+ dict.__setitem__(self, key, value)
+ if key == 'nested_data':
+ if isinstance(value, CVTerm):
+ dict.__setitem__(self, key, value)
+ elif isinstance(value, dict):
+ dict.__setitem__(self, key, CVTerm(value))
+ else:
+ raise TypeError("The nested data structure does not have valid CVTerm format")
+
+ def __getitem__(self,key):
+ if key not in ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Allowed keys are 'resources', 'nested_data'." %key)
+ return dict.__getitem__(self,key)
+
+ def __setitem__(self, key, value):
+ """Restricting the keys and values that can be set.
+ Only allowed keys are 'resources' and 'nested_data'
+ """
+ if key not in ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Allowed keys are 'resources', 'nested_data'." %key)
+ if key == 'resources':
+ if not isinstance(value, list):
+ raise TypeError("Resources must be put in a list")
+ dict.__setitem__(self, key, value)
+ elif key == 'nested_data':
+ if not isinstance(value,CVTerm):
+ raise TypeError("The value passed must be of type CVTerm.")
+ dict.__setitem__(self, key, value)
+
+ def __delitem__(self, key):
+ dict.__delitem__(self,key)
+
+ def __iter__(self):
+ return dict.__iter__(self)
+
+ def __len__(self):
+ return dict.__len__(self)
+
+ def __contains__(self, x):
+ return dict.__contains__(self,x)
diff --git a/cobra/core/meta_data/history.py b/cobra/core/meta_data/history.py
new file mode 100644
index 000000000..6cf0407c5
--- /dev/null
+++ b/cobra/core/meta_data/history.py
@@ -0,0 +1,176 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+
+import datetime
+
+# The possible keys inside creator dict
+CREATOR_KEYS = ["first_name", "last_name", "email", "organization_name"]
+
+def validateDate(date_text):
+ """Validate if the date format is of type w3cdtf ISO 8601"""
+ try:
+ datetime.datetime.strptime(date_text, '%Y-%m-%dT%H:%M:%S%z')
+ except ValueError as e:
+ raise ValueError(str(e))
+ return True
+
+
+class History:
+ """
+ Class representation of history of a given component i.e. creator,
+ created date and modification dates
+
+ Parameters
+ ----------
+ creator : dict
+ A dictionary containong details of creator's name, email and
+ organisation name
+ created : string
+ The date when component is created in W3CDTF ISO 8601 format
+ modified : list
+ A list of dates about the component modification
+
+ Attributes
+ ----------
+ creator : dict
+ A dictionary containong details of creator's name, email and
+ organisation name
+ created : string
+ The date when component is created in W3CDTF ISO 8601 format
+ modified : list
+ A list of dates about the component modification
+
+ """
+
+ def __init__(self, creator={}, created=None, modified=[]):
+ self._creator = self.Creator(creator)
+ if isinstance(created, str):
+ validateDate(created)
+ self._created = created
+ elif created == None:
+ self._created = None
+ else:
+ raise TypeError("Only None and string type possible for created date")
+ self._modified = self.ModifiedHistory(modified)
+
+ @property
+ def creator(self):
+ return self._creator
+
+ @creator.setter
+ def creator(self, creator_dict):
+ self._creator = self.Creator(creator_dict)
+
+ @property
+ def created(self):
+ return self._created
+
+ @created.setter
+ def created(self, value):
+ if not isinstance(value, str):
+ raise TypeError("date passed must be a string")
+ else:
+ validateDate(value)
+ self._created = value
+
+ @property
+ def modified(self):
+ return self._modified
+
+ @modified.setter
+ def modified(self, value):
+ self._modified = self.ModifiedHistory(value)
+
+
+ class Creator(dict):
+ """A dictionary extension to store basic info of this component
+ creator
+
+ Parameters
+ ----------
+ creator_dict : dict containing info about creator
+ {
+ "first_name" : "abc",
+ "last_name" : "abc",
+ "email" : "abc",
+ "organization_name" : "abc"
+ }
+ """
+
+ def __init__(self, creator_dict={}):
+ if not isinstance(creator_dict, dict):
+ raise TypeError("The value passed must be of type dict.")
+ for key in CREATOR_KEYS:
+ if key not in creator_dict:
+ dict.__setitem__(self, key, None)
+ else:
+ if not isinstance(creator_dict[key], str):
+ raise TypeError("All the values passed must be of type string.")
+ else:
+ dict.__setitem__(self, key, creator_dict[key])
+
+ def __getitem__(self,key):
+ if key not in CREATOR_KEYS:
+ raise ValueError("Key %s is not allowed. Allowed keys are 'first_name', 'last_name', 'email', 'organization_name'." %key)
+ return dict.__getitem__(self,key)
+
+ def __setitem__(self, key, value):
+ if key not in CREATOR_KEYS:
+ raise ValueError("Key %s is not allowed. Allowed keys are 'first_name', 'last_name', 'email', 'organization_name'." %key)
+ if not isinstance(value, str):
+ raise TypeError("Value passed must be of type string.")
+ dict.__setitem__(self,key,value)
+
+ def __delitem__(self, key):
+ dict.__delitem__(self,key)
+
+ def __iter__(self):
+ return dict.__iter__(self)
+
+ def __len__(self):
+ return dict.__len__(self)
+
+ def __contains__(self, x):
+ return dict.__contains__(self,x)
+
+
+ class ModifiedHistory(list):
+ """A list extension to store modification dates. Only Restricted
+ type of entries are possible.
+
+ Parameters
+ ----------
+ modifiedList : list containing modification dates in W3CDTF ISO
+ 8601 format
+ """
+
+ def __init__(self, modifiedList=[]):
+ if not isinstance(modifiedList, list):
+ raise TypeError("The dates passed must be inside a list")
+ for item in modifiedList:
+ if not isinstance(item, str):
+ raise ValueError("Each date must be of type string")
+ validateDate(item)
+ list.append(self, item)
+
+ def __len__(self):
+ return list.__len__(self)
+
+ def __delitem__(self, index):
+ list.__delitem__(self,index)
+
+ def insert(self, index, value):
+ validateDate(value)
+ list.insert(self,index, value)
+
+ def append(self, value):
+ validateDate(value)
+ list.append(self,value)
+
+ def __setitem__(self, index, value):
+ validateDate(value)
+ list.__setitem__(self,index, value)
+
+ def __getitem__(self, index):
+ return list.__getitem__(self,index)
diff --git a/cobra/core/meta_data/keyValuePair.py b/cobra/core/meta_data/keyValuePair.py
new file mode 100644
index 000000000..2946597cc
--- /dev/null
+++ b/cobra/core/meta_data/keyValuePair.py
@@ -0,0 +1,95 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+
+from cobra.core.object import Object
+
+
+class KeyValuePair(Object):
+ """
+ Class representation of key-value pairs supported in fba-v3
+
+ Parameters
+ ----------
+ data : dict
+ A dictionary containong data about key-value pairs
+ {
+ "id" : "abc",
+ "name" : "abc",
+ "key" : "abc",
+ "value" : "abc",
+ "uri" : "abc"
+ }
+
+ Attributes
+ ----------
+ id : string
+ The identifier to associate with this key-value pair
+ name : string
+ A human readable name for this key-value pair
+ key : string
+ The key by which we can refer to the value. Must be
+ unique in a given list of key-value pair
+ value : string
+ The value corresponding to that key
+ uri : string
+ The uri identifies a resource that defines the associated
+ key component
+
+ """
+
+ def __init__(self, data={}):
+ if "id" in data:
+ id = data["id"]
+ else:
+ id = None
+ if "name" in data:
+ name = data["name"]
+ else:
+ name = None
+ Object.__init__(self, id, name)
+ if "key" in data:
+ self._key = data["key"]
+ else:
+ self._key = None
+ if "value" in data:
+ self._value = data["value"]
+ else:
+ self._value = None
+ if "uri" in data:
+ self._uri = data["uri"]
+ else:
+ self._uri = None
+
+ @property
+ def key(self):
+ return getattr(self, "_key", None)
+
+ @key.setter
+ def key(self, inKey):
+ if not isinstance(inKey, str):
+ raise TypeError("the key must be of type string")
+ else:
+ self._key = inKey
+
+ @property
+ def value(self):
+ return getattr(self, "_key", None)
+
+ @value.setter
+ def value(self, inValue):
+ if not isinstance(inValue, str):
+ raise TypeError("the value must be of type string")
+ else:
+ self._value = inValue
+
+ @property
+ def uri(self):
+ return getattr(self, "_uri", None)
+
+ @uri.setter
+ def uri(self, inUri):
+ if not isinstance(inUri, str):
+ raise TypeError("the uri must be of type string")
+ else:
+ self._uri = inUri
diff --git a/cobra/core/meta_data/metaData.py b/cobra/core/meta_data/metaData.py
new file mode 100644
index 000000000..498b3c873
--- /dev/null
+++ b/cobra/core/meta_data/metaData.py
@@ -0,0 +1,100 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import absolute_import
+
+from cobra.core.meta_data.cvTerm import CVTerm
+from cobra.core.meta_data.history import History
+from cobra.core.meta_data.keyValuePair import KeyValuePair
+
+
+class MetaData:
+ """Class representation of the meta-data of the component.
+ It is a combination of three classes i.e CVTerm, History
+ and KeyValuePair class.
+
+ Parameters
+ ----------
+ cvterm : dict, CVTerm
+ The cvterm holds data for external resources
+ history : dict, History
+ The history is holding the data about the creator,
+ created and modified dates.
+ listofKeyValue : list
+ Some key-value pairs which are not suitable to be
+ represented anywhere else in the model.
+
+ """
+
+ def __init__(self, cvterm=None, history=None, listofKeyValue=None):
+ # setting the cvterm
+ if isinstance(cvterm, CVTerm):
+ self._cvTerms = cvterm
+ elif isinstance(cvterm, dict):
+ self._cvTerms = CVTerm(cvterm)
+ else:
+ self._cvTerms = CVTerm()
+ # setting the history of the component
+ if isinstance(history, History):
+ self._history = history
+ elif isinstance(history, dict):
+ if "creator" not in history:
+ history["creator"] = {}
+ if "created" not in history:
+ history["created"] = None
+ if "modified" not in history:
+ history["modified"] = []
+ self._history = History(history["creator"], history["created"], history["modified"])
+ else:
+ self._history = History()
+ # setting the list of key-value pair
+ if listofKeyValue is not None:
+ if isinstance(listofKeyValue, list):
+ keyValue = []
+ for item in listofKeyValue:
+ if isinstance(item, dict):
+ keyValue.append(KeyValuePair(item))
+ if isinstance(item, KeyValuePair):
+ keyValue.append(item)
+ else:
+ raise TypeError("Each entry of key-value pair must be a dict or KeyValuePair object")
+ self.listofKeyValue = keyValue
+ else:
+ raise TypeError("Key value pairs must be passed in a list")
+ else:
+ self.listofKeyValue = []
+
+ @property
+ def cvTerms(self):
+ return getattr(self, "_cvTerms", None)
+
+ @cvTerms.setter
+ def cvTerms(self, value):
+ if value == self._cvTerms:
+ pass
+ elif isinstance(value, CVTerm):
+ self._cvTerms = value
+ elif isinstance(cvterm, dict):
+ self._cvTerms = CVTerm(cvterm)
+ else:
+ raise TypeError("This passed format for cvterm is not acceptable")
+
+ @property
+ def history(self):
+ return getattr(self, "_history", None)
+
+ @history.setter
+ def history(self, value):
+ if value == self._history:
+ pass
+ elif isinstance(value, History):
+ self._history = value
+ elif isinstance(history, dict):
+ if "creator" not in history:
+ history["creator"] = {}
+ if "created" not in history:
+ history["created"] = None
+ if "modified" not in history:
+ history["modified"] = []
+ self._history = History(value["creator"], value["created"], value["modified"])
+ else:
+ raise TypeError("This passed format for history is not acceptable")
From a1914139c6036dbf29535f346fa2d08cb83af4b7 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Wed, 10 Jun 2020 18:10:46 +0530
Subject: [PATCH 04/76] modified meta_data classes
---
cobra/core/meta_data/__init__.py | 2 +-
cobra/core/meta_data/cvTerm.py | 55 ++++----
cobra/core/meta_data/history.py | 120 ++++++++++++++----
cobra/core/meta_data/keyValuePair.py | 183 ++++++++++++++++-----------
cobra/core/meta_data/metaData.py | 64 ++++++----
5 files changed, 275 insertions(+), 149 deletions(-)
diff --git a/cobra/core/meta_data/__init__.py b/cobra/core/meta_data/__init__.py
index a10d61c67..173d65d52 100644
--- a/cobra/core/meta_data/__init__.py
+++ b/cobra/core/meta_data/__init__.py
@@ -5,4 +5,4 @@
from cobra.core.meta_data.metaData import MetaData
from cobra.core.meta_data.cvTerm import CVTerm
from cobra.core.meta_data.history import History
-from cobra.core.meta_data.keyValuePair import KeyValuePair
+from cobra.core.meta_data.keyValuePair import ListOfKeyValue
diff --git a/cobra/core/meta_data/cvTerm.py b/cobra/core/meta_data/cvTerm.py
index 8a02ecedd..2a1a36c41 100644
--- a/cobra/core/meta_data/cvTerm.py
+++ b/cobra/core/meta_data/cvTerm.py
@@ -8,7 +8,7 @@
from __future__ import absolute_import
-class CVTerm(dict) :
+class CVTerm(dict):
"""
Class representation of Controlled Vocabulary term inside Annotation.
It will look similar to a dictionary, but will have restrictions on the
@@ -37,8 +37,8 @@ def __init__(self, cvterm={}):
else:
dict.__setitem__(self, key, value)
- def __getitem__(self,key):
- return dict.__getitem__(self,key)
+ def __getitem__(self, key):
+ return dict.__getitem__(self, key)
def __setitem__(self, key, value):
"""Make sure that key passed is of type string and value
@@ -54,7 +54,7 @@ def __setitem__(self, key, value):
raise TypeError("The value passed does not confirm to CVList type")
def __delitem__(self, key):
- dict.__delitem__(self,key)
+ dict.__delitem__(self, key)
def __iter__(self):
return dict.__iter__(self)
@@ -63,8 +63,7 @@ def __len__(self):
return dict.__len__(self)
def __contains__(self, x):
- return dict.__contains__(self,x)
-
+ return dict.__contains__(self, x)
class CVList(list):
"""
@@ -84,12 +83,13 @@ def __init__(self, cvlist=[]):
if not isinstance(cvlist, list):
raise TypeError("The resources passed must be inside a list")
for item in cvlist:
- if isinstance(item, self.ExternalResources):
+ if isinstance(item, CVTerm.ExternalResources):
list.append(self, item)
elif isinstance(item, dict):
list.append(self, CVTerm.ExternalResources(item))
else:
- raise TypeError("All items must confirm to ExternalResources structure")
+ raise TypeError("All items must confirm to "
+ "ExternalResources structure")
def __len__(self):
return list.__len__(self)
@@ -109,7 +109,6 @@ def __setitem__(self, index, value):
def __getitem__(self, index):
return list.__getitem__(self, index)
-
class ExternalResources(dict):
"""
Class representation of a single set of resources and its nested
@@ -127,10 +126,10 @@ class ExternalResources(dict):
Allowed Keys
----------
- "resources" : string
- for accessing the mapped resources
- "nested_data" : string
- for accessing the nested annotation data
+ "resources" : string
+ for accessing the mapped resources
+ "nested_data" : string
+ for accessing the nested annotation data
"""
@@ -142,8 +141,10 @@ def __init__(self, data={}):
if not isinstance(data, dict):
raise TypeError("The value passed must be of type dict.")
for key, value in data.items():
- if key not in ANNOTATION_KEYS:
- raise ValueError("Key '%s' is not allowed. Only allowed keys are 'resource', 'nested_data'." %key)
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key '%s' is not allowed. Only "
+ "allowed keys are 'resource', "
+ "'nested_data'." % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
@@ -154,30 +155,34 @@ def __init__(self, data={}):
elif isinstance(value, dict):
dict.__setitem__(self, key, CVTerm(value))
else:
- raise TypeError("The nested data structure does not have valid CVTerm format")
+ raise TypeError("The nested data structure does "
+ "not have valid CVTerm format")
- def __getitem__(self,key):
- if key not in ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Allowed keys are 'resources', 'nested_data'." %key)
- return dict.__getitem__(self,key)
+ def __getitem__(self, key):
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed keys are"
+ " 'resources', 'nested_data'." % key)
+ return dict.__getitem__(self, key)
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
Only allowed keys are 'resources' and 'nested_data'
"""
- if key not in ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Allowed keys are 'resources', 'nested_data'." %key)
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are 'resources', 'nested_data'."
+ % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
dict.__setitem__(self, key, value)
elif key == 'nested_data':
- if not isinstance(value,CVTerm):
+ if not isinstance(value, CVTerm):
raise TypeError("The value passed must be of type CVTerm.")
dict.__setitem__(self, key, value)
def __delitem__(self, key):
- dict.__delitem__(self,key)
+ dict.__delitem__(self, key)
def __iter__(self):
return dict.__iter__(self)
@@ -186,4 +191,4 @@ def __len__(self):
return dict.__len__(self)
def __contains__(self, x):
- return dict.__contains__(self,x)
+ return dict.__contains__(self, x)
diff --git a/cobra/core/meta_data/history.py b/cobra/core/meta_data/history.py
index 6cf0407c5..5a11f9275 100644
--- a/cobra/core/meta_data/history.py
+++ b/cobra/core/meta_data/history.py
@@ -4,9 +4,11 @@
import datetime
+
# The possible keys inside creator dict
CREATOR_KEYS = ["first_name", "last_name", "email", "organization_name"]
+
def validateDate(date_text):
"""Validate if the date format is of type w3cdtf ISO 8601"""
try:
@@ -43,24 +45,29 @@ class History:
"""
- def __init__(self, creator={}, created=None, modified=[]):
- self._creator = self.Creator(creator)
+ def __init__(self, creators=[], created=None, modified=[]):
+ if creators is None:
+ creators = []
+ self._creators = self.ListOfCreators(creators)
if isinstance(created, str):
validateDate(created)
self._created = created
- elif created == None:
+ elif created is None:
self._created = None
else:
- raise TypeError("Only None and string type possible for created date")
+ raise TypeError('Only None and string types are possible for '
+ '"created" date attribute')
+ if modified is None:
+ modified = []
self._modified = self.ModifiedHistory(modified)
@property
- def creator(self):
- return self._creator
+ def creators(self):
+ return self._creators
- @creator.setter
- def creator(self, creator_dict):
- self._creator = self.Creator(creator_dict)
+ @creators.setter
+ def creators(self, creators_list):
+ self._creators = self.ListOfCreators(creators_list)
@property
def created(self):
@@ -69,7 +76,7 @@ def created(self):
@created.setter
def created(self, value):
if not isinstance(value, str):
- raise TypeError("date passed must be a string")
+ raise TypeError("The date passed must be a string")
else:
validateDate(value)
self._created = value
@@ -82,6 +89,62 @@ def modified(self):
def modified(self, value):
self._modified = self.ModifiedHistory(value)
+ class ListOfCreators(list):
+ """A list extension to store each creator's info
+
+ Parameters
+ ----------
+ creators : list containing info about creators
+ """
+
+ def __init__(self, creators=[]):
+ if not isinstance(creators, list):
+ raise TypeError("The data passed for creators must be "
+ "inside a list")
+ else:
+ for item in creators:
+ if isinstance(item, History.Creator):
+ list.append(self, item)
+ elif isinstance(item, dict):
+ list.append(self, History.Creator(item))
+ else:
+ raise TypeError("The data passed for creator "
+ "indexed %s has invalid format"
+ % creators.index(item, 0,
+ len(creators)))
+
+ def __len__(self):
+ return list.__len__(self)
+
+ def __delitem__(self, index):
+ list.__delitem__(self, index)
+
+ def insert(self, index, value):
+ if isinstance(value, History.Creator):
+ list.insert(self, index, value)
+ elif isinstance(value, dict):
+ list.insert(self, index, History.Creator(value))
+ else:
+ raise TypeError("The data passed has invalid format")
+
+ def append(self, value):
+ if isinstance(value, History.Creator):
+ list.append(self, value)
+ elif isinstance(value, dict):
+ list.append(self, History.Creator(value))
+ else:
+ raise TypeError("The data passed has invalid format")
+
+ def __setitem__(self, index, value):
+ if isinstance(value, History.Creator):
+ list.__setitem__(self, index, value)
+ elif isinstance(value, dict):
+ list.__setitem__(self, index, History.Creator(value))
+ else:
+ raise TypeError("The data passed has invalid format")
+
+ def __getitem__(self, index):
+ return list.__getitem__(self, index)
class Creator(dict):
"""A dictionary extension to store basic info of this component
@@ -100,30 +163,36 @@ class Creator(dict):
def __init__(self, creator_dict={}):
if not isinstance(creator_dict, dict):
- raise TypeError("The value passed must be of type dict.")
+ raise TypeError("The value passed for creator must "
+ "be of type dict.")
for key in CREATOR_KEYS:
if key not in creator_dict:
dict.__setitem__(self, key, None)
else:
if not isinstance(creator_dict[key], str):
- raise TypeError("All the values passed must be of type string.")
+ raise TypeError("All the values passed must "
+ "be of type string.")
else:
dict.__setitem__(self, key, creator_dict[key])
- def __getitem__(self,key):
+ def __getitem__(self, key):
if key not in CREATOR_KEYS:
- raise ValueError("Key %s is not allowed. Allowed keys are 'first_name', 'last_name', 'email', 'organization_name'." %key)
- return dict.__getitem__(self,key)
+ raise ValueError("Key %s is not allowed. only allowed "
+ "keys are 'first_name', 'last_name', "
+ "'email', 'organization_name'." % key)
+ return dict.__getitem__(self, key)
def __setitem__(self, key, value):
if key not in CREATOR_KEYS:
- raise ValueError("Key %s is not allowed. Allowed keys are 'first_name', 'last_name', 'email', 'organization_name'." %key)
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are 'first_name', 'last_name', "
+ "'email', 'organization_name'." % key)
if not isinstance(value, str):
raise TypeError("Value passed must be of type string.")
- dict.__setitem__(self,key,value)
+ dict.__setitem__(self, key, value)
def __delitem__(self, key):
- dict.__delitem__(self,key)
+ dict.__delitem__(self, key)
def __iter__(self):
return dict.__iter__(self)
@@ -132,8 +201,7 @@ def __len__(self):
return dict.__len__(self)
def __contains__(self, x):
- return dict.__contains__(self,x)
-
+ return dict.__contains__(self, x)
class ModifiedHistory(list):
"""A list extension to store modification dates. Only Restricted
@@ -144,7 +212,7 @@ class ModifiedHistory(list):
modifiedList : list containing modification dates in W3CDTF ISO
8601 format
"""
-
+
def __init__(self, modifiedList=[]):
if not isinstance(modifiedList, list):
raise TypeError("The dates passed must be inside a list")
@@ -158,19 +226,19 @@ def __len__(self):
return list.__len__(self)
def __delitem__(self, index):
- list.__delitem__(self,index)
+ list.__delitem__(self, index)
def insert(self, index, value):
validateDate(value)
- list.insert(self,index, value)
+ list.insert(self, index, value)
def append(self, value):
validateDate(value)
- list.append(self,value)
+ list.append(self, value)
def __setitem__(self, index, value):
validateDate(value)
- list.__setitem__(self,index, value)
+ list.__setitem__(self, index, value)
def __getitem__(self, index):
- return list.__getitem__(self,index)
+ return list.__getitem__(self, index)
diff --git a/cobra/core/meta_data/keyValuePair.py b/cobra/core/meta_data/keyValuePair.py
index 2946597cc..0930e4b1f 100644
--- a/cobra/core/meta_data/keyValuePair.py
+++ b/cobra/core/meta_data/keyValuePair.py
@@ -5,91 +5,128 @@
from cobra.core.object import Object
-class KeyValuePair(Object):
- """
- Class representation of key-value pairs supported in fba-v3
+class ListOfKeyValue(list):
+ """A list extension to store key-value pairs
Parameters
----------
- data : dict
- A dictionary containong data about key-value pairs
- {
- "id" : "abc",
- "name" : "abc",
- "key" : "abc",
- "value" : "abc",
- "uri" : "abc"
- }
-
- Attributes
- ----------
- id : string
- The identifier to associate with this key-value pair
- name : string
- A human readable name for this key-value pair
- key : string
- The key by which we can refer to the value. Must be
- unique in a given list of key-value pair
- value : string
- The value corresponding to that key
- uri : string
- The uri identifies a resource that defines the associated
- key component
-
+ creators : list key-value pair data
"""
- def __init__(self, data={}):
- if "id" in data:
- id = data["id"]
+ def __init__(self, keyvaluelist=[]):
+ if not isinstance(keyvaluelist, list):
+ raise TypeError("The data passed for ListOfKeyValue "
+ "must be inside a list")
else:
- id = None
- if "name" in data:
- name = data["name"]
- else:
- name = None
- Object.__init__(self, id, name)
- if "key" in data:
- self._key = data["key"]
+ for item in keyvaluelist:
+ if isinstance(item, self.KeyValuePair):
+ list.append(self, item)
+ elif isinstance(item, dict):
+ list.append(self, self.KeyValuePair(item))
+ else:
+ raise TypeError("The data passed for KeyValuepair "
+ "indexed %s has invalid format"
+ % keyvaluelist.index(item, 0,
+ len(keyvaluelist)))
+
+ def __len__(self):
+ return list.__len__(self)
+
+ def __delitem__(self, index):
+ list.__delitem__(self, index)
+
+ def insert(self, index, value):
+ if isinstance(value, self.KeyValuePair):
+ list.insert(self, index, value)
+ elif isinstance(value, dict):
+ list.insert(self, index, self.KeyValuePair(value))
else:
- self._key = None
- if "value" in data:
- self._value = data["value"]
+ raise TypeError("The data passed for KeyValuePair "
+ "has invalid format")
+
+ def append(self, value):
+ if isinstance(value, self.KeyValuePair):
+ list.append(self, value)
+ elif isinstance(value, dict):
+ list.append(self, self.KeyValuePair(value))
else:
- self._value = None
- if "uri" in data:
- self._uri = data["uri"]
+ raise TypeError("The data passed for KeyValuePair "
+ "has invalid format")
+
+ def __setitem__(self, index, value):
+ if isinstance(value, self.KeyValuePair):
+ list.__setitem__(self, index, value)
+ elif isinstance(value, dict):
+ list.__setitem__(self, index, self.KeyValuePair(value))
else:
- self._uri = None
+ raise TypeError("The data passed for KeyValuePair "
+ "has invalid format")
- @property
- def key(self):
- return getattr(self, "_key", None)
+ def __getitem__(self, index):
+ return list.__getitem__(self, index)
- @key.setter
- def key(self, inKey):
- if not isinstance(inKey, str):
- raise TypeError("the key must be of type string")
- else:
- self._key = inKey
+ class KeyValuePair(dict):
+ """
+ Class representation of key-value pairs supported in fba-v3
- @property
- def value(self):
- return getattr(self, "_key", None)
+ Parameters
+ ----------
+ data : dict
+ A dictionary containing data about key-value pairs
+ {
+ "id" : "abc",
+ "name" : "abc",
+ "key" : "abc",
+ "value" : "abc",
+ "uri" : "abc"
+ }
- @value.setter
- def value(self, inValue):
- if not isinstance(inValue, str):
- raise TypeError("the value must be of type string")
- else:
- self._value = inValue
+ """
- @property
- def uri(self):
- return getattr(self, "_uri", None)
+ VALID_KEYS = ["id", "name", "key", "value", "uri"]
- @uri.setter
- def uri(self, inUri):
- if not isinstance(inUri, str):
- raise TypeError("the uri must be of type string")
- else:
- self._uri = inUri
+ def __init__(self, data={}):
+ for key, value in data.items():
+ if key not in self.VALID_KEYS:
+ raise ValueError("'%s' is not allowed. Only possible "
+ "keys are : 'id', 'name', 'key', "
+ "'value', 'uri'" % key)
+ if not isinstance(key, str):
+ raise TypeError("All keys must be of type string")
+ if not isinstance(value, str):
+ raise TypeError("All values must be of type string")
+ dict.__setitem__(self, key, value)
+ for key in self.VALID_KEYS:
+ if key not in data:
+ dict.__setitem__(self, key, None)
+
+ def __getitem__(self, key):
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'id', 'name', 'key',"
+ " 'value', 'uri'" % key)
+ return dict.__getitem__(self, key)
+
+ def __setitem__(self, key, value):
+ """Restricting the keys and values that can be set.
+ Only allowed keys are : 'id', 'name', 'key', 'value', 'uri''
+ """
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed"
+ " keys are : 'id', 'name', 'key',"
+ " 'value', 'uri'" % key)
+ if not isinstance(value, str):
+ raise TypeError("The value must be of type string")
+ dict.__setitem__(self, key, value)
+
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
+
+ def __iter__(self):
+ return dict.__iter__(self)
+
+ def __len__(self):
+ return dict.__len__(self)
+
+ def __contains__(self, x):
+ return dict.__contains__(self, x)
diff --git a/cobra/core/meta_data/metaData.py b/cobra/core/meta_data/metaData.py
index 498b3c873..8c84610be 100644
--- a/cobra/core/meta_data/metaData.py
+++ b/cobra/core/meta_data/metaData.py
@@ -4,7 +4,7 @@
from cobra.core.meta_data.cvTerm import CVTerm
from cobra.core.meta_data.history import History
-from cobra.core.meta_data.keyValuePair import KeyValuePair
+from cobra.core.meta_data.keyValuePair import ListOfKeyValue
class MetaData:
@@ -27,41 +27,40 @@ class MetaData:
def __init__(self, cvterm=None, history=None, listofKeyValue=None):
# setting the cvterm
- if isinstance(cvterm, CVTerm):
+ if cvterm is None:
+ self._cvTerms = CVTerm()
+ elif isinstance(cvterm, CVTerm):
self._cvTerms = cvterm
elif isinstance(cvterm, dict):
self._cvTerms = CVTerm(cvterm)
else:
- self._cvTerms = CVTerm()
+ raise TypeError("Invalid format passed for cvterm")
# setting the history of the component
- if isinstance(history, History):
+ if history is None:
+ self._history = History()
+ elif isinstance(history, History):
self._history = history
elif isinstance(history, dict):
if "creator" not in history:
- history["creator"] = {}
+ history["creator"] = []
if "created" not in history:
history["created"] = None
if "modified" not in history:
history["modified"] = []
- self._history = History(history["creator"], history["created"], history["modified"])
+ self._history = History(history["creator"],
+ history["created"], history["modified"])
else:
- self._history = History()
+ raise TypeError("Invalid format passed for history")
# setting the list of key-value pair
if listofKeyValue is not None:
- if isinstance(listofKeyValue, list):
- keyValue = []
- for item in listofKeyValue:
- if isinstance(item, dict):
- keyValue.append(KeyValuePair(item))
- if isinstance(item, KeyValuePair):
- keyValue.append(item)
- else:
- raise TypeError("Each entry of key-value pair must be a dict or KeyValuePair object")
- self.listofKeyValue = keyValue
+ if isinstance(listofKeyValue, ListOfKeyValue):
+ self._listofKeyValue = listofKeyValue
+ elif isinstance(listofKeyValue, list):
+ self._listofKeyValue = ListOfKeyValue(listofKeyValue)
else:
raise TypeError("Key value pairs must be passed in a list")
else:
- self.listofKeyValue = []
+ self._listofKeyValue = ListOfKeyValue()
@property
def cvTerms(self):
@@ -73,10 +72,10 @@ def cvTerms(self, value):
pass
elif isinstance(value, CVTerm):
self._cvTerms = value
- elif isinstance(cvterm, dict):
+ elif isinstance(value, dict):
self._cvTerms = CVTerm(cvterm)
else:
- raise TypeError("This passed format for cvterm is not acceptable")
+ raise TypeError("This passed format for cvterm is invalid")
@property
def history(self):
@@ -88,13 +87,30 @@ def history(self, value):
pass
elif isinstance(value, History):
self._history = value
- elif isinstance(history, dict):
+ elif isinstance(value, dict):
if "creator" not in history:
- history["creator"] = {}
+ history["creator"] = []
if "created" not in history:
history["created"] = None
if "modified" not in history:
history["modified"] = []
- self._history = History(value["creator"], value["created"], value["modified"])
+ self._history = History(value["creator"],
+ value["created"], value["modified"])
+ else:
+ raise TypeError("This passed format for history is invalid")
+
+ @property
+ def listofKeyValue(self):
+ return getattr(self, "_listofKeyValue", [])
+
+ @listofKeyValue.setter
+ def listofKeyValue(self, value):
+ if value == self._listofKeyValue:
+ pass
+ elif isinstance(value, ListOfKeyValue):
+ self._listofKeyValue = value
+ elif isinstance(value, list):
+ self._listofKeyValue = ListOfKeyValue(value)
else:
- raise TypeError("This passed format for history is not acceptable")
+ raise TypeError("This passed format for listofKeyValue is "
+ "invalid")
From 4ea5b3ee9ed05913ff2116a2d1e8dec951667d96 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 11 Jun 2020 13:08:22 +0530
Subject: [PATCH 05/76] modified classes to look exactly like dictionaries and
lists
---
cobra/core/meta_data/cvTerm.py | 8 +-
cobra/core/meta_data/history.py | 86 +++++++++++-------
cobra/core/meta_data/keyValuePair.py | 2 -
cobra/core/meta_data/metaData.py | 128 ++++++++++++++-------------
cobra/core/object.py | 15 +---
5 files changed, 131 insertions(+), 108 deletions(-)
diff --git a/cobra/core/meta_data/cvTerm.py b/cobra/core/meta_data/cvTerm.py
index 2a1a36c41..3b9ceb6de 100644
--- a/cobra/core/meta_data/cvTerm.py
+++ b/cobra/core/meta_data/cvTerm.py
@@ -177,8 +177,12 @@ def __setitem__(self, key, value):
raise TypeError("Resources must be put in a list")
dict.__setitem__(self, key, value)
elif key == 'nested_data':
- if not isinstance(value, CVTerm):
- raise TypeError("The value passed must be of type CVTerm.")
+ if isinstance(value, CVTerm):
+ dict.__setitem__(self, key, value)
+ elif isinstance(value, dict):
+ dict.__setitem__(self, key, CVTerm(value))
+ else:
+ raise TypeError("The value passed has invalid format.")
dict.__setitem__(self, key, value)
def __delitem__(self, key):
diff --git a/cobra/core/meta_data/history.py b/cobra/core/meta_data/history.py
index 5a11f9275..c8505e1d0 100644
--- a/cobra/core/meta_data/history.py
+++ b/cobra/core/meta_data/history.py
@@ -18,10 +18,11 @@ def validateDate(date_text):
return True
-class History:
+class History(dict):
"""
Class representation of history of a given component i.e. creator,
- created date and modification dates
+ created date and modification dates. It is basically an extended
+ dictionary with some restrictions
Parameters
----------
@@ -33,7 +34,7 @@ class History:
modified : list
A list of dates about the component modification
- Attributes
+ Allowed Keys
----------
creator : dict
A dictionary containong details of creator's name, email and
@@ -45,49 +46,72 @@ class History:
"""
+ VALID_KEYS = ["creators", "created", "modified"]
+
def __init__(self, creators=[], created=None, modified=[]):
if creators is None:
creators = []
- self._creators = self.ListOfCreators(creators)
+ dict.__setitem__(self, "creators", self.ListOfCreators(creators))
if isinstance(created, str):
validateDate(created)
- self._created = created
+ dict.__setitem__(self, "created", created)
elif created is None:
- self._created = None
+ dict.__setitem__(self, "created", None)
else:
raise TypeError('Only None and string types are possible for '
'"created" date attribute')
if modified is None:
modified = []
- self._modified = self.ModifiedHistory(modified)
-
- @property
- def creators(self):
- return self._creators
-
- @creators.setter
- def creators(self, creators_list):
- self._creators = self.ListOfCreators(creators_list)
+ dict.__setitem__(self, "modified", self.ModifiedHistory(modified))
+
+ def __getitem__(self, key):
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'creators', 'created', 'modified'"
+ % key)
+ return dict.__getitem__(self, key)
+
+ def __setitem__(self, key, value):
+ """Restricting the keys and values that can be set.
+ Only allowed keys are : 'id', 'name', 'key', 'value', 'uri''
+ """
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed"
+ " keys are : 'id', 'name', 'key',"
+ " 'value', 'uri'" % key)
+ if key == "creators":
+ if isinstance(value, self.ListOfCreators):
+ dict.__setitem__(self, key, value)
+ elif isinstance(value, list):
+ dict.__setitem__(self, key, self.ListOfCreators(value))
+ else:
+ raise TypeError("The passed format for creators is invalid")
+ elif key == "created":
+ if not isinstance(value, str):
+ raise TypeError("The date passed must be a string")
+ else:
+ validateDate(value)
+ dict.__setitem__(self, key, value)
+ elif key == "modified":
+ if isinstance(value, self.ModifiedHistory):
+ dict.__setitem__(self, key, value)
+ elif isinstance(value, list):
+ dict.__setitem__(self, key, self.ModifiedHistory(value))
+ else:
+ raise TypeError("The passed format for modification"
+ " history is invalid")
- @property
- def created(self):
- return self._created
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
- @created.setter
- def created(self, value):
- if not isinstance(value, str):
- raise TypeError("The date passed must be a string")
- else:
- validateDate(value)
- self._created = value
+ def __iter__(self):
+ return dict.__iter__(self)
- @property
- def modified(self):
- return self._modified
+ def __len__(self):
+ return dict.__len__(self)
- @modified.setter
- def modified(self, value):
- self._modified = self.ModifiedHistory(value)
+ def __contains__(self, x):
+ return dict.__contains__(self, x)
class ListOfCreators(list):
"""A list extension to store each creator's info
diff --git a/cobra/core/meta_data/keyValuePair.py b/cobra/core/meta_data/keyValuePair.py
index 0930e4b1f..a54765d60 100644
--- a/cobra/core/meta_data/keyValuePair.py
+++ b/cobra/core/meta_data/keyValuePair.py
@@ -2,8 +2,6 @@
from __future__ import absolute_import
-from cobra.core.object import Object
-
class ListOfKeyValue(list):
"""A list extension to store key-value pairs
diff --git a/cobra/core/meta_data/metaData.py b/cobra/core/meta_data/metaData.py
index 8c84610be..c1d64fbdd 100644
--- a/cobra/core/meta_data/metaData.py
+++ b/cobra/core/meta_data/metaData.py
@@ -7,7 +7,7 @@
from cobra.core.meta_data.keyValuePair import ListOfKeyValue
-class MetaData:
+class MetaData(dict):
"""Class representation of the meta-data of the component.
It is a combination of three classes i.e CVTerm, History
and KeyValuePair class.
@@ -25,92 +25,100 @@ class MetaData:
"""
+ VALID_KEYS = ["sbo", "cvTerms", "history", "listofKeyValue"]
+
def __init__(self, cvterm=None, history=None, listofKeyValue=None):
# setting the cvterm
if cvterm is None:
- self._cvTerms = CVTerm()
+ dict.__setitem__(self, "cvTerms", CVTerm())
elif isinstance(cvterm, CVTerm):
- self._cvTerms = cvterm
+ dict.__setitem__(self, "cvTerms", cvterm)
elif isinstance(cvterm, dict):
- self._cvTerms = CVTerm(cvterm)
+ dict.__setitem__(self, "cvTerms", CVTerm(cvterm))
else:
raise TypeError("Invalid format passed for cvterm")
# setting the history of the component
if history is None:
- self._history = History()
+ dict.__setitem__(self, "history", History())
elif isinstance(history, History):
- self._history = history
+ dict.__setitem__(self, "history", history)
elif isinstance(history, dict):
- if "creator" not in history:
- history["creator"] = []
+ if "creators" not in history:
+ history["creators"] = []
if "created" not in history:
history["created"] = None
if "modified" not in history:
history["modified"] = []
- self._history = History(history["creator"],
- history["created"], history["modified"])
+ dict.__setitem__(self, "history", History(history["creators"],
+ history["created"],
+ history["modified"]))
else:
raise TypeError("Invalid format passed for history")
# setting the list of key-value pair
if listofKeyValue is not None:
if isinstance(listofKeyValue, ListOfKeyValue):
- self._listofKeyValue = listofKeyValue
+ dict.__setitem__(self, "listofKeyValue", listofKeyValue)
elif isinstance(listofKeyValue, list):
- self._listofKeyValue = ListOfKeyValue(listofKeyValue)
+ dict.__setitem__(self, "listofKeyValue",
+ ListOfKeyValue(listofKeyValue))
else:
raise TypeError("Key value pairs must be passed in a list")
else:
- self._listofKeyValue = ListOfKeyValue()
+ dict.__setitem__(self, "listofKeyValue", ListOfKeyValue())
- @property
- def cvTerms(self):
- return getattr(self, "_cvTerms", None)
+ def __getitem__(self, key):
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'sbo', 'cvTerms', 'history', "
+ "'listofKeyValue'" % key)
+ return dict.__getitem__(self, key)
- @cvTerms.setter
- def cvTerms(self, value):
- if value == self._cvTerms:
- pass
- elif isinstance(value, CVTerm):
- self._cvTerms = value
- elif isinstance(value, dict):
- self._cvTerms = CVTerm(cvterm)
- else:
- raise TypeError("This passed format for cvterm is invalid")
+ def __setitem__(self, key, value):
+ """Restricting the keys and values that can be set.
+ Only allowed keys are : 'sbo', 'cvTerms', 'history',
+ 'listofKeyValue'
+ """
+ if key not in self.VALID_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'sbo', 'cvTerms', 'history', "
+ "'listofKeyValue'" % key)
+ if key == "cvTerms":
+ if isinstance(value, CVTerm):
+ dict.__setitem__(self, "cvTerms", value)
+ elif isinstance(value, dict):
+ dict.__setitem__(self, "cvTerms", CVTerm(value))
+ else:
+ raise TypeError("This passed format for cvterm is invalid")
+ elif key == "history":
+ if isinstance(history, History):
+ dict.__setitem__(self, "history", history)
+ elif isinstance(history, dict):
+ if "creators" not in history:
+ history["creators"] = []
+ if "created" not in history:
+ history["created"] = None
+ if "modified" not in history:
+ history["modified"] = []
+ dict.__setitem__(self, "history", History(history["creators"],
+ history["created"],
+ history["modified"]))
+ elif key == "listofKeyValue":
+ if isinstance(listofKeyValue, ListOfKeyValue):
+ dict.__setitem__(self, "listofKeyValue", listofKeyValue)
+ elif isinstance(listofKeyValue, list):
+ dict.__setitem__(self, "listofKeyValue",
+ ListOfKeyValue(listofKeyValue))
+ else:
+ raise TypeError("Key value pairs must be passed in a list")
- @property
- def history(self):
- return getattr(self, "_history", None)
+ def __delitem__(self, key):
+ dict.__delitem__(self, key)
- @history.setter
- def history(self, value):
- if value == self._history:
- pass
- elif isinstance(value, History):
- self._history = value
- elif isinstance(value, dict):
- if "creator" not in history:
- history["creator"] = []
- if "created" not in history:
- history["created"] = None
- if "modified" not in history:
- history["modified"] = []
- self._history = History(value["creator"],
- value["created"], value["modified"])
- else:
- raise TypeError("This passed format for history is invalid")
+ def __iter__(self):
+ return dict.__iter__(self)
- @property
- def listofKeyValue(self):
- return getattr(self, "_listofKeyValue", [])
+ def __len__(self):
+ return dict.__len__(self)
- @listofKeyValue.setter
- def listofKeyValue(self, value):
- if value == self._listofKeyValue:
- pass
- elif isinstance(value, ListOfKeyValue):
- self._listofKeyValue = value
- elif isinstance(value, list):
- self._listofKeyValue = ListOfKeyValue(value)
- else:
- raise TypeError("This passed format for listofKeyValue is "
- "invalid")
+ def __contains__(self, x):
+ return dict.__contains__(self, x)
diff --git a/cobra/core/object.py b/cobra/core/object.py
index c96906ed2..dc3007016 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -3,7 +3,7 @@
from __future__ import absolute_import
from six import string_types
-
+from cobra.core.meta_data import MetaData
class Object(object):
"""Defines common behavior of object in cobra.core"""
@@ -20,7 +20,7 @@ def __init__(self, id=None, name=""):
self.name = name
self.notes = {}
- self._annotation = {}
+ self.annotation = MetaData()
@property
def id(self):
@@ -40,17 +40,6 @@ def id(self, value):
def _set_id_with_model(self, value):
self._id = value
- @property
- def annotation(self):
- return self._annotation
-
- @annotation.setter
- def annotation(self, annotation):
- if not isinstance(annotation, dict):
- raise TypeError("Annotation must be a dict")
- else:
- self._annotation = annotation
-
def __getstate__(self):
"""To prevent excessive replication during deepcopy."""
state = self.__dict__.copy()
From 7795ea6dbfd3be0089b4ef79e8b677cb431186b2 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 11 Jun 2020 13:15:38 +0530
Subject: [PATCH 06/76] modified imports and incorporated SBO term in metadata
---
cobra/core/__init__.py | 6 +++---
cobra/core/meta_data/metaData.py | 2 ++
cobra/core/object.py | 2 ++
3 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/cobra/core/__init__.py b/cobra/core/__init__.py
index a52915fbb..f3cfc8d5e 100644
--- a/cobra/core/__init__.py
+++ b/cobra/core/__init__.py
@@ -5,12 +5,12 @@
from cobra.core.configuration import Configuration
from cobra.core.dictlist import DictList
from cobra.core.gene import Gene
+from cobra.core.group import Group
+from cobra.core.meta_data import *
from cobra.core.metabolite import Metabolite
from cobra.core.model import Model
from cobra.core.object import Object
from cobra.core.reaction import Reaction
-from cobra.core.group import Group
-from cobra.core.solution import Solution, LegacySolution, get_solution
+from cobra.core.solution import LegacySolution, Solution, get_solution
from cobra.core.species import Species
from cobra.core.summary import MetaboliteSummary, ReactionSummary, Summary
-from cobra.core.meta_data import *
diff --git a/cobra/core/meta_data/metaData.py b/cobra/core/meta_data/metaData.py
index c1d64fbdd..7c36eedfc 100644
--- a/cobra/core/meta_data/metaData.py
+++ b/cobra/core/meta_data/metaData.py
@@ -110,6 +110,8 @@ def __setitem__(self, key, value):
ListOfKeyValue(listofKeyValue))
else:
raise TypeError("Key value pairs must be passed in a list")
+ elif key == "sbo":
+ dict.__setitem__(self, "sbo", value)
def __delitem__(self, key):
dict.__delitem__(self, key)
diff --git a/cobra/core/object.py b/cobra/core/object.py
index dc3007016..731d2db94 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -3,8 +3,10 @@
from __future__ import absolute_import
from six import string_types
+
from cobra.core.meta_data import MetaData
+
class Object(object):
"""Defines common behavior of object in cobra.core"""
From 02345bb487938c228096cfee791c02a289de9d30 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Sat, 13 Jun 2020 09:51:13 +0530
Subject: [PATCH 07/76] made the classed to inherit from MutableSequence and
MutableMapping
---
cobra/core/__init__.py | 2 +-
cobra/core/meta_data/__init__.py | 8 -
cobra/core/metadata/__init__.py | 8 +
.../cvTerm.py => metadata/cvterm.py} | 142 ++++++++++++------
cobra/core/{meta_data => metadata}/history.py | 133 +++++++++-------
.../keyvaluepair.py} | 65 +++++---
.../metaData.py => metadata/metadata.py} | 68 +++++----
cobra/core/object.py | 2 +-
8 files changed, 263 insertions(+), 165 deletions(-)
delete mode 100644 cobra/core/meta_data/__init__.py
create mode 100644 cobra/core/metadata/__init__.py
rename cobra/core/{meta_data/cvTerm.py => metadata/cvterm.py} (54%)
rename cobra/core/{meta_data => metadata}/history.py (70%)
rename cobra/core/{meta_data/keyValuePair.py => metadata/keyvaluepair.py} (71%)
rename cobra/core/{meta_data/metaData.py => metadata/metadata.py} (64%)
diff --git a/cobra/core/__init__.py b/cobra/core/__init__.py
index f3cfc8d5e..58a5ee3f9 100644
--- a/cobra/core/__init__.py
+++ b/cobra/core/__init__.py
@@ -6,7 +6,7 @@
from cobra.core.dictlist import DictList
from cobra.core.gene import Gene
from cobra.core.group import Group
-from cobra.core.meta_data import *
+from cobra.core.metadata import *
from cobra.core.metabolite import Metabolite
from cobra.core.model import Model
from cobra.core.object import Object
diff --git a/cobra/core/meta_data/__init__.py b/cobra/core/meta_data/__init__.py
deleted file mode 100644
index 173d65d52..000000000
--- a/cobra/core/meta_data/__init__.py
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-from __future__ import absolute_import
-
-from cobra.core.meta_data.metaData import MetaData
-from cobra.core.meta_data.cvTerm import CVTerm
-from cobra.core.meta_data.history import History
-from cobra.core.meta_data.keyValuePair import ListOfKeyValue
diff --git a/cobra/core/metadata/__init__.py b/cobra/core/metadata/__init__.py
new file mode 100644
index 000000000..f464dddd9
--- /dev/null
+++ b/cobra/core/metadata/__init__.py
@@ -0,0 +1,8 @@
+
+
+from __future__ import absolute_import
+
+from cobra.core.metadata.cvterm import CVTerm
+from cobra.core.metadata.history import History
+from cobra.core.metadata.keyvaluepair import ListOfKeyValue
+from cobra.core.metadata.metadata import MetaData
diff --git a/cobra/core/meta_data/cvTerm.py b/cobra/core/metadata/cvterm.py
similarity index 54%
rename from cobra/core/meta_data/cvTerm.py
rename to cobra/core/metadata/cvterm.py
index 3b9ceb6de..05c0dd797 100644
--- a/cobra/core/meta_data/cvTerm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -7,8 +7,10 @@
from __future__ import absolute_import
+from collections.abc import MutableMapping, MutableSequence
-class CVTerm(dict):
+
+class CVTerm(MutableMapping):
"""
Class representation of Controlled Vocabulary term inside Annotation.
It will look similar to a dictionary, but will have restrictions on the
@@ -17,7 +19,8 @@ class CVTerm(dict):
Parameters
----------
cvterm : dict
- A dictionary that maps the provider to its corresponding CVList
+ A dictionary type structure that maps the provider to its
+ corresponding CVList
Attributes
----------
@@ -25,7 +28,10 @@ class CVTerm(dict):
"""
- def __init__(self, cvterm={}):
+ def __init__(self, cvterm=None):
+ if cvterm is None:
+ cvterm = {}
+ self._mapping = dict()
if not isinstance(cvterm, dict):
raise TypeError("The annotation data must be in a dict form")
else:
@@ -33,12 +39,15 @@ def __init__(self, cvterm={}):
if not isinstance(key, str):
raise TypeError("the provider must be of type string")
if isinstance(value, list):
- dict.__setitem__(self, key, self.CVList(value))
+ self._mapping[key] = self.CVList(value)
+ elif isinstance(value, self.CVList):
+ self._mapping[key] = value
else:
- dict.__setitem__(self, key, value)
+ raise TypeError("the value passed for key '%s' "
+ "has invalid format" % key)
def __getitem__(self, key):
- return dict.__getitem__(self, key)
+ return self._mapping[key]
def __setitem__(self, key, value):
"""Make sure that key passed is of type string and value
@@ -47,25 +56,28 @@ def __setitem__(self, key, value):
if not isinstance(key, str):
raise TypeError("The key passed must be a string")
if isinstance(value, list):
- dict.__setitem__(self, key, self.CVList(value))
+ self._mapping[key] = self.CVList(value)
elif isinstance(value, self.CVList):
- dict.__setitem__(self, key, value)
+ self._mapping[key] = key, value
else:
raise TypeError("The value passed does not confirm to CVList type")
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
- class CVList(list):
+ class CVList(MutableSequence):
"""
Class representation of all sets of resources and their nested
annotation corresponding to a given qualifier. It have similar
@@ -79,37 +91,52 @@ class CVList(list):
"""
- def __init__(self, cvlist=[]):
+ def __init__(self, cvlist=None):
+ if cvlist is None:
+ cvlist = []
+ self._sequence = list()
if not isinstance(cvlist, list):
raise TypeError("The resources passed must be inside a list")
for item in cvlist:
if isinstance(item, CVTerm.ExternalResources):
- list.append(self, item)
+ self._sequence.append(item)
elif isinstance(item, dict):
- list.append(self, CVTerm.ExternalResources(item))
+ self._sequence.append(CVTerm.ExternalResources(item))
else:
raise TypeError("All items must confirm to "
"ExternalResources structure")
def __len__(self):
- return list.__len__(self)
+ return len(self._sequence)
def __delitem__(self, index):
- list.__delitem__(self, index)
+ del self._sequence[index]
def insert(self, index, value):
- list.insert(self, index, CVTerm.ExternalResources(value))
+ self._sequence.insert(index, CVTerm.ExternalResources(value))
def append(self, value):
- list.append(self, CVTerm.ExternalResources(value))
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence.append(value)
+ elif isinstance(value, dict):
+ self._sequence.append(CVTerm.ExternalResources(value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
def __setitem__(self, index, value):
- list.__setitem__(self, index, CVTerm.ExternalResources(value))
+ self._sequence[index] = CVTerm.ExternalResources(value)
def __getitem__(self, index):
- return list.__getitem__(self, index)
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
- class ExternalResources(dict):
+ class ExternalResources(MutableMapping):
"""
Class representation of a single set of resources and its nested
annotation. Its a special type of dict with restricted keys and
@@ -133,36 +160,47 @@ class ExternalResources(dict):
"""
- ANNOTATION_KEYS = ['resources', 'nested_data']
+ ANNOTATION_KEYS = ['resources', 'nested_data', 'qualifier_type']
+ QUALIFIER_RELATION = ['MODEL', 'BIOLOGICAL', 'UNKNOWN']
- def __init__(self, data={}):
- self._resources = []
- self._nested_data = None
+ def __init__(self, data=None):
+ if data is None:
+ data = {}
+ self._mapping = dict()
if not isinstance(data, dict):
raise TypeError("The value passed must be of type dict.")
for key, value in data.items():
if key not in self.ANNOTATION_KEYS:
raise ValueError("Key '%s' is not allowed. Only "
- "allowed keys are 'resource', "
+ "allowed keys are 'resources', "
"'nested_data'." % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
- dict.__setitem__(self, key, value)
- if key == 'nested_data':
+ self._mapping[key] = value
+ elif key == 'nested_data':
if isinstance(value, CVTerm):
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif isinstance(value, dict):
- dict.__setitem__(self, key, CVTerm(value))
+ self._mapping[key] = CVTerm(value)
else:
raise TypeError("The nested data structure does "
"not have valid CVTerm format")
+ elif key == "qualifier_type":
+ if not isinstance(value, int):
+ raise TypeError("The value passed for qualifier type "
+ "must be an integer")
+ if value == 0 or value == 1:
+ self._mapping[key] = self.QUALIFIER_RELATION[value]
+ else:
+ self._mapping[key] = self.QUALIFIER_RELATION[2]
def __getitem__(self, key):
if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed keys are"
- " 'resources', 'nested_data'." % key)
- return dict.__getitem__(self, key)
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'qualifier_type', 'resources', "
+ "'nested_data'" % key)
+ return self._mapping[key]
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
@@ -170,29 +208,39 @@ def __setitem__(self, key, value):
"""
if key not in self.ANNOTATION_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
- "keys are 'resources', 'nested_data'."
- % key)
+ "keys are : 'qualifier_type', 'resources', "
+ "'nested_data'" % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif key == 'nested_data':
if isinstance(value, CVTerm):
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif isinstance(value, dict):
- dict.__setitem__(self, key, CVTerm(value))
+ self._mapping[key] = CVTerm(value)
else:
raise TypeError("The value passed has invalid format.")
- dict.__setitem__(self, key, value)
+ elif key == "qualifier_type":
+ if not isinstance(value, int):
+ raise TypeError("The value passed for qualifier type "
+ "must be an integer")
+ if value == 0 or value == 1:
+ self._mapping[key] = self.QUALIFIER_RELATION[value]
+ else:
+ self._mapping[key] = self.QUALIFIER_RELATION[2]
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
diff --git a/cobra/core/meta_data/history.py b/cobra/core/metadata/history.py
similarity index 70%
rename from cobra/core/meta_data/history.py
rename to cobra/core/metadata/history.py
index c8505e1d0..032ae0249 100644
--- a/cobra/core/meta_data/history.py
+++ b/cobra/core/metadata/history.py
@@ -3,6 +3,7 @@
from __future__ import absolute_import
import datetime
+from collections.abc import MutableMapping, MutableSequence
# The possible keys inside creator dict
@@ -18,7 +19,7 @@ def validateDate(date_text):
return True
-class History(dict):
+class History(MutableMapping):
"""
Class representation of history of a given component i.e. creator,
created date and modification dates. It is basically an extended
@@ -48,28 +49,29 @@ class History(dict):
VALID_KEYS = ["creators", "created", "modified"]
- def __init__(self, creators=[], created=None, modified=[]):
+ def __init__(self, creators=None, created=None, modified=None):
if creators is None:
creators = []
- dict.__setitem__(self, "creators", self.ListOfCreators(creators))
+ if modified is None:
+ modified = []
+ self._mapping = dict()
+ self._mapping["creators"] = self.ListOfCreators(creators)
if isinstance(created, str):
validateDate(created)
- dict.__setitem__(self, "created", created)
+ self._mapping["created"] = created
elif created is None:
- dict.__setitem__(self, "created", None)
+ self._mapping["created"] = None
else:
raise TypeError('Only None and string types are possible for '
'"created" date attribute')
- if modified is None:
- modified = []
- dict.__setitem__(self, "modified", self.ModifiedHistory(modified))
+ self._mapping["modified"] = self.ModifiedHistory(modified)
def __getitem__(self, key):
if key not in self.VALID_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
"keys are : 'creators', 'created', 'modified'"
% key)
- return dict.__getitem__(self, key)
+ return self._mapping[key]
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
@@ -81,9 +83,9 @@ def __setitem__(self, key, value):
" 'value', 'uri'" % key)
if key == "creators":
if isinstance(value, self.ListOfCreators):
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif isinstance(value, list):
- dict.__setitem__(self, key, self.ListOfCreators(value))
+ self._mapping[key] = self.ListOfCreators(value)
else:
raise TypeError("The passed format for creators is invalid")
elif key == "created":
@@ -91,29 +93,32 @@ def __setitem__(self, key, value):
raise TypeError("The date passed must be a string")
else:
validateDate(value)
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif key == "modified":
if isinstance(value, self.ModifiedHistory):
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
elif isinstance(value, list):
- dict.__setitem__(self, key, self.ModifiedHistory(value))
+ self._mapping[key] = self.ModifiedHistory(value)
else:
raise TypeError("The passed format for modification"
" history is invalid")
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
- class ListOfCreators(list):
+ class ListOfCreators(MutableSequence):
"""A list extension to store each creator's info
Parameters
@@ -121,16 +126,19 @@ class ListOfCreators(list):
creators : list containing info about creators
"""
- def __init__(self, creators=[]):
+ def __init__(self, creators=None):
+ if creators is None:
+ creators = []
+ self._sequence = list()
if not isinstance(creators, list):
raise TypeError("The data passed for creators must be "
"inside a list")
else:
for item in creators:
if isinstance(item, History.Creator):
- list.append(self, item)
+ self._sequence.append(item)
elif isinstance(item, dict):
- list.append(self, History.Creator(item))
+ self._sequence.append(History.Creator(item))
else:
raise TypeError("The data passed for creator "
"indexed %s has invalid format"
@@ -138,39 +146,45 @@ def __init__(self, creators=[]):
len(creators)))
def __len__(self):
- return list.__len__(self)
+ return len(self._sequence)
def __delitem__(self, index):
- list.__delitem__(self, index)
+ del self._sequence[index]
def insert(self, index, value):
if isinstance(value, History.Creator):
- list.insert(self, index, value)
+ self._sequence.insert(index, value)
elif isinstance(value, dict):
- list.insert(self, index, History.Creator(value))
+ self._sequence.insert(index, History.Creator(value))
else:
raise TypeError("The data passed has invalid format")
def append(self, value):
if isinstance(value, History.Creator):
- list.append(self, value)
+ self._sequence.append(value)
elif isinstance(value, dict):
- list.append(self, History.Creator(value))
+ self._sequence.append(History.Creator(value))
else:
raise TypeError("The data passed has invalid format")
def __setitem__(self, index, value):
if isinstance(value, History.Creator):
- list.__setitem__(self, index, value)
+ self._sequence[index] = value
elif isinstance(value, dict):
- list.__setitem__(self, index, History.Creator(value))
+ self._sequence[index] = History.Creator(value)
else:
raise TypeError("The data passed has invalid format")
def __getitem__(self, index):
- return list.__getitem__(self, index)
+ return self._sequence[index]
- class Creator(dict):
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
+
+ class Creator(MutableMapping):
"""A dictionary extension to store basic info of this component
creator
@@ -185,26 +199,29 @@ class Creator(dict):
}
"""
- def __init__(self, creator_dict={}):
+ def __init__(self, creator_dict=None):
+ if creator_dict is None:
+ creator_dict = {}
+ self._mapping = dict()
if not isinstance(creator_dict, dict):
raise TypeError("The value passed for creator must "
"be of type dict.")
for key in CREATOR_KEYS:
if key not in creator_dict:
- dict.__setitem__(self, key, None)
+ self._mapping[key] = None
else:
if not isinstance(creator_dict[key], str):
raise TypeError("All the values passed must "
"be of type string.")
else:
- dict.__setitem__(self, key, creator_dict[key])
+ self._mapping[key] = creator_dict[key]
def __getitem__(self, key):
if key not in CREATOR_KEYS:
raise ValueError("Key %s is not allowed. only allowed "
"keys are 'first_name', 'last_name', "
"'email', 'organization_name'." % key)
- return dict.__getitem__(self, key)
+ return self._mapping[key]
def __setitem__(self, key, value):
if key not in CREATOR_KEYS:
@@ -213,21 +230,24 @@ def __setitem__(self, key, value):
"'email', 'organization_name'." % key)
if not isinstance(value, str):
raise TypeError("Value passed must be of type string.")
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
- class ModifiedHistory(list):
+ class ModifiedHistory(MutableSequence):
"""A list extension to store modification dates. Only Restricted
type of entries are possible.
@@ -237,32 +257,41 @@ class ModifiedHistory(list):
8601 format
"""
- def __init__(self, modifiedList=[]):
+ def __init__(self, modifiedList=None):
+ if modifiedList is None:
+ modifiedList = []
+ self._sequence = list()
if not isinstance(modifiedList, list):
raise TypeError("The dates passed must be inside a list")
for item in modifiedList:
if not isinstance(item, str):
raise ValueError("Each date must be of type string")
validateDate(item)
- list.append(self, item)
+ self._sequence.append(item)
def __len__(self):
- return list.__len__(self)
+ return len(self._sequence)
def __delitem__(self, index):
- list.__delitem__(self, index)
+ del self._sequence[index]
def insert(self, index, value):
validateDate(value)
- list.insert(self, index, value)
+ self._sequence.insert(index, value)
def append(self, value):
validateDate(value)
- list.append(self, value)
+ self._sequence.append(value)
def __setitem__(self, index, value):
validateDate(value)
- list.__setitem__(self, index, value)
+ self._sequence[index] = value
def __getitem__(self, index):
- return list.__getitem__(self, index)
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
diff --git a/cobra/core/meta_data/keyValuePair.py b/cobra/core/metadata/keyvaluepair.py
similarity index 71%
rename from cobra/core/meta_data/keyValuePair.py
rename to cobra/core/metadata/keyvaluepair.py
index a54765d60..fede7f5fe 100644
--- a/cobra/core/meta_data/keyValuePair.py
+++ b/cobra/core/metadata/keyvaluepair.py
@@ -2,8 +2,10 @@
from __future__ import absolute_import
+from collections.abc import MutableMapping, MutableSequence
-class ListOfKeyValue(list):
+
+class ListOfKeyValue(MutableSequence):
"""A list extension to store key-value pairs
Parameters
@@ -11,16 +13,19 @@ class ListOfKeyValue(list):
creators : list key-value pair data
"""
- def __init__(self, keyvaluelist=[]):
+ def __init__(self, keyvaluelist=None):
+ if keyvaluelist is None:
+ keyvaluelist = []
+ self._sequence = list()
if not isinstance(keyvaluelist, list):
raise TypeError("The data passed for ListOfKeyValue "
"must be inside a list")
else:
for item in keyvaluelist:
if isinstance(item, self.KeyValuePair):
- list.append(self, item)
+ self._sequence.append(item)
elif isinstance(item, dict):
- list.append(self, self.KeyValuePair(item))
+ self._sequence.append(self.KeyValuePair(item))
else:
raise TypeError("The data passed for KeyValuepair "
"indexed %s has invalid format"
@@ -28,42 +33,48 @@ def __init__(self, keyvaluelist=[]):
len(keyvaluelist)))
def __len__(self):
- return list.__len__(self)
+ return len(self._sequence)
def __delitem__(self, index):
- list.__delitem__(self, index)
+ del self._sequence[index]
def insert(self, index, value):
if isinstance(value, self.KeyValuePair):
- list.insert(self, index, value)
+ self._sequence.insert(index, value)
elif isinstance(value, dict):
- list.insert(self, index, self.KeyValuePair(value))
+ self._sequence.insert(index, self.KeyValuePair(value))
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format")
def append(self, value):
if isinstance(value, self.KeyValuePair):
- list.append(self, value)
+ self._sequence.append(value)
elif isinstance(value, dict):
- list.append(self, self.KeyValuePair(value))
+ self._sequence.append(self.KeyValuePair(value))
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format")
def __setitem__(self, index, value):
if isinstance(value, self.KeyValuePair):
- list.__setitem__(self, index, value)
+ self._sequence[index] = value
elif isinstance(value, dict):
- list.__setitem__(self, index, self.KeyValuePair(value))
+ self._sequence[index] = self.KeyValuePair(value)
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format")
def __getitem__(self, index):
- return list.__getitem__(self, index)
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
- class KeyValuePair(dict):
+ def __repr__(self):
+ return '{}'.format(self._sequence)
+
+ class KeyValuePair(MutableMapping):
"""
Class representation of key-value pairs supported in fba-v3
@@ -83,7 +94,10 @@ class KeyValuePair(dict):
VALID_KEYS = ["id", "name", "key", "value", "uri"]
- def __init__(self, data={}):
+ def __init__(self, data=None):
+ if data is None:
+ data = {}
+ self._mapping = dict()
for key, value in data.items():
if key not in self.VALID_KEYS:
raise ValueError("'%s' is not allowed. Only possible "
@@ -93,17 +107,17 @@ def __init__(self, data={}):
raise TypeError("All keys must be of type string")
if not isinstance(value, str):
raise TypeError("All values must be of type string")
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
for key in self.VALID_KEYS:
if key not in data:
- dict.__setitem__(self, key, None)
+ self._mapping[key] = None
def __getitem__(self, key):
if key not in self.VALID_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
"keys are : 'id', 'name', 'key',"
" 'value', 'uri'" % key)
- return dict.__getitem__(self, key)
+ return self._mapping[key]
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
@@ -115,16 +129,19 @@ def __setitem__(self, key, value):
" 'value', 'uri'" % key)
if not isinstance(value, str):
raise TypeError("The value must be of type string")
- dict.__setitem__(self, key, value)
+ self._mapping[key] = value
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
diff --git a/cobra/core/meta_data/metaData.py b/cobra/core/metadata/metadata.py
similarity index 64%
rename from cobra/core/meta_data/metaData.py
rename to cobra/core/metadata/metadata.py
index 7c36eedfc..2a246b4f3 100644
--- a/cobra/core/meta_data/metaData.py
+++ b/cobra/core/metadata/metadata.py
@@ -2,12 +2,14 @@
from __future__ import absolute_import
-from cobra.core.meta_data.cvTerm import CVTerm
-from cobra.core.meta_data.history import History
-from cobra.core.meta_data.keyValuePair import ListOfKeyValue
+from collections.abc import MutableMapping
+from cobra.core.metadata.cvterm import CVTerm
+from cobra.core.metadata.history import History
+from cobra.core.metadata.keyvaluepair import ListOfKeyValue
-class MetaData(dict):
+
+class MetaData(MutableMapping):
"""Class representation of the meta-data of the component.
It is a combination of three classes i.e CVTerm, History
and KeyValuePair class.
@@ -28,20 +30,21 @@ class MetaData(dict):
VALID_KEYS = ["sbo", "cvTerms", "history", "listofKeyValue"]
def __init__(self, cvterm=None, history=None, listofKeyValue=None):
+ self._mapping = dict()
# setting the cvterm
if cvterm is None:
- dict.__setitem__(self, "cvTerms", CVTerm())
+ self._mapping["cvTerms"] = CVTerm()
elif isinstance(cvterm, CVTerm):
- dict.__setitem__(self, "cvTerms", cvterm)
+ self._mapping["cvTerms"] = cvterm
elif isinstance(cvterm, dict):
- dict.__setitem__(self, "cvTerms", CVTerm(cvterm))
+ self._mapping["cvTerms"] = CVTerm(cvterm)
else:
raise TypeError("Invalid format passed for cvterm")
# setting the history of the component
if history is None:
- dict.__setitem__(self, "history", History())
+ self._mapping["history"] = History()
elif isinstance(history, History):
- dict.__setitem__(self, "history", history)
+ self._mapping["history"] = history
elif isinstance(history, dict):
if "creators" not in history:
history["creators"] = []
@@ -49,29 +52,28 @@ def __init__(self, cvterm=None, history=None, listofKeyValue=None):
history["created"] = None
if "modified" not in history:
history["modified"] = []
- dict.__setitem__(self, "history", History(history["creators"],
- history["created"],
- history["modified"]))
+ self._mapping["history"] = History(history["creators"],
+ history["created"],
+ history["modified"])
else:
raise TypeError("Invalid format passed for history")
# setting the list of key-value pair
if listofKeyValue is not None:
if isinstance(listofKeyValue, ListOfKeyValue):
- dict.__setitem__(self, "listofKeyValue", listofKeyValue)
+ self._mapping["listofKeyValue"] = listofKeyValue
elif isinstance(listofKeyValue, list):
- dict.__setitem__(self, "listofKeyValue",
- ListOfKeyValue(listofKeyValue))
+ self._mapping["listofKeyValue"] = ListOfKeyValue(listofKeyValue)
else:
raise TypeError("Key value pairs must be passed in a list")
else:
- dict.__setitem__(self, "listofKeyValue", ListOfKeyValue())
+ self._mapping["listofKeyValue"] = ListOfKeyValue()
def __getitem__(self, key):
if key not in self.VALID_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
"keys are : 'sbo', 'cvTerms', 'history', "
"'listofKeyValue'" % key)
- return dict.__getitem__(self, key)
+ return self._mapping[key]
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
@@ -84,14 +86,14 @@ def __setitem__(self, key, value):
"'listofKeyValue'" % key)
if key == "cvTerms":
if isinstance(value, CVTerm):
- dict.__setitem__(self, "cvTerms", value)
+ self._mapping["cvTerms"] = value
elif isinstance(value, dict):
- dict.__setitem__(self, "cvTerms", CVTerm(value))
+ self._mapping["cvTerms"] = CVTerm(value)
else:
raise TypeError("This passed format for cvterm is invalid")
elif key == "history":
if isinstance(history, History):
- dict.__setitem__(self, "history", history)
+ self._mapping["history"] = history
elif isinstance(history, dict):
if "creators" not in history:
history["creators"] = []
@@ -99,28 +101,30 @@ def __setitem__(self, key, value):
history["created"] = None
if "modified" not in history:
history["modified"] = []
- dict.__setitem__(self, "history", History(history["creators"],
- history["created"],
- history["modified"]))
+ self._mapping["history"] = History(history["creators"],
+ history["created"],
+ history["modified"])
elif key == "listofKeyValue":
if isinstance(listofKeyValue, ListOfKeyValue):
- dict.__setitem__(self, "listofKeyValue", listofKeyValue)
+ self._mapping["listofKeyValue"] = listofKeyValue
elif isinstance(listofKeyValue, list):
- dict.__setitem__(self, "listofKeyValue",
- ListOfKeyValue(listofKeyValue))
+ self._mapping["listofKeyValue"] = ListOfKeyValue(listofKeyValue)
else:
raise TypeError("Key value pairs must be passed in a list")
elif key == "sbo":
- dict.__setitem__(self, "sbo", value)
+ self._mapping["sbo"] = value
def __delitem__(self, key):
- dict.__delitem__(self, key)
+ del self._mapping[key]
def __iter__(self):
- return dict.__iter__(self)
+ return iter(self._mapping)
def __len__(self):
- return dict.__len__(self)
+ return len(self._mapping)
+
+ def __str__(self):
+ return str(self._mapping)
- def __contains__(self, x):
- return dict.__contains__(self, x)
+ def __repr__(self):
+ return '{}'.format(self._mapping)
diff --git a/cobra/core/object.py b/cobra/core/object.py
index 731d2db94..1a87e60a5 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -4,7 +4,7 @@
from six import string_types
-from cobra.core.meta_data import MetaData
+from cobra.core.metadata import MetaData
class Object(object):
From 4c6c1ca33f26e30e93b9e0e377da5d4ea671981f Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Mon, 15 Jun 2020 20:02:04 +0530
Subject: [PATCH 08/76] adding backward compatibility
---
cobra/core/metadata/cvterm.py | 95 +++++++++++++++++++++++++++++----
cobra/core/metadata/metadata.py | 56 ++++++++++---------
2 files changed, 115 insertions(+), 36 deletions(-)
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 05c0dd797..9c2f80984 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -7,9 +7,15 @@
from __future__ import absolute_import
+import re
+import warnings
from collections.abc import MutableMapping, MutableSequence
+URL_IDENTIFIERS_PATTERN = re.compile(
+ r"^https?://identifiers.org/(.+?)[:/](.+)")
+
+
class CVTerm(MutableMapping):
"""
Class representation of Controlled Vocabulary term inside Annotation.
@@ -28,10 +34,11 @@ class CVTerm(MutableMapping):
"""
- def __init__(self, cvterm=None):
+ def __init__(self, metadata=None, cvterm=None):
if cvterm is None:
cvterm = {}
self._mapping = dict()
+ self.metadata = metadata
if not isinstance(cvterm, dict):
raise TypeError("The annotation data must be in a dict form")
else:
@@ -39,7 +46,7 @@ def __init__(self, cvterm=None):
if not isinstance(key, str):
raise TypeError("the provider must be of type string")
if isinstance(value, list):
- self._mapping[key] = self.CVList(value)
+ self._mapping[key] = self.CVList(self.metadata, key, value)
elif isinstance(value, self.CVList):
self._mapping[key] = value
else:
@@ -56,9 +63,9 @@ def __setitem__(self, key, value):
if not isinstance(key, str):
raise TypeError("The key passed must be a string")
if isinstance(value, list):
- self._mapping[key] = self.CVList(value)
+ self._mapping[key] = self.CVList(self.metadata, key, value)
elif isinstance(value, self.CVList):
- self._mapping[key] = key, value
+ self._mapping[key] = value
else:
raise TypeError("The value passed does not confirm to CVList type")
@@ -91,17 +98,24 @@ class CVList(MutableSequence):
"""
- def __init__(self, cvlist=None):
+ def __init__(self, metadata=None, qualifier_key=None, cvlist=None):
if cvlist is None:
cvlist = []
+ if qualifier_key is None:
+ self._qualifier_key = "is"
+ elif not isinstance(qualifier_key, str):
+ raise ("The qualifier key passed must be of type string")
+ else:
+ self._qualifier_key = qualifier_key
self._sequence = list()
+ self.metadata = metadata
if not isinstance(cvlist, list):
raise TypeError("The resources passed must be inside a list")
for item in cvlist:
if isinstance(item, CVTerm.ExternalResources):
self._sequence.append(item)
elif isinstance(item, dict):
- self._sequence.append(CVTerm.ExternalResources(item))
+ self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, item))
else:
raise TypeError("All items must confirm to "
"ExternalResources structure")
@@ -113,19 +127,31 @@ def __delitem__(self, index):
del self._sequence[index]
def insert(self, index, value):
- self._sequence.insert(index, CVTerm.ExternalResources(value))
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence.insert(index, value)
+ elif isinstance(value, dict):
+ self._sequence.insert(index, CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
def append(self, value):
if isinstance(value, CVTerm.ExternalResources):
self._sequence.append(value)
elif isinstance(value, dict):
- self._sequence.append(CVTerm.ExternalResources(value))
+ self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
else:
raise TypeError("The passed format for setting external"
" resources is invalid.")
def __setitem__(self, index, value):
- self._sequence[index] = CVTerm.ExternalResources(value)
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence[index] = value
+ elif isinstance(value, dict):
+ self._sequence[index] = CVTerm.ExternalResources(self.metadata, self._qualifier_key, value)
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
def __getitem__(self, index):
return self._sequence[index]
@@ -163,10 +189,17 @@ class ExternalResources(MutableMapping):
ANNOTATION_KEYS = ['resources', 'nested_data', 'qualifier_type']
QUALIFIER_RELATION = ['MODEL', 'BIOLOGICAL', 'UNKNOWN']
- def __init__(self, data=None):
+ def __init__(self, metadata=None, qualifier_key=None, data=None):
if data is None:
data = {}
+ if qualifier_key is None:
+ self.qualifier_key = "is"
+ elif not isinstance(qualifier_key, str):
+ raise TypeError("The qualifier key passed must be of type string")
+ else:
+ self.qualifier_key = qualifier_key
self._mapping = dict()
+ self.metadata = metadata
if not isinstance(data, dict):
raise TypeError("The value passed must be of type dict.")
for key, value in data.items():
@@ -178,6 +211,8 @@ def __init__(self, data=None):
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
self._mapping[key] = value
+ for items in value:
+ self.set_annotation(items)
elif key == 'nested_data':
if isinstance(value, CVTerm):
self._mapping[key] = value
@@ -214,6 +249,8 @@ def __setitem__(self, key, value):
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
self._mapping[key] = value
+ for items in value:
+ set_annotation(items)
elif key == 'nested_data':
if isinstance(value, CVTerm):
self._mapping[key] = value
@@ -244,3 +281,41 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._mapping)
+
+ def set_annotation(self, resource=None):
+ if resource is None:
+ return
+ else:
+ data = self._parse_annotation_info(resource)
+ if data is None:
+ return
+ else:
+ provider, identifier = data
+ self.metadata["annotation"][provider].append((self.qualifier_key, identifier))
+
+ def _parse_annotation_info(self, uri):
+ """Parses provider and term from given identifiers annotation uri.
+
+ Parameters
+ ----------
+ uri : str
+ uri (identifiers.org url)
+
+ Returns
+ -------
+ (provider, identifier) if resolvable, None otherwise
+ """
+ match = URL_IDENTIFIERS_PATTERN.match(uri)
+ if match:
+ provider, identifier = match.group(1), match.group(2)
+ if provider.isupper():
+ identifier = "%s:%s" % (provider, identifier)
+ provider = provider.lower()
+ else:
+ print("WARNING : %s does not conform to "
+ "'http(s)://identifiers.org/collection/id' or"
+ "'http(s)://identifiers.org/COLLECTION:id, so "
+ "is not added to annotation dictionary." % uri)
+ return None
+
+ return provider, identifier
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index 2a246b4f3..bfc93aada 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -2,6 +2,7 @@
from __future__ import absolute_import
+from collections import defaultdict
from collections.abc import MutableMapping
from cobra.core.metadata.cvterm import CVTerm
@@ -21,23 +22,24 @@ class MetaData(MutableMapping):
history : dict, History
The history is holding the data about the creator,
created and modified dates.
- listofKeyValue : list
+ listofkeyvalue : list
Some key-value pairs which are not suitable to be
represented anywhere else in the model.
"""
- VALID_KEYS = ["sbo", "cvTerms", "history", "listofKeyValue"]
+ VALID_KEYS = ["sbo", "cvterms", "history", "listofkeyvalue", "annotation"]
- def __init__(self, cvterm=None, history=None, listofKeyValue=None):
+ def __init__(self, cvterm=None, history=None, listofkeyvalue=None):
self._mapping = dict()
+ self._mapping["annotation"] = defaultdict(list)
# setting the cvterm
if cvterm is None:
- self._mapping["cvTerms"] = CVTerm()
+ self._mapping["cvterms"] = CVTerm(self, None)
elif isinstance(cvterm, CVTerm):
- self._mapping["cvTerms"] = cvterm
+ self._mapping["cvterms"] = cvterm
elif isinstance(cvterm, dict):
- self._mapping["cvTerms"] = CVTerm(cvterm)
+ self._mapping["cvterms"] = CVTerm(self, cvterm)
else:
raise TypeError("Invalid format passed for cvterm")
# setting the history of the component
@@ -58,37 +60,37 @@ def __init__(self, cvterm=None, history=None, listofKeyValue=None):
else:
raise TypeError("Invalid format passed for history")
# setting the list of key-value pair
- if listofKeyValue is not None:
- if isinstance(listofKeyValue, ListOfKeyValue):
- self._mapping["listofKeyValue"] = listofKeyValue
- elif isinstance(listofKeyValue, list):
- self._mapping["listofKeyValue"] = ListOfKeyValue(listofKeyValue)
+ if listofkeyvalue is not None:
+ if isinstance(listofkeyvalue, ListOfKeyValue):
+ self._mapping["listofkeyvalue"] = listofkeyvalue
+ elif isinstance(listofkeyvalue, list):
+ self._mapping["listofkeyvalue"] = ListOfKeyValue(listofkeyvalue)
else:
raise TypeError("Key value pairs must be passed in a list")
else:
- self._mapping["listofKeyValue"] = ListOfKeyValue()
+ self._mapping["listofkeyvalue"] = ListOfKeyValue()
def __getitem__(self, key):
if key not in self.VALID_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'sbo', 'cvTerms', 'history', "
- "'listofKeyValue'" % key)
+ "keys are : 'sbo', 'cvterms', 'history', "
+ "'listofkeyvalue', 'annotation'" % key)
return self._mapping[key]
def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
- Only allowed keys are : 'sbo', 'cvTerms', 'history',
- 'listofKeyValue'
+ Only allowed keys are : 'sbo', 'cvterms', 'history',
+ 'listofkeyvalue'
"""
if key not in self.VALID_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'sbo', 'cvTerms', 'history', "
- "'listofKeyValue'" % key)
- if key == "cvTerms":
+ "keys are : 'sbo', 'cvterms', 'history', "
+ "'listofkeyvalue', 'annotation'" % key)
+ if key == "cvterms":
if isinstance(value, CVTerm):
- self._mapping["cvTerms"] = value
+ self._mapping["cvterms"] = value
elif isinstance(value, dict):
- self._mapping["cvTerms"] = CVTerm(value)
+ self._mapping["cvterms"] = CVTerm(self, value)
else:
raise TypeError("This passed format for cvterm is invalid")
elif key == "history":
@@ -104,15 +106,17 @@ def __setitem__(self, key, value):
self._mapping["history"] = History(history["creators"],
history["created"],
history["modified"])
- elif key == "listofKeyValue":
- if isinstance(listofKeyValue, ListOfKeyValue):
- self._mapping["listofKeyValue"] = listofKeyValue
- elif isinstance(listofKeyValue, list):
- self._mapping["listofKeyValue"] = ListOfKeyValue(listofKeyValue)
+ elif key == "listofkeyvalue":
+ if isinstance(listofkeyvalue, ListOfKeyValue):
+ self._mapping["listofkeyvalue"] = listofkeyvalue
+ elif isinstance(listofkeyvalue, list):
+ self._mapping["listofkeyvalue"] = ListOfKeyValue(listofkeyvalue)
else:
raise TypeError("Key value pairs must be passed in a list")
elif key == "sbo":
self._mapping["sbo"] = value
+ elif key == "annotation":
+ self._mapping["annotation"] = value
def __delitem__(self, key):
del self._mapping[key]
From ff72c5575622a12aff1df0fcac03d6b2c96b8bd4 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Mon, 15 Jun 2020 21:32:14 +0530
Subject: [PATCH 09/76] added instance
---
cobra/core/metadata/instance.py | 10 ++++++++++
1 file changed, 10 insertions(+)
create mode 100644 cobra/core/metadata/instance.py
diff --git a/cobra/core/metadata/instance.py b/cobra/core/metadata/instance.py
new file mode 100644
index 000000000..07290ab78
--- /dev/null
+++ b/cobra/core/metadata/instance.py
@@ -0,0 +1,10 @@
+from cobra.core.metadata import *
+meta = MetaData()
+meta["cvterms"] = {"is":[{"resources":["http://identifiers.org/chebi/CHEBI:17847"]}]}
+print(meta["annotation"])
+print(meta["annotation"]["chebi"])
+meta["cvterms"]["isDescribedBy"] = [{"resources":["https://identifiers.org/pubmed/1111111", "https://identifiers.org/pubmed/111321"]}]
+print(meta["annotation"])
+meta["cvterms"]["is"].append({"resources":["https://identifiers.org/pubmed/1111111", "https://identifiers.org/pubmed/111321"]})
+print(meta["annotation"])
+meta["cvterms"]["is"].append({"resources":["https://someotherurl.org/pubmed/1111111"]})
From 989ffe42126c2041b2ae6fe949a990455ad0946a Mon Sep 17 00:00:00 2001
From: Matthias Koenig
Date: Mon, 15 Jun 2020 19:14:43 +0200
Subject: [PATCH 10/76] work on annotation structure
---
cobra/core/metadata/cvterm.py | 496 ++++++++++++-----------
cobra/core/metadata/examples/__init__.py | 0
cobra/core/metadata/examples/instance.py | 51 +++
cobra/core/metadata/history.py | 15 +
cobra/core/metadata/instance.py | 10 -
cobra/core/metadata/keyvaluepair.py | 18 +
cobra/core/metadata/metadata.py | 125 ++----
cobra/core/object.py | 10 +-
8 files changed, 371 insertions(+), 354 deletions(-)
create mode 100644 cobra/core/metadata/examples/__init__.py
create mode 100644 cobra/core/metadata/examples/instance.py
delete mode 100644 cobra/core/metadata/instance.py
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 9c2f80984..e1b3e78fa 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -4,41 +4,81 @@
Define the Controlled Vocabulary term class for refering to external
resources
"""
-
from __future__ import absolute_import
import re
import warnings
from collections.abc import MutableMapping, MutableSequence
-
+from enum import Enum
+
+
+class Qualifier(Enum):
+ bqb_is = 1
+ bqb_hasPart = 2
+ bqb_isPartOf = 3
+ bqb_isVersionOf = 4
+ bqb_hasVersion = 5
+ bqb_isHomologTo = 6
+ bqb_isDescribedBy = 7
+ bqb_isEncodedBy = 8
+ bqb_encodes = 9
+ bqb_occursIn = 10
+ bqb_hasProperty = 11
+ bqb_isPropertyOf = 12
+ bqb_hasTaxon = 13
+ bqb_unknown = 14
+ bqm_is = 15
+ bqm_isDescribedBy = 16
+ bqm_isDerivedFrom = 17
+ bqm_isInstanceOf = 18
+ bqm_hasInstance = 19
+ bqm_unknown = 20
URL_IDENTIFIERS_PATTERN = re.compile(
r"^https?://identifiers.org/(.+?)[:/](.+)")
-class CVTerm(MutableMapping):
- """
- Class representation of Controlled Vocabulary term inside Annotation.
- It will look similar to a dictionary, but will have restrictions on the
- type of keys and values
+class CVTerm(object):
+ """ Representation of a single CVTerm."""
+ def __init__(self, qualifier: Qualifier=Qualifier.bqb_is, uri: str = None):
+ self.qualifier = qualifier
+ self.uri = uri
- Parameters
- ----------
- cvterm : dict
- A dictionary type structure that maps the provider to its
- corresponding CVList
+ def parse_provider_identifier(self):
+ """Parses provider and term from given identifiers annotation uri.
- Attributes
- ----------
- The providers are set as keys for accessing their CVLists
+ Parameters
+ ----------
+ uri : str
+ uri (identifiers.org url)
- """
+ Returns
+ -------
+ (provider, identifier) if resolvable, None otherwise
+ """
+ match = URL_IDENTIFIERS_PATTERN.match(self.uri)
+ if match:
+ provider, identifier = match.group(1), match.group(2)
+ if provider.isupper():
+ identifier = "%s:%s" % (provider, identifier)
+ provider = provider.lower()
+ else:
+ print("WARNING : %s does not conform to "
+ "'http(s)://identifiers.org/collection/id' or"
+ "'http(s)://identifiers.org/COLLECTION:id, so "
+ "is not added to annotation dictionary." % uri)
+ return None
- def __init__(self, metadata=None, cvterm=None):
- if cvterm is None:
- cvterm = {}
- self._mapping = dict()
- self.metadata = metadata
+ return provider, identifier
+
+class CVTerms(object):
+ """Representation of all CVTerms of an object in their dependency structure. """
+
+ def __init__(self, data):
+ self._cvterms = {}
+ # FIXME: implement with code below
+
+ # FIXME: refactor
if not isinstance(cvterm, dict):
raise TypeError("The annotation data must be in a dict form")
else:
@@ -53,21 +93,126 @@ def __init__(self, metadata=None, cvterm=None):
raise TypeError("the value passed for key '%s' "
"has invalid format" % key)
+ @staticmethod
+ def parse_cvterms(data) -> 'CVTerms':
+ """Tries to parse the CVterms."""
+ if data is None:
+ return CVTerms(None)
+ elif isinstance(data, CVTerms):
+ return data
+ elif isinstance(data, dict):
+ return CVTerms(data)
+ else:
+ raise TypeError("Invalid format for CVTerms: '{}'".format(data))
+
+
+class ExternalResources(MutableMapping):
+ """
+ Class representation of a single set of resources and its nested
+ annotation. Its a special type of dict with restricted keys and
+ values
+
+ Parameters
+ ----------
+ data : dict
+ A dictionary containing the resources and nested annotation
+ {
+ "resources" : [],
+ "nested_data" : CVTerm
+ }
+
+ Allowed Keys
+ ----------
+ "resources" : string
+ for accessing the mapped resources
+ "nested_data" : string
+ for accessing the nested annotation data
+
+ """
+
+
+
+
+ ANNOTATION_KEYS = ['resources', 'nested_data', 'qualifier_type']
+ QUALIFIER_RELATION = ['MODEL', 'BIOLOGICAL', 'UNKNOWN']
+
+ def __init__(self, metadata=None, qualifier_key=None, data=None):
+ if data is None:
+ data = {}
+ if qualifier_key is None:
+ self.qualifier_key = "is"
+ elif not isinstance(qualifier_key, str):
+ raise TypeError("The qualifier key passed must be of type string")
+ else:
+ self.qualifier_key = qualifier_key
+ self._mapping = dict()
+ self.metadata = metadata
+ if not isinstance(data, dict):
+ raise TypeError("The value passed must be of type dict.")
+ for key, value in data.items():
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key '%s' is not allowed. Only "
+ "allowed keys are 'resources', "
+ "'nested_data'." % key)
+ if key == 'resources':
+ if not isinstance(value, list):
+ raise TypeError("Resources must be put in a list")
+ self._mapping[key] = value
+ for items in value:
+ self.set_annotation(items)
+ elif key == 'nested_data':
+ if isinstance(value, CVTerm):
+ self._mapping[key] = value
+ elif isinstance(value, dict):
+ self._mapping[key] = CVTerm(value)
+ else:
+ raise TypeError("The nested data structure does "
+ "not have valid CVTerm format")
+ elif key == "qualifier_type":
+ if not isinstance(value, int):
+ raise TypeError("The value passed for qualifier type "
+ "must be an integer")
+ if value == 0 or value == 1:
+ self._mapping[key] = self.QUALIFIER_RELATION[value]
+ else:
+ self._mapping[key] = self.QUALIFIER_RELATION[2]
+
def __getitem__(self, key):
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'qualifier_type', 'resources', "
+ "'nested_data'" % key)
return self._mapping[key]
def __setitem__(self, key, value):
- """Make sure that key passed is of type string and value
- passed confirms to CVList type (CVList or list)
+ """Restricting the keys and values that can be set.
+ Only allowed keys are 'resources' and 'nested_data'
"""
- if not isinstance(key, str):
- raise TypeError("The key passed must be a string")
- if isinstance(value, list):
- self._mapping[key] = self.CVList(self.metadata, key, value)
- elif isinstance(value, self.CVList):
+ if key not in self.ANNOTATION_KEYS:
+ raise ValueError("Key %s is not allowed. Only allowed "
+ "keys are : 'qualifier_type', 'resources', "
+ "'nested_data'" % key)
+ if key == 'resources':
+ if not isinstance(value, list):
+ raise TypeError("Resources must be put in a list")
self._mapping[key] = value
- else:
- raise TypeError("The value passed does not confirm to CVList type")
+ for items in value:
+ set_annotation(items)
+ elif key == 'nested_data':
+ if isinstance(value, CVTerm):
+ self._mapping[key] = value
+ elif isinstance(value, dict):
+ self._mapping[key] = CVTerm(value)
+ else:
+ raise TypeError("The value passed has invalid format.")
+ elif key == "qualifier_type":
+ if not isinstance(value, int):
+ raise TypeError("The value passed for qualifier type "
+ "must be an integer")
+ if value == 0 or value == 1:
+ self._mapping[key] = self.QUALIFIER_RELATION[value]
+ else:
+ self._mapping[key] = self.QUALIFIER_RELATION[2]
def __delitem__(self, key):
del self._mapping[key]
@@ -84,238 +229,99 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._mapping)
- class CVList(MutableSequence):
- """
- Class representation of all sets of resources and their nested
- annotation corresponding to a given qualifier. It have similar
- structure like that of a list but has only restricted type of
- entries (of type ExternalResources) within it
-
- Parameters
- ----------
- cvlist : list
- a list containing entries confirming to ExternalResources structure
-
- """
-
- def __init__(self, metadata=None, qualifier_key=None, cvlist=None):
- if cvlist is None:
- cvlist = []
- if qualifier_key is None:
- self._qualifier_key = "is"
- elif not isinstance(qualifier_key, str):
- raise ("The qualifier key passed must be of type string")
+ def set_annotation(self, resource=None):
+ if resource is None:
+ return
+ else:
+ data = self._parse_annotation_info(resource)
+ if data is None:
+ return
else:
- self._qualifier_key = qualifier_key
- self._sequence = list()
- self.metadata = metadata
- if not isinstance(cvlist, list):
- raise TypeError("The resources passed must be inside a list")
- for item in cvlist:
- if isinstance(item, CVTerm.ExternalResources):
- self._sequence.append(item)
- elif isinstance(item, dict):
- self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, item))
- else:
- raise TypeError("All items must confirm to "
- "ExternalResources structure")
+ provider, identifier = data
+ self.metadata["annotation"][provider].append((self.qualifier_key, identifier))
- def __len__(self):
- return len(self._sequence)
- def __delitem__(self, index):
- del self._sequence[index]
- def insert(self, index, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence.insert(index, value)
- elif isinstance(value, dict):
- self._sequence.insert(index, CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
- else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
+class CVList(MutableSequence):
+ """
+ Class representation of all sets of resources and their nested
+ annotation corresponding to a given qualifier. It have similar
+ structure like that of a list but has only restricted type of
+ entries (of type ExternalResources) within it
- def append(self, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence.append(value)
- elif isinstance(value, dict):
- self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
- else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
+ Parameters
+ ----------
+ cvlist : list
+ a list containing entries confirming to ExternalResources structure
- def __setitem__(self, index, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence[index] = value
- elif isinstance(value, dict):
- self._sequence[index] = CVTerm.ExternalResources(self.metadata, self._qualifier_key, value)
+ """
+ def __init__(self, metadata=None, qualifier_key=None, cvlist=None):
+ if cvlist is None:
+ cvlist = []
+ if qualifier_key is None:
+ self._qualifier_key = "is"
+ elif not isinstance(qualifier_key, str):
+ raise ("The qualifier key passed must be of type string")
+ else:
+ self._qualifier_key = qualifier_key
+ self._sequence = list()
+ self.metadata = metadata
+ if not isinstance(cvlist, list):
+ raise TypeError("The resources passed must be inside a list")
+ for item in cvlist:
+ if isinstance(item, CVTerm.ExternalResources):
+ self._sequence.append(item)
+ elif isinstance(item, dict):
+ self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, item))
else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
+ raise TypeError("All items must confirm to "
+ "ExternalResources structure")
- def __getitem__(self, index):
- return self._sequence[index]
-
- def __str__(self):
- return str(self._sequence)
-
- def __repr__(self):
- return '{}'.format(self._sequence)
+ def __len__(self):
+ return len(self._sequence)
- class ExternalResources(MutableMapping):
- """
- Class representation of a single set of resources and its nested
- annotation. Its a special type of dict with restricted keys and
- values
+ def __delitem__(self, index):
+ del self._sequence[index]
- Parameters
- ----------
- data : dict
- A dictionary containing the resources and nested annotation
- {
- "resources" : [],
- "nested_data" : CVTerm
- }
-
- Allowed Keys
- ----------
- "resources" : string
- for accessing the mapped resources
- "nested_data" : string
- for accessing the nested annotation data
+ def insert(self, index, value):
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence.insert(index, value)
+ elif isinstance(value, dict):
+ self._sequence.insert(index, CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
+
+ def append(self, value):
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence.append(value)
+ elif isinstance(value, dict):
+ self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
+
+ def __setitem__(self, index, value):
+ if isinstance(value, CVTerm.ExternalResources):
+ self._sequence[index] = value
+ elif isinstance(value, dict):
+ self._sequence[index] = CVTerm.ExternalResources(self.metadata, self._qualifier_key, value)
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
- """
+ def __getitem__(self, index):
+ return self._sequence[index]
- ANNOTATION_KEYS = ['resources', 'nested_data', 'qualifier_type']
- QUALIFIER_RELATION = ['MODEL', 'BIOLOGICAL', 'UNKNOWN']
+ def __str__(self):
+ return str(self._sequence)
- def __init__(self, metadata=None, qualifier_key=None, data=None):
- if data is None:
- data = {}
- if qualifier_key is None:
- self.qualifier_key = "is"
- elif not isinstance(qualifier_key, str):
- raise TypeError("The qualifier key passed must be of type string")
- else:
- self.qualifier_key = qualifier_key
- self._mapping = dict()
- self.metadata = metadata
- if not isinstance(data, dict):
- raise TypeError("The value passed must be of type dict.")
- for key, value in data.items():
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key '%s' is not allowed. Only "
- "allowed keys are 'resources', "
- "'nested_data'." % key)
- if key == 'resources':
- if not isinstance(value, list):
- raise TypeError("Resources must be put in a list")
- self._mapping[key] = value
- for items in value:
- self.set_annotation(items)
- elif key == 'nested_data':
- if isinstance(value, CVTerm):
- self._mapping[key] = value
- elif isinstance(value, dict):
- self._mapping[key] = CVTerm(value)
- else:
- raise TypeError("The nested data structure does "
- "not have valid CVTerm format")
- elif key == "qualifier_type":
- if not isinstance(value, int):
- raise TypeError("The value passed for qualifier type "
- "must be an integer")
- if value == 0 or value == 1:
- self._mapping[key] = self.QUALIFIER_RELATION[value]
- else:
- self._mapping[key] = self.QUALIFIER_RELATION[2]
-
- def __getitem__(self, key):
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'qualifier_type', 'resources', "
- "'nested_data'" % key)
- return self._mapping[key]
-
- def __setitem__(self, key, value):
- """Restricting the keys and values that can be set.
- Only allowed keys are 'resources' and 'nested_data'
- """
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'qualifier_type', 'resources', "
- "'nested_data'" % key)
- if key == 'resources':
- if not isinstance(value, list):
- raise TypeError("Resources must be put in a list")
- self._mapping[key] = value
- for items in value:
- set_annotation(items)
- elif key == 'nested_data':
- if isinstance(value, CVTerm):
- self._mapping[key] = value
- elif isinstance(value, dict):
- self._mapping[key] = CVTerm(value)
- else:
- raise TypeError("The value passed has invalid format.")
- elif key == "qualifier_type":
- if not isinstance(value, int):
- raise TypeError("The value passed for qualifier type "
- "must be an integer")
- if value == 0 or value == 1:
- self._mapping[key] = self.QUALIFIER_RELATION[value]
- else:
- self._mapping[key] = self.QUALIFIER_RELATION[2]
+ def __repr__(self):
+ return '{}'.format(self._sequence)
- def __delitem__(self, key):
- del self._mapping[key]
- def __iter__(self):
- return iter(self._mapping)
- def __len__(self):
- return len(self._mapping)
- def __str__(self):
- return str(self._mapping)
- def __repr__(self):
- return '{}'.format(self._mapping)
- def set_annotation(self, resource=None):
- if resource is None:
- return
- else:
- data = self._parse_annotation_info(resource)
- if data is None:
- return
- else:
- provider, identifier = data
- self.metadata["annotation"][provider].append((self.qualifier_key, identifier))
-
- def _parse_annotation_info(self, uri):
- """Parses provider and term from given identifiers annotation uri.
-
- Parameters
- ----------
- uri : str
- uri (identifiers.org url)
-
- Returns
- -------
- (provider, identifier) if resolvable, None otherwise
- """
- match = URL_IDENTIFIERS_PATTERN.match(uri)
- if match:
- provider, identifier = match.group(1), match.group(2)
- if provider.isupper():
- identifier = "%s:%s" % (provider, identifier)
- provider = provider.lower()
- else:
- print("WARNING : %s does not conform to "
- "'http(s)://identifiers.org/collection/id' or"
- "'http(s)://identifiers.org/COLLECTION:id, so "
- "is not added to annotation dictionary." % uri)
- return None
- return provider, identifier
diff --git a/cobra/core/metadata/examples/__init__.py b/cobra/core/metadata/examples/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/cobra/core/metadata/examples/instance.py b/cobra/core/metadata/examples/instance.py
new file mode 100644
index 000000000..5c9904f79
--- /dev/null
+++ b/cobra/core/metadata/examples/instance.py
@@ -0,0 +1,51 @@
+from cobra.core.metadata import *
+from cobra.core.species import Species
+import pytest
+
+
+def test_annotation():
+ s = Species()
+ print(s.annotation)
+ s.annotation["chebi"] = ["1234", "23423432"]
+ s.annotation["sbo"] = ["SBO123"]
+ print(s.annotation)
+
+ assert "chebi" in s.annotation
+ assert "sbo" in s.annotation
+ assert len(s.annotation) == 2
+ for key in ["keys", "items", "values"]:
+ assert hasattr(s.annotation, key)
+
+ # assert 0 == 1
+
+
+def test_metadata():
+ s = Species()
+
+ meta = MetaData()
+
+ # history
+
+ # keyValuePair
+
+ # cvterms
+ meta["cvterms"] = {
+ "is": [{"resources": ["http://identifiers.org/chebi/CHEBI:17847"]}]}
+ print(meta["annotation"])
+ print(meta["annotation"]["chebi"])
+ meta["cvterms"]["isDescribedBy"] = [{"resources": [
+ "https://identifiers.org/pubmed/1111111",
+ "https://identifiers.org/pubmed/111321"]}]
+ meta["cvterms"]["is"].append({"resources": [
+ "https://identifiers.org/pubmed/1111111",
+ "https://identifiers.org/pubmed/111321"]})
+ print(meta["annotation"])
+ meta["cvterms"]["is"].append(
+ {"resources": ["https://someotherurl.org/pubmed/1111111"]})
+
+ s.annotation = meta
+
+# if __name__ == "__main__":
+ # example_metadata()
+ # example_annotation()
+# pass
diff --git a/cobra/core/metadata/history.py b/cobra/core/metadata/history.py
index 032ae0249..0782d07d0 100644
--- a/cobra/core/metadata/history.py
+++ b/cobra/core/metadata/history.py
@@ -118,6 +118,21 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._mapping)
+ @staticmethod
+ def parse_history(data) -> 'History':
+ if data is None:
+ return History()
+ elif isinstance(data, History):
+ return data
+ elif isinstance(data, dict):
+ for key in ["creators", "created", "modified"]:
+ if key not in data:
+ data[key] = None
+ return History(**data)
+ else:
+ raise TypeError("Invalid format for History: '{}'".format(data))
+
+
class ListOfCreators(MutableSequence):
"""A list extension to store each creator's info
diff --git a/cobra/core/metadata/instance.py b/cobra/core/metadata/instance.py
deleted file mode 100644
index 07290ab78..000000000
--- a/cobra/core/metadata/instance.py
+++ /dev/null
@@ -1,10 +0,0 @@
-from cobra.core.metadata import *
-meta = MetaData()
-meta["cvterms"] = {"is":[{"resources":["http://identifiers.org/chebi/CHEBI:17847"]}]}
-print(meta["annotation"])
-print(meta["annotation"]["chebi"])
-meta["cvterms"]["isDescribedBy"] = [{"resources":["https://identifiers.org/pubmed/1111111", "https://identifiers.org/pubmed/111321"]}]
-print(meta["annotation"])
-meta["cvterms"]["is"].append({"resources":["https://identifiers.org/pubmed/1111111", "https://identifiers.org/pubmed/111321"]})
-print(meta["annotation"])
-meta["cvterms"]["is"].append({"resources":["https://someotherurl.org/pubmed/1111111"]})
diff --git a/cobra/core/metadata/keyvaluepair.py b/cobra/core/metadata/keyvaluepair.py
index fede7f5fe..f9b74cf1d 100644
--- a/cobra/core/metadata/keyvaluepair.py
+++ b/cobra/core/metadata/keyvaluepair.py
@@ -4,6 +4,24 @@
from collections.abc import MutableMapping, MutableSequence
+class KeyValueDict(object):
+
+ def __init__(self, data):
+ self._keyValueDict = {} # FIXME: this is more complicated
+ # FIXME: implement with code below
+
+ @staticmethod
+ def parse_keyValueDict(data) -> 'KeyValueDict':
+ """Tries to parse the KeyValueDict."""
+ if data is None:
+ return KeyValueDict(None)
+ elif isinstance(data, KeyValueDict):
+ return data
+ elif isinstance(data, dict):
+ return KeyValueDict(data)
+ else:
+ raise TypeError("Invalid format for KeyValueDict: '{}'".format(data))
+
class ListOfKeyValue(MutableSequence):
"""A list extension to store key-value pairs
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index bfc93aada..f03ca3f24 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -5,130 +5,59 @@
from collections import defaultdict
from collections.abc import MutableMapping
-from cobra.core.metadata.cvterm import CVTerm
+from cobra.core.metadata.cvterm import CVTerms, CVTerm
from cobra.core.metadata.history import History
-from cobra.core.metadata.keyvaluepair import ListOfKeyValue
+from cobra.core.metadata.keyvaluepair import ListOfKeyValue, KeyValueDict
class MetaData(MutableMapping):
- """Class representation of the meta-data of the component.
- It is a combination of three classes i.e CVTerm, History
- and KeyValuePair class.
+ """Class representation of the meta-data of an object.
+
+ Meta-data consists of three components:
+ - CVTerms, storing resource:identifier annotation information (this is
+ exposed via the dict interface)
+ - History, storing the object history
+ - KeyValuePairs, a dictionary of optional information
Parameters
----------
- cvterm : dict, CVTerm
+ cvterms : dict or CVTerms object
The cvterm holds data for external resources
history : dict, History
The history is holding the data about the creator,
created and modified dates.
- listofkeyvalue : list
+ keyValueDict : dict or KeyValuePair
Some key-value pairs which are not suitable to be
represented anywhere else in the model.
-
"""
+ def __init__(self, cvterms: CVTerms = None, history: History = None,
+ keyValueDict: KeyValueDict = None):
+
+ self.cvterms = CVTerms.parse_cvterms(cvterms)
+ self.history = History.parse_history(history)
+ self.keyValueDict = KeyValueDict.parse_keyValueDict(keyValueDict)
- VALID_KEYS = ["sbo", "cvterms", "history", "listofkeyvalue", "annotation"]
-
- def __init__(self, cvterm=None, history=None, listofkeyvalue=None):
- self._mapping = dict()
- self._mapping["annotation"] = defaultdict(list)
- # setting the cvterm
- if cvterm is None:
- self._mapping["cvterms"] = CVTerm(self, None)
- elif isinstance(cvterm, CVTerm):
- self._mapping["cvterms"] = cvterm
- elif isinstance(cvterm, dict):
- self._mapping["cvterms"] = CVTerm(self, cvterm)
- else:
- raise TypeError("Invalid format passed for cvterm")
- # setting the history of the component
- if history is None:
- self._mapping["history"] = History()
- elif isinstance(history, History):
- self._mapping["history"] = history
- elif isinstance(history, dict):
- if "creators" not in history:
- history["creators"] = []
- if "created" not in history:
- history["created"] = None
- if "modified" not in history:
- history["modified"] = []
- self._mapping["history"] = History(history["creators"],
- history["created"],
- history["modified"])
- else:
- raise TypeError("Invalid format passed for history")
- # setting the list of key-value pair
- if listofkeyvalue is not None:
- if isinstance(listofkeyvalue, ListOfKeyValue):
- self._mapping["listofkeyvalue"] = listofkeyvalue
- elif isinstance(listofkeyvalue, list):
- self._mapping["listofkeyvalue"] = ListOfKeyValue(listofkeyvalue)
- else:
- raise TypeError("Key value pairs must be passed in a list")
- else:
- self._mapping["listofkeyvalue"] = ListOfKeyValue()
+ # internal dictionary of annotations for backwards compatibility
+ # for resources a list of identifiers is stored
+ self._annotations = defaultdict(list)
def __getitem__(self, key):
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'sbo', 'cvterms', 'history', "
- "'listofkeyvalue', 'annotation'" % key)
- return self._mapping[key]
+ return self._annotations[key]
def __setitem__(self, key, value):
- """Restricting the keys and values that can be set.
- Only allowed keys are : 'sbo', 'cvterms', 'history',
- 'listofkeyvalue'
- """
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'sbo', 'cvterms', 'history', "
- "'listofkeyvalue', 'annotation'" % key)
- if key == "cvterms":
- if isinstance(value, CVTerm):
- self._mapping["cvterms"] = value
- elif isinstance(value, dict):
- self._mapping["cvterms"] = CVTerm(self, value)
- else:
- raise TypeError("This passed format for cvterm is invalid")
- elif key == "history":
- if isinstance(history, History):
- self._mapping["history"] = history
- elif isinstance(history, dict):
- if "creators" not in history:
- history["creators"] = []
- if "created" not in history:
- history["created"] = None
- if "modified" not in history:
- history["modified"] = []
- self._mapping["history"] = History(history["creators"],
- history["created"],
- history["modified"])
- elif key == "listofkeyvalue":
- if isinstance(listofkeyvalue, ListOfKeyValue):
- self._mapping["listofkeyvalue"] = listofkeyvalue
- elif isinstance(listofkeyvalue, list):
- self._mapping["listofkeyvalue"] = ListOfKeyValue(listofkeyvalue)
- else:
- raise TypeError("Key value pairs must be passed in a list")
- elif key == "sbo":
- self._mapping["sbo"] = value
- elif key == "annotation":
- self._mapping["annotation"] = value
+ self._annotations[key].append(value)
def __delitem__(self, key):
- del self._mapping[key]
+ del self._annotations[key]
def __iter__(self):
- return iter(self._mapping)
+ return iter(self._annotations)
def __len__(self):
- return len(self._mapping)
+ return len(self._annotations)
def __str__(self):
- return str(self._mapping)
+ return str(self._annotations)
def __repr__(self):
- return '{}'.format(self._mapping)
+ return '{}'.format(self._annotations)
diff --git a/cobra/core/object.py b/cobra/core/object.py
index 1a87e60a5..d7c0ebea6 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -22,7 +22,7 @@ def __init__(self, id=None, name=""):
self.name = name
self.notes = {}
- self.annotation = MetaData()
+ self._annotation = MetaData() # {}
@property
def id(self):
@@ -42,6 +42,14 @@ def id(self, value):
def _set_id_with_model(self, value):
self._id = value
+ @property
+ def annotation(self):
+ return self._annotation
+
+ @annotation.setter
+ def annotation(self, annotation):
+ self._annotation = annotation
+
def __getstate__(self):
"""To prevent excessive replication during deepcopy."""
state = self.__dict__.copy()
From a4eb840ff599f579f950bbd3cca042deb5abfe81 Mon Sep 17 00:00:00 2001
From: Matthias Koenig
Date: Mon, 15 Jun 2020 19:19:39 +0200
Subject: [PATCH 11/76] adding json example
---
cobra/core/metadata/cvterm.py | 5 +++
cobra/core/metadata/examples/cvterms.json | 41 +++++++++++++++++++++++
2 files changed, 46 insertions(+)
create mode 100644 cobra/core/metadata/examples/cvterms.json
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index e1b3e78fa..41febb446 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -3,6 +3,11 @@
"""
Define the Controlled Vocabulary term class for refering to external
resources
+
+
+
+
+
"""
from __future__ import absolute_import
diff --git a/cobra/core/metadata/examples/cvterms.json b/cobra/core/metadata/examples/cvterms.json
new file mode 100644
index 000000000..31e97d321
--- /dev/null
+++ b/cobra/core/metadata/examples/cvterms.json
@@ -0,0 +1,41 @@
+cvterms = {
+ "hasPart" : [
+ {
+ "resources" : [
+ "https://identifiers.org/uniprot/P69905",
+ "https://www.uniprot.org/uniprot/P68871",
+ "https://identifiers.org/chebi/CHEBI:17627",
+ ],
+ "isDescribedBy" : [
+ {
+ "resources" : [
+ "https://identifiers.org/pubmed/1111111"
+ ]
+ },
+ {
+ "resources" : [
+ "https://identifiers.org/eco", "000000"
+ ]
+ }
+ ]
+ },
+ {
+ "resources" : [
+ ["https://identifiers.org/uniprot", "P69905"],
+ ["https://identifiers.org/uniprot", "P68871"],
+ ["https://identifiers.org/kegg.compound", "C00032"],
+ ]
+ },
+ ],
+
+ "hasVersion" : [
+ {
+ "resources" : [
+ "https://identifiers.org/uniprot/Q9UQM7",
+ "https://identifiers.org/uniprot", "Q13554"],
+ ]
+ "nested_data": [
+ ...
+ ]
+ }
+}
From cf38e029b3967f82e9daedde3746d84e709909d6 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Mon, 15 Jun 2020 22:56:29 +0530
Subject: [PATCH 12/76] fixed instance2
---
cobra/core/metadata/examples/cvterms.json | 79 ++++++++++++-----------
1 file changed, 41 insertions(+), 38 deletions(-)
diff --git a/cobra/core/metadata/examples/cvterms.json b/cobra/core/metadata/examples/cvterms.json
index 31e97d321..4391c4062 100644
--- a/cobra/core/metadata/examples/cvterms.json
+++ b/cobra/core/metadata/examples/cvterms.json
@@ -1,41 +1,44 @@
-cvterms = {
- "hasPart" : [
- {
- "resources" : [
- "https://identifiers.org/uniprot/P69905",
- "https://www.uniprot.org/uniprot/P68871",
- "https://identifiers.org/chebi/CHEBI:17627",
- ],
- "isDescribedBy" : [
- {
- "resources" : [
- "https://identifiers.org/pubmed/1111111"
- ]
- },
- {
- "resources" : [
- "https://identifiers.org/eco", "000000"
- ]
- }
+{
+ cvterms : {
+ "hasPart" : [
+ {
+ "resources" : [
+ "https://identifiers.org/uniprot/P69905",
+ "https://www.uniprot.org/uniprot/P68871",
+ "https://identifiers.org/chebi/CHEBI:17627",
+ ],
+ "isDescribedBy" : [
+ {
+ "resources" : [
+ "https://identifiers.org/pubmed/1111111"
+ ]
+ },
+ {
+ "resources" : [
+ "https://identifiers.org/eco/000000"
+ ]
+ }
+ ]
+ },
+ {
+ "resources" : [
+ "https://identifiers.org/uniprot/P69905",
+ "https://identifiers.org/uniprot/P68871",
+ "https://identifiers.org/kegg.compound/C00032",
+ ]
+ },
+ ],
+
+ "hasVersion" : [
+ {
+ "resources" : [
+ "https://identifiers.org/uniprot/Q9UQM7",
+ "https://identifiers.org/uniprot/Q13554"
]
- },
- {
- "resources" : [
- ["https://identifiers.org/uniprot", "P69905"],
- ["https://identifiers.org/uniprot", "P68871"],
- ["https://identifiers.org/kegg.compound", "C00032"],
+ "nested_data": [
+ ...
]
- },
- ],
-
- "hasVersion" : [
- {
- "resources" : [
- "https://identifiers.org/uniprot/Q9UQM7",
- "https://identifiers.org/uniprot", "Q13554"],
- ]
- "nested_data": [
- ...
- ]
- }
+ }
+ ]
+ }
}
From 7d490a4e580b754d738326b9904b2389939d78a5 Mon Sep 17 00:00:00 2001
From: Matthias Koenig
Date: Mon, 15 Jun 2020 20:01:55 +0200
Subject: [PATCH 13/76] work on cvterms
---
cobra/core/metadata/cvterm.py | 10 ++---
cobra/core/metadata/examples/cvterms.json | 44 -------------------
.../core/metadata/examples/cvterms_flat.json | 26 +++++++++++
.../metadata/examples/cvterms_nested.json | 30 +++++++++++++
.../{instance.py => metadata_example.py} | 38 ++++++++--------
cobra/core/metadata/examples/test_metadata.py | 18 ++++++++
cobra/core/metadata/metadata.py | 3 ++
cobra/core/object.py | 2 +-
8 files changed, 102 insertions(+), 69 deletions(-)
delete mode 100644 cobra/core/metadata/examples/cvterms.json
create mode 100644 cobra/core/metadata/examples/cvterms_flat.json
create mode 100644 cobra/core/metadata/examples/cvterms_nested.json
rename cobra/core/metadata/examples/{instance.py => metadata_example.py} (56%)
create mode 100644 cobra/core/metadata/examples/test_metadata.py
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 41febb446..3414a3ff0 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -4,10 +4,6 @@
Define the Controlled Vocabulary term class for refering to external
resources
-
-
-
-
"""
from __future__ import absolute_import
@@ -45,9 +41,9 @@ class Qualifier(Enum):
class CVTerm(object):
""" Representation of a single CVTerm."""
- def __init__(self, qualifier: Qualifier=Qualifier.bqb_is, uri: str = None):
+ def __init__(self, qualifier: Qualifier=Qualifier.bqb_is, resource: str = None):
self.qualifier = qualifier
- self.uri = uri
+ self.uri = resource
def parse_provider_identifier(self):
"""Parses provider and term from given identifiers annotation uri.
@@ -76,6 +72,7 @@ def parse_provider_identifier(self):
return provider, identifier
+
class CVTerms(object):
"""Representation of all CVTerms of an object in their dependency structure. """
@@ -111,6 +108,7 @@ def parse_cvterms(data) -> 'CVTerms':
raise TypeError("Invalid format for CVTerms: '{}'".format(data))
+
class ExternalResources(MutableMapping):
"""
Class representation of a single set of resources and its nested
diff --git a/cobra/core/metadata/examples/cvterms.json b/cobra/core/metadata/examples/cvterms.json
deleted file mode 100644
index 4391c4062..000000000
--- a/cobra/core/metadata/examples/cvterms.json
+++ /dev/null
@@ -1,44 +0,0 @@
-{
- cvterms : {
- "hasPart" : [
- {
- "resources" : [
- "https://identifiers.org/uniprot/P69905",
- "https://www.uniprot.org/uniprot/P68871",
- "https://identifiers.org/chebi/CHEBI:17627",
- ],
- "isDescribedBy" : [
- {
- "resources" : [
- "https://identifiers.org/pubmed/1111111"
- ]
- },
- {
- "resources" : [
- "https://identifiers.org/eco/000000"
- ]
- }
- ]
- },
- {
- "resources" : [
- "https://identifiers.org/uniprot/P69905",
- "https://identifiers.org/uniprot/P68871",
- "https://identifiers.org/kegg.compound/C00032",
- ]
- },
- ],
-
- "hasVersion" : [
- {
- "resources" : [
- "https://identifiers.org/uniprot/Q9UQM7",
- "https://identifiers.org/uniprot/Q13554"
- ]
- "nested_data": [
- ...
- ]
- }
- ]
- }
-}
diff --git a/cobra/core/metadata/examples/cvterms_flat.json b/cobra/core/metadata/examples/cvterms_flat.json
new file mode 100644
index 000000000..c7cb16b4e
--- /dev/null
+++ b/cobra/core/metadata/examples/cvterms_flat.json
@@ -0,0 +1,26 @@
+{
+ "hasVersion": [
+ {
+ "resources": [
+ "https://identifiers.org/chebi/CHEBI:17345",
+ "https://identifiers.org/chebi/CHEBI:17552",
+ "https://identifiers.org/chebi/CHEBI:17627"
+ ]
+ },
+ {
+ "resources": [
+ "https://identifiers.org/kegg.compound/C00035",
+ "https://identifiers.org/kegg.compound/C00044",
+ "https://identifiers.org/kegg.compound/C00144"
+ ]
+ }
+ ],
+ "is": [
+ {
+ "resources": [
+ "https://identifiers.org/uniprot/Q9UQM7",
+ "https://identifiers.org/uniprot/Q13554"
+ ]
+ }
+ ]
+}
diff --git a/cobra/core/metadata/examples/cvterms_nested.json b/cobra/core/metadata/examples/cvterms_nested.json
new file mode 100644
index 000000000..179b781a2
--- /dev/null
+++ b/cobra/core/metadata/examples/cvterms_nested.json
@@ -0,0 +1,30 @@
+{
+ "hasPart": [
+ {
+ "resources": [
+ "https://identifiers.org/uniprot/P69905",
+ "https://identifiers.org/uniprot/P68871",
+ "https://identifiers.org/kegg.compound/C00032"
+ ]
+ },
+ {
+ "resources": [
+ "https://identifiers.org/uniprot/P69905",
+ "https://www.uniprot.org/uniprot/P68871",
+ "https://identifiers.org/chebi/CHEBI:17627"
+ ],
+ "isDescribedBy": [
+ {
+ "resources": [
+ "https://identifiers.org/pubmed/1111111"
+ ]
+ },
+ {
+ "resources": [
+ "https://identifiers.org/eco/000000"
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/cobra/core/metadata/examples/instance.py b/cobra/core/metadata/examples/metadata_example.py
similarity index 56%
rename from cobra/core/metadata/examples/instance.py
rename to cobra/core/metadata/examples/metadata_example.py
index 5c9904f79..24ae9602b 100644
--- a/cobra/core/metadata/examples/instance.py
+++ b/cobra/core/metadata/examples/metadata_example.py
@@ -1,34 +1,36 @@
+from pathlib import Path
from cobra.core.metadata import *
from cobra.core.species import Species
import pytest
+import json
+from pprint import pprint
+from cobra.core.metadata.cvterm import CVTerms
-def test_annotation():
+def example_metadata():
s = Species()
- print(s.annotation)
- s.annotation["chebi"] = ["1234", "23423432"]
- s.annotation["sbo"] = ["SBO123"]
- print(s.annotation)
- assert "chebi" in s.annotation
- assert "sbo" in s.annotation
- assert len(s.annotation) == 2
- for key in ["keys", "items", "values"]:
- assert hasattr(s.annotation, key)
+ for json_example in ["cvterms_flat", "cvterms_nested"]:
- # assert 0 == 1
+ with open(Path(__file__).parent / f"{json_example}.json", "r") as f_cvterms:
+ cvterms_data = json.load(f_cvterms)
+ print("-" * 80)
+ pprint(cvterms_data)
+ print("-" * 80)
+ # FIXME:
+ cvterms = CVTerms(cvterms_data)
+ print(cvterms)
+ meta = MetaData(cvterms=cvterms)
+ return
-def test_metadata():
- s = Species()
-
- meta = MetaData()
# history
# keyValuePair
# cvterms
+ # FIXME: update example
meta["cvterms"] = {
"is": [{"resources": ["http://identifiers.org/chebi/CHEBI:17847"]}]}
print(meta["annotation"])
@@ -45,7 +47,7 @@ def test_metadata():
s.annotation = meta
-# if __name__ == "__main__":
- # example_metadata()
+
+if __name__ == "__main__":
+ example_metadata()
# example_annotation()
-# pass
diff --git a/cobra/core/metadata/examples/test_metadata.py b/cobra/core/metadata/examples/test_metadata.py
new file mode 100644
index 000000000..e6534446d
--- /dev/null
+++ b/cobra/core/metadata/examples/test_metadata.py
@@ -0,0 +1,18 @@
+
+from cobra.core.species import Species
+
+def test_annotation():
+ s = Species()
+ print(s.annotation)
+ s.annotation["chebi"] = ["1234", "23423432"]
+ s.annotation["sbo"] = ["SBO123"]
+ print(s.annotation)
+
+ assert "chebi" in s.annotation
+ assert "sbo" in s.annotation
+ assert len(s.annotation) == 2
+ for key in ["keys", "items", "values"]:
+ assert hasattr(s.annotation, key)
+
+ # assert 0 == 1
+
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index f03ca3f24..b11cb5b96 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -41,6 +41,9 @@ def __init__(self, cvterms: CVTerms = None, history: History = None,
# for resources a list of identifiers is stored
self._annotations = defaultdict(list)
+ # def add_cvterm(self):
+ # self._annotations
+
def __getitem__(self, key):
return self._annotations[key]
diff --git a/cobra/core/object.py b/cobra/core/object.py
index d7c0ebea6..0faaa2ce5 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -22,7 +22,7 @@ def __init__(self, id=None, name=""):
self.name = name
self.notes = {}
- self._annotation = MetaData() # {}
+ self._annotation = {} # MetaData()
@property
def id(self):
From 024c980a697657840fae066ce13589e11a45fc8c Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 18 Jun 2020 21:31:36 +0530
Subject: [PATCH 14/76] made backward compatible
---
cobra/core/metadata/__init__.py | 2 +-
cobra/core/metadata/cvterm.py | 307 +++++++++---------
...rms_flat.json => cvterms_alternative.json} | 4 +-
.../metadata/examples/cvterms_nested.json | 4 +-
.../metadata/examples/metadata_example.py | 72 ++--
cobra/core/metadata/examples/test_metadata.py | 24 +-
cobra/core/metadata/metadata.py | 62 +++-
cobra/core/object.py | 16 +-
8 files changed, 281 insertions(+), 210 deletions(-)
rename cobra/core/metadata/examples/{cvterms_flat.json => cvterms_alternative.json} (92%)
diff --git a/cobra/core/metadata/__init__.py b/cobra/core/metadata/__init__.py
index f464dddd9..b3d843780 100644
--- a/cobra/core/metadata/__init__.py
+++ b/cobra/core/metadata/__init__.py
@@ -2,7 +2,7 @@
from __future__ import absolute_import
-from cobra.core.metadata.cvterm import CVTerm
+from cobra.core.metadata.cvterm import CVTerm, CVTerms, Qualifier
from cobra.core.metadata.history import History
from cobra.core.metadata.keyvaluepair import ListOfKeyValue
from cobra.core.metadata.metadata import MetaData
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 3414a3ff0..9a1cce060 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -9,6 +9,7 @@
import re
import warnings
+from collections import defaultdict
from collections.abc import MutableMapping, MutableSequence
from enum import Enum
@@ -40,10 +41,13 @@ class Qualifier(Enum):
class CVTerm(object):
- """ Representation of a single CVTerm."""
- def __init__(self, qualifier: Qualifier=Qualifier.bqb_is, resource: str = None):
- self.qualifier = qualifier
+ """Representation of a single CVTerm."""
+ def __init__(self, qualifier: Qualifier = Qualifier.bqb_is, resource: str = None):
self.uri = resource
+ if isinstance(qualifier, Qualifier):
+ self.qualifier = qualifier
+ else:
+ raise TypeError("qualifier passed must be an enum Qualifier")
def parse_provider_identifier(self):
"""Parses provider and term from given identifiers annotation uri.
@@ -67,46 +71,148 @@ def parse_provider_identifier(self):
print("WARNING : %s does not conform to "
"'http(s)://identifiers.org/collection/id' or"
"'http(s)://identifiers.org/COLLECTION:id, so "
- "is not added to annotation dictionary." % uri)
+ "is not added to annotation dictionary." % self.uri)
return None
return provider, identifier
-class CVTerms(object):
- """Representation of all CVTerms of an object in their dependency structure. """
-
- def __init__(self, data):
- self._cvterms = {}
- # FIXME: implement with code below
+class CVTerms(MutableMapping):
+ """
+ Representation of all CVTerms of an object in their
+ dependency structure.
+ """
- # FIXME: refactor
- if not isinstance(cvterm, dict):
- raise TypeError("The annotation data must be in a dict form")
- else:
- for key, value in cvterm.items():
- if not isinstance(key, str):
- raise TypeError("the provider must be of type string")
+ def __init__(self, data: dict = None):
+ self._cvterms = defaultdict(list)
+ if data is None:
+ return
+ elif isinstance(data, dict):
+ for key, value in data.items():
+ if key not in Qualifier.__members__:
+ raise TypeError("%s is not an enum Qualifier" % key)
if isinstance(value, list):
- self._mapping[key] = self.CVList(self.metadata, key, value)
- elif isinstance(value, self.CVList):
- self._mapping[key] = value
+ self._cvterms[key] = CVList(value)
else:
- raise TypeError("the value passed for key '%s' "
- "has invalid format" % key)
+ raise TypeError("The value passed must be of type list: "
+ "{}".format(value))
+ else:
+ raise TypeError("Invalid format for CVTerms: '{}'".format(data))
@staticmethod
def parse_cvterms(data) -> 'CVTerms':
"""Tries to parse the CVterms."""
- if data is None:
- return CVTerms(None)
+ if data is None or isinstance(data, dict):
+ return CVTerms(data)
elif isinstance(data, CVTerms):
return data
- elif isinstance(data, dict):
- return CVTerms(data)
else:
raise TypeError("Invalid format for CVTerms: '{}'".format(data))
+ def __getitem__(self, key):
+ return self._cvterms[key]
+
+ def __setitem__(self, key, value):
+ raise TypeError("The setitem method does not work for CVTerms. "
+ "Please use 'add_cvterm' method for adding cvterms.")
+
+ def __delitem__(self, key):
+ del self._cvterms[key]
+
+ def __iter__(self):
+ return iter(self._cvterms)
+
+ def __len__(self):
+ return len(self._cvterms)
+
+ def __str__(self):
+ return str(dict(self._cvterms))
+
+ def __repr__(self):
+ return '{}'.format(self._cvterms)
+
+
+class CVList(MutableSequence):
+ """
+ Class representation of all sets of resources and their nested
+ annotation corresponding to a given qualifier. It have similar
+ structure like that of a list but has only restricted type of
+ entries (of type ExternalResources) within it
+ CVList : [
+ {
+ "resources" : [],
+ "nested_data" : CVTerm
+ },
+ {
+ "resources" : [],
+ "nested_data" : CVTerm
+ },
+ ...
+ ]
+
+ Parameters
+ ----------
+ cvlist : list
+ a list containing entries confirming to ExternalResources structure
+
+ """
+ def __init__(self, data: list = None):
+
+ self._sequence = list()
+ if data is None:
+ data = []
+ elif not isinstance(data, list):
+ raise TypeError("The data passed must be "
+ "inside a list: '{}'".format(data))
+
+ for item in data:
+ if isinstance(item, dict):
+ self._sequence.append(ExternalResources(item))
+ else:
+ raise TypeError("All items inside CVList must be of type "
+ "dict: {}".format(item))
+
+ def __len__(self):
+ return len(self._sequence)
+
+ def __delitem__(self, index):
+ del self._sequence[index]
+
+ def insert(self, index, value):
+ if isinstance(value, ExternalResources):
+ self._sequence.insert(index, value)
+ elif isinstance(value, dict):
+ self._sequence.insert(index, ExternalResources(value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
+
+ def append(self, value):
+ if isinstance(value, ExternalResources):
+ self._sequence.append(value)
+ elif isinstance(value, dict):
+ self._sequence.append(ExternalResources(value))
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
+
+ def __setitem__(self, index, value):
+ if isinstance(value, ExternalResources):
+ self._sequence[index] = value
+ elif isinstance(value, dict):
+ self._sequence[index] = ExternalResources(value)
+ else:
+ raise TypeError("The passed format for setting external"
+ " resources is invalid.")
+
+ def __getitem__(self, index):
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
class ExternalResources(MutableMapping):
@@ -121,7 +227,7 @@ class ExternalResources(MutableMapping):
A dictionary containing the resources and nested annotation
{
"resources" : [],
- "nested_data" : CVTerm
+ "nested_data" : CVTerms
}
Allowed Keys
@@ -133,57 +239,38 @@ class ExternalResources(MutableMapping):
"""
+ ANNOTATION_KEYS = ['resources', 'nested_data']
-
-
- ANNOTATION_KEYS = ['resources', 'nested_data', 'qualifier_type']
- QUALIFIER_RELATION = ['MODEL', 'BIOLOGICAL', 'UNKNOWN']
-
- def __init__(self, metadata=None, qualifier_key=None, data=None):
+ def __init__(self, data=None):
if data is None:
data = {}
- if qualifier_key is None:
- self.qualifier_key = "is"
- elif not isinstance(qualifier_key, str):
- raise TypeError("The qualifier key passed must be of type string")
- else:
- self.qualifier_key = qualifier_key
self._mapping = dict()
- self.metadata = metadata
if not isinstance(data, dict):
raise TypeError("The value passed must be of type dict.")
for key, value in data.items():
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key '%s' is not allowed. Only "
- "allowed keys are 'resources', "
- "'nested_data'." % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
self._mapping[key] = value
- for items in value:
- self.set_annotation(items)
elif key == 'nested_data':
if isinstance(value, CVTerm):
self._mapping[key] = value
elif isinstance(value, dict):
- self._mapping[key] = CVTerm(value)
+ self._mapping[key] = CVTerms(value)
else:
raise TypeError("The nested data structure does "
"not have valid CVTerm format")
- elif key == "qualifier_type":
- if not isinstance(value, int):
- raise TypeError("The value passed for qualifier type "
- "must be an integer")
- if value == 0 or value == 1:
- self._mapping[key] = self.QUALIFIER_RELATION[value]
- else:
- self._mapping[key] = self.QUALIFIER_RELATION[2]
+ elif key in Qualifier.__members__:
+ self._mapping['nested_data'] = CVTerms({key: value})
+ else:
+ raise ValueError("Key '%s' is not allowed. Only "
+ "allowed keys are 'resources', "
+ "'nested_data'." % key)
def __getitem__(self, key):
if key not in self.ANNOTATION_KEYS:
raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'qualifier_type', 'resources', "
+ "keys are : 'resources', "
"'nested_data'" % key)
return self._mapping[key]
@@ -191,31 +278,23 @@ def __setitem__(self, key, value):
"""Restricting the keys and values that can be set.
Only allowed keys are 'resources' and 'nested_data'
"""
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'qualifier_type', 'resources', "
- "'nested_data'" % key)
if key == 'resources':
if not isinstance(value, list):
raise TypeError("Resources must be put in a list")
self._mapping[key] = value
- for items in value:
- set_annotation(items)
elif key == 'nested_data':
if isinstance(value, CVTerm):
self._mapping[key] = value
elif isinstance(value, dict):
- self._mapping[key] = CVTerm(value)
+ self._mapping[key] = CVTerms(value)
else:
raise TypeError("The value passed has invalid format.")
- elif key == "qualifier_type":
- if not isinstance(value, int):
- raise TypeError("The value passed for qualifier type "
- "must be an integer")
- if value == 0 or value == 1:
- self._mapping[key] = self.QUALIFIER_RELATION[value]
- else:
- self._mapping[key] = self.QUALIFIER_RELATION[2]
+ elif key in Qualifier.__members__:
+ self._mapping['nested_data'] = CVTerms({key: value})
+ else:
+ raise ValueError("Key '%s' is not allowed. Only "
+ "allowed keys are 'resources', "
+ "'nested_data'." % key)
def __delitem__(self, key):
del self._mapping[key]
@@ -242,89 +321,3 @@ def set_annotation(self, resource=None):
else:
provider, identifier = data
self.metadata["annotation"][provider].append((self.qualifier_key, identifier))
-
-
-
-class CVList(MutableSequence):
- """
- Class representation of all sets of resources and their nested
- annotation corresponding to a given qualifier. It have similar
- structure like that of a list but has only restricted type of
- entries (of type ExternalResources) within it
-
- Parameters
- ----------
- cvlist : list
- a list containing entries confirming to ExternalResources structure
-
- """
- def __init__(self, metadata=None, qualifier_key=None, cvlist=None):
- if cvlist is None:
- cvlist = []
- if qualifier_key is None:
- self._qualifier_key = "is"
- elif not isinstance(qualifier_key, str):
- raise ("The qualifier key passed must be of type string")
- else:
- self._qualifier_key = qualifier_key
- self._sequence = list()
- self.metadata = metadata
- if not isinstance(cvlist, list):
- raise TypeError("The resources passed must be inside a list")
- for item in cvlist:
- if isinstance(item, CVTerm.ExternalResources):
- self._sequence.append(item)
- elif isinstance(item, dict):
- self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, item))
- else:
- raise TypeError("All items must confirm to "
- "ExternalResources structure")
-
- def __len__(self):
- return len(self._sequence)
-
- def __delitem__(self, index):
- del self._sequence[index]
-
- def insert(self, index, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence.insert(index, value)
- elif isinstance(value, dict):
- self._sequence.insert(index, CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
- else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
-
- def append(self, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence.append(value)
- elif isinstance(value, dict):
- self._sequence.append(CVTerm.ExternalResources(self.metadata, self._qualifier_key, value))
- else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
-
- def __setitem__(self, index, value):
- if isinstance(value, CVTerm.ExternalResources):
- self._sequence[index] = value
- elif isinstance(value, dict):
- self._sequence[index] = CVTerm.ExternalResources(self.metadata, self._qualifier_key, value)
- else:
- raise TypeError("The passed format for setting external"
- " resources is invalid.")
-
- def __getitem__(self, index):
- return self._sequence[index]
-
- def __str__(self):
- return str(self._sequence)
-
- def __repr__(self):
- return '{}'.format(self._sequence)
-
-
-
-
-
-
-
diff --git a/cobra/core/metadata/examples/cvterms_flat.json b/cobra/core/metadata/examples/cvterms_alternative.json
similarity index 92%
rename from cobra/core/metadata/examples/cvterms_flat.json
rename to cobra/core/metadata/examples/cvterms_alternative.json
index c7cb16b4e..c6a154083 100644
--- a/cobra/core/metadata/examples/cvterms_flat.json
+++ b/cobra/core/metadata/examples/cvterms_alternative.json
@@ -1,5 +1,5 @@
{
- "hasVersion": [
+ "bqb_hasVersion": [
{
"resources": [
"https://identifiers.org/chebi/CHEBI:17345",
@@ -15,7 +15,7 @@
]
}
],
- "is": [
+ "bqb_isDescribedBy": [
{
"resources": [
"https://identifiers.org/uniprot/Q9UQM7",
diff --git a/cobra/core/metadata/examples/cvterms_nested.json b/cobra/core/metadata/examples/cvterms_nested.json
index 179b781a2..ba62ee764 100644
--- a/cobra/core/metadata/examples/cvterms_nested.json
+++ b/cobra/core/metadata/examples/cvterms_nested.json
@@ -1,5 +1,5 @@
{
- "hasPart": [
+ "bqb_hasPart": [
{
"resources": [
"https://identifiers.org/uniprot/P69905",
@@ -13,7 +13,7 @@
"https://www.uniprot.org/uniprot/P68871",
"https://identifiers.org/chebi/CHEBI:17627"
],
- "isDescribedBy": [
+ "bqb_isDescribedBy": [
{
"resources": [
"https://identifiers.org/pubmed/1111111"
diff --git a/cobra/core/metadata/examples/metadata_example.py b/cobra/core/metadata/examples/metadata_example.py
index 24ae9602b..3e5b90e51 100644
--- a/cobra/core/metadata/examples/metadata_example.py
+++ b/cobra/core/metadata/examples/metadata_example.py
@@ -10,18 +10,49 @@
def example_metadata():
s = Species()
- for json_example in ["cvterms_flat", "cvterms_nested"]:
+ for json_example in ["cvterms_alternative", "cvterms_nested"]:
with open(Path(__file__).parent / f"{json_example}.json", "r") as f_cvterms:
cvterms_data = json.load(f_cvterms)
print("-" * 80)
+ print("{} Annotation: ".format(json_example))
pprint(cvterms_data)
+
+
+ # s.annotation = cvterms_data
+ # print("Using species: ")
+ # print("Direct annotation:")
+ # print(s.annotation)
+ # print("CVTerms")
+ # pprint(s.annotation.cvterms)
+
+ # print("Using CVTerm:")
+ # cvterms = CVTerms(cvterms_data)
+ # pprint(dict(cvterms), width=1)
+
+ print("Reading using Metadata Class:\n")
+ meta = MetaData(cvterms_data)
+ print("Printing the direct annotation\n")
+ print(meta,"\n")
+ print("Printing the collection of cvterms\n")
+ print(meta.cvterms,"\n")
+ print("adding new valid cvterm: {}\n".format("http://identifiers.org/chebi/CHEBI:12newchebiterm"))
+ cvt = CVTerm(Qualifier["bqb_hasPart"], "http://identifiers.org/chebi/CHEBI:12newchebiterm")
+ meta.add_cvterm(cvt, 0)
+ print("Printing the direct annotation\n")
+ print(meta,"\n")
+ print("Printing the collection of cvterms\n")
+ print(meta.cvterms,"\n")
+
+ cvt2 = CVTerm(Qualifier["bqb_hasPart"], "http://notidentifiers.org/uniprot/newuniport")
+ meta.add_cvterm(cvt2, 0)
+ print("Printing the direct annotation\n")
+ print(meta,"\n")
+ print("Printing the collection of cvterms\n")
+ print(meta.cvterms,"\n")
+ cvt2 = CVTerm(Qualifier["bqb_hasPart"], "http://notidentifiers.org/uniprot/newuniport")
print("-" * 80)
- # FIXME:
- cvterms = CVTerms(cvterms_data)
- print(cvterms)
- meta = MetaData(cvterms=cvterms)
return
@@ -31,21 +62,22 @@ def example_metadata():
# cvterms
# FIXME: update example
- meta["cvterms"] = {
- "is": [{"resources": ["http://identifiers.org/chebi/CHEBI:17847"]}]}
- print(meta["annotation"])
- print(meta["annotation"]["chebi"])
- meta["cvterms"]["isDescribedBy"] = [{"resources": [
- "https://identifiers.org/pubmed/1111111",
- "https://identifiers.org/pubmed/111321"]}]
- meta["cvterms"]["is"].append({"resources": [
- "https://identifiers.org/pubmed/1111111",
- "https://identifiers.org/pubmed/111321"]})
- print(meta["annotation"])
- meta["cvterms"]["is"].append(
- {"resources": ["https://someotherurl.org/pubmed/1111111"]})
-
- s.annotation = meta
+
+ # meta["cvterms"] = {
+ # "is": [{"resources": ["http://identifiers.org/chebi/CHEBI:17847"]}]}
+ # print(meta["annotation"])
+ # print(meta["annotation"]["chebi"])
+ # meta["cvterms"]["isDescribedBy"] = [{"resources": [
+ # "https://identifiers.org/pubmed/1111111",
+ # "https://identifiers.org/pubmed/111321"]}]
+ # meta["cvterms"]["is"].append({"resources": [
+ # "https://identifiers.org/pubmed/1111111",
+ # "https://identifiers.org/pubmed/111321"]})
+ # print(meta["annotation"])
+ # meta["cvterms"]["is"].append(
+ # {"resources": ["https://someotherurl.org/pubmed/1111111"]})
+ #
+ # s.annotation = meta
if __name__ == "__main__":
diff --git a/cobra/core/metadata/examples/test_metadata.py b/cobra/core/metadata/examples/test_metadata.py
index e6534446d..3d9e22793 100644
--- a/cobra/core/metadata/examples/test_metadata.py
+++ b/cobra/core/metadata/examples/test_metadata.py
@@ -2,17 +2,19 @@
from cobra.core.species import Species
def test_annotation():
- s = Species()
- print(s.annotation)
- s.annotation["chebi"] = ["1234", "23423432"]
- s.annotation["sbo"] = ["SBO123"]
- print(s.annotation)
+import cobra
+from cobra.core.species import Species
+from cobra.core.metadata import *
+s = Species()
+print(s.annotation)
+s.annotation["chebi"] = ["1234", "23423432"]
+s.annotation["sbo"] = "SBO123"
+print(s.annotation)
- assert "chebi" in s.annotation
- assert "sbo" in s.annotation
- assert len(s.annotation) == 2
- for key in ["keys", "items", "values"]:
- assert hasattr(s.annotation, key)
+assert "chebi" in s.annotation
+assert "sbo" in s.annotation
+assert len(s.annotation) == 3
+for key in ["keys", "items", "values"]:
+ assert hasattr(s.annotation, key)
# assert 0 == 1
-
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index b11cb5b96..c3b7db4be 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -5,7 +5,7 @@
from collections import defaultdict
from collections.abc import MutableMapping
-from cobra.core.metadata.cvterm import CVTerms, CVTerm
+from cobra.core.metadata.cvterm import CVTerms, CVTerm, Qualifier
from cobra.core.metadata.history import History
from cobra.core.metadata.keyvaluepair import ListOfKeyValue, KeyValueDict
@@ -32,17 +32,61 @@ class MetaData(MutableMapping):
"""
def __init__(self, cvterms: CVTerms = None, history: History = None,
keyValueDict: KeyValueDict = None):
+ # internal dictionary of annotations for backwards compatibility
+ # for resources a list of identifiers is stored
+ self._annotations = defaultdict(list)
- self.cvterms = CVTerms.parse_cvterms(cvterms)
+ self._cvterms = CVTerms()
+ self.add_cvterms(cvterms)
self.history = History.parse_history(history)
self.keyValueDict = KeyValueDict.parse_keyValueDict(keyValueDict)
- # internal dictionary of annotations for backwards compatibility
- # for resources a list of identifiers is stored
+ def add_cvterm(self, cvterm, index):
+ if isinstance(cvterm, CVTerm):
+ qual = str(cvterm.qualifier)
+ qual = qual[10:] if qual.startswith('Qualifier.') else qual
+ data = cvterm.parse_provider_identifier()
+ if data is not None:
+ provider, identifier = data
+ self._annotations[provider].append(identifier)
+ else:
+ raise TypeError("The CVTerm passed must be a CVTerm object: {}".format(cvterm))
+
+ if index < len(self._cvterms[qual]):
+ self._cvterms[qual][index]["resources"].append(cvterm.uri)
+ elif index == len(self._cvterms[qual]):
+ self._cvterms[qual].append({"resources":[cvterm.uri]})
+ else:
+ raise UnboundLocalError("The index is out of bound: {}".format(index))
+
+ def add_cvterms(self, cvterms: CVTerms = None):
+ if cvterms is None:
+ return
+ elif isinstance(cvterms, dict) or isinstance(cvterms, CVTerm):
+ parsed_cvterms = CVTerms.parse_cvterms(cvterms)
+ for key, value in parsed_cvterms.items():
+ offset = len(self.cvterms[key])
+ for index in range(len(value)):
+ ex_res_list = value[index]
+ res_list = ex_res_list["resources"]
+ for uri in res_list:
+ cvterm = CVTerm(Qualifier[key], uri)
+ self.add_cvterm(cvterm, index+offset)
+ if "nested_data" in ex_res_list:
+ self._cvterms[key][index+offset]["nested_data"] = ex_res_list["nested_data"]
+ else:
+ raise TypeError("The value passed must be of "
+ "type CVTerms: {}".format(cvterms))
+
+ @property
+ def cvterms(self):
+ return self._cvterms
+
+ @cvterms.setter
+ def cvterms(self, value):
+ self._cvterms = CVTerms()
self._annotations = defaultdict(list)
-
- # def add_cvterm(self):
- # self._annotations
+ self.add_cvterms(value)
def __getitem__(self, key):
return self._annotations[key]
@@ -60,7 +104,7 @@ def __len__(self):
return len(self._annotations)
def __str__(self):
- return str(self._annotations)
+ return str(dict(self._annotations))
def __repr__(self):
- return '{}'.format(self._annotations)
+ return '{}'.format(dict(self._annotations))
diff --git a/cobra/core/object.py b/cobra/core/object.py
index 0faaa2ce5..f02a44529 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -22,7 +22,7 @@ def __init__(self, id=None, name=""):
self.name = name
self.notes = {}
- self._annotation = {} # MetaData()
+ self.annotation = MetaData()
@property
def id(self):
@@ -42,13 +42,13 @@ def id(self, value):
def _set_id_with_model(self, value):
self._id = value
- @property
- def annotation(self):
- return self._annotation
-
- @annotation.setter
- def annotation(self, annotation):
- self._annotation = annotation
+ # @property
+ # def annotation(self):
+ # return self._annotation
+ #
+ # @annotation.setter
+ # def annotation(self, annotation):
+ # self._annotation = annotation
def __getstate__(self):
"""To prevent excessive replication during deepcopy."""
From ff440fbd3194e0cb35baf9428cee2206cc2305f4 Mon Sep 17 00:00:00 2001
From: Matthias Koenig
Date: Thu, 18 Jun 2020 18:32:23 +0200
Subject: [PATCH 15/76] code review metadata
---
cobra/core/metadata/cvterm.py | 43 +++++++++++++++++++++++
cobra/core/metadata/metadata.py | 62 ++++++++++-----------------------
2 files changed, 61 insertions(+), 44 deletions(-)
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 9a1cce060..818614556 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -77,13 +77,18 @@ def parse_provider_identifier(self):
return provider, identifier
+# FIXME: this is probably not a dictionary
class CVTerms(MutableMapping):
"""
Representation of all CVTerms of an object in their
dependency structure.
"""
+ # add property: annotations
+
def __init__(self, data: dict = None):
+ self._annotations = defaultdict(list)
+
self._cvterms = defaultdict(list)
if data is None:
return
@@ -109,6 +114,44 @@ def parse_cvterms(data) -> 'CVTerms':
else:
raise TypeError("Invalid format for CVTerms: '{}'".format(data))
+ def add_cvterm(self, cvterm, index):
+ if isinstance(cvterm, CVTerm):
+ qual = str(cvterm.qualifier)
+ qual = qual[10:] if qual.startswith('Qualifier.') else qual
+ data = cvterm.parse_provider_identifier()
+ if data is not None:
+ provider, identifier = data
+ self._annotations[provider].append(identifier)
+ else:
+ raise TypeError("The CVTerm passed must be a CVTerm object: {}".format(cvterm))
+
+ if index < len(self[qual]):
+ self[qual][index]["resources"].append(cvterm.uri)
+ elif index == len(self[qual]):
+ self[qual].append({"resources":[cvterm.uri]})
+ else:
+ raise UnboundLocalError("The index is out of bound: {}".format(index))
+
+ def add_cvterms(self, cvterms: 'CVTerms' = None):
+ if cvterms is None:
+ return
+ elif isinstance(cvterms, dict) or isinstance(cvterms, CVTerm):
+ parsed_cvterms = CVTerms.parse_cvterms(cvterms)
+ for key, value in parsed_cvterms.items():
+ # FIXME: this is probably broken now
+ offset = len(self[key])
+ for index in range(len(value)):
+ ex_res_list = value[index]
+ res_list = ex_res_list["resources"] # FIXME: change to dot syntax
+ for uri in res_list:
+ cvterm = CVTerm(Qualifier[key], uri)
+ self.add_cvterm(cvterm, index+offset)
+ if "nested_data" in ex_res_list:
+ self[key][index+offset]["nested_data"] = ex_res_list["nested_data"] # FIXME: change to dot syntax
+ else:
+ raise TypeError("The value passed must be of "
+ "type CVTerms: {}".format(cvterms))
+
def __getitem__(self, key):
return self._cvterms[key]
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index c3b7db4be..d0c05f957 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -34,49 +34,17 @@ def __init__(self, cvterms: CVTerms = None, history: History = None,
keyValueDict: KeyValueDict = None):
# internal dictionary of annotations for backwards compatibility
# for resources a list of identifiers is stored
- self._annotations = defaultdict(list)
self._cvterms = CVTerms()
- self.add_cvterms(cvterms)
+ self.add_cvterms(cvterms) # FIXME: unnecessary -> CVTerms(cvterms)
self.history = History.parse_history(history)
self.keyValueDict = KeyValueDict.parse_keyValueDict(keyValueDict)
- def add_cvterm(self, cvterm, index):
- if isinstance(cvterm, CVTerm):
- qual = str(cvterm.qualifier)
- qual = qual[10:] if qual.startswith('Qualifier.') else qual
- data = cvterm.parse_provider_identifier()
- if data is not None:
- provider, identifier = data
- self._annotations[provider].append(identifier)
- else:
- raise TypeError("The CVTerm passed must be a CVTerm object: {}".format(cvterm))
-
- if index < len(self._cvterms[qual]):
- self._cvterms[qual][index]["resources"].append(cvterm.uri)
- elif index == len(self._cvterms[qual]):
- self._cvterms[qual].append({"resources":[cvterm.uri]})
- else:
- raise UnboundLocalError("The index is out of bound: {}".format(index))
+ def add_cvterm(self, cvterm, index: int = 0):
+ self._cvterms.add_cvterm(cvterm=cvterm, index=index)
def add_cvterms(self, cvterms: CVTerms = None):
- if cvterms is None:
- return
- elif isinstance(cvterms, dict) or isinstance(cvterms, CVTerm):
- parsed_cvterms = CVTerms.parse_cvterms(cvterms)
- for key, value in parsed_cvterms.items():
- offset = len(self.cvterms[key])
- for index in range(len(value)):
- ex_res_list = value[index]
- res_list = ex_res_list["resources"]
- for uri in res_list:
- cvterm = CVTerm(Qualifier[key], uri)
- self.add_cvterm(cvterm, index+offset)
- if "nested_data" in ex_res_list:
- self._cvterms[key][index+offset]["nested_data"] = ex_res_list["nested_data"]
- else:
- raise TypeError("The value passed must be of "
- "type CVTerms: {}".format(cvterms))
+ self._cvterms.add_cvterms(cvterms=cvterms)
@property
def cvterms(self):
@@ -85,26 +53,32 @@ def cvterms(self):
@cvterms.setter
def cvterms(self, value):
self._cvterms = CVTerms()
- self._annotations = defaultdict(list)
+
+ # synchronize the annotation dictionary
+ self.cvterms._annotations = defaultdict(list)
self.add_cvterms(value)
+ @property
+ def annotations(self):
+ return self.cvterms._annotations
+
def __getitem__(self, key):
- return self._annotations[key]
+ return self.annotations[key]
def __setitem__(self, key, value):
- self._annotations[key].append(value)
+ self.annotations[key].append(value)
def __delitem__(self, key):
- del self._annotations[key]
+ del self.annotations[key]
def __iter__(self):
- return iter(self._annotations)
+ return iter(self.annotations)
def __len__(self):
- return len(self._annotations)
+ return len(self.annotations)
def __str__(self):
- return str(dict(self._annotations))
+ return str(dict(self.annotations))
def __repr__(self):
- return '{}'.format(dict(self._annotations))
+ return '{}'.format(dict(self.annotations))
From e4ad484ce58dfbcb94cc2441ea369d9622e77d93 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Mon, 22 Jun 2020 00:48:58 +0530
Subject: [PATCH 16/76] cleaned the metadata class by putting code in
respective classes
---
cobra/core/metadata/cvterm.py | 122 ++++----
cobra/core/metadata/history.py | 444 +++++++++++++---------------
cobra/core/metadata/keyvaluepair.py | 208 ++++++-------
cobra/core/metadata/metadata.py | 26 +-
cobra/core/object.py | 8 -
5 files changed, 372 insertions(+), 436 deletions(-)
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 818614556..cbf65f4ff 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -42,7 +42,7 @@ class Qualifier(Enum):
class CVTerm(object):
"""Representation of a single CVTerm."""
- def __init__(self, qualifier: Qualifier = Qualifier.bqb_is, resource: str = None):
+ def __init__(self, qualifier: 'Qualifier' = Qualifier.bqb_is, resource: 'str' = None):
self.uri = resource
if isinstance(qualifier, Qualifier):
self.qualifier = qualifier
@@ -84,12 +84,10 @@ class CVTerms(MutableMapping):
dependency structure.
"""
- # add property: annotations
-
- def __init__(self, data: dict = None):
+ def __init__(self, data: 'dict' = None):
self._annotations = defaultdict(list)
- self._cvterms = defaultdict(list)
+ self._cvterms = defaultdict(CVList)
if data is None:
return
elif isinstance(data, dict):
@@ -126,7 +124,7 @@ def add_cvterm(self, cvterm, index):
raise TypeError("The CVTerm passed must be a CVTerm object: {}".format(cvterm))
if index < len(self[qual]):
- self[qual][index]["resources"].append(cvterm.uri)
+ self[qual][index].resources.append(cvterm.uri)
elif index == len(self[qual]):
self[qual].append({"resources":[cvterm.uri]})
else:
@@ -135,23 +133,33 @@ def add_cvterm(self, cvterm, index):
def add_cvterms(self, cvterms: 'CVTerms' = None):
if cvterms is None:
return
- elif isinstance(cvterms, dict) or isinstance(cvterms, CVTerm):
+ elif isinstance(cvterms, dict) or isinstance(cvterms, CVTerms):
parsed_cvterms = CVTerms.parse_cvterms(cvterms)
for key, value in parsed_cvterms.items():
- # FIXME: this is probably broken now
+
offset = len(self[key])
for index in range(len(value)):
- ex_res_list = value[index]
- res_list = ex_res_list["resources"] # FIXME: change to dot syntax
+ external_res = value[index]
+ res_list = external_res.resources
for uri in res_list:
cvterm = CVTerm(Qualifier[key], uri)
self.add_cvterm(cvterm, index+offset)
- if "nested_data" in ex_res_list:
- self[key][index+offset]["nested_data"] = ex_res_list["nested_data"] # FIXME: change to dot syntax
+ if external_res.nested_data is not None:
+ self[key][index+offset].nested_data = external_res.nested_data # FIXME: change to dot syntax
else:
raise TypeError("The value passed must be of "
"type CVTerms: {}".format(cvterms))
+ @property
+ def annotations(self):
+ return getattr(self, "_annotations", defaultdict(list))
+
+ @annotations.setter
+ def annotations(self, value):
+ raise ValueError("The setting of annotation in this way "
+ "is not allowed. Either use annotation.add_cvterm()"
+ " or annotation.add_cvterms() to add resources.")
+
def __getitem__(self, key):
return self._cvterms[key]
@@ -199,7 +207,7 @@ class CVList(MutableSequence):
a list containing entries confirming to ExternalResources structure
"""
- def __init__(self, data: list = None):
+ def __init__(self, data: 'list' = None):
self._sequence = list()
if data is None:
@@ -258,7 +266,7 @@ def __repr__(self):
return '{}'.format(self._sequence)
-class ExternalResources(MutableMapping):
+class ExternalResources(object):
"""
Class representation of a single set of resources and its nested
annotation. Its a special type of dict with restricted keys and
@@ -282,85 +290,59 @@ class ExternalResources(MutableMapping):
"""
- ANNOTATION_KEYS = ['resources', 'nested_data']
-
def __init__(self, data=None):
if data is None:
data = {}
- self._mapping = dict()
if not isinstance(data, dict):
raise TypeError("The value passed must be of type dict.")
for key, value in data.items():
if key == 'resources':
- if not isinstance(value, list):
- raise TypeError("Resources must be put in a list")
- self._mapping[key] = value
+ if not isinstance(data["resources"], list):
+ raise TypeError("Resources must be wrapped in a list: {}".format(data["resources"]))
+ else:
+ self._resources = data["resources"]
elif key == 'nested_data':
if isinstance(value, CVTerm):
- self._mapping[key] = value
+ self._nested_data = value
elif isinstance(value, dict):
- self._mapping[key] = CVTerms(value)
+ self._nested_data = CVTerms(value)
else:
raise TypeError("The nested data structure does "
- "not have valid CVTerm format")
+ "not have valid CVTerm format: {}".format(value))
elif key in Qualifier.__members__:
- self._mapping['nested_data'] = CVTerms({key: value})
+ self._nested_data = CVTerms({key: value})
else:
raise ValueError("Key '%s' is not allowed. Only "
"allowed keys are 'resources', "
"'nested_data'." % key)
- def __getitem__(self, key):
- if key not in self.ANNOTATION_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'resources', "
- "'nested_data'" % key)
- return self._mapping[key]
+ @property
+ def resources(self):
+ return getattr(self, "_resources", None)
- def __setitem__(self, key, value):
- """Restricting the keys and values that can be set.
- Only allowed keys are 'resources' and 'nested_data'
- """
- if key == 'resources':
- if not isinstance(value, list):
- raise TypeError("Resources must be put in a list")
- self._mapping[key] = value
- elif key == 'nested_data':
- if isinstance(value, CVTerm):
- self._mapping[key] = value
- elif isinstance(value, dict):
- self._mapping[key] = CVTerms(value)
- else:
- raise TypeError("The value passed has invalid format.")
- elif key in Qualifier.__members__:
- self._mapping['nested_data'] = CVTerms({key: value})
+ @resources.setter
+ def resources(self, value):
+ if not isinstance(value, list):
+ raise TypeError("The resources must be wrapped inside a list: {}".format(value))
else:
- raise ValueError("Key '%s' is not allowed. Only "
- "allowed keys are 'resources', "
- "'nested_data'." % key)
+ self._resources = value
- def __delitem__(self, key):
- del self._mapping[key]
+ @property
+ def nested_data(self):
+ return getattr(self, "_nested_data", None)
- def __iter__(self):
- return iter(self._mapping)
-
- def __len__(self):
- return len(self._mapping)
+ @nested_data.setter
+ def nested_data(self, value):
+ if isinstance(value, CVTerms):
+ self._nested_data = value
+ elif isinstance(value, dict):
+ self._nested_data = CVTerms(value)
+ else:
+ raise TypeError("The nested data structure does "
+ "not have valid CVTerm format: {}".format(value))
def __str__(self):
- return str(self._mapping)
+ return str({"resources": self._resources})
def __repr__(self):
- return '{}'.format(self._mapping)
-
- def set_annotation(self, resource=None):
- if resource is None:
- return
- else:
- data = self._parse_annotation_info(resource)
- if data is None:
- return
- else:
- provider, identifier = data
- self.metadata["annotation"][provider].append((self.qualifier_key, identifier))
+ return str({"resources": self._resources})
diff --git a/cobra/core/metadata/history.py b/cobra/core/metadata/history.py
index 0782d07d0..fb2fb5c36 100644
--- a/cobra/core/metadata/history.py
+++ b/cobra/core/metadata/history.py
@@ -6,12 +6,11 @@
from collections.abc import MutableMapping, MutableSequence
-# The possible keys inside creator dict
-CREATOR_KEYS = ["first_name", "last_name", "email", "organization_name"]
-
-
def validateDate(date_text):
"""Validate if the date format is of type w3cdtf ISO 8601"""
+ if not isinstance(date_text, str):
+ raise TypeError("The date passed must be of type string: {}".format(date_text))
+
try:
datetime.datetime.strptime(date_text, '%Y-%m-%dT%H:%M:%S%z')
except ValueError as e:
@@ -19,11 +18,10 @@ def validateDate(date_text):
return True
-class History(MutableMapping):
+class History(object):
"""
Class representation of history of a given component i.e. creator,
- created date and modification dates. It is basically an extended
- dictionary with some restrictions
+ created date and modification dates.
Parameters
----------
@@ -35,9 +33,9 @@ class History(MutableMapping):
modified : list
A list of dates about the component modification
- Allowed Keys
+ Attributes
----------
- creator : dict
+ creator :Creators
A dictionary containong details of creator's name, email and
organisation name
created : string
@@ -47,76 +45,16 @@ class History(MutableMapping):
"""
- VALID_KEYS = ["creators", "created", "modified"]
-
- def __init__(self, creators=None, created=None, modified=None):
- if creators is None:
- creators = []
- if modified is None:
- modified = []
- self._mapping = dict()
- self._mapping["creators"] = self.ListOfCreators(creators)
- if isinstance(created, str):
- validateDate(created)
- self._mapping["created"] = created
- elif created is None:
- self._mapping["created"] = None
+ def __init__(self, creators: 'ListOfCreators' = None, created: 'str' = None,
+ modified: 'ModifiedHistory' = None):
+ self._creators = ListOfCreators(creators)
+ self._modified = ModifiedHistory(modified)
+ if created is None:
+ self._created = None
else:
- raise TypeError('Only None and string types are possible for '
- '"created" date attribute')
- self._mapping["modified"] = self.ModifiedHistory(modified)
-
- def __getitem__(self, key):
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'creators', 'created', 'modified'"
- % key)
- return self._mapping[key]
-
- def __setitem__(self, key, value):
- """Restricting the keys and values that can be set.
- Only allowed keys are : 'id', 'name', 'key', 'value', 'uri''
- """
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed"
- " keys are : 'id', 'name', 'key',"
- " 'value', 'uri'" % key)
- if key == "creators":
- if isinstance(value, self.ListOfCreators):
- self._mapping[key] = value
- elif isinstance(value, list):
- self._mapping[key] = self.ListOfCreators(value)
- else:
- raise TypeError("The passed format for creators is invalid")
- elif key == "created":
- if not isinstance(value, str):
- raise TypeError("The date passed must be a string")
- else:
- validateDate(value)
- self._mapping[key] = value
- elif key == "modified":
- if isinstance(value, self.ModifiedHistory):
- self._mapping[key] = value
- elif isinstance(value, list):
- self._mapping[key] = self.ModifiedHistory(value)
- else:
- raise TypeError("The passed format for modification"
- " history is invalid")
-
- def __delitem__(self, key):
- del self._mapping[key]
-
- def __iter__(self):
- return iter(self._mapping)
-
- def __len__(self):
- return len(self._mapping)
-
- def __str__(self):
- return str(self._mapping)
+ validateDate(created)
+ self._created = created
- def __repr__(self):
- return '{}'.format(self._mapping)
@staticmethod
def parse_history(data) -> 'History':
@@ -132,181 +70,197 @@ def parse_history(data) -> 'History':
else:
raise TypeError("Invalid format for History: '{}'".format(data))
+ @property
+ def created(self):
+ return getattr(self, "_created", None)
+
+ @created.setter
+ def created(self, value):
+ validateDate(created)
+ self._created = created
+
+ @property
+ def creators(self):
+ return getattr(self, "_creators", [])
+
+ @creators.setter
+ def creators(self, value):
+ self._creators = ListOfCreators(value)
+
+ @property
+ def modified(self):
+ return getattr(self, "_modified", [])
- class ListOfCreators(MutableSequence):
- """A list extension to store each creator's info
-
- Parameters
- ----------
- creators : list containing info about creators
- """
-
- def __init__(self, creators=None):
- if creators is None:
- creators = []
- self._sequence = list()
- if not isinstance(creators, list):
- raise TypeError("The data passed for creators must be "
- "inside a list")
- else:
- for item in creators:
- if isinstance(item, History.Creator):
- self._sequence.append(item)
- elif isinstance(item, dict):
- self._sequence.append(History.Creator(item))
- else:
- raise TypeError("The data passed for creator "
- "indexed %s has invalid format"
- % creators.index(item, 0,
- len(creators)))
-
- def __len__(self):
- return len(self._sequence)
-
- def __delitem__(self, index):
- del self._sequence[index]
-
- def insert(self, index, value):
- if isinstance(value, History.Creator):
- self._sequence.insert(index, value)
- elif isinstance(value, dict):
- self._sequence.insert(index, History.Creator(value))
- else:
- raise TypeError("The data passed has invalid format")
-
- def append(self, value):
- if isinstance(value, History.Creator):
- self._sequence.append(value)
- elif isinstance(value, dict):
- self._sequence.append(History.Creator(value))
- else:
- raise TypeError("The data passed has invalid format")
-
- def __setitem__(self, index, value):
- if isinstance(value, History.Creator):
- self._sequence[index] = value
- elif isinstance(value, dict):
- self._sequence[index] = History.Creator(value)
- else:
- raise TypeError("The data passed has invalid format")
-
- def __getitem__(self, index):
- return self._sequence[index]
-
- def __str__(self):
- return str(self._sequence)
-
- def __repr__(self):
- return '{}'.format(self._sequence)
-
- class Creator(MutableMapping):
- """A dictionary extension to store basic info of this component
- creator
-
- Parameters
- ----------
- creator_dict : dict containing info about creator
- {
- "first_name" : "abc",
- "last_name" : "abc",
- "email" : "abc",
- "organization_name" : "abc"
- }
- """
-
- def __init__(self, creator_dict=None):
- if creator_dict is None:
- creator_dict = {}
- self._mapping = dict()
- if not isinstance(creator_dict, dict):
- raise TypeError("The value passed for creator must "
- "be of type dict.")
- for key in CREATOR_KEYS:
- if key not in creator_dict:
- self._mapping[key] = None
+ @modified.setter
+ def modified(self, value):
+ self._modified = ModifiedHistory(value)
+
+ def __str__(self):
+ return str({"creators": self.creators, "created": self.created,
+ "modified": self.modified})
+
+ def __repr__(self):
+ return str({"creators": self.created, "created": self.created,
+ "modified": self.modified})
+
+
+class ListOfCreators(MutableSequence):
+ """A list extension to store each creator's info
+
+ Parameters
+ ----------
+ creators : list containing info about creators
+ """
+
+ def __init__(self, creators=None):
+ if creators is None:
+ creators = []
+ self._sequence = list()
+ if not isinstance(creators, list):
+ raise TypeError("The data passed for creators must be "
+ "inside a list")
+ else:
+ for item in creators:
+ if isinstance(item, Creator):
+ self._sequence.append(item)
+ elif isinstance(item, dict):
+ self._sequence.append(Creator(item))
else:
- if not isinstance(creator_dict[key], str):
- raise TypeError("All the values passed must "
- "be of type string.")
- else:
- self._mapping[key] = creator_dict[key]
-
- def __getitem__(self, key):
- if key not in CREATOR_KEYS:
- raise ValueError("Key %s is not allowed. only allowed "
- "keys are 'first_name', 'last_name', "
- "'email', 'organization_name'." % key)
- return self._mapping[key]
-
- def __setitem__(self, key, value):
- if key not in CREATOR_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are 'first_name', 'last_name', "
- "'email', 'organization_name'." % key)
- if not isinstance(value, str):
- raise TypeError("Value passed must be of type string.")
- self._mapping[key] = value
-
- def __delitem__(self, key):
- del self._mapping[key]
-
- def __iter__(self):
- return iter(self._mapping)
-
- def __len__(self):
- return len(self._mapping)
-
- def __str__(self):
- return str(self._mapping)
-
- def __repr__(self):
- return '{}'.format(self._mapping)
-
- class ModifiedHistory(MutableSequence):
- """A list extension to store modification dates. Only Restricted
- type of entries are possible.
-
- Parameters
- ----------
- modifiedList : list containing modification dates in W3CDTF ISO
- 8601 format
- """
-
- def __init__(self, modifiedList=None):
- if modifiedList is None:
- modifiedList = []
- self._sequence = list()
- if not isinstance(modifiedList, list):
- raise TypeError("The dates passed must be inside a list")
- for item in modifiedList:
- if not isinstance(item, str):
- raise ValueError("Each date must be of type string")
- validateDate(item)
- self._sequence.append(item)
-
- def __len__(self):
- return len(self._sequence)
-
- def __delitem__(self, index):
- del self._sequence[index]
-
- def insert(self, index, value):
- validateDate(value)
+ raise TypeError("The data passed for creator "
+ "indexed %s has invalid format"
+ % creators.index(item, 0,
+ len(creators)))
+
+ def __len__(self):
+ return len(self._sequence)
+
+ def __delitem__(self, index):
+ del self._sequence[index]
+
+ def insert(self, index, value):
+ if isinstance(value, Creator):
self._sequence.insert(index, value)
+ elif isinstance(value, dict):
+ self._sequence.insert(index, Creator(value))
+ else:
+ raise TypeError("The data passed has invalid format")
- def append(self, value):
- validateDate(value)
+ def append(self, value):
+ if isinstance(value, Creator):
self._sequence.append(value)
+ elif isinstance(value, dict):
+ self._sequence.append(Creator(value))
+ else:
+ raise TypeError("The data passed has invalid format")
- def __setitem__(self, index, value):
- validateDate(value)
+ def __setitem__(self, index, value):
+ if isinstance(value, Creator):
self._sequence[index] = value
+ elif isinstance(value, dict):
+ self._sequence[index] = Creator(value)
+ else:
+ raise TypeError("The data passed has invalid format")
+
+ def __getitem__(self, index):
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
+
+
+class Creator(object):
+ """Class representation of a Creator
+
+ Parameters
+ ----------
+ creator_dict : dict containing info about creator
+ {
+ "first_name" : "abc",
+ "last_name" : "abc",
+ "email" : "abc",
+ "organization_name" : "abc"
+ }
+ Attributes
+ ----------
+ first_name : str,
+ last_name : str,
+ email : str,
+ organization_name : str
+ """
+
+ def __init__(self, creator_dict=None):
+ if creator_dict is None:
+ creator_dict = {}
+ if not isinstance(creator_dict, dict):
+ raise TypeError("The value passed for creator must "
+ "be of type dict: {}".format(creator_dict))
+ self.first_name = creator_dict["first_name"] if "first_name" in creator_dict else None
+ self.last_name = creator_dict["last_name"] if "last_name" in creator_dict else None
+ self.email = creator_dict["email"] if "email" in creator_dict else None
+ self.organization_name = creator_dict["organization_name"] if "organization_name" in creator_dict else None
+
+ def parse_creator(data) -> 'Creator':
+ if data is None or isinstance(data, dict):
+ return Creator(data)
+ elif isinstance(data, Creator):
+ return data
+ else:
+ raise TypeError("Invalid format for Creator: {}".format(data))
- def __getitem__(self, index):
- return self._sequence[index]
+ def __str__(self):
+ return str({"first_name": self.first_name, "last_name": self.last_name, "email": email, "organization_name": self.organization_name})
+
+ def __repr__(self):
+ return str({"first_name": self.first_name, "last_name": self.last_name, "email": email, "organization_name": self.organization_name})
+
+class ModifiedHistory(MutableSequence):
+ """A list extension to store modification dates. Only Restricted
+ type of entries are possible.
+
+ Parameters
+ ----------
+ modifiedList : list containing modification dates in W3CDTF ISO
+ 8601 format
+ """
+
+ def __init__(self, modifiedList=None):
+ if modifiedList is None:
+ modifiedList = []
+ self._sequence = list()
+ if not isinstance(modifiedList, list):
+ raise TypeError("The dates passed must be inside a list")
+ for item in modifiedList:
+ if not isinstance(item, str):
+ raise ValueError("Each date must be of type string")
+ validateDate(item)
+ self._sequence.append(item)
- def __str__(self):
- return str(self._sequence)
+ def __len__(self):
+ return len(self._sequence)
+
+ def __delitem__(self, index):
+ del self._sequence[index]
+
+ def insert(self, index, value):
+ validateDate(value)
+ self._sequence.insert(index, value)
+
+ def append(self, value):
+ validateDate(value)
+ self._sequence.append(value)
+
+ def __setitem__(self, index, value):
+ validateDate(value)
+ self._sequence[index] = value
- def __repr__(self):
- return '{}'.format(self._sequence)
+ def __getitem__(self, index):
+ return self._sequence[index]
+
+ def __str__(self):
+ return str(self._sequence)
+
+ def __repr__(self):
+ return '{}'.format(self._sequence)
diff --git a/cobra/core/metadata/keyvaluepair.py b/cobra/core/metadata/keyvaluepair.py
index f9b74cf1d..e922dc973 100644
--- a/cobra/core/metadata/keyvaluepair.py
+++ b/cobra/core/metadata/keyvaluepair.py
@@ -4,24 +4,6 @@
from collections.abc import MutableMapping, MutableSequence
-class KeyValueDict(object):
-
- def __init__(self, data):
- self._keyValueDict = {} # FIXME: this is more complicated
- # FIXME: implement with code below
-
- @staticmethod
- def parse_keyValueDict(data) -> 'KeyValueDict':
- """Tries to parse the KeyValueDict."""
- if data is None:
- return KeyValueDict(None)
- elif isinstance(data, KeyValueDict):
- return data
- elif isinstance(data, dict):
- return KeyValueDict(data)
- else:
- raise TypeError("Invalid format for KeyValueDict: '{}'".format(data))
-
class ListOfKeyValue(MutableSequence):
"""A list extension to store key-value pairs
@@ -37,19 +19,25 @@ def __init__(self, keyvaluelist=None):
self._sequence = list()
if not isinstance(keyvaluelist, list):
raise TypeError("The data passed for ListOfKeyValue "
- "must be inside a list")
+ "must be inside a list: {}".format(value))
else:
for item in keyvaluelist:
- if isinstance(item, self.KeyValuePair):
+ if isinstance(item, KeyValueDict):
self._sequence.append(item)
elif isinstance(item, dict):
- self._sequence.append(self.KeyValuePair(item))
+ self._sequence.append(KeyValueDict(item))
else:
raise TypeError("The data passed for KeyValuepair "
"indexed %s has invalid format"
% keyvaluelist.index(item, 0,
len(keyvaluelist)))
+ def parse_listofKeyValue(data):
+ if data is None or isinstance(data, list):
+ return ListOfKeyValue(data)
+ else:
+ raise TypeError("Invalid format passed for ListOfKeyValue: {}".format(data))
+
def __len__(self):
return len(self._sequence)
@@ -57,31 +45,31 @@ def __delitem__(self, index):
del self._sequence[index]
def insert(self, index, value):
- if isinstance(value, self.KeyValuePair):
+ if isinstance(value, KeyValueDict):
self._sequence.insert(index, value)
elif isinstance(value, dict):
- self._sequence.insert(index, self.KeyValuePair(value))
+ self._sequence.insert(index, KeyValueDict(value))
else:
raise TypeError("The data passed for KeyValuePair "
- "has invalid format")
+ "has invalid format: {}".format(value))
def append(self, value):
- if isinstance(value, self.KeyValuePair):
+ if isinstance(value, KeyValueDict):
self._sequence.append(value)
elif isinstance(value, dict):
- self._sequence.append(self.KeyValuePair(value))
+ self._sequence.append(KeyValueDict(value))
else:
raise TypeError("The data passed for KeyValuePair "
- "has invalid format")
+ "has invalid format: {}".format(value))
def __setitem__(self, index, value):
- if isinstance(value, self.KeyValuePair):
+ if isinstance(value, KeyValueDict):
self._sequence[index] = value
elif isinstance(value, dict):
- self._sequence[index] = self.KeyValuePair(value)
+ self._sequence[index] = KeyValueDict(value)
else:
raise TypeError("The data passed for KeyValuePair "
- "has invalid format")
+ "has invalid format: {}".format(value))
def __getitem__(self, index):
return self._sequence[index]
@@ -92,74 +80,92 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._sequence)
- class KeyValuePair(MutableMapping):
- """
- Class representation of key-value pairs supported in fba-v3
-
- Parameters
- ----------
- data : dict
- A dictionary containing data about key-value pairs
- {
- "id" : "abc",
- "name" : "abc",
- "key" : "abc",
- "value" : "abc",
- "uri" : "abc"
- }
-
- """
-
- VALID_KEYS = ["id", "name", "key", "value", "uri"]
-
- def __init__(self, data=None):
- if data is None:
- data = {}
- self._mapping = dict()
- for key, value in data.items():
- if key not in self.VALID_KEYS:
- raise ValueError("'%s' is not allowed. Only possible "
- "keys are : 'id', 'name', 'key', "
- "'value', 'uri'" % key)
- if not isinstance(key, str):
- raise TypeError("All keys must be of type string")
- if not isinstance(value, str):
- raise TypeError("All values must be of type string")
- self._mapping[key] = value
- for key in self.VALID_KEYS:
- if key not in data:
- self._mapping[key] = None
-
- def __getitem__(self, key):
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed "
- "keys are : 'id', 'name', 'key',"
- " 'value', 'uri'" % key)
- return self._mapping[key]
-
- def __setitem__(self, key, value):
- """Restricting the keys and values that can be set.
- Only allowed keys are : 'id', 'name', 'key', 'value', 'uri''
- """
- if key not in self.VALID_KEYS:
- raise ValueError("Key %s is not allowed. Only allowed"
- " keys are : 'id', 'name', 'key',"
- " 'value', 'uri'" % key)
- if not isinstance(value, str):
- raise TypeError("The value must be of type string")
- self._mapping[key] = value
-
- def __delitem__(self, key):
- del self._mapping[key]
-
- def __iter__(self):
- return iter(self._mapping)
-
- def __len__(self):
- return len(self._mapping)
-
- def __str__(self):
- return str(self._mapping)
-
- def __repr__(self):
- return '{}'.format(self._mapping)
+
+class KeyValueDict(object):
+
+ def __init__(self, data):
+ if data is None:
+ data = {}
+ if isinstance(data, dict):
+ self._key = data["key"] if "key" in data else None
+ self._value = data["value"] if "value" in data else None
+ self._uri = data["uri"] if "uri" in data else None
+ self._id = data["id"] if "id" in data else None
+ self._name = data["name"] if "name" in data else None
+ else:
+ raise TypeError("Invalid format passed for KeyValueDict: {}".format(data))
+
+ @staticmethod
+ def parse_keyValueDict(data) -> 'KeyValueDict':
+ """Tries to parse the KeyValueDict."""
+ if data is None:
+ return KeyValueDict(None)
+ elif isinstance(data, KeyValueDict):
+ return data
+ elif isinstance(data, dict):
+ return KeyValueDict(data)
+ else:
+ raise TypeError("Invalid format for KeyValueDict: '{}'".format(data))
+
+ @property
+ def id(self):
+ return getattr(self, "_id", None)
+
+ @id.setter
+ def id(self, data):
+ if not isinstance(data, str):
+ raise TypeError("Only string type allowed for 'id': {}".format(data))
+ else:
+ self._id = data
+
+ @property
+ def name(self):
+ return getattr(self, "_name", None)
+
+ @name.setter
+ def name(self, data):
+ if not isinstance(data, str):
+ raise TypeError("Only string type allowed for 'name': {}".format(data))
+ else:
+ self._name = data
+
+ @property
+ def key(self):
+ return getattr(self, "_key", None)
+
+ @key.setter
+ def key(self, data):
+ if not isinstance(data, str):
+ raise TypeError("Only string type allowed for 'key': {}".format(data))
+ else:
+ self._key = data
+
+ @property
+ def value(self):
+ return getattr(self, "_value", None)
+
+ @value.setter
+ def value(self, data):
+ if not isinstance(data, str):
+ raise TypeError("Only string type allowed for 'value': {}".format(data))
+ else:
+ self._value = data
+
+ @property
+ def uri(self):
+ return getattr(self, "_uri", None)
+
+ @uri.setter
+ def uri(self, data):
+ if not isinstance(data, str):
+ raise TypeError("Only string type allowed for 'uri': {}".format(data))
+ else:
+ self._uri = data
+
+ def __str__(self):
+ return str({"id": self.id, "name": self.name, "key": self.key,
+ "value": self.value, "uri": self.uri})
+
+ def __repr__(self):
+ return str({"id": self.id, "name": self.name, "key": self.key,
+ "value": self.value, "uri": self.uri})
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index d0c05f957..83b5c5b65 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -30,20 +30,17 @@ class MetaData(MutableMapping):
Some key-value pairs which are not suitable to be
represented anywhere else in the model.
"""
- def __init__(self, cvterms: CVTerms = None, history: History = None,
- keyValueDict: KeyValueDict = None):
- # internal dictionary of annotations for backwards compatibility
- # for resources a list of identifiers is stored
-
+ def __init__(self, cvterms: 'CVTerms' = None, history: 'History' = None,
+ keyValueDict: 'KeyValueDict' = None):
self._cvterms = CVTerms()
- self.add_cvterms(cvterms) # FIXME: unnecessary -> CVTerms(cvterms)
+ self.add_cvterms(cvterms)
self.history = History.parse_history(history)
- self.keyValueDict = KeyValueDict.parse_keyValueDict(keyValueDict)
+ self.keyValueDict = ListOfKeyValue.parse_listofKeyValue(keyValueDict)
- def add_cvterm(self, cvterm, index: int = 0):
+ def add_cvterm(self, cvterm, index: 'int' = 0):
self._cvterms.add_cvterm(cvterm=cvterm, index=index)
- def add_cvterms(self, cvterms: CVTerms = None):
+ def add_cvterms(self, cvterms: 'CVTerms' = None):
self._cvterms.add_cvterms(cvterms=cvterms)
@property
@@ -53,20 +50,25 @@ def cvterms(self):
@cvterms.setter
def cvterms(self, value):
self._cvterms = CVTerms()
-
+
# synchronize the annotation dictionary
self.cvterms._annotations = defaultdict(list)
self.add_cvterms(value)
@property
def annotations(self):
- return self.cvterms._annotations
+ return self.cvterms.annotations
def __getitem__(self, key):
return self.annotations[key]
def __setitem__(self, key, value):
- self.annotations[key].append(value)
+ if key == "sbo":
+ self.cvterms._annotations = value
+ else:
+ raise ValueError("The setting of annotation in this way "
+ "is not allowed. Either use annotation.add_cvterm()"
+ " or annotation.add_cvterms() to add resources.")
def __delitem__(self, key):
del self.annotations[key]
diff --git a/cobra/core/object.py b/cobra/core/object.py
index f02a44529..1a87e60a5 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -42,14 +42,6 @@ def id(self, value):
def _set_id_with_model(self, value):
self._id = value
- # @property
- # def annotation(self):
- # return self._annotation
- #
- # @annotation.setter
- # def annotation(self, annotation):
- # self._annotation = annotation
-
def __getstate__(self):
"""To prevent excessive replication during deepcopy."""
state = self.__dict__.copy()
From 2508ac333efcbba4f02e5727309f655ff311be51 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Tue, 23 Jun 2020 21:23:46 +0530
Subject: [PATCH 17/76] new annotation format supported for SBML to cobra model
---
cobra/core/metadata/__init__.py | 2 +-
cobra/core/metadata/cvterm.py | 125 +++++++++++++++++-----
cobra/core/metadata/metadata.py | 7 +-
cobra/core/object.py | 22 +++-
cobra/io/sbml.py | 182 +++++++++++++++++---------------
5 files changed, 219 insertions(+), 119 deletions(-)
diff --git a/cobra/core/metadata/__init__.py b/cobra/core/metadata/__init__.py
index b3d843780..aa443ecfe 100644
--- a/cobra/core/metadata/__init__.py
+++ b/cobra/core/metadata/__init__.py
@@ -2,7 +2,7 @@
from __future__ import absolute_import
-from cobra.core.metadata.cvterm import CVTerm, CVTerms, Qualifier
+from cobra.core.metadata.cvterm import CVTerm, CVTerms, Qualifier, CVList, ExternalResources
from cobra.core.metadata.history import History
from cobra.core.metadata.keyvaluepair import ListOfKeyValue
from cobra.core.metadata.metadata import MetaData
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index cbf65f4ff..ba43d87bc 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -15,26 +15,26 @@
class Qualifier(Enum):
- bqb_is = 1
- bqb_hasPart = 2
- bqb_isPartOf = 3
- bqb_isVersionOf = 4
- bqb_hasVersion = 5
- bqb_isHomologTo = 6
- bqb_isDescribedBy = 7
- bqb_isEncodedBy = 8
- bqb_encodes = 9
- bqb_occursIn = 10
- bqb_hasProperty = 11
- bqb_isPropertyOf = 12
- bqb_hasTaxon = 13
- bqb_unknown = 14
- bqm_is = 15
- bqm_isDescribedBy = 16
- bqm_isDerivedFrom = 17
- bqm_isInstanceOf = 18
- bqm_hasInstance = 19
- bqm_unknown = 20
+ bqb_is = 0
+ bqb_hasPart = 1
+ bqb_isPartOf = 2
+ bqb_isVersionOf = 3
+ bqb_hasVersion = 4
+ bqb_isHomologTo = 5
+ bqb_isDescribedBy = 6
+ bqb_isEncodedBy = 7
+ bqb_encodes = 8
+ bqb_occursIn = 9
+ bqb_hasProperty = 10
+ bqb_isPropertyOf = 11
+ bqb_hasTaxon = 12
+ bqb_unknown = 13
+ bqm_is = 14
+ bqm_isDescribedBy = 15
+ bqm_isDerivedFrom = 16
+ bqm_isInstanceOf = 17
+ bqm_hasInstance = 18
+ bqm_unknown = 19
URL_IDENTIFIERS_PATTERN = re.compile(
r"^https?://identifiers.org/(.+?)[:/](.+)")
@@ -82,6 +82,19 @@ class CVTerms(MutableMapping):
"""
Representation of all CVTerms of an object in their
dependency structure.
+ {
+ "bqb_is": [
+ {
+ "resources": [
+ "",
+ ...
+ ],
+ "nested_data": CVTerms Object
+ },
+ ...
+ ],
+ ...
+ }
"""
def __init__(self, data: 'dict' = None):
@@ -94,7 +107,9 @@ def __init__(self, data: 'dict' = None):
for key, value in data.items():
if key not in Qualifier.__members__:
raise TypeError("%s is not an enum Qualifier" % key)
- if isinstance(value, list):
+ if isinstance(value, CVList):
+ self._cvterms[key] = value
+ elif isinstance(value, list):
self._cvterms[key] = CVList(value)
else:
raise TypeError("The value passed must be of type list: "
@@ -144,12 +159,37 @@ def add_cvterms(self, cvterms: 'CVTerms' = None):
for uri in res_list:
cvterm = CVTerm(Qualifier[key], uri)
self.add_cvterm(cvterm, index+offset)
- if external_res.nested_data is not None:
- self[key][index+offset].nested_data = external_res.nested_data # FIXME: change to dot syntax
+ if external_res.nested_data is not None and len(external_res.nested_data) != 0:
+ self[key][index+offset].nested_data = external_res.nested_data
else:
raise TypeError("The value passed must be of "
"type CVTerms: {}".format(cvterms))
+ def add_simple_annotations(self, data: None):
+ if data is None:
+ data = {}
+ if not isinstance(data, dict):
+ raise TypeError("The data passed must be of type dict: {}".format(data))
+
+ for key, value in data.items():
+ if key == "sbo":
+ self._annotations[key] = value
+ continue
+ if not isinstance(value, list):
+ raise TypeError("The value passed must be of type list: {}".format(value))
+ if not isinstance(key, str):
+ raise TypeError("The key passed must be of type string: {}".format(key))
+
+ # reset the data of annotations corresponding to this key
+ self._annotations[key] = []
+ for identifier in value:
+ if not isinstance(identifier, str):
+ raise TypeError("The identifier passed must be of type string: {}".format(identifier))
+ cvterm = CVTerm()
+ cvterm.uri = "https://identifiers.org/" + key + "/" + identifier
+ cvterm.qualifier = Qualifier["bqb_is"]
+ self.add_cvterm(cvterm, 0)
+
@property
def annotations(self):
return getattr(self, "_annotations", defaultdict(list))
@@ -161,11 +201,32 @@ def annotations(self, value):
" or annotation.add_cvterms() to add resources.")
def __getitem__(self, key):
+ if key not in Qualifier.__members__:
+ raise TypeError("''%s' is not an valid enum Qualifier" % key)
return self._cvterms[key]
def __setitem__(self, key, value):
- raise TypeError("The setitem method does not work for CVTerms. "
- "Please use 'add_cvterm' method for adding cvterms.")
+ """Make sure that key passed is of type string and value
+ passed confirms to CVList type (CVList or list)
+ """
+ # setting the cvterm
+ if key not in Qualifier.__members__:
+ raise TypeError("%s is not an enum Qualifier" % key)
+ if isinstance(value, list):
+ self._cvterms[key] = CVList(value)
+ elif isinstance(value, CVList):
+ self._cvterms[key] = value
+ else:
+ raise TypeError("The value passed must be of type list or CVList: "
+ "{}".format(value))
+ # setting the annotation
+ for ex_res in value:
+ for uri in ex_res.resources:
+ cvterm = CVTerm(Qualifier[key], uri)
+ data = cvterm.parse_provider_identifier()
+ if data is not None:
+ provider, identifier = data
+ self._annotations[provider].append(identifier)
def __delitem__(self, key):
del self._cvterms[key]
@@ -180,7 +241,7 @@ def __str__(self):
return str(dict(self._cvterms))
def __repr__(self):
- return '{}'.format(self._cvterms)
+ return '{}'.format(dict(self._cvterms))
class CVList(MutableSequence):
@@ -302,7 +363,7 @@ def __init__(self, data=None):
else:
self._resources = data["resources"]
elif key == 'nested_data':
- if isinstance(value, CVTerm):
+ if isinstance(value, CVTerms):
self._nested_data = value
elif isinstance(value, dict):
self._nested_data = CVTerms(value)
@@ -342,7 +403,13 @@ def nested_data(self, value):
"not have valid CVTerm format: {}".format(value))
def __str__(self):
- return str({"resources": self._resources})
+ if self.nested_data is None:
+ return str({"resources": self.resources})
+ else:
+ return str({"resources": self.resources, "nested_data": self.nested_data})
def __repr__(self):
- return str({"resources": self._resources})
+ if self.nested_data is None:
+ return str({"resources": self.resources})
+ else:
+ return str({"resources": self.resources, "nested_data": self.nested_data})
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index 83b5c5b65..c5d8a75ff 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -64,11 +64,10 @@ def __getitem__(self, key):
def __setitem__(self, key, value):
if key == "sbo":
- self.cvterms._annotations = value
+ self.cvterms._annotations[key] = value
+ return
else:
- raise ValueError("The setting of annotation in this way "
- "is not allowed. Either use annotation.add_cvterm()"
- " or annotation.add_cvterms() to add resources.")
+ self._cvterms.add_simple_annotations({key: value})
def __delitem__(self, key):
del self.annotations[key]
diff --git a/cobra/core/object.py b/cobra/core/object.py
index 1a87e60a5..a63d5491a 100644
--- a/cobra/core/object.py
+++ b/cobra/core/object.py
@@ -4,7 +4,8 @@
from six import string_types
-from cobra.core.metadata import MetaData
+from collections import defaultdict
+from cobra.core.metadata import MetaData, CVList
class Object(object):
@@ -22,7 +23,7 @@ def __init__(self, id=None, name=""):
self.name = name
self.notes = {}
- self.annotation = MetaData()
+ self._annotation = MetaData()
@property
def id(self):
@@ -39,6 +40,23 @@ def id(self, value):
else:
self._id = value
+ @property
+ def annotation(self):
+ return getattr(self, "_annotation", None)
+
+ @annotation.setter
+ def annotation(self, value):
+ if not (isinstance(value, dict) or isinstance(value, MetaData)):
+ raise TypeError("The data passed for annotation must be inside "
+ "a dictionary: {}".format(value))
+ else:
+ if isinstance(value, MetaData):
+ self._annotation = value
+ else:
+ self._annotation.cvterms._annotations = defaultdict(list)
+ self._annotation.cvterms._cvterms = defaultdict(CVList)
+ self._annotation.cvterms.add_simple_annotations(value)
+
def _set_id_with_model(self, value):
self._id = value
diff --git a/cobra/io/sbml.py b/cobra/io/sbml.py
index 5ccc3c7d7..5cee9ccbf 100644
--- a/cobra/io/sbml.py
+++ b/cobra/io/sbml.py
@@ -44,6 +44,7 @@
import cobra
from cobra.core import Gene, Group, Metabolite, Model, Reaction
from cobra.core.gene import parse_gpr
+from cobra.core.metadata import MetaData, CVTerm, CVTerms, Qualifier, CVList
from cobra.manipulation.validate import check_metabolite_compartment_formula
from cobra.util.solver import linear_reaction_coefficients, set_objective
@@ -1410,11 +1411,10 @@ def _parse_annotations(sbase):
FIXME: annotation format must be updated (this is a big collection of
fixes) - see: https://github.com/opencobra/cobrapy/issues/684)
"""
- annotation = {}
+ annotation = MetaData()
# SBO term
if sbase.isSetSBOTerm():
- # FIXME: correct handling of annotations
annotation["sbo"] = sbase.getSBOTermID()
# RDF annotation
@@ -1423,54 +1423,52 @@ def _parse_annotations(sbase):
return annotation
for cvterm in cvterms: # type: libsbml.CVTerm
+ # reading the qualifier
+ qualifier_type = cvterm.getQualifierType()
+ if qualifier_type == 0:
+ qualifier = "bqm_" + libsbml.ModelQualifierType_toString(cvterm.getModelQualifierType())
+ elif qualifier_type == 1:
+ qualifier = "bqb_" + libsbml.BiolQualifierType_toString(cvterm.getBiologicalQualifierType())
+ else:
+ qualifier = "unknown_qualifier"
+ ext_res = {"resources": []}
for k in range(cvterm.getNumResources()):
- # FIXME: read and store the qualifier
-
uri = cvterm.getResourceURI(k)
- data = _parse_annotation_info(uri)
- if data is None:
- continue
- else:
- provider, identifier = data
-
- if provider in annotation:
- if isinstance(annotation[provider], string_types):
- annotation[provider] = [annotation[provider]]
- # FIXME: use a list
- if identifier not in annotation[provider]:
- annotation[provider].append(identifier)
- else:
- # FIXME: always in list
- annotation[provider] = identifier
+ ext_res["resources"].append(uri)
+ ext_res["nested_data"] = _set_nested_data(cvterm)
+ new_cvterms = CVTerms({qualifier: CVList([ext_res])})
+ annotation.add_cvterms(new_cvterms)
return annotation
-def _parse_annotation_info(uri):
- """Parses provider and term from given identifiers annotation uri.
-
- Parameters
- ----------
- uri : str
- uri (identifiers.org url)
+def _set_nested_data(cvterm_obj):
+ num_nested_cvterms = cvterm_obj.getNumNestedCVTerms()
+ cobra_nested_cvterms = CVTerms()
+ if num_nested_cvterms == 0:
+ return cobra_nested_cvterms
+
+ for index in range(num_nested_cvterms): # type: libsbml.CVTerm
+ # reading the qualifier
+ cvterm = cvterm_obj.getNestedCVTerm(index)
+ qualifier_type = cvterm.getQualifierType()
+ if qualifier_type == 0:
+ qualifier = "bqm_" + libsbml.ModelQualifierType_toString(cvterm.getModelQualifierType())
+ elif qualifier_type == 1:
+ qualifier = "bqb_" + libsbml.BiolQualifierType_toString(cvterm.getBiologicalQualifierType())
+ else:
+ qualifier = "unknown_qualifier"
- Returns
- -------
- (provider, identifier) if resolvable, None otherwise
- """
- match = URL_IDENTIFIERS_PATTERN.match(uri)
- if match:
- provider, identifier = match.group(1), match.group(2)
- if provider.isupper():
- identifier = "%s:%s" % (provider, identifier)
- provider = provider.lower()
- else:
- LOGGER.warning("%s does not conform to "
- "'http(s)://identifiers.org/collection/id' or"
- "'http(s)://identifiers.org/COLLECTION:id", uri)
- return None
+ ext_res = {"resources": []}
+ for k in range(cvterm.getNumResources()):
+ uri = cvterm.getResourceURI(k)
+ ext_res["resources"].append(uri)
+ ext_res["nested_data"] = _set_nested_data(cvterm)
+ new_cvterms = CVTerms({qualifier: CVList([ext_res])})
+ # print(new_cvterms)
+ cobra_nested_cvterms.add_cvterms(new_cvterms)
- return provider, identifier
+ return cobra_nested_cvterms
def _sbase_annotations(sbase, annotation):
@@ -1486,69 +1484,87 @@ def _sbase_annotations(sbase, annotation):
FIXME: annotation format must be updated
(https://github.com/opencobra/cobrapy/issues/684)
"""
-
if not annotation or len(annotation) == 0:
return
# standardize annotations
annotation_data = deepcopy(annotation)
- for key, value in annotation_data.items():
- # handling of non-string annotations (e.g. integers)
- if isinstance(value, (float, int)):
- value = str(value)
- if isinstance(value, string_types):
- annotation_data[key] = [("is", value)]
+ if not isinstance(annotation_data, MetaData):
+ raise TypeError("The annotation object must be of type 'Metadata': {}".format(annotation_data))
- for key, value in annotation_data.items():
- for idx, item in enumerate(value):
- if isinstance(item, string_types):
- value[idx] = ("is", item)
+ if 'sbo' in annotation and annotation['sbo'] != []:
+ sbo_term = annotation["sbo"]
+ _check(sbase.setSBOTerm(sbo_term),
+ "Setting SBOTerm: {}".format(sbo_term))
# set metaId
meta_id = "meta_{}".format(sbase.getId())
sbase.setMetaId(meta_id)
- # rdf_items = []
- for provider, data in iteritems(annotation_data):
-
- # set SBOTerm
- if provider in ["SBO", "sbo"]:
- if provider == "SBO":
- LOGGER.warning("'SBO' provider is deprecated, "
- "use 'sbo' provider instead")
- sbo_term = data[0][1]
- _check(sbase.setSBOTerm(sbo_term),
- "Setting SBOTerm: {}".format(sbo_term))
-
- # FIXME: sbo should also be written as CVTerm
- continue
-
- for item in data:
- qualifier_str, entity = item[0], item[1]
- qualifier = QUALIFIER_TYPES.get(qualifier_str, None)
- if qualifier is None:
- qualifier = libsbml.BQB_IS
- LOGGER.error("Qualifier type is not supported on "
- "annotation: '{}'".format(qualifier_str))
-
+ for key, value in annotation.cvterms.items():
+ qualifier = key
+ if qualifier.startswith("bqb"):
qualifier_type = libsbml.BIOLOGICAL_QUALIFIER
- if qualifier_str.startswith("bqm_"):
- qualifier_type = libsbml.MODEL_QUALIFIER
+ elif qualifier.startswith("bqm"):
+ qualifier_type = libsbml.MODEL_QUALIFIER
+ else:
+ raise CobraSBMLError('Unsupported qualifier: '
+ '%s' % qualifier)
+ for ex_res in value:
cv = libsbml.CVTerm() # type: libsbml.CVTerm
cv.setQualifierType(qualifier_type)
if qualifier_type == libsbml.BIOLOGICAL_QUALIFIER:
- cv.setBiologicalQualifierType(qualifier)
+ cv.setBiologicalQualifierType(Qualifier[qualifier].value)
elif qualifier_type == libsbml.MODEL_QUALIFIER:
- cv.setModelQualifierType(qualifier)
+ cv.setModelQualifierType(Qualifier[qualifier].value-14)
else:
raise CobraSBMLError('Unsupported qualifier: '
'%s' % qualifier)
- resource = "%s/%s/%s" % (URL_IDENTIFIERS_PREFIX, provider, entity)
- cv.addResource(resource)
+ for uri in ex_res.resources:
+ cv.addResource(uri)
+
+ # adding the nested data
+ if ex_res.nested_data is not None:
+ _add_nested_data(cv, ex_res.nested_data)
+
+ # finally add the cvterm
_check(sbase.addCVTerm(cv),
- "Setting cvterm: {}, resource: {}".format(cv, resource))
+ "Setting cvterm: {}".format(cv))
+
+
+def _add_nested_data(cvterm, nested_data):
+ for key, value in nested_data.items():
+ qualifier = key
+ if qualifier.startswith("bqb"):
+ qualifier_type = libsbml.BIOLOGICAL_QUALIFIER
+ elif qualifier.startswith("bqm"):
+ qualifier_type = libsbml.MODEL_QUALIFIER
+ else:
+ raise CobraSBMLError('Unsupported qualifier: '
+ '%s' % qualifier)
+
+ for ex_res in value:
+ cv = libsbml.CVTerm() # type: libsbml.CVTerm
+ cv.setQualifierType(qualifier_type)
+ if qualifier_type == libsbml.BIOLOGICAL_QUALIFIER:
+ cv.setBiologicalQualifierType(Qualifier[qualifier].value)
+ elif qualifier_type == libsbml.MODEL_QUALIFIER:
+ cv.setModelQualifierType(Qualifier[qualifier].value-14)
+ else:
+ raise CobraSBMLError('Unsupported qualifier: '
+ '%s' % qualifier)
+ for uri in ex_res.resources:
+ cv.addResource(uri)
+
+ # adding the nested data
+ if ex_res.nested_data is not None:
+ _add_nested_data(cv, ex_res.nested_data)
+
+ # finally add the cvterm
+ _check(cvterm.addNestedCVTerm(cv),
+ "Adding nested cvterm: {}".format(cv))
# -----------------------------------------------------------------------------
From d5fc54ce760f882a54f81e1871a0cffb8fb80b65 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 25 Jun 2020 01:45:47 +0530
Subject: [PATCH 18/76] added io for json and other formats
---
cobra/core/metadata/cvterm.py | 2 +-
cobra/core/metadata/history.py | 31 ++++++++++---------
cobra/io/dict.py | 53 +++++++++++++++++++++++++++++---
cobra/io/sbml.py | 55 +++++++++++++++++++++++++++++++++-
4 files changed, 121 insertions(+), 20 deletions(-)
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index ba43d87bc..3cf9e8fe7 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -324,7 +324,7 @@ def __str__(self):
return str(self._sequence)
def __repr__(self):
- return '{}'.format(self._sequence)
+ return '{}'.format(list(self._sequence))
class ExternalResources(object):
diff --git a/cobra/core/metadata/history.py b/cobra/core/metadata/history.py
index fb2fb5c36..09d5406f0 100644
--- a/cobra/core/metadata/history.py
+++ b/cobra/core/metadata/history.py
@@ -76,8 +76,8 @@ def created(self):
@created.setter
def created(self, value):
- validateDate(created)
- self._created = created
+ validateDate(value)
+ self._created = value
@property
def creators(self):
@@ -95,12 +95,18 @@ def modified(self):
def modified(self, value):
self._modified = ModifiedHistory(value)
+ def isSetHistory(self):
+ if self.created == None and len(self.creators) == 0 and len(self.modified) == 0:
+ return False
+ else:
+ return True
+
def __str__(self):
return str({"creators": self.creators, "created": self.created,
"modified": self.modified})
def __repr__(self):
- return str({"creators": self.created, "created": self.created,
+ return str({"creators": self.creators, "created": self.created,
"modified": self.modified})
@@ -126,10 +132,7 @@ def __init__(self, creators=None):
elif isinstance(item, dict):
self._sequence.append(Creator(item))
else:
- raise TypeError("The data passed for creator "
- "indexed %s has invalid format"
- % creators.index(item, 0,
- len(creators)))
+ raise TypeError("Invalid format for Creator: {}".format(item))
def __len__(self):
return len(self._sequence)
@@ -143,7 +146,7 @@ def insert(self, index, value):
elif isinstance(value, dict):
self._sequence.insert(index, Creator(value))
else:
- raise TypeError("The data passed has invalid format")
+ raise TypeError("The data passed has invalid format: {}".format(value))
def append(self, value):
if isinstance(value, Creator):
@@ -151,7 +154,7 @@ def append(self, value):
elif isinstance(value, dict):
self._sequence.append(Creator(value))
else:
- raise TypeError("The data passed has invalid format")
+ raise TypeError("The data passed has invalid format: {}".format(value))
def __setitem__(self, index, value):
if isinstance(value, Creator):
@@ -159,7 +162,7 @@ def __setitem__(self, index, value):
elif isinstance(value, dict):
self._sequence[index] = Creator(value)
else:
- raise TypeError("The data passed has invalid format")
+ raise TypeError("The data passed has invalid format: {}".format(value))
def __getitem__(self, index):
return self._sequence[index]
@@ -211,10 +214,10 @@ def parse_creator(data) -> 'Creator':
raise TypeError("Invalid format for Creator: {}".format(data))
def __str__(self):
- return str({"first_name": self.first_name, "last_name": self.last_name, "email": email, "organization_name": self.organization_name})
+ return str({"first_name": self.first_name, "last_name": self.last_name, "email": self.email, "organization_name": self.organization_name})
def __repr__(self):
- return str({"first_name": self.first_name, "last_name": self.last_name, "email": email, "organization_name": self.organization_name})
+ return str({"first_name": self.first_name, "last_name": self.last_name, "email": self.email, "organization_name": self.organization_name})
class ModifiedHistory(MutableSequence):
"""A list extension to store modification dates. Only Restricted
@@ -231,10 +234,10 @@ def __init__(self, modifiedList=None):
modifiedList = []
self._sequence = list()
if not isinstance(modifiedList, list):
- raise TypeError("The dates passed must be inside a list")
+ raise TypeError("The dates passed must be inside a list: {}".format(modifiedList))
for item in modifiedList:
if not isinstance(item, str):
- raise ValueError("Each date must be of type string")
+ raise ValueError("Each date must be of type string: {}".format(item))
validateDate(item)
self._sequence.append(item)
diff --git a/cobra/io/dict.py b/cobra/io/dict.py
index 47a7c0e3f..f65868d4a 100644
--- a/cobra/io/dict.py
+++ b/cobra/io/dict.py
@@ -2,6 +2,7 @@
from __future__ import absolute_import
+from ast import literal_eval
from collections import OrderedDict
from operator import attrgetter, itemgetter
@@ -9,6 +10,7 @@
from six import iteritems, string_types
from cobra.core import Gene, Metabolite, Model, Reaction
+from cobra.core.metadata import MetaData
from cobra.util.solver import set_objective
@@ -74,6 +76,32 @@ def _fix_type(value):
return value
+def _annotation_to_dict(annotation):
+ anno_str = str(annotation.cvterms)
+ anno_dict = literal_eval(anno_str)
+ final_dict = {"cvterms": anno_dict}
+
+ if annotation.history.isSetHistory():
+ history_str = str(annotation.history)
+ history_dict = literal_eval(history_str)
+ final_dict["history"] = history_dict
+
+ if 'sbo' in annotation and annotation['sbo'] != []:
+ final_dict['sbo'] = annotation['sbo']
+
+ return final_dict
+
+
+def _extract_annotation(data):
+ cvterms = data["cvterms"] if "cvterms" in data else None
+ history = data["history"] if "history" in data else None
+ keyValueDict = data["history"] if "keyValueDict" in data else None
+ annotation = MetaData(cvterms, history, keyValueDict)
+ if "sbo" in data:
+ annotation["sbo"] = data["sbo"]
+ return annotation
+
+
def _update_optional(cobra_object, new_dict, optional_attribute_dict,
ordered_keys):
"""update new_dict with optional attributes from cobra_object"""
@@ -82,6 +110,8 @@ def _update_optional(cobra_object, new_dict, optional_attribute_dict,
value = getattr(cobra_object, key)
if value is None or value == default:
continue
+ if key == "annotation":
+ value = _annotation_to_dict(value)
new_dict[key] = _fix_type(value)
@@ -97,7 +127,11 @@ def metabolite_to_dict(metabolite):
def metabolite_from_dict(metabolite):
new_metabolite = Metabolite()
for k, v in iteritems(metabolite):
- setattr(new_metabolite, k, v)
+ if k == "annotation":
+ value = _extract_annotation(v)
+ setattr(new_metabolite, k, value)
+ else:
+ setattr(new_metabolite, k, v)
return new_metabolite
@@ -113,7 +147,11 @@ def gene_to_dict(gene):
def gene_from_dict(gene):
new_gene = Gene(gene["id"])
for k, v in iteritems(gene):
- setattr(new_gene, k, v)
+ if k == "annotation":
+ value = _extract_annotation(v)
+ setattr(new_gene, k, value)
+ else:
+ setattr(new_gene, k, v)
return new_gene
@@ -142,7 +180,11 @@ def reaction_from_dict(reaction, model):
(model.metabolites.get_by_id(str(met)), coeff)
for met, coeff in iteritems(v)))
else:
- setattr(new_reaction, k, v)
+ if k == "annotation":
+ value = _extract_annotation(v)
+ setattr(new_reaction, k, value)
+ else:
+ setattr(new_reaction, k, v)
return new_reaction
@@ -224,6 +266,9 @@ def model_from_dict(obj):
rxn in objective_reactions}
set_objective(model, coefficients)
for k, v in iteritems(obj):
- if k in {'id', 'name', 'notes', 'compartments', 'annotation'}:
+ if k == "annotation":
+ value = _extract_annotation(v)
+ setattr(model, k, value)
+ elif k in {'id', 'name', 'notes', 'compartments'}:
setattr(model, k, v)
return model
diff --git a/cobra/io/sbml.py b/cobra/io/sbml.py
index 5cee9ccbf..6a90b3c77 100644
--- a/cobra/io/sbml.py
+++ b/cobra/io/sbml.py
@@ -1439,6 +1439,36 @@ def _parse_annotations(sbase):
new_cvterms = CVTerms({qualifier: CVList([ext_res])})
annotation.add_cvterms(new_cvterms)
+ # history of the component
+ if sbase.isSetModelHistory():
+ model_history = sbase.getModelHistory() # type: libsbml.ModelHistory
+
+ cobra_creators = []
+ for index in range(model_history.getNumCreators()):
+ creator = model_history.getCreator(index) # type: libsbml.Creator
+ cobra_creator = {}
+ if creator.isSetGivenName():
+ cobra_creator["first_name"] = creator.getGivenName()
+ if creator.isSetFamilyName():
+ cobra_creator["last_name"] = creator.getFamilyName()
+ if creator.isSetEmail():
+ cobra_creator["email"] = creator.getEmail()
+ if creator.isSetOrganisation():
+ cobra_creator["organization_name"] = creator.getOrganisation()
+ cobra_creators.append(cobra_creator)
+ annotation.history.creators = cobra_creators
+
+ if model_history.isSetCreatedDate():
+ date = model_history.getCreatedDate() # type: libsbml.Date
+ cobra_date = date.getDateAsString()
+ annotation.history.created = cobra_date
+
+ cobra_modified_dates = []
+ for index in range(model_history.getNumModifiedDates()):
+ modified_date = model_history.getModifiedDate(index)
+ cobra_modified_dates.append(modified_date.getDateAsString())
+ annotation.history.modified = cobra_modified_dates
+
return annotation
@@ -1465,7 +1495,6 @@ def _set_nested_data(cvterm_obj):
ext_res["resources"].append(uri)
ext_res["nested_data"] = _set_nested_data(cvterm)
new_cvterms = CVTerms({qualifier: CVList([ext_res])})
- # print(new_cvterms)
cobra_nested_cvterms.add_cvterms(new_cvterms)
return cobra_nested_cvterms
@@ -1533,6 +1562,30 @@ def _sbase_annotations(sbase, annotation):
_check(sbase.addCVTerm(cv),
"Setting cvterm: {}".format(cv))
+ if annotation.history.isSetHistory():
+ # component history
+ comp_history = libsbml.ModelHistory()
+
+ for creator in annotation.history.creators:
+ comp_creator = libsbml.ModelCreator()
+ comp_creator.setGivenName(creator.first_name)
+ comp_creator.setFamilyName(creator.last_name)
+ comp_creator.setEmail(creator.email)
+ comp_creator.setOrganisation(creator.organization_name)
+ comp_history.addCreator(comp_creator)
+
+ if annotation.history.created is not None:
+ date = libsbml.Date(annotation.history.created)
+ comp_history.setCreatedDate(date)
+
+ for modified_date in annotation.history.modified:
+ date = libsbml.Date(modified_date)
+ comp_history.addModifiedDate(date)
+
+ # finally add the compo_history
+ _check(sbase.setModelHistory(comp_history),
+ "Setting ModelHistory: {}".format(comp_history))
+
def _add_nested_data(cvterm, nested_data):
for key, value in nested_data.items():
From c9e904bd509c507d368c5db1bec6d8ec08b2fb53 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Thu, 25 Jun 2020 18:16:09 +0530
Subject: [PATCH 19/76] added tests for new annotation format
---
cobra/core/metadata/cvterm.py | 20 +
.../examples/e_coli_core_json_writing.json | 8853 +++++++++++++++++
.../metadata/examples/e_coli_core_writing.xml | 8088 +++++++++++++++
cobra/core/metadata/examples/test_metadata.py | 122 +-
cobra/io/dict.py | 13 +-
.../test/data/e_coli_core_for_annotation.xml | 8328 ++++++++++++++++
6 files changed, 25402 insertions(+), 22 deletions(-)
create mode 100644 cobra/core/metadata/examples/e_coli_core_json_writing.json
create mode 100644 cobra/core/metadata/examples/e_coli_core_writing.xml
create mode 100644 cobra/test/data/e_coli_core_for_annotation.xml
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 3cf9e8fe7..98c17bc8f 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -171,10 +171,30 @@ def add_simple_annotations(self, data: None):
if not isinstance(data, dict):
raise TypeError("The data passed must be of type dict: {}".format(data))
+ # if annotation is in the form of list of list, modify the format
+ if isinstance(data, list):
+ dict_anno = defaultdict(list)
+ for item in data:
+ cvt = CVTerm(resource = item[1])
+ data = cvt.parse_provider_identifier()
+ if data is None:
+ continue
+ else:
+ provider, identifier = data
+
+ dict_anno[provider].append(identifier)
+ data = dict_anno
+
for key, value in data.items():
if key == "sbo":
self._annotations[key] = value
continue
+
+ # if single identifiers are put directly as string,
+ # put them inside a list
+ if isinstance(value, str) and key != 'sbo':
+ data[key] = [value]
+ value = [value]
if not isinstance(value, list):
raise TypeError("The value passed must be of type list: {}".format(value))
if not isinstance(key, str):
diff --git a/cobra/core/metadata/examples/e_coli_core_json_writing.json b/cobra/core/metadata/examples/e_coli_core_json_writing.json
new file mode 100644
index 000000000..5146c3a95
--- /dev/null
+++ b/cobra/core/metadata/examples/e_coli_core_json_writing.json
@@ -0,0 +1,8853 @@
+{
+ "annotation": {
+ "cvterms": {
+ "bqb_hasTaxon": [
+ {
+ "resources": [
+ "http://identifiers.org/taxonomy/511145"
+ ]
+ }
+ ],
+ "bqm_is": [
+ {
+ "nested_data": {
+ "bqb_isDescribedBy": [
+ {
+ "resources": [
+ "https://identifiers.org/pubmed/1111111"
+ ]
+ },
+ {
+ "resources": [
+ "https://identifiers.org/eco/ECO:0000004"
+ ]
+ }
+ ]
+ },
+ "resources": [
+ "http://identifiers.org/bigg.model/e_coli_core"
+ ]
+ }
+ ],
+ "bqm_isDescribedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/doi/10.1128/ecosalplus.10.2.1"
+ ]
+ },
+ {
+ "resources": [
+ "http://identifiers.org/ncbigi/gi:16128336"
+ ]
+ }
+ ]
+ },
+ "history": {
+ "created": "2019-03-06T14:40:55Z",
+ "creators": [
+ {
+ "email": "koenigmx@hu-berlin.de",
+ "first_name": "Matthias",
+ "last_name": "Koenig",
+ "organization_name": "Humboldt-University Berlin, Institute for Theoretical Biology"
+ }
+ ],
+ "modified": [
+ "2019-03-06T14:40:55Z"
+ ]
+ }
+ },
+ "compartments": {
+ "c": "cytosol",
+ "e": "extracellular space"
+ },
+ "genes": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77580"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001207",
+ "http://identifiers.org/ecogene/EG13625",
+ "http://identifiers.org/ncbigene/945008",
+ "http://identifiers.org/ncbigi/gi:16128336"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0351",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9Q7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004164",
+ "http://identifiers.org/ecogene/EG10031",
+ "http://identifiers.org/ncbigene/945837",
+ "http://identifiers.org/ncbigi/gi:16129202"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1241",
+ "name": ""
+ },
+ {
+ "id": "s0001",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6A3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007579",
+ "http://identifiers.org/ecogene/EG10027",
+ "http://identifiers.org/ncbigene/946775",
+ "http://identifiers.org/ncbigi/gi:16130231"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2296",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P11868"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010245",
+ "http://identifiers.org/ecogene/EG11172",
+ "http://identifiers.org/ncbigene/947635",
+ "http://identifiers.org/ncbigi/gi:145698313"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3115",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33221"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006162",
+ "http://identifiers.org/ecogene/EG11809",
+ "http://identifiers.org/ncbigene/946368",
+ "http://identifiers.org/ncbigi/gi:16129802"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1849",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P25516"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004283",
+ "http://identifiers.org/ecogene/EG11325",
+ "http://identifiers.org/ncbigene/946724",
+ "http://identifiers.org/ncbigi/gi:16129237"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1276",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P36683"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000411",
+ "http://identifiers.org/ecogene/EG12316",
+ "http://identifiers.org/ncbigene/944864",
+ "http://identifiers.org/ncbigi/gi:16128111"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0118",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69441"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001645",
+ "http://identifiers.org/ecogene/EG10032",
+ "http://identifiers.org/ncbigene/945097",
+ "http://identifiers.org/ncbigi/gi:16128458"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0474",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002478",
+ "http://identifiers.org/ecogene/EG10979",
+ "http://identifiers.org/ncbigene/945303",
+ "http://identifiers.org/ncbigi/gi:16128701"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0726",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9P0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000404",
+ "http://identifiers.org/ecogene/EG10543",
+ "http://identifiers.org/ncbigene/944854",
+ "http://identifiers.org/ncbigi/gi:16128109"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0116",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002480",
+ "http://identifiers.org/ecogene/EG10980",
+ "http://identifiers.org/ncbigene/945307",
+ "http://identifiers.org/ncbigi/gi:16128702"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0727",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEX3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008515",
+ "http://identifiers.org/ecogene/EG10522",
+ "http://identifiers.org/ncbigene/947069",
+ "http://identifiers.org/ncbigi/gi:16130512"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2587",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P25437"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001221",
+ "http://identifiers.org/ecogene/EG50010",
+ "http://identifiers.org/ncbigene/944988",
+ "http://identifiers.org/ncbigi/gi:16128341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0356",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P39451"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004928",
+ "http://identifiers.org/ecogene/EG12622",
+ "http://identifiers.org/ncbigene/946036",
+ "http://identifiers.org/ncbigi/gi:90111280"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1478",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012217",
+ "http://identifiers.org/ecogene/EG10103",
+ "http://identifiers.org/ncbigene/948247",
+ "http://identifiers.org/ncbigi/gi:16131604"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3736",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6E6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012206",
+ "http://identifiers.org/ecogene/EG10100",
+ "http://identifiers.org/ncbigene/948245",
+ "http://identifiers.org/ncbigi/gi:16131599"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3731",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABB4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012208",
+ "http://identifiers.org/ecogene/EG10101",
+ "http://identifiers.org/ncbigene/948244",
+ "http://identifiers.org/ncbigi/gi:16131600"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3732",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P68699"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012220",
+ "http://identifiers.org/ecogene/EG10102",
+ "http://identifiers.org/ncbigene/948253",
+ "http://identifiers.org/ncbigi/gi:16131605"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3737",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABB0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012213",
+ "http://identifiers.org/ecogene/EG10098",
+ "http://identifiers.org/ncbigene/948242",
+ "http://identifiers.org/ncbigi/gi:16131602"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3734",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012215",
+ "http://identifiers.org/ecogene/EG10105",
+ "http://identifiers.org/ncbigene/948254",
+ "http://identifiers.org/ncbigi/gi:16131603"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3735",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB98"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012222",
+ "http://identifiers.org/ecogene/EG10099",
+ "http://identifiers.org/ncbigene/948252",
+ "http://identifiers.org/ncbigi/gi:16131606"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3738",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABC0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012224",
+ "http://identifiers.org/ecogene/EG10106",
+ "http://identifiers.org/ncbigene/948251",
+ "http://identifiers.org/ncbigi/gi:90111645"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3739",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012211",
+ "http://identifiers.org/ecogene/EG10104",
+ "http://identifiers.org/ncbigene/948243",
+ "http://identifiers.org/ncbigi/gi:16131601"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3733",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABH7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002451",
+ "http://identifiers.org/ecogene/EG10402",
+ "http://identifiers.org/ncbigene/945323",
+ "http://identifiers.org/ncbigi/gi:16128695"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0720",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26458"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003302",
+ "http://identifiers.org/ecogene/EG11379",
+ "http://identifiers.org/ncbigene/947547",
+ "http://identifiers.org/ncbigi/gi:16128945"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0979",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26459"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003300",
+ "http://identifiers.org/ecogene/EG11380",
+ "http://identifiers.org/ncbigene/945585",
+ "http://identifiers.org/ncbigi/gi:16128944"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0978",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABJ9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002499",
+ "http://identifiers.org/ecogene/EG10173",
+ "http://identifiers.org/ncbigene/945341",
+ "http://identifiers.org/ncbigi/gi:90111166"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0733",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABK2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002501",
+ "http://identifiers.org/ecogene/EG10174",
+ "http://identifiers.org/ncbigene/945347",
+ "http://identifiers.org/ncbigi/gi:16128709"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0734",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/Q46839"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009763",
+ "http://identifiers.org/ecogene/EG12995",
+ "http://identifiers.org/ncbigene/947259",
+ "http://identifiers.org/ncbigi/gi:16130875"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2975",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33231"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011777",
+ "http://identifiers.org/ecogene/EG11961",
+ "http://identifiers.org/ncbigene/948114",
+ "http://identifiers.org/ncbigi/gi:16131474"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3603",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6P9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009110",
+ "http://identifiers.org/ecogene/EG10258",
+ "http://identifiers.org/ncbigene/945032",
+ "http://identifiers.org/ncbigi/gi:16130686"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2779",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A991"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006941",
+ "http://identifiers.org/ecogene/EG14062",
+ "http://identifiers.org/ncbigene/946632",
+ "http://identifiers.org/ncbigi/gi:90111385"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2097",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77704"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005906",
+ "http://identifiers.org/ecogene/EG13485",
+ "http://identifiers.org/ncbigene/946291",
+ "http://identifiers.org/ncbigi/gi:16129727"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1773",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB71"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009600",
+ "http://identifiers.org/ecogene/EG10282",
+ "http://identifiers.org/ncbigene/947415",
+ "http://identifiers.org/ncbigi/gi:16130826"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2925",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A993"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013842",
+ "http://identifiers.org/ecogene/EG10283",
+ "http://identifiers.org/ncbigene/948753",
+ "http://identifiers.org/ncbigi/gi:16132054"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4232",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9C9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012821",
+ "http://identifiers.org/ecogene/EG11517",
+ "http://identifiers.org/ncbigene/948424",
+ "http://identifiers.org/ncbigi/gi:16131763"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3925",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77733"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008206",
+ "http://identifiers.org/ecogene/EG14220",
+ "http://identifiers.org/ncbigene/949032",
+ "http://identifiers.org/ncbigi/gi:16130417"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2492",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC23"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003073",
+ "http://identifiers.org/ecogene/EG11258",
+ "http://identifiers.org/ncbigene/945513",
+ "http://identifiers.org/ncbigi/gi:16128871"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0904",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A8Q3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013595",
+ "http://identifiers.org/ecogene/EG10333",
+ "http://identifiers.org/ncbigene/948668",
+ "http://identifiers.org/ncbigi/gi:16131976"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4151",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A8Q0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013598",
+ "http://identifiers.org/ecogene/EG10332",
+ "http://identifiers.org/ncbigene/948680",
+ "http://identifiers.org/ncbigi/gi:16131977"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4152",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00363"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013604",
+ "http://identifiers.org/ecogene/EG10330",
+ "http://identifiers.org/ncbigene/948667",
+ "http://identifiers.org/ncbigi/gi:16131979"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4154",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC47"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013602",
+ "http://identifiers.org/ecogene/EG10331",
+ "http://identifiers.org/ncbigene/948666",
+ "http://identifiers.org/ncbigi/gi:16131978"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4153",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08839"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007967",
+ "http://identifiers.org/ecogene/EG10789",
+ "http://identifiers.org/ncbigene/946879",
+ "http://identifiers.org/ncbigi/gi:16130342"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2416",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AA04"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007962",
+ "http://identifiers.org/ecogene/EG10788",
+ "http://identifiers.org/ncbigene/946886",
+ "http://identifiers.org/ncbigi/gi:16130341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2415",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69797"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006054",
+ "http://identifiers.org/ecogene/EG10567",
+ "http://identifiers.org/ncbigene/946334",
+ "http://identifiers.org/ncbigi/gi:16129771"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1817",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69801"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006056",
+ "http://identifiers.org/ecogene/EG10568",
+ "http://identifiers.org/ncbigene/946332",
+ "http://identifiers.org/ncbigi/gi:16129772"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1818",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69805"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006058",
+ "http://identifiers.org/ecogene/EG10569",
+ "http://identifiers.org/ncbigene/946342",
+ "http://identifiers.org/ncbigi/gi:345452720"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1819",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P05042"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005380",
+ "http://identifiers.org/ecogene/EG10358",
+ "http://identifiers.org/ncbigene/946147",
+ "http://identifiers.org/ncbigi/gi:16129569"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1611",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P14407"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013501",
+ "http://identifiers.org/ecogene/EG10357",
+ "http://identifiers.org/ncbigene/948642",
+ "http://identifiers.org/ncbigi/gi:16131948"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4122",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC33"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005392",
+ "http://identifiers.org/ecogene/EG10356",
+ "http://identifiers.org/ncbigene/946826",
+ "http://identifiers.org/ncbigi/gi:16129570"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1612",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A830"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011527",
+ "http://identifiers.org/ecogene/EG20044",
+ "http://identifiers.org/ncbigene/948039",
+ "http://identifiers.org/ncbigi/gi:16131400"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3528",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC53"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006171",
+ "http://identifiers.org/ecogene/EG11221",
+ "http://identifiers.org/ncbigene/946370",
+ "http://identifiers.org/ncbigi/gi:16129805"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1852",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9B2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005920",
+ "http://identifiers.org/ecogene/EG10367",
+ "http://identifiers.org/ncbigene/947679",
+ "http://identifiers.org/ncbigi/gi:16129733"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1779",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69786"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003722",
+ "http://identifiers.org/ecogene/EG10787",
+ "http://identifiers.org/ncbigene/945651",
+ "http://identifiers.org/ncbigi/gi:16129064"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1101",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69783"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007971",
+ "http://identifiers.org/ecogene/EG10165",
+ "http://identifiers.org/ncbigene/946880",
+ "http://identifiers.org/ncbigi/gi:16130343"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2417",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P19642"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005429",
+ "http://identifiers.org/ecogene/EG10563",
+ "http://identifiers.org/ncbigene/946009",
+ "http://identifiers.org/ncbigi/gi:16129579"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1621",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P78061"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004365",
+ "http://identifiers.org/ecogene/EG13908",
+ "http://identifiers.org/ncbigene/946202",
+ "http://identifiers.org/ncbigi/gi:90111244"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1297",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9C5"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012640",
+ "http://identifiers.org/ecogene/EG10383",
+ "http://identifiers.org/ncbigene/948370",
+ "http://identifiers.org/ncbigi/gi:16131710"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3870",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEQ3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002771",
+ "http://identifiers.org/ecogene/EG10386",
+ "http://identifiers.org/ncbigene/944872",
+ "http://identifiers.org/ncbigi/gi:16128779"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0811",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEQ6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002766",
+ "http://identifiers.org/ecogene/EG10388",
+ "http://identifiers.org/ncbigene/945621",
+ "http://identifiers.org/ncbigi/gi:16128778"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0810",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P10346"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002764",
+ "http://identifiers.org/ecogene/EG10389",
+ "http://identifiers.org/ncbigene/945435",
+ "http://identifiers.org/ncbigi/gi:16128777"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0809",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00370"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005865",
+ "http://identifiers.org/ecogene/EG10372",
+ "http://identifiers.org/ncbigene/946802",
+ "http://identifiers.org/ncbigi/gi:16129715"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1761",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77454"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001688",
+ "http://identifiers.org/ecogene/EG13247",
+ "http://identifiers.org/ncbigene/946187",
+ "http://identifiers.org/ncbigi/gi:16128469"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0485",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6W0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005086",
+ "http://identifiers.org/ecogene/EG13816",
+ "http://identifiers.org/ncbigene/944973",
+ "http://identifiers.org/ncbigi/gi:16129483"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1524",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P05041"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006031",
+ "http://identifiers.org/ecogene/EG10683",
+ "http://identifiers.org/ncbigene/946337",
+ "http://identifiers.org/ncbigi/gi:16129766"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1812",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09831"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010545",
+ "http://identifiers.org/ecogene/EG10403",
+ "http://identifiers.org/ncbigene/947724",
+ "http://identifiers.org/ncbigi/gi:308209621"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3212",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09832"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010547",
+ "http://identifiers.org/ecogene/EG10404",
+ "http://identifiers.org/ncbigene/947723",
+ "http://identifiers.org/ncbigi/gi:16131103"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3213",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P21345"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013357",
+ "http://identifiers.org/ecogene/EG10405",
+ "http://identifiers.org/ncbigene/948591",
+ "http://identifiers.org/ncbigi/gi:16131903"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4077",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00350"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006737",
+ "http://identifiers.org/ecogene/EG10411",
+ "http://identifiers.org/ncbigene/946554",
+ "http://identifiers.org/ncbigi/gi:16129970"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2029",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P60844"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002976",
+ "http://identifiers.org/ecogene/EG13270",
+ "http://identifiers.org/ncbigene/945497",
+ "http://identifiers.org/ncbigi/gi:16128843"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0875",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08200"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003823",
+ "http://identifiers.org/ecogene/EG10489",
+ "http://identifiers.org/ncbigene/945702",
+ "http://identifiers.org/ncbigi/gi:16129099"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1136",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9G6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013128",
+ "http://identifiers.org/ecogene/EG10022",
+ "http://identifiers.org/ncbigene/948517",
+ "http://identifiers.org/ncbigi/gi:16131841"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4015",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06149"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007048",
+ "http://identifiers.org/ecogene/EG10231",
+ "http://identifiers.org/ncbigene/946653",
+ "http://identifiers.org/ncbigi/gi:16130071"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2133",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P52643"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004619",
+ "http://identifiers.org/ecogene/EG13186",
+ "http://identifiers.org/ncbigene/946315",
+ "http://identifiers.org/ncbigi/gi:16129341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1380",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37330"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009767",
+ "http://identifiers.org/ecogene/EG20080",
+ "http://identifiers.org/ncbigene/948857",
+ "http://identifiers.org/ncbigi/gi:16130876"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2976",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08997"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013125",
+ "http://identifiers.org/ecogene/EG10023",
+ "http://identifiers.org/ncbigene/948512",
+ "http://identifiers.org/ncbigi/gi:16131840"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4014",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P61889"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010613",
+ "http://identifiers.org/ecogene/EG10576",
+ "http://identifiers.org/ncbigene/947854",
+ "http://identifiers.org/ncbigi/gi:16131126"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3236",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26616"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004931",
+ "http://identifiers.org/ecogene/EG10948",
+ "http://identifiers.org/ncbigene/946031",
+ "http://identifiers.org/ncbigi/gi:90111281"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1479",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P76558"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008111",
+ "http://identifiers.org/ecogene/EG14193",
+ "http://identifiers.org/ncbigene/946947",
+ "http://identifiers.org/ncbigi/gi:16130388"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2463",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFF0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007526",
+ "http://identifiers.org/ecogene/EG12093",
+ "http://identifiers.org/ncbigene/945136",
+ "http://identifiers.org/ncbigi/gi:145698289"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2276",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007534",
+ "http://identifiers.org/ecogene/EG12091",
+ "http://identifiers.org/ncbigene/947580",
+ "http://identifiers.org/ncbigi/gi:16130214"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2279",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFC3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007553",
+ "http://identifiers.org/ecogene/EG12082",
+ "http://identifiers.org/ncbigene/946764",
+ "http://identifiers.org/ncbigi/gi:49176207"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2288",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33607"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007532",
+ "http://identifiers.org/ecogene/EG12092",
+ "http://identifiers.org/ncbigene/945540",
+ "http://identifiers.org/ncbigi/gi:16130213"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2278",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33599"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007549",
+ "http://identifiers.org/ecogene/EG12084",
+ "http://identifiers.org/ncbigene/946759",
+ "http://identifiers.org/ncbigi/gi:145698291"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2286",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD1"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007547",
+ "http://identifiers.org/ecogene/EG12086",
+ "http://identifiers.org/ncbigene/946746",
+ "http://identifiers.org/ncbigi/gi:16130220"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2285",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33602"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007543",
+ "http://identifiers.org/ecogene/EG12087",
+ "http://identifiers.org/ncbigene/946762",
+ "http://identifiers.org/ncbigi/gi:145698290"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2283",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFC7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007551",
+ "http://identifiers.org/ecogene/EG12083",
+ "http://identifiers.org/ncbigene/946738",
+ "http://identifiers.org/ncbigi/gi:16130222"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2287",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P31979"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007545",
+ "http://identifiers.org/ecogene/EG11774",
+ "http://identifiers.org/ncbigene/946753",
+ "http://identifiers.org/ncbigi/gi:16130219"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2284",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007539",
+ "http://identifiers.org/ecogene/EG12089",
+ "http://identifiers.org/ncbigene/946757",
+ "http://identifiers.org/ncbigi/gi:16130216"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2281",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007529",
+ "http://identifiers.org/ecogene/EG11773",
+ "http://identifiers.org/ncbigene/947731",
+ "http://identifiers.org/ncbigi/gi:16130212"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2277",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007541",
+ "http://identifiers.org/ecogene/EG12088",
+ "http://identifiers.org/ncbigene/946761",
+ "http://identifiers.org/ncbigi/gi:16130217"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2282",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007536",
+ "http://identifiers.org/ecogene/EG12090",
+ "http://identifiers.org/ncbigene/946756",
+ "http://identifiers.org/ncbigi/gi:16130215"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2280",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P07001"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005354",
+ "http://identifiers.org/ecogene/EG10744",
+ "http://identifiers.org/ncbigene/946628",
+ "http://identifiers.org/ncbigi/gi:16129561"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1603",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB67"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005352",
+ "http://identifiers.org/ecogene/EG10745",
+ "http://identifiers.org/ncbigene/946144",
+ "http://identifiers.org/ncbigi/gi:16129560"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1602",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P27306"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012975",
+ "http://identifiers.org/ecogene/EG11428",
+ "http://identifiers.org/ncbigene/948461",
+ "http://identifiers.org/ncbigi/gi:90111670"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3962",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69681"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001564",
+ "http://identifiers.org/ecogene/EG11821",
+ "http://identifiers.org/ncbigene/945084",
+ "http://identifiers.org/ncbigi/gi:16128436"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0451",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000397",
+ "http://identifiers.org/ecogene/EG10024",
+ "http://identifiers.org/ncbigene/944834",
+ "http://identifiers.org/ncbigi/gi:16128107"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0114",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06959"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000400",
+ "http://identifiers.org/ecogene/EG10025",
+ "http://identifiers.org/ncbigene/944794",
+ "http://identifiers.org/ncbigi/gi:16128108"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0115",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06999"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005748",
+ "http://identifiers.org/ecogene/EG10700",
+ "http://identifiers.org/ncbigene/946230",
+ "http://identifiers.org/ncbigi/gi:49176138"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1723",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A796"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012789",
+ "http://identifiers.org/ecogene/EG10699",
+ "http://identifiers.org/ncbigene/948412",
+ "http://identifiers.org/ncbigi/gi:16131754"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3916",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P42632"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010242",
+ "http://identifiers.org/ecogene/EG12758",
+ "http://identifiers.org/ncbigene/947623",
+ "http://identifiers.org/ncbigi/gi:49176316"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3114",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P32675"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012937",
+ "http://identifiers.org/ecogene/EG11911",
+ "http://identifiers.org/ncbigene/948453",
+ "http://identifiers.org/ncbigi/gi:49176447"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3952",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P32674"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012934",
+ "http://identifiers.org/ecogene/EG11910",
+ "http://identifiers.org/ncbigene/948454",
+ "http://identifiers.org/ncbigi/gi:16131789"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3951",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9N4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003068",
+ "http://identifiers.org/ecogene/EG10028",
+ "http://identifiers.org/ncbigene/945517",
+ "http://identifiers.org/ncbigi/gi:16128869"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0902",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09373"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003071",
+ "http://identifiers.org/ecogene/EG10701",
+ "http://identifiers.org/ncbigene/945514",
+ "http://identifiers.org/ncbigi/gi:16128870"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0903",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P68066"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008489",
+ "http://identifiers.org/ecogene/EG11784",
+ "http://identifiers.org/ncbigene/947068",
+ "http://identifiers.org/ncbigi/gi:16130504"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2579",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6T1"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013163",
+ "http://identifiers.org/ecogene/EG10702",
+ "http://identifiers.org/ncbigene/948535",
+ "http://identifiers.org/ncbigi/gi:16131851"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4025",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A799"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009605",
+ "http://identifiers.org/ecogene/EG10703",
+ "http://identifiers.org/ncbigene/947414",
+ "http://identifiers.org/ncbigi/gi:16130827"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2926",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P52697"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002611",
+ "http://identifiers.org/ecogene/EG13231",
+ "http://identifiers.org/ncbigene/946398",
+ "http://identifiers.org/ncbigi/gi:16128735"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0767",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P62707"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002563",
+ "http://identifiers.org/ecogene/EG11699",
+ "http://identifiers.org/ncbigene/945068",
+ "http://identifiers.org/ncbigi/gi:16128723"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0755",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A7A2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0014416",
+ "http://identifiers.org/ecogene/EG12164",
+ "http://identifiers.org/ncbigene/948918",
+ "http://identifiers.org/ncbigi/gi:16132212"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4395",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37689"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011818",
+ "http://identifiers.org/ecogene/EG12296",
+ "http://identifiers.org/ncbigene/948130",
+ "http://identifiers.org/ncbigi/gi:16131483"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3612",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P43676"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009800",
+ "http://identifiers.org/ecogene/EG12883",
+ "http://identifiers.org/ncbigene/947475",
+ "http://identifiers.org/ncbigi/gi:16130887"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2987",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFJ7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011407",
+ "http://identifiers.org/ecogene/EG12230",
+ "http://identifiers.org/ncbigene/948009",
+ "http://identifiers.org/ncbigi/gi:16131365"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3493",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00864"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012950",
+ "http://identifiers.org/ecogene/EG10756",
+ "http://identifiers.org/ncbigene/948457",
+ "http://identifiers.org/ncbigi/gi:16131794"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3956",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P22259"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011106",
+ "http://identifiers.org/ecogene/EG10688",
+ "http://identifiers.org/ncbigene/945667",
+ "http://identifiers.org/ncbigi/gi:16131280"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3403",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P23538"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005678",
+ "http://identifiers.org/ecogene/EG10759",
+ "http://identifiers.org/ncbigene/946209",
+ "http://identifiers.org/ncbigi/gi:16129658"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1702",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9M8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007582",
+ "http://identifiers.org/ecogene/EG20173",
+ "http://identifiers.org/ncbigene/946778",
+ "http://identifiers.org/ncbigi/gi:16130232"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2297",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77218"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008097",
+ "http://identifiers.org/ecogene/EG14188",
+ "http://identifiers.org/ncbigene/946940",
+ "http://identifiers.org/ncbigi/gi:16130383"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2458",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AD61"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005600",
+ "http://identifiers.org/ecogene/EG10804",
+ "http://identifiers.org/ncbigene/946179",
+ "http://identifiers.org/ncbigi/gi:16129632"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1676",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P21599"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006182",
+ "http://identifiers.org/ecogene/EG10803",
+ "http://identifiers.org/ncbigene/946527",
+ "http://identifiers.org/ncbigi/gi:16129807"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1854",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P39362"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0014097",
+ "http://identifiers.org/ecogene/EG12553",
+ "http://identifiers.org/ncbigene/948829",
+ "http://identifiers.org/ncbigi/gi:16132122"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4301",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AG07"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011061",
+ "http://identifiers.org/ecogene/EG11960",
+ "http://identifiers.org/ncbigene/947896",
+ "http://identifiers.org/ncbigi/gi:16131264"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3386",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A7Z0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009567",
+ "http://identifiers.org/ecogene/EG11443",
+ "http://identifiers.org/ncbigene/947407",
+ "http://identifiers.org/ncbigi/gi:16130815"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2914",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37351"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013405",
+ "http://identifiers.org/ecogene/EG11827",
+ "http://identifiers.org/ncbigene/948602",
+ "http://identifiers.org/ncbigi/gi:16131916"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4090",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC41"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002466",
+ "http://identifiers.org/ecogene/EG10931",
+ "http://identifiers.org/ncbigene/945402",
+ "http://identifiers.org/ncbigi/gi:16128698"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0723",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P07014"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002468",
+ "http://identifiers.org/ecogene/EG10932",
+ "http://identifiers.org/ncbigene/945300",
+ "http://identifiers.org/ncbigi/gi:16128699"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0724",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC44"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002464",
+ "http://identifiers.org/ecogene/EG10934",
+ "http://identifiers.org/ncbigene/945322",
+ "http://identifiers.org/ncbigi/gi:16128697"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0722",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69054"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002460",
+ "http://identifiers.org/ecogene/EG10933",
+ "http://identifiers.org/ncbigene/945316",
+ "http://identifiers.org/ncbigi/gi:16128696"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0721",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AGE9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002485",
+ "http://identifiers.org/ecogene/EG10982",
+ "http://identifiers.org/ncbigene/945314",
+ "http://identifiers.org/ncbigi/gi:16128704"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0729",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A836"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002483",
+ "http://identifiers.org/ecogene/EG10981",
+ "http://identifiers.org/ncbigene/945312",
+ "http://identifiers.org/ncbigi/gi:16128703"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0728",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A870"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000027",
+ "http://identifiers.org/ecogene/EG11556",
+ "http://identifiers.org/ncbigene/944748",
+ "http://identifiers.org/ncbigi/gi:16128002"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0008",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A867"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008115",
+ "http://identifiers.org/ecogene/EG11797",
+ "http://identifiers.org/ncbigene/947006",
+ "http://identifiers.org/ncbigi/gi:16130389"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2464",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P27302"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009625",
+ "http://identifiers.org/ecogene/EG11427",
+ "http://identifiers.org/ncbigene/947420",
+ "http://identifiers.org/ncbigi/gi:49176286"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2935",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33570"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008117",
+ "http://identifiers.org/ecogene/EG12100",
+ "http://identifiers.org/ncbigene/945865",
+ "http://identifiers.org/ncbigi/gi:16130390"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2465",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A858"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012799",
+ "http://identifiers.org/ecogene/EG11015",
+ "http://identifiers.org/ncbigene/948409",
+ "http://identifiers.org/ncbigi/gi:16131757"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3919",
+ "name": ""
+ }
+ ],
+ "id": "e_coli_core",
+ "metabolites": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/13dpg",
+ "http://identifiers.org/biocyc/META:DPG",
+ "http://identifiers.org/chebi/CHEBI:11881",
+ "http://identifiers.org/chebi/CHEBI:16001",
+ "http://identifiers.org/chebi/CHEBI:1658",
+ "http://identifiers.org/chebi/CHEBI:20189",
+ "http://identifiers.org/chebi/CHEBI:57604",
+ "http://identifiers.org/hmdb/HMDB62758",
+ "http://identifiers.org/kegg.compound/C00236",
+ "http://identifiers.org/metanetx.chemical/MNXM261",
+ "http://identifiers.org/seed.compound/cpd00203"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O10P2",
+ "id": "13dpg_c",
+ "name": "3-Phospho-D-glyceroyl phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/2pg",
+ "http://identifiers.org/biocyc/META:2-PG",
+ "http://identifiers.org/chebi/CHEBI:11651",
+ "http://identifiers.org/chebi/CHEBI:1267",
+ "http://identifiers.org/chebi/CHEBI:12986",
+ "http://identifiers.org/chebi/CHEBI:17835",
+ "http://identifiers.org/chebi/CHEBI:21028",
+ "http://identifiers.org/chebi/CHEBI:24344",
+ "http://identifiers.org/chebi/CHEBI:39868",
+ "http://identifiers.org/chebi/CHEBI:58289",
+ "http://identifiers.org/chebi/CHEBI:88350",
+ "http://identifiers.org/hmdb/HMDB03391",
+ "http://identifiers.org/hmdb/HMDB62707",
+ "http://identifiers.org/kegg.compound/C00631",
+ "http://identifiers.org/metanetx.chemical/MNXM275",
+ "http://identifiers.org/seed.compound/cpd00482"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O7P",
+ "id": "2pg_c",
+ "name": "D-Glycerate 2-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/3pg",
+ "http://identifiers.org/biocyc/META:G3P",
+ "http://identifiers.org/chebi/CHEBI:11879",
+ "http://identifiers.org/chebi/CHEBI:11880",
+ "http://identifiers.org/chebi/CHEBI:12987",
+ "http://identifiers.org/chebi/CHEBI:1657",
+ "http://identifiers.org/chebi/CHEBI:17794",
+ "http://identifiers.org/chebi/CHEBI:21029",
+ "http://identifiers.org/chebi/CHEBI:58272",
+ "http://identifiers.org/kegg.compound/C00197",
+ "http://identifiers.org/metanetx.chemical/MNXM126",
+ "http://identifiers.org/seed.compound/cpd00169"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O7P",
+ "id": "3pg_c",
+ "name": "3-Phospho-D-glycerate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/6pgc",
+ "http://identifiers.org/biocyc/META:CPD-2961",
+ "http://identifiers.org/chebi/CHEBI:12232",
+ "http://identifiers.org/chebi/CHEBI:16863",
+ "http://identifiers.org/chebi/CHEBI:2231",
+ "http://identifiers.org/chebi/CHEBI:33851",
+ "http://identifiers.org/chebi/CHEBI:40282",
+ "http://identifiers.org/chebi/CHEBI:48928",
+ "http://identifiers.org/chebi/CHEBI:58759",
+ "http://identifiers.org/hmdb/HMDB01316",
+ "http://identifiers.org/hmdb/HMDB62800",
+ "http://identifiers.org/kegg.compound/C00345",
+ "http://identifiers.org/metanetx.chemical/MNXM325",
+ "http://identifiers.org/seed.compound/cpd00284"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H10O10P",
+ "id": "6pgc_c",
+ "name": "6-Phospho-D-gluconate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/6pgl",
+ "http://identifiers.org/biocyc/META:D-6-P-GLUCONO-DELTA-LACTONE",
+ "http://identifiers.org/chebi/CHEBI:12233",
+ "http://identifiers.org/chebi/CHEBI:12958",
+ "http://identifiers.org/chebi/CHEBI:16938",
+ "http://identifiers.org/chebi/CHEBI:20989",
+ "http://identifiers.org/chebi/CHEBI:4160",
+ "http://identifiers.org/chebi/CHEBI:57955",
+ "http://identifiers.org/hmdb/HMDB62628",
+ "http://identifiers.org/kegg.compound/C01236",
+ "http://identifiers.org/metanetx.chemical/MNXM429",
+ "http://identifiers.org/seed.compound/cpd00911"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H9O9P",
+ "id": "6pgl_c",
+ "name": "6-phospho-D-glucono-1,5-lactone"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ac",
+ "http://identifiers.org/biocyc/META:ACET",
+ "http://identifiers.org/chebi/CHEBI:13704",
+ "http://identifiers.org/chebi/CHEBI:15366",
+ "http://identifiers.org/chebi/CHEBI:22165",
+ "http://identifiers.org/chebi/CHEBI:22169",
+ "http://identifiers.org/chebi/CHEBI:2387",
+ "http://identifiers.org/chebi/CHEBI:30089",
+ "http://identifiers.org/chebi/CHEBI:40480",
+ "http://identifiers.org/chebi/CHEBI:40486",
+ "http://identifiers.org/hmdb/HMDB00042",
+ "http://identifiers.org/kegg.compound/C00033",
+ "http://identifiers.org/kegg.drug/D00010",
+ "http://identifiers.org/lipidmaps/LMFA01010002",
+ "http://identifiers.org/metanetx.chemical/MNXM26",
+ "http://identifiers.org/seed.compound/cpd00029"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H3O2",
+ "id": "ac_c",
+ "name": "Acetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ac",
+ "http://identifiers.org/biocyc/META:ACET",
+ "http://identifiers.org/chebi/CHEBI:13704",
+ "http://identifiers.org/chebi/CHEBI:15366",
+ "http://identifiers.org/chebi/CHEBI:22165",
+ "http://identifiers.org/chebi/CHEBI:22169",
+ "http://identifiers.org/chebi/CHEBI:2387",
+ "http://identifiers.org/chebi/CHEBI:30089",
+ "http://identifiers.org/chebi/CHEBI:40480",
+ "http://identifiers.org/chebi/CHEBI:40486",
+ "http://identifiers.org/hmdb/HMDB00042",
+ "http://identifiers.org/kegg.compound/C00033",
+ "http://identifiers.org/kegg.drug/D00010",
+ "http://identifiers.org/lipidmaps/LMFA01010002",
+ "http://identifiers.org/metanetx.chemical/MNXM26",
+ "http://identifiers.org/seed.compound/cpd00029"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H3O2",
+ "id": "ac_e",
+ "name": "Acetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acald",
+ "http://identifiers.org/biocyc/META:ACETALD",
+ "http://identifiers.org/chebi/CHEBI:13703",
+ "http://identifiers.org/chebi/CHEBI:15343",
+ "http://identifiers.org/chebi/CHEBI:22158",
+ "http://identifiers.org/chebi/CHEBI:2383",
+ "http://identifiers.org/chebi/CHEBI:40533",
+ "http://identifiers.org/hmdb/HMDB00990",
+ "http://identifiers.org/kegg.compound/C00084",
+ "http://identifiers.org/metanetx.chemical/MNXM75",
+ "http://identifiers.org/seed.compound/cpd00071"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H4O",
+ "id": "acald_c",
+ "name": "Acetaldehyde"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acald",
+ "http://identifiers.org/biocyc/META:ACETALD",
+ "http://identifiers.org/chebi/CHEBI:13703",
+ "http://identifiers.org/chebi/CHEBI:15343",
+ "http://identifiers.org/chebi/CHEBI:22158",
+ "http://identifiers.org/chebi/CHEBI:2383",
+ "http://identifiers.org/chebi/CHEBI:40533",
+ "http://identifiers.org/hmdb/HMDB00990",
+ "http://identifiers.org/kegg.compound/C00084",
+ "http://identifiers.org/metanetx.chemical/MNXM75",
+ "http://identifiers.org/seed.compound/cpd00071"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H4O",
+ "id": "acald_e",
+ "name": "Acetaldehyde"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/accoa",
+ "http://identifiers.org/biocyc/META:ACETYL-COA",
+ "http://identifiers.org/chebi/CHEBI:13712",
+ "http://identifiers.org/chebi/CHEBI:15351",
+ "http://identifiers.org/chebi/CHEBI:22192",
+ "http://identifiers.org/chebi/CHEBI:2408",
+ "http://identifiers.org/chebi/CHEBI:40470",
+ "http://identifiers.org/chebi/CHEBI:57288",
+ "http://identifiers.org/hmdb/HMDB01206",
+ "http://identifiers.org/kegg.compound/C00024",
+ "http://identifiers.org/lipidmaps/LMFA07050029",
+ "http://identifiers.org/lipidmaps/LMFA07050281",
+ "http://identifiers.org/metanetx.chemical/MNXM21",
+ "http://identifiers.org/seed.compound/cpd00022"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C23H34N7O17P3S",
+ "id": "accoa_c",
+ "name": "Acetyl-CoA"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acon_C",
+ "http://identifiers.org/biocyc/META:CIS-ACONITATE",
+ "http://identifiers.org/chebi/CHEBI:10482",
+ "http://identifiers.org/chebi/CHEBI:12798",
+ "http://identifiers.org/chebi/CHEBI:16383",
+ "http://identifiers.org/chebi/CHEBI:23306",
+ "http://identifiers.org/chebi/CHEBI:23308",
+ "http://identifiers.org/chebi/CHEBI:32805",
+ "http://identifiers.org/hmdb/HMDB00072",
+ "http://identifiers.org/hmdb/HMDB00461",
+ "http://identifiers.org/kegg.compound/C00417",
+ "http://identifiers.org/metanetx.chemical/MNXM813",
+ "http://identifiers.org/seed.compound/cpd00331"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H3O6",
+ "id": "acon_C_c",
+ "name": "Cis-Aconitate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/actp",
+ "http://identifiers.org/biocyc/META:ACETYL-P",
+ "http://identifiers.org/chebi/CHEBI:13711",
+ "http://identifiers.org/chebi/CHEBI:15350",
+ "http://identifiers.org/chebi/CHEBI:22191",
+ "http://identifiers.org/chebi/CHEBI:2407",
+ "http://identifiers.org/chebi/CHEBI:46262",
+ "http://identifiers.org/hmdb/HMDB01494",
+ "http://identifiers.org/kegg.compound/C00227",
+ "http://identifiers.org/metanetx.chemical/MNXM280",
+ "http://identifiers.org/seed.compound/cpd00196"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H3O5P",
+ "id": "actp_c",
+ "name": "Acetyl phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/adp",
+ "http://identifiers.org/biocyc/META:ADP",
+ "http://identifiers.org/biocyc/META:CPD0-1651",
+ "http://identifiers.org/chebi/CHEBI:13222",
+ "http://identifiers.org/chebi/CHEBI:16761",
+ "http://identifiers.org/chebi/CHEBI:22244",
+ "http://identifiers.org/chebi/CHEBI:2342",
+ "http://identifiers.org/chebi/CHEBI:40553",
+ "http://identifiers.org/chebi/CHEBI:456216",
+ "http://identifiers.org/chebi/CHEBI:87518",
+ "http://identifiers.org/hmdb/HMDB01341",
+ "http://identifiers.org/kegg.compound/C00008",
+ "http://identifiers.org/kegg.glycan/G11113",
+ "http://identifiers.org/metanetx.chemical/MNXM7",
+ "http://identifiers.org/seed.compound/cpd00008"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O10P2",
+ "id": "adp_c",
+ "name": "ADP C10H12N5O10P2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/akg",
+ "http://identifiers.org/biocyc/META:2-KETOGLUTARATE",
+ "http://identifiers.org/biocyc/META:CPD-16852",
+ "http://identifiers.org/chebi/CHEBI:11638",
+ "http://identifiers.org/chebi/CHEBI:1253",
+ "http://identifiers.org/chebi/CHEBI:16810",
+ "http://identifiers.org/chebi/CHEBI:19748",
+ "http://identifiers.org/chebi/CHEBI:19749",
+ "http://identifiers.org/chebi/CHEBI:30915",
+ "http://identifiers.org/chebi/CHEBI:30916",
+ "http://identifiers.org/chebi/CHEBI:40661",
+ "http://identifiers.org/hmdb/HMDB62781",
+ "http://identifiers.org/kegg.compound/C00026",
+ "http://identifiers.org/metanetx.chemical/MNXM20",
+ "http://identifiers.org/seed.compound/cpd00024"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H4O5",
+ "id": "akg_c",
+ "name": "2-Oxoglutarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/akg",
+ "http://identifiers.org/biocyc/META:2-KETOGLUTARATE",
+ "http://identifiers.org/biocyc/META:CPD-16852",
+ "http://identifiers.org/chebi/CHEBI:11638",
+ "http://identifiers.org/chebi/CHEBI:1253",
+ "http://identifiers.org/chebi/CHEBI:16810",
+ "http://identifiers.org/chebi/CHEBI:19748",
+ "http://identifiers.org/chebi/CHEBI:19749",
+ "http://identifiers.org/chebi/CHEBI:30915",
+ "http://identifiers.org/chebi/CHEBI:30916",
+ "http://identifiers.org/chebi/CHEBI:40661",
+ "http://identifiers.org/hmdb/HMDB62781",
+ "http://identifiers.org/kegg.compound/C00026",
+ "http://identifiers.org/metanetx.chemical/MNXM20",
+ "http://identifiers.org/seed.compound/cpd00024"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H4O5",
+ "id": "akg_e",
+ "name": "2-Oxoglutarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/amp",
+ "http://identifiers.org/biocyc/META:AMP",
+ "http://identifiers.org/biocyc/META:AMP-GROUP",
+ "http://identifiers.org/chebi/CHEBI:12056",
+ "http://identifiers.org/chebi/CHEBI:13234",
+ "http://identifiers.org/chebi/CHEBI:13235",
+ "http://identifiers.org/chebi/CHEBI:13736",
+ "http://identifiers.org/chebi/CHEBI:13740",
+ "http://identifiers.org/chebi/CHEBI:16027",
+ "http://identifiers.org/chebi/CHEBI:22242",
+ "http://identifiers.org/chebi/CHEBI:22245",
+ "http://identifiers.org/chebi/CHEBI:2356",
+ "http://identifiers.org/chebi/CHEBI:40510",
+ "http://identifiers.org/chebi/CHEBI:40721",
+ "http://identifiers.org/chebi/CHEBI:40726",
+ "http://identifiers.org/chebi/CHEBI:40786",
+ "http://identifiers.org/chebi/CHEBI:40826",
+ "http://identifiers.org/chebi/CHEBI:456215",
+ "http://identifiers.org/chebi/CHEBI:47222",
+ "http://identifiers.org/kegg.compound/C00020",
+ "http://identifiers.org/kegg.drug/D02769",
+ "http://identifiers.org/metanetx.chemical/MNXM14",
+ "http://identifiers.org/seed.compound/cpd00018",
+ "http://identifiers.org/seed.compound/cpd22272"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O7P",
+ "id": "amp_c",
+ "name": "AMP C10H12N5O7P"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/atp",
+ "http://identifiers.org/biocyc/META:ATP",
+ "http://identifiers.org/biocyc/META:CPD0-1634",
+ "http://identifiers.org/chebi/CHEBI:10789",
+ "http://identifiers.org/chebi/CHEBI:10841",
+ "http://identifiers.org/chebi/CHEBI:13236",
+ "http://identifiers.org/chebi/CHEBI:15422",
+ "http://identifiers.org/chebi/CHEBI:22249",
+ "http://identifiers.org/chebi/CHEBI:2359",
+ "http://identifiers.org/chebi/CHEBI:237958",
+ "http://identifiers.org/chebi/CHEBI:30616",
+ "http://identifiers.org/chebi/CHEBI:40938",
+ "http://identifiers.org/chebi/CHEBI:57299",
+ "http://identifiers.org/kegg.compound/C00002",
+ "http://identifiers.org/kegg.drug/D08646",
+ "http://identifiers.org/metanetx.chemical/MNXM3",
+ "http://identifiers.org/seed.compound/cpd00002"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O13P3",
+ "id": "atp_c",
+ "name": "ATP C10H12N5O13P3"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/cit",
+ "http://identifiers.org/biocyc/META:CIT",
+ "http://identifiers.org/chebi/CHEBI:132362",
+ "http://identifiers.org/chebi/CHEBI:133748",
+ "http://identifiers.org/chebi/CHEBI:13999",
+ "http://identifiers.org/chebi/CHEBI:16947",
+ "http://identifiers.org/chebi/CHEBI:23321",
+ "http://identifiers.org/chebi/CHEBI:23322",
+ "http://identifiers.org/chebi/CHEBI:30769",
+ "http://identifiers.org/chebi/CHEBI:35802",
+ "http://identifiers.org/chebi/CHEBI:35804",
+ "http://identifiers.org/chebi/CHEBI:35806",
+ "http://identifiers.org/chebi/CHEBI:35808",
+ "http://identifiers.org/chebi/CHEBI:35809",
+ "http://identifiers.org/chebi/CHEBI:35810",
+ "http://identifiers.org/chebi/CHEBI:3727",
+ "http://identifiers.org/chebi/CHEBI:41523",
+ "http://identifiers.org/chebi/CHEBI:42563",
+ "http://identifiers.org/chebi/CHEBI:76049",
+ "http://identifiers.org/chebi/CHEBI:79399",
+ "http://identifiers.org/hmdb/HMDB00094",
+ "http://identifiers.org/kegg.compound/C00158",
+ "http://identifiers.org/kegg.compound/C13660",
+ "http://identifiers.org/kegg.drug/D00037",
+ "http://identifiers.org/metanetx.chemical/MNXM131",
+ "http://identifiers.org/seed.compound/cpd00137"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H5O7",
+ "id": "cit_c",
+ "name": "Citrate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/co2",
+ "http://identifiers.org/biocyc/META:CARBON-DIOXIDE",
+ "http://identifiers.org/chebi/CHEBI:13282",
+ "http://identifiers.org/chebi/CHEBI:13283",
+ "http://identifiers.org/chebi/CHEBI:13284",
+ "http://identifiers.org/chebi/CHEBI:13285",
+ "http://identifiers.org/chebi/CHEBI:16526",
+ "http://identifiers.org/chebi/CHEBI:23011",
+ "http://identifiers.org/chebi/CHEBI:3283",
+ "http://identifiers.org/chebi/CHEBI:48829",
+ "http://identifiers.org/hmdb/HMDB01967",
+ "http://identifiers.org/kegg.compound/C00011",
+ "http://identifiers.org/kegg.drug/D00004",
+ "http://identifiers.org/metanetx.chemical/MNXM13",
+ "http://identifiers.org/seed.compound/cpd00011"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "CO2",
+ "id": "co2_c",
+ "name": "CO2 CO2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/co2",
+ "http://identifiers.org/biocyc/META:CARBON-DIOXIDE",
+ "http://identifiers.org/chebi/CHEBI:13282",
+ "http://identifiers.org/chebi/CHEBI:13283",
+ "http://identifiers.org/chebi/CHEBI:13284",
+ "http://identifiers.org/chebi/CHEBI:13285",
+ "http://identifiers.org/chebi/CHEBI:16526",
+ "http://identifiers.org/chebi/CHEBI:23011",
+ "http://identifiers.org/chebi/CHEBI:3283",
+ "http://identifiers.org/chebi/CHEBI:48829",
+ "http://identifiers.org/hmdb/HMDB01967",
+ "http://identifiers.org/kegg.compound/C00011",
+ "http://identifiers.org/kegg.drug/D00004",
+ "http://identifiers.org/metanetx.chemical/MNXM13",
+ "http://identifiers.org/seed.compound/cpd00011"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "CO2",
+ "id": "co2_e",
+ "name": "CO2 CO2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/coa",
+ "http://identifiers.org/biocyc/META:CO-A",
+ "http://identifiers.org/biocyc/META:COA-GROUP",
+ "http://identifiers.org/chebi/CHEBI:13294",
+ "http://identifiers.org/chebi/CHEBI:13295",
+ "http://identifiers.org/chebi/CHEBI:13298",
+ "http://identifiers.org/chebi/CHEBI:15346",
+ "http://identifiers.org/chebi/CHEBI:23355",
+ "http://identifiers.org/chebi/CHEBI:3771",
+ "http://identifiers.org/chebi/CHEBI:41597",
+ "http://identifiers.org/chebi/CHEBI:41631",
+ "http://identifiers.org/chebi/CHEBI:57287",
+ "http://identifiers.org/chebi/CHEBI:741566",
+ "http://identifiers.org/hmdb/HMDB01423",
+ "http://identifiers.org/kegg.compound/C00010",
+ "http://identifiers.org/metanetx.chemical/MNXM12",
+ "http://identifiers.org/seed.compound/cpd00010",
+ "http://identifiers.org/seed.compound/cpd22528"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H32N7O16P3S",
+ "id": "coa_c",
+ "name": "Coenzyme A"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/dhap",
+ "http://identifiers.org/biocyc/META:DIHYDROXY-ACETONE-PHOSPHATE",
+ "http://identifiers.org/chebi/CHEBI:14341",
+ "http://identifiers.org/chebi/CHEBI:14342",
+ "http://identifiers.org/chebi/CHEBI:16108",
+ "http://identifiers.org/chebi/CHEBI:24355",
+ "http://identifiers.org/chebi/CHEBI:39571",
+ "http://identifiers.org/chebi/CHEBI:5454",
+ "http://identifiers.org/chebi/CHEBI:57642",
+ "http://identifiers.org/hmdb/HMDB01473",
+ "http://identifiers.org/hmdb/HMDB11735",
+ "http://identifiers.org/kegg.compound/C00111",
+ "http://identifiers.org/metanetx.chemical/MNXM77",
+ "http://identifiers.org/seed.compound/cpd00095"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O6P",
+ "id": "dhap_c",
+ "name": "Dihydroxyacetone phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/e4p",
+ "http://identifiers.org/biocyc/META:ERYTHROSE-4P",
+ "http://identifiers.org/chebi/CHEBI:12921",
+ "http://identifiers.org/chebi/CHEBI:16897",
+ "http://identifiers.org/chebi/CHEBI:20927",
+ "http://identifiers.org/chebi/CHEBI:4114",
+ "http://identifiers.org/chebi/CHEBI:42349",
+ "http://identifiers.org/chebi/CHEBI:48153",
+ "http://identifiers.org/hmdb/HMDB01321",
+ "http://identifiers.org/kegg.compound/C00279",
+ "http://identifiers.org/metanetx.chemical/MNXM258",
+ "http://identifiers.org/seed.compound/cpd00236"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H7O7P",
+ "id": "e4p_c",
+ "name": "D-Erythrose 4-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/etoh",
+ "http://identifiers.org/biocyc/META:ETOH",
+ "http://identifiers.org/chebi/CHEBI:14222",
+ "http://identifiers.org/chebi/CHEBI:16236",
+ "http://identifiers.org/chebi/CHEBI:23978",
+ "http://identifiers.org/chebi/CHEBI:30878",
+ "http://identifiers.org/chebi/CHEBI:30880",
+ "http://identifiers.org/chebi/CHEBI:42377",
+ "http://identifiers.org/chebi/CHEBI:44594",
+ "http://identifiers.org/chebi/CHEBI:4879",
+ "http://identifiers.org/chebi/CHEBI:52092",
+ "http://identifiers.org/hmdb/HMDB00108",
+ "http://identifiers.org/kegg.compound/C00469",
+ "http://identifiers.org/kegg.drug/D00068",
+ "http://identifiers.org/kegg.drug/D02798",
+ "http://identifiers.org/kegg.drug/D04855",
+ "http://identifiers.org/kegg.drug/D06542",
+ "http://identifiers.org/metanetx.chemical/MNXM303",
+ "http://identifiers.org/seed.compound/cpd00363"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H6O",
+ "id": "etoh_c",
+ "name": "Ethanol"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/etoh",
+ "http://identifiers.org/biocyc/META:ETOH",
+ "http://identifiers.org/chebi/CHEBI:14222",
+ "http://identifiers.org/chebi/CHEBI:16236",
+ "http://identifiers.org/chebi/CHEBI:23978",
+ "http://identifiers.org/chebi/CHEBI:30878",
+ "http://identifiers.org/chebi/CHEBI:30880",
+ "http://identifiers.org/chebi/CHEBI:42377",
+ "http://identifiers.org/chebi/CHEBI:44594",
+ "http://identifiers.org/chebi/CHEBI:4879",
+ "http://identifiers.org/chebi/CHEBI:52092",
+ "http://identifiers.org/hmdb/HMDB00108",
+ "http://identifiers.org/kegg.compound/C00469",
+ "http://identifiers.org/kegg.drug/D00068",
+ "http://identifiers.org/kegg.drug/D02798",
+ "http://identifiers.org/kegg.drug/D04855",
+ "http://identifiers.org/kegg.drug/D06542",
+ "http://identifiers.org/metanetx.chemical/MNXM303",
+ "http://identifiers.org/seed.compound/cpd00363"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H6O",
+ "id": "etoh_e",
+ "name": "Ethanol"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/f6p",
+ "http://identifiers.org/biocyc/META:FRUCTOSE-6P",
+ "http://identifiers.org/chebi/CHEBI:10375",
+ "http://identifiers.org/chebi/CHEBI:12352",
+ "http://identifiers.org/chebi/CHEBI:16084",
+ "http://identifiers.org/chebi/CHEBI:22768",
+ "http://identifiers.org/chebi/CHEBI:42378",
+ "http://identifiers.org/chebi/CHEBI:57634",
+ "http://identifiers.org/hmdb/HMDB03971",
+ "http://identifiers.org/kegg.compound/C05345",
+ "http://identifiers.org/metanetx.chemical/MNXM89621",
+ "http://identifiers.org/seed.compound/cpd19035"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H11O9P",
+ "id": "f6p_c",
+ "name": "D-Fructose 6-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fdp",
+ "http://identifiers.org/chebi/CHEBI:37736",
+ "http://identifiers.org/chebi/CHEBI:49299",
+ "http://identifiers.org/kegg.compound/C00354",
+ "http://identifiers.org/metanetx.chemical/MNXM417",
+ "http://identifiers.org/seed.compound/cpd00290"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H10O12P2",
+ "id": "fdp_c",
+ "name": "D-Fructose 1,6-bisphosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/for",
+ "http://identifiers.org/biocyc/META:CARBOXYL-GROUP",
+ "http://identifiers.org/biocyc/META:CPD-9845",
+ "http://identifiers.org/biocyc/META:CPD1G-1532",
+ "http://identifiers.org/biocyc/META:CPD1G-1533",
+ "http://identifiers.org/biocyc/META:CPD1G-1534",
+ "http://identifiers.org/biocyc/META:CPD1G-1535",
+ "http://identifiers.org/biocyc/META:FORMATE",
+ "http://identifiers.org/chebi/CHEBI:14276",
+ "http://identifiers.org/chebi/CHEBI:15740",
+ "http://identifiers.org/chebi/CHEBI:24081",
+ "http://identifiers.org/chebi/CHEBI:24082",
+ "http://identifiers.org/chebi/CHEBI:30751",
+ "http://identifiers.org/chebi/CHEBI:42460",
+ "http://identifiers.org/chebi/CHEBI:5145",
+ "http://identifiers.org/hmdb/HMDB00142",
+ "http://identifiers.org/kegg.compound/C00058",
+ "http://identifiers.org/metanetx.chemical/MNXM39",
+ "http://identifiers.org/seed.compound/cpd00047",
+ "http://identifiers.org/seed.compound/cpd22511"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "CH1O2",
+ "id": "for_c",
+ "name": "Formate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/for",
+ "http://identifiers.org/biocyc/META:CARBOXYL-GROUP",
+ "http://identifiers.org/biocyc/META:CPD-9845",
+ "http://identifiers.org/biocyc/META:CPD1G-1532",
+ "http://identifiers.org/biocyc/META:CPD1G-1533",
+ "http://identifiers.org/biocyc/META:CPD1G-1534",
+ "http://identifiers.org/biocyc/META:CPD1G-1535",
+ "http://identifiers.org/biocyc/META:FORMATE",
+ "http://identifiers.org/chebi/CHEBI:14276",
+ "http://identifiers.org/chebi/CHEBI:15740",
+ "http://identifiers.org/chebi/CHEBI:24081",
+ "http://identifiers.org/chebi/CHEBI:24082",
+ "http://identifiers.org/chebi/CHEBI:30751",
+ "http://identifiers.org/chebi/CHEBI:42460",
+ "http://identifiers.org/chebi/CHEBI:5145",
+ "http://identifiers.org/hmdb/HMDB00142",
+ "http://identifiers.org/kegg.compound/C00058",
+ "http://identifiers.org/metanetx.chemical/MNXM39",
+ "http://identifiers.org/seed.compound/cpd00047",
+ "http://identifiers.org/seed.compound/cpd22511"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "CH1O2",
+ "id": "for_e",
+ "name": "Formate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fru",
+ "http://identifiers.org/biocyc/META:CPD-15382",
+ "http://identifiers.org/biocyc/META:D-Fructopyranose",
+ "http://identifiers.org/biocyc/META:FRU",
+ "http://identifiers.org/biocyc/META:Fructofuranose",
+ "http://identifiers.org/chebi/CHEBI:12923",
+ "http://identifiers.org/chebi/CHEBI:15824",
+ "http://identifiers.org/chebi/CHEBI:20929",
+ "http://identifiers.org/chebi/CHEBI:24104",
+ "http://identifiers.org/chebi/CHEBI:24110",
+ "http://identifiers.org/chebi/CHEBI:28757",
+ "http://identifiers.org/chebi/CHEBI:37714",
+ "http://identifiers.org/chebi/CHEBI:37721",
+ "http://identifiers.org/chebi/CHEBI:4118",
+ "http://identifiers.org/chebi/CHEBI:4119",
+ "http://identifiers.org/chebi/CHEBI:47424",
+ "http://identifiers.org/chebi/CHEBI:48095",
+ "http://identifiers.org/chebi/CHEBI:5172",
+ "http://identifiers.org/hmdb/HMDB62538",
+ "http://identifiers.org/kegg.compound/C00095",
+ "http://identifiers.org/kegg.compound/C01496",
+ "http://identifiers.org/kegg.compound/C05003",
+ "http://identifiers.org/kegg.compound/C10906",
+ "http://identifiers.org/kegg.drug/D00114",
+ "http://identifiers.org/metanetx.chemical/MNXM175",
+ "http://identifiers.org/seed.compound/cpd00082",
+ "http://identifiers.org/seed.compound/cpd19015",
+ "http://identifiers.org/seed.compound/cpd27040"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C6H12O6",
+ "id": "fru_e",
+ "name": "D-Fructose"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fum",
+ "http://identifiers.org/biocyc/META:FUM",
+ "http://identifiers.org/chebi/CHEBI:14284",
+ "http://identifiers.org/chebi/CHEBI:18012",
+ "http://identifiers.org/chebi/CHEBI:22956",
+ "http://identifiers.org/chebi/CHEBI:22957",
+ "http://identifiers.org/chebi/CHEBI:22958",
+ "http://identifiers.org/chebi/CHEBI:24122",
+ "http://identifiers.org/chebi/CHEBI:24124",
+ "http://identifiers.org/chebi/CHEBI:29806",
+ "http://identifiers.org/chebi/CHEBI:36180",
+ "http://identifiers.org/chebi/CHEBI:37154",
+ "http://identifiers.org/chebi/CHEBI:37155",
+ "http://identifiers.org/chebi/CHEBI:42511",
+ "http://identifiers.org/chebi/CHEBI:42743",
+ "http://identifiers.org/chebi/CHEBI:5190",
+ "http://identifiers.org/hmdb/HMDB00134",
+ "http://identifiers.org/kegg.compound/C00122",
+ "http://identifiers.org/kegg.drug/D02308",
+ "http://identifiers.org/metanetx.chemical/MNXM93",
+ "http://identifiers.org/seed.compound/cpd00106"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H2O4",
+ "id": "fum_c",
+ "name": "Fumarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fum",
+ "http://identifiers.org/biocyc/META:FUM",
+ "http://identifiers.org/chebi/CHEBI:14284",
+ "http://identifiers.org/chebi/CHEBI:18012",
+ "http://identifiers.org/chebi/CHEBI:22956",
+ "http://identifiers.org/chebi/CHEBI:22957",
+ "http://identifiers.org/chebi/CHEBI:22958",
+ "http://identifiers.org/chebi/CHEBI:24122",
+ "http://identifiers.org/chebi/CHEBI:24124",
+ "http://identifiers.org/chebi/CHEBI:29806",
+ "http://identifiers.org/chebi/CHEBI:36180",
+ "http://identifiers.org/chebi/CHEBI:37154",
+ "http://identifiers.org/chebi/CHEBI:37155",
+ "http://identifiers.org/chebi/CHEBI:42511",
+ "http://identifiers.org/chebi/CHEBI:42743",
+ "http://identifiers.org/chebi/CHEBI:5190",
+ "http://identifiers.org/hmdb/HMDB00134",
+ "http://identifiers.org/kegg.compound/C00122",
+ "http://identifiers.org/kegg.drug/D02308",
+ "http://identifiers.org/metanetx.chemical/MNXM93",
+ "http://identifiers.org/seed.compound/cpd00106"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H2O4",
+ "id": "fum_e",
+ "name": "Fumarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/g3p",
+ "http://identifiers.org/biocyc/META:GAP",
+ "http://identifiers.org/chebi/CHEBI:12983",
+ "http://identifiers.org/chebi/CHEBI:12984",
+ "http://identifiers.org/chebi/CHEBI:14333",
+ "http://identifiers.org/chebi/CHEBI:17138",
+ "http://identifiers.org/chebi/CHEBI:181",
+ "http://identifiers.org/chebi/CHEBI:18324",
+ "http://identifiers.org/chebi/CHEBI:21026",
+ "http://identifiers.org/chebi/CHEBI:29052",
+ "http://identifiers.org/chebi/CHEBI:5446",
+ "http://identifiers.org/chebi/CHEBI:58027",
+ "http://identifiers.org/chebi/CHEBI:59776",
+ "http://identifiers.org/hmdb/HMDB01112",
+ "http://identifiers.org/kegg.compound/C00118",
+ "http://identifiers.org/kegg.compound/C00661",
+ "http://identifiers.org/metanetx.chemical/MNXM74",
+ "http://identifiers.org/seed.compound/cpd00102",
+ "http://identifiers.org/seed.compound/cpd19005"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O6P",
+ "id": "g3p_c",
+ "name": "Glyceraldehyde 3-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/g6p",
+ "http://identifiers.org/biocyc/META:D-glucopyranose-6-phosphate",
+ "http://identifiers.org/chebi/CHEBI:14314",
+ "http://identifiers.org/chebi/CHEBI:4170",
+ "http://identifiers.org/chebi/CHEBI:61548",
+ "http://identifiers.org/hmdb/HMDB01401",
+ "http://identifiers.org/hmdb/HMDB01549",
+ "http://identifiers.org/hmdb/HMDB06793",
+ "http://identifiers.org/kegg.compound/C00092",
+ "http://identifiers.org/metanetx.chemical/MNXM160",
+ "http://identifiers.org/seed.compound/cpd00079",
+ "http://identifiers.org/seed.compound/cpd26836"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H11O9P",
+ "id": "g6p_c",
+ "name": "D-Glucose 6-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glc__D",
+ "http://identifiers.org/biocyc/META:Glucopyranose",
+ "http://identifiers.org/chebi/CHEBI:12965",
+ "http://identifiers.org/chebi/CHEBI:17634",
+ "http://identifiers.org/chebi/CHEBI:20999",
+ "http://identifiers.org/chebi/CHEBI:4167",
+ "http://identifiers.org/hmdb/HMDB00122",
+ "http://identifiers.org/hmdb/HMDB06564",
+ "http://identifiers.org/kegg.compound/C00031",
+ "http://identifiers.org/kegg.drug/D00009",
+ "http://identifiers.org/metanetx.chemical/MNXM41",
+ "http://identifiers.org/seed.compound/cpd00027",
+ "http://identifiers.org/seed.compound/cpd26821"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C6H12O6",
+ "id": "glc__D_e",
+ "name": "D-Glucose"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/gln__L",
+ "http://identifiers.org/biocyc/META:GLN",
+ "http://identifiers.org/chebi/CHEBI:13110",
+ "http://identifiers.org/chebi/CHEBI:18050",
+ "http://identifiers.org/chebi/CHEBI:21308",
+ "http://identifiers.org/chebi/CHEBI:24316",
+ "http://identifiers.org/chebi/CHEBI:28300",
+ "http://identifiers.org/chebi/CHEBI:32665",
+ "http://identifiers.org/chebi/CHEBI:32666",
+ "http://identifiers.org/chebi/CHEBI:32678",
+ "http://identifiers.org/chebi/CHEBI:32679",
+ "http://identifiers.org/chebi/CHEBI:42812",
+ "http://identifiers.org/chebi/CHEBI:42814",
+ "http://identifiers.org/chebi/CHEBI:42899",
+ "http://identifiers.org/chebi/CHEBI:42943",
+ "http://identifiers.org/chebi/CHEBI:5432",
+ "http://identifiers.org/chebi/CHEBI:58359",
+ "http://identifiers.org/chebi/CHEBI:6227",
+ "http://identifiers.org/hmdb/HMDB00641",
+ "http://identifiers.org/kegg.compound/C00064",
+ "http://identifiers.org/kegg.compound/C00303",
+ "http://identifiers.org/kegg.drug/D00015",
+ "http://identifiers.org/metanetx.chemical/MNXM37",
+ "http://identifiers.org/seed.compound/cpd00053",
+ "http://identifiers.org/seed.compound/cpd00253"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H10N2O3",
+ "id": "gln__L_c",
+ "name": "L-Glutamine"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/gln__L",
+ "http://identifiers.org/biocyc/META:GLN",
+ "http://identifiers.org/chebi/CHEBI:13110",
+ "http://identifiers.org/chebi/CHEBI:18050",
+ "http://identifiers.org/chebi/CHEBI:21308",
+ "http://identifiers.org/chebi/CHEBI:24316",
+ "http://identifiers.org/chebi/CHEBI:28300",
+ "http://identifiers.org/chebi/CHEBI:32665",
+ "http://identifiers.org/chebi/CHEBI:32666",
+ "http://identifiers.org/chebi/CHEBI:32678",
+ "http://identifiers.org/chebi/CHEBI:32679",
+ "http://identifiers.org/chebi/CHEBI:42812",
+ "http://identifiers.org/chebi/CHEBI:42814",
+ "http://identifiers.org/chebi/CHEBI:42899",
+ "http://identifiers.org/chebi/CHEBI:42943",
+ "http://identifiers.org/chebi/CHEBI:5432",
+ "http://identifiers.org/chebi/CHEBI:58359",
+ "http://identifiers.org/chebi/CHEBI:6227",
+ "http://identifiers.org/hmdb/HMDB00641",
+ "http://identifiers.org/kegg.compound/C00064",
+ "http://identifiers.org/kegg.compound/C00303",
+ "http://identifiers.org/kegg.drug/D00015",
+ "http://identifiers.org/metanetx.chemical/MNXM37",
+ "http://identifiers.org/seed.compound/cpd00053",
+ "http://identifiers.org/seed.compound/cpd00253"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H10N2O3",
+ "id": "gln__L_e",
+ "name": "L-Glutamine"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glu__L",
+ "http://identifiers.org/biocyc/META:GLT",
+ "http://identifiers.org/biocyc/META:Glutamates",
+ "http://identifiers.org/chebi/CHEBI:13107",
+ "http://identifiers.org/chebi/CHEBI:14321",
+ "http://identifiers.org/chebi/CHEBI:16015",
+ "http://identifiers.org/chebi/CHEBI:18237",
+ "http://identifiers.org/chebi/CHEBI:21301",
+ "http://identifiers.org/chebi/CHEBI:21304",
+ "http://identifiers.org/chebi/CHEBI:24314",
+ "http://identifiers.org/chebi/CHEBI:29985",
+ "http://identifiers.org/chebi/CHEBI:29987",
+ "http://identifiers.org/chebi/CHEBI:29988",
+ "http://identifiers.org/chebi/CHEBI:42825",
+ "http://identifiers.org/chebi/CHEBI:5431",
+ "http://identifiers.org/chebi/CHEBI:6224",
+ "http://identifiers.org/chebi/CHEBI:76051",
+ "http://identifiers.org/hmdb/HMDB00148",
+ "http://identifiers.org/hmdb/HMDB60475",
+ "http://identifiers.org/kegg.compound/C00025",
+ "http://identifiers.org/kegg.compound/C00302",
+ "http://identifiers.org/kegg.drug/D00007",
+ "http://identifiers.org/kegg.drug/D04341",
+ "http://identifiers.org/metanetx.chemical/MNXM89557",
+ "http://identifiers.org/seed.compound/cpd00023",
+ "http://identifiers.org/seed.compound/cpd19002",
+ "http://identifiers.org/seed.compound/cpd27177"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H8NO4",
+ "id": "glu__L_c",
+ "name": "L-Glutamate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glu__L",
+ "http://identifiers.org/biocyc/META:GLT",
+ "http://identifiers.org/biocyc/META:Glutamates",
+ "http://identifiers.org/chebi/CHEBI:13107",
+ "http://identifiers.org/chebi/CHEBI:14321",
+ "http://identifiers.org/chebi/CHEBI:16015",
+ "http://identifiers.org/chebi/CHEBI:18237",
+ "http://identifiers.org/chebi/CHEBI:21301",
+ "http://identifiers.org/chebi/CHEBI:21304",
+ "http://identifiers.org/chebi/CHEBI:24314",
+ "http://identifiers.org/chebi/CHEBI:29985",
+ "http://identifiers.org/chebi/CHEBI:29987",
+ "http://identifiers.org/chebi/CHEBI:29988",
+ "http://identifiers.org/chebi/CHEBI:42825",
+ "http://identifiers.org/chebi/CHEBI:5431",
+ "http://identifiers.org/chebi/CHEBI:6224",
+ "http://identifiers.org/chebi/CHEBI:76051",
+ "http://identifiers.org/hmdb/HMDB00148",
+ "http://identifiers.org/hmdb/HMDB60475",
+ "http://identifiers.org/kegg.compound/C00025",
+ "http://identifiers.org/kegg.compound/C00302",
+ "http://identifiers.org/kegg.drug/D00007",
+ "http://identifiers.org/kegg.drug/D04341",
+ "http://identifiers.org/metanetx.chemical/MNXM89557",
+ "http://identifiers.org/seed.compound/cpd00023",
+ "http://identifiers.org/seed.compound/cpd19002",
+ "http://identifiers.org/seed.compound/cpd27177"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H8NO4",
+ "id": "glu__L_e",
+ "name": "L-Glutamate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glx",
+ "http://identifiers.org/biocyc/META:GLYOX",
+ "http://identifiers.org/chebi/CHEBI:14368",
+ "http://identifiers.org/chebi/CHEBI:16891",
+ "http://identifiers.org/chebi/CHEBI:24420",
+ "http://identifiers.org/chebi/CHEBI:24421",
+ "http://identifiers.org/chebi/CHEBI:35977",
+ "http://identifiers.org/chebi/CHEBI:36655",
+ "http://identifiers.org/chebi/CHEBI:42767",
+ "http://identifiers.org/chebi/CHEBI:5509",
+ "http://identifiers.org/hmdb/HMDB00119",
+ "http://identifiers.org/kegg.compound/C00048",
+ "http://identifiers.org/metanetx.chemical/MNXM69",
+ "http://identifiers.org/seed.compound/cpd00040"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H1O3",
+ "id": "glx_c",
+ "name": "Glyoxylate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h2o",
+ "http://identifiers.org/biocyc/META:CPD-15815",
+ "http://identifiers.org/biocyc/META:HYDROXYL-GROUP",
+ "http://identifiers.org/biocyc/META:OH",
+ "http://identifiers.org/biocyc/META:OXONIUM",
+ "http://identifiers.org/biocyc/META:WATER",
+ "http://identifiers.org/chebi/CHEBI:10743",
+ "http://identifiers.org/chebi/CHEBI:13352",
+ "http://identifiers.org/chebi/CHEBI:13365",
+ "http://identifiers.org/chebi/CHEBI:13419",
+ "http://identifiers.org/chebi/CHEBI:15377",
+ "http://identifiers.org/chebi/CHEBI:16234",
+ "http://identifiers.org/chebi/CHEBI:27313",
+ "http://identifiers.org/chebi/CHEBI:29356",
+ "http://identifiers.org/chebi/CHEBI:29373",
+ "http://identifiers.org/chebi/CHEBI:29374",
+ "http://identifiers.org/chebi/CHEBI:29375",
+ "http://identifiers.org/chebi/CHEBI:29412",
+ "http://identifiers.org/chebi/CHEBI:30490",
+ "http://identifiers.org/chebi/CHEBI:33806",
+ "http://identifiers.org/chebi/CHEBI:33811",
+ "http://identifiers.org/chebi/CHEBI:33813",
+ "http://identifiers.org/chebi/CHEBI:41979",
+ "http://identifiers.org/chebi/CHEBI:41981",
+ "http://identifiers.org/chebi/CHEBI:42043",
+ "http://identifiers.org/chebi/CHEBI:42857",
+ "http://identifiers.org/chebi/CHEBI:43228",
+ "http://identifiers.org/chebi/CHEBI:44292",
+ "http://identifiers.org/chebi/CHEBI:44641",
+ "http://identifiers.org/chebi/CHEBI:44701",
+ "http://identifiers.org/chebi/CHEBI:44819",
+ "http://identifiers.org/chebi/CHEBI:5585",
+ "http://identifiers.org/chebi/CHEBI:5594",
+ "http://identifiers.org/hmdb/HMDB02111",
+ "http://identifiers.org/kegg.compound/C00001",
+ "http://identifiers.org/kegg.compound/C01328",
+ "http://identifiers.org/kegg.compound/C18714",
+ "http://identifiers.org/kegg.drug/D00001",
+ "http://identifiers.org/kegg.drug/D03703",
+ "http://identifiers.org/kegg.drug/D06322",
+ "http://identifiers.org/metanetx.chemical/MNXM2",
+ "http://identifiers.org/seed.compound/cpd00001",
+ "http://identifiers.org/seed.compound/cpd15275",
+ "http://identifiers.org/seed.compound/cpd27222"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H2O",
+ "id": "h2o_c",
+ "name": "H2O H2O"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h2o",
+ "http://identifiers.org/biocyc/META:CPD-15815",
+ "http://identifiers.org/biocyc/META:HYDROXYL-GROUP",
+ "http://identifiers.org/biocyc/META:OH",
+ "http://identifiers.org/biocyc/META:OXONIUM",
+ "http://identifiers.org/biocyc/META:WATER",
+ "http://identifiers.org/chebi/CHEBI:10743",
+ "http://identifiers.org/chebi/CHEBI:13352",
+ "http://identifiers.org/chebi/CHEBI:13365",
+ "http://identifiers.org/chebi/CHEBI:13419",
+ "http://identifiers.org/chebi/CHEBI:15377",
+ "http://identifiers.org/chebi/CHEBI:16234",
+ "http://identifiers.org/chebi/CHEBI:27313",
+ "http://identifiers.org/chebi/CHEBI:29356",
+ "http://identifiers.org/chebi/CHEBI:29373",
+ "http://identifiers.org/chebi/CHEBI:29374",
+ "http://identifiers.org/chebi/CHEBI:29375",
+ "http://identifiers.org/chebi/CHEBI:29412",
+ "http://identifiers.org/chebi/CHEBI:30490",
+ "http://identifiers.org/chebi/CHEBI:33806",
+ "http://identifiers.org/chebi/CHEBI:33811",
+ "http://identifiers.org/chebi/CHEBI:33813",
+ "http://identifiers.org/chebi/CHEBI:41979",
+ "http://identifiers.org/chebi/CHEBI:41981",
+ "http://identifiers.org/chebi/CHEBI:42043",
+ "http://identifiers.org/chebi/CHEBI:42857",
+ "http://identifiers.org/chebi/CHEBI:43228",
+ "http://identifiers.org/chebi/CHEBI:44292",
+ "http://identifiers.org/chebi/CHEBI:44641",
+ "http://identifiers.org/chebi/CHEBI:44701",
+ "http://identifiers.org/chebi/CHEBI:44819",
+ "http://identifiers.org/chebi/CHEBI:5585",
+ "http://identifiers.org/chebi/CHEBI:5594",
+ "http://identifiers.org/hmdb/HMDB02111",
+ "http://identifiers.org/kegg.compound/C00001",
+ "http://identifiers.org/kegg.compound/C01328",
+ "http://identifiers.org/kegg.compound/C18714",
+ "http://identifiers.org/kegg.drug/D00001",
+ "http://identifiers.org/kegg.drug/D03703",
+ "http://identifiers.org/kegg.drug/D06322",
+ "http://identifiers.org/metanetx.chemical/MNXM2",
+ "http://identifiers.org/seed.compound/cpd00001",
+ "http://identifiers.org/seed.compound/cpd15275",
+ "http://identifiers.org/seed.compound/cpd27222"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H2O",
+ "id": "h2o_e",
+ "name": "H2O H2O"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h",
+ "http://identifiers.org/biocyc/META:PROTON",
+ "http://identifiers.org/chebi/CHEBI:10744",
+ "http://identifiers.org/chebi/CHEBI:13357",
+ "http://identifiers.org/chebi/CHEBI:15378",
+ "http://identifiers.org/chebi/CHEBI:24636",
+ "http://identifiers.org/chebi/CHEBI:29233",
+ "http://identifiers.org/chebi/CHEBI:29234",
+ "http://identifiers.org/chebi/CHEBI:5584",
+ "http://identifiers.org/hmdb/HMDB59597",
+ "http://identifiers.org/kegg.compound/C00080",
+ "http://identifiers.org/metanetx.chemical/MNXM1",
+ "http://identifiers.org/seed.compound/cpd00067"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H",
+ "id": "h_c",
+ "name": "H+"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h",
+ "http://identifiers.org/biocyc/META:PROTON",
+ "http://identifiers.org/chebi/CHEBI:10744",
+ "http://identifiers.org/chebi/CHEBI:13357",
+ "http://identifiers.org/chebi/CHEBI:15378",
+ "http://identifiers.org/chebi/CHEBI:24636",
+ "http://identifiers.org/chebi/CHEBI:29233",
+ "http://identifiers.org/chebi/CHEBI:29234",
+ "http://identifiers.org/chebi/CHEBI:5584",
+ "http://identifiers.org/hmdb/HMDB59597",
+ "http://identifiers.org/kegg.compound/C00080",
+ "http://identifiers.org/metanetx.chemical/MNXM1",
+ "http://identifiers.org/seed.compound/cpd00067"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H",
+ "id": "h_e",
+ "name": "H+"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/icit",
+ "http://identifiers.org/chebi/CHEBI:14465",
+ "http://identifiers.org/chebi/CHEBI:16087",
+ "http://identifiers.org/chebi/CHEBI:24884",
+ "http://identifiers.org/chebi/CHEBI:24886",
+ "http://identifiers.org/chebi/CHEBI:30887",
+ "http://identifiers.org/chebi/CHEBI:36453",
+ "http://identifiers.org/chebi/CHEBI:36454",
+ "http://identifiers.org/chebi/CHEBI:5998",
+ "http://identifiers.org/hmdb/HMDB00193",
+ "http://identifiers.org/kegg.compound/C00311",
+ "http://identifiers.org/metanetx.chemical/MNXM89661",
+ "http://identifiers.org/seed.compound/cpd00260"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H5O7",
+ "id": "icit_c",
+ "name": "Isocitrate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/lac__D",
+ "http://identifiers.org/biocyc/META:D-LACTATE",
+ "http://identifiers.org/chebi/CHEBI:11001",
+ "http://identifiers.org/chebi/CHEBI:16004",
+ "http://identifiers.org/chebi/CHEBI:18684",
+ "http://identifiers.org/chebi/CHEBI:341",
+ "http://identifiers.org/chebi/CHEBI:42105",
+ "http://identifiers.org/chebi/CHEBI:42111",
+ "http://identifiers.org/chebi/CHEBI:43701",
+ "http://identifiers.org/hmdb/HMDB00171",
+ "http://identifiers.org/hmdb/HMDB01311",
+ "http://identifiers.org/kegg.compound/C00256",
+ "http://identifiers.org/metanetx.chemical/MNXM285",
+ "http://identifiers.org/seed.compound/cpd00221"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O3",
+ "id": "lac__D_c",
+ "name": "D-Lactate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/lac__D",
+ "http://identifiers.org/biocyc/META:D-LACTATE",
+ "http://identifiers.org/chebi/CHEBI:11001",
+ "http://identifiers.org/chebi/CHEBI:16004",
+ "http://identifiers.org/chebi/CHEBI:18684",
+ "http://identifiers.org/chebi/CHEBI:341",
+ "http://identifiers.org/chebi/CHEBI:42105",
+ "http://identifiers.org/chebi/CHEBI:42111",
+ "http://identifiers.org/chebi/CHEBI:43701",
+ "http://identifiers.org/hmdb/HMDB00171",
+ "http://identifiers.org/hmdb/HMDB01311",
+ "http://identifiers.org/kegg.compound/C00256",
+ "http://identifiers.org/metanetx.chemical/MNXM285",
+ "http://identifiers.org/seed.compound/cpd00221"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C3H5O3",
+ "id": "lac__D_e",
+ "name": "D-Lactate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/mal__L",
+ "http://identifiers.org/biocyc/META:MAL",
+ "http://identifiers.org/chebi/CHEBI:11066",
+ "http://identifiers.org/chebi/CHEBI:13140",
+ "http://identifiers.org/chebi/CHEBI:15589",
+ "http://identifiers.org/chebi/CHEBI:18784",
+ "http://identifiers.org/chebi/CHEBI:18785",
+ "http://identifiers.org/chebi/CHEBI:30797",
+ "http://identifiers.org/chebi/CHEBI:423",
+ "http://identifiers.org/hmdb/HMDB00156",
+ "http://identifiers.org/kegg.compound/C00149",
+ "http://identifiers.org/metanetx.chemical/MNXM98",
+ "http://identifiers.org/seed.compound/cpd00130"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H4O5",
+ "id": "mal__L_c",
+ "name": "L-Malate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/mal__L",
+ "http://identifiers.org/biocyc/META:MAL",
+ "http://identifiers.org/chebi/CHEBI:11066",
+ "http://identifiers.org/chebi/CHEBI:13140",
+ "http://identifiers.org/chebi/CHEBI:15589",
+ "http://identifiers.org/chebi/CHEBI:18784",
+ "http://identifiers.org/chebi/CHEBI:18785",
+ "http://identifiers.org/chebi/CHEBI:30797",
+ "http://identifiers.org/chebi/CHEBI:423",
+ "http://identifiers.org/hmdb/HMDB00156",
+ "http://identifiers.org/kegg.compound/C00149",
+ "http://identifiers.org/metanetx.chemical/MNXM98",
+ "http://identifiers.org/seed.compound/cpd00130"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H4O5",
+ "id": "mal__L_e",
+ "name": "L-Malate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nad",
+ "http://identifiers.org/biocyc/META:NAD",
+ "http://identifiers.org/chebi/CHEBI:13393",
+ "http://identifiers.org/chebi/CHEBI:13394",
+ "http://identifiers.org/chebi/CHEBI:15846",
+ "http://identifiers.org/chebi/CHEBI:21901",
+ "http://identifiers.org/chebi/CHEBI:29867",
+ "http://identifiers.org/chebi/CHEBI:44214",
+ "http://identifiers.org/chebi/CHEBI:44215",
+ "http://identifiers.org/chebi/CHEBI:44281",
+ "http://identifiers.org/chebi/CHEBI:57540",
+ "http://identifiers.org/chebi/CHEBI:7422",
+ "http://identifiers.org/kegg.compound/C00003",
+ "http://identifiers.org/kegg.drug/D00002",
+ "http://identifiers.org/metanetx.chemical/MNXM8",
+ "http://identifiers.org/seed.compound/cpd00003"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H26N7O14P2",
+ "id": "nad_c",
+ "name": "Nicotinamide adenine dinucleotide"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadh",
+ "http://identifiers.org/biocyc/META:NADH",
+ "http://identifiers.org/chebi/CHEBI:13395",
+ "http://identifiers.org/chebi/CHEBI:13396",
+ "http://identifiers.org/chebi/CHEBI:16908",
+ "http://identifiers.org/chebi/CHEBI:21902",
+ "http://identifiers.org/chebi/CHEBI:44216",
+ "http://identifiers.org/chebi/CHEBI:57945",
+ "http://identifiers.org/chebi/CHEBI:7423",
+ "http://identifiers.org/hmdb/HMDB01487",
+ "http://identifiers.org/kegg.compound/C00004",
+ "http://identifiers.org/metanetx.chemical/MNXM10",
+ "http://identifiers.org/seed.compound/cpd00004"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H27N7O14P2",
+ "id": "nadh_c",
+ "name": "Nicotinamide adenine dinucleotide - reduced"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadp",
+ "http://identifiers.org/biocyc/META:NADP",
+ "http://identifiers.org/chebi/CHEBI:13397",
+ "http://identifiers.org/chebi/CHEBI:13398",
+ "http://identifiers.org/chebi/CHEBI:18009",
+ "http://identifiers.org/chebi/CHEBI:21903",
+ "http://identifiers.org/chebi/CHEBI:25523",
+ "http://identifiers.org/chebi/CHEBI:29868",
+ "http://identifiers.org/chebi/CHEBI:44405",
+ "http://identifiers.org/chebi/CHEBI:44409",
+ "http://identifiers.org/chebi/CHEBI:58349",
+ "http://identifiers.org/chebi/CHEBI:7424",
+ "http://identifiers.org/kegg.compound/C00006",
+ "http://identifiers.org/metanetx.chemical/MNXM5",
+ "http://identifiers.org/seed.compound/cpd00006"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H25N7O17P3",
+ "id": "nadp_c",
+ "name": "Nicotinamide adenine dinucleotide phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadph",
+ "http://identifiers.org/biocyc/META:NADPH",
+ "http://identifiers.org/chebi/CHEBI:13399",
+ "http://identifiers.org/chebi/CHEBI:13400",
+ "http://identifiers.org/chebi/CHEBI:16474",
+ "http://identifiers.org/chebi/CHEBI:21904",
+ "http://identifiers.org/chebi/CHEBI:44286",
+ "http://identifiers.org/chebi/CHEBI:57783",
+ "http://identifiers.org/chebi/CHEBI:7425",
+ "http://identifiers.org/hmdb/HMDB00221",
+ "http://identifiers.org/hmdb/HMDB00799",
+ "http://identifiers.org/hmdb/HMDB06341",
+ "http://identifiers.org/kegg.compound/C00005",
+ "http://identifiers.org/metanetx.chemical/MNXM6",
+ "http://identifiers.org/seed.compound/cpd00005"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H26N7O17P3",
+ "id": "nadph_c",
+ "name": "Nicotinamide adenine dinucleotide phosphate - reduced"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nh4",
+ "http://identifiers.org/biocyc/META:AMMONIA",
+ "http://identifiers.org/biocyc/META:AMMONIUM",
+ "http://identifiers.org/chebi/CHEBI:13405",
+ "http://identifiers.org/chebi/CHEBI:13406",
+ "http://identifiers.org/chebi/CHEBI:13407",
+ "http://identifiers.org/chebi/CHEBI:135980",
+ "http://identifiers.org/chebi/CHEBI:13771",
+ "http://identifiers.org/chebi/CHEBI:16134",
+ "http://identifiers.org/chebi/CHEBI:22533",
+ "http://identifiers.org/chebi/CHEBI:22534",
+ "http://identifiers.org/chebi/CHEBI:28938",
+ "http://identifiers.org/chebi/CHEBI:29337",
+ "http://identifiers.org/chebi/CHEBI:29340",
+ "http://identifiers.org/chebi/CHEBI:44269",
+ "http://identifiers.org/chebi/CHEBI:44284",
+ "http://identifiers.org/chebi/CHEBI:44404",
+ "http://identifiers.org/chebi/CHEBI:49783",
+ "http://identifiers.org/chebi/CHEBI:7434",
+ "http://identifiers.org/chebi/CHEBI:7435",
+ "http://identifiers.org/hmdb/HMDB00051",
+ "http://identifiers.org/hmdb/HMDB41827",
+ "http://identifiers.org/kegg.compound/C00014",
+ "http://identifiers.org/kegg.compound/C01342",
+ "http://identifiers.org/kegg.drug/D02915",
+ "http://identifiers.org/kegg.drug/D02916",
+ "http://identifiers.org/metanetx.chemical/MNXM15",
+ "http://identifiers.org/seed.compound/cpd00013",
+ "http://identifiers.org/seed.compound/cpd19013"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H4N",
+ "id": "nh4_c",
+ "name": "Ammonium"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nh4",
+ "http://identifiers.org/biocyc/META:AMMONIA",
+ "http://identifiers.org/biocyc/META:AMMONIUM",
+ "http://identifiers.org/chebi/CHEBI:13405",
+ "http://identifiers.org/chebi/CHEBI:13406",
+ "http://identifiers.org/chebi/CHEBI:13407",
+ "http://identifiers.org/chebi/CHEBI:135980",
+ "http://identifiers.org/chebi/CHEBI:13771",
+ "http://identifiers.org/chebi/CHEBI:16134",
+ "http://identifiers.org/chebi/CHEBI:22533",
+ "http://identifiers.org/chebi/CHEBI:22534",
+ "http://identifiers.org/chebi/CHEBI:28938",
+ "http://identifiers.org/chebi/CHEBI:29337",
+ "http://identifiers.org/chebi/CHEBI:29340",
+ "http://identifiers.org/chebi/CHEBI:44269",
+ "http://identifiers.org/chebi/CHEBI:44284",
+ "http://identifiers.org/chebi/CHEBI:44404",
+ "http://identifiers.org/chebi/CHEBI:49783",
+ "http://identifiers.org/chebi/CHEBI:7434",
+ "http://identifiers.org/chebi/CHEBI:7435",
+ "http://identifiers.org/hmdb/HMDB00051",
+ "http://identifiers.org/hmdb/HMDB41827",
+ "http://identifiers.org/kegg.compound/C00014",
+ "http://identifiers.org/kegg.compound/C01342",
+ "http://identifiers.org/kegg.drug/D02915",
+ "http://identifiers.org/kegg.drug/D02916",
+ "http://identifiers.org/metanetx.chemical/MNXM15",
+ "http://identifiers.org/seed.compound/cpd00013",
+ "http://identifiers.org/seed.compound/cpd19013"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H4N",
+ "id": "nh4_e",
+ "name": "Ammonium"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/o2",
+ "http://identifiers.org/biocyc/META:OXYGEN-MOLECULE",
+ "http://identifiers.org/chebi/CHEBI:10745",
+ "http://identifiers.org/chebi/CHEBI:13416",
+ "http://identifiers.org/chebi/CHEBI:15379",
+ "http://identifiers.org/chebi/CHEBI:23833",
+ "http://identifiers.org/chebi/CHEBI:25366",
+ "http://identifiers.org/chebi/CHEBI:26689",
+ "http://identifiers.org/chebi/CHEBI:27140",
+ "http://identifiers.org/chebi/CHEBI:29097",
+ "http://identifiers.org/chebi/CHEBI:29793",
+ "http://identifiers.org/chebi/CHEBI:30491",
+ "http://identifiers.org/chebi/CHEBI:44742",
+ "http://identifiers.org/chebi/CHEBI:7860",
+ "http://identifiers.org/hmdb/HMDB01377",
+ "http://identifiers.org/kegg.compound/C00007",
+ "http://identifiers.org/kegg.drug/D00003",
+ "http://identifiers.org/metanetx.chemical/MNXM4",
+ "http://identifiers.org/seed.compound/cpd00007"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "O2",
+ "id": "o2_c",
+ "name": "O2 O2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/o2",
+ "http://identifiers.org/biocyc/META:OXYGEN-MOLECULE",
+ "http://identifiers.org/chebi/CHEBI:10745",
+ "http://identifiers.org/chebi/CHEBI:13416",
+ "http://identifiers.org/chebi/CHEBI:15379",
+ "http://identifiers.org/chebi/CHEBI:23833",
+ "http://identifiers.org/chebi/CHEBI:25366",
+ "http://identifiers.org/chebi/CHEBI:26689",
+ "http://identifiers.org/chebi/CHEBI:27140",
+ "http://identifiers.org/chebi/CHEBI:29097",
+ "http://identifiers.org/chebi/CHEBI:29793",
+ "http://identifiers.org/chebi/CHEBI:30491",
+ "http://identifiers.org/chebi/CHEBI:44742",
+ "http://identifiers.org/chebi/CHEBI:7860",
+ "http://identifiers.org/hmdb/HMDB01377",
+ "http://identifiers.org/kegg.compound/C00007",
+ "http://identifiers.org/kegg.drug/D00003",
+ "http://identifiers.org/metanetx.chemical/MNXM4",
+ "http://identifiers.org/seed.compound/cpd00007"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "O2",
+ "id": "o2_e",
+ "name": "O2 O2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/oaa",
+ "http://identifiers.org/biocyc/META:ENOL-OXALOACETATE",
+ "http://identifiers.org/biocyc/META:OXALACETIC_ACID",
+ "http://identifiers.org/chebi/CHEBI:12820",
+ "http://identifiers.org/chebi/CHEBI:14703",
+ "http://identifiers.org/chebi/CHEBI:16452",
+ "http://identifiers.org/chebi/CHEBI:24958",
+ "http://identifiers.org/chebi/CHEBI:24959",
+ "http://identifiers.org/chebi/CHEBI:25731",
+ "http://identifiers.org/chebi/CHEBI:25734",
+ "http://identifiers.org/chebi/CHEBI:29049",
+ "http://identifiers.org/chebi/CHEBI:30744",
+ "http://identifiers.org/chebi/CHEBI:7812",
+ "http://identifiers.org/hmdb/HMDB00223",
+ "http://identifiers.org/kegg.compound/C00036",
+ "http://identifiers.org/kegg.compound/C03981",
+ "http://identifiers.org/lipidmaps/LMFA01170061",
+ "http://identifiers.org/lipidmaps/LMFA01170120",
+ "http://identifiers.org/metanetx.chemical/MNXM46",
+ "http://identifiers.org/seed.compound/cpd00032",
+ "http://identifiers.org/seed.compound/cpd02469"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H2O5",
+ "id": "oaa_c",
+ "name": "Oxaloacetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pep",
+ "http://identifiers.org/biocyc/META:PHOSPHO-ENOL-PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14812",
+ "http://identifiers.org/chebi/CHEBI:18021",
+ "http://identifiers.org/chebi/CHEBI:26054",
+ "http://identifiers.org/chebi/CHEBI:26055",
+ "http://identifiers.org/chebi/CHEBI:44894",
+ "http://identifiers.org/chebi/CHEBI:44897",
+ "http://identifiers.org/chebi/CHEBI:58702",
+ "http://identifiers.org/chebi/CHEBI:8147",
+ "http://identifiers.org/hmdb/HMDB00263",
+ "http://identifiers.org/kegg.compound/C00074",
+ "http://identifiers.org/metanetx.chemical/MNXM73",
+ "http://identifiers.org/seed.compound/cpd00061"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H2O6P",
+ "id": "pep_c",
+ "name": "Phosphoenolpyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pi",
+ "http://identifiers.org/biocyc/META:CPD-16459",
+ "http://identifiers.org/biocyc/META:CPD-9010",
+ "http://identifiers.org/biocyc/META:PHOSPHATE-GROUP",
+ "http://identifiers.org/biocyc/META:Pi",
+ "http://identifiers.org/chebi/CHEBI:14791",
+ "http://identifiers.org/chebi/CHEBI:18367",
+ "http://identifiers.org/chebi/CHEBI:26078",
+ "http://identifiers.org/chebi/CHEBI:29137",
+ "http://identifiers.org/chebi/CHEBI:29139",
+ "http://identifiers.org/chebi/CHEBI:35780",
+ "http://identifiers.org/chebi/CHEBI:39739",
+ "http://identifiers.org/chebi/CHEBI:39745",
+ "http://identifiers.org/chebi/CHEBI:43470",
+ "http://identifiers.org/chebi/CHEBI:43474",
+ "http://identifiers.org/chebi/CHEBI:45024",
+ "http://identifiers.org/chebi/CHEBI:7793",
+ "http://identifiers.org/hmdb/HMDB00973",
+ "http://identifiers.org/hmdb/HMDB01429",
+ "http://identifiers.org/hmdb/HMDB02105",
+ "http://identifiers.org/hmdb/HMDB02142",
+ "http://identifiers.org/hmdb/HMDB05947",
+ "http://identifiers.org/kegg.compound/C00009",
+ "http://identifiers.org/kegg.compound/C13558",
+ "http://identifiers.org/kegg.drug/D05467",
+ "http://identifiers.org/metanetx.chemical/MNXM9",
+ "http://identifiers.org/seed.compound/cpd00009",
+ "http://identifiers.org/seed.compound/cpd27787"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "HO4P",
+ "id": "pi_c",
+ "name": "Phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pi",
+ "http://identifiers.org/biocyc/META:CPD-16459",
+ "http://identifiers.org/biocyc/META:CPD-9010",
+ "http://identifiers.org/biocyc/META:PHOSPHATE-GROUP",
+ "http://identifiers.org/biocyc/META:Pi",
+ "http://identifiers.org/chebi/CHEBI:14791",
+ "http://identifiers.org/chebi/CHEBI:18367",
+ "http://identifiers.org/chebi/CHEBI:26078",
+ "http://identifiers.org/chebi/CHEBI:29137",
+ "http://identifiers.org/chebi/CHEBI:29139",
+ "http://identifiers.org/chebi/CHEBI:35780",
+ "http://identifiers.org/chebi/CHEBI:39739",
+ "http://identifiers.org/chebi/CHEBI:39745",
+ "http://identifiers.org/chebi/CHEBI:43470",
+ "http://identifiers.org/chebi/CHEBI:43474",
+ "http://identifiers.org/chebi/CHEBI:45024",
+ "http://identifiers.org/chebi/CHEBI:7793",
+ "http://identifiers.org/hmdb/HMDB00973",
+ "http://identifiers.org/hmdb/HMDB01429",
+ "http://identifiers.org/hmdb/HMDB02105",
+ "http://identifiers.org/hmdb/HMDB02142",
+ "http://identifiers.org/hmdb/HMDB05947",
+ "http://identifiers.org/kegg.compound/C00009",
+ "http://identifiers.org/kegg.compound/C13558",
+ "http://identifiers.org/kegg.drug/D05467",
+ "http://identifiers.org/metanetx.chemical/MNXM9",
+ "http://identifiers.org/seed.compound/cpd00009",
+ "http://identifiers.org/seed.compound/cpd27787"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "HO4P",
+ "id": "pi_e",
+ "name": "Phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pyr",
+ "http://identifiers.org/biocyc/META:PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14987",
+ "http://identifiers.org/chebi/CHEBI:15361",
+ "http://identifiers.org/chebi/CHEBI:26462",
+ "http://identifiers.org/chebi/CHEBI:26466",
+ "http://identifiers.org/chebi/CHEBI:32816",
+ "http://identifiers.org/chebi/CHEBI:45253",
+ "http://identifiers.org/chebi/CHEBI:86354",
+ "http://identifiers.org/chebi/CHEBI:8685",
+ "http://identifiers.org/hmdb/HMDB00243",
+ "http://identifiers.org/hmdb/HMDB62676",
+ "http://identifiers.org/kegg.compound/C00022",
+ "http://identifiers.org/lipidmaps/LMFA01060077",
+ "http://identifiers.org/metanetx.chemical/MNXM23",
+ "http://identifiers.org/seed.compound/cpd00020"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H3O3",
+ "id": "pyr_c",
+ "name": "Pyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pyr",
+ "http://identifiers.org/biocyc/META:PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14987",
+ "http://identifiers.org/chebi/CHEBI:15361",
+ "http://identifiers.org/chebi/CHEBI:26462",
+ "http://identifiers.org/chebi/CHEBI:26466",
+ "http://identifiers.org/chebi/CHEBI:32816",
+ "http://identifiers.org/chebi/CHEBI:45253",
+ "http://identifiers.org/chebi/CHEBI:86354",
+ "http://identifiers.org/chebi/CHEBI:8685",
+ "http://identifiers.org/hmdb/HMDB00243",
+ "http://identifiers.org/hmdb/HMDB62676",
+ "http://identifiers.org/kegg.compound/C00022",
+ "http://identifiers.org/lipidmaps/LMFA01060077",
+ "http://identifiers.org/metanetx.chemical/MNXM23",
+ "http://identifiers.org/seed.compound/cpd00020"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C3H3O3",
+ "id": "pyr_e",
+ "name": "Pyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/q8",
+ "http://identifiers.org/biocyc/META:UBIQUINONE-8",
+ "http://identifiers.org/chebi/CHEBI:61683",
+ "http://identifiers.org/kegg.compound/C17569",
+ "http://identifiers.org/lipidmaps/LMPR02010005",
+ "http://identifiers.org/metanetx.chemical/MNXM232",
+ "http://identifiers.org/seed.compound/cpd15560"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C49H74O4",
+ "id": "q8_c",
+ "name": "Ubiquinone-8"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/q8h2",
+ "http://identifiers.org/biocyc/META:CPD-9956",
+ "http://identifiers.org/chebi/CHEBI:61682",
+ "http://identifiers.org/hmdb/HMDB01060",
+ "http://identifiers.org/metanetx.chemical/MNXM191",
+ "http://identifiers.org/seed.compound/cpd15561",
+ "http://identifiers.org/seed.compound/cpd29608"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C49H76O4",
+ "id": "q8h2_c",
+ "name": "Ubiquinol-8"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/r5p",
+ "http://identifiers.org/biocyc/META:CPD-15318",
+ "http://identifiers.org/chebi/CHEBI:10270",
+ "http://identifiers.org/chebi/CHEBI:12331",
+ "http://identifiers.org/chebi/CHEBI:18189",
+ "http://identifiers.org/chebi/CHEBI:22413",
+ "http://identifiers.org/kegg.compound/C03736",
+ "http://identifiers.org/metanetx.chemical/MNXM15900",
+ "http://identifiers.org/seed.compound/cpd19028"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "r5p_c",
+ "name": "Alpha-D-Ribose 5-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ru5p__D",
+ "http://identifiers.org/biocyc/META:RIBULOSE-5P",
+ "http://identifiers.org/chebi/CHEBI:13018",
+ "http://identifiers.org/chebi/CHEBI:13040",
+ "http://identifiers.org/chebi/CHEBI:17363",
+ "http://identifiers.org/chebi/CHEBI:21088",
+ "http://identifiers.org/chebi/CHEBI:26572",
+ "http://identifiers.org/chebi/CHEBI:37455",
+ "http://identifiers.org/chebi/CHEBI:40192",
+ "http://identifiers.org/chebi/CHEBI:4243",
+ "http://identifiers.org/chebi/CHEBI:58121",
+ "http://identifiers.org/hmdb/HMDB00618",
+ "http://identifiers.org/hmdb/HMDB02033",
+ "http://identifiers.org/hmdb/HMDB02694",
+ "http://identifiers.org/kegg.compound/C00199",
+ "http://identifiers.org/metanetx.chemical/MNXM145",
+ "http://identifiers.org/seed.compound/cpd00171"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "ru5p__D_c",
+ "name": "D-Ribulose 5-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/s7p",
+ "http://identifiers.org/biocyc/META:D-SEDOHEPTULOSE-7-P",
+ "http://identifiers.org/chebi/CHEBI:15073",
+ "http://identifiers.org/chebi/CHEBI:15074",
+ "http://identifiers.org/chebi/CHEBI:15721",
+ "http://identifiers.org/chebi/CHEBI:26621",
+ "http://identifiers.org/chebi/CHEBI:4244",
+ "http://identifiers.org/chebi/CHEBI:57483",
+ "http://identifiers.org/chebi/CHEBI:9083",
+ "http://identifiers.org/hmdb/HMDB01068",
+ "http://identifiers.org/hmdb/HMDB62754",
+ "http://identifiers.org/kegg.compound/C05382",
+ "http://identifiers.org/metanetx.chemical/MNXM271",
+ "http://identifiers.org/seed.compound/cpd00238"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C7H13O10P",
+ "id": "s7p_c",
+ "name": "Sedoheptulose 7-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succ",
+ "http://identifiers.org/biocyc/META:SUC",
+ "http://identifiers.org/chebi/CHEBI:132287",
+ "http://identifiers.org/chebi/CHEBI:15125",
+ "http://identifiers.org/chebi/CHEBI:15741",
+ "http://identifiers.org/chebi/CHEBI:22941",
+ "http://identifiers.org/chebi/CHEBI:22943",
+ "http://identifiers.org/chebi/CHEBI:26803",
+ "http://identifiers.org/chebi/CHEBI:26807",
+ "http://identifiers.org/chebi/CHEBI:30031",
+ "http://identifiers.org/chebi/CHEBI:30779",
+ "http://identifiers.org/chebi/CHEBI:45639",
+ "http://identifiers.org/chebi/CHEBI:90372",
+ "http://identifiers.org/chebi/CHEBI:9304",
+ "http://identifiers.org/hmdb/HMDB00254",
+ "http://identifiers.org/kegg.compound/C00042",
+ "http://identifiers.org/lipidmaps/LMFA01170043",
+ "http://identifiers.org/metanetx.chemical/MNXM25",
+ "http://identifiers.org/seed.compound/cpd00036"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H4O4",
+ "id": "succ_c",
+ "name": "Succinate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succ",
+ "http://identifiers.org/biocyc/META:SUC",
+ "http://identifiers.org/chebi/CHEBI:132287",
+ "http://identifiers.org/chebi/CHEBI:15125",
+ "http://identifiers.org/chebi/CHEBI:15741",
+ "http://identifiers.org/chebi/CHEBI:22941",
+ "http://identifiers.org/chebi/CHEBI:22943",
+ "http://identifiers.org/chebi/CHEBI:26803",
+ "http://identifiers.org/chebi/CHEBI:26807",
+ "http://identifiers.org/chebi/CHEBI:30031",
+ "http://identifiers.org/chebi/CHEBI:30779",
+ "http://identifiers.org/chebi/CHEBI:45639",
+ "http://identifiers.org/chebi/CHEBI:90372",
+ "http://identifiers.org/chebi/CHEBI:9304",
+ "http://identifiers.org/hmdb/HMDB00254",
+ "http://identifiers.org/kegg.compound/C00042",
+ "http://identifiers.org/lipidmaps/LMFA01170043",
+ "http://identifiers.org/metanetx.chemical/MNXM25",
+ "http://identifiers.org/seed.compound/cpd00036"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H4O4",
+ "id": "succ_e",
+ "name": "Succinate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succoa",
+ "http://identifiers.org/biocyc/META:SUC-COA",
+ "http://identifiers.org/chebi/CHEBI:10746",
+ "http://identifiers.org/chebi/CHEBI:15127",
+ "http://identifiers.org/chebi/CHEBI:15380",
+ "http://identifiers.org/chebi/CHEBI:26811",
+ "http://identifiers.org/chebi/CHEBI:45541",
+ "http://identifiers.org/chebi/CHEBI:57292",
+ "http://identifiers.org/chebi/CHEBI:9310",
+ "http://identifiers.org/hmdb/HMDB01022",
+ "http://identifiers.org/kegg.compound/C00091",
+ "http://identifiers.org/lipidmaps/LMFA07050370",
+ "http://identifiers.org/metanetx.chemical/MNXM92",
+ "http://identifiers.org/seed.compound/cpd00078"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C25H35N7O19P3S",
+ "id": "succoa_c",
+ "name": "Succinyl-CoA"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/xu5p__D",
+ "http://identifiers.org/biocyc/META:XYLULOSE-5-PHOSPHATE",
+ "http://identifiers.org/chebi/CHEBI:13036",
+ "http://identifiers.org/chebi/CHEBI:16332",
+ "http://identifiers.org/chebi/CHEBI:21121",
+ "http://identifiers.org/chebi/CHEBI:27354",
+ "http://identifiers.org/chebi/CHEBI:4269",
+ "http://identifiers.org/chebi/CHEBI:57737",
+ "http://identifiers.org/hmdb/HMDB00868",
+ "http://identifiers.org/hmdb/HMDB06212",
+ "http://identifiers.org/kegg.compound/C00231",
+ "http://identifiers.org/metanetx.chemical/MNXM186",
+ "http://identifiers.org/seed.compound/cpd00198"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "xu5p__D_c",
+ "name": "D-Xylulose 5-phosphate"
+ }
+ ],
+ "name": "Escherichia coli str. K-12 substr. MG1655",
+ "notes": {
+ "For specific licensing terms about this particular model and regulations of commercial use, see\n this model in BiGG Models knowledge-base.",
+ "Redistribution and use of any part of this model from BiGG Models knowledge-base, with or without modification, are permitted provided that the following conditions are met": "\n - Redistributions of this SBML file must retain the above copyright notice, this list of conditions and the following disclaimer.
\n - Redistributions in a different form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided\n with the distribution.
\n
This model is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
+ "This is a metabolism model of Escherichia coli str. K-12 substr. MG1655 in\n SBML\u00a0format."
+ },
+ "reactions": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACALD",
+ "http://identifiers.org/biocyc/META:ACETALD-DEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.2.1.10",
+ "http://identifiers.org/kegg.reaction/R00228",
+ "http://identifiers.org/metanetx.reaction/MNXR95210",
+ "http://identifiers.org/rhea/23288",
+ "http://identifiers.org/rhea/23289",
+ "http://identifiers.org/rhea/23290",
+ "http://identifiers.org/rhea/23291"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0351 or b1241",
+ "id": "ACALD",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": -1.0,
+ "accoa_c": 1.0,
+ "coa_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0
+ },
+ "name": "Acetaldehyde dehydrogenase (acetylating)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACALDt",
+ "http://identifiers.org/metanetx.reaction/MNXR95212"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "ACALDt",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": 1.0,
+ "acald_e": -1.0
+ },
+ "name": "Acetaldehyde reversible transport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACKr",
+ "http://identifiers.org/biocyc/META:ACETATEKIN-RXN",
+ "http://identifiers.org/ec-code/2.7.2.1",
+ "http://identifiers.org/ec-code/2.7.2.15",
+ "http://identifiers.org/kegg.reaction/R00315",
+ "http://identifiers.org/metanetx.reaction/MNXR95269",
+ "http://identifiers.org/rhea/11352",
+ "http://identifiers.org/rhea/11353",
+ "http://identifiers.org/rhea/11354",
+ "http://identifiers.org/rhea/11355"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2296 or b3115 or b1849",
+ "id": "ACKr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ac_c": -1.0,
+ "actp_c": 1.0,
+ "adp_c": 1.0,
+ "atp_c": -1.0
+ },
+ "name": "Acetate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACONTa",
+ "http://identifiers.org/biocyc/META:ACONITATEDEHYDR-RXN",
+ "http://identifiers.org/ec-code/4.2.1.3",
+ "http://identifiers.org/kegg.reaction/R01325",
+ "http://identifiers.org/metanetx.reaction/MNXR95386",
+ "http://identifiers.org/rhea/10228",
+ "http://identifiers.org/rhea/10229",
+ "http://identifiers.org/rhea/10230",
+ "http://identifiers.org/rhea/10231"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0118 or b1276",
+ "id": "ACONTa",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acon_C_c": 1.0,
+ "cit_c": -1.0,
+ "h2o_c": 1.0
+ },
+ "name": "Aconitase (half-reaction A, Citrate hydro-lyase)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACONTb",
+ "http://identifiers.org/ec-code/4.2.1.3",
+ "http://identifiers.org/kegg.reaction/R01900",
+ "http://identifiers.org/metanetx.reaction/MNXR95387",
+ "http://identifiers.org/rhea/22144",
+ "http://identifiers.org/rhea/22145",
+ "http://identifiers.org/rhea/22146",
+ "http://identifiers.org/rhea/22147"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0118 or b1276",
+ "id": "ACONTb",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acon_C_c": -1.0,
+ "h2o_c": -1.0,
+ "icit_c": 1.0
+ },
+ "name": "Aconitase (half-reaction B, Isocitrate hydro-lyase)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-571",
+ "http://identifiers.org/metanetx.reaction/MNXR95429"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "ACt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ac_c": 1.0,
+ "ac_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Acetate reversible transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ADK1",
+ "http://identifiers.org/biocyc/META:ADENYL-KIN-RXN",
+ "http://identifiers.org/ec-code/2.7.4.3",
+ "http://identifiers.org/kegg.reaction/R00127",
+ "http://identifiers.org/metanetx.reaction/MNXR95450",
+ "http://identifiers.org/rhea/12973",
+ "http://identifiers.org/rhea/12974",
+ "http://identifiers.org/rhea/12975",
+ "http://identifiers.org/rhea/12976"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0474",
+ "id": "ADK1",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": 2.0,
+ "amp_c": -1.0,
+ "atp_c": -1.0
+ },
+ "name": "Adenylate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/AKGDH",
+ "http://identifiers.org/biocyc/META:2OXOGLUTARATEDEH-RXN",
+ "http://identifiers.org/ec-code/1.2.1.52",
+ "http://identifiers.org/ec-code/1.2.4.2",
+ "http://identifiers.org/ec-code/1.8.1.4",
+ "http://identifiers.org/ec-code/2.3.1.61",
+ "http://identifiers.org/kegg.reaction/R08549",
+ "http://identifiers.org/metanetx.reaction/MNXR95655",
+ "http://identifiers.org/rhea/27786",
+ "http://identifiers.org/rhea/27787",
+ "http://identifiers.org/rhea/27788",
+ "http://identifiers.org/rhea/27789"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0726 and b0116 and b0727",
+ "id": "AKGDH",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_c": -1.0,
+ "co2_c": 1.0,
+ "coa_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "succoa_c": 1.0
+ },
+ "name": "2-Oxogluterate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/AKGt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-23",
+ "http://identifiers.org/metanetx.reaction/MNXR95661",
+ "http://identifiers.org/rhea/29011",
+ "http://identifiers.org/rhea/29012",
+ "http://identifiers.org/rhea/29013",
+ "http://identifiers.org/rhea/29014"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2587",
+ "id": "AKGt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "akg_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "2 oxoglutarate reversible transport via symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ALCD2x",
+ "http://identifiers.org/biocyc/META:ALCOHOL-DEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.1.1.1",
+ "http://identifiers.org/ec-code/1.1.1.71",
+ "http://identifiers.org/kegg.reaction/R00754",
+ "http://identifiers.org/metanetx.reaction/MNXR95725",
+ "http://identifiers.org/rhea/25290",
+ "http://identifiers.org/rhea/25291",
+ "http://identifiers.org/rhea/25292",
+ "http://identifiers.org/rhea/25293"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1478 or b0356 or b1241",
+ "id": "ALCD2x",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": 1.0,
+ "etoh_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0
+ },
+ "name": "Alcohol dehydrogenase (ethanol)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ATPM",
+ "http://identifiers.org/biocyc/META:ATPASE-RXN",
+ "http://identifiers.org/ec-code/3.6.1.15",
+ "http://identifiers.org/ec-code/3.6.1.3",
+ "http://identifiers.org/ec-code/3.6.1.5",
+ "http://identifiers.org/ec-code/3.6.1.8",
+ "http://identifiers.org/ec-code/3.6.3.1",
+ "http://identifiers.org/ec-code/3.6.3.10",
+ "http://identifiers.org/ec-code/3.6.3.11",
+ "http://identifiers.org/ec-code/3.6.3.12",
+ "http://identifiers.org/ec-code/3.6.3.14",
+ "http://identifiers.org/ec-code/3.6.3.15",
+ "http://identifiers.org/ec-code/3.6.3.16",
+ "http://identifiers.org/ec-code/3.6.3.17",
+ "http://identifiers.org/ec-code/3.6.3.18",
+ "http://identifiers.org/ec-code/3.6.3.19",
+ "http://identifiers.org/ec-code/3.6.3.2",
+ "http://identifiers.org/ec-code/3.6.3.20",
+ "http://identifiers.org/ec-code/3.6.3.21",
+ "http://identifiers.org/ec-code/3.6.3.22",
+ "http://identifiers.org/ec-code/3.6.3.23",
+ "http://identifiers.org/ec-code/3.6.3.24",
+ "http://identifiers.org/ec-code/3.6.3.25",
+ "http://identifiers.org/ec-code/3.6.3.26",
+ "http://identifiers.org/ec-code/3.6.3.27",
+ "http://identifiers.org/ec-code/3.6.3.28",
+ "http://identifiers.org/ec-code/3.6.3.29",
+ "http://identifiers.org/ec-code/3.6.3.3",
+ "http://identifiers.org/ec-code/3.6.3.30",
+ "http://identifiers.org/ec-code/3.6.3.31",
+ "http://identifiers.org/ec-code/3.6.3.32",
+ "http://identifiers.org/ec-code/3.6.3.33",
+ "http://identifiers.org/ec-code/3.6.3.34",
+ "http://identifiers.org/ec-code/3.6.3.35",
+ "http://identifiers.org/ec-code/3.6.3.36",
+ "http://identifiers.org/ec-code/3.6.3.37",
+ "http://identifiers.org/ec-code/3.6.3.38",
+ "http://identifiers.org/ec-code/3.6.3.39",
+ "http://identifiers.org/ec-code/3.6.3.4",
+ "http://identifiers.org/ec-code/3.6.3.40",
+ "http://identifiers.org/ec-code/3.6.3.41",
+ "http://identifiers.org/ec-code/3.6.3.42",
+ "http://identifiers.org/ec-code/3.6.3.43",
+ "http://identifiers.org/ec-code/3.6.3.44",
+ "http://identifiers.org/ec-code/3.6.3.46",
+ "http://identifiers.org/ec-code/3.6.3.47",
+ "http://identifiers.org/ec-code/3.6.3.48",
+ "http://identifiers.org/ec-code/3.6.3.49",
+ "http://identifiers.org/ec-code/3.6.3.5",
+ "http://identifiers.org/ec-code/3.6.3.50",
+ "http://identifiers.org/ec-code/3.6.3.51",
+ "http://identifiers.org/ec-code/3.6.3.52",
+ "http://identifiers.org/ec-code/3.6.3.53",
+ "http://identifiers.org/ec-code/3.6.3.54",
+ "http://identifiers.org/ec-code/3.6.3.6",
+ "http://identifiers.org/ec-code/3.6.3.7",
+ "http://identifiers.org/ec-code/3.6.3.8",
+ "http://identifiers.org/ec-code/3.6.3.9",
+ "http://identifiers.org/ec-code/3.6.4.1",
+ "http://identifiers.org/ec-code/3.6.4.10",
+ "http://identifiers.org/ec-code/3.6.4.11",
+ "http://identifiers.org/ec-code/3.6.4.12",
+ "http://identifiers.org/ec-code/3.6.4.13",
+ "http://identifiers.org/ec-code/3.6.4.2",
+ "http://identifiers.org/ec-code/3.6.4.3",
+ "http://identifiers.org/ec-code/3.6.4.4",
+ "http://identifiers.org/ec-code/3.6.4.5",
+ "http://identifiers.org/ec-code/3.6.4.6",
+ "http://identifiers.org/ec-code/3.6.4.7",
+ "http://identifiers.org/ec-code/3.6.4.8",
+ "http://identifiers.org/ec-code/3.6.4.9",
+ "http://identifiers.org/kegg.reaction/R00086",
+ "http://identifiers.org/metanetx.reaction/MNXR96131",
+ "http://identifiers.org/rhea/13065",
+ "http://identifiers.org/rhea/13066",
+ "http://identifiers.org/rhea/13067",
+ "http://identifiers.org/rhea/13068"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000630"
+ },
+ "gene_reaction_rule": "",
+ "id": "ATPM",
+ "lower_bound": 8.39,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "pi_c": 1.0
+ },
+ "name": "ATP maintenance requirement",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ATPS4r",
+ "http://identifiers.org/biocyc/META:ATPSYN-RXN",
+ "http://identifiers.org/ec-code/3.6.3.14",
+ "http://identifiers.org/metanetx.reaction/MNXR96136"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b3738 and b3736 and b3737 and b3735 and b3733 and b3731 and b3732 and b3734 ) or ( b3734 and b3732 and b3731 and b3733 and b3735 and b3737 and b3736 and b3738 and b3739 )",
+ "id": "ATPS4r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": -1.0,
+ "atp_c": 1.0,
+ "h2o_c": 1.0,
+ "h_c": 3.0,
+ "h_e": -4.0,
+ "pi_c": -1.0
+ },
+ "name": "ATP synthase (four protons for one ATP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/Ecoli_core_w_GAM"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000629"
+ },
+ "gene_reaction_rule": "",
+ "id": "BIOMASS_Ecoli_core_w_GAM",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "3pg_c": -1.496,
+ "accoa_c": -3.7478,
+ "adp_c": 59.81,
+ "akg_c": 4.1182,
+ "atp_c": -59.81,
+ "coa_c": 3.7478,
+ "e4p_c": -0.361,
+ "f6p_c": -0.0709,
+ "g3p_c": -0.129,
+ "g6p_c": -0.205,
+ "gln__L_c": -0.2557,
+ "glu__L_c": -4.9414,
+ "h2o_c": -59.81,
+ "h_c": 59.81,
+ "nad_c": -3.547,
+ "nadh_c": 3.547,
+ "nadp_c": 13.0279,
+ "nadph_c": -13.0279,
+ "oaa_c": -1.7867,
+ "pep_c": -0.5191,
+ "pi_c": 59.81,
+ "pyr_c": -2.8328,
+ "r5p_c": -0.8977
+ },
+ "name": "Biomass Objective Function with GAM",
+ "objective_coefficient": 1.0,
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CO2t",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-545",
+ "http://identifiers.org/metanetx.reaction/MNXR96810"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "CO2t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "co2_e": -1.0
+ },
+ "name": "CO2 transporter via diffusion",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CS",
+ "http://identifiers.org/biocyc/META:CITSYN-RXN",
+ "http://identifiers.org/biocyc/META:RXN-14905",
+ "http://identifiers.org/ec-code/2.3.3.1",
+ "http://identifiers.org/ec-code/2.3.3.16",
+ "http://identifiers.org/ec-code/2.3.3.3",
+ "http://identifiers.org/kegg.reaction/R00351",
+ "http://identifiers.org/metanetx.reaction/MNXR96920",
+ "http://identifiers.org/rhea/16845",
+ "http://identifiers.org/rhea/16846",
+ "http://identifiers.org/rhea/16847",
+ "http://identifiers.org/rhea/16848"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0720",
+ "id": "CS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "cit_c": 1.0,
+ "coa_c": 1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "oaa_c": -1.0
+ },
+ "name": "Citrate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CYTBD",
+ "http://identifiers.org/metanetx.reaction/MNXR97031"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b0978 and b0979 ) or ( b0733 and b0734 )",
+ "id": "CYTBD",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h2o_c": 1.0,
+ "h_c": -2.0,
+ "h_e": 2.0,
+ "o2_c": -0.5,
+ "q8_c": 1.0,
+ "q8h2_c": -1.0
+ },
+ "name": "Cytochrome oxidase bd (ubiquinol-8: 2 protons)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/D_LACt2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-515",
+ "http://identifiers.org/metanetx.reaction/MNXR97838"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2975 or b3603",
+ "id": "D_LACt2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "lac__D_c": 1.0,
+ "lac__D_e": -1.0
+ },
+ "name": "D lactate transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ENO",
+ "http://identifiers.org/biocyc/META:2PGADEHYDRAT-RXN",
+ "http://identifiers.org/ec-code/4.2.1.11",
+ "http://identifiers.org/kegg.reaction/R00658",
+ "http://identifiers.org/metanetx.reaction/MNXR97932",
+ "http://identifiers.org/rhea/10164",
+ "http://identifiers.org/rhea/10165",
+ "http://identifiers.org/rhea/10166",
+ "http://identifiers.org/rhea/10167"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2779",
+ "id": "ENO",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "2pg_c": -1.0,
+ "h2o_c": 1.0,
+ "pep_c": 1.0
+ },
+ "name": "Enolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ETOHt2r",
+ "http://identifiers.org/metanetx.reaction/MNXR97981"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "ETOHt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "etoh_c": 1.0,
+ "etoh_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Ethanol reversible transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ac"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_ac_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "ac_e": -1.0
+ },
+ "name": "Acetate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/acald"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_acald_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "acald_e": -1.0
+ },
+ "name": "Acetaldehyde exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/akg"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_akg_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_e": -1.0
+ },
+ "name": "2-Oxoglutarate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/co2"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_co2_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "co2_e": -1.0
+ },
+ "name": "CO2 exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/etoh"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_etoh_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "etoh_e": -1.0
+ },
+ "name": "Ethanol exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/for"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_for_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "for_e": -1.0
+ },
+ "name": "Formate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/fru"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_fru_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fru_e": -1.0
+ },
+ "name": "D-Fructose exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/fum"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_fum_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_e": -1.0
+ },
+ "name": "Fumarate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/glc__D"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_glc__D_e",
+ "lower_bound": -10.0,
+ "metabolites": {
+ "glc__D_e": -1.0
+ },
+ "name": "D-Glucose exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/gln__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_gln__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "gln__L_e": -1.0
+ },
+ "name": "L-Glutamine exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/glu__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_glu__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "glu__L_e": -1.0
+ },
+ "name": "L-Glutamate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/h"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_h_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_e": -1.0
+ },
+ "name": "H+ exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/h2o"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_h2o_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h2o_e": -1.0
+ },
+ "name": "H2O exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/lac__D"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_lac__D_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "lac__D_e": -1.0
+ },
+ "name": "D-lactate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/mal__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_mal__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "mal__L_e": -1.0
+ },
+ "name": "L-Malate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/nh4"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_nh4_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "nh4_e": -1.0
+ },
+ "name": "Ammonia exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/o2"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_o2_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "o2_e": -1.0
+ },
+ "name": "O2 exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/pi"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_pi_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "pi_e": -1.0
+ },
+ "name": "Phosphate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/pyr"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_pyr_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "pyr_e": -1.0
+ },
+ "name": "Pyruvate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/succ"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_succ_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "succ_e": -1.0
+ },
+ "name": "Succinate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FBA",
+ "http://identifiers.org/ec-code/4.1.2.13",
+ "http://identifiers.org/kegg.reaction/R01068",
+ "http://identifiers.org/metanetx.reaction/MNXR99459",
+ "http://identifiers.org/rhea/14729",
+ "http://identifiers.org/rhea/14730",
+ "http://identifiers.org/rhea/14731",
+ "http://identifiers.org/rhea/14732"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1773 or b2097 or b2925",
+ "id": "FBA",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "dhap_c": 1.0,
+ "fdp_c": -1.0,
+ "g3p_c": 1.0
+ },
+ "name": "Fructose-bisphosphate aldolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FBP",
+ "http://identifiers.org/ec-code/3.1.3.11",
+ "http://identifiers.org/metanetx.reaction/MNXR99465",
+ "http://identifiers.org/rhea/11064",
+ "http://identifiers.org/rhea/11065",
+ "http://identifiers.org/rhea/11066",
+ "http://identifiers.org/rhea/11067"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3925 or b4232",
+ "id": "FBP",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "fdp_c": -1.0,
+ "h2o_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Fructose-bisphosphatase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FORt2",
+ "http://identifiers.org/metanetx.reaction/MNXR99621"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0904 or b2492",
+ "id": "FORt2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "for_c": 1.0,
+ "for_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Formate transport in via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FORt",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-1",
+ "http://identifiers.org/metanetx.reaction/MNXR99620",
+ "http://identifiers.org/rhea/29679",
+ "http://identifiers.org/rhea/29680",
+ "http://identifiers.org/rhea/29681",
+ "http://identifiers.org/rhea/29682"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0904 or b2492",
+ "id": "FORt",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "for_c": 1.0,
+ "for_e": -1.0
+ },
+ "name": "Formate transport via diffusion",
+ "upper_bound": 0.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FRD7",
+ "http://identifiers.org/metanetx.reaction/MNXR99641",
+ "http://identifiers.org/rhea/29187",
+ "http://identifiers.org/rhea/29188",
+ "http://identifiers.org/rhea/29189",
+ "http://identifiers.org/rhea/29190"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4153 and b4151 and b4152 and b4154",
+ "id": "FRD7",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": -1.0,
+ "q8_c": 1.0,
+ "q8h2_c": -1.0,
+ "succ_c": 1.0
+ },
+ "name": "Fumarate reductase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FRUpts2",
+ "http://identifiers.org/metanetx.reaction/MNXR99662"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2415 and b1818 and b1817 and b1819 and b2416",
+ "id": "FRUpts2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "fru_e": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Fructose transport via PEP:Pyr PTS (f6p generating)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FUM",
+ "http://identifiers.org/biocyc/META:FUMHYDR-RXN",
+ "http://identifiers.org/ec-code/4.2.1.2",
+ "http://identifiers.org/kegg.reaction/R01082",
+ "http://identifiers.org/metanetx.reaction/MNXR99705",
+ "http://identifiers.org/rhea/12460",
+ "http://identifiers.org/rhea/12461",
+ "http://identifiers.org/rhea/12462",
+ "http://identifiers.org/rhea/12463"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4122 or b1612 or b1611",
+ "id": "FUM",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "fum_c": -1.0,
+ "h2o_c": -1.0,
+ "mal__L_c": 1.0
+ },
+ "name": "Fumarase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FUMt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121B",
+ "http://identifiers.org/metanetx.reaction/MNXR99711",
+ "http://identifiers.org/rhea/29331",
+ "http://identifiers.org/rhea/29332",
+ "http://identifiers.org/rhea/29333",
+ "http://identifiers.org/rhea/29334"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "FUMt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": 1.0,
+ "fum_e": -1.0,
+ "h_c": 2.0,
+ "h_e": -2.0
+ },
+ "name": "Fumarate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/G6PDH2r",
+ "http://identifiers.org/biocyc/META:GLU6PDEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.1.1.363",
+ "http://identifiers.org/ec-code/1.1.1.49",
+ "http://identifiers.org/kegg.reaction/R00835",
+ "http://identifiers.org/metanetx.reaction/MNXR99907",
+ "http://identifiers.org/rhea/15841",
+ "http://identifiers.org/rhea/15842",
+ "http://identifiers.org/rhea/15843",
+ "http://identifiers.org/rhea/15844"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1852",
+ "id": "G6PDH2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "6pgl_c": 1.0,
+ "g6p_c": -1.0,
+ "h_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "Glucose 6-phosphate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GAPD",
+ "http://identifiers.org/biocyc/META:GAPOXNPHOSPHN-RXN",
+ "http://identifiers.org/ec-code/1.2.1.12",
+ "http://identifiers.org/ec-code/1.2.1.59",
+ "http://identifiers.org/kegg.reaction/R01061",
+ "http://identifiers.org/metanetx.reaction/MNXR100040",
+ "http://identifiers.org/rhea/10300",
+ "http://identifiers.org/rhea/10301",
+ "http://identifiers.org/rhea/10302",
+ "http://identifiers.org/rhea/10303"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1779",
+ "id": "GAPD",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "13dpg_c": 1.0,
+ "g3p_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pi_c": -1.0
+ },
+ "name": "Glyceraldehyde-3-phosphate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLCpts",
+ "http://identifiers.org/metanetx.reaction/MNXR100237"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b2415 and b1818 and b1817 and b1819 and b2416 ) or ( b2415 and b2417 and b1101 and b2416 ) or ( b2415 and b2417 and b1621 and b2416 )",
+ "id": "GLCpts",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "g6p_c": 1.0,
+ "glc__D_e": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "D-glucose transport via PEP:Pyr PTS",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLNS",
+ "http://identifiers.org/biocyc/META:GLUTAMINESYN-RXN",
+ "http://identifiers.org/ec-code/6.3.1.2",
+ "http://identifiers.org/kegg.reaction/R00253",
+ "http://identifiers.org/metanetx.reaction/MNXR100024",
+ "http://identifiers.org/rhea/16169",
+ "http://identifiers.org/rhea/16170",
+ "http://identifiers.org/rhea/16171",
+ "http://identifiers.org/rhea/16172"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3870 or b1297",
+ "id": "GLNS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "gln__L_c": 1.0,
+ "glu__L_c": -1.0,
+ "h_c": 1.0,
+ "nh4_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Glutamine synthetase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLNabc",
+ "http://identifiers.org/biocyc/META:ABC-12-RXN",
+ "http://identifiers.org/ec-code/3.6.3.21",
+ "http://identifiers.org/metanetx.reaction/MNXR100258",
+ "http://identifiers.org/rhea/29895#1",
+ "http://identifiers.org/rhea/29896#1",
+ "http://identifiers.org/rhea/29897#1",
+ "http://identifiers.org/rhea/29898#1"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0810 and b0811 and b0809",
+ "id": "GLNabc",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "gln__L_c": 1.0,
+ "gln__L_e": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "pi_c": 1.0
+ },
+ "name": "L-glutamine transport via ABC system",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUDy",
+ "http://identifiers.org/biocyc/META:GLUTDEHYD-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/ec-code/1.4.1.3",
+ "http://identifiers.org/ec-code/1.4.1.4",
+ "http://identifiers.org/kegg.reaction/R00248",
+ "http://identifiers.org/metanetx.reaction/MNXR100086",
+ "http://identifiers.org/rhea/11612",
+ "http://identifiers.org/rhea/11613",
+ "http://identifiers.org/rhea/11614",
+ "http://identifiers.org/rhea/11615"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1761",
+ "id": "GLUDy",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "glu__L_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "nh4_c": 1.0
+ },
+ "name": "Glutamate dehydrogenase (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUN",
+ "http://identifiers.org/biocyc/META:GLUTAMIN-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/ec-code/1.4.7.1",
+ "http://identifiers.org/ec-code/3.5.1.2",
+ "http://identifiers.org/ec-code/3.5.1.38",
+ "http://identifiers.org/ec-code/4.3.3.6",
+ "http://identifiers.org/ec-code/6.3.4.2",
+ "http://identifiers.org/ec-code/6.3.5.2",
+ "http://identifiers.org/ec-code/6.3.5.4",
+ "http://identifiers.org/ec-code/6.3.5.5",
+ "http://identifiers.org/kegg.reaction/R00256",
+ "http://identifiers.org/metanetx.reaction/MNXR100030",
+ "http://identifiers.org/rhea/15889",
+ "http://identifiers.org/rhea/15890",
+ "http://identifiers.org/rhea/15891",
+ "http://identifiers.org/rhea/15892"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0485 or b1812 or b1524",
+ "id": "GLUN",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "gln__L_c": -1.0,
+ "glu__L_c": 1.0,
+ "h2o_c": -1.0,
+ "nh4_c": 1.0
+ },
+ "name": "Glutaminase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUSy",
+ "http://identifiers.org/biocyc/META:GLUTAMATESYN-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/kegg.reaction/R00114",
+ "http://identifiers.org/metanetx.reaction/MNXR100291",
+ "http://identifiers.org/rhea/15501",
+ "http://identifiers.org/rhea/15502",
+ "http://identifiers.org/rhea/15503",
+ "http://identifiers.org/rhea/15504"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3212 and b3213",
+ "id": "GLUSy",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_c": -1.0,
+ "gln__L_c": -1.0,
+ "glu__L_c": 2.0,
+ "h_c": -1.0,
+ "nadp_c": 1.0,
+ "nadph_c": -1.0
+ },
+ "name": "Glutamate synthase (NADPH)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUt2r",
+ "http://identifiers.org/metanetx.reaction/MNXR100300"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4077",
+ "id": "GLUt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "glu__L_c": 1.0,
+ "glu__L_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "L glutamate transport via proton symport reversible",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GND",
+ "http://identifiers.org/biocyc/META:RXN-9952",
+ "http://identifiers.org/ec-code/1.1.1.351",
+ "http://identifiers.org/ec-code/1.1.1.44",
+ "http://identifiers.org/kegg.reaction/R01528",
+ "http://identifiers.org/metanetx.reaction/MNXR100389",
+ "http://identifiers.org/rhea/10116",
+ "http://identifiers.org/rhea/10117",
+ "http://identifiers.org/rhea/10118",
+ "http://identifiers.org/rhea/10119"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2029",
+ "id": "GND",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "6pgc_c": -1.0,
+ "co2_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "ru5p__D_c": 1.0
+ },
+ "name": "Phosphogluconate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/H2Ot",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-145",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-547",
+ "http://identifiers.org/metanetx.reaction/MNXR98641",
+ "http://identifiers.org/rhea/29667",
+ "http://identifiers.org/rhea/29668",
+ "http://identifiers.org/rhea/29669",
+ "http://identifiers.org/rhea/29670"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0875 or s0001",
+ "id": "H2Ot",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h2o_c": 1.0,
+ "h2o_e": -1.0
+ },
+ "name": "H2O transport via diffusion",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ICDHyr",
+ "http://identifiers.org/ec-code/1.1.1.42",
+ "http://identifiers.org/kegg.reaction/R00267",
+ "http://identifiers.org/metanetx.reaction/MNXR100781",
+ "http://identifiers.org/rhea/19629",
+ "http://identifiers.org/rhea/19630",
+ "http://identifiers.org/rhea/19631",
+ "http://identifiers.org/rhea/19632"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1136",
+ "id": "ICDHyr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "co2_c": 1.0,
+ "icit_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "Isocitrate dehydrogenase (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ICL",
+ "http://identifiers.org/ec-code/4.1.3.1",
+ "http://identifiers.org/kegg.reaction/R00479",
+ "http://identifiers.org/metanetx.reaction/MNXR100789",
+ "http://identifiers.org/rhea/13245",
+ "http://identifiers.org/rhea/13246",
+ "http://identifiers.org/rhea/13247",
+ "http://identifiers.org/rhea/13248"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4015",
+ "id": "ICL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "glx_c": 1.0,
+ "icit_c": -1.0,
+ "succ_c": 1.0
+ },
+ "name": "Isocitrate lyase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/LDH_D",
+ "http://identifiers.org/biocyc/META:DLACTDEHYDROGNAD-RXN",
+ "http://identifiers.org/ec-code/1.1.1.28",
+ "http://identifiers.org/kegg.reaction/R00704",
+ "http://identifiers.org/metanetx.reaction/MNXR101037",
+ "http://identifiers.org/rhea/16369",
+ "http://identifiers.org/rhea/16370",
+ "http://identifiers.org/rhea/16371",
+ "http://identifiers.org/rhea/16372"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2133 or b1380",
+ "id": "LDH_D",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "lac__D_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "D-lactate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MALS",
+ "http://identifiers.org/biocyc/META:MALSYN-RXN",
+ "http://identifiers.org/ec-code/2.3.3.9",
+ "http://identifiers.org/kegg.reaction/R00472",
+ "http://identifiers.org/metanetx.reaction/MNXR101347",
+ "http://identifiers.org/rhea/18181",
+ "http://identifiers.org/rhea/18182",
+ "http://identifiers.org/rhea/18183",
+ "http://identifiers.org/rhea/18184"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4014 or b2976",
+ "id": "MALS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "coa_c": 1.0,
+ "glx_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "mal__L_c": 1.0
+ },
+ "name": "Malate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MALt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121A",
+ "http://identifiers.org/metanetx.reaction/MNXR101370",
+ "http://identifiers.org/rhea/29339",
+ "http://identifiers.org/rhea/29340",
+ "http://identifiers.org/rhea/29341",
+ "http://identifiers.org/rhea/29342"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "MALt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "mal__L_c": 1.0,
+ "mal__L_e": -1.0
+ },
+ "name": "Malate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MDH",
+ "http://identifiers.org/biocyc/META:MALATE-DEH-RXN",
+ "http://identifiers.org/ec-code/1.1.1.299",
+ "http://identifiers.org/ec-code/1.1.1.37",
+ "http://identifiers.org/kegg.reaction/R00342",
+ "http://identifiers.org/metanetx.reaction/MNXR101439",
+ "http://identifiers.org/rhea/21432",
+ "http://identifiers.org/rhea/21433",
+ "http://identifiers.org/rhea/21434",
+ "http://identifiers.org/rhea/21435"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3236",
+ "id": "MDH",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "mal__L_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "oaa_c": 1.0
+ },
+ "name": "Malate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ME1",
+ "http://identifiers.org/biocyc/META:1.1.1.39-RXN",
+ "http://identifiers.org/ec-code/1.1.1.38",
+ "http://identifiers.org/ec-code/1.1.1.39",
+ "http://identifiers.org/kegg.reaction/R00214",
+ "http://identifiers.org/metanetx.reaction/MNXR101446",
+ "http://identifiers.org/rhea/12653",
+ "http://identifiers.org/rhea/12654",
+ "http://identifiers.org/rhea/12655",
+ "http://identifiers.org/rhea/12656"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1479",
+ "id": "ME1",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "mal__L_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Malic enzyme (NAD)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ME2",
+ "http://identifiers.org/biocyc/META:MALIC-NADP-RXN",
+ "http://identifiers.org/ec-code/1.1.1.40",
+ "http://identifiers.org/kegg.reaction/R00216",
+ "http://identifiers.org/metanetx.reaction/MNXR101443",
+ "http://identifiers.org/rhea/18253",
+ "http://identifiers.org/rhea/18254",
+ "http://identifiers.org/rhea/18255",
+ "http://identifiers.org/rhea/18256"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2463",
+ "id": "ME2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "mal__L_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Malic enzyme (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NADH16",
+ "http://identifiers.org/ec-code/1.6.5.3",
+ "http://identifiers.org/metanetx.reaction/MNXR101864"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2287 and b2285 and b2283 and b2281 and b2279 and b2277 and b2276 and b2278 and b2280 and b2282 and b2284 and b2286 and b2288",
+ "id": "NADH16",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": -4.0,
+ "h_e": 3.0,
+ "nad_c": 1.0,
+ "nadh_c": -1.0,
+ "q8_c": -1.0,
+ "q8h2_c": 1.0
+ },
+ "name": "NADH dehydrogenase (ubiquinone-8 & 3 protons)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NADTRHD",
+ "http://identifiers.org/biocyc/META:PYRNUTRANSHYDROGEN-RXN",
+ "http://identifiers.org/ec-code/1.6.1.1",
+ "http://identifiers.org/ec-code/1.6.1.2",
+ "http://identifiers.org/ec-code/1.6.1.3",
+ "http://identifiers.org/kegg.reaction/R00112",
+ "http://identifiers.org/metanetx.reaction/MNXR101898",
+ "http://identifiers.org/rhea/11692",
+ "http://identifiers.org/rhea/11693",
+ "http://identifiers.org/rhea/11694",
+ "http://identifiers.org/rhea/11695"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3962 or ( b1602 and b1603 )",
+ "id": "NADTRHD",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "nadp_c": 1.0,
+ "nadph_c": -1.0
+ },
+ "name": "NAD transhydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NH4t",
+ "http://identifiers.org/biocyc/META:RXN-9615",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-206",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-544",
+ "http://identifiers.org/metanetx.reaction/MNXR101950",
+ "http://identifiers.org/rhea/28747",
+ "http://identifiers.org/rhea/28748",
+ "http://identifiers.org/rhea/28749",
+ "http://identifiers.org/rhea/28750"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001 or b0451",
+ "id": "NH4t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "nh4_c": 1.0,
+ "nh4_e": -1.0
+ },
+ "name": "Ammonia reversible transport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/O2t",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-474",
+ "http://identifiers.org/metanetx.reaction/MNXR102090"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "O2t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "o2_c": 1.0,
+ "o2_e": -1.0
+ },
+ "name": "O2 transport diffusion ",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PDH",
+ "http://identifiers.org/biocyc/META:PYRUVDEH-RXN",
+ "http://identifiers.org/ec-code/1.2.1.-",
+ "http://identifiers.org/ec-code/1.2.1.51",
+ "http://identifiers.org/ec-code/1.2.4.1",
+ "http://identifiers.org/ec-code/1.8.1.4",
+ "http://identifiers.org/ec-code/2.3.1.12",
+ "http://identifiers.org/kegg.reaction/R00209",
+ "http://identifiers.org/metanetx.reaction/MNXR102425",
+ "http://identifiers.org/rhea/28042",
+ "http://identifiers.org/rhea/28043",
+ "http://identifiers.org/rhea/28044",
+ "http://identifiers.org/rhea/28045"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0115 and b0114 and b0116",
+ "id": "PDH",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": 1.0,
+ "co2_c": 1.0,
+ "coa_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Pyruvate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PFK",
+ "http://identifiers.org/ec-code/2.7.1.11",
+ "http://identifiers.org/metanetx.reaction/MNXR102507",
+ "http://identifiers.org/rhea/16109",
+ "http://identifiers.org/rhea/16110",
+ "http://identifiers.org/rhea/16111",
+ "http://identifiers.org/rhea/16112"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3916 or b1723",
+ "id": "PFK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "f6p_c": -1.0,
+ "fdp_c": 1.0,
+ "h_c": 1.0
+ },
+ "name": "Phosphofructokinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PFL",
+ "http://identifiers.org/biocyc/META:PYRUVFORMLY-RXN",
+ "http://identifiers.org/ec-code/2.3.1.54",
+ "http://identifiers.org/kegg.reaction/R00212",
+ "http://identifiers.org/metanetx.reaction/MNXR102514",
+ "http://identifiers.org/rhea/11844",
+ "http://identifiers.org/rhea/11845",
+ "http://identifiers.org/rhea/11846",
+ "http://identifiers.org/rhea/11847"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b0902 and b3114 ) or ( b0903 and b0902 and b2579 ) or ( b0902 and b0903 ) or ( b3951 and b3952 )",
+ "id": "PFL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": 1.0,
+ "coa_c": -1.0,
+ "for_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Pyruvate formate lyase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGI",
+ "http://identifiers.org/biocyc/META:PGLUCISOM-RXN",
+ "http://identifiers.org/ec-code/5.3.1.9",
+ "http://identifiers.org/metanetx.reaction/MNXR102535"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4025",
+ "id": "PGI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "g6p_c": -1.0
+ },
+ "name": "Glucose-6-phosphate isomerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGK",
+ "http://identifiers.org/biocyc/META:PHOSGLYPHOS-RXN",
+ "http://identifiers.org/ec-code/2.7.2.3",
+ "http://identifiers.org/kegg.reaction/R01512",
+ "http://identifiers.org/metanetx.reaction/MNXR102538",
+ "http://identifiers.org/rhea/14801",
+ "http://identifiers.org/rhea/14802",
+ "http://identifiers.org/rhea/14803",
+ "http://identifiers.org/rhea/14804"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2926",
+ "id": "PGK",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "13dpg_c": 1.0,
+ "3pg_c": -1.0,
+ "adp_c": 1.0,
+ "atp_c": -1.0
+ },
+ "name": "Phosphoglycerate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGL",
+ "http://identifiers.org/biocyc/META:6PGLUCONOLACT-RXN",
+ "http://identifiers.org/ec-code/3.1.1.31",
+ "http://identifiers.org/kegg.reaction/R02035",
+ "http://identifiers.org/metanetx.reaction/MNXR102539",
+ "http://identifiers.org/rhea/12556",
+ "http://identifiers.org/rhea/12557",
+ "http://identifiers.org/rhea/12558",
+ "http://identifiers.org/rhea/12559"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0767",
+ "id": "PGL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "6pgc_c": 1.0,
+ "6pgl_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0
+ },
+ "name": "6-phosphogluconolactonase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGM",
+ "http://identifiers.org/biocyc/META:3PGAREARR-RXN",
+ "http://identifiers.org/biocyc/META:RXN-15513",
+ "http://identifiers.org/ec-code/5.4.2.1",
+ "http://identifiers.org/ec-code/5.4.2.11",
+ "http://identifiers.org/ec-code/5.4.2.12",
+ "http://identifiers.org/kegg.reaction/R01518",
+ "http://identifiers.org/metanetx.reaction/MNXR102547",
+ "http://identifiers.org/rhea/15901",
+ "http://identifiers.org/rhea/15902",
+ "http://identifiers.org/rhea/15903",
+ "http://identifiers.org/rhea/15904"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4395 or b3612 or b0755",
+ "id": "PGM",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "2pg_c": -1.0,
+ "3pg_c": 1.0
+ },
+ "name": "Phosphoglycerate mutase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PIt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-114",
+ "http://identifiers.org/metanetx.reaction/MNXR102872",
+ "http://identifiers.org/rhea/29939",
+ "http://identifiers.org/rhea/29940",
+ "http://identifiers.org/rhea/29941",
+ "http://identifiers.org/rhea/29942"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2987 or b3493",
+ "id": "PIt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "pi_c": 1.0,
+ "pi_e": -1.0
+ },
+ "name": "Phosphate reversible transport via symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPC",
+ "http://identifiers.org/ec-code/4.1.1.31",
+ "http://identifiers.org/kegg.reaction/R00345",
+ "http://identifiers.org/metanetx.reaction/MNXR103096",
+ "http://identifiers.org/rhea/23072",
+ "http://identifiers.org/rhea/23073",
+ "http://identifiers.org/rhea/23074",
+ "http://identifiers.org/rhea/23075"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3956",
+ "id": "PPC",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "oaa_c": 1.0,
+ "pep_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Phosphoenolpyruvate carboxylase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPCK",
+ "http://identifiers.org/biocyc/META:PEPCARBOXYKIN-RXN",
+ "http://identifiers.org/ec-code/4.1.1.49",
+ "http://identifiers.org/kegg.reaction/R00341",
+ "http://identifiers.org/metanetx.reaction/MNXR103099",
+ "http://identifiers.org/rhea/18617",
+ "http://identifiers.org/rhea/18618",
+ "http://identifiers.org/rhea/18619",
+ "http://identifiers.org/rhea/18620"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3403",
+ "id": "PPCK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "co2_c": 1.0,
+ "oaa_c": -1.0,
+ "pep_c": 1.0
+ },
+ "name": "Phosphoenolpyruvate carboxykinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPS",
+ "http://identifiers.org/biocyc/META:PEPSYNTH-RXN",
+ "http://identifiers.org/ec-code/2.7.9.2",
+ "http://identifiers.org/kegg.reaction/R00199",
+ "http://identifiers.org/metanetx.reaction/MNXR103140",
+ "http://identifiers.org/rhea/11364",
+ "http://identifiers.org/rhea/11365",
+ "http://identifiers.org/rhea/11366",
+ "http://identifiers.org/rhea/11367"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1702",
+ "id": "PPS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "amp_c": 1.0,
+ "atp_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 2.0,
+ "pep_c": 1.0,
+ "pi_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Phosphoenolpyruvate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PTAr",
+ "http://identifiers.org/biocyc/META:PHOSACETYLTRANS-RXN",
+ "http://identifiers.org/ec-code/2.3.1.8",
+ "http://identifiers.org/kegg.reaction/R00230",
+ "http://identifiers.org/metanetx.reaction/MNXR103319",
+ "http://identifiers.org/rhea/19521",
+ "http://identifiers.org/rhea/19522",
+ "http://identifiers.org/rhea/19523",
+ "http://identifiers.org/rhea/19524"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2297 or b2458",
+ "id": "PTAr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "actp_c": 1.0,
+ "coa_c": 1.0,
+ "pi_c": -1.0
+ },
+ "name": "Phosphotransacetylase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PYK",
+ "http://identifiers.org/biocyc/META:PEPDEPHOS-RXN",
+ "http://identifiers.org/ec-code/2.7.1.40",
+ "http://identifiers.org/kegg.reaction/R00200",
+ "http://identifiers.org/metanetx.reaction/MNXR103371",
+ "http://identifiers.org/rhea/18157",
+ "http://identifiers.org/rhea/18158",
+ "http://identifiers.org/rhea/18159",
+ "http://identifiers.org/rhea/18160"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1854 or b1676",
+ "id": "PYK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": -1.0,
+ "atp_c": 1.0,
+ "h_c": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Pyruvate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PYRt2",
+ "http://identifiers.org/metanetx.reaction/MNXR103385"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "PYRt2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "pyr_c": 1.0,
+ "pyr_e": -1.0
+ },
+ "name": "Pyruvate transport in via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/RPE",
+ "http://identifiers.org/biocyc/META:RIBULP3EPIM-RXN",
+ "http://identifiers.org/ec-code/5.1.3.1",
+ "http://identifiers.org/kegg.reaction/R01529",
+ "http://identifiers.org/metanetx.reaction/MNXR104083",
+ "http://identifiers.org/rhea/13677",
+ "http://identifiers.org/rhea/13678",
+ "http://identifiers.org/rhea/13679",
+ "http://identifiers.org/rhea/13680"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3386 or b4301",
+ "id": "RPE",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ru5p__D_c": -1.0,
+ "xu5p__D_c": 1.0
+ },
+ "name": "Ribulose 5-phosphate 3-epimerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/RPI",
+ "http://identifiers.org/ec-code/5.3.1.6",
+ "http://identifiers.org/metanetx.reaction/MNXR104084"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2914 or b4090",
+ "id": "RPI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "r5p_c": -1.0,
+ "ru5p__D_c": 1.0
+ },
+ "name": "Ribose-5-phosphate isomerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCCt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121",
+ "http://identifiers.org/metanetx.reaction/MNXR104620",
+ "http://identifiers.org/rhea/29303",
+ "http://identifiers.org/rhea/29304",
+ "http://identifiers.org/rhea/29305",
+ "http://identifiers.org/rhea/29306"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "SUCCt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "succ_c": 1.0,
+ "succ_e": -1.0
+ },
+ "name": "Succinate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCCt3",
+ "http://identifiers.org/metanetx.reaction/MNXR104623"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "SUCCt3",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "succ_c": -1.0,
+ "succ_e": 1.0
+ },
+ "name": "Succinate transport out via proton antiport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCDi",
+ "http://identifiers.org/metanetx.reaction/MNXR99641",
+ "http://identifiers.org/rhea/29187",
+ "http://identifiers.org/rhea/29188",
+ "http://identifiers.org/rhea/29189",
+ "http://identifiers.org/rhea/29190"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0723 and b0721 and b0722 and b0724",
+ "id": "SUCDi",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": 1.0,
+ "q8_c": -1.0,
+ "q8h2_c": 1.0,
+ "succ_c": -1.0
+ },
+ "name": "Succinate dehydrogenase (irreversible)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCOAS",
+ "http://identifiers.org/biocyc/META:SUCCCOASYN-RXN",
+ "http://identifiers.org/ec-code/6.2.1.5",
+ "http://identifiers.org/kegg.reaction/R00405",
+ "http://identifiers.org/metanetx.reaction/MNXR104635",
+ "http://identifiers.org/rhea/17661",
+ "http://identifiers.org/rhea/17662",
+ "http://identifiers.org/rhea/17663",
+ "http://identifiers.org/rhea/17664"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0728 and b0729",
+ "id": "SUCOAS",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "coa_c": -1.0,
+ "pi_c": 1.0,
+ "succ_c": -1.0,
+ "succoa_c": 1.0
+ },
+ "name": "Succinyl-CoA synthetase (ADP-forming)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TALA",
+ "http://identifiers.org/biocyc/META:TRANSALDOL-RXN",
+ "http://identifiers.org/ec-code/2.2.1.2",
+ "http://identifiers.org/kegg.reaction/R01827",
+ "http://identifiers.org/metanetx.reaction/MNXR104715",
+ "http://identifiers.org/rhea/17053",
+ "http://identifiers.org/rhea/17054",
+ "http://identifiers.org/rhea/17055",
+ "http://identifiers.org/rhea/17056"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2464 or b0008",
+ "id": "TALA",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "e4p_c": 1.0,
+ "f6p_c": 1.0,
+ "g3p_c": -1.0,
+ "s7p_c": -1.0
+ },
+ "name": "Transaldolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/THD2",
+ "http://identifiers.org/ec-code/1.6.1.1",
+ "http://identifiers.org/metanetx.reaction/MNXR104805"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1602 and b1603",
+ "id": "THD2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "nad_c": 1.0,
+ "nadh_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "NAD(P) transhydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TKT1",
+ "http://identifiers.org/ec-code/2.2.1.1",
+ "http://identifiers.org/metanetx.reaction/MNXR104868"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2935 or b2465",
+ "id": "TKT1",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "g3p_c": 1.0,
+ "r5p_c": -1.0,
+ "s7p_c": 1.0,
+ "xu5p__D_c": -1.0
+ },
+ "name": "Transketolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TKT2",
+ "http://identifiers.org/biocyc/META:2TRANSKETO-RXN",
+ "http://identifiers.org/ec-code/2.2.1.1",
+ "http://identifiers.org/kegg.reaction/R01830",
+ "http://identifiers.org/metanetx.reaction/MNXR104869",
+ "http://identifiers.org/rhea/27626",
+ "http://identifiers.org/rhea/27627",
+ "http://identifiers.org/rhea/27628",
+ "http://identifiers.org/rhea/27629"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2935 or b2465",
+ "id": "TKT2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "e4p_c": -1.0,
+ "f6p_c": 1.0,
+ "g3p_c": 1.0,
+ "xu5p__D_c": -1.0
+ },
+ "name": "Transketolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TPI",
+ "http://identifiers.org/biocyc/META:TRIOSEPISOMERIZATION-RXN",
+ "http://identifiers.org/ec-code/5.3.1.1",
+ "http://identifiers.org/kegg.reaction/R01015",
+ "http://identifiers.org/metanetx.reaction/MNXR104918",
+ "http://identifiers.org/rhea/18585",
+ "http://identifiers.org/rhea/18586",
+ "http://identifiers.org/rhea/18587",
+ "http://identifiers.org/rhea/18588"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3919",
+ "id": "TPI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "dhap_c": -1.0,
+ "g3p_c": 1.0
+ },
+ "name": "Triose-phosphate isomerase",
+ "upper_bound": 1000.0
+ }
+ ],
+ "version": "1"
+}
\ No newline at end of file
diff --git a/cobra/core/metadata/examples/e_coli_core_writing.xml b/cobra/core/metadata/examples/e_coli_core_writing.xml
new file mode 100644
index 000000000..a8343304b
--- /dev/null
+++ b/cobra/core/metadata/examples/e_coli_core_writing.xml
@@ -0,0 +1,8088 @@
+
+
+
+
+
+ This is a metabolism model of Escherichia coli str. K-12 substr. MG1655 in
+ SBML format.
+ Redistribution and use of any part of this model from BiGG Models knowledge-base, with or without modification, are permitted provided that the following conditions are met:
+ - Redistributions of this SBML file must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in a different form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
This model is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ For specific licensing terms about this particular model and regulations of commercial use, see
+ this model in BiGG Models knowledge-base.
+
+
+
+
+
+
+
+
+
+ Koenig
+ Matthias
+
+ koenigmx@hu-berlin.de
+
+ Humboldt-University Berlin, Institute for Theoretical Biology
+
+
+
+
+
+ 2019-03-06T14:40:55Z
+
+
+ 2019-03-06T14:40:55Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cobra/core/metadata/examples/test_metadata.py b/cobra/core/metadata/examples/test_metadata.py
index 3d9e22793..1be23d6c3 100644
--- a/cobra/core/metadata/examples/test_metadata.py
+++ b/cobra/core/metadata/examples/test_metadata.py
@@ -1,20 +1,106 @@
-
-from cobra.core.species import Species
-
-def test_annotation():
-import cobra
from cobra.core.species import Species
from cobra.core.metadata import *
-s = Species()
-print(s.annotation)
-s.annotation["chebi"] = ["1234", "23423432"]
-s.annotation["sbo"] = "SBO123"
-print(s.annotation)
-
-assert "chebi" in s.annotation
-assert "sbo" in s.annotation
-assert len(s.annotation) == 3
-for key in ["keys", "items", "values"]:
- assert hasattr(s.annotation, key)
-
- # assert 0 == 1
+import pytest
+import json
+from pathlib import Path
+from cobra.io import read_sbml_model, write_sbml_model, load_json_model, save_json_model
+
+def test_annotation_working():
+ # a cobra component
+ s = Species()
+ assert s.annotation == {} # nothing set for annotation, so empty dict
+
+ # setting annotation via old format
+ s.annotation["chebi"] = ["CHEBI:43215", "CHEBI:11881"]
+ assert s.annotation == {"chebi": ["CHEBI:43215", "CHEBI:11881"]}
+ cvt = CVTerms({'bqb_is': [
+ {'resources': ['https://identifiers.org/chebi/CHEBI:43215',
+ 'https://identifiers.org/chebi/CHEBI:11881']
+ }
+ ]
+ })
+ assert str(s.annotation.cvterms) == str(cvt) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}]}"
+
+ # testing sbo term
+ s.annotation["sbo"] = "SBO:0000123"
+ assert s.annotation == {'chebi':
+ ['CHEBI:43215',
+ 'CHEBI:11881'],
+ 'sbo': 'SBO:0000123'
+ }
+
+ assert "chebi" in s.annotation
+ assert "sbo" in s.annotation
+
+ # testing via cvterms
+ with open(Path(__file__).parent / f"cvterms_nested.json", "r") as f_cvterms:
+ cvterms_data = json.load(f_cvterms)
+ s.annotation.add_cvterms(cvterms_data)
+ assert s.annotation == {'chebi':
+ ['CHEBI:43215',
+ 'CHEBI:11881',
+ 'CHEBI:17627'],
+ 'sbo': 'SBO:0000123',
+ 'uniprot':
+ ['P69905',
+ 'P68871',
+ 'P69905'],
+ 'kegg.compound':
+ ['C00032']
+ }
+ assert str(s.annotation.cvterms) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}], 'bqb_hasPart': [{'resources': ['https://identifiers.org/uniprot/P69905', 'https://identifiers.org/uniprot/P68871', 'https://identifiers.org/kegg.compound/C00032']}, {'resources': ['https://identifiers.org/uniprot/P69905', 'https://www.uniprot.org/uniprot/P68871', 'https://identifiers.org/chebi/CHEBI:17627'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/000000']}]}}]}"
+
+
+def test_reading_xml():
+ model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
+ assert model.annotation == {
+ 'taxonomy': ['511145'],
+ 'bigg.model': ['e_coli_core'],
+ 'doi': ['10.1128/ecosalplus.10.2.1'],
+ 'ncbigi': ['gi:16128336']
+ }
+ assert str(model.annotation.cvterms) == "{'bqb_hasTaxon': [{'resources': ['http://identifiers.org/taxonomy/511145']}], 'bqm_is': [{'resources': ['http://identifiers.org/bigg.model/e_coli_core'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/ECO:0000004']}]}}], 'bqm_isDescribedBy': [{'resources': ['http://identifiers.org/doi/10.1128/ecosalplus.10.2.1']}, {'resources': ['http://identifiers.org/ncbigi/gi:16128336']}]}"
+ assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
+
+
+def test_writing_xml():
+ model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
+ assert write_sbml_model(model, "cobra/core/metadata/examples/e_coli_core_writing.xml") is None
+
+
+def test_write_json():
+ model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
+ assert save_json_model(model, "cobra/core/metadata/examples/e_coli_core_json_writing.json", False, True) is None
+
+
+def test_read_new_json_model():
+ model = load_json_model("cobra/core/metadata/examples/e_coli_core_json_writing.json")
+ assert model.annotation == {
+ 'taxonomy': ['511145'],
+ 'bigg.model': ['e_coli_core'],
+ 'doi': ['10.1128/ecosalplus.10.2.1'],
+ 'ncbigi': ['gi:16128336']
+ }
+ assert str(model.annotation.cvterms) == "{'bqb_hasTaxon': [{'resources': ['http://identifiers.org/taxonomy/511145']}], 'bqm_is': [{'resources': ['http://identifiers.org/bigg.model/e_coli_core'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/ECO:0000004']}]}}], 'bqm_isDescribedBy': [{'resources': ['http://identifiers.org/doi/10.1128/ecosalplus.10.2.1']}, {'resources': ['http://identifiers.org/ncbigi/gi:16128336']}]}"
+ assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
+
+
+def test_read_old_json_model():
+ model = load_json_model("cobra/test/data/mini.json")
+ meta = model.metabolites[0]
+ assert meta.annotation == {
+ 'bigg.metabolite': ['13dpg'],
+ 'biocyc': ['DPG'],
+ 'chebi': ['CHEBI:16001',
+ 'CHEBI:1658',
+ 'CHEBI:20189',
+ 'CHEBI:57604',
+ 'CHEBI:11881'],
+ 'hmdb': ['HMDB01270'],
+ 'kegg.compound': ['C00236'],
+ 'pubchem.substance': ['3535'],
+ 'reactome': ['REACT_29800'],
+ 'seed.compound': ['cpd00203'],
+ 'unipathway.compound': ['UPC00236']
+ }
+ assert str(meta.annotation.cvterms) == "{'bqb_is': [{'resources': ['https://identifiers.org/bigg.metabolite/13dpg', 'https://identifiers.org/biocyc/DPG', 'https://identifiers.org/chebi/CHEBI:16001', 'https://identifiers.org/chebi/CHEBI:1658', 'https://identifiers.org/chebi/CHEBI:20189', 'https://identifiers.org/chebi/CHEBI:57604', 'https://identifiers.org/chebi/CHEBI:11881', 'https://identifiers.org/hmdb/HMDB01270', 'https://identifiers.org/kegg.compound/C00236', 'https://identifiers.org/pubchem.substance/3535', 'https://identifiers.org/reactome/REACT_29800', 'https://identifiers.org/seed.compound/cpd00203', 'https://identifiers.org/unipathway.compound/UPC00236']}]}"
diff --git a/cobra/io/dict.py b/cobra/io/dict.py
index f65868d4a..21e5ea43a 100644
--- a/cobra/io/dict.py
+++ b/cobra/io/dict.py
@@ -88,7 +88,7 @@ def _annotation_to_dict(annotation):
if 'sbo' in annotation and annotation['sbo'] != []:
final_dict['sbo'] = annotation['sbo']
-
+
return final_dict
@@ -96,9 +96,14 @@ def _extract_annotation(data):
cvterms = data["cvterms"] if "cvterms" in data else None
history = data["history"] if "history" in data else None
keyValueDict = data["history"] if "keyValueDict" in data else None
- annotation = MetaData(cvterms, history, keyValueDict)
- if "sbo" in data:
- annotation["sbo"] = data["sbo"]
+
+ if cvterms is None and history is None and keyValueDict is None:
+ annotation = MetaData()
+ annotation = data
+ else:
+ annotation = MetaData(cvterms, history, keyValueDict)
+ if "sbo" in data:
+ annotation["sbo"] = data["sbo"]
return annotation
diff --git a/cobra/test/data/e_coli_core_for_annotation.xml b/cobra/test/data/e_coli_core_for_annotation.xml
new file mode 100644
index 000000000..5c06bc011
--- /dev/null
+++ b/cobra/test/data/e_coli_core_for_annotation.xml
@@ -0,0 +1,8328 @@
+
+
+
+
+
+
+
+
+
e_coli_core - Escherichia coli str. K-12 substr. MG1655
+
+
+
+
+
+
+
+
+ Description
+
+
This is a metabolism model of Escherichia coli str. K-12 substr. MG1655 in
+ SBML format.
+
+ The content of this model has been carefully created in a manual research effort. This file has been exported from the software
+
COBRApy and further processed with the
+
JSBML-based
+
ModelPolisher application.
+
+ Terms of use
+ Copyright © 2017 The Regents of the University of California.
+
+
Redistribution and use of any part of this model from BiGG Models knowledge-base, with or without modification, are permitted provided that the following conditions are met:
+
+ - Redistributions of this SBML file must retain the above copyright notice, this list of conditions and the following disclaimer.
+ - Redistributions in a different form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
This model is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
For specific licensing terms about this particular model and regulations of commercial use, see
+ this model in BiGG Models knowledge-base.
+
+ References
When using content from BiGG Models knowledge-base in your research works, please cite
+
+ - King ZA, Lu JS, Dräger A, Miller PC, Federowicz S, Lerman JA, Ebrahim A, Palsson BO, and Lewis NE. (2015).
+
- BiGG Models: A platform for integrating, standardizing, and sharing genome-scale models.
+ Nucl Acids Res.
+ doi:10.1093/nar/gkv1049
+
+
+
+
+
+
+
+
+
+ Koenig
+ Matthias
+
+ koenigmx@hu-berlin.de
+
+ Humboldt-University Berlin, Institute for Theoretical Biology
+
+
+
+
+
+ 2019-03-06T14:40:55Z
+
+
+ 2019-03-06T14:40:55Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From a6e2f8a2320bb05cc13fc0183b1c33e475a6e740 Mon Sep 17 00:00:00 2001
From: Matthias Koenig
Date: Thu, 25 Jun 2020 16:22:02 +0200
Subject: [PATCH 20/76] updated history
---
cobra/core/metadata/cvterm.py | 2 +
cobra/core/metadata/history.py | 93 +-
cobra/core/metadata/metadata.py | 3 +-
cobra/core/metadata/test/__init__.py | 0
.../cvterms_alternative.json | 0
.../{examples => test}/cvterms_nested.json | 0
.../test/e_coli_core_json_writing.json | 8853 +++++++++++++++++
cobra/core/metadata/test/test_history.py | 21 +
.../{examples => test}/test_metadata.py | 78 +-
cobra/io/json.py | 10 +-
10 files changed, 8986 insertions(+), 74 deletions(-)
create mode 100644 cobra/core/metadata/test/__init__.py
rename cobra/core/metadata/{examples => test}/cvterms_alternative.json (100%)
rename cobra/core/metadata/{examples => test}/cvterms_nested.json (100%)
create mode 100644 cobra/core/metadata/test/e_coli_core_json_writing.json
create mode 100644 cobra/core/metadata/test/test_history.py
rename cobra/core/metadata/{examples => test}/test_metadata.py (78%)
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 98c17bc8f..1b219c061 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -95,6 +95,8 @@ class CVTerms(MutableMapping):
],
...
}
+
+ FIXME: proper equality checks
"""
def __init__(self, data: 'dict' = None):
diff --git a/cobra/core/metadata/history.py b/cobra/core/metadata/history.py
index 09d5406f0..cd0b96e75 100644
--- a/cobra/core/metadata/history.py
+++ b/cobra/core/metadata/history.py
@@ -1,32 +1,19 @@
# -*- coding: utf-8 -*-
-from __future__ import absolute_import
-
import datetime
-from collections.abc import MutableMapping, MutableSequence
-
-
-def validateDate(date_text):
- """Validate if the date format is of type w3cdtf ISO 8601"""
- if not isinstance(date_text, str):
- raise TypeError("The date passed must be of type string: {}".format(date_text))
-
- try:
- datetime.datetime.strptime(date_text, '%Y-%m-%dT%H:%M:%S%z')
- except ValueError as e:
- raise ValueError(str(e))
- return True
+from collections.abc import MutableSequence
class History(object):
"""
- Class representation of history of a given component i.e. creator,
- created date and modification dates.
+ Class representation of history of a given component.
+ The history allows to store creator, created date and
+ modification dates.
Parameters
----------
creator : dict
- A dictionary containong details of creator's name, email and
+ A dictionary containing details of creator's name, email and
organisation name
created : string
The date when component is created in W3CDTF ISO 8601 format
@@ -47,15 +34,14 @@ class History(object):
def __init__(self, creators: 'ListOfCreators' = None, created: 'str' = None,
modified: 'ModifiedHistory' = None):
- self._creators = ListOfCreators(creators)
- self._modified = ModifiedHistory(modified)
+ self._creators = list() # FIXME ListOfCreators(creators)
+ self._modified = list(DateTime) # ModifiedHistory(modified)
if created is None:
- self._created = None
+ self._created = None # DateTime
else:
validateDate(created)
self._created = created
-
@staticmethod
def parse_history(data) -> 'History':
if data is None:
@@ -109,7 +95,8 @@ def __repr__(self):
return str({"creators": self.creators, "created": self.created,
"modified": self.modified})
-
+'''
+FIXME: remove, use simple list
class ListOfCreators(MutableSequence):
"""A list extension to store each creator's info
@@ -172,20 +159,14 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._sequence)
-
+'''
class Creator(object):
"""Class representation of a Creator
Parameters
----------
- creator_dict : dict containing info about creator
- {
- "first_name" : "abc",
- "last_name" : "abc",
- "email" : "abc",
- "organization_name" : "abc"
- }
+
Attributes
----------
first_name : str,
@@ -193,32 +174,52 @@ class Creator(object):
email : str,
organization_name : str
"""
+ def __init__(self, first_name: str = None, last_name: str = None,
+ email: str = None, organization_name: str = None):
- def __init__(self, creator_dict=None):
- if creator_dict is None:
- creator_dict = {}
- if not isinstance(creator_dict, dict):
- raise TypeError("The value passed for creator must "
- "be of type dict: {}".format(creator_dict))
- self.first_name = creator_dict["first_name"] if "first_name" in creator_dict else None
- self.last_name = creator_dict["last_name"] if "last_name" in creator_dict else None
- self.email = creator_dict["email"] if "email" in creator_dict else None
- self.organization_name = creator_dict["organization_name"] if "organization_name" in creator_dict else None
+ self.first_name = first_name
+ self.last_name = last_name
+ self.email = email
+ self.organization_name = organization_name
+ @staticmethod
def parse_creator(data) -> 'Creator':
- if data is None or isinstance(data, dict):
- return Creator(data)
+ if data is None:
+ return Creator()
+ elif isinstance(data, dict):
+ return Creator(**data)
elif isinstance(data, Creator):
return data
else:
raise TypeError("Invalid format for Creator: {}".format(data))
def __str__(self):
- return str({"first_name": self.first_name, "last_name": self.last_name, "email": self.email, "organization_name": self.organization_name})
+ return str({
+ "first_name": self.first_name,
+ "last_name": self.last_name,
+ "email": self.email,
+ "organization_name": self.organization_name}
+ )
def __repr__(self):
- return str({"first_name": self.first_name, "last_name": self.last_name, "email": self.email, "organization_name": self.organization_name})
+ return self.__str__()
+
+
+class DateTime(object):
+ @staticmethod
+ def validateDate(date_text):
+ """Validate if the date format is of type w3cdtf ISO 8601"""
+ if not isinstance(date_text, str):
+ raise TypeError("The date passed must be of type string: {}".format(date_text))
+ try:
+ datetime.datetime.strptime(date_text, '%Y-%m-%dT%H:%M:%S%z')
+ except ValueError as e:
+ raise ValueError(str(e))
+ return True
+
+
+# FIXME: remove
class ModifiedHistory(MutableSequence):
"""A list extension to store modification dates. Only Restricted
type of entries are possible.
@@ -267,3 +268,5 @@ def __str__(self):
def __repr__(self):
return '{}'.format(self._sequence)
+
+
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index c5d8a75ff..11262ac28 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -64,7 +64,8 @@ def __getitem__(self, key):
def __setitem__(self, key, value):
if key == "sbo":
- self.cvterms._annotations[key] = value
+ # FIXME: list
+ self.annotations[key] = value
return
else:
self._cvterms.add_simple_annotations({key: value})
diff --git a/cobra/core/metadata/test/__init__.py b/cobra/core/metadata/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/cobra/core/metadata/examples/cvterms_alternative.json b/cobra/core/metadata/test/cvterms_alternative.json
similarity index 100%
rename from cobra/core/metadata/examples/cvterms_alternative.json
rename to cobra/core/metadata/test/cvterms_alternative.json
diff --git a/cobra/core/metadata/examples/cvterms_nested.json b/cobra/core/metadata/test/cvterms_nested.json
similarity index 100%
rename from cobra/core/metadata/examples/cvterms_nested.json
rename to cobra/core/metadata/test/cvterms_nested.json
diff --git a/cobra/core/metadata/test/e_coli_core_json_writing.json b/cobra/core/metadata/test/e_coli_core_json_writing.json
new file mode 100644
index 000000000..5146c3a95
--- /dev/null
+++ b/cobra/core/metadata/test/e_coli_core_json_writing.json
@@ -0,0 +1,8853 @@
+{
+ "annotation": {
+ "cvterms": {
+ "bqb_hasTaxon": [
+ {
+ "resources": [
+ "http://identifiers.org/taxonomy/511145"
+ ]
+ }
+ ],
+ "bqm_is": [
+ {
+ "nested_data": {
+ "bqb_isDescribedBy": [
+ {
+ "resources": [
+ "https://identifiers.org/pubmed/1111111"
+ ]
+ },
+ {
+ "resources": [
+ "https://identifiers.org/eco/ECO:0000004"
+ ]
+ }
+ ]
+ },
+ "resources": [
+ "http://identifiers.org/bigg.model/e_coli_core"
+ ]
+ }
+ ],
+ "bqm_isDescribedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/doi/10.1128/ecosalplus.10.2.1"
+ ]
+ },
+ {
+ "resources": [
+ "http://identifiers.org/ncbigi/gi:16128336"
+ ]
+ }
+ ]
+ },
+ "history": {
+ "created": "2019-03-06T14:40:55Z",
+ "creators": [
+ {
+ "email": "koenigmx@hu-berlin.de",
+ "first_name": "Matthias",
+ "last_name": "Koenig",
+ "organization_name": "Humboldt-University Berlin, Institute for Theoretical Biology"
+ }
+ ],
+ "modified": [
+ "2019-03-06T14:40:55Z"
+ ]
+ }
+ },
+ "compartments": {
+ "c": "cytosol",
+ "e": "extracellular space"
+ },
+ "genes": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77580"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001207",
+ "http://identifiers.org/ecogene/EG13625",
+ "http://identifiers.org/ncbigene/945008",
+ "http://identifiers.org/ncbigi/gi:16128336"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0351",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9Q7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004164",
+ "http://identifiers.org/ecogene/EG10031",
+ "http://identifiers.org/ncbigene/945837",
+ "http://identifiers.org/ncbigi/gi:16129202"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1241",
+ "name": ""
+ },
+ {
+ "id": "s0001",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6A3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007579",
+ "http://identifiers.org/ecogene/EG10027",
+ "http://identifiers.org/ncbigene/946775",
+ "http://identifiers.org/ncbigi/gi:16130231"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2296",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P11868"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010245",
+ "http://identifiers.org/ecogene/EG11172",
+ "http://identifiers.org/ncbigene/947635",
+ "http://identifiers.org/ncbigi/gi:145698313"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3115",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33221"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006162",
+ "http://identifiers.org/ecogene/EG11809",
+ "http://identifiers.org/ncbigene/946368",
+ "http://identifiers.org/ncbigi/gi:16129802"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1849",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P25516"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004283",
+ "http://identifiers.org/ecogene/EG11325",
+ "http://identifiers.org/ncbigene/946724",
+ "http://identifiers.org/ncbigi/gi:16129237"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1276",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P36683"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000411",
+ "http://identifiers.org/ecogene/EG12316",
+ "http://identifiers.org/ncbigene/944864",
+ "http://identifiers.org/ncbigi/gi:16128111"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0118",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69441"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001645",
+ "http://identifiers.org/ecogene/EG10032",
+ "http://identifiers.org/ncbigene/945097",
+ "http://identifiers.org/ncbigi/gi:16128458"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0474",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002478",
+ "http://identifiers.org/ecogene/EG10979",
+ "http://identifiers.org/ncbigene/945303",
+ "http://identifiers.org/ncbigi/gi:16128701"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0726",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9P0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000404",
+ "http://identifiers.org/ecogene/EG10543",
+ "http://identifiers.org/ncbigene/944854",
+ "http://identifiers.org/ncbigi/gi:16128109"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0116",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002480",
+ "http://identifiers.org/ecogene/EG10980",
+ "http://identifiers.org/ncbigene/945307",
+ "http://identifiers.org/ncbigi/gi:16128702"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0727",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEX3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008515",
+ "http://identifiers.org/ecogene/EG10522",
+ "http://identifiers.org/ncbigene/947069",
+ "http://identifiers.org/ncbigi/gi:16130512"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2587",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P25437"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001221",
+ "http://identifiers.org/ecogene/EG50010",
+ "http://identifiers.org/ncbigene/944988",
+ "http://identifiers.org/ncbigi/gi:16128341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0356",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P39451"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004928",
+ "http://identifiers.org/ecogene/EG12622",
+ "http://identifiers.org/ncbigene/946036",
+ "http://identifiers.org/ncbigi/gi:90111280"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1478",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012217",
+ "http://identifiers.org/ecogene/EG10103",
+ "http://identifiers.org/ncbigene/948247",
+ "http://identifiers.org/ncbigi/gi:16131604"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3736",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6E6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012206",
+ "http://identifiers.org/ecogene/EG10100",
+ "http://identifiers.org/ncbigene/948245",
+ "http://identifiers.org/ncbigi/gi:16131599"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3731",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABB4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012208",
+ "http://identifiers.org/ecogene/EG10101",
+ "http://identifiers.org/ncbigene/948244",
+ "http://identifiers.org/ncbigi/gi:16131600"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3732",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P68699"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012220",
+ "http://identifiers.org/ecogene/EG10102",
+ "http://identifiers.org/ncbigene/948253",
+ "http://identifiers.org/ncbigi/gi:16131605"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3737",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABB0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012213",
+ "http://identifiers.org/ecogene/EG10098",
+ "http://identifiers.org/ncbigene/948242",
+ "http://identifiers.org/ncbigi/gi:16131602"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3734",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012215",
+ "http://identifiers.org/ecogene/EG10105",
+ "http://identifiers.org/ncbigene/948254",
+ "http://identifiers.org/ncbigi/gi:16131603"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3735",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB98"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012222",
+ "http://identifiers.org/ecogene/EG10099",
+ "http://identifiers.org/ncbigene/948252",
+ "http://identifiers.org/ncbigi/gi:16131606"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3738",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABC0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012224",
+ "http://identifiers.org/ecogene/EG10106",
+ "http://identifiers.org/ncbigene/948251",
+ "http://identifiers.org/ncbigi/gi:90111645"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3739",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABA6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012211",
+ "http://identifiers.org/ecogene/EG10104",
+ "http://identifiers.org/ncbigene/948243",
+ "http://identifiers.org/ncbigi/gi:16131601"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3733",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABH7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002451",
+ "http://identifiers.org/ecogene/EG10402",
+ "http://identifiers.org/ncbigene/945323",
+ "http://identifiers.org/ncbigi/gi:16128695"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0720",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26458"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003302",
+ "http://identifiers.org/ecogene/EG11379",
+ "http://identifiers.org/ncbigene/947547",
+ "http://identifiers.org/ncbigi/gi:16128945"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0979",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26459"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003300",
+ "http://identifiers.org/ecogene/EG11380",
+ "http://identifiers.org/ncbigene/945585",
+ "http://identifiers.org/ncbigi/gi:16128944"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0978",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABJ9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002499",
+ "http://identifiers.org/ecogene/EG10173",
+ "http://identifiers.org/ncbigene/945341",
+ "http://identifiers.org/ncbigi/gi:90111166"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0733",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0ABK2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002501",
+ "http://identifiers.org/ecogene/EG10174",
+ "http://identifiers.org/ncbigene/945347",
+ "http://identifiers.org/ncbigi/gi:16128709"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0734",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/Q46839"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009763",
+ "http://identifiers.org/ecogene/EG12995",
+ "http://identifiers.org/ncbigene/947259",
+ "http://identifiers.org/ncbigi/gi:16130875"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2975",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33231"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011777",
+ "http://identifiers.org/ecogene/EG11961",
+ "http://identifiers.org/ncbigene/948114",
+ "http://identifiers.org/ncbigi/gi:16131474"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3603",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6P9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009110",
+ "http://identifiers.org/ecogene/EG10258",
+ "http://identifiers.org/ncbigene/945032",
+ "http://identifiers.org/ncbigi/gi:16130686"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2779",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A991"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006941",
+ "http://identifiers.org/ecogene/EG14062",
+ "http://identifiers.org/ncbigene/946632",
+ "http://identifiers.org/ncbigi/gi:90111385"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2097",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77704"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005906",
+ "http://identifiers.org/ecogene/EG13485",
+ "http://identifiers.org/ncbigene/946291",
+ "http://identifiers.org/ncbigi/gi:16129727"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1773",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB71"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009600",
+ "http://identifiers.org/ecogene/EG10282",
+ "http://identifiers.org/ncbigene/947415",
+ "http://identifiers.org/ncbigi/gi:16130826"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2925",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A993"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013842",
+ "http://identifiers.org/ecogene/EG10283",
+ "http://identifiers.org/ncbigene/948753",
+ "http://identifiers.org/ncbigi/gi:16132054"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4232",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9C9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012821",
+ "http://identifiers.org/ecogene/EG11517",
+ "http://identifiers.org/ncbigene/948424",
+ "http://identifiers.org/ncbigi/gi:16131763"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3925",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77733"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008206",
+ "http://identifiers.org/ecogene/EG14220",
+ "http://identifiers.org/ncbigene/949032",
+ "http://identifiers.org/ncbigi/gi:16130417"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2492",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC23"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003073",
+ "http://identifiers.org/ecogene/EG11258",
+ "http://identifiers.org/ncbigene/945513",
+ "http://identifiers.org/ncbigi/gi:16128871"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0904",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A8Q3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013595",
+ "http://identifiers.org/ecogene/EG10333",
+ "http://identifiers.org/ncbigene/948668",
+ "http://identifiers.org/ncbigi/gi:16131976"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4151",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A8Q0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013598",
+ "http://identifiers.org/ecogene/EG10332",
+ "http://identifiers.org/ncbigene/948680",
+ "http://identifiers.org/ncbigi/gi:16131977"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4152",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00363"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013604",
+ "http://identifiers.org/ecogene/EG10330",
+ "http://identifiers.org/ncbigene/948667",
+ "http://identifiers.org/ncbigi/gi:16131979"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4154",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC47"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013602",
+ "http://identifiers.org/ecogene/EG10331",
+ "http://identifiers.org/ncbigene/948666",
+ "http://identifiers.org/ncbigi/gi:16131978"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4153",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08839"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007967",
+ "http://identifiers.org/ecogene/EG10789",
+ "http://identifiers.org/ncbigene/946879",
+ "http://identifiers.org/ncbigi/gi:16130342"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2416",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AA04"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007962",
+ "http://identifiers.org/ecogene/EG10788",
+ "http://identifiers.org/ncbigene/946886",
+ "http://identifiers.org/ncbigi/gi:16130341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2415",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69797"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006054",
+ "http://identifiers.org/ecogene/EG10567",
+ "http://identifiers.org/ncbigene/946334",
+ "http://identifiers.org/ncbigi/gi:16129771"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1817",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69801"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006056",
+ "http://identifiers.org/ecogene/EG10568",
+ "http://identifiers.org/ncbigene/946332",
+ "http://identifiers.org/ncbigi/gi:16129772"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1818",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69805"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006058",
+ "http://identifiers.org/ecogene/EG10569",
+ "http://identifiers.org/ncbigene/946342",
+ "http://identifiers.org/ncbigi/gi:345452720"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1819",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P05042"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005380",
+ "http://identifiers.org/ecogene/EG10358",
+ "http://identifiers.org/ncbigene/946147",
+ "http://identifiers.org/ncbigi/gi:16129569"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1611",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P14407"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013501",
+ "http://identifiers.org/ecogene/EG10357",
+ "http://identifiers.org/ncbigene/948642",
+ "http://identifiers.org/ncbigi/gi:16131948"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4122",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC33"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005392",
+ "http://identifiers.org/ecogene/EG10356",
+ "http://identifiers.org/ncbigene/946826",
+ "http://identifiers.org/ncbigi/gi:16129570"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1612",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A830"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011527",
+ "http://identifiers.org/ecogene/EG20044",
+ "http://identifiers.org/ncbigene/948039",
+ "http://identifiers.org/ncbigi/gi:16131400"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3528",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC53"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006171",
+ "http://identifiers.org/ecogene/EG11221",
+ "http://identifiers.org/ncbigene/946370",
+ "http://identifiers.org/ncbigi/gi:16129805"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1852",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9B2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005920",
+ "http://identifiers.org/ecogene/EG10367",
+ "http://identifiers.org/ncbigene/947679",
+ "http://identifiers.org/ncbigi/gi:16129733"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1779",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69786"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003722",
+ "http://identifiers.org/ecogene/EG10787",
+ "http://identifiers.org/ncbigene/945651",
+ "http://identifiers.org/ncbigi/gi:16129064"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1101",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69783"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007971",
+ "http://identifiers.org/ecogene/EG10165",
+ "http://identifiers.org/ncbigene/946880",
+ "http://identifiers.org/ncbigi/gi:16130343"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2417",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P19642"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005429",
+ "http://identifiers.org/ecogene/EG10563",
+ "http://identifiers.org/ncbigene/946009",
+ "http://identifiers.org/ncbigi/gi:16129579"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1621",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P78061"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004365",
+ "http://identifiers.org/ecogene/EG13908",
+ "http://identifiers.org/ncbigene/946202",
+ "http://identifiers.org/ncbigi/gi:90111244"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1297",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9C5"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012640",
+ "http://identifiers.org/ecogene/EG10383",
+ "http://identifiers.org/ncbigene/948370",
+ "http://identifiers.org/ncbigi/gi:16131710"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3870",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEQ3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002771",
+ "http://identifiers.org/ecogene/EG10386",
+ "http://identifiers.org/ncbigene/944872",
+ "http://identifiers.org/ncbigi/gi:16128779"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0811",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AEQ6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002766",
+ "http://identifiers.org/ecogene/EG10388",
+ "http://identifiers.org/ncbigene/945621",
+ "http://identifiers.org/ncbigi/gi:16128778"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0810",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P10346"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002764",
+ "http://identifiers.org/ecogene/EG10389",
+ "http://identifiers.org/ncbigene/945435",
+ "http://identifiers.org/ncbigi/gi:16128777"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0809",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00370"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005865",
+ "http://identifiers.org/ecogene/EG10372",
+ "http://identifiers.org/ncbigene/946802",
+ "http://identifiers.org/ncbigi/gi:16129715"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1761",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77454"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001688",
+ "http://identifiers.org/ecogene/EG13247",
+ "http://identifiers.org/ncbigene/946187",
+ "http://identifiers.org/ncbigi/gi:16128469"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0485",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6W0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005086",
+ "http://identifiers.org/ecogene/EG13816",
+ "http://identifiers.org/ncbigene/944973",
+ "http://identifiers.org/ncbigi/gi:16129483"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1524",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P05041"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006031",
+ "http://identifiers.org/ecogene/EG10683",
+ "http://identifiers.org/ncbigene/946337",
+ "http://identifiers.org/ncbigi/gi:16129766"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1812",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09831"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010545",
+ "http://identifiers.org/ecogene/EG10403",
+ "http://identifiers.org/ncbigene/947724",
+ "http://identifiers.org/ncbigi/gi:308209621"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3212",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09832"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010547",
+ "http://identifiers.org/ecogene/EG10404",
+ "http://identifiers.org/ncbigene/947723",
+ "http://identifiers.org/ncbigi/gi:16131103"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3213",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P21345"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013357",
+ "http://identifiers.org/ecogene/EG10405",
+ "http://identifiers.org/ncbigene/948591",
+ "http://identifiers.org/ncbigi/gi:16131903"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4077",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00350"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006737",
+ "http://identifiers.org/ecogene/EG10411",
+ "http://identifiers.org/ncbigene/946554",
+ "http://identifiers.org/ncbigi/gi:16129970"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2029",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P60844"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002976",
+ "http://identifiers.org/ecogene/EG13270",
+ "http://identifiers.org/ncbigene/945497",
+ "http://identifiers.org/ncbigi/gi:16128843"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0875",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08200"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003823",
+ "http://identifiers.org/ecogene/EG10489",
+ "http://identifiers.org/ncbigene/945702",
+ "http://identifiers.org/ncbigi/gi:16129099"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1136",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9G6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013128",
+ "http://identifiers.org/ecogene/EG10022",
+ "http://identifiers.org/ncbigene/948517",
+ "http://identifiers.org/ncbigi/gi:16131841"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4015",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06149"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007048",
+ "http://identifiers.org/ecogene/EG10231",
+ "http://identifiers.org/ncbigene/946653",
+ "http://identifiers.org/ncbigi/gi:16130071"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2133",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P52643"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004619",
+ "http://identifiers.org/ecogene/EG13186",
+ "http://identifiers.org/ncbigene/946315",
+ "http://identifiers.org/ncbigi/gi:16129341"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1380",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37330"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009767",
+ "http://identifiers.org/ecogene/EG20080",
+ "http://identifiers.org/ncbigene/948857",
+ "http://identifiers.org/ncbigi/gi:16130876"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2976",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P08997"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013125",
+ "http://identifiers.org/ecogene/EG10023",
+ "http://identifiers.org/ncbigene/948512",
+ "http://identifiers.org/ncbigi/gi:16131840"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4014",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P61889"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010613",
+ "http://identifiers.org/ecogene/EG10576",
+ "http://identifiers.org/ncbigene/947854",
+ "http://identifiers.org/ncbigi/gi:16131126"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3236",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P26616"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0004931",
+ "http://identifiers.org/ecogene/EG10948",
+ "http://identifiers.org/ncbigene/946031",
+ "http://identifiers.org/ncbigi/gi:90111281"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1479",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P76558"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008111",
+ "http://identifiers.org/ecogene/EG14193",
+ "http://identifiers.org/ncbigene/946947",
+ "http://identifiers.org/ncbigi/gi:16130388"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2463",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFF0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007526",
+ "http://identifiers.org/ecogene/EG12093",
+ "http://identifiers.org/ncbigene/945136",
+ "http://identifiers.org/ncbigi/gi:145698289"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2276",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007534",
+ "http://identifiers.org/ecogene/EG12091",
+ "http://identifiers.org/ncbigene/947580",
+ "http://identifiers.org/ncbigi/gi:16130214"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2279",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFC3"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007553",
+ "http://identifiers.org/ecogene/EG12082",
+ "http://identifiers.org/ncbigene/946764",
+ "http://identifiers.org/ncbigi/gi:49176207"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2288",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33607"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007532",
+ "http://identifiers.org/ecogene/EG12092",
+ "http://identifiers.org/ncbigene/945540",
+ "http://identifiers.org/ncbigi/gi:16130213"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2278",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33599"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007549",
+ "http://identifiers.org/ecogene/EG12084",
+ "http://identifiers.org/ncbigene/946759",
+ "http://identifiers.org/ncbigi/gi:145698291"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2286",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD1"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007547",
+ "http://identifiers.org/ecogene/EG12086",
+ "http://identifiers.org/ncbigene/946746",
+ "http://identifiers.org/ncbigi/gi:16130220"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2285",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33602"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007543",
+ "http://identifiers.org/ecogene/EG12087",
+ "http://identifiers.org/ncbigene/946762",
+ "http://identifiers.org/ncbigi/gi:145698290"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2283",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFC7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007551",
+ "http://identifiers.org/ecogene/EG12083",
+ "http://identifiers.org/ncbigene/946738",
+ "http://identifiers.org/ncbigi/gi:16130222"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2287",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P31979"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007545",
+ "http://identifiers.org/ecogene/EG11774",
+ "http://identifiers.org/ncbigene/946753",
+ "http://identifiers.org/ncbigi/gi:16130219"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2284",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD6"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007539",
+ "http://identifiers.org/ecogene/EG12089",
+ "http://identifiers.org/ncbigene/946757",
+ "http://identifiers.org/ncbigi/gi:16130216"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2281",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007529",
+ "http://identifiers.org/ecogene/EG11773",
+ "http://identifiers.org/ncbigene/947731",
+ "http://identifiers.org/ncbigi/gi:16130212"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2277",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFD4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007541",
+ "http://identifiers.org/ecogene/EG12088",
+ "http://identifiers.org/ncbigene/946761",
+ "http://identifiers.org/ncbigi/gi:16130217"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2282",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFE0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007536",
+ "http://identifiers.org/ecogene/EG12090",
+ "http://identifiers.org/ncbigene/946756",
+ "http://identifiers.org/ncbigi/gi:16130215"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2280",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P07001"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005354",
+ "http://identifiers.org/ecogene/EG10744",
+ "http://identifiers.org/ncbigene/946628",
+ "http://identifiers.org/ncbigi/gi:16129561"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1603",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AB67"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005352",
+ "http://identifiers.org/ecogene/EG10745",
+ "http://identifiers.org/ncbigene/946144",
+ "http://identifiers.org/ncbigi/gi:16129560"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1602",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P27306"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012975",
+ "http://identifiers.org/ecogene/EG11428",
+ "http://identifiers.org/ncbigene/948461",
+ "http://identifiers.org/ncbigi/gi:90111670"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3962",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69681"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0001564",
+ "http://identifiers.org/ecogene/EG11821",
+ "http://identifiers.org/ncbigene/945084",
+ "http://identifiers.org/ncbigi/gi:16128436"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0451",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFG8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000397",
+ "http://identifiers.org/ecogene/EG10024",
+ "http://identifiers.org/ncbigene/944834",
+ "http://identifiers.org/ncbigi/gi:16128107"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0114",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06959"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000400",
+ "http://identifiers.org/ecogene/EG10025",
+ "http://identifiers.org/ncbigene/944794",
+ "http://identifiers.org/ncbigi/gi:16128108"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0115",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P06999"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005748",
+ "http://identifiers.org/ecogene/EG10700",
+ "http://identifiers.org/ncbigene/946230",
+ "http://identifiers.org/ncbigi/gi:49176138"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1723",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A796"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012789",
+ "http://identifiers.org/ecogene/EG10699",
+ "http://identifiers.org/ncbigene/948412",
+ "http://identifiers.org/ncbigi/gi:16131754"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3916",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P42632"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0010242",
+ "http://identifiers.org/ecogene/EG12758",
+ "http://identifiers.org/ncbigene/947623",
+ "http://identifiers.org/ncbigi/gi:49176316"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3114",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P32675"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012937",
+ "http://identifiers.org/ecogene/EG11911",
+ "http://identifiers.org/ncbigene/948453",
+ "http://identifiers.org/ncbigi/gi:49176447"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3952",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P32674"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012934",
+ "http://identifiers.org/ecogene/EG11910",
+ "http://identifiers.org/ncbigene/948454",
+ "http://identifiers.org/ncbigi/gi:16131789"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3951",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9N4"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003068",
+ "http://identifiers.org/ecogene/EG10028",
+ "http://identifiers.org/ncbigene/945517",
+ "http://identifiers.org/ncbigi/gi:16128869"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0902",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P09373"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0003071",
+ "http://identifiers.org/ecogene/EG10701",
+ "http://identifiers.org/ncbigene/945514",
+ "http://identifiers.org/ncbigi/gi:16128870"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0903",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P68066"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008489",
+ "http://identifiers.org/ecogene/EG11784",
+ "http://identifiers.org/ncbigene/947068",
+ "http://identifiers.org/ncbigi/gi:16130504"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2579",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A6T1"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013163",
+ "http://identifiers.org/ecogene/EG10702",
+ "http://identifiers.org/ncbigene/948535",
+ "http://identifiers.org/ncbigi/gi:16131851"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4025",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A799"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009605",
+ "http://identifiers.org/ecogene/EG10703",
+ "http://identifiers.org/ncbigene/947414",
+ "http://identifiers.org/ncbigi/gi:16130827"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2926",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P52697"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002611",
+ "http://identifiers.org/ecogene/EG13231",
+ "http://identifiers.org/ncbigene/946398",
+ "http://identifiers.org/ncbigi/gi:16128735"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0767",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P62707"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002563",
+ "http://identifiers.org/ecogene/EG11699",
+ "http://identifiers.org/ncbigene/945068",
+ "http://identifiers.org/ncbigi/gi:16128723"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0755",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A7A2"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0014416",
+ "http://identifiers.org/ecogene/EG12164",
+ "http://identifiers.org/ncbigene/948918",
+ "http://identifiers.org/ncbigi/gi:16132212"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4395",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37689"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011818",
+ "http://identifiers.org/ecogene/EG12296",
+ "http://identifiers.org/ncbigene/948130",
+ "http://identifiers.org/ncbigi/gi:16131483"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3612",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P43676"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009800",
+ "http://identifiers.org/ecogene/EG12883",
+ "http://identifiers.org/ncbigene/947475",
+ "http://identifiers.org/ncbigi/gi:16130887"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2987",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AFJ7"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011407",
+ "http://identifiers.org/ecogene/EG12230",
+ "http://identifiers.org/ncbigene/948009",
+ "http://identifiers.org/ncbigi/gi:16131365"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3493",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P00864"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012950",
+ "http://identifiers.org/ecogene/EG10756",
+ "http://identifiers.org/ncbigene/948457",
+ "http://identifiers.org/ncbigi/gi:16131794"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3956",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P22259"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011106",
+ "http://identifiers.org/ecogene/EG10688",
+ "http://identifiers.org/ncbigene/945667",
+ "http://identifiers.org/ncbigi/gi:16131280"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3403",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P23538"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005678",
+ "http://identifiers.org/ecogene/EG10759",
+ "http://identifiers.org/ncbigene/946209",
+ "http://identifiers.org/ncbigi/gi:16129658"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1702",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A9M8"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0007582",
+ "http://identifiers.org/ecogene/EG20173",
+ "http://identifiers.org/ncbigene/946778",
+ "http://identifiers.org/ncbigi/gi:16130232"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2297",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P77218"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008097",
+ "http://identifiers.org/ecogene/EG14188",
+ "http://identifiers.org/ncbigene/946940",
+ "http://identifiers.org/ncbigi/gi:16130383"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2458",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AD61"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0005600",
+ "http://identifiers.org/ecogene/EG10804",
+ "http://identifiers.org/ncbigene/946179",
+ "http://identifiers.org/ncbigi/gi:16129632"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1676",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P21599"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0006182",
+ "http://identifiers.org/ecogene/EG10803",
+ "http://identifiers.org/ncbigene/946527",
+ "http://identifiers.org/ncbigi/gi:16129807"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b1854",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P39362"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0014097",
+ "http://identifiers.org/ecogene/EG12553",
+ "http://identifiers.org/ncbigene/948829",
+ "http://identifiers.org/ncbigi/gi:16132122"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4301",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AG07"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0011061",
+ "http://identifiers.org/ecogene/EG11960",
+ "http://identifiers.org/ncbigene/947896",
+ "http://identifiers.org/ncbigi/gi:16131264"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3386",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A7Z0"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009567",
+ "http://identifiers.org/ecogene/EG11443",
+ "http://identifiers.org/ncbigene/947407",
+ "http://identifiers.org/ncbigi/gi:16130815"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2914",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P37351"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0013405",
+ "http://identifiers.org/ecogene/EG11827",
+ "http://identifiers.org/ncbigene/948602",
+ "http://identifiers.org/ncbigi/gi:16131916"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b4090",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC41"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002466",
+ "http://identifiers.org/ecogene/EG10931",
+ "http://identifiers.org/ncbigene/945402",
+ "http://identifiers.org/ncbigi/gi:16128698"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0723",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P07014"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002468",
+ "http://identifiers.org/ecogene/EG10932",
+ "http://identifiers.org/ncbigene/945300",
+ "http://identifiers.org/ncbigi/gi:16128699"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0724",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AC44"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002464",
+ "http://identifiers.org/ecogene/EG10934",
+ "http://identifiers.org/ncbigene/945322",
+ "http://identifiers.org/ncbigi/gi:16128697"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0722",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P69054"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002460",
+ "http://identifiers.org/ecogene/EG10933",
+ "http://identifiers.org/ncbigene/945316",
+ "http://identifiers.org/ncbigi/gi:16128696"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0721",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0AGE9"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002485",
+ "http://identifiers.org/ecogene/EG10982",
+ "http://identifiers.org/ncbigene/945314",
+ "http://identifiers.org/ncbigi/gi:16128704"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0729",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A836"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0002483",
+ "http://identifiers.org/ecogene/EG10981",
+ "http://identifiers.org/ncbigene/945312",
+ "http://identifiers.org/ncbigi/gi:16128703"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0728",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A870"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0000027",
+ "http://identifiers.org/ecogene/EG11556",
+ "http://identifiers.org/ncbigene/944748",
+ "http://identifiers.org/ncbigi/gi:16128002"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b0008",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A867"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008115",
+ "http://identifiers.org/ecogene/EG11797",
+ "http://identifiers.org/ncbigene/947006",
+ "http://identifiers.org/ncbigi/gi:16130389"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2464",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P27302"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0009625",
+ "http://identifiers.org/ecogene/EG11427",
+ "http://identifiers.org/ncbigene/947420",
+ "http://identifiers.org/ncbigi/gi:49176286"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2935",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P33570"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0008117",
+ "http://identifiers.org/ecogene/EG12100",
+ "http://identifiers.org/ncbigene/945865",
+ "http://identifiers.org/ncbigi/gi:16130390"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b2465",
+ "name": ""
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/uniprot/P0A858"
+ ]
+ }
+ ],
+ "bqb_isEncodedBy": [
+ {
+ "resources": [
+ "http://identifiers.org/asap/ABE-0012799",
+ "http://identifiers.org/ecogene/EG11015",
+ "http://identifiers.org/ncbigene/948409",
+ "http://identifiers.org/ncbigi/gi:16131757"
+ ]
+ }
+ ]
+ }
+ },
+ "id": "b3919",
+ "name": ""
+ }
+ ],
+ "id": "e_coli_core",
+ "metabolites": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/13dpg",
+ "http://identifiers.org/biocyc/META:DPG",
+ "http://identifiers.org/chebi/CHEBI:11881",
+ "http://identifiers.org/chebi/CHEBI:16001",
+ "http://identifiers.org/chebi/CHEBI:1658",
+ "http://identifiers.org/chebi/CHEBI:20189",
+ "http://identifiers.org/chebi/CHEBI:57604",
+ "http://identifiers.org/hmdb/HMDB62758",
+ "http://identifiers.org/kegg.compound/C00236",
+ "http://identifiers.org/metanetx.chemical/MNXM261",
+ "http://identifiers.org/seed.compound/cpd00203"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O10P2",
+ "id": "13dpg_c",
+ "name": "3-Phospho-D-glyceroyl phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/2pg",
+ "http://identifiers.org/biocyc/META:2-PG",
+ "http://identifiers.org/chebi/CHEBI:11651",
+ "http://identifiers.org/chebi/CHEBI:1267",
+ "http://identifiers.org/chebi/CHEBI:12986",
+ "http://identifiers.org/chebi/CHEBI:17835",
+ "http://identifiers.org/chebi/CHEBI:21028",
+ "http://identifiers.org/chebi/CHEBI:24344",
+ "http://identifiers.org/chebi/CHEBI:39868",
+ "http://identifiers.org/chebi/CHEBI:58289",
+ "http://identifiers.org/chebi/CHEBI:88350",
+ "http://identifiers.org/hmdb/HMDB03391",
+ "http://identifiers.org/hmdb/HMDB62707",
+ "http://identifiers.org/kegg.compound/C00631",
+ "http://identifiers.org/metanetx.chemical/MNXM275",
+ "http://identifiers.org/seed.compound/cpd00482"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O7P",
+ "id": "2pg_c",
+ "name": "D-Glycerate 2-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/3pg",
+ "http://identifiers.org/biocyc/META:G3P",
+ "http://identifiers.org/chebi/CHEBI:11879",
+ "http://identifiers.org/chebi/CHEBI:11880",
+ "http://identifiers.org/chebi/CHEBI:12987",
+ "http://identifiers.org/chebi/CHEBI:1657",
+ "http://identifiers.org/chebi/CHEBI:17794",
+ "http://identifiers.org/chebi/CHEBI:21029",
+ "http://identifiers.org/chebi/CHEBI:58272",
+ "http://identifiers.org/kegg.compound/C00197",
+ "http://identifiers.org/metanetx.chemical/MNXM126",
+ "http://identifiers.org/seed.compound/cpd00169"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H4O7P",
+ "id": "3pg_c",
+ "name": "3-Phospho-D-glycerate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/6pgc",
+ "http://identifiers.org/biocyc/META:CPD-2961",
+ "http://identifiers.org/chebi/CHEBI:12232",
+ "http://identifiers.org/chebi/CHEBI:16863",
+ "http://identifiers.org/chebi/CHEBI:2231",
+ "http://identifiers.org/chebi/CHEBI:33851",
+ "http://identifiers.org/chebi/CHEBI:40282",
+ "http://identifiers.org/chebi/CHEBI:48928",
+ "http://identifiers.org/chebi/CHEBI:58759",
+ "http://identifiers.org/hmdb/HMDB01316",
+ "http://identifiers.org/hmdb/HMDB62800",
+ "http://identifiers.org/kegg.compound/C00345",
+ "http://identifiers.org/metanetx.chemical/MNXM325",
+ "http://identifiers.org/seed.compound/cpd00284"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H10O10P",
+ "id": "6pgc_c",
+ "name": "6-Phospho-D-gluconate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/6pgl",
+ "http://identifiers.org/biocyc/META:D-6-P-GLUCONO-DELTA-LACTONE",
+ "http://identifiers.org/chebi/CHEBI:12233",
+ "http://identifiers.org/chebi/CHEBI:12958",
+ "http://identifiers.org/chebi/CHEBI:16938",
+ "http://identifiers.org/chebi/CHEBI:20989",
+ "http://identifiers.org/chebi/CHEBI:4160",
+ "http://identifiers.org/chebi/CHEBI:57955",
+ "http://identifiers.org/hmdb/HMDB62628",
+ "http://identifiers.org/kegg.compound/C01236",
+ "http://identifiers.org/metanetx.chemical/MNXM429",
+ "http://identifiers.org/seed.compound/cpd00911"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H9O9P",
+ "id": "6pgl_c",
+ "name": "6-phospho-D-glucono-1,5-lactone"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ac",
+ "http://identifiers.org/biocyc/META:ACET",
+ "http://identifiers.org/chebi/CHEBI:13704",
+ "http://identifiers.org/chebi/CHEBI:15366",
+ "http://identifiers.org/chebi/CHEBI:22165",
+ "http://identifiers.org/chebi/CHEBI:22169",
+ "http://identifiers.org/chebi/CHEBI:2387",
+ "http://identifiers.org/chebi/CHEBI:30089",
+ "http://identifiers.org/chebi/CHEBI:40480",
+ "http://identifiers.org/chebi/CHEBI:40486",
+ "http://identifiers.org/hmdb/HMDB00042",
+ "http://identifiers.org/kegg.compound/C00033",
+ "http://identifiers.org/kegg.drug/D00010",
+ "http://identifiers.org/lipidmaps/LMFA01010002",
+ "http://identifiers.org/metanetx.chemical/MNXM26",
+ "http://identifiers.org/seed.compound/cpd00029"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H3O2",
+ "id": "ac_c",
+ "name": "Acetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ac",
+ "http://identifiers.org/biocyc/META:ACET",
+ "http://identifiers.org/chebi/CHEBI:13704",
+ "http://identifiers.org/chebi/CHEBI:15366",
+ "http://identifiers.org/chebi/CHEBI:22165",
+ "http://identifiers.org/chebi/CHEBI:22169",
+ "http://identifiers.org/chebi/CHEBI:2387",
+ "http://identifiers.org/chebi/CHEBI:30089",
+ "http://identifiers.org/chebi/CHEBI:40480",
+ "http://identifiers.org/chebi/CHEBI:40486",
+ "http://identifiers.org/hmdb/HMDB00042",
+ "http://identifiers.org/kegg.compound/C00033",
+ "http://identifiers.org/kegg.drug/D00010",
+ "http://identifiers.org/lipidmaps/LMFA01010002",
+ "http://identifiers.org/metanetx.chemical/MNXM26",
+ "http://identifiers.org/seed.compound/cpd00029"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H3O2",
+ "id": "ac_e",
+ "name": "Acetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acald",
+ "http://identifiers.org/biocyc/META:ACETALD",
+ "http://identifiers.org/chebi/CHEBI:13703",
+ "http://identifiers.org/chebi/CHEBI:15343",
+ "http://identifiers.org/chebi/CHEBI:22158",
+ "http://identifiers.org/chebi/CHEBI:2383",
+ "http://identifiers.org/chebi/CHEBI:40533",
+ "http://identifiers.org/hmdb/HMDB00990",
+ "http://identifiers.org/kegg.compound/C00084",
+ "http://identifiers.org/metanetx.chemical/MNXM75",
+ "http://identifiers.org/seed.compound/cpd00071"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H4O",
+ "id": "acald_c",
+ "name": "Acetaldehyde"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acald",
+ "http://identifiers.org/biocyc/META:ACETALD",
+ "http://identifiers.org/chebi/CHEBI:13703",
+ "http://identifiers.org/chebi/CHEBI:15343",
+ "http://identifiers.org/chebi/CHEBI:22158",
+ "http://identifiers.org/chebi/CHEBI:2383",
+ "http://identifiers.org/chebi/CHEBI:40533",
+ "http://identifiers.org/hmdb/HMDB00990",
+ "http://identifiers.org/kegg.compound/C00084",
+ "http://identifiers.org/metanetx.chemical/MNXM75",
+ "http://identifiers.org/seed.compound/cpd00071"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H4O",
+ "id": "acald_e",
+ "name": "Acetaldehyde"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/accoa",
+ "http://identifiers.org/biocyc/META:ACETYL-COA",
+ "http://identifiers.org/chebi/CHEBI:13712",
+ "http://identifiers.org/chebi/CHEBI:15351",
+ "http://identifiers.org/chebi/CHEBI:22192",
+ "http://identifiers.org/chebi/CHEBI:2408",
+ "http://identifiers.org/chebi/CHEBI:40470",
+ "http://identifiers.org/chebi/CHEBI:57288",
+ "http://identifiers.org/hmdb/HMDB01206",
+ "http://identifiers.org/kegg.compound/C00024",
+ "http://identifiers.org/lipidmaps/LMFA07050029",
+ "http://identifiers.org/lipidmaps/LMFA07050281",
+ "http://identifiers.org/metanetx.chemical/MNXM21",
+ "http://identifiers.org/seed.compound/cpd00022"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C23H34N7O17P3S",
+ "id": "accoa_c",
+ "name": "Acetyl-CoA"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/acon_C",
+ "http://identifiers.org/biocyc/META:CIS-ACONITATE",
+ "http://identifiers.org/chebi/CHEBI:10482",
+ "http://identifiers.org/chebi/CHEBI:12798",
+ "http://identifiers.org/chebi/CHEBI:16383",
+ "http://identifiers.org/chebi/CHEBI:23306",
+ "http://identifiers.org/chebi/CHEBI:23308",
+ "http://identifiers.org/chebi/CHEBI:32805",
+ "http://identifiers.org/hmdb/HMDB00072",
+ "http://identifiers.org/hmdb/HMDB00461",
+ "http://identifiers.org/kegg.compound/C00417",
+ "http://identifiers.org/metanetx.chemical/MNXM813",
+ "http://identifiers.org/seed.compound/cpd00331"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H3O6",
+ "id": "acon_C_c",
+ "name": "Cis-Aconitate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/actp",
+ "http://identifiers.org/biocyc/META:ACETYL-P",
+ "http://identifiers.org/chebi/CHEBI:13711",
+ "http://identifiers.org/chebi/CHEBI:15350",
+ "http://identifiers.org/chebi/CHEBI:22191",
+ "http://identifiers.org/chebi/CHEBI:2407",
+ "http://identifiers.org/chebi/CHEBI:46262",
+ "http://identifiers.org/hmdb/HMDB01494",
+ "http://identifiers.org/kegg.compound/C00227",
+ "http://identifiers.org/metanetx.chemical/MNXM280",
+ "http://identifiers.org/seed.compound/cpd00196"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H3O5P",
+ "id": "actp_c",
+ "name": "Acetyl phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/adp",
+ "http://identifiers.org/biocyc/META:ADP",
+ "http://identifiers.org/biocyc/META:CPD0-1651",
+ "http://identifiers.org/chebi/CHEBI:13222",
+ "http://identifiers.org/chebi/CHEBI:16761",
+ "http://identifiers.org/chebi/CHEBI:22244",
+ "http://identifiers.org/chebi/CHEBI:2342",
+ "http://identifiers.org/chebi/CHEBI:40553",
+ "http://identifiers.org/chebi/CHEBI:456216",
+ "http://identifiers.org/chebi/CHEBI:87518",
+ "http://identifiers.org/hmdb/HMDB01341",
+ "http://identifiers.org/kegg.compound/C00008",
+ "http://identifiers.org/kegg.glycan/G11113",
+ "http://identifiers.org/metanetx.chemical/MNXM7",
+ "http://identifiers.org/seed.compound/cpd00008"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O10P2",
+ "id": "adp_c",
+ "name": "ADP C10H12N5O10P2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/akg",
+ "http://identifiers.org/biocyc/META:2-KETOGLUTARATE",
+ "http://identifiers.org/biocyc/META:CPD-16852",
+ "http://identifiers.org/chebi/CHEBI:11638",
+ "http://identifiers.org/chebi/CHEBI:1253",
+ "http://identifiers.org/chebi/CHEBI:16810",
+ "http://identifiers.org/chebi/CHEBI:19748",
+ "http://identifiers.org/chebi/CHEBI:19749",
+ "http://identifiers.org/chebi/CHEBI:30915",
+ "http://identifiers.org/chebi/CHEBI:30916",
+ "http://identifiers.org/chebi/CHEBI:40661",
+ "http://identifiers.org/hmdb/HMDB62781",
+ "http://identifiers.org/kegg.compound/C00026",
+ "http://identifiers.org/metanetx.chemical/MNXM20",
+ "http://identifiers.org/seed.compound/cpd00024"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H4O5",
+ "id": "akg_c",
+ "name": "2-Oxoglutarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/akg",
+ "http://identifiers.org/biocyc/META:2-KETOGLUTARATE",
+ "http://identifiers.org/biocyc/META:CPD-16852",
+ "http://identifiers.org/chebi/CHEBI:11638",
+ "http://identifiers.org/chebi/CHEBI:1253",
+ "http://identifiers.org/chebi/CHEBI:16810",
+ "http://identifiers.org/chebi/CHEBI:19748",
+ "http://identifiers.org/chebi/CHEBI:19749",
+ "http://identifiers.org/chebi/CHEBI:30915",
+ "http://identifiers.org/chebi/CHEBI:30916",
+ "http://identifiers.org/chebi/CHEBI:40661",
+ "http://identifiers.org/hmdb/HMDB62781",
+ "http://identifiers.org/kegg.compound/C00026",
+ "http://identifiers.org/metanetx.chemical/MNXM20",
+ "http://identifiers.org/seed.compound/cpd00024"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H4O5",
+ "id": "akg_e",
+ "name": "2-Oxoglutarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/amp",
+ "http://identifiers.org/biocyc/META:AMP",
+ "http://identifiers.org/biocyc/META:AMP-GROUP",
+ "http://identifiers.org/chebi/CHEBI:12056",
+ "http://identifiers.org/chebi/CHEBI:13234",
+ "http://identifiers.org/chebi/CHEBI:13235",
+ "http://identifiers.org/chebi/CHEBI:13736",
+ "http://identifiers.org/chebi/CHEBI:13740",
+ "http://identifiers.org/chebi/CHEBI:16027",
+ "http://identifiers.org/chebi/CHEBI:22242",
+ "http://identifiers.org/chebi/CHEBI:22245",
+ "http://identifiers.org/chebi/CHEBI:2356",
+ "http://identifiers.org/chebi/CHEBI:40510",
+ "http://identifiers.org/chebi/CHEBI:40721",
+ "http://identifiers.org/chebi/CHEBI:40726",
+ "http://identifiers.org/chebi/CHEBI:40786",
+ "http://identifiers.org/chebi/CHEBI:40826",
+ "http://identifiers.org/chebi/CHEBI:456215",
+ "http://identifiers.org/chebi/CHEBI:47222",
+ "http://identifiers.org/kegg.compound/C00020",
+ "http://identifiers.org/kegg.drug/D02769",
+ "http://identifiers.org/metanetx.chemical/MNXM14",
+ "http://identifiers.org/seed.compound/cpd00018",
+ "http://identifiers.org/seed.compound/cpd22272"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O7P",
+ "id": "amp_c",
+ "name": "AMP C10H12N5O7P"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/atp",
+ "http://identifiers.org/biocyc/META:ATP",
+ "http://identifiers.org/biocyc/META:CPD0-1634",
+ "http://identifiers.org/chebi/CHEBI:10789",
+ "http://identifiers.org/chebi/CHEBI:10841",
+ "http://identifiers.org/chebi/CHEBI:13236",
+ "http://identifiers.org/chebi/CHEBI:15422",
+ "http://identifiers.org/chebi/CHEBI:22249",
+ "http://identifiers.org/chebi/CHEBI:2359",
+ "http://identifiers.org/chebi/CHEBI:237958",
+ "http://identifiers.org/chebi/CHEBI:30616",
+ "http://identifiers.org/chebi/CHEBI:40938",
+ "http://identifiers.org/chebi/CHEBI:57299",
+ "http://identifiers.org/kegg.compound/C00002",
+ "http://identifiers.org/kegg.drug/D08646",
+ "http://identifiers.org/metanetx.chemical/MNXM3",
+ "http://identifiers.org/seed.compound/cpd00002"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C10H12N5O13P3",
+ "id": "atp_c",
+ "name": "ATP C10H12N5O13P3"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/cit",
+ "http://identifiers.org/biocyc/META:CIT",
+ "http://identifiers.org/chebi/CHEBI:132362",
+ "http://identifiers.org/chebi/CHEBI:133748",
+ "http://identifiers.org/chebi/CHEBI:13999",
+ "http://identifiers.org/chebi/CHEBI:16947",
+ "http://identifiers.org/chebi/CHEBI:23321",
+ "http://identifiers.org/chebi/CHEBI:23322",
+ "http://identifiers.org/chebi/CHEBI:30769",
+ "http://identifiers.org/chebi/CHEBI:35802",
+ "http://identifiers.org/chebi/CHEBI:35804",
+ "http://identifiers.org/chebi/CHEBI:35806",
+ "http://identifiers.org/chebi/CHEBI:35808",
+ "http://identifiers.org/chebi/CHEBI:35809",
+ "http://identifiers.org/chebi/CHEBI:35810",
+ "http://identifiers.org/chebi/CHEBI:3727",
+ "http://identifiers.org/chebi/CHEBI:41523",
+ "http://identifiers.org/chebi/CHEBI:42563",
+ "http://identifiers.org/chebi/CHEBI:76049",
+ "http://identifiers.org/chebi/CHEBI:79399",
+ "http://identifiers.org/hmdb/HMDB00094",
+ "http://identifiers.org/kegg.compound/C00158",
+ "http://identifiers.org/kegg.compound/C13660",
+ "http://identifiers.org/kegg.drug/D00037",
+ "http://identifiers.org/metanetx.chemical/MNXM131",
+ "http://identifiers.org/seed.compound/cpd00137"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H5O7",
+ "id": "cit_c",
+ "name": "Citrate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/co2",
+ "http://identifiers.org/biocyc/META:CARBON-DIOXIDE",
+ "http://identifiers.org/chebi/CHEBI:13282",
+ "http://identifiers.org/chebi/CHEBI:13283",
+ "http://identifiers.org/chebi/CHEBI:13284",
+ "http://identifiers.org/chebi/CHEBI:13285",
+ "http://identifiers.org/chebi/CHEBI:16526",
+ "http://identifiers.org/chebi/CHEBI:23011",
+ "http://identifiers.org/chebi/CHEBI:3283",
+ "http://identifiers.org/chebi/CHEBI:48829",
+ "http://identifiers.org/hmdb/HMDB01967",
+ "http://identifiers.org/kegg.compound/C00011",
+ "http://identifiers.org/kegg.drug/D00004",
+ "http://identifiers.org/metanetx.chemical/MNXM13",
+ "http://identifiers.org/seed.compound/cpd00011"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "CO2",
+ "id": "co2_c",
+ "name": "CO2 CO2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/co2",
+ "http://identifiers.org/biocyc/META:CARBON-DIOXIDE",
+ "http://identifiers.org/chebi/CHEBI:13282",
+ "http://identifiers.org/chebi/CHEBI:13283",
+ "http://identifiers.org/chebi/CHEBI:13284",
+ "http://identifiers.org/chebi/CHEBI:13285",
+ "http://identifiers.org/chebi/CHEBI:16526",
+ "http://identifiers.org/chebi/CHEBI:23011",
+ "http://identifiers.org/chebi/CHEBI:3283",
+ "http://identifiers.org/chebi/CHEBI:48829",
+ "http://identifiers.org/hmdb/HMDB01967",
+ "http://identifiers.org/kegg.compound/C00011",
+ "http://identifiers.org/kegg.drug/D00004",
+ "http://identifiers.org/metanetx.chemical/MNXM13",
+ "http://identifiers.org/seed.compound/cpd00011"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "CO2",
+ "id": "co2_e",
+ "name": "CO2 CO2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/coa",
+ "http://identifiers.org/biocyc/META:CO-A",
+ "http://identifiers.org/biocyc/META:COA-GROUP",
+ "http://identifiers.org/chebi/CHEBI:13294",
+ "http://identifiers.org/chebi/CHEBI:13295",
+ "http://identifiers.org/chebi/CHEBI:13298",
+ "http://identifiers.org/chebi/CHEBI:15346",
+ "http://identifiers.org/chebi/CHEBI:23355",
+ "http://identifiers.org/chebi/CHEBI:3771",
+ "http://identifiers.org/chebi/CHEBI:41597",
+ "http://identifiers.org/chebi/CHEBI:41631",
+ "http://identifiers.org/chebi/CHEBI:57287",
+ "http://identifiers.org/chebi/CHEBI:741566",
+ "http://identifiers.org/hmdb/HMDB01423",
+ "http://identifiers.org/kegg.compound/C00010",
+ "http://identifiers.org/metanetx.chemical/MNXM12",
+ "http://identifiers.org/seed.compound/cpd00010",
+ "http://identifiers.org/seed.compound/cpd22528"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H32N7O16P3S",
+ "id": "coa_c",
+ "name": "Coenzyme A"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/dhap",
+ "http://identifiers.org/biocyc/META:DIHYDROXY-ACETONE-PHOSPHATE",
+ "http://identifiers.org/chebi/CHEBI:14341",
+ "http://identifiers.org/chebi/CHEBI:14342",
+ "http://identifiers.org/chebi/CHEBI:16108",
+ "http://identifiers.org/chebi/CHEBI:24355",
+ "http://identifiers.org/chebi/CHEBI:39571",
+ "http://identifiers.org/chebi/CHEBI:5454",
+ "http://identifiers.org/chebi/CHEBI:57642",
+ "http://identifiers.org/hmdb/HMDB01473",
+ "http://identifiers.org/hmdb/HMDB11735",
+ "http://identifiers.org/kegg.compound/C00111",
+ "http://identifiers.org/metanetx.chemical/MNXM77",
+ "http://identifiers.org/seed.compound/cpd00095"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O6P",
+ "id": "dhap_c",
+ "name": "Dihydroxyacetone phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/e4p",
+ "http://identifiers.org/biocyc/META:ERYTHROSE-4P",
+ "http://identifiers.org/chebi/CHEBI:12921",
+ "http://identifiers.org/chebi/CHEBI:16897",
+ "http://identifiers.org/chebi/CHEBI:20927",
+ "http://identifiers.org/chebi/CHEBI:4114",
+ "http://identifiers.org/chebi/CHEBI:42349",
+ "http://identifiers.org/chebi/CHEBI:48153",
+ "http://identifiers.org/hmdb/HMDB01321",
+ "http://identifiers.org/kegg.compound/C00279",
+ "http://identifiers.org/metanetx.chemical/MNXM258",
+ "http://identifiers.org/seed.compound/cpd00236"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H7O7P",
+ "id": "e4p_c",
+ "name": "D-Erythrose 4-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/etoh",
+ "http://identifiers.org/biocyc/META:ETOH",
+ "http://identifiers.org/chebi/CHEBI:14222",
+ "http://identifiers.org/chebi/CHEBI:16236",
+ "http://identifiers.org/chebi/CHEBI:23978",
+ "http://identifiers.org/chebi/CHEBI:30878",
+ "http://identifiers.org/chebi/CHEBI:30880",
+ "http://identifiers.org/chebi/CHEBI:42377",
+ "http://identifiers.org/chebi/CHEBI:44594",
+ "http://identifiers.org/chebi/CHEBI:4879",
+ "http://identifiers.org/chebi/CHEBI:52092",
+ "http://identifiers.org/hmdb/HMDB00108",
+ "http://identifiers.org/kegg.compound/C00469",
+ "http://identifiers.org/kegg.drug/D00068",
+ "http://identifiers.org/kegg.drug/D02798",
+ "http://identifiers.org/kegg.drug/D04855",
+ "http://identifiers.org/kegg.drug/D06542",
+ "http://identifiers.org/metanetx.chemical/MNXM303",
+ "http://identifiers.org/seed.compound/cpd00363"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H6O",
+ "id": "etoh_c",
+ "name": "Ethanol"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/etoh",
+ "http://identifiers.org/biocyc/META:ETOH",
+ "http://identifiers.org/chebi/CHEBI:14222",
+ "http://identifiers.org/chebi/CHEBI:16236",
+ "http://identifiers.org/chebi/CHEBI:23978",
+ "http://identifiers.org/chebi/CHEBI:30878",
+ "http://identifiers.org/chebi/CHEBI:30880",
+ "http://identifiers.org/chebi/CHEBI:42377",
+ "http://identifiers.org/chebi/CHEBI:44594",
+ "http://identifiers.org/chebi/CHEBI:4879",
+ "http://identifiers.org/chebi/CHEBI:52092",
+ "http://identifiers.org/hmdb/HMDB00108",
+ "http://identifiers.org/kegg.compound/C00469",
+ "http://identifiers.org/kegg.drug/D00068",
+ "http://identifiers.org/kegg.drug/D02798",
+ "http://identifiers.org/kegg.drug/D04855",
+ "http://identifiers.org/kegg.drug/D06542",
+ "http://identifiers.org/metanetx.chemical/MNXM303",
+ "http://identifiers.org/seed.compound/cpd00363"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C2H6O",
+ "id": "etoh_e",
+ "name": "Ethanol"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/f6p",
+ "http://identifiers.org/biocyc/META:FRUCTOSE-6P",
+ "http://identifiers.org/chebi/CHEBI:10375",
+ "http://identifiers.org/chebi/CHEBI:12352",
+ "http://identifiers.org/chebi/CHEBI:16084",
+ "http://identifiers.org/chebi/CHEBI:22768",
+ "http://identifiers.org/chebi/CHEBI:42378",
+ "http://identifiers.org/chebi/CHEBI:57634",
+ "http://identifiers.org/hmdb/HMDB03971",
+ "http://identifiers.org/kegg.compound/C05345",
+ "http://identifiers.org/metanetx.chemical/MNXM89621",
+ "http://identifiers.org/seed.compound/cpd19035"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H11O9P",
+ "id": "f6p_c",
+ "name": "D-Fructose 6-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fdp",
+ "http://identifiers.org/chebi/CHEBI:37736",
+ "http://identifiers.org/chebi/CHEBI:49299",
+ "http://identifiers.org/kegg.compound/C00354",
+ "http://identifiers.org/metanetx.chemical/MNXM417",
+ "http://identifiers.org/seed.compound/cpd00290"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H10O12P2",
+ "id": "fdp_c",
+ "name": "D-Fructose 1,6-bisphosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/for",
+ "http://identifiers.org/biocyc/META:CARBOXYL-GROUP",
+ "http://identifiers.org/biocyc/META:CPD-9845",
+ "http://identifiers.org/biocyc/META:CPD1G-1532",
+ "http://identifiers.org/biocyc/META:CPD1G-1533",
+ "http://identifiers.org/biocyc/META:CPD1G-1534",
+ "http://identifiers.org/biocyc/META:CPD1G-1535",
+ "http://identifiers.org/biocyc/META:FORMATE",
+ "http://identifiers.org/chebi/CHEBI:14276",
+ "http://identifiers.org/chebi/CHEBI:15740",
+ "http://identifiers.org/chebi/CHEBI:24081",
+ "http://identifiers.org/chebi/CHEBI:24082",
+ "http://identifiers.org/chebi/CHEBI:30751",
+ "http://identifiers.org/chebi/CHEBI:42460",
+ "http://identifiers.org/chebi/CHEBI:5145",
+ "http://identifiers.org/hmdb/HMDB00142",
+ "http://identifiers.org/kegg.compound/C00058",
+ "http://identifiers.org/metanetx.chemical/MNXM39",
+ "http://identifiers.org/seed.compound/cpd00047",
+ "http://identifiers.org/seed.compound/cpd22511"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "CH1O2",
+ "id": "for_c",
+ "name": "Formate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/for",
+ "http://identifiers.org/biocyc/META:CARBOXYL-GROUP",
+ "http://identifiers.org/biocyc/META:CPD-9845",
+ "http://identifiers.org/biocyc/META:CPD1G-1532",
+ "http://identifiers.org/biocyc/META:CPD1G-1533",
+ "http://identifiers.org/biocyc/META:CPD1G-1534",
+ "http://identifiers.org/biocyc/META:CPD1G-1535",
+ "http://identifiers.org/biocyc/META:FORMATE",
+ "http://identifiers.org/chebi/CHEBI:14276",
+ "http://identifiers.org/chebi/CHEBI:15740",
+ "http://identifiers.org/chebi/CHEBI:24081",
+ "http://identifiers.org/chebi/CHEBI:24082",
+ "http://identifiers.org/chebi/CHEBI:30751",
+ "http://identifiers.org/chebi/CHEBI:42460",
+ "http://identifiers.org/chebi/CHEBI:5145",
+ "http://identifiers.org/hmdb/HMDB00142",
+ "http://identifiers.org/kegg.compound/C00058",
+ "http://identifiers.org/metanetx.chemical/MNXM39",
+ "http://identifiers.org/seed.compound/cpd00047",
+ "http://identifiers.org/seed.compound/cpd22511"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "CH1O2",
+ "id": "for_e",
+ "name": "Formate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fru",
+ "http://identifiers.org/biocyc/META:CPD-15382",
+ "http://identifiers.org/biocyc/META:D-Fructopyranose",
+ "http://identifiers.org/biocyc/META:FRU",
+ "http://identifiers.org/biocyc/META:Fructofuranose",
+ "http://identifiers.org/chebi/CHEBI:12923",
+ "http://identifiers.org/chebi/CHEBI:15824",
+ "http://identifiers.org/chebi/CHEBI:20929",
+ "http://identifiers.org/chebi/CHEBI:24104",
+ "http://identifiers.org/chebi/CHEBI:24110",
+ "http://identifiers.org/chebi/CHEBI:28757",
+ "http://identifiers.org/chebi/CHEBI:37714",
+ "http://identifiers.org/chebi/CHEBI:37721",
+ "http://identifiers.org/chebi/CHEBI:4118",
+ "http://identifiers.org/chebi/CHEBI:4119",
+ "http://identifiers.org/chebi/CHEBI:47424",
+ "http://identifiers.org/chebi/CHEBI:48095",
+ "http://identifiers.org/chebi/CHEBI:5172",
+ "http://identifiers.org/hmdb/HMDB62538",
+ "http://identifiers.org/kegg.compound/C00095",
+ "http://identifiers.org/kegg.compound/C01496",
+ "http://identifiers.org/kegg.compound/C05003",
+ "http://identifiers.org/kegg.compound/C10906",
+ "http://identifiers.org/kegg.drug/D00114",
+ "http://identifiers.org/metanetx.chemical/MNXM175",
+ "http://identifiers.org/seed.compound/cpd00082",
+ "http://identifiers.org/seed.compound/cpd19015",
+ "http://identifiers.org/seed.compound/cpd27040"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C6H12O6",
+ "id": "fru_e",
+ "name": "D-Fructose"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fum",
+ "http://identifiers.org/biocyc/META:FUM",
+ "http://identifiers.org/chebi/CHEBI:14284",
+ "http://identifiers.org/chebi/CHEBI:18012",
+ "http://identifiers.org/chebi/CHEBI:22956",
+ "http://identifiers.org/chebi/CHEBI:22957",
+ "http://identifiers.org/chebi/CHEBI:22958",
+ "http://identifiers.org/chebi/CHEBI:24122",
+ "http://identifiers.org/chebi/CHEBI:24124",
+ "http://identifiers.org/chebi/CHEBI:29806",
+ "http://identifiers.org/chebi/CHEBI:36180",
+ "http://identifiers.org/chebi/CHEBI:37154",
+ "http://identifiers.org/chebi/CHEBI:37155",
+ "http://identifiers.org/chebi/CHEBI:42511",
+ "http://identifiers.org/chebi/CHEBI:42743",
+ "http://identifiers.org/chebi/CHEBI:5190",
+ "http://identifiers.org/hmdb/HMDB00134",
+ "http://identifiers.org/kegg.compound/C00122",
+ "http://identifiers.org/kegg.drug/D02308",
+ "http://identifiers.org/metanetx.chemical/MNXM93",
+ "http://identifiers.org/seed.compound/cpd00106"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H2O4",
+ "id": "fum_c",
+ "name": "Fumarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/fum",
+ "http://identifiers.org/biocyc/META:FUM",
+ "http://identifiers.org/chebi/CHEBI:14284",
+ "http://identifiers.org/chebi/CHEBI:18012",
+ "http://identifiers.org/chebi/CHEBI:22956",
+ "http://identifiers.org/chebi/CHEBI:22957",
+ "http://identifiers.org/chebi/CHEBI:22958",
+ "http://identifiers.org/chebi/CHEBI:24122",
+ "http://identifiers.org/chebi/CHEBI:24124",
+ "http://identifiers.org/chebi/CHEBI:29806",
+ "http://identifiers.org/chebi/CHEBI:36180",
+ "http://identifiers.org/chebi/CHEBI:37154",
+ "http://identifiers.org/chebi/CHEBI:37155",
+ "http://identifiers.org/chebi/CHEBI:42511",
+ "http://identifiers.org/chebi/CHEBI:42743",
+ "http://identifiers.org/chebi/CHEBI:5190",
+ "http://identifiers.org/hmdb/HMDB00134",
+ "http://identifiers.org/kegg.compound/C00122",
+ "http://identifiers.org/kegg.drug/D02308",
+ "http://identifiers.org/metanetx.chemical/MNXM93",
+ "http://identifiers.org/seed.compound/cpd00106"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H2O4",
+ "id": "fum_e",
+ "name": "Fumarate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/g3p",
+ "http://identifiers.org/biocyc/META:GAP",
+ "http://identifiers.org/chebi/CHEBI:12983",
+ "http://identifiers.org/chebi/CHEBI:12984",
+ "http://identifiers.org/chebi/CHEBI:14333",
+ "http://identifiers.org/chebi/CHEBI:17138",
+ "http://identifiers.org/chebi/CHEBI:181",
+ "http://identifiers.org/chebi/CHEBI:18324",
+ "http://identifiers.org/chebi/CHEBI:21026",
+ "http://identifiers.org/chebi/CHEBI:29052",
+ "http://identifiers.org/chebi/CHEBI:5446",
+ "http://identifiers.org/chebi/CHEBI:58027",
+ "http://identifiers.org/chebi/CHEBI:59776",
+ "http://identifiers.org/hmdb/HMDB01112",
+ "http://identifiers.org/kegg.compound/C00118",
+ "http://identifiers.org/kegg.compound/C00661",
+ "http://identifiers.org/metanetx.chemical/MNXM74",
+ "http://identifiers.org/seed.compound/cpd00102",
+ "http://identifiers.org/seed.compound/cpd19005"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O6P",
+ "id": "g3p_c",
+ "name": "Glyceraldehyde 3-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/g6p",
+ "http://identifiers.org/biocyc/META:D-glucopyranose-6-phosphate",
+ "http://identifiers.org/chebi/CHEBI:14314",
+ "http://identifiers.org/chebi/CHEBI:4170",
+ "http://identifiers.org/chebi/CHEBI:61548",
+ "http://identifiers.org/hmdb/HMDB01401",
+ "http://identifiers.org/hmdb/HMDB01549",
+ "http://identifiers.org/hmdb/HMDB06793",
+ "http://identifiers.org/kegg.compound/C00092",
+ "http://identifiers.org/metanetx.chemical/MNXM160",
+ "http://identifiers.org/seed.compound/cpd00079",
+ "http://identifiers.org/seed.compound/cpd26836"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H11O9P",
+ "id": "g6p_c",
+ "name": "D-Glucose 6-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glc__D",
+ "http://identifiers.org/biocyc/META:Glucopyranose",
+ "http://identifiers.org/chebi/CHEBI:12965",
+ "http://identifiers.org/chebi/CHEBI:17634",
+ "http://identifiers.org/chebi/CHEBI:20999",
+ "http://identifiers.org/chebi/CHEBI:4167",
+ "http://identifiers.org/hmdb/HMDB00122",
+ "http://identifiers.org/hmdb/HMDB06564",
+ "http://identifiers.org/kegg.compound/C00031",
+ "http://identifiers.org/kegg.drug/D00009",
+ "http://identifiers.org/metanetx.chemical/MNXM41",
+ "http://identifiers.org/seed.compound/cpd00027",
+ "http://identifiers.org/seed.compound/cpd26821"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C6H12O6",
+ "id": "glc__D_e",
+ "name": "D-Glucose"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/gln__L",
+ "http://identifiers.org/biocyc/META:GLN",
+ "http://identifiers.org/chebi/CHEBI:13110",
+ "http://identifiers.org/chebi/CHEBI:18050",
+ "http://identifiers.org/chebi/CHEBI:21308",
+ "http://identifiers.org/chebi/CHEBI:24316",
+ "http://identifiers.org/chebi/CHEBI:28300",
+ "http://identifiers.org/chebi/CHEBI:32665",
+ "http://identifiers.org/chebi/CHEBI:32666",
+ "http://identifiers.org/chebi/CHEBI:32678",
+ "http://identifiers.org/chebi/CHEBI:32679",
+ "http://identifiers.org/chebi/CHEBI:42812",
+ "http://identifiers.org/chebi/CHEBI:42814",
+ "http://identifiers.org/chebi/CHEBI:42899",
+ "http://identifiers.org/chebi/CHEBI:42943",
+ "http://identifiers.org/chebi/CHEBI:5432",
+ "http://identifiers.org/chebi/CHEBI:58359",
+ "http://identifiers.org/chebi/CHEBI:6227",
+ "http://identifiers.org/hmdb/HMDB00641",
+ "http://identifiers.org/kegg.compound/C00064",
+ "http://identifiers.org/kegg.compound/C00303",
+ "http://identifiers.org/kegg.drug/D00015",
+ "http://identifiers.org/metanetx.chemical/MNXM37",
+ "http://identifiers.org/seed.compound/cpd00053",
+ "http://identifiers.org/seed.compound/cpd00253"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H10N2O3",
+ "id": "gln__L_c",
+ "name": "L-Glutamine"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/gln__L",
+ "http://identifiers.org/biocyc/META:GLN",
+ "http://identifiers.org/chebi/CHEBI:13110",
+ "http://identifiers.org/chebi/CHEBI:18050",
+ "http://identifiers.org/chebi/CHEBI:21308",
+ "http://identifiers.org/chebi/CHEBI:24316",
+ "http://identifiers.org/chebi/CHEBI:28300",
+ "http://identifiers.org/chebi/CHEBI:32665",
+ "http://identifiers.org/chebi/CHEBI:32666",
+ "http://identifiers.org/chebi/CHEBI:32678",
+ "http://identifiers.org/chebi/CHEBI:32679",
+ "http://identifiers.org/chebi/CHEBI:42812",
+ "http://identifiers.org/chebi/CHEBI:42814",
+ "http://identifiers.org/chebi/CHEBI:42899",
+ "http://identifiers.org/chebi/CHEBI:42943",
+ "http://identifiers.org/chebi/CHEBI:5432",
+ "http://identifiers.org/chebi/CHEBI:58359",
+ "http://identifiers.org/chebi/CHEBI:6227",
+ "http://identifiers.org/hmdb/HMDB00641",
+ "http://identifiers.org/kegg.compound/C00064",
+ "http://identifiers.org/kegg.compound/C00303",
+ "http://identifiers.org/kegg.drug/D00015",
+ "http://identifiers.org/metanetx.chemical/MNXM37",
+ "http://identifiers.org/seed.compound/cpd00053",
+ "http://identifiers.org/seed.compound/cpd00253"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H10N2O3",
+ "id": "gln__L_e",
+ "name": "L-Glutamine"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glu__L",
+ "http://identifiers.org/biocyc/META:GLT",
+ "http://identifiers.org/biocyc/META:Glutamates",
+ "http://identifiers.org/chebi/CHEBI:13107",
+ "http://identifiers.org/chebi/CHEBI:14321",
+ "http://identifiers.org/chebi/CHEBI:16015",
+ "http://identifiers.org/chebi/CHEBI:18237",
+ "http://identifiers.org/chebi/CHEBI:21301",
+ "http://identifiers.org/chebi/CHEBI:21304",
+ "http://identifiers.org/chebi/CHEBI:24314",
+ "http://identifiers.org/chebi/CHEBI:29985",
+ "http://identifiers.org/chebi/CHEBI:29987",
+ "http://identifiers.org/chebi/CHEBI:29988",
+ "http://identifiers.org/chebi/CHEBI:42825",
+ "http://identifiers.org/chebi/CHEBI:5431",
+ "http://identifiers.org/chebi/CHEBI:6224",
+ "http://identifiers.org/chebi/CHEBI:76051",
+ "http://identifiers.org/hmdb/HMDB00148",
+ "http://identifiers.org/hmdb/HMDB60475",
+ "http://identifiers.org/kegg.compound/C00025",
+ "http://identifiers.org/kegg.compound/C00302",
+ "http://identifiers.org/kegg.drug/D00007",
+ "http://identifiers.org/kegg.drug/D04341",
+ "http://identifiers.org/metanetx.chemical/MNXM89557",
+ "http://identifiers.org/seed.compound/cpd00023",
+ "http://identifiers.org/seed.compound/cpd19002",
+ "http://identifiers.org/seed.compound/cpd27177"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H8NO4",
+ "id": "glu__L_c",
+ "name": "L-Glutamate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glu__L",
+ "http://identifiers.org/biocyc/META:GLT",
+ "http://identifiers.org/biocyc/META:Glutamates",
+ "http://identifiers.org/chebi/CHEBI:13107",
+ "http://identifiers.org/chebi/CHEBI:14321",
+ "http://identifiers.org/chebi/CHEBI:16015",
+ "http://identifiers.org/chebi/CHEBI:18237",
+ "http://identifiers.org/chebi/CHEBI:21301",
+ "http://identifiers.org/chebi/CHEBI:21304",
+ "http://identifiers.org/chebi/CHEBI:24314",
+ "http://identifiers.org/chebi/CHEBI:29985",
+ "http://identifiers.org/chebi/CHEBI:29987",
+ "http://identifiers.org/chebi/CHEBI:29988",
+ "http://identifiers.org/chebi/CHEBI:42825",
+ "http://identifiers.org/chebi/CHEBI:5431",
+ "http://identifiers.org/chebi/CHEBI:6224",
+ "http://identifiers.org/chebi/CHEBI:76051",
+ "http://identifiers.org/hmdb/HMDB00148",
+ "http://identifiers.org/hmdb/HMDB60475",
+ "http://identifiers.org/kegg.compound/C00025",
+ "http://identifiers.org/kegg.compound/C00302",
+ "http://identifiers.org/kegg.drug/D00007",
+ "http://identifiers.org/kegg.drug/D04341",
+ "http://identifiers.org/metanetx.chemical/MNXM89557",
+ "http://identifiers.org/seed.compound/cpd00023",
+ "http://identifiers.org/seed.compound/cpd19002",
+ "http://identifiers.org/seed.compound/cpd27177"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C5H8NO4",
+ "id": "glu__L_e",
+ "name": "L-Glutamate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/glx",
+ "http://identifiers.org/biocyc/META:GLYOX",
+ "http://identifiers.org/chebi/CHEBI:14368",
+ "http://identifiers.org/chebi/CHEBI:16891",
+ "http://identifiers.org/chebi/CHEBI:24420",
+ "http://identifiers.org/chebi/CHEBI:24421",
+ "http://identifiers.org/chebi/CHEBI:35977",
+ "http://identifiers.org/chebi/CHEBI:36655",
+ "http://identifiers.org/chebi/CHEBI:42767",
+ "http://identifiers.org/chebi/CHEBI:5509",
+ "http://identifiers.org/hmdb/HMDB00119",
+ "http://identifiers.org/kegg.compound/C00048",
+ "http://identifiers.org/metanetx.chemical/MNXM69",
+ "http://identifiers.org/seed.compound/cpd00040"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C2H1O3",
+ "id": "glx_c",
+ "name": "Glyoxylate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h2o",
+ "http://identifiers.org/biocyc/META:CPD-15815",
+ "http://identifiers.org/biocyc/META:HYDROXYL-GROUP",
+ "http://identifiers.org/biocyc/META:OH",
+ "http://identifiers.org/biocyc/META:OXONIUM",
+ "http://identifiers.org/biocyc/META:WATER",
+ "http://identifiers.org/chebi/CHEBI:10743",
+ "http://identifiers.org/chebi/CHEBI:13352",
+ "http://identifiers.org/chebi/CHEBI:13365",
+ "http://identifiers.org/chebi/CHEBI:13419",
+ "http://identifiers.org/chebi/CHEBI:15377",
+ "http://identifiers.org/chebi/CHEBI:16234",
+ "http://identifiers.org/chebi/CHEBI:27313",
+ "http://identifiers.org/chebi/CHEBI:29356",
+ "http://identifiers.org/chebi/CHEBI:29373",
+ "http://identifiers.org/chebi/CHEBI:29374",
+ "http://identifiers.org/chebi/CHEBI:29375",
+ "http://identifiers.org/chebi/CHEBI:29412",
+ "http://identifiers.org/chebi/CHEBI:30490",
+ "http://identifiers.org/chebi/CHEBI:33806",
+ "http://identifiers.org/chebi/CHEBI:33811",
+ "http://identifiers.org/chebi/CHEBI:33813",
+ "http://identifiers.org/chebi/CHEBI:41979",
+ "http://identifiers.org/chebi/CHEBI:41981",
+ "http://identifiers.org/chebi/CHEBI:42043",
+ "http://identifiers.org/chebi/CHEBI:42857",
+ "http://identifiers.org/chebi/CHEBI:43228",
+ "http://identifiers.org/chebi/CHEBI:44292",
+ "http://identifiers.org/chebi/CHEBI:44641",
+ "http://identifiers.org/chebi/CHEBI:44701",
+ "http://identifiers.org/chebi/CHEBI:44819",
+ "http://identifiers.org/chebi/CHEBI:5585",
+ "http://identifiers.org/chebi/CHEBI:5594",
+ "http://identifiers.org/hmdb/HMDB02111",
+ "http://identifiers.org/kegg.compound/C00001",
+ "http://identifiers.org/kegg.compound/C01328",
+ "http://identifiers.org/kegg.compound/C18714",
+ "http://identifiers.org/kegg.drug/D00001",
+ "http://identifiers.org/kegg.drug/D03703",
+ "http://identifiers.org/kegg.drug/D06322",
+ "http://identifiers.org/metanetx.chemical/MNXM2",
+ "http://identifiers.org/seed.compound/cpd00001",
+ "http://identifiers.org/seed.compound/cpd15275",
+ "http://identifiers.org/seed.compound/cpd27222"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H2O",
+ "id": "h2o_c",
+ "name": "H2O H2O"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h2o",
+ "http://identifiers.org/biocyc/META:CPD-15815",
+ "http://identifiers.org/biocyc/META:HYDROXYL-GROUP",
+ "http://identifiers.org/biocyc/META:OH",
+ "http://identifiers.org/biocyc/META:OXONIUM",
+ "http://identifiers.org/biocyc/META:WATER",
+ "http://identifiers.org/chebi/CHEBI:10743",
+ "http://identifiers.org/chebi/CHEBI:13352",
+ "http://identifiers.org/chebi/CHEBI:13365",
+ "http://identifiers.org/chebi/CHEBI:13419",
+ "http://identifiers.org/chebi/CHEBI:15377",
+ "http://identifiers.org/chebi/CHEBI:16234",
+ "http://identifiers.org/chebi/CHEBI:27313",
+ "http://identifiers.org/chebi/CHEBI:29356",
+ "http://identifiers.org/chebi/CHEBI:29373",
+ "http://identifiers.org/chebi/CHEBI:29374",
+ "http://identifiers.org/chebi/CHEBI:29375",
+ "http://identifiers.org/chebi/CHEBI:29412",
+ "http://identifiers.org/chebi/CHEBI:30490",
+ "http://identifiers.org/chebi/CHEBI:33806",
+ "http://identifiers.org/chebi/CHEBI:33811",
+ "http://identifiers.org/chebi/CHEBI:33813",
+ "http://identifiers.org/chebi/CHEBI:41979",
+ "http://identifiers.org/chebi/CHEBI:41981",
+ "http://identifiers.org/chebi/CHEBI:42043",
+ "http://identifiers.org/chebi/CHEBI:42857",
+ "http://identifiers.org/chebi/CHEBI:43228",
+ "http://identifiers.org/chebi/CHEBI:44292",
+ "http://identifiers.org/chebi/CHEBI:44641",
+ "http://identifiers.org/chebi/CHEBI:44701",
+ "http://identifiers.org/chebi/CHEBI:44819",
+ "http://identifiers.org/chebi/CHEBI:5585",
+ "http://identifiers.org/chebi/CHEBI:5594",
+ "http://identifiers.org/hmdb/HMDB02111",
+ "http://identifiers.org/kegg.compound/C00001",
+ "http://identifiers.org/kegg.compound/C01328",
+ "http://identifiers.org/kegg.compound/C18714",
+ "http://identifiers.org/kegg.drug/D00001",
+ "http://identifiers.org/kegg.drug/D03703",
+ "http://identifiers.org/kegg.drug/D06322",
+ "http://identifiers.org/metanetx.chemical/MNXM2",
+ "http://identifiers.org/seed.compound/cpd00001",
+ "http://identifiers.org/seed.compound/cpd15275",
+ "http://identifiers.org/seed.compound/cpd27222"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H2O",
+ "id": "h2o_e",
+ "name": "H2O H2O"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h",
+ "http://identifiers.org/biocyc/META:PROTON",
+ "http://identifiers.org/chebi/CHEBI:10744",
+ "http://identifiers.org/chebi/CHEBI:13357",
+ "http://identifiers.org/chebi/CHEBI:15378",
+ "http://identifiers.org/chebi/CHEBI:24636",
+ "http://identifiers.org/chebi/CHEBI:29233",
+ "http://identifiers.org/chebi/CHEBI:29234",
+ "http://identifiers.org/chebi/CHEBI:5584",
+ "http://identifiers.org/hmdb/HMDB59597",
+ "http://identifiers.org/kegg.compound/C00080",
+ "http://identifiers.org/metanetx.chemical/MNXM1",
+ "http://identifiers.org/seed.compound/cpd00067"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H",
+ "id": "h_c",
+ "name": "H+"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/h",
+ "http://identifiers.org/biocyc/META:PROTON",
+ "http://identifiers.org/chebi/CHEBI:10744",
+ "http://identifiers.org/chebi/CHEBI:13357",
+ "http://identifiers.org/chebi/CHEBI:15378",
+ "http://identifiers.org/chebi/CHEBI:24636",
+ "http://identifiers.org/chebi/CHEBI:29233",
+ "http://identifiers.org/chebi/CHEBI:29234",
+ "http://identifiers.org/chebi/CHEBI:5584",
+ "http://identifiers.org/hmdb/HMDB59597",
+ "http://identifiers.org/kegg.compound/C00080",
+ "http://identifiers.org/metanetx.chemical/MNXM1",
+ "http://identifiers.org/seed.compound/cpd00067"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H",
+ "id": "h_e",
+ "name": "H+"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/icit",
+ "http://identifiers.org/chebi/CHEBI:14465",
+ "http://identifiers.org/chebi/CHEBI:16087",
+ "http://identifiers.org/chebi/CHEBI:24884",
+ "http://identifiers.org/chebi/CHEBI:24886",
+ "http://identifiers.org/chebi/CHEBI:30887",
+ "http://identifiers.org/chebi/CHEBI:36453",
+ "http://identifiers.org/chebi/CHEBI:36454",
+ "http://identifiers.org/chebi/CHEBI:5998",
+ "http://identifiers.org/hmdb/HMDB00193",
+ "http://identifiers.org/kegg.compound/C00311",
+ "http://identifiers.org/metanetx.chemical/MNXM89661",
+ "http://identifiers.org/seed.compound/cpd00260"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C6H5O7",
+ "id": "icit_c",
+ "name": "Isocitrate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/lac__D",
+ "http://identifiers.org/biocyc/META:D-LACTATE",
+ "http://identifiers.org/chebi/CHEBI:11001",
+ "http://identifiers.org/chebi/CHEBI:16004",
+ "http://identifiers.org/chebi/CHEBI:18684",
+ "http://identifiers.org/chebi/CHEBI:341",
+ "http://identifiers.org/chebi/CHEBI:42105",
+ "http://identifiers.org/chebi/CHEBI:42111",
+ "http://identifiers.org/chebi/CHEBI:43701",
+ "http://identifiers.org/hmdb/HMDB00171",
+ "http://identifiers.org/hmdb/HMDB01311",
+ "http://identifiers.org/kegg.compound/C00256",
+ "http://identifiers.org/metanetx.chemical/MNXM285",
+ "http://identifiers.org/seed.compound/cpd00221"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H5O3",
+ "id": "lac__D_c",
+ "name": "D-Lactate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/lac__D",
+ "http://identifiers.org/biocyc/META:D-LACTATE",
+ "http://identifiers.org/chebi/CHEBI:11001",
+ "http://identifiers.org/chebi/CHEBI:16004",
+ "http://identifiers.org/chebi/CHEBI:18684",
+ "http://identifiers.org/chebi/CHEBI:341",
+ "http://identifiers.org/chebi/CHEBI:42105",
+ "http://identifiers.org/chebi/CHEBI:42111",
+ "http://identifiers.org/chebi/CHEBI:43701",
+ "http://identifiers.org/hmdb/HMDB00171",
+ "http://identifiers.org/hmdb/HMDB01311",
+ "http://identifiers.org/kegg.compound/C00256",
+ "http://identifiers.org/metanetx.chemical/MNXM285",
+ "http://identifiers.org/seed.compound/cpd00221"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C3H5O3",
+ "id": "lac__D_e",
+ "name": "D-Lactate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/mal__L",
+ "http://identifiers.org/biocyc/META:MAL",
+ "http://identifiers.org/chebi/CHEBI:11066",
+ "http://identifiers.org/chebi/CHEBI:13140",
+ "http://identifiers.org/chebi/CHEBI:15589",
+ "http://identifiers.org/chebi/CHEBI:18784",
+ "http://identifiers.org/chebi/CHEBI:18785",
+ "http://identifiers.org/chebi/CHEBI:30797",
+ "http://identifiers.org/chebi/CHEBI:423",
+ "http://identifiers.org/hmdb/HMDB00156",
+ "http://identifiers.org/kegg.compound/C00149",
+ "http://identifiers.org/metanetx.chemical/MNXM98",
+ "http://identifiers.org/seed.compound/cpd00130"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H4O5",
+ "id": "mal__L_c",
+ "name": "L-Malate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/mal__L",
+ "http://identifiers.org/biocyc/META:MAL",
+ "http://identifiers.org/chebi/CHEBI:11066",
+ "http://identifiers.org/chebi/CHEBI:13140",
+ "http://identifiers.org/chebi/CHEBI:15589",
+ "http://identifiers.org/chebi/CHEBI:18784",
+ "http://identifiers.org/chebi/CHEBI:18785",
+ "http://identifiers.org/chebi/CHEBI:30797",
+ "http://identifiers.org/chebi/CHEBI:423",
+ "http://identifiers.org/hmdb/HMDB00156",
+ "http://identifiers.org/kegg.compound/C00149",
+ "http://identifiers.org/metanetx.chemical/MNXM98",
+ "http://identifiers.org/seed.compound/cpd00130"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H4O5",
+ "id": "mal__L_e",
+ "name": "L-Malate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nad",
+ "http://identifiers.org/biocyc/META:NAD",
+ "http://identifiers.org/chebi/CHEBI:13393",
+ "http://identifiers.org/chebi/CHEBI:13394",
+ "http://identifiers.org/chebi/CHEBI:15846",
+ "http://identifiers.org/chebi/CHEBI:21901",
+ "http://identifiers.org/chebi/CHEBI:29867",
+ "http://identifiers.org/chebi/CHEBI:44214",
+ "http://identifiers.org/chebi/CHEBI:44215",
+ "http://identifiers.org/chebi/CHEBI:44281",
+ "http://identifiers.org/chebi/CHEBI:57540",
+ "http://identifiers.org/chebi/CHEBI:7422",
+ "http://identifiers.org/kegg.compound/C00003",
+ "http://identifiers.org/kegg.drug/D00002",
+ "http://identifiers.org/metanetx.chemical/MNXM8",
+ "http://identifiers.org/seed.compound/cpd00003"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H26N7O14P2",
+ "id": "nad_c",
+ "name": "Nicotinamide adenine dinucleotide"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadh",
+ "http://identifiers.org/biocyc/META:NADH",
+ "http://identifiers.org/chebi/CHEBI:13395",
+ "http://identifiers.org/chebi/CHEBI:13396",
+ "http://identifiers.org/chebi/CHEBI:16908",
+ "http://identifiers.org/chebi/CHEBI:21902",
+ "http://identifiers.org/chebi/CHEBI:44216",
+ "http://identifiers.org/chebi/CHEBI:57945",
+ "http://identifiers.org/chebi/CHEBI:7423",
+ "http://identifiers.org/hmdb/HMDB01487",
+ "http://identifiers.org/kegg.compound/C00004",
+ "http://identifiers.org/metanetx.chemical/MNXM10",
+ "http://identifiers.org/seed.compound/cpd00004"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H27N7O14P2",
+ "id": "nadh_c",
+ "name": "Nicotinamide adenine dinucleotide - reduced"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadp",
+ "http://identifiers.org/biocyc/META:NADP",
+ "http://identifiers.org/chebi/CHEBI:13397",
+ "http://identifiers.org/chebi/CHEBI:13398",
+ "http://identifiers.org/chebi/CHEBI:18009",
+ "http://identifiers.org/chebi/CHEBI:21903",
+ "http://identifiers.org/chebi/CHEBI:25523",
+ "http://identifiers.org/chebi/CHEBI:29868",
+ "http://identifiers.org/chebi/CHEBI:44405",
+ "http://identifiers.org/chebi/CHEBI:44409",
+ "http://identifiers.org/chebi/CHEBI:58349",
+ "http://identifiers.org/chebi/CHEBI:7424",
+ "http://identifiers.org/kegg.compound/C00006",
+ "http://identifiers.org/metanetx.chemical/MNXM5",
+ "http://identifiers.org/seed.compound/cpd00006"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H25N7O17P3",
+ "id": "nadp_c",
+ "name": "Nicotinamide adenine dinucleotide phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nadph",
+ "http://identifiers.org/biocyc/META:NADPH",
+ "http://identifiers.org/chebi/CHEBI:13399",
+ "http://identifiers.org/chebi/CHEBI:13400",
+ "http://identifiers.org/chebi/CHEBI:16474",
+ "http://identifiers.org/chebi/CHEBI:21904",
+ "http://identifiers.org/chebi/CHEBI:44286",
+ "http://identifiers.org/chebi/CHEBI:57783",
+ "http://identifiers.org/chebi/CHEBI:7425",
+ "http://identifiers.org/hmdb/HMDB00221",
+ "http://identifiers.org/hmdb/HMDB00799",
+ "http://identifiers.org/hmdb/HMDB06341",
+ "http://identifiers.org/kegg.compound/C00005",
+ "http://identifiers.org/metanetx.chemical/MNXM6",
+ "http://identifiers.org/seed.compound/cpd00005"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C21H26N7O17P3",
+ "id": "nadph_c",
+ "name": "Nicotinamide adenine dinucleotide phosphate - reduced"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nh4",
+ "http://identifiers.org/biocyc/META:AMMONIA",
+ "http://identifiers.org/biocyc/META:AMMONIUM",
+ "http://identifiers.org/chebi/CHEBI:13405",
+ "http://identifiers.org/chebi/CHEBI:13406",
+ "http://identifiers.org/chebi/CHEBI:13407",
+ "http://identifiers.org/chebi/CHEBI:135980",
+ "http://identifiers.org/chebi/CHEBI:13771",
+ "http://identifiers.org/chebi/CHEBI:16134",
+ "http://identifiers.org/chebi/CHEBI:22533",
+ "http://identifiers.org/chebi/CHEBI:22534",
+ "http://identifiers.org/chebi/CHEBI:28938",
+ "http://identifiers.org/chebi/CHEBI:29337",
+ "http://identifiers.org/chebi/CHEBI:29340",
+ "http://identifiers.org/chebi/CHEBI:44269",
+ "http://identifiers.org/chebi/CHEBI:44284",
+ "http://identifiers.org/chebi/CHEBI:44404",
+ "http://identifiers.org/chebi/CHEBI:49783",
+ "http://identifiers.org/chebi/CHEBI:7434",
+ "http://identifiers.org/chebi/CHEBI:7435",
+ "http://identifiers.org/hmdb/HMDB00051",
+ "http://identifiers.org/hmdb/HMDB41827",
+ "http://identifiers.org/kegg.compound/C00014",
+ "http://identifiers.org/kegg.compound/C01342",
+ "http://identifiers.org/kegg.drug/D02915",
+ "http://identifiers.org/kegg.drug/D02916",
+ "http://identifiers.org/metanetx.chemical/MNXM15",
+ "http://identifiers.org/seed.compound/cpd00013",
+ "http://identifiers.org/seed.compound/cpd19013"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "H4N",
+ "id": "nh4_c",
+ "name": "Ammonium"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/nh4",
+ "http://identifiers.org/biocyc/META:AMMONIA",
+ "http://identifiers.org/biocyc/META:AMMONIUM",
+ "http://identifiers.org/chebi/CHEBI:13405",
+ "http://identifiers.org/chebi/CHEBI:13406",
+ "http://identifiers.org/chebi/CHEBI:13407",
+ "http://identifiers.org/chebi/CHEBI:135980",
+ "http://identifiers.org/chebi/CHEBI:13771",
+ "http://identifiers.org/chebi/CHEBI:16134",
+ "http://identifiers.org/chebi/CHEBI:22533",
+ "http://identifiers.org/chebi/CHEBI:22534",
+ "http://identifiers.org/chebi/CHEBI:28938",
+ "http://identifiers.org/chebi/CHEBI:29337",
+ "http://identifiers.org/chebi/CHEBI:29340",
+ "http://identifiers.org/chebi/CHEBI:44269",
+ "http://identifiers.org/chebi/CHEBI:44284",
+ "http://identifiers.org/chebi/CHEBI:44404",
+ "http://identifiers.org/chebi/CHEBI:49783",
+ "http://identifiers.org/chebi/CHEBI:7434",
+ "http://identifiers.org/chebi/CHEBI:7435",
+ "http://identifiers.org/hmdb/HMDB00051",
+ "http://identifiers.org/hmdb/HMDB41827",
+ "http://identifiers.org/kegg.compound/C00014",
+ "http://identifiers.org/kegg.compound/C01342",
+ "http://identifiers.org/kegg.drug/D02915",
+ "http://identifiers.org/kegg.drug/D02916",
+ "http://identifiers.org/metanetx.chemical/MNXM15",
+ "http://identifiers.org/seed.compound/cpd00013",
+ "http://identifiers.org/seed.compound/cpd19013"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "H4N",
+ "id": "nh4_e",
+ "name": "Ammonium"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/o2",
+ "http://identifiers.org/biocyc/META:OXYGEN-MOLECULE",
+ "http://identifiers.org/chebi/CHEBI:10745",
+ "http://identifiers.org/chebi/CHEBI:13416",
+ "http://identifiers.org/chebi/CHEBI:15379",
+ "http://identifiers.org/chebi/CHEBI:23833",
+ "http://identifiers.org/chebi/CHEBI:25366",
+ "http://identifiers.org/chebi/CHEBI:26689",
+ "http://identifiers.org/chebi/CHEBI:27140",
+ "http://identifiers.org/chebi/CHEBI:29097",
+ "http://identifiers.org/chebi/CHEBI:29793",
+ "http://identifiers.org/chebi/CHEBI:30491",
+ "http://identifiers.org/chebi/CHEBI:44742",
+ "http://identifiers.org/chebi/CHEBI:7860",
+ "http://identifiers.org/hmdb/HMDB01377",
+ "http://identifiers.org/kegg.compound/C00007",
+ "http://identifiers.org/kegg.drug/D00003",
+ "http://identifiers.org/metanetx.chemical/MNXM4",
+ "http://identifiers.org/seed.compound/cpd00007"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "O2",
+ "id": "o2_c",
+ "name": "O2 O2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/o2",
+ "http://identifiers.org/biocyc/META:OXYGEN-MOLECULE",
+ "http://identifiers.org/chebi/CHEBI:10745",
+ "http://identifiers.org/chebi/CHEBI:13416",
+ "http://identifiers.org/chebi/CHEBI:15379",
+ "http://identifiers.org/chebi/CHEBI:23833",
+ "http://identifiers.org/chebi/CHEBI:25366",
+ "http://identifiers.org/chebi/CHEBI:26689",
+ "http://identifiers.org/chebi/CHEBI:27140",
+ "http://identifiers.org/chebi/CHEBI:29097",
+ "http://identifiers.org/chebi/CHEBI:29793",
+ "http://identifiers.org/chebi/CHEBI:30491",
+ "http://identifiers.org/chebi/CHEBI:44742",
+ "http://identifiers.org/chebi/CHEBI:7860",
+ "http://identifiers.org/hmdb/HMDB01377",
+ "http://identifiers.org/kegg.compound/C00007",
+ "http://identifiers.org/kegg.drug/D00003",
+ "http://identifiers.org/metanetx.chemical/MNXM4",
+ "http://identifiers.org/seed.compound/cpd00007"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "O2",
+ "id": "o2_e",
+ "name": "O2 O2"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/oaa",
+ "http://identifiers.org/biocyc/META:ENOL-OXALOACETATE",
+ "http://identifiers.org/biocyc/META:OXALACETIC_ACID",
+ "http://identifiers.org/chebi/CHEBI:12820",
+ "http://identifiers.org/chebi/CHEBI:14703",
+ "http://identifiers.org/chebi/CHEBI:16452",
+ "http://identifiers.org/chebi/CHEBI:24958",
+ "http://identifiers.org/chebi/CHEBI:24959",
+ "http://identifiers.org/chebi/CHEBI:25731",
+ "http://identifiers.org/chebi/CHEBI:25734",
+ "http://identifiers.org/chebi/CHEBI:29049",
+ "http://identifiers.org/chebi/CHEBI:30744",
+ "http://identifiers.org/chebi/CHEBI:7812",
+ "http://identifiers.org/hmdb/HMDB00223",
+ "http://identifiers.org/kegg.compound/C00036",
+ "http://identifiers.org/kegg.compound/C03981",
+ "http://identifiers.org/lipidmaps/LMFA01170061",
+ "http://identifiers.org/lipidmaps/LMFA01170120",
+ "http://identifiers.org/metanetx.chemical/MNXM46",
+ "http://identifiers.org/seed.compound/cpd00032",
+ "http://identifiers.org/seed.compound/cpd02469"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H2O5",
+ "id": "oaa_c",
+ "name": "Oxaloacetate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pep",
+ "http://identifiers.org/biocyc/META:PHOSPHO-ENOL-PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14812",
+ "http://identifiers.org/chebi/CHEBI:18021",
+ "http://identifiers.org/chebi/CHEBI:26054",
+ "http://identifiers.org/chebi/CHEBI:26055",
+ "http://identifiers.org/chebi/CHEBI:44894",
+ "http://identifiers.org/chebi/CHEBI:44897",
+ "http://identifiers.org/chebi/CHEBI:58702",
+ "http://identifiers.org/chebi/CHEBI:8147",
+ "http://identifiers.org/hmdb/HMDB00263",
+ "http://identifiers.org/kegg.compound/C00074",
+ "http://identifiers.org/metanetx.chemical/MNXM73",
+ "http://identifiers.org/seed.compound/cpd00061"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H2O6P",
+ "id": "pep_c",
+ "name": "Phosphoenolpyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pi",
+ "http://identifiers.org/biocyc/META:CPD-16459",
+ "http://identifiers.org/biocyc/META:CPD-9010",
+ "http://identifiers.org/biocyc/META:PHOSPHATE-GROUP",
+ "http://identifiers.org/biocyc/META:Pi",
+ "http://identifiers.org/chebi/CHEBI:14791",
+ "http://identifiers.org/chebi/CHEBI:18367",
+ "http://identifiers.org/chebi/CHEBI:26078",
+ "http://identifiers.org/chebi/CHEBI:29137",
+ "http://identifiers.org/chebi/CHEBI:29139",
+ "http://identifiers.org/chebi/CHEBI:35780",
+ "http://identifiers.org/chebi/CHEBI:39739",
+ "http://identifiers.org/chebi/CHEBI:39745",
+ "http://identifiers.org/chebi/CHEBI:43470",
+ "http://identifiers.org/chebi/CHEBI:43474",
+ "http://identifiers.org/chebi/CHEBI:45024",
+ "http://identifiers.org/chebi/CHEBI:7793",
+ "http://identifiers.org/hmdb/HMDB00973",
+ "http://identifiers.org/hmdb/HMDB01429",
+ "http://identifiers.org/hmdb/HMDB02105",
+ "http://identifiers.org/hmdb/HMDB02142",
+ "http://identifiers.org/hmdb/HMDB05947",
+ "http://identifiers.org/kegg.compound/C00009",
+ "http://identifiers.org/kegg.compound/C13558",
+ "http://identifiers.org/kegg.drug/D05467",
+ "http://identifiers.org/metanetx.chemical/MNXM9",
+ "http://identifiers.org/seed.compound/cpd00009",
+ "http://identifiers.org/seed.compound/cpd27787"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "HO4P",
+ "id": "pi_c",
+ "name": "Phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pi",
+ "http://identifiers.org/biocyc/META:CPD-16459",
+ "http://identifiers.org/biocyc/META:CPD-9010",
+ "http://identifiers.org/biocyc/META:PHOSPHATE-GROUP",
+ "http://identifiers.org/biocyc/META:Pi",
+ "http://identifiers.org/chebi/CHEBI:14791",
+ "http://identifiers.org/chebi/CHEBI:18367",
+ "http://identifiers.org/chebi/CHEBI:26078",
+ "http://identifiers.org/chebi/CHEBI:29137",
+ "http://identifiers.org/chebi/CHEBI:29139",
+ "http://identifiers.org/chebi/CHEBI:35780",
+ "http://identifiers.org/chebi/CHEBI:39739",
+ "http://identifiers.org/chebi/CHEBI:39745",
+ "http://identifiers.org/chebi/CHEBI:43470",
+ "http://identifiers.org/chebi/CHEBI:43474",
+ "http://identifiers.org/chebi/CHEBI:45024",
+ "http://identifiers.org/chebi/CHEBI:7793",
+ "http://identifiers.org/hmdb/HMDB00973",
+ "http://identifiers.org/hmdb/HMDB01429",
+ "http://identifiers.org/hmdb/HMDB02105",
+ "http://identifiers.org/hmdb/HMDB02142",
+ "http://identifiers.org/hmdb/HMDB05947",
+ "http://identifiers.org/kegg.compound/C00009",
+ "http://identifiers.org/kegg.compound/C13558",
+ "http://identifiers.org/kegg.drug/D05467",
+ "http://identifiers.org/metanetx.chemical/MNXM9",
+ "http://identifiers.org/seed.compound/cpd00009",
+ "http://identifiers.org/seed.compound/cpd27787"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "HO4P",
+ "id": "pi_e",
+ "name": "Phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pyr",
+ "http://identifiers.org/biocyc/META:PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14987",
+ "http://identifiers.org/chebi/CHEBI:15361",
+ "http://identifiers.org/chebi/CHEBI:26462",
+ "http://identifiers.org/chebi/CHEBI:26466",
+ "http://identifiers.org/chebi/CHEBI:32816",
+ "http://identifiers.org/chebi/CHEBI:45253",
+ "http://identifiers.org/chebi/CHEBI:86354",
+ "http://identifiers.org/chebi/CHEBI:8685",
+ "http://identifiers.org/hmdb/HMDB00243",
+ "http://identifiers.org/hmdb/HMDB62676",
+ "http://identifiers.org/kegg.compound/C00022",
+ "http://identifiers.org/lipidmaps/LMFA01060077",
+ "http://identifiers.org/metanetx.chemical/MNXM23",
+ "http://identifiers.org/seed.compound/cpd00020"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C3H3O3",
+ "id": "pyr_c",
+ "name": "Pyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/pyr",
+ "http://identifiers.org/biocyc/META:PYRUVATE",
+ "http://identifiers.org/chebi/CHEBI:14987",
+ "http://identifiers.org/chebi/CHEBI:15361",
+ "http://identifiers.org/chebi/CHEBI:26462",
+ "http://identifiers.org/chebi/CHEBI:26466",
+ "http://identifiers.org/chebi/CHEBI:32816",
+ "http://identifiers.org/chebi/CHEBI:45253",
+ "http://identifiers.org/chebi/CHEBI:86354",
+ "http://identifiers.org/chebi/CHEBI:8685",
+ "http://identifiers.org/hmdb/HMDB00243",
+ "http://identifiers.org/hmdb/HMDB62676",
+ "http://identifiers.org/kegg.compound/C00022",
+ "http://identifiers.org/lipidmaps/LMFA01060077",
+ "http://identifiers.org/metanetx.chemical/MNXM23",
+ "http://identifiers.org/seed.compound/cpd00020"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C3H3O3",
+ "id": "pyr_e",
+ "name": "Pyruvate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/q8",
+ "http://identifiers.org/biocyc/META:UBIQUINONE-8",
+ "http://identifiers.org/chebi/CHEBI:61683",
+ "http://identifiers.org/kegg.compound/C17569",
+ "http://identifiers.org/lipidmaps/LMPR02010005",
+ "http://identifiers.org/metanetx.chemical/MNXM232",
+ "http://identifiers.org/seed.compound/cpd15560"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C49H74O4",
+ "id": "q8_c",
+ "name": "Ubiquinone-8"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/q8h2",
+ "http://identifiers.org/biocyc/META:CPD-9956",
+ "http://identifiers.org/chebi/CHEBI:61682",
+ "http://identifiers.org/hmdb/HMDB01060",
+ "http://identifiers.org/metanetx.chemical/MNXM191",
+ "http://identifiers.org/seed.compound/cpd15561",
+ "http://identifiers.org/seed.compound/cpd29608"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C49H76O4",
+ "id": "q8h2_c",
+ "name": "Ubiquinol-8"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/r5p",
+ "http://identifiers.org/biocyc/META:CPD-15318",
+ "http://identifiers.org/chebi/CHEBI:10270",
+ "http://identifiers.org/chebi/CHEBI:12331",
+ "http://identifiers.org/chebi/CHEBI:18189",
+ "http://identifiers.org/chebi/CHEBI:22413",
+ "http://identifiers.org/kegg.compound/C03736",
+ "http://identifiers.org/metanetx.chemical/MNXM15900",
+ "http://identifiers.org/seed.compound/cpd19028"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "r5p_c",
+ "name": "Alpha-D-Ribose 5-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/ru5p__D",
+ "http://identifiers.org/biocyc/META:RIBULOSE-5P",
+ "http://identifiers.org/chebi/CHEBI:13018",
+ "http://identifiers.org/chebi/CHEBI:13040",
+ "http://identifiers.org/chebi/CHEBI:17363",
+ "http://identifiers.org/chebi/CHEBI:21088",
+ "http://identifiers.org/chebi/CHEBI:26572",
+ "http://identifiers.org/chebi/CHEBI:37455",
+ "http://identifiers.org/chebi/CHEBI:40192",
+ "http://identifiers.org/chebi/CHEBI:4243",
+ "http://identifiers.org/chebi/CHEBI:58121",
+ "http://identifiers.org/hmdb/HMDB00618",
+ "http://identifiers.org/hmdb/HMDB02033",
+ "http://identifiers.org/hmdb/HMDB02694",
+ "http://identifiers.org/kegg.compound/C00199",
+ "http://identifiers.org/metanetx.chemical/MNXM145",
+ "http://identifiers.org/seed.compound/cpd00171"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "ru5p__D_c",
+ "name": "D-Ribulose 5-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/s7p",
+ "http://identifiers.org/biocyc/META:D-SEDOHEPTULOSE-7-P",
+ "http://identifiers.org/chebi/CHEBI:15073",
+ "http://identifiers.org/chebi/CHEBI:15074",
+ "http://identifiers.org/chebi/CHEBI:15721",
+ "http://identifiers.org/chebi/CHEBI:26621",
+ "http://identifiers.org/chebi/CHEBI:4244",
+ "http://identifiers.org/chebi/CHEBI:57483",
+ "http://identifiers.org/chebi/CHEBI:9083",
+ "http://identifiers.org/hmdb/HMDB01068",
+ "http://identifiers.org/hmdb/HMDB62754",
+ "http://identifiers.org/kegg.compound/C05382",
+ "http://identifiers.org/metanetx.chemical/MNXM271",
+ "http://identifiers.org/seed.compound/cpd00238"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C7H13O10P",
+ "id": "s7p_c",
+ "name": "Sedoheptulose 7-phosphate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succ",
+ "http://identifiers.org/biocyc/META:SUC",
+ "http://identifiers.org/chebi/CHEBI:132287",
+ "http://identifiers.org/chebi/CHEBI:15125",
+ "http://identifiers.org/chebi/CHEBI:15741",
+ "http://identifiers.org/chebi/CHEBI:22941",
+ "http://identifiers.org/chebi/CHEBI:22943",
+ "http://identifiers.org/chebi/CHEBI:26803",
+ "http://identifiers.org/chebi/CHEBI:26807",
+ "http://identifiers.org/chebi/CHEBI:30031",
+ "http://identifiers.org/chebi/CHEBI:30779",
+ "http://identifiers.org/chebi/CHEBI:45639",
+ "http://identifiers.org/chebi/CHEBI:90372",
+ "http://identifiers.org/chebi/CHEBI:9304",
+ "http://identifiers.org/hmdb/HMDB00254",
+ "http://identifiers.org/kegg.compound/C00042",
+ "http://identifiers.org/lipidmaps/LMFA01170043",
+ "http://identifiers.org/metanetx.chemical/MNXM25",
+ "http://identifiers.org/seed.compound/cpd00036"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C4H4O4",
+ "id": "succ_c",
+ "name": "Succinate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succ",
+ "http://identifiers.org/biocyc/META:SUC",
+ "http://identifiers.org/chebi/CHEBI:132287",
+ "http://identifiers.org/chebi/CHEBI:15125",
+ "http://identifiers.org/chebi/CHEBI:15741",
+ "http://identifiers.org/chebi/CHEBI:22941",
+ "http://identifiers.org/chebi/CHEBI:22943",
+ "http://identifiers.org/chebi/CHEBI:26803",
+ "http://identifiers.org/chebi/CHEBI:26807",
+ "http://identifiers.org/chebi/CHEBI:30031",
+ "http://identifiers.org/chebi/CHEBI:30779",
+ "http://identifiers.org/chebi/CHEBI:45639",
+ "http://identifiers.org/chebi/CHEBI:90372",
+ "http://identifiers.org/chebi/CHEBI:9304",
+ "http://identifiers.org/hmdb/HMDB00254",
+ "http://identifiers.org/kegg.compound/C00042",
+ "http://identifiers.org/lipidmaps/LMFA01170043",
+ "http://identifiers.org/metanetx.chemical/MNXM25",
+ "http://identifiers.org/seed.compound/cpd00036"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "e",
+ "formula": "C4H4O4",
+ "id": "succ_e",
+ "name": "Succinate"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/succoa",
+ "http://identifiers.org/biocyc/META:SUC-COA",
+ "http://identifiers.org/chebi/CHEBI:10746",
+ "http://identifiers.org/chebi/CHEBI:15127",
+ "http://identifiers.org/chebi/CHEBI:15380",
+ "http://identifiers.org/chebi/CHEBI:26811",
+ "http://identifiers.org/chebi/CHEBI:45541",
+ "http://identifiers.org/chebi/CHEBI:57292",
+ "http://identifiers.org/chebi/CHEBI:9310",
+ "http://identifiers.org/hmdb/HMDB01022",
+ "http://identifiers.org/kegg.compound/C00091",
+ "http://identifiers.org/lipidmaps/LMFA07050370",
+ "http://identifiers.org/metanetx.chemical/MNXM92",
+ "http://identifiers.org/seed.compound/cpd00078"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C25H35N7O19P3S",
+ "id": "succoa_c",
+ "name": "Succinyl-CoA"
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.metabolite/xu5p__D",
+ "http://identifiers.org/biocyc/META:XYLULOSE-5-PHOSPHATE",
+ "http://identifiers.org/chebi/CHEBI:13036",
+ "http://identifiers.org/chebi/CHEBI:16332",
+ "http://identifiers.org/chebi/CHEBI:21121",
+ "http://identifiers.org/chebi/CHEBI:27354",
+ "http://identifiers.org/chebi/CHEBI:4269",
+ "http://identifiers.org/chebi/CHEBI:57737",
+ "http://identifiers.org/hmdb/HMDB00868",
+ "http://identifiers.org/hmdb/HMDB06212",
+ "http://identifiers.org/kegg.compound/C00231",
+ "http://identifiers.org/metanetx.chemical/MNXM186",
+ "http://identifiers.org/seed.compound/cpd00198"
+ ]
+ }
+ ]
+ }
+ },
+ "charge": 0,
+ "compartment": "c",
+ "formula": "C5H9O8P",
+ "id": "xu5p__D_c",
+ "name": "D-Xylulose 5-phosphate"
+ }
+ ],
+ "name": "Escherichia coli str. K-12 substr. MG1655",
+ "notes": {
+ "For specific licensing terms about this particular model and regulations of commercial use, see\n this model in BiGG Models knowledge-base.",
+ "Redistribution and use of any part of this model from BiGG Models knowledge-base, with or without modification, are permitted provided that the following conditions are met": "\n - Redistributions of this SBML file must retain the above copyright notice, this list of conditions and the following disclaimer.
\n - Redistributions in a different form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided\n with the distribution.
\n
This model is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.",
+ "This is a metabolism model of Escherichia coli str. K-12 substr. MG1655 in\n SBML\u00a0format."
+ },
+ "reactions": [
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACALD",
+ "http://identifiers.org/biocyc/META:ACETALD-DEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.2.1.10",
+ "http://identifiers.org/kegg.reaction/R00228",
+ "http://identifiers.org/metanetx.reaction/MNXR95210",
+ "http://identifiers.org/rhea/23288",
+ "http://identifiers.org/rhea/23289",
+ "http://identifiers.org/rhea/23290",
+ "http://identifiers.org/rhea/23291"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0351 or b1241",
+ "id": "ACALD",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": -1.0,
+ "accoa_c": 1.0,
+ "coa_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0
+ },
+ "name": "Acetaldehyde dehydrogenase (acetylating)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACALDt",
+ "http://identifiers.org/metanetx.reaction/MNXR95212"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "ACALDt",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": 1.0,
+ "acald_e": -1.0
+ },
+ "name": "Acetaldehyde reversible transport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACKr",
+ "http://identifiers.org/biocyc/META:ACETATEKIN-RXN",
+ "http://identifiers.org/ec-code/2.7.2.1",
+ "http://identifiers.org/ec-code/2.7.2.15",
+ "http://identifiers.org/kegg.reaction/R00315",
+ "http://identifiers.org/metanetx.reaction/MNXR95269",
+ "http://identifiers.org/rhea/11352",
+ "http://identifiers.org/rhea/11353",
+ "http://identifiers.org/rhea/11354",
+ "http://identifiers.org/rhea/11355"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2296 or b3115 or b1849",
+ "id": "ACKr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ac_c": -1.0,
+ "actp_c": 1.0,
+ "adp_c": 1.0,
+ "atp_c": -1.0
+ },
+ "name": "Acetate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACONTa",
+ "http://identifiers.org/biocyc/META:ACONITATEDEHYDR-RXN",
+ "http://identifiers.org/ec-code/4.2.1.3",
+ "http://identifiers.org/kegg.reaction/R01325",
+ "http://identifiers.org/metanetx.reaction/MNXR95386",
+ "http://identifiers.org/rhea/10228",
+ "http://identifiers.org/rhea/10229",
+ "http://identifiers.org/rhea/10230",
+ "http://identifiers.org/rhea/10231"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0118 or b1276",
+ "id": "ACONTa",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acon_C_c": 1.0,
+ "cit_c": -1.0,
+ "h2o_c": 1.0
+ },
+ "name": "Aconitase (half-reaction A, Citrate hydro-lyase)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACONTb",
+ "http://identifiers.org/ec-code/4.2.1.3",
+ "http://identifiers.org/kegg.reaction/R01900",
+ "http://identifiers.org/metanetx.reaction/MNXR95387",
+ "http://identifiers.org/rhea/22144",
+ "http://identifiers.org/rhea/22145",
+ "http://identifiers.org/rhea/22146",
+ "http://identifiers.org/rhea/22147"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0118 or b1276",
+ "id": "ACONTb",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acon_C_c": -1.0,
+ "h2o_c": -1.0,
+ "icit_c": 1.0
+ },
+ "name": "Aconitase (half-reaction B, Isocitrate hydro-lyase)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ACt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-571",
+ "http://identifiers.org/metanetx.reaction/MNXR95429"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "ACt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ac_c": 1.0,
+ "ac_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Acetate reversible transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ADK1",
+ "http://identifiers.org/biocyc/META:ADENYL-KIN-RXN",
+ "http://identifiers.org/ec-code/2.7.4.3",
+ "http://identifiers.org/kegg.reaction/R00127",
+ "http://identifiers.org/metanetx.reaction/MNXR95450",
+ "http://identifiers.org/rhea/12973",
+ "http://identifiers.org/rhea/12974",
+ "http://identifiers.org/rhea/12975",
+ "http://identifiers.org/rhea/12976"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0474",
+ "id": "ADK1",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": 2.0,
+ "amp_c": -1.0,
+ "atp_c": -1.0
+ },
+ "name": "Adenylate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/AKGDH",
+ "http://identifiers.org/biocyc/META:2OXOGLUTARATEDEH-RXN",
+ "http://identifiers.org/ec-code/1.2.1.52",
+ "http://identifiers.org/ec-code/1.2.4.2",
+ "http://identifiers.org/ec-code/1.8.1.4",
+ "http://identifiers.org/ec-code/2.3.1.61",
+ "http://identifiers.org/kegg.reaction/R08549",
+ "http://identifiers.org/metanetx.reaction/MNXR95655",
+ "http://identifiers.org/rhea/27786",
+ "http://identifiers.org/rhea/27787",
+ "http://identifiers.org/rhea/27788",
+ "http://identifiers.org/rhea/27789"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0726 and b0116 and b0727",
+ "id": "AKGDH",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_c": -1.0,
+ "co2_c": 1.0,
+ "coa_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "succoa_c": 1.0
+ },
+ "name": "2-Oxogluterate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/AKGt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-23",
+ "http://identifiers.org/metanetx.reaction/MNXR95661",
+ "http://identifiers.org/rhea/29011",
+ "http://identifiers.org/rhea/29012",
+ "http://identifiers.org/rhea/29013",
+ "http://identifiers.org/rhea/29014"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2587",
+ "id": "AKGt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "akg_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "2 oxoglutarate reversible transport via symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ALCD2x",
+ "http://identifiers.org/biocyc/META:ALCOHOL-DEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.1.1.1",
+ "http://identifiers.org/ec-code/1.1.1.71",
+ "http://identifiers.org/kegg.reaction/R00754",
+ "http://identifiers.org/metanetx.reaction/MNXR95725",
+ "http://identifiers.org/rhea/25290",
+ "http://identifiers.org/rhea/25291",
+ "http://identifiers.org/rhea/25292",
+ "http://identifiers.org/rhea/25293"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1478 or b0356 or b1241",
+ "id": "ALCD2x",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "acald_c": 1.0,
+ "etoh_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0
+ },
+ "name": "Alcohol dehydrogenase (ethanol)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ATPM",
+ "http://identifiers.org/biocyc/META:ATPASE-RXN",
+ "http://identifiers.org/ec-code/3.6.1.15",
+ "http://identifiers.org/ec-code/3.6.1.3",
+ "http://identifiers.org/ec-code/3.6.1.5",
+ "http://identifiers.org/ec-code/3.6.1.8",
+ "http://identifiers.org/ec-code/3.6.3.1",
+ "http://identifiers.org/ec-code/3.6.3.10",
+ "http://identifiers.org/ec-code/3.6.3.11",
+ "http://identifiers.org/ec-code/3.6.3.12",
+ "http://identifiers.org/ec-code/3.6.3.14",
+ "http://identifiers.org/ec-code/3.6.3.15",
+ "http://identifiers.org/ec-code/3.6.3.16",
+ "http://identifiers.org/ec-code/3.6.3.17",
+ "http://identifiers.org/ec-code/3.6.3.18",
+ "http://identifiers.org/ec-code/3.6.3.19",
+ "http://identifiers.org/ec-code/3.6.3.2",
+ "http://identifiers.org/ec-code/3.6.3.20",
+ "http://identifiers.org/ec-code/3.6.3.21",
+ "http://identifiers.org/ec-code/3.6.3.22",
+ "http://identifiers.org/ec-code/3.6.3.23",
+ "http://identifiers.org/ec-code/3.6.3.24",
+ "http://identifiers.org/ec-code/3.6.3.25",
+ "http://identifiers.org/ec-code/3.6.3.26",
+ "http://identifiers.org/ec-code/3.6.3.27",
+ "http://identifiers.org/ec-code/3.6.3.28",
+ "http://identifiers.org/ec-code/3.6.3.29",
+ "http://identifiers.org/ec-code/3.6.3.3",
+ "http://identifiers.org/ec-code/3.6.3.30",
+ "http://identifiers.org/ec-code/3.6.3.31",
+ "http://identifiers.org/ec-code/3.6.3.32",
+ "http://identifiers.org/ec-code/3.6.3.33",
+ "http://identifiers.org/ec-code/3.6.3.34",
+ "http://identifiers.org/ec-code/3.6.3.35",
+ "http://identifiers.org/ec-code/3.6.3.36",
+ "http://identifiers.org/ec-code/3.6.3.37",
+ "http://identifiers.org/ec-code/3.6.3.38",
+ "http://identifiers.org/ec-code/3.6.3.39",
+ "http://identifiers.org/ec-code/3.6.3.4",
+ "http://identifiers.org/ec-code/3.6.3.40",
+ "http://identifiers.org/ec-code/3.6.3.41",
+ "http://identifiers.org/ec-code/3.6.3.42",
+ "http://identifiers.org/ec-code/3.6.3.43",
+ "http://identifiers.org/ec-code/3.6.3.44",
+ "http://identifiers.org/ec-code/3.6.3.46",
+ "http://identifiers.org/ec-code/3.6.3.47",
+ "http://identifiers.org/ec-code/3.6.3.48",
+ "http://identifiers.org/ec-code/3.6.3.49",
+ "http://identifiers.org/ec-code/3.6.3.5",
+ "http://identifiers.org/ec-code/3.6.3.50",
+ "http://identifiers.org/ec-code/3.6.3.51",
+ "http://identifiers.org/ec-code/3.6.3.52",
+ "http://identifiers.org/ec-code/3.6.3.53",
+ "http://identifiers.org/ec-code/3.6.3.54",
+ "http://identifiers.org/ec-code/3.6.3.6",
+ "http://identifiers.org/ec-code/3.6.3.7",
+ "http://identifiers.org/ec-code/3.6.3.8",
+ "http://identifiers.org/ec-code/3.6.3.9",
+ "http://identifiers.org/ec-code/3.6.4.1",
+ "http://identifiers.org/ec-code/3.6.4.10",
+ "http://identifiers.org/ec-code/3.6.4.11",
+ "http://identifiers.org/ec-code/3.6.4.12",
+ "http://identifiers.org/ec-code/3.6.4.13",
+ "http://identifiers.org/ec-code/3.6.4.2",
+ "http://identifiers.org/ec-code/3.6.4.3",
+ "http://identifiers.org/ec-code/3.6.4.4",
+ "http://identifiers.org/ec-code/3.6.4.5",
+ "http://identifiers.org/ec-code/3.6.4.6",
+ "http://identifiers.org/ec-code/3.6.4.7",
+ "http://identifiers.org/ec-code/3.6.4.8",
+ "http://identifiers.org/ec-code/3.6.4.9",
+ "http://identifiers.org/kegg.reaction/R00086",
+ "http://identifiers.org/metanetx.reaction/MNXR96131",
+ "http://identifiers.org/rhea/13065",
+ "http://identifiers.org/rhea/13066",
+ "http://identifiers.org/rhea/13067",
+ "http://identifiers.org/rhea/13068"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000630"
+ },
+ "gene_reaction_rule": "",
+ "id": "ATPM",
+ "lower_bound": 8.39,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "pi_c": 1.0
+ },
+ "name": "ATP maintenance requirement",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ATPS4r",
+ "http://identifiers.org/biocyc/META:ATPSYN-RXN",
+ "http://identifiers.org/ec-code/3.6.3.14",
+ "http://identifiers.org/metanetx.reaction/MNXR96136"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b3738 and b3736 and b3737 and b3735 and b3733 and b3731 and b3732 and b3734 ) or ( b3734 and b3732 and b3731 and b3733 and b3735 and b3737 and b3736 and b3738 and b3739 )",
+ "id": "ATPS4r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": -1.0,
+ "atp_c": 1.0,
+ "h2o_c": 1.0,
+ "h_c": 3.0,
+ "h_e": -4.0,
+ "pi_c": -1.0
+ },
+ "name": "ATP synthase (four protons for one ATP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/Ecoli_core_w_GAM"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000629"
+ },
+ "gene_reaction_rule": "",
+ "id": "BIOMASS_Ecoli_core_w_GAM",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "3pg_c": -1.496,
+ "accoa_c": -3.7478,
+ "adp_c": 59.81,
+ "akg_c": 4.1182,
+ "atp_c": -59.81,
+ "coa_c": 3.7478,
+ "e4p_c": -0.361,
+ "f6p_c": -0.0709,
+ "g3p_c": -0.129,
+ "g6p_c": -0.205,
+ "gln__L_c": -0.2557,
+ "glu__L_c": -4.9414,
+ "h2o_c": -59.81,
+ "h_c": 59.81,
+ "nad_c": -3.547,
+ "nadh_c": 3.547,
+ "nadp_c": 13.0279,
+ "nadph_c": -13.0279,
+ "oaa_c": -1.7867,
+ "pep_c": -0.5191,
+ "pi_c": 59.81,
+ "pyr_c": -2.8328,
+ "r5p_c": -0.8977
+ },
+ "name": "Biomass Objective Function with GAM",
+ "objective_coefficient": 1.0,
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CO2t",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-545",
+ "http://identifiers.org/metanetx.reaction/MNXR96810"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "CO2t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "co2_e": -1.0
+ },
+ "name": "CO2 transporter via diffusion",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CS",
+ "http://identifiers.org/biocyc/META:CITSYN-RXN",
+ "http://identifiers.org/biocyc/META:RXN-14905",
+ "http://identifiers.org/ec-code/2.3.3.1",
+ "http://identifiers.org/ec-code/2.3.3.16",
+ "http://identifiers.org/ec-code/2.3.3.3",
+ "http://identifiers.org/kegg.reaction/R00351",
+ "http://identifiers.org/metanetx.reaction/MNXR96920",
+ "http://identifiers.org/rhea/16845",
+ "http://identifiers.org/rhea/16846",
+ "http://identifiers.org/rhea/16847",
+ "http://identifiers.org/rhea/16848"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0720",
+ "id": "CS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "cit_c": 1.0,
+ "coa_c": 1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "oaa_c": -1.0
+ },
+ "name": "Citrate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/CYTBD",
+ "http://identifiers.org/metanetx.reaction/MNXR97031"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b0978 and b0979 ) or ( b0733 and b0734 )",
+ "id": "CYTBD",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h2o_c": 1.0,
+ "h_c": -2.0,
+ "h_e": 2.0,
+ "o2_c": -0.5,
+ "q8_c": 1.0,
+ "q8h2_c": -1.0
+ },
+ "name": "Cytochrome oxidase bd (ubiquinol-8: 2 protons)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/D_LACt2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-515",
+ "http://identifiers.org/metanetx.reaction/MNXR97838"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2975 or b3603",
+ "id": "D_LACt2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "lac__D_c": 1.0,
+ "lac__D_e": -1.0
+ },
+ "name": "D lactate transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ENO",
+ "http://identifiers.org/biocyc/META:2PGADEHYDRAT-RXN",
+ "http://identifiers.org/ec-code/4.2.1.11",
+ "http://identifiers.org/kegg.reaction/R00658",
+ "http://identifiers.org/metanetx.reaction/MNXR97932",
+ "http://identifiers.org/rhea/10164",
+ "http://identifiers.org/rhea/10165",
+ "http://identifiers.org/rhea/10166",
+ "http://identifiers.org/rhea/10167"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2779",
+ "id": "ENO",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "2pg_c": -1.0,
+ "h2o_c": 1.0,
+ "pep_c": 1.0
+ },
+ "name": "Enolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ETOHt2r",
+ "http://identifiers.org/metanetx.reaction/MNXR97981"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "ETOHt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "etoh_c": 1.0,
+ "etoh_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Ethanol reversible transport via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ac"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_ac_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "ac_e": -1.0
+ },
+ "name": "Acetate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/acald"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_acald_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "acald_e": -1.0
+ },
+ "name": "Acetaldehyde exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/akg"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_akg_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_e": -1.0
+ },
+ "name": "2-Oxoglutarate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/co2"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_co2_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "co2_e": -1.0
+ },
+ "name": "CO2 exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/etoh"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_etoh_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "etoh_e": -1.0
+ },
+ "name": "Ethanol exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/for"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_for_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "for_e": -1.0
+ },
+ "name": "Formate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/fru"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_fru_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fru_e": -1.0
+ },
+ "name": "D-Fructose exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/fum"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_fum_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_e": -1.0
+ },
+ "name": "Fumarate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/glc__D"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_glc__D_e",
+ "lower_bound": -10.0,
+ "metabolites": {
+ "glc__D_e": -1.0
+ },
+ "name": "D-Glucose exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/gln__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_gln__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "gln__L_e": -1.0
+ },
+ "name": "L-Glutamine exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/glu__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_glu__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "glu__L_e": -1.0
+ },
+ "name": "L-Glutamate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/h"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_h_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_e": -1.0
+ },
+ "name": "H+ exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/h2o"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_h2o_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h2o_e": -1.0
+ },
+ "name": "H2O exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/lac__D"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_lac__D_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "lac__D_e": -1.0
+ },
+ "name": "D-lactate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/mal__L"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_mal__L_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "mal__L_e": -1.0
+ },
+ "name": "L-Malate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/nh4"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_nh4_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "nh4_e": -1.0
+ },
+ "name": "Ammonia exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/o2"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_o2_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "o2_e": -1.0
+ },
+ "name": "O2 exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/pi"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_pi_e",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "pi_e": -1.0
+ },
+ "name": "Phosphate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/pyr"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_pyr_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "pyr_e": -1.0
+ },
+ "name": "Pyruvate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/succ"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000627"
+ },
+ "gene_reaction_rule": "",
+ "id": "EX_succ_e",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "succ_e": -1.0
+ },
+ "name": "Succinate exchange",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FBA",
+ "http://identifiers.org/ec-code/4.1.2.13",
+ "http://identifiers.org/kegg.reaction/R01068",
+ "http://identifiers.org/metanetx.reaction/MNXR99459",
+ "http://identifiers.org/rhea/14729",
+ "http://identifiers.org/rhea/14730",
+ "http://identifiers.org/rhea/14731",
+ "http://identifiers.org/rhea/14732"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1773 or b2097 or b2925",
+ "id": "FBA",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "dhap_c": 1.0,
+ "fdp_c": -1.0,
+ "g3p_c": 1.0
+ },
+ "name": "Fructose-bisphosphate aldolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FBP",
+ "http://identifiers.org/ec-code/3.1.3.11",
+ "http://identifiers.org/metanetx.reaction/MNXR99465",
+ "http://identifiers.org/rhea/11064",
+ "http://identifiers.org/rhea/11065",
+ "http://identifiers.org/rhea/11066",
+ "http://identifiers.org/rhea/11067"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3925 or b4232",
+ "id": "FBP",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "fdp_c": -1.0,
+ "h2o_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Fructose-bisphosphatase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FORt2",
+ "http://identifiers.org/metanetx.reaction/MNXR99621"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0904 or b2492",
+ "id": "FORt2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "for_c": 1.0,
+ "for_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "Formate transport in via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FORt",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-1",
+ "http://identifiers.org/metanetx.reaction/MNXR99620",
+ "http://identifiers.org/rhea/29679",
+ "http://identifiers.org/rhea/29680",
+ "http://identifiers.org/rhea/29681",
+ "http://identifiers.org/rhea/29682"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0904 or b2492",
+ "id": "FORt",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "for_c": 1.0,
+ "for_e": -1.0
+ },
+ "name": "Formate transport via diffusion",
+ "upper_bound": 0.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FRD7",
+ "http://identifiers.org/metanetx.reaction/MNXR99641",
+ "http://identifiers.org/rhea/29187",
+ "http://identifiers.org/rhea/29188",
+ "http://identifiers.org/rhea/29189",
+ "http://identifiers.org/rhea/29190"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4153 and b4151 and b4152 and b4154",
+ "id": "FRD7",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": -1.0,
+ "q8_c": 1.0,
+ "q8h2_c": -1.0,
+ "succ_c": 1.0
+ },
+ "name": "Fumarate reductase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FRUpts2",
+ "http://identifiers.org/metanetx.reaction/MNXR99662"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2415 and b1818 and b1817 and b1819 and b2416",
+ "id": "FRUpts2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "fru_e": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Fructose transport via PEP:Pyr PTS (f6p generating)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FUM",
+ "http://identifiers.org/biocyc/META:FUMHYDR-RXN",
+ "http://identifiers.org/ec-code/4.2.1.2",
+ "http://identifiers.org/kegg.reaction/R01082",
+ "http://identifiers.org/metanetx.reaction/MNXR99705",
+ "http://identifiers.org/rhea/12460",
+ "http://identifiers.org/rhea/12461",
+ "http://identifiers.org/rhea/12462",
+ "http://identifiers.org/rhea/12463"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4122 or b1612 or b1611",
+ "id": "FUM",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "fum_c": -1.0,
+ "h2o_c": -1.0,
+ "mal__L_c": 1.0
+ },
+ "name": "Fumarase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/FUMt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121B",
+ "http://identifiers.org/metanetx.reaction/MNXR99711",
+ "http://identifiers.org/rhea/29331",
+ "http://identifiers.org/rhea/29332",
+ "http://identifiers.org/rhea/29333",
+ "http://identifiers.org/rhea/29334"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "FUMt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": 1.0,
+ "fum_e": -1.0,
+ "h_c": 2.0,
+ "h_e": -2.0
+ },
+ "name": "Fumarate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/G6PDH2r",
+ "http://identifiers.org/biocyc/META:GLU6PDEHYDROG-RXN",
+ "http://identifiers.org/ec-code/1.1.1.363",
+ "http://identifiers.org/ec-code/1.1.1.49",
+ "http://identifiers.org/kegg.reaction/R00835",
+ "http://identifiers.org/metanetx.reaction/MNXR99907",
+ "http://identifiers.org/rhea/15841",
+ "http://identifiers.org/rhea/15842",
+ "http://identifiers.org/rhea/15843",
+ "http://identifiers.org/rhea/15844"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1852",
+ "id": "G6PDH2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "6pgl_c": 1.0,
+ "g6p_c": -1.0,
+ "h_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "Glucose 6-phosphate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GAPD",
+ "http://identifiers.org/biocyc/META:GAPOXNPHOSPHN-RXN",
+ "http://identifiers.org/ec-code/1.2.1.12",
+ "http://identifiers.org/ec-code/1.2.1.59",
+ "http://identifiers.org/kegg.reaction/R01061",
+ "http://identifiers.org/metanetx.reaction/MNXR100040",
+ "http://identifiers.org/rhea/10300",
+ "http://identifiers.org/rhea/10301",
+ "http://identifiers.org/rhea/10302",
+ "http://identifiers.org/rhea/10303"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1779",
+ "id": "GAPD",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "13dpg_c": 1.0,
+ "g3p_c": -1.0,
+ "h_c": 1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pi_c": -1.0
+ },
+ "name": "Glyceraldehyde-3-phosphate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLCpts",
+ "http://identifiers.org/metanetx.reaction/MNXR100237"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b2415 and b1818 and b1817 and b1819 and b2416 ) or ( b2415 and b2417 and b1101 and b2416 ) or ( b2415 and b2417 and b1621 and b2416 )",
+ "id": "GLCpts",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "g6p_c": 1.0,
+ "glc__D_e": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "D-glucose transport via PEP:Pyr PTS",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLNS",
+ "http://identifiers.org/biocyc/META:GLUTAMINESYN-RXN",
+ "http://identifiers.org/ec-code/6.3.1.2",
+ "http://identifiers.org/kegg.reaction/R00253",
+ "http://identifiers.org/metanetx.reaction/MNXR100024",
+ "http://identifiers.org/rhea/16169",
+ "http://identifiers.org/rhea/16170",
+ "http://identifiers.org/rhea/16171",
+ "http://identifiers.org/rhea/16172"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3870 or b1297",
+ "id": "GLNS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "gln__L_c": 1.0,
+ "glu__L_c": -1.0,
+ "h_c": 1.0,
+ "nh4_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Glutamine synthetase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLNabc",
+ "http://identifiers.org/biocyc/META:ABC-12-RXN",
+ "http://identifiers.org/ec-code/3.6.3.21",
+ "http://identifiers.org/metanetx.reaction/MNXR100258",
+ "http://identifiers.org/rhea/29895#1",
+ "http://identifiers.org/rhea/29896#1",
+ "http://identifiers.org/rhea/29897#1",
+ "http://identifiers.org/rhea/29898#1"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0810 and b0811 and b0809",
+ "id": "GLNabc",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "gln__L_c": 1.0,
+ "gln__L_e": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "pi_c": 1.0
+ },
+ "name": "L-glutamine transport via ABC system",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUDy",
+ "http://identifiers.org/biocyc/META:GLUTDEHYD-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/ec-code/1.4.1.3",
+ "http://identifiers.org/ec-code/1.4.1.4",
+ "http://identifiers.org/kegg.reaction/R00248",
+ "http://identifiers.org/metanetx.reaction/MNXR100086",
+ "http://identifiers.org/rhea/11612",
+ "http://identifiers.org/rhea/11613",
+ "http://identifiers.org/rhea/11614",
+ "http://identifiers.org/rhea/11615"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1761",
+ "id": "GLUDy",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "glu__L_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "nh4_c": 1.0
+ },
+ "name": "Glutamate dehydrogenase (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUN",
+ "http://identifiers.org/biocyc/META:GLUTAMIN-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/ec-code/1.4.7.1",
+ "http://identifiers.org/ec-code/3.5.1.2",
+ "http://identifiers.org/ec-code/3.5.1.38",
+ "http://identifiers.org/ec-code/4.3.3.6",
+ "http://identifiers.org/ec-code/6.3.4.2",
+ "http://identifiers.org/ec-code/6.3.5.2",
+ "http://identifiers.org/ec-code/6.3.5.4",
+ "http://identifiers.org/ec-code/6.3.5.5",
+ "http://identifiers.org/kegg.reaction/R00256",
+ "http://identifiers.org/metanetx.reaction/MNXR100030",
+ "http://identifiers.org/rhea/15889",
+ "http://identifiers.org/rhea/15890",
+ "http://identifiers.org/rhea/15891",
+ "http://identifiers.org/rhea/15892"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0485 or b1812 or b1524",
+ "id": "GLUN",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "gln__L_c": -1.0,
+ "glu__L_c": 1.0,
+ "h2o_c": -1.0,
+ "nh4_c": 1.0
+ },
+ "name": "Glutaminase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUSy",
+ "http://identifiers.org/biocyc/META:GLUTAMATESYN-RXN",
+ "http://identifiers.org/ec-code/1.4.1.13",
+ "http://identifiers.org/kegg.reaction/R00114",
+ "http://identifiers.org/metanetx.reaction/MNXR100291",
+ "http://identifiers.org/rhea/15501",
+ "http://identifiers.org/rhea/15502",
+ "http://identifiers.org/rhea/15503",
+ "http://identifiers.org/rhea/15504"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3212 and b3213",
+ "id": "GLUSy",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "akg_c": -1.0,
+ "gln__L_c": -1.0,
+ "glu__L_c": 2.0,
+ "h_c": -1.0,
+ "nadp_c": 1.0,
+ "nadph_c": -1.0
+ },
+ "name": "Glutamate synthase (NADPH)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GLUt2r",
+ "http://identifiers.org/metanetx.reaction/MNXR100300"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4077",
+ "id": "GLUt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "glu__L_c": 1.0,
+ "glu__L_e": -1.0,
+ "h_c": 1.0,
+ "h_e": -1.0
+ },
+ "name": "L glutamate transport via proton symport reversible",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/GND",
+ "http://identifiers.org/biocyc/META:RXN-9952",
+ "http://identifiers.org/ec-code/1.1.1.351",
+ "http://identifiers.org/ec-code/1.1.1.44",
+ "http://identifiers.org/kegg.reaction/R01528",
+ "http://identifiers.org/metanetx.reaction/MNXR100389",
+ "http://identifiers.org/rhea/10116",
+ "http://identifiers.org/rhea/10117",
+ "http://identifiers.org/rhea/10118",
+ "http://identifiers.org/rhea/10119"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2029",
+ "id": "GND",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "6pgc_c": -1.0,
+ "co2_c": 1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "ru5p__D_c": 1.0
+ },
+ "name": "Phosphogluconate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/H2Ot",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-145",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-547",
+ "http://identifiers.org/metanetx.reaction/MNXR98641",
+ "http://identifiers.org/rhea/29667",
+ "http://identifiers.org/rhea/29668",
+ "http://identifiers.org/rhea/29669",
+ "http://identifiers.org/rhea/29670"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0875 or s0001",
+ "id": "H2Ot",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h2o_c": 1.0,
+ "h2o_e": -1.0
+ },
+ "name": "H2O transport via diffusion",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ICDHyr",
+ "http://identifiers.org/ec-code/1.1.1.42",
+ "http://identifiers.org/kegg.reaction/R00267",
+ "http://identifiers.org/metanetx.reaction/MNXR100781",
+ "http://identifiers.org/rhea/19629",
+ "http://identifiers.org/rhea/19630",
+ "http://identifiers.org/rhea/19631",
+ "http://identifiers.org/rhea/19632"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1136",
+ "id": "ICDHyr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "akg_c": 1.0,
+ "co2_c": 1.0,
+ "icit_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "Isocitrate dehydrogenase (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ICL",
+ "http://identifiers.org/ec-code/4.1.3.1",
+ "http://identifiers.org/kegg.reaction/R00479",
+ "http://identifiers.org/metanetx.reaction/MNXR100789",
+ "http://identifiers.org/rhea/13245",
+ "http://identifiers.org/rhea/13246",
+ "http://identifiers.org/rhea/13247",
+ "http://identifiers.org/rhea/13248"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4015",
+ "id": "ICL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "glx_c": 1.0,
+ "icit_c": -1.0,
+ "succ_c": 1.0
+ },
+ "name": "Isocitrate lyase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/LDH_D",
+ "http://identifiers.org/biocyc/META:DLACTDEHYDROGNAD-RXN",
+ "http://identifiers.org/ec-code/1.1.1.28",
+ "http://identifiers.org/kegg.reaction/R00704",
+ "http://identifiers.org/metanetx.reaction/MNXR101037",
+ "http://identifiers.org/rhea/16369",
+ "http://identifiers.org/rhea/16370",
+ "http://identifiers.org/rhea/16371",
+ "http://identifiers.org/rhea/16372"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2133 or b1380",
+ "id": "LDH_D",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "lac__D_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "D-lactate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MALS",
+ "http://identifiers.org/biocyc/META:MALSYN-RXN",
+ "http://identifiers.org/ec-code/2.3.3.9",
+ "http://identifiers.org/kegg.reaction/R00472",
+ "http://identifiers.org/metanetx.reaction/MNXR101347",
+ "http://identifiers.org/rhea/18181",
+ "http://identifiers.org/rhea/18182",
+ "http://identifiers.org/rhea/18183",
+ "http://identifiers.org/rhea/18184"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4014 or b2976",
+ "id": "MALS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "coa_c": 1.0,
+ "glx_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "mal__L_c": 1.0
+ },
+ "name": "Malate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MALt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121A",
+ "http://identifiers.org/metanetx.reaction/MNXR101370",
+ "http://identifiers.org/rhea/29339",
+ "http://identifiers.org/rhea/29340",
+ "http://identifiers.org/rhea/29341",
+ "http://identifiers.org/rhea/29342"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "MALt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "mal__L_c": 1.0,
+ "mal__L_e": -1.0
+ },
+ "name": "Malate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/MDH",
+ "http://identifiers.org/biocyc/META:MALATE-DEH-RXN",
+ "http://identifiers.org/ec-code/1.1.1.299",
+ "http://identifiers.org/ec-code/1.1.1.37",
+ "http://identifiers.org/kegg.reaction/R00342",
+ "http://identifiers.org/metanetx.reaction/MNXR101439",
+ "http://identifiers.org/rhea/21432",
+ "http://identifiers.org/rhea/21433",
+ "http://identifiers.org/rhea/21434",
+ "http://identifiers.org/rhea/21435"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3236",
+ "id": "MDH",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "mal__L_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "oaa_c": 1.0
+ },
+ "name": "Malate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ME1",
+ "http://identifiers.org/biocyc/META:1.1.1.39-RXN",
+ "http://identifiers.org/ec-code/1.1.1.38",
+ "http://identifiers.org/ec-code/1.1.1.39",
+ "http://identifiers.org/kegg.reaction/R00214",
+ "http://identifiers.org/metanetx.reaction/MNXR101446",
+ "http://identifiers.org/rhea/12653",
+ "http://identifiers.org/rhea/12654",
+ "http://identifiers.org/rhea/12655",
+ "http://identifiers.org/rhea/12656"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1479",
+ "id": "ME1",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "mal__L_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Malic enzyme (NAD)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/ME2",
+ "http://identifiers.org/biocyc/META:MALIC-NADP-RXN",
+ "http://identifiers.org/ec-code/1.1.1.40",
+ "http://identifiers.org/kegg.reaction/R00216",
+ "http://identifiers.org/metanetx.reaction/MNXR101443",
+ "http://identifiers.org/rhea/18253",
+ "http://identifiers.org/rhea/18254",
+ "http://identifiers.org/rhea/18255",
+ "http://identifiers.org/rhea/18256"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2463",
+ "id": "ME2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": 1.0,
+ "mal__L_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Malic enzyme (NADP)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NADH16",
+ "http://identifiers.org/ec-code/1.6.5.3",
+ "http://identifiers.org/metanetx.reaction/MNXR101864"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2287 and b2285 and b2283 and b2281 and b2279 and b2277 and b2276 and b2278 and b2280 and b2282 and b2284 and b2286 and b2288",
+ "id": "NADH16",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": -4.0,
+ "h_e": 3.0,
+ "nad_c": 1.0,
+ "nadh_c": -1.0,
+ "q8_c": -1.0,
+ "q8h2_c": 1.0
+ },
+ "name": "NADH dehydrogenase (ubiquinone-8 & 3 protons)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NADTRHD",
+ "http://identifiers.org/biocyc/META:PYRNUTRANSHYDROGEN-RXN",
+ "http://identifiers.org/ec-code/1.6.1.1",
+ "http://identifiers.org/ec-code/1.6.1.2",
+ "http://identifiers.org/ec-code/1.6.1.3",
+ "http://identifiers.org/kegg.reaction/R00112",
+ "http://identifiers.org/metanetx.reaction/MNXR101898",
+ "http://identifiers.org/rhea/11692",
+ "http://identifiers.org/rhea/11693",
+ "http://identifiers.org/rhea/11694",
+ "http://identifiers.org/rhea/11695"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3962 or ( b1602 and b1603 )",
+ "id": "NADTRHD",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "nadp_c": 1.0,
+ "nadph_c": -1.0
+ },
+ "name": "NAD transhydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/NH4t",
+ "http://identifiers.org/biocyc/META:RXN-9615",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-206",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-544",
+ "http://identifiers.org/metanetx.reaction/MNXR101950",
+ "http://identifiers.org/rhea/28747",
+ "http://identifiers.org/rhea/28748",
+ "http://identifiers.org/rhea/28749",
+ "http://identifiers.org/rhea/28750"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001 or b0451",
+ "id": "NH4t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "nh4_c": 1.0,
+ "nh4_e": -1.0
+ },
+ "name": "Ammonia reversible transport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/O2t",
+ "http://identifiers.org/biocyc/META:TRANS-RXN0-474",
+ "http://identifiers.org/metanetx.reaction/MNXR102090"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "s0001",
+ "id": "O2t",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "o2_c": 1.0,
+ "o2_e": -1.0
+ },
+ "name": "O2 transport diffusion ",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PDH",
+ "http://identifiers.org/biocyc/META:PYRUVDEH-RXN",
+ "http://identifiers.org/ec-code/1.2.1.-",
+ "http://identifiers.org/ec-code/1.2.1.51",
+ "http://identifiers.org/ec-code/1.2.4.1",
+ "http://identifiers.org/ec-code/1.8.1.4",
+ "http://identifiers.org/ec-code/2.3.1.12",
+ "http://identifiers.org/kegg.reaction/R00209",
+ "http://identifiers.org/metanetx.reaction/MNXR102425",
+ "http://identifiers.org/rhea/28042",
+ "http://identifiers.org/rhea/28043",
+ "http://identifiers.org/rhea/28044",
+ "http://identifiers.org/rhea/28045"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0115 and b0114 and b0116",
+ "id": "PDH",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": 1.0,
+ "co2_c": 1.0,
+ "coa_c": -1.0,
+ "nad_c": -1.0,
+ "nadh_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Pyruvate dehydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PFK",
+ "http://identifiers.org/ec-code/2.7.1.11",
+ "http://identifiers.org/metanetx.reaction/MNXR102507",
+ "http://identifiers.org/rhea/16109",
+ "http://identifiers.org/rhea/16110",
+ "http://identifiers.org/rhea/16111",
+ "http://identifiers.org/rhea/16112"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3916 or b1723",
+ "id": "PFK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "f6p_c": -1.0,
+ "fdp_c": 1.0,
+ "h_c": 1.0
+ },
+ "name": "Phosphofructokinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PFL",
+ "http://identifiers.org/biocyc/META:PYRUVFORMLY-RXN",
+ "http://identifiers.org/ec-code/2.3.1.54",
+ "http://identifiers.org/kegg.reaction/R00212",
+ "http://identifiers.org/metanetx.reaction/MNXR102514",
+ "http://identifiers.org/rhea/11844",
+ "http://identifiers.org/rhea/11845",
+ "http://identifiers.org/rhea/11846",
+ "http://identifiers.org/rhea/11847"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "( b0902 and b3114 ) or ( b0903 and b0902 and b2579 ) or ( b0902 and b0903 ) or ( b3951 and b3952 )",
+ "id": "PFL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "accoa_c": 1.0,
+ "coa_c": -1.0,
+ "for_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Pyruvate formate lyase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGI",
+ "http://identifiers.org/biocyc/META:PGLUCISOM-RXN",
+ "http://identifiers.org/ec-code/5.3.1.9",
+ "http://identifiers.org/metanetx.reaction/MNXR102535"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4025",
+ "id": "PGI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "f6p_c": 1.0,
+ "g6p_c": -1.0
+ },
+ "name": "Glucose-6-phosphate isomerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGK",
+ "http://identifiers.org/biocyc/META:PHOSGLYPHOS-RXN",
+ "http://identifiers.org/ec-code/2.7.2.3",
+ "http://identifiers.org/kegg.reaction/R01512",
+ "http://identifiers.org/metanetx.reaction/MNXR102538",
+ "http://identifiers.org/rhea/14801",
+ "http://identifiers.org/rhea/14802",
+ "http://identifiers.org/rhea/14803",
+ "http://identifiers.org/rhea/14804"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2926",
+ "id": "PGK",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "13dpg_c": 1.0,
+ "3pg_c": -1.0,
+ "adp_c": 1.0,
+ "atp_c": -1.0
+ },
+ "name": "Phosphoglycerate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGL",
+ "http://identifiers.org/biocyc/META:6PGLUCONOLACT-RXN",
+ "http://identifiers.org/ec-code/3.1.1.31",
+ "http://identifiers.org/kegg.reaction/R02035",
+ "http://identifiers.org/metanetx.reaction/MNXR102539",
+ "http://identifiers.org/rhea/12556",
+ "http://identifiers.org/rhea/12557",
+ "http://identifiers.org/rhea/12558",
+ "http://identifiers.org/rhea/12559"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0767",
+ "id": "PGL",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "6pgc_c": 1.0,
+ "6pgl_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0
+ },
+ "name": "6-phosphogluconolactonase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PGM",
+ "http://identifiers.org/biocyc/META:3PGAREARR-RXN",
+ "http://identifiers.org/biocyc/META:RXN-15513",
+ "http://identifiers.org/ec-code/5.4.2.1",
+ "http://identifiers.org/ec-code/5.4.2.11",
+ "http://identifiers.org/ec-code/5.4.2.12",
+ "http://identifiers.org/kegg.reaction/R01518",
+ "http://identifiers.org/metanetx.reaction/MNXR102547",
+ "http://identifiers.org/rhea/15901",
+ "http://identifiers.org/rhea/15902",
+ "http://identifiers.org/rhea/15903",
+ "http://identifiers.org/rhea/15904"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b4395 or b3612 or b0755",
+ "id": "PGM",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "2pg_c": -1.0,
+ "3pg_c": 1.0
+ },
+ "name": "Phosphoglycerate mutase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PIt2r",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-114",
+ "http://identifiers.org/metanetx.reaction/MNXR102872",
+ "http://identifiers.org/rhea/29939",
+ "http://identifiers.org/rhea/29940",
+ "http://identifiers.org/rhea/29941",
+ "http://identifiers.org/rhea/29942"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2987 or b3493",
+ "id": "PIt2r",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "pi_c": 1.0,
+ "pi_e": -1.0
+ },
+ "name": "Phosphate reversible transport via symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPC",
+ "http://identifiers.org/ec-code/4.1.1.31",
+ "http://identifiers.org/kegg.reaction/R00345",
+ "http://identifiers.org/metanetx.reaction/MNXR103096",
+ "http://identifiers.org/rhea/23072",
+ "http://identifiers.org/rhea/23073",
+ "http://identifiers.org/rhea/23074",
+ "http://identifiers.org/rhea/23075"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3956",
+ "id": "PPC",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "co2_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 1.0,
+ "oaa_c": 1.0,
+ "pep_c": -1.0,
+ "pi_c": 1.0
+ },
+ "name": "Phosphoenolpyruvate carboxylase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPCK",
+ "http://identifiers.org/biocyc/META:PEPCARBOXYKIN-RXN",
+ "http://identifiers.org/ec-code/4.1.1.49",
+ "http://identifiers.org/kegg.reaction/R00341",
+ "http://identifiers.org/metanetx.reaction/MNXR103099",
+ "http://identifiers.org/rhea/18617",
+ "http://identifiers.org/rhea/18618",
+ "http://identifiers.org/rhea/18619",
+ "http://identifiers.org/rhea/18620"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3403",
+ "id": "PPCK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "co2_c": 1.0,
+ "oaa_c": -1.0,
+ "pep_c": 1.0
+ },
+ "name": "Phosphoenolpyruvate carboxykinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PPS",
+ "http://identifiers.org/biocyc/META:PEPSYNTH-RXN",
+ "http://identifiers.org/ec-code/2.7.9.2",
+ "http://identifiers.org/kegg.reaction/R00199",
+ "http://identifiers.org/metanetx.reaction/MNXR103140",
+ "http://identifiers.org/rhea/11364",
+ "http://identifiers.org/rhea/11365",
+ "http://identifiers.org/rhea/11366",
+ "http://identifiers.org/rhea/11367"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1702",
+ "id": "PPS",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "amp_c": 1.0,
+ "atp_c": -1.0,
+ "h2o_c": -1.0,
+ "h_c": 2.0,
+ "pep_c": 1.0,
+ "pi_c": 1.0,
+ "pyr_c": -1.0
+ },
+ "name": "Phosphoenolpyruvate synthase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PTAr",
+ "http://identifiers.org/biocyc/META:PHOSACETYLTRANS-RXN",
+ "http://identifiers.org/ec-code/2.3.1.8",
+ "http://identifiers.org/kegg.reaction/R00230",
+ "http://identifiers.org/metanetx.reaction/MNXR103319",
+ "http://identifiers.org/rhea/19521",
+ "http://identifiers.org/rhea/19522",
+ "http://identifiers.org/rhea/19523",
+ "http://identifiers.org/rhea/19524"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2297 or b2458",
+ "id": "PTAr",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "accoa_c": -1.0,
+ "actp_c": 1.0,
+ "coa_c": 1.0,
+ "pi_c": -1.0
+ },
+ "name": "Phosphotransacetylase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PYK",
+ "http://identifiers.org/biocyc/META:PEPDEPHOS-RXN",
+ "http://identifiers.org/ec-code/2.7.1.40",
+ "http://identifiers.org/kegg.reaction/R00200",
+ "http://identifiers.org/metanetx.reaction/MNXR103371",
+ "http://identifiers.org/rhea/18157",
+ "http://identifiers.org/rhea/18158",
+ "http://identifiers.org/rhea/18159",
+ "http://identifiers.org/rhea/18160"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1854 or b1676",
+ "id": "PYK",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "adp_c": -1.0,
+ "atp_c": 1.0,
+ "h_c": -1.0,
+ "pep_c": -1.0,
+ "pyr_c": 1.0
+ },
+ "name": "Pyruvate kinase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/PYRt2",
+ "http://identifiers.org/metanetx.reaction/MNXR103385"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "PYRt2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "pyr_c": 1.0,
+ "pyr_e": -1.0
+ },
+ "name": "Pyruvate transport in via proton symport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/RPE",
+ "http://identifiers.org/biocyc/META:RIBULP3EPIM-RXN",
+ "http://identifiers.org/ec-code/5.1.3.1",
+ "http://identifiers.org/kegg.reaction/R01529",
+ "http://identifiers.org/metanetx.reaction/MNXR104083",
+ "http://identifiers.org/rhea/13677",
+ "http://identifiers.org/rhea/13678",
+ "http://identifiers.org/rhea/13679",
+ "http://identifiers.org/rhea/13680"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3386 or b4301",
+ "id": "RPE",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "ru5p__D_c": -1.0,
+ "xu5p__D_c": 1.0
+ },
+ "name": "Ribulose 5-phosphate 3-epimerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/RPI",
+ "http://identifiers.org/ec-code/5.3.1.6",
+ "http://identifiers.org/metanetx.reaction/MNXR104084"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2914 or b4090",
+ "id": "RPI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "r5p_c": -1.0,
+ "ru5p__D_c": 1.0
+ },
+ "name": "Ribose-5-phosphate isomerase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCCt2_2",
+ "http://identifiers.org/biocyc/META:TRANS-RXN-121",
+ "http://identifiers.org/metanetx.reaction/MNXR104620",
+ "http://identifiers.org/rhea/29303",
+ "http://identifiers.org/rhea/29304",
+ "http://identifiers.org/rhea/29305",
+ "http://identifiers.org/rhea/29306"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3528",
+ "id": "SUCCt2_2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "succ_c": 1.0,
+ "succ_e": -1.0
+ },
+ "name": "Succinate transport via proton symport (2 H)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCCt3",
+ "http://identifiers.org/metanetx.reaction/MNXR104623"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "",
+ "id": "SUCCt3",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 1.0,
+ "h_e": -1.0,
+ "succ_c": -1.0,
+ "succ_e": 1.0
+ },
+ "name": "Succinate transport out via proton antiport",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCDi",
+ "http://identifiers.org/metanetx.reaction/MNXR99641",
+ "http://identifiers.org/rhea/29187",
+ "http://identifiers.org/rhea/29188",
+ "http://identifiers.org/rhea/29189",
+ "http://identifiers.org/rhea/29190"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0723 and b0721 and b0722 and b0724",
+ "id": "SUCDi",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "fum_c": 1.0,
+ "q8_c": -1.0,
+ "q8h2_c": 1.0,
+ "succ_c": -1.0
+ },
+ "name": "Succinate dehydrogenase (irreversible)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/SUCOAS",
+ "http://identifiers.org/biocyc/META:SUCCCOASYN-RXN",
+ "http://identifiers.org/ec-code/6.2.1.5",
+ "http://identifiers.org/kegg.reaction/R00405",
+ "http://identifiers.org/metanetx.reaction/MNXR104635",
+ "http://identifiers.org/rhea/17661",
+ "http://identifiers.org/rhea/17662",
+ "http://identifiers.org/rhea/17663",
+ "http://identifiers.org/rhea/17664"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b0728 and b0729",
+ "id": "SUCOAS",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "adp_c": 1.0,
+ "atp_c": -1.0,
+ "coa_c": -1.0,
+ "pi_c": 1.0,
+ "succ_c": -1.0,
+ "succoa_c": 1.0
+ },
+ "name": "Succinyl-CoA synthetase (ADP-forming)",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TALA",
+ "http://identifiers.org/biocyc/META:TRANSALDOL-RXN",
+ "http://identifiers.org/ec-code/2.2.1.2",
+ "http://identifiers.org/kegg.reaction/R01827",
+ "http://identifiers.org/metanetx.reaction/MNXR104715",
+ "http://identifiers.org/rhea/17053",
+ "http://identifiers.org/rhea/17054",
+ "http://identifiers.org/rhea/17055",
+ "http://identifiers.org/rhea/17056"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2464 or b0008",
+ "id": "TALA",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "e4p_c": 1.0,
+ "f6p_c": 1.0,
+ "g3p_c": -1.0,
+ "s7p_c": -1.0
+ },
+ "name": "Transaldolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/THD2",
+ "http://identifiers.org/ec-code/1.6.1.1",
+ "http://identifiers.org/metanetx.reaction/MNXR104805"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b1602 and b1603",
+ "id": "THD2",
+ "lower_bound": 0.0,
+ "metabolites": {
+ "h_c": 2.0,
+ "h_e": -2.0,
+ "nad_c": 1.0,
+ "nadh_c": -1.0,
+ "nadp_c": -1.0,
+ "nadph_c": 1.0
+ },
+ "name": "NAD(P) transhydrogenase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TKT1",
+ "http://identifiers.org/ec-code/2.2.1.1",
+ "http://identifiers.org/metanetx.reaction/MNXR104868"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2935 or b2465",
+ "id": "TKT1",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "g3p_c": 1.0,
+ "r5p_c": -1.0,
+ "s7p_c": 1.0,
+ "xu5p__D_c": -1.0
+ },
+ "name": "Transketolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TKT2",
+ "http://identifiers.org/biocyc/META:2TRANSKETO-RXN",
+ "http://identifiers.org/ec-code/2.2.1.1",
+ "http://identifiers.org/kegg.reaction/R01830",
+ "http://identifiers.org/metanetx.reaction/MNXR104869",
+ "http://identifiers.org/rhea/27626",
+ "http://identifiers.org/rhea/27627",
+ "http://identifiers.org/rhea/27628",
+ "http://identifiers.org/rhea/27629"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b2935 or b2465",
+ "id": "TKT2",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "e4p_c": -1.0,
+ "f6p_c": 1.0,
+ "g3p_c": 1.0,
+ "xu5p__D_c": -1.0
+ },
+ "name": "Transketolase",
+ "upper_bound": 1000.0
+ },
+ {
+ "annotation": {
+ "cvterms": {
+ "bqb_is": [
+ {
+ "resources": [
+ "http://identifiers.org/bigg.reaction/TPI",
+ "http://identifiers.org/biocyc/META:TRIOSEPISOMERIZATION-RXN",
+ "http://identifiers.org/ec-code/5.3.1.1",
+ "http://identifiers.org/kegg.reaction/R01015",
+ "http://identifiers.org/metanetx.reaction/MNXR104918",
+ "http://identifiers.org/rhea/18585",
+ "http://identifiers.org/rhea/18586",
+ "http://identifiers.org/rhea/18587",
+ "http://identifiers.org/rhea/18588"
+ ]
+ }
+ ]
+ },
+ "sbo": "SBO:0000375"
+ },
+ "gene_reaction_rule": "b3919",
+ "id": "TPI",
+ "lower_bound": -1000.0,
+ "metabolites": {
+ "dhap_c": -1.0,
+ "g3p_c": 1.0
+ },
+ "name": "Triose-phosphate isomerase",
+ "upper_bound": 1000.0
+ }
+ ],
+ "version": "1"
+}
\ No newline at end of file
diff --git a/cobra/core/metadata/test/test_history.py b/cobra/core/metadata/test/test_history.py
new file mode 100644
index 000000000..8740d626b
--- /dev/null
+++ b/cobra/core/metadata/test/test_history.py
@@ -0,0 +1,21 @@
+from cobra.core.model import Object
+from cobra.core.metadata.history import History, Creator
+
+
+def test_create_history():
+ h = History(
+
+ )
+
+
+ assert 0 == 1
+
+def test_create_creator():
+ h = Creator(
+ first_name="Matthias",
+ last_name="Koenig",
+ organization_name="HU",
+ email="test@test.com"
+ )
+ assert h.first_name == "Matthias"
+ # FIXME: simple test;
\ No newline at end of file
diff --git a/cobra/core/metadata/examples/test_metadata.py b/cobra/core/metadata/test/test_metadata.py
similarity index 78%
rename from cobra/core/metadata/examples/test_metadata.py
rename to cobra/core/metadata/test/test_metadata.py
index 1be23d6c3..404964042 100644
--- a/cobra/core/metadata/examples/test_metadata.py
+++ b/cobra/core/metadata/test/test_metadata.py
@@ -1,40 +1,57 @@
+"""
+Tests for the metadata structures
+"""
+
from cobra.core.species import Species
from cobra.core.metadata import *
import pytest
+import os
import json
from pathlib import Path
from cobra.io import read_sbml_model, write_sbml_model, load_json_model, save_json_model
-def test_annotation_working():
+from cobra.test import data_dir
+metadata_examples_dir = Path(__file__).parent.parent / "examples"
+
+
+# FIXME: sbo terms have to be in a list;
+
+def test_annotation():
# a cobra component
s = Species()
- assert s.annotation == {} # nothing set for annotation, so empty dict
+ assert s.annotation == {} # nothing set for annotation, so empty dict
- # setting annotation via old format
+ # setting annotation via old annotation format
s.annotation["chebi"] = ["CHEBI:43215", "CHEBI:11881"]
+
+ # checking old (fixed) annotation format
assert s.annotation == {"chebi": ["CHEBI:43215", "CHEBI:11881"]}
+
+ # checking new cvterms
cvt = CVTerms({'bqb_is': [
{'resources': ['https://identifiers.org/chebi/CHEBI:43215',
'https://identifiers.org/chebi/CHEBI:11881']
}
]
- })
+ })
assert str(s.annotation.cvterms) == str(cvt) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}]}"
- # testing sbo term
+ # adding an SBO term
s.annotation["sbo"] = "SBO:0000123"
+ assert "chebi" in s.annotation
+ assert "sbo" in s.annotation
assert s.annotation == {'chebi':
['CHEBI:43215',
'CHEBI:11881'],
'sbo': 'SBO:0000123'
}
- assert "chebi" in s.annotation
- assert "sbo" in s.annotation
-
+def test_nested_annotation():
# testing via cvterms
with open(Path(__file__).parent / f"cvterms_nested.json", "r") as f_cvterms:
cvterms_data = json.load(f_cvterms)
+
+ s = Species()
s.annotation.add_cvterms(cvterms_data)
assert s.annotation == {'chebi':
['CHEBI:43215',
@@ -48,33 +65,48 @@ def test_annotation_working():
'kegg.compound':
['C00032']
}
+ # check cvterms
assert str(s.annotation.cvterms) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}], 'bqb_hasPart': [{'resources': ['https://identifiers.org/uniprot/P69905', 'https://identifiers.org/uniprot/P68871', 'https://identifiers.org/kegg.compound/C00032']}, {'resources': ['https://identifiers.org/uniprot/P69905', 'https://www.uniprot.org/uniprot/P68871', 'https://identifiers.org/chebi/CHEBI:17627'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/000000']}]}}]}"
-def test_reading_xml():
- model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
- assert model.annotation == {
- 'taxonomy': ['511145'],
- 'bigg.model': ['e_coli_core'],
- 'doi': ['10.1128/ecosalplus.10.2.1'],
- 'ncbigi': ['gi:16128336']
- }
+def _read_ecoli_annotation_model():
+ test_xml = os.path.join(data_dir, "e_coli_core_for_annotation.xml")
+ model = read_sbml_model(test_xml)
+ return model
+
+
+def test_cvterms_from_ecoli_xml():
+ model = _read_ecoli_annotation_model()
assert str(model.annotation.cvterms) == "{'bqb_hasTaxon': [{'resources': ['http://identifiers.org/taxonomy/511145']}], 'bqm_is': [{'resources': ['http://identifiers.org/bigg.model/e_coli_core'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/ECO:0000004']}]}}], 'bqm_isDescribedBy': [{'resources': ['http://identifiers.org/doi/10.1128/ecosalplus.10.2.1']}, {'resources': ['http://identifiers.org/ncbigi/gi:16128336']}]}"
+
+ # check backwards compatibility
+ assert model.annotation == {
+ 'taxonomy': ['511145'],
+ 'bigg.model': ['e_coli_core'],
+ 'doi': ['10.1128/ecosalplus.10.2.1'],
+ 'ncbigi': ['gi:16128336']
+ }
+
+
+def test_history_from_ecoli_xml():
+ model = _read_ecoli_annotation_model()
assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
-def test_writing_xml():
- model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
- assert write_sbml_model(model, "cobra/core/metadata/examples/e_coli_core_writing.xml") is None
+def test_writing_xml(tmp_path):
+ model = _read_ecoli_annotation_model()
+ assert write_sbml_model(model, tmp_path / "e_coli_core_writing.xml") is None
def test_write_json():
- model = read_sbml_model("cobra/test/data/e_coli_core_for_annotation.xml")
- assert save_json_model(model, "cobra/core/metadata/examples/e_coli_core_json_writing.json", False, True) is None
+ model = _read_ecoli_annotation_model()
+ json_path = metadata_examples_dir / "e_coli_core_json_writing.json"
+ assert save_json_model(model, json_path, sort=False, pretty=True) is None
def test_read_new_json_model():
- model = load_json_model("cobra/core/metadata/examples/e_coli_core_json_writing.json")
+ json_path = metadata_examples_dir / "e_coli_core_json_writing.json"
+ model = load_json_model(json_path)
assert model.annotation == {
'taxonomy': ['511145'],
'bigg.model': ['e_coli_core'],
@@ -86,7 +118,7 @@ def test_read_new_json_model():
def test_read_old_json_model():
- model = load_json_model("cobra/test/data/mini.json")
+ model = load_json_model(Path(data_dir) / "mini.json")
meta = model.metabolites[0]
assert meta.annotation == {
'bigg.metabolite': ['13dpg'],
diff --git a/cobra/io/json.py b/cobra/io/json.py
index ae20751bf..8a4472f9b 100644
--- a/cobra/io/json.py
+++ b/cobra/io/json.py
@@ -3,7 +3,7 @@
from __future__ import absolute_import
from six import string_types
-
+from pathlib import Path
from cobra.io.dict import model_from_dict, model_to_dict
@@ -76,7 +76,7 @@ def save_json_model(model, filename, sort=False, pretty=False, **kwargs):
----------
model : cobra.Model
The cobra model to represent.
- filename : str or file-like
+ filename : str or file-like or Path
File path or descriptor that the JSON representation should be
written to.
sort : bool, optional
@@ -105,7 +105,7 @@ def save_json_model(model, filename, sort=False, pretty=False, **kwargs):
"allow_nan": False}
dump_opts.update(**kwargs)
- if isinstance(filename, string_types):
+ if isinstance(filename, (string_types, Path)):
with open(filename, "w") as file_handle:
json.dump(obj, file_handle, **dump_opts)
else:
@@ -118,7 +118,7 @@ def load_json_model(filename):
Parameters
----------
- filename : str or file-like
+ filename : str or file-like or Path
File path or descriptor that contains the JSON document describing the
cobra model.
@@ -131,7 +131,7 @@ def load_json_model(filename):
--------
from_json : Load from a string.
"""
- if isinstance(filename, string_types):
+ if isinstance(filename, (string_types, Path)):
with open(filename, "r") as file_handle:
return model_from_dict(json.load(file_handle))
else:
From 23f96997453dcd416cc14fd80671698cb37e5156 Mon Sep 17 00:00:00 2001
From: HemantYadav
Date: Sun, 28 Jun 2020 17:02:03 +0530
Subject: [PATCH 21/76] fixing broken tests
---
cobra/core/metadata/__init__.py | 2 +-
cobra/core/metadata/cvterm.py | 24 ++-
cobra/core/metadata/history.py | 154 +++++++++++-------
cobra/core/metadata/keyvaluepair.py | 31 ++--
cobra/core/metadata/metadata.py | 13 +-
cobra/core/metadata/test/test_history.py | 65 +++++++-
cobra/core/metadata/test/test_keyvaluepair.py | 44 +++++
cobra/core/metadata/test/test_metadata.py | 26 +--
cobra/io/dict.py | 6 +-
cobra/io/sbml.py | 54 ++++--
cobra/manipulation/validate.py | 7 +-
cobra/medium/boundary_types.py | 4 +-
cobra/test/data/mini.pickle | Bin 32200 -> 79058 bytes
cobra/test/data/salmonella.pickle | Bin 2438518 -> 3294009 bytes
cobra/test/data/valid_annotation_format.json | 6 +-
cobra/test/test_io/test_annotation.py | 20 +--
cobra/test/test_io/test_annotation_format.py | 6 +-
cobra/test/test_io/test_sbml.py | 38 ++---
cobra/test/test_manipulation.py | 8 +-
cobra/test/test_medium.py | 1 +
20 files changed, 332 insertions(+), 177 deletions(-)
create mode 100644 cobra/core/metadata/test/test_keyvaluepair.py
diff --git a/cobra/core/metadata/__init__.py b/cobra/core/metadata/__init__.py
index aa443ecfe..5815e7bce 100644
--- a/cobra/core/metadata/__init__.py
+++ b/cobra/core/metadata/__init__.py
@@ -3,6 +3,6 @@
from __future__ import absolute_import
from cobra.core.metadata.cvterm import CVTerm, CVTerms, Qualifier, CVList, ExternalResources
-from cobra.core.metadata.history import History
+from cobra.core.metadata.history import History, DateTime, Creator
from cobra.core.metadata.keyvaluepair import ListOfKeyValue
from cobra.core.metadata.metadata import MetaData
diff --git a/cobra/core/metadata/cvterm.py b/cobra/core/metadata/cvterm.py
index 1b219c061..c62bfc15b 100644
--- a/cobra/core/metadata/cvterm.py
+++ b/cobra/core/metadata/cvterm.py
@@ -189,7 +189,12 @@ def add_simple_annotations(self, data: None):
for key, value in data.items():
if key == "sbo":
- self._annotations[key] = value
+ if isinstance(value, str):
+ self._annotations[key] = [value]
+ elif isinstance(value, list):
+ self._annotations[key] = value
+ else:
+ raise TypeError("'sbo' terms must be wrapped inside a list: {}".format(value))
continue
# if single identifiers are put directly as string,
@@ -205,11 +210,16 @@ def add_simple_annotations(self, data: None):
# reset the data of annotations corresponding to this key
self._annotations[key] = []
for identifier in value:
- if not isinstance(identifier, str):
- raise TypeError("The identifier passed must be of type string: {}".format(identifier))
cvterm = CVTerm()
- cvterm.uri = "https://identifiers.org/" + key + "/" + identifier
- cvterm.qualifier = Qualifier["bqb_is"]
+ if isinstance(identifier, str):
+ cvterm.uri = "https://identifiers.org/" + key + "/" + identifier
+ cvterm.qualifier = Qualifier["bqb_is"]
+ elif isinstance(identifier, list):
+ cvterm.uri = "https://identifiers.org/" + key + "/" + identifier[1]
+ cvterm.qualifier = Qualifier[identifier[0]]
+ else:
+ raise TypeError("The identifier passed must be of \
+ type string: {}".format(identifier))
self.add_cvterm(cvterm, 0)
@property
@@ -219,8 +229,8 @@ def annotations(self):
@annotations.setter
def annotations(self, value):
raise ValueError("The setting of annotation in this way "
- "is not allowed. Either use annotation.add_cvterm()"
- " or annotation.add_cvterms() to add resources.")
+ "is not allowed. Either use annotation.add_cvterm()"
+ " or annotation.add_cvterms() to add resources.")
def __getitem__(self, key):
if key not in Qualifier.__members__:
diff --git a/cobra/core/metadata/history.py b/cobra/core/metadata/history.py
index cd0b96e75..5b662d30a 100644
--- a/cobra/core/metadata/history.py
+++ b/cobra/core/metadata/history.py
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
import datetime
-from collections.abc import MutableSequence
+from typing import List
class History(object):
@@ -32,15 +32,18 @@ class History(object):
"""
- def __init__(self, creators: 'ListOfCreators' = None, created: 'str' = None,
- modified: 'ModifiedHistory' = None):
- self._creators = list() # FIXME ListOfCreators(creators)
- self._modified = list(DateTime) # ModifiedHistory(modified)
+ def __init__(self, creators: 'list' = None, created: 'DateTime' = None,
+ modified: 'list' = None):
+ if creators is None:
+ creators = []
+ self._creators: List(Creator) = list(creators)
+ if modified is None:
+ modified = []
+ self._modified: List(DateTime) = list(modified)
if created is None:
- self._created = None # DateTime
+ self._created = None
else:
- validateDate(created)
- self._created = created
+ self._created = DateTime(created)
@staticmethod
def parse_history(data) -> 'History':
@@ -62,8 +65,10 @@ def created(self):
@created.setter
def created(self, value):
- validateDate(value)
- self._created = value
+ if not isinstance(value, DateTime):
+ raise TypeError("Created date must be of type DateTime: {}".format(value))
+ else:
+ self._created = value
@property
def creators(self):
@@ -71,7 +76,10 @@ def creators(self):
@creators.setter
def creators(self, value):
- self._creators = ListOfCreators(value)
+ if not isinstance(value, list):
+ raise TypeError("Creators must be wrapped inside a list: {}".format(value))
+ else:
+ self._creators = value
@property
def modified(self):
@@ -79,7 +87,10 @@ def modified(self):
@modified.setter
def modified(self, value):
- self._modified = ModifiedHistory(value)
+ if not isinstance(value, list):
+ raise TypeError("Modified dates must be wrapped inside a list: {}".format(value))
+ else:
+ self._modified = value
def isSetHistory(self):
if self.created == None and len(self.creators) == 0 and len(self.modified) == 0:
@@ -88,12 +99,11 @@ def isSetHistory(self):
return True
def __str__(self):
- return str({"creators": self.creators, "created": self.created,
- "modified": self.modified})
+ return str({"creators": self.creators, "created": self.created.getDateString(),
+ "modified": [(modified_date.getDateString()) for modified_date in self.modified]})
def __repr__(self):
- return str({"creators": self.creators, "created": self.created,
- "modified": self.modified})
+ return self.__str__()
'''
FIXME: remove, use simple list
@@ -206,6 +216,20 @@ def __repr__(self):
class DateTime(object):
+
+ def __init__(self, date_text: 'str' = None):
+ if date_text is None:
+ date_text = "2000-01-01T00:00:00+00:00"
+ self.validateDate(date_text)
+ self._date = date_text
+
+ def getDateString(self):
+ return self._date
+
+ def setDateFromString(self, value):
+ self.validateDate(value)
+ self._date = value
+
@staticmethod
def validateDate(date_text):
"""Validate if the date format is of type w3cdtf ISO 8601"""
@@ -218,55 +242,59 @@ def validateDate(date_text):
raise ValueError(str(e))
return True
-
-# FIXME: remove
-class ModifiedHistory(MutableSequence):
- """A list extension to store modification dates. Only Restricted
- type of entries are possible.
-
- Parameters
- ----------
- modifiedList : list containing modification dates in W3CDTF ISO
- 8601 format
- """
-
- def __init__(self, modifiedList=None):
- if modifiedList is None:
- modifiedList = []
- self._sequence = list()
- if not isinstance(modifiedList, list):
- raise TypeError("The dates passed must be inside a list: {}".format(modifiedList))
- for item in modifiedList:
- if not isinstance(item, str):
- raise ValueError("Each date must be of type string: {}".format(item))
- validateDate(item)
- self._sequence.append(item)
-
- def __len__(self):
- return len(self._sequence)
-
- def __delitem__(self, index):
- del self._sequence[index]
-
- def insert(self, index, value):
- validateDate(value)
- self._sequence.insert(index, value)
-
- def append(self, value):
- validateDate(value)
- self._sequence.append(value)
-
- def __setitem__(self, index, value):
- validateDate(value)
- self._sequence[index] = value
-
- def __getitem__(self, index):
- return self._sequence[index]
-
def __str__(self):
- return str(self._sequence)
+ return self._date
def __repr__(self):
- return '{}'.format(self._sequence)
+ return self._date
+# FIXME: remove
+# class ModifiedHistory(MutableSequence):
+# """A list extension to store modification dates. Only Restricted
+# type of entries are possible.
+#
+# Parameters
+# ----------
+# modifiedList : list containing modification dates in W3CDTF ISO
+# 8601 format
+# """
+#
+# def __init__(self, modifiedList=None):
+# if modifiedList is None:
+# modifiedList = []
+# self._sequence = list()
+# if not isinstance(modifiedList, list):
+# raise TypeError("The dates passed must be inside a list: {}".format(modifiedList))
+# for item in modifiedList:
+# if not isinstance(item, str):
+# raise ValueError("Each date must be of type string: {}".format(item))
+# validateDate(item)
+# self._sequence.append(item)
+#
+# def __len__(self):
+# return len(self._sequence)
+#
+# def __delitem__(self, index):
+# del self._sequence[index]
+#
+# def insert(self, index, value):
+# validateDate(value)
+# self._sequence.insert(index, value)
+#
+# def append(self, value):
+# validateDate(value)
+# self._sequence.append(value)
+#
+# def __setitem__(self, index, value):
+# validateDate(value)
+# self._sequence[index] = value
+#
+# def __getitem__(self, index):
+# return self._sequence[index]
+#
+# def __str__(self):
+# return str(self._sequence)
+#
+# def __repr__(self):
+# return '{}'.format(self._sequence)
diff --git a/cobra/core/metadata/keyvaluepair.py b/cobra/core/metadata/keyvaluepair.py
index e922dc973..e3f292482 100644
--- a/cobra/core/metadata/keyvaluepair.py
+++ b/cobra/core/metadata/keyvaluepair.py
@@ -25,7 +25,7 @@ def __init__(self, keyvaluelist=None):
if isinstance(item, KeyValueDict):
self._sequence.append(item)
elif isinstance(item, dict):
- self._sequence.append(KeyValueDict(item))
+ self._sequence.append(KeyValueDict(**item))
else:
raise TypeError("The data passed for KeyValuepair "
"indexed %s has invalid format"
@@ -48,7 +48,7 @@ def insert(self, index, value):
if isinstance(value, KeyValueDict):
self._sequence.insert(index, value)
elif isinstance(value, dict):
- self._sequence.insert(index, KeyValueDict(value))
+ self._sequence.insert(index, KeyValueDict(**value))
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format: {}".format(value))
@@ -57,7 +57,7 @@ def append(self, value):
if isinstance(value, KeyValueDict):
self._sequence.append(value)
elif isinstance(value, dict):
- self._sequence.append(KeyValueDict(value))
+ self._sequence.append(KeyValueDict(**value))
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format: {}".format(value))
@@ -66,7 +66,7 @@ def __setitem__(self, index, value):
if isinstance(value, KeyValueDict):
self._sequence[index] = value
elif isinstance(value, dict):
- self._sequence[index] = KeyValueDict(value)
+ self._sequence[index] = KeyValueDict(**value)
else:
raise TypeError("The data passed for KeyValuePair "
"has invalid format: {}".format(value))
@@ -83,17 +83,13 @@ def __repr__(self):
class KeyValueDict(object):
- def __init__(self, data):
- if data is None:
- data = {}
- if isinstance(data, dict):
- self._key = data["key"] if "key" in data else None
- self._value = data["value"] if "value" in data else None
- self._uri = data["uri"] if "uri" in data else None
- self._id = data["id"] if "id" in data else None
- self._name = data["name"] if "name" in data else None
- else:
- raise TypeError("Invalid format passed for KeyValueDict: {}".format(data))
+ def __init__(self, id: str = None, name: str = None, key: str = None,
+ value: str = None, uri: str = None):
+ self._key = key
+ self._value = value
+ self._uri = uri
+ self._id = id
+ self._name = name
@staticmethod
def parse_keyValueDict(data) -> 'KeyValueDict':
@@ -103,7 +99,7 @@ def parse_keyValueDict(data) -> 'KeyValueDict':
elif isinstance(data, KeyValueDict):
return data
elif isinstance(data, dict):
- return KeyValueDict(data)
+ return KeyValueDict(**data)
else:
raise TypeError("Invalid format for KeyValueDict: '{}'".format(data))
@@ -167,5 +163,4 @@ def __str__(self):
"value": self.value, "uri": self.uri})
def __repr__(self):
- return str({"id": self.id, "name": self.name, "key": self.key,
- "value": self.value, "uri": self.uri})
+ return self.__str__()
diff --git a/cobra/core/metadata/metadata.py b/cobra/core/metadata/metadata.py
index 11262ac28..c3e3c0076 100644
--- a/cobra/core/metadata/metadata.py
+++ b/cobra/core/metadata/metadata.py
@@ -60,13 +60,20 @@ def annotations(self):
return self.cvterms.annotations
def __getitem__(self, key):
+ if key == "sbo" and len(self.annotations[key]) == 0:
+ value = self._cvterms._annotations[key]
+ del self._cvterms._annotations[key]
+ return value
return self.annotations[key]
def __setitem__(self, key, value):
if key == "sbo":
- # FIXME: list
- self.annotations[key] = value
- return
+ if isinstance(value, str):
+ self._cvterms._annotations[key] = [value]
+ elif isinstance(value, list):
+ self._cvterms._annotations[key] = value
+ else:
+ raise TypeError("'sbo' terms must be wrapped inside a list: {}".format(value))
else:
self._cvterms.add_simple_annotations({key: value})
diff --git a/cobra/core/metadata/test/test_history.py b/cobra/core/metadata/test/test_history.py
index 8740d626b..0c50aeb74 100644
--- a/cobra/core/metadata/test/test_history.py
+++ b/cobra/core/metadata/test/test_history.py
@@ -1,21 +1,70 @@
-from cobra.core.model import Object
-from cobra.core.metadata.history import History, Creator
+import pytest
+from cobra.core.metadata.history import History, Creator, DateTime
+from cobra.io import read_sbml_model
+import os
+from pathlib import Path
-def test_create_history():
- h = History(
+from cobra.test import data_dir
+metadata_examples_dir = Path(__file__).parent.parent / "examples"
+
+def _read_ecoli_annotation_model():
+ test_xml = os.path.join(data_dir, "e_coli_core_for_annotation.xml")
+ model = read_sbml_model(test_xml)
+ return model
+def test_create_history():
+ history = History(
+ creators = [
+ {
+ "first_name" : "Matthias",
+ "last_name" : "Koenig",
+ "organization_name" : "HU",
+ "email" : "test@test.com"
+ },
+ {
+ "first_name" : "Andreas",
+ "last_name" : "Draeger",
+ "organization_name" : "University of Tübingen",
+ "email" : "test2@test2.com"
+ }
+ ],
+ created = "2020-06-26T02:34:30+05:30",
+ modified = [
+ "2020-06-26T12:34:11+00:00",
+ "2020-06-26T00:34:11+05:30"
+ ]
)
+ assert len(history.creators) == 2
+ assert type(history.created) == DateTime
+ assert history.created.getDateString() == "2020-06-26T02:34:30+05:30"
+ assert len(history.modified) == 2
- assert 0 == 1
+def test_history_from_ecoli_xml():
+ model = _read_ecoli_annotation_model()
+ assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
+
def test_create_creator():
- h = Creator(
+ creator = Creator(
first_name="Matthias",
last_name="Koenig",
organization_name="HU",
email="test@test.com"
)
- assert h.first_name == "Matthias"
- # FIXME: simple test;
\ No newline at end of file
+ assert creator.first_name == "Matthias"
+ assert creator.last_name == "Koenig"
+ assert creator.email == "test@test.com"
+ assert creator.organization_name == "HU"
+
+
+def test_DateTime():
+ # valid date
+ date = DateTime("2020-06-26T02:34:11+05:30")
+ assert date.getDateString() == "2020-06-26T02:34:11+05:30"
+ # invalid date
+ with pytest.raises(ValueError):
+ date.setDateFromString("2020-06-26T02:34:70+05:30")
+ # valid date
+ assert date.setDateFromString("2020-06-26T12:34:11+00:00") is None
diff --git a/cobra/core/metadata/test/test_keyvaluepair.py b/cobra/core/metadata/test/test_keyvaluepair.py
new file mode 100644
index 000000000..8db0251cc
--- /dev/null
+++ b/cobra/core/metadata/test/test_keyvaluepair.py
@@ -0,0 +1,44 @@
+import pytest
+
+from cobra.core.metadata.keyvaluepair import ListOfKeyValue, KeyValueDict
+
+
+def test_keyvaluedict():
+ keyvaluedict = KeyValueDict.parse_keyValueDict(
+ {
+ "id": "KV_id",
+ "name": "abc_xyz",
+ "key": "keyX",
+ "value": "45",
+ "uri": "https://tinyurl.com/ybyr7b62"
+ }
+ )
+ assert keyvaluedict.id == "KV_id"
+ assert keyvaluedict.name == "abc_xyz"
+ assert keyvaluedict.key == "keyX"
+ assert keyvaluedict.value == "45"
+ assert keyvaluedict.uri == "https://tinyurl.com/ybyr7b62"
+ with pytest.raises(TypeError):
+ keyvaluedict.value = 45
+
+
+def test_listofKeyValue():
+ listofkeyvalue = ListOfKeyValue(
+ [
+ {
+ "id": "KV_id",
+ "name": "abc_xyz",
+ "key": "keyX",
+ "value": "45",
+ "uri": "https://tinyurl.com/ybyr7b62"
+ },
+ {
+ "id": "KV_id2",
+ "name": "abc_xyz2",
+ "key": "keyY",
+ "value": "48",
+ "uri": "https://tinyurl2.com/ybyr7b62"
+ }
+ ]
+ )
+ assert len(listofkeyvalue) == 2
diff --git a/cobra/core/metadata/test/test_metadata.py b/cobra/core/metadata/test/test_metadata.py
index 404964042..6e85dd4c4 100644
--- a/cobra/core/metadata/test/test_metadata.py
+++ b/cobra/core/metadata/test/test_metadata.py
@@ -14,8 +14,6 @@
metadata_examples_dir = Path(__file__).parent.parent / "examples"
-# FIXME: sbo terms have to be in a list;
-
def test_annotation():
# a cobra component
s = Species()
@@ -37,13 +35,13 @@ def test_annotation():
assert str(s.annotation.cvterms) == str(cvt) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}]}"
# adding an SBO term
- s.annotation["sbo"] = "SBO:0000123"
+ s.annotation["sbo"] = ["SBO:0000123"]
assert "chebi" in s.annotation
assert "sbo" in s.annotation
assert s.annotation == {'chebi':
['CHEBI:43215',
'CHEBI:11881'],
- 'sbo': 'SBO:0000123'
+ 'sbo': ['SBO:0000123']
}
def test_nested_annotation():
@@ -53,20 +51,17 @@ def test_nested_annotation():
s = Species()
s.annotation.add_cvterms(cvterms_data)
- assert s.annotation == {'chebi':
- ['CHEBI:43215',
- 'CHEBI:11881',
- 'CHEBI:17627'],
- 'sbo': 'SBO:0000123',
- 'uniprot':
+ assert s.annotation == {'uniprot':
['P69905',
'P68871',
'P69905'],
'kegg.compound':
- ['C00032']
+ ['C00032'],
+ 'chebi':
+ ['CHEBI:17627']
}
# check cvterms
- assert str(s.annotation.cvterms) == "{'bqb_is': [{'resources': ['https://identifiers.org/chebi/CHEBI:43215', 'https://identifiers.org/chebi/CHEBI:11881']}], 'bqb_hasPart': [{'resources': ['https://identifiers.org/uniprot/P69905', 'https://identifiers.org/uniprot/P68871', 'https://identifiers.org/kegg.compound/C00032']}, {'resources': ['https://identifiers.org/uniprot/P69905', 'https://www.uniprot.org/uniprot/P68871', 'https://identifiers.org/chebi/CHEBI:17627'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/000000']}]}}]}"
+ assert str(s.annotation.cvterms) == "{'bqb_hasPart': [{'resources': ['https://identifiers.org/uniprot/P69905', 'https://identifiers.org/uniprot/P68871', 'https://identifiers.org/kegg.compound/C00032']}, {'resources': ['https://identifiers.org/uniprot/P69905', 'https://www.uniprot.org/uniprot/P68871', 'https://identifiers.org/chebi/CHEBI:17627'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/000000']}]}}]}"
def _read_ecoli_annotation_model():
@@ -88,11 +83,6 @@ def test_cvterms_from_ecoli_xml():
}
-def test_history_from_ecoli_xml():
- model = _read_ecoli_annotation_model()
- assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
-
-
def test_writing_xml(tmp_path):
model = _read_ecoli_annotation_model()
assert write_sbml_model(model, tmp_path / "e_coli_core_writing.xml") is None
@@ -114,8 +104,6 @@ def test_read_new_json_model():
'ncbigi': ['gi:16128336']
}
assert str(model.annotation.cvterms) == "{'bqb_hasTaxon': [{'resources': ['http://identifiers.org/taxonomy/511145']}], 'bqm_is': [{'resources': ['http://identifiers.org/bigg.model/e_coli_core'], 'nested_data': {'bqb_isDescribedBy': [{'resources': ['https://identifiers.org/pubmed/1111111']}, {'resources': ['https://identifiers.org/eco/ECO:0000004']}]}}], 'bqm_isDescribedBy': [{'resources': ['http://identifiers.org/doi/10.1128/ecosalplus.10.2.1']}, {'resources': ['http://identifiers.org/ncbigi/gi:16128336']}]}"
- assert str(model.annotation.history) == "{'creators': [{'first_name': 'Matthias', 'last_name': 'Koenig', 'email': 'koenigmx@hu-berlin.de', 'organization_name': 'Humboldt-University Berlin, Institute for Theoretical Biology'}], 'created': '2019-03-06T14:40:55Z', 'modified': ['2019-03-06T14:40:55Z']}"
-
def test_read_old_json_model():
model = load_json_model(Path(data_dir) / "mini.json")
diff --git a/cobra/io/dict.py b/cobra/io/dict.py
index 21e5ea43a..ed008e789 100644
--- a/cobra/io/dict.py
+++ b/cobra/io/dict.py
@@ -87,7 +87,7 @@ def _annotation_to_dict(annotation):
final_dict["history"] = history_dict
if 'sbo' in annotation and annotation['sbo'] != []:
- final_dict['sbo'] = annotation['sbo']
+ final_dict['sbo'] = annotation['sbo'][0]
return final_dict
@@ -99,11 +99,11 @@ def _extract_annotation(data):
if cvterms is None and history is None and keyValueDict is None:
annotation = MetaData()
- annotation = data
+ annotation.cvterms.add_simple_annotations(data)
else:
annotation = MetaData(cvterms, history, keyValueDict)
if "sbo" in data:
- annotation["sbo"] = data["sbo"]
+ annotation["sbo"] = [data["sbo"]]
return annotation
diff --git a/cobra/io/sbml.py b/cobra/io/sbml.py
index 6a90b3c77..36bfc13ef 100644
--- a/cobra/io/sbml.py
+++ b/cobra/io/sbml.py
@@ -44,7 +44,8 @@
import cobra
from cobra.core import Gene, Group, Metabolite, Model, Reaction
from cobra.core.gene import parse_gpr
-from cobra.core.metadata import MetaData, CVTerm, CVTerms, Qualifier, CVList
+from cobra.core.metadata import MetaData, CVTerm, CVTerms, Qualifier, \
+ Creator, DateTime, CVList
from cobra.manipulation.validate import check_metabolite_compartment_formula
from cobra.util.solver import linear_reaction_coefficients, set_objective
@@ -1394,6 +1395,31 @@ def _sbase_notes_dict(sbase, notes):
}
+def _parse_annotation_info(uri):
+ """Parses provider and term from given identifiers annotation uri.
+ Parameters
+ ----------
+ uri : str
+ uri (identifiers.org url)
+ Returns
+ -------
+ (provider, identifier) if resolvable, None otherwise
+ """
+ match = URL_IDENTIFIERS_PATTERN.match(uri)
+ if match:
+ provider, identifier = match.group(1), match.group(2)
+ if provider.isupper():
+ identifier = "%s:%s" % (provider, identifier)
+ provider = provider.lower()
+ else:
+ LOGGER.warning("%s does not conform to "
+ "'http(s)://identifiers.org/collection/id' or"
+ "'http(s)://identifiers.org/COLLECTION:id", uri)
+ return None
+
+ return provider, identifier
+
+
def _parse_annotations(sbase):
"""Parses cobra annotations from a given SBase object.
@@ -1415,7 +1441,7 @@ def _parse_annotations(sbase):
# SBO term
if sbase.isSetSBOTerm():
- annotation["sbo"] = sbase.getSBOTermID()
+ annotation["sbo"] = [sbase.getSBOTermID()]
# RDF annotation
cvterms = sbase.getCVTerms()
@@ -1446,27 +1472,29 @@ def _parse_annotations(sbase):
cobra_creators = []
for index in range(model_history.getNumCreators()):
creator = model_history.getCreator(index) # type: libsbml.Creator
- cobra_creator = {}
+ creator_dict = {}
if creator.isSetGivenName():
- cobra_creator["first_name"] = creator.getGivenName()
+ creator_dict["first_name"] = creator.getGivenName()
if creator.isSetFamilyName():
- cobra_creator["last_name"] = creator.getFamilyName()
+ creator_dict["last_name"] = creator.getFamilyName()
if creator.isSetEmail():
- cobra_creator["email"] = creator.getEmail()
+ creator_dict["email"] = creator.getEmail()
if creator.isSetOrganisation():
- cobra_creator["organization_name"] = creator.getOrganisation()
+ creator_dict["organization_name"] = creator.getOrganisation()
+ cobra_creator = Creator.parse_creator(creator_dict)
cobra_creators.append(cobra_creator)
annotation.history.creators = cobra_creators
if model_history.isSetCreatedDate():
date = model_history.getCreatedDate() # type: libsbml.Date
- cobra_date = date.getDateAsString()
+ cobra_date = DateTime(date.getDateAsString()) # type: DateTime
annotation.history.created = cobra_date
cobra_modified_dates = []
for index in range(model_history.getNumModifiedDates()):
modified_date = model_history.getModifiedDate(index)
- cobra_modified_dates.append(modified_date.getDateAsString())
+ cobra_modified_date = DateTime(modified_date.getDateAsString())
+ cobra_modified_dates.append(cobra_modified_date)
annotation.history.modified = cobra_modified_dates
return annotation
@@ -1524,8 +1552,8 @@ def _sbase_annotations(sbase, annotation):
if 'sbo' in annotation and annotation['sbo'] != []:
sbo_term = annotation["sbo"]
- _check(sbase.setSBOTerm(sbo_term),
- "Setting SBOTerm: {}".format(sbo_term))
+ _check(sbase.setSBOTerm(sbo_term[0]),
+ "Setting SBOTerm: {}".format(sbo_term[0]))
# set metaId
meta_id = "meta_{}".format(sbase.getId())
@@ -1575,11 +1603,11 @@ def _sbase_annotations(sbase, annotation):
comp_history.addCreator(comp_creator)
if annotation.history.created is not None:
- date = libsbml.Date(annotation.history.created)
+ date = libsbml.Date(annotation.history.created.getDateString())
comp_history.setCreatedDate(date)
for modified_date in annotation.history.modified:
- date = libsbml.Date(modified_date)
+ date = libsbml.Date(modified_date.getDateString())
comp_history.addModifiedDate(date)
# finally add the compo_history
diff --git a/cobra/manipulation/validate.py b/cobra/manipulation/validate.py
index 4bca7c698..3668a095e 100644
--- a/cobra/manipulation/validate.py
+++ b/cobra/manipulation/validate.py
@@ -14,7 +14,12 @@
def check_mass_balance(model):
unbalanced = {}
for reaction in model.reactions:
- if reaction.annotation.get("sbo") not in NOT_MASS_BALANCED_TERMS:
+ sbo = reaction.annotation["sbo"]
+ if len(sbo) == 0:
+ sbo = None
+ else:
+ sbo = sbo[0]
+ if sbo not in NOT_MASS_BALANCED_TERMS:
balance = reaction.check_mass_balance()
if balance:
unbalanced[reaction] = balance
diff --git a/cobra/medium/boundary_types.py b/cobra/medium/boundary_types.py
index 3535c1219..d04ba91ef 100644
--- a/cobra/medium/boundary_types.py
+++ b/cobra/medium/boundary_types.py
@@ -103,9 +103,9 @@ def is_boundary_type(reaction, boundary_type, external_compartment):
"""
# Check if the reaction has an annotation. Annotations dominate everything.
sbo_term = reaction.annotation.get("sbo", "")
- if isinstance(sbo_term, list):
+ if isinstance(sbo_term, list) and len(sbo_term) != 0:
sbo_term = sbo_term[0]
- sbo_term = sbo_term.upper()
+ sbo_term = sbo_term.upper()
if sbo_term == sbo_terms[boundary_type]:
return True
diff --git a/cobra/test/data/mini.pickle b/cobra/test/data/mini.pickle
index 2942d27db340400e13b7f99d45a617c7e1381efe..1d49ea28d678b884de002b100327235b7e093419 100644
GIT binary patch
literal 79058
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
89D
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
JTG#o-{{bBqBjEr5
literal 32200
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
diff --git a/cobra/test/data/salmonella.pickle b/cobra/test/data/salmonella.pickle
index 6c605f5c12de1ac37a7b3293b402ffa325835e1f..c7401729c5d856833f166064bf9af9e2efae1113 100644
GIT binary patch
literal 3294009
zcmaH!Ww;zg*R{g~Lm&{`-3flqnIk#4dyokZA%qY}h6qzhfB=IJ?(XjH?(XjH?(Tf|
zTHRe#U)Otmf7Y(G-d!(!b9kVW+UeSV^5MhB?HGnFJA7OivFw;}JB=9KZ;-XoXNdzE
zlQkRv8?e>nefsnnI%=oJTKX3R=bv8#AI&*@{)4#*|xCl#H7&Vtk`-voY0H(_n`V8%r{5!l-d$8&j8_V8n!B
zI}MvKY}qmSqTe7EYm)S9^y7i1X*Q-Eu+>!he=&Ub2_wRo@s0lf=l<;f+HZ|5Hd9l-
z#&m3+zS)>zz*f_i|N7$_GxGmn^ym@8^)%!A?KEQNVG~DB*lE=83H=%~4HwviQRJgX
zjVGA7)tIH$m~~|Tku&}O|FRppeYRF(_F7|(i92r9m%r*rvTR*hcp(*|E{QuWWkO2iwbqu
z5tFtUHhSWSH34cY^nd=9Y1v&ZyA2x^`su+p-g$$3SHH%>JjEi-#-iC@ar}tJ#1UhM
zk7z75q_Oz;9rVU(ynoiG}`=Psx7|V}+i6M<8x0)%_AKA?UE{@bo+&;EukyF{(A+<>%6`}(aTX|(aE?afBVfRU5?@Au%%2DMc?
z+8Wi7m66qv{KMBda_W)#r>Lvh=pMk&Q2$W$G#dj4jGS@gOe6W(_SPE9>t{QXAKVJH
z#)=bn969Gm{Txnv6wp0FKBbtq!iwE1K
z*%%ogY*ejLFCJ{yT4Qv4urbZXSU=b}J=kvPgEg9spa&aYdawzt#>84<_x~Pjk7i@f
zRx_cUvc(6%&u)XpJ+q>D=r+Bbtv$1b{u>ER{{fh@Xpw>7rKG;Fc#=(BDmLBYo
z^uZ2oHV)H+9bS5{BU+6kYmKA+d$6OMjbqXWYpeD&j^)9Q)q@?EKiKij#tFrPo!D%g
z6d&y5TH}=B!A`9;PKytAdb4qcAM8v$*jed=o!xAlqX#>;^kC<;8t2y<7yS2N7d9Ig
zB@fowQEh8n%!6I52fHMHuuGeb%ZdlPyxF)SKG>DD##P0GU0rKj6Cdo_X5%_P*!6m_
z8`1~6vDvsu4|a3u!ER|aZml(L`|rVSZ#M2IJy^%U#+^LaoqDjl@&~)S*|?{8uzQ=0
z`{IM$Uu!&2JlKP^#zXPJ9&R=s@q<082YW1iu*aK?C-h)XmLBY>R^#bfSm)mr1V;=x|8HQtC1_GYv3mLKeGJ=iG4Q8Xx`lU>`RdpOhc0xA7?t_NgB1v;4t6Z#KRt9_-6zcM_WAMEF5;}<>HucZh3t=0Iw*7)PU2m7Ri55>A`eK@4
zDpb!Lre?uohkmO6{fj$H#ON?$WmzW|8%Oa>A_MGn@DLKRjV}Cv!N->E^`L!dz%UH@A~{&`38grWxi#O*cOa
z(Ji2w&@Je;g_J_KFttRt2tg|>iq^tnYKnA=Z{aUpj%Qlqg%>*
zmiC^EZW$-bI?3sl!_-0>TF|vS=|Cf071IozsOh>`h^|{Tq3dzmK&8<2QcHBp6STq#
zXf3R$rbxFEt{GNFOLXmRVHNdN>Mqc&Dx1-*<~^%>Pe!+flQo^>bZcR1VQsXaTgS<|
zXrx;Y(+umQrrUsp=r&YM=mxoMBc;%7OfAuELeL7EqP0*{Q=}V=Ylh9xl&-t8J8Z7L
zO5FvzEo3vgExl(e@5$)4cCw9=oNil8Eo_GtbVHnMk4Czom}b}kHQg{4qT5k5p&RbD
zos>d1f?A^6nV=PRL2F^8nj+mOTr-Dug2ZjASg^`4AwoRi(0
zIny^uTpn`?m*d$?jY|u*n2X%mXkxAyX3t%WPp6zQ(SHN#bCLf6*O(G#v#U#0E>-8Hfq-L>9xo%dvP*E_kvNlteo
zrWS5O3%Z+~+=52BTQSXW8)~}SS%~fq)r9U&x80=_y1S_*x_by(;a;>B?o(5wyC2sK
z51<(+@|csH?r}^lJb@N;Pda%DjdV|An&BDL
zbkDL7-E*o5-ScjHK`C@EQcH9%5wya~Xf3>=rbzcHt{GlK6S|IGes-^`uTpn`?hV1qx1GG>B&T~9Qw#5*1>O5jK0qVghnQyg2sPcuEJXK-YC`v^+dfkY-RIO2
z-4_I{@FiLcU#Th5eT{2|Z_tFUy}h?9e5<}n-37YuWHY+&z2^t-$>@G`@{^OC?q^Ib
z{DKyAzdHF1jdZ_bn&A)BbbqoC-CwE+-QRBeM=5mwQcHAw{wKQ0&|3H(`XAloxMr9F
zP3StRJp)5UeU-WkbW_S^bbY;ND(}hYrgqZLNlrHnrWU3}3%dSJrb8p$^q6Lt0X5x>
zEJQbxYC<=&+h$P;-K^9S-E0J{FgsccbEql)?B>KZ!(3=W$Iq@O%&opk-37XNWHY*X
zy=Ok}$>`>HvVfDEZb3{fEQA(x3p-f^jdY7*nqe{2bc?eP-2l~uZV9(7sT8`Us3p3k
z30h$pv=)|CQ>0rC*9>iFO4r@f8`{-Zsk=beA)C=vy{FTAGP*7&-A;149!xC^L<_oJ
zC(EOeZUsy;tcaR!B^IJvSv8?s#ciu9g>E%!iEed*R#*eAg*DX_>DIzE!`f&{*VEY%
z)=^)j?gHJqvKifa-m|{Z{aUpxa(HqZ{fyJ9tk*=S54>+aNB`Op*x6LqC1$N6m=j*!jhj`W_R
zyeFeO+Q~6aa=K$NwQw9-&>ipO1T@l}h-rqCP}7~vLUgC7CUmE|?KGv(olY&$ok7qF
zXQH)mmYO2n*|=sn2Tkb)wzY+G)mN#zKzE*OMt8pVT;M$!-Gxpra+1?sjH!i7(1Pw#
zCzqj-?s7~sT!EVIN*1EKN;RRo+HKb;h3;BviS9arR=6Img&Wiq>2Aa|!%e8@bS%K{
zakuw$b}u_P+^o(@-37i|WHY{7z3Vpb%J^<~a)*E^=fG-sQhk-W3v^G(
zW^_+`&okbW(LL+rIVU;Y^O#zA0WIiWbn+4!>0ZV(!z-xiUS%P=*Hja_*WLDpQs~~K
zmgwFhXoa`YT6jlIk?vhwGrWhE={myu>Z{aUp!+~Jqx;Z%KJuQ7?qesPILYZg#ni%Q
zXhHY6lP}On_a&wozCum+H4D*wqnglt>$dNdLiatjME3(hEBuJo!cS_7bU)*o;TJTa
zYwKw13BRhZQg?ywH`$EtcklVbdosE|o&4n_r~4aI3;&=6-M>!ya4s3?Cd2T1g{bK!
zXCb;NR1><2+on_sU0-U6ZYqLSm>R8xerk$z)8Lw6S~Q`nR@=KmfAv-BF3?RUo6$}0
zJu`SuMmM9AnVjTwGh=FD7PO$7)yZsVq?;Yn40E8So0Em;=2A`Q=62gWN}-#VTB4he
zpcUpvYheL3MY;uX&9D$Ey8PcO9RsTa`S;4g>a5gV;9EpC<6G3b7W1x*Z*eCBoaB5<
zU}|AWwBTFH$~-w{<9muSzZPbrQ5f7g`J5YKnY4xMmoL
zCO9)o+!#1etwq+r@?Nk%GA#U4VDRe`rCAu95
zT45Mk3p=VQ(hbKo!%k>ISMBcZ3?tN6sk=b8vusAUi}#H5o{Vmkle&|fZdXh#j7AH(
zF;2#!k!~EO8FoWW*I*&KpqkK)ciRM|&`qS4=yoS)g+0((*i%iBZW68;_Cgc7j-K9*
zu($dubrNaR&OjsGnV4oc3pL%@EJSyXYC?Ce+s;!8-TBlK-30`#a3NX?
z7pW=IU5smnOVEUlpItRvs=i9y1-i>*GrG&Y=L+x1=&p2fm6M$AYD_I$gBEnxI=K#w
zbk}2=;Re)nH?k1jO{xjq&2GCzDRj3|OLVspw8HIZE!?4|NOvc$8SX+8I^H#V!`eCo*L&{so{a8(Cl5Hu=^n(?!b505_pp;k&`9?vrWqbXP4_qp(LJG>&^_t4
zr<6kXG_^$c3_&YAi`K$(YKnBvudN
z<|LQGra!s1_JQGF
z^;POF(Dh*yEvK7|C2xmlakf0UlPR3!bQMf3OoxLjt%aG?6zOKhad3<#bk!=qD>ke8Ds>m=W|Pf+cC&lW9Nv@t
z?B;Ybmy?`sZcHuAgBEo2I++iRbn|1HVFA>13$hU1LaGVf!fsncDRhfcOLU77w8G+O
zEeudoq+0^V!7-Z9wRKcG!cyw1)Lo!kS~jCw#(S3ao{VleCv8r0x^_%0bf5)Y)k!BB
z>AEn@(2bg|hlS_{swQ;3Zd+a{bSqFxbSo0H!b)f@tgNO;w+fDfV>F@b;8i88roKwu
z1-jK`GrBdrXHDyUnL!In^M!I2`X4nxm-EbD7+etN{8{xK{l|r`*wL~|PpcO`;wNO`6q}vt8
z!7-Z9b$0Z0g)!=@)Loz(E1Ui7#(B?f-jmTaoCGI1-FQqbOh5~|iB5J$Bi$aDX4n%o
z-6R&G+ey9?s960?h1ldxDu^}tJDf|;w(%p_}hC5Kx-N{09
zcc~_Hcf0K#rO@3=Ez#Xa&H4vx`;uC04uS9n-`mAVUbkH}_pk9yBz
z-jmTi?&Jw4Io*?(T6hXA=$>}+3>xX4#WcfnsOg?(A-We-6S^1O_L5TQUZ$4lULk0O
zSJ7H{O-+&RbsPuBXhPS~S#1w*s;^Raf$lBYjP7mkdB=M)x_6zt=Om|lA5#k-patEB
zPCh~--N%?__yjfGrz}MGnQB7!x!b-_3f-5~65Uq>t?)Hk3*V?I(tV5L;22Hl+B=wo
z`(AyOx(jqa$Yyjude2YZlhOU`HcORx_?v?
zx_{l)hj(DnO-3!z{g0p(CPx`7R8yp@;5ax&6FPo&)zDXcmAVUbQ^{s@Q+rQ8@5$(<
zaWbuwoUT8n7N$cBy6K(FfJV9*G0YgErkk0C=w?w(=w@}>Y)YYVho
zQ>2?4$H6gLrt1jvs;^Rafo?w8jBbAKS-^WTx&@sqZ{aUpzD;)
z=(@b8+j}y)9w!5x>DQj3+nQRU+lHVOwnZ5$R8yoIg5%&AP3ZUq
zP~92}!5T`#{jpQye{-37YcWiz@xyk}4E$>=6I
z*~>{zw>PF1_CX7}rjvcqNVgw`8AH@`2e1&`fvO4JL2f%(DReDriS7`BRyY)8tWZsn
z?rqrK-C@5$(nb#k1OobGr`Eu4TBbSFAF35|3oW0)~S
zO?N5_(VeE6(4FqKGn7JiCbdL&7C|eVjWSlKrbu@#j)P+~rR!mq>U{N8>Mqb-Ae+%$
z=sg#CPeymKlS`cBbeCdk;WD(KyWGhYXr#Lm!;B$nx~o};?i$sE?pn89rxd#DsU^A_
z2wLGrl(9lJMY@}D92=tvT?fDQ5N=gprS1aVZL%5N?cQ^T_hfW;I=Rb9PIot^7Vbd{
zx_h16heo>lG0YgErhAZu=pIr{=pJ_4BTAurlv<*DjGz@BM;R+rQ>1$m$FVV*&{aE_
z$9Y9LL6JLf1Z!bMp_?SE;)|_mONy_p$eU;yoGN
zr%pa|lGA;Tsf91lg6>NvU!jriYYa1nsOi3CA-eBW6T0u+_JdOBex#P@ej;dvpHapN
z)fDM|#c^zmCUn)_j^6OQ`YLr7=>Cw+=>GJczq}`-``gJsPI9_`F}2W#KeJcRO~#rb
zLp0J&j$y_SHC=^;=%!Rn==!>CDy7g(O)b&&BWQ(bP{s6zTfoI5tKTy7qzm8ew|%
zRq8I#%^;i6&FDQdc~3?+vy)kz