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: