Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/allpy/diff/0e8b5ad66125/allpy/_monomer.py
Дата изменения: Unknown
Дата индексирования: Sun Mar 2 07:41:37 2014
Кодировка:
allpy: allpy/_monomer.py diff

allpy

diff allpy/_monomer.py @ 259:0e8b5ad66125

Merge
author Daniil Alexeyevsky <me.dendik@gmail.com>
date Tue, 14 Dec 2010 20:05:13 +0300
parents 994b1a44bfc3
children
line diff
     1.1 --- a/allpy/_monomer.py	Tue Dec 14 20:00:58 2010 +0300
     1.2 +++ b/allpy/_monomer.py	Tue Dec 14 20:05:13 2010 +0300
     1.3 @@ -1,99 +1,119 @@
     1.4  #!/usr/bin/python
     1.5  
     1.6 -from data.AAdict import AAdict
     1.7 -
     1.8 -index_code3 = {}
     1.9 -index_code1 = {}
    1.10 -index_name = {}
    1.11 +import data.codes as table
    1.12  
    1.13  class MonomerType(object):
    1.14 -    """ Monomer type
    1.15 -    
    1.16 -    name -- string like "Valine" 
    1.17 -    code1 -- one-letter code (in upper case)
    1.18 -    code3 -- three-letter code (in upper case)
    1.19 -    is_modified -- True of False
    1.20 +    """Class of monomer types.
    1.21 +
    1.22 +    Each MonomerType object represents a known monomer type, e.g. Valine,
    1.23 +    and is referenced to by each instance of monomer in a given sequence.
    1.24 +
    1.25 +    - `name`: full name of monomer type
    1.26 +    - `code1`: one-letter code
    1.27 +    - `code3`: three-letter code
    1.28 +    - `is_modified`: either of True or False
    1.29 +
    1.30 +    class atributes:
    1.31 +
    1.32 +    - `by_code1`: a mapping from one-letter code to MonomerType object
    1.33 +    - `by_code3`: a mapping from three-letter code to MonomerType object
    1.34 +    - `by_name`: a mapping from monomer name to MonomerType object
    1.35 +    - `instance_type`: class of Monomer objects to use when creating new
    1.36 +      objects; this must be redefined in descendent classes
    1.37 +
    1.38 +    All of the class attributes MUST be redefined when subclassing.
    1.39      """
    1.40  
    1.41 -    instance_type = None # Must be redefined when subclassing
    1.42 -    
    1.43 -    def __init__(self, name, code1, code3, is_modified=False):
    1.44 +    by_code1 = {}
    1.45 +    by_code3 = {}
    1.46 +    by_name = {}
    1.47 +    instance_type = None
    1.48 +
    1.49 +    def __init__(self, name="", code1="", code3="", is_modified=False):
    1.50          self.name = name.capitalize()
    1.51          self.code1 = code1.upper()
    1.52          self.code3 = code3.upper()
    1.53 -        self.is_modified = bool(is_modified) # ugly
    1.54 +        self.is_modified = bool(is_modified)
    1.55 +        if not is_modified:
    1.56 +            self.by_code1[self.code1] = self
    1.57 +        self.by_code3[code3] = self
    1.58 +        self.by_name[name] = self
    1.59 +        # We duplicate distinguished long names into MonomerType itself,
    1.60 +        # so that we can use MonomerType.from_code3 to create the relevant
    1.61 +        # type of monomer.
    1.62 +        MonomerType.by_code3[code3] = self
    1.63 +        MonomerType.by_name[name] = self
    1.64  
    1.65      @classmethod
    1.66 -    def create(cls, name, code1, code3, is_modified=False):
    1.67 -        self = cls(name, code1, code3, is_modified)
    1.68 -        index_name[self.name] = self
    1.69 -        index_code3[self.code3] = self
    1.70 -        if not is_modified:
    1.71 -            if cls not in index_code1:
    1.72 -                index_code1[cls] = {}
    1.73 -            index_code1[cls][code1] = self
    1.74 -    
    1.75 +    def _initialize(cls, type_letter, codes=table.codes):
    1.76 +        """Create all relevant instances of MonomerType.
    1.77 +
    1.78 +        `type_letter` is either of:
    1.79 +
    1.80 +        - 'p' for protein
    1.81 +        - 'd' for DNA
    1.82 +        - 'r' for RNA
    1.83 +
    1.84 +        `codes` is a table of monomer codes
    1.85 +        """
    1.86 +        for type, code1, is_modified, code3, name in codes:
    1.87 +            if type == type_letter:
    1.88 +                cls(name, code1, code3, is_modified)
    1.89 +
    1.90      @classmethod
    1.91      def from_code1(cls, code1):
    1.92 -        return index_code1[cls][code1.upper()]
    1.93 +        """Return monomer type by one-letter code."""
    1.94 +        return cls.by_code1[code1.upper()]
    1.95  
    1.96 -    @staticmethod
    1.97 -    def from_name(name):
    1.98 -        return index_name[name.capitalize()]
    1.99 -      
   1.100 -    @staticmethod
   1.101 -    def from_pdb_residue(pdb_residue):
   1.102 -        """ pdb_residue type is Bio.PDB.Residue """
   1.103 -        return MonomerType.from_code3(pdb_residue.get_resname())
   1.104 -        
   1.105 -    # TO DISCUSS
   1.106 -    def __eq__(self, other):
   1.107 -        return self.code1 == other.code1
   1.108 +    @classmethod
   1.109 +    def from_code3(cls, code3):
   1.110 +        """Return monomer type by three-letter code."""
   1.111 +        return cls.by_code3[code3.upper()]
   1.112  
   1.113 -    def __ne__(self, other):
   1.114 -        return not (self == other)
   1.115 -    
   1.116 +    @classmethod
   1.117 +    def from_name(cls, name):
   1.118 +        """Return monomer type by name."""
   1.119 +        return cls.by_name[name.capitalize()]
   1.120 +
   1.121      def instance(self):
   1.122 +        """Create a new monomer of given type."""
   1.123          return self.instance_type(self)
   1.124  
   1.125 +    def __eq__(self, other):
   1.126 +        if hasattr(other, "type"):
   1.127 +            return self is other.type
   1.128 +        return self is other
   1.129 +
   1.130  class Monomer(object):
   1.131 -    """ Monomer 
   1.132 -    
   1.133 -    type -- link to MonomerType object
   1.134 +    """Monomer object.
   1.135 +
   1.136 +    attributes:
   1.137 +
   1.138 +    - `type`: type of monomer (a MonomerType object)
   1.139 +
   1.140 +    class attribute `monomer_type` is MonomerType or either of it's subclasses,
   1.141 +    it is used when creating new monomers. It MUST be redefined when subclassing Monomer.
   1.142      """
   1.143 -    def __init__(self, monomer_type):
   1.144 -        self.type = monomer_type
   1.145 -        
   1.146 +    monomer_type = MonomerType
   1.147 +
   1.148 +    def __init__(self, type):
   1.149 +        self.type = type
   1.150 +
   1.151 +    @classmethod
   1.152 +    def from_code1(cls, code1):
   1.153 +        return cls(cls.monomer_type.by_code1[code1.upper()])
   1.154 +
   1.155 +    @classmethod
   1.156 +    def from_code3(cls, code3):
   1.157 +        return cls(cls.monomer_type.by_code3[code3.upper()])
   1.158 +
   1.159 +    @classmethod
   1.160 +    def from_name(cls, name):
   1.161 +        return cls(cls.monomer_type.by_name[name.capitalize()])
   1.162 +
   1.163      def __eq__(self, other):
   1.164 -        return self.type == other.type
   1.165 -
   1.166 -    def __ne__(self, other):
   1.167 -        return not (self == other)
   1.168 -
   1.169 -
   1.170 -class AminoAcidType(MonomerType):
   1.171 -    instance_type = AminoAcid
   1.172 -class DNAType(MonomerType):
   1.173 -    instance_type = DNA
   1.174 -class RNAType(MonomerType):
   1.175 -    instance_type = RNA
   1.176 -
   1.177 -class AminoAcid(Monomer):
   1.178 -    pass
   1.179 -class DNA(Monomer):
   1.180 -    pass
   1.181 -class RNA(Monomer):
   1.182 -    pass
   1.183 -
   1.184 -types = {'p': AminoAcidType, 'd': DNAType, 'r': RNAType}
   1.185 -
   1.186 -# prepare all aminoacids
   1.187 -
   1.188 -for code3, data in AAdict.items():
   1.189 -    code1, m_type, is_modified, none, name = data
   1.190 -    monomer_type = types[m_type]
   1.191 -    monomer_type.create(name, code1, code3, is_modified)
   1.192 -del code3, data, code1, m_type, is_modified, none, name
   1.193 -
   1.194 +        if hasattr(other, "type"):
   1.195 +            return self.type is other.type
   1.196 +        return self.type is other
   1.197  
   1.198  # vim: set ts=4 sts=4 sw=4 et: