Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/allpy/diff/aae821828b03/allpy/base.py
Дата изменения: Unknown
Дата индексирования: Sat Mar 1 14:27:50 2014
Кодировка:
allpy: allpy/base.py diff

allpy

diff allpy/base.py @ 260:aae821828b03

Moved contents of allpy._monomer to allpy.base
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Tue, 14 Dec 2010 20:51:53 +0300
parents 117b03ee9e8f
children d60628e29b24
line diff
     1.1 --- a/allpy/base.py	Tue Dec 14 20:05:13 2010 +0300
     1.2 +++ b/allpy/base.py	Tue Dec 14 20:51:53 2010 +0300
     1.3 @@ -1,5 +1,119 @@
     1.4 -import _monomer
     1.5  from fasta import save_fasta
     1.6 +import data.codes
     1.7 +
     1.8 +class MonomerType(object):
     1.9 +    """Class of monomer types.
    1.10 +
    1.11 +    Each MonomerType object represents a known monomer type, e.g. Valine,
    1.12 +    and is referenced to by each instance of monomer in a given sequence.
    1.13 +
    1.14 +    - `name`: full name of monomer type
    1.15 +    - `code1`: one-letter code
    1.16 +    - `code3`: three-letter code
    1.17 +    - `is_modified`: either of True or False
    1.18 +
    1.19 +    class atributes:
    1.20 +
    1.21 +    - `by_code1`: a mapping from one-letter code to MonomerType object
    1.22 +    - `by_code3`: a mapping from three-letter code to MonomerType object
    1.23 +    - `by_name`: a mapping from monomer name to MonomerType object
    1.24 +    - `instance_type`: class of Monomer objects to use when creating new
    1.25 +      objects; this must be redefined in descendent classes
    1.26 +
    1.27 +    All of the class attributes MUST be redefined when subclassing.
    1.28 +    """
    1.29 +
    1.30 +    by_code1 = {}
    1.31 +    by_code3 = {}
    1.32 +    by_name = {}
    1.33 +    instance_type = None
    1.34 +
    1.35 +    def __init__(self, name="", code1="", code3="", is_modified=False):
    1.36 +        self.name = name.capitalize()
    1.37 +        self.code1 = code1.upper()
    1.38 +        self.code3 = code3.upper()
    1.39 +        self.is_modified = bool(is_modified)
    1.40 +        if not is_modified:
    1.41 +            self.by_code1[self.code1] = self
    1.42 +        self.by_code3[code3] = self
    1.43 +        self.by_name[name] = self
    1.44 +        # We duplicate distinguished long names into MonomerType itself,
    1.45 +        # so that we can use MonomerType.from_code3 to create the relevant
    1.46 +        # type of monomer.
    1.47 +        MonomerType.by_code3[code3] = self
    1.48 +        MonomerType.by_name[name] = self
    1.49 +
    1.50 +    @classmethod
    1.51 +    def _initialize(cls, type_letter, codes=data.codes.codes):
    1.52 +        """Create all relevant instances of MonomerType.
    1.53 +
    1.54 +        `type_letter` is either of:
    1.55 +
    1.56 +        - 'p' for protein
    1.57 +        - 'd' for DNA
    1.58 +        - 'r' for RNA
    1.59 +
    1.60 +        `codes` is a table of monomer codes
    1.61 +        """
    1.62 +        for type, code1, is_modified, code3, name in codes:
    1.63 +            if type == type_letter:
    1.64 +                cls(name, code1, code3, is_modified)
    1.65 +
    1.66 +    @classmethod
    1.67 +    def from_code1(cls, code1):
    1.68 +        """Return monomer type by one-letter code."""
    1.69 +        return cls.by_code1[code1.upper()]
    1.70 +
    1.71 +    @classmethod
    1.72 +    def from_code3(cls, code3):
    1.73 +        """Return monomer type by three-letter code."""
    1.74 +        return cls.by_code3[code3.upper()]
    1.75 +
    1.76 +    @classmethod
    1.77 +    def from_name(cls, name):
    1.78 +        """Return monomer type by name."""
    1.79 +        return cls.by_name[name.capitalize()]
    1.80 +
    1.81 +    def instance(self):
    1.82 +        """Create a new monomer of given type."""
    1.83 +        return self.instance_type(self)
    1.84 +
    1.85 +    def __eq__(self, other):
    1.86 +        if hasattr(other, "type"):
    1.87 +            return self is other.type
    1.88 +        return self is other
    1.89 +
    1.90 +class Monomer(object):
    1.91 +    """Monomer object.
    1.92 +
    1.93 +    attributes:
    1.94 +
    1.95 +    - `type`: type of monomer (a MonomerType object)
    1.96 +
    1.97 +    class attribute `monomer_type` is MonomerType or either of it's subclasses,
    1.98 +    it is used when creating new monomers. It MUST be redefined when subclassing Monomer.
    1.99 +    """
   1.100 +    monomer_type = MonomerType
   1.101 +
   1.102 +    def __init__(self, type):
   1.103 +        self.type = type
   1.104 +
   1.105 +    @classmethod
   1.106 +    def from_code1(cls, code1):
   1.107 +        return cls(cls.monomer_type.by_code1[code1.upper()])
   1.108 +
   1.109 +    @classmethod
   1.110 +    def from_code3(cls, code3):
   1.111 +        return cls(cls.monomer_type.by_code3[code3.upper()])
   1.112 +
   1.113 +    @classmethod
   1.114 +    def from_name(cls, name):
   1.115 +        return cls(cls.monomer_type.by_name[name.capitalize()])
   1.116 +
   1.117 +    def __eq__(self, other):
   1.118 +        if hasattr(other, "type"):
   1.119 +            return self.type is other.type
   1.120 +        return self.type is other
   1.121  
   1.122  class Sequence(list):
   1.123      """ Sequence of Monomers
   1.124 @@ -12,9 +126,6 @@
   1.125      """
   1.126      pass
   1.127  
   1.128 -MonomerType = _monomer.MonomerType
   1.129 -Monomer = _monomer.Monomer
   1.130 -
   1.131  class Alignment(dict):
   1.132      """ Alignment
   1.133      
   1.134 @@ -230,8 +341,4 @@
   1.135      """ """
   1.136      pass
   1.137  
   1.138 -
   1.139 -
   1.140 -
   1.141 -
   1.142 -
   1.143 +# vim: set ts=4 sts=4 sw=4 et: