Spaces:
No application file
No application file
File size: 4,083 Bytes
b7731cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
# Copyright (C) 2002, Thomas Hamelryck ([email protected])
#
# This file is part of the Biopython distribution and governed by your
# choice of the "Biopython License Agreement" or the "BSD 3-Clause License".
# Please see the LICENSE file that should have been included as part of this
# package.
"""Class that maps (chain_id, residue_id) to a residue property."""
class AbstractPropertyMap:
"""Define base class, map holder of residue properties."""
def __init__(self, property_dict, property_keys, property_list):
"""Initialize the class."""
self.property_dict = property_dict
self.property_keys = property_keys
self.property_list = property_list
def _translate_id(self, entity_id):
"""Return entity identifier (PRIVATE)."""
return entity_id
def __contains__(self, id):
"""Check if the mapping has a property for this residue.
:param chain_id: chain id
:type chain_id: char
:param res_id: residue id
:type res_id: char
Examples
--------
This is an incomplete but illustrative example::
if (chain_id, res_id) in apmap:
res, prop = apmap[(chain_id, res_id)]
"""
translated_id = self._translate_id(id)
return translated_id in self.property_dict
def __getitem__(self, key):
"""Return property for a residue.
:param chain_id: chain id
:type chain_id: char
:param res_id: residue id
:type res_id: int or (char, int, char)
:return: some residue property
:rtype: anything (can be a tuple)
"""
translated_id = self._translate_id(key)
return self.property_dict[translated_id]
def __len__(self):
"""Return number of residues for which the property is available.
:return: number of residues
:rtype: int
"""
return len(self.property_dict)
def keys(self):
"""Return the list of residues.
:return: list of residues for which the property was calculated
:rtype: [(chain_id, res_id), (chain_id, res_id),...]
"""
return self.property_keys
def __iter__(self):
"""Iterate over the (entity, property) list.
Handy alternative to the dictionary-like access.
:return: iterator
Examples
--------
>>> entity_property_list = [
... ('entity_1', 'property_1'),
... ('entity_2', 'property_2')
... ]
>>> map = AbstractPropertyMap({}, [], entity_property_list)
>>> for (res, property) in iter(map):
... print(res, property)
entity_1 property_1
entity_2 property_2
"""
for i in range(0, len(self.property_list)):
yield self.property_list[i]
class AbstractResiduePropertyMap(AbstractPropertyMap):
"""Define class for residue properties map."""
def __init__(self, property_dict, property_keys, property_list):
"""Initialize the class."""
AbstractPropertyMap.__init__(self, property_dict, property_keys, property_list)
def _translate_id(self, ent_id):
"""Return entity identifier on residue (PRIVATE)."""
chain_id, res_id = ent_id
if isinstance(res_id, int):
ent_id = (chain_id, (" ", res_id, " "))
return ent_id
class AbstractAtomPropertyMap(AbstractPropertyMap):
"""Define class for atom properties map."""
def __init__(self, property_dict, property_keys, property_list):
"""Initialize the class."""
AbstractPropertyMap.__init__(self, property_dict, property_keys, property_list)
def _translate_id(self, ent_id):
"""Return entity identifier on atoms (PRIVATE)."""
if len(ent_id) == 4:
chain_id, res_id, atom_name, icode = ent_id
else:
chain_id, res_id, atom_name = ent_id
icode = None
if isinstance(res_id, int):
ent_id = (chain_id, (" ", res_id, " "), atom_name, icode)
return ent_id
|