Source code for glypy.io.wurcs.node_type
import re
from collections import namedtuple
from six import string_types as basestring
from glypy.composition import Composition
from glypy.structure import substituent as _substituent
from glypy.io.tree_builder_utils import try_int
from .carbon_descriptors import CarbonDescriptors
from .substituent_conversion import alin_to_substituent, substituent_to_alin
_NodeTypeSpec = namedtuple("NodeTypeSpec", [
"carbon_descriptor",
"substituents"
])
[docs]class NodeTypeSpec(_NodeTypeSpec):
@classmethod
def parse(cls, text, version_number):
if version_number < 2.0:
raise TypeError("Cannot parse type version earlier than 2.0")
parts = text.split("_")
skeleton_anomer = parts[0]
substituents = []
if len(parts) > 1:
ring_specification_or_substituents = parts[1]
if re.match(r"[0-9\-1?]+-[0-9\-1?]+", ring_specification_or_substituents):
ring_specification = ring_specification_or_substituents
else:
ring_specification = '?-?'
substituents.append(ring_specification_or_substituents)
else:
ring_specification = '?-?'
substituents.extend(parts[2:])
try:
skeleton, anomer = skeleton_anomer.split("-")
except Exception:
skeleton = skeleton_anomer
anomer = (-1, None)
ring_start, ring_end = map(try_int, ring_specification.split("-"))
anomeric_position, anomer_type = anomer
return cls(CarbonDescriptors(skeleton, anomer_type, anomeric_position, ring_start, ring_end),
cls.translate_substituents(substituents))
@classmethod
def from_monosaccharide(cls, monosaccharide):
descriptors = CarbonDescriptors.from_monosaccharide(monosaccharide)
substituents = []
for position, substituent in monosaccharide.substituents():
substituents.append((position, substituent.name))
return cls(descriptors, substituents)
@classmethod
def translate_substituents(self, substituents):
result = []
for map_spec in substituents:
position = map_spec[0]
if position == "?":
position = -1
i = 1
else:
i = 0
position = ''
while map_spec[i].isdigit():
position += map_spec[i]
i += 1
position = int(position)
map_code = map_spec[1:]
record = alin_to_substituent(map_code)
result.append((position, record.name))
return result
def to_monosaccharide(self):
base = self.carbon_descriptor.to_base_type()
child_loss = Composition("H")
for position, subst in self.substituents:
try:
parent_loss = _substituent.attachment_composition_info[subst]
except KeyError:
parent_loss = _substituent.default_attachment_composition
base.add_substituent(subst, position, parent_loss=parent_loss, child_loss=child_loss)
return base
def to_res(self):
mods = []
for position, substituent in self.substituents:
alin = substituent_to_alin(substituent)
if position == -1:
position = "?"
mods.append("%s*%s" % (position, alin))
encoded = '_'.join([self.carbon_descriptor.to_backbone_code()] + mods)
return encoded
def __str__(self):
return self.to_res()
def __repr__(self):
return super(NodeTypeSpec, self).__repr__()
def __eq__(self, other):
if other is None:
return False
if isinstance(other, basestring):
return str(self) == other
if self.carbon_descriptor != other.carbon_descriptor:
return False
elif self.substituents != other.substituents:
return False
return True
def __ne__(self, other):
return not self == other
def __hash__(self):
return hash(self.carbon_descriptor)