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 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
# Copyright (C) 2002, Thomas Hamelryck (thamelry@binf.ku.dk)
# This code is part of the Biopython distribution and governed by its
# license. Please see the LICENSE file that should have been included
# as part of this package.
"""Chain class, used in Structure objects."""
from Bio.PDB.Entity import Entity
class Chain(Entity):
"""Define Chain class.
Chain is an object of type Entity, stores residues and includes a method to
access atoms from residues.
"""
def __init__(self, id):
"""Initialize the class."""
self.level = "C"
Entity.__init__(self, id)
# Sorting methods: empty chain IDs come last.
def __gt__(self, other):
"""Validate if id is greater than other.id."""
if isinstance(other, Chain):
if self.id == ' ' and other.id != ' ':
return 0
elif self.id != ' ' and other.id == ' ':
return 1
else:
return self.id > other.id
else:
return NotImplemented
def __ge__(self, other):
"""Validate if id is greater or equal than other.id."""
if isinstance(other, Chain):
if self.id == ' ' and other.id != ' ':
return 0
elif self.id != ' ' and other.id == ' ':
return 1
else:
return self.id >= other.id
else:
return NotImplemented
def __lt__(self, other):
"""Validate if id is less than other.id."""
if isinstance(other, Chain):
if self.id == ' ' and other.id != ' ':
return 0
elif self.id != ' ' and other.id == ' ':
return 1
else:
return self.id < other.id
else:
return NotImplemented
def __le__(self, other):
"""Validate if id is less or equal than other id."""
if isinstance(other, Chain):
if self.id == ' ' and other.id != ' ':
return 0
elif self.id != ' ' and other.id == ' ':
return 1
else:
return self.id <= other.id
else:
return NotImplemented
def _translate_id(self, id):
"""Translate sequence identifier to tuple form (PRIVATE).
A residue id is normally a tuple (hetero flag, sequence identifier,
insertion code). Since for most residues the hetero flag and the
insertion code are blank (i.e. " "), you can just use the sequence
identifier to index a residue in a chain. The _translate_id method
translates the sequence identifier to the (" ", sequence identifier,
" ") tuple.
Arguments:
- id - int, residue resseq
"""
if isinstance(id, int):
id = (' ', id, ' ')
return id
def __getitem__(self, id):
"""Return the residue with given id.
The id of a residue is (hetero flag, sequence identifier, insertion code).
If id is an int, it is translated to (" ", id, " ") by the _translate_id
method.
Arguments:
- id - (string, int, string) or int
"""
id = self._translate_id(id)
return Entity.__getitem__(self, id)
def __contains__(self, id):
"""Check if a residue with given id is present in this chain.
Arguments:
- id - (string, int, string) or int
"""
id = self._translate_id(id)
return Entity.__contains__(self, id)
def __delitem__(self, id):
"""Delete item.
Arguments:
- id - (string, int, string) or int
"""
id = self._translate_id(id)
return Entity.__delitem__(self, id)
def __repr__(self):
"""Return the chain identifier."""
return "<Chain id=%s>" % self.get_id()
# Public methods
def get_unpacked_list(self):
"""Return a list of undisordered residues.
Some Residue objects hide several disordered residues
(DisorderedResidue objects). This method unpacks them,
ie. it returns a list of simple Residue objects.
"""
unpacked_list = []
for residue in self.get_list():
if residue.is_disordered() == 2:
for dresidue in residue.disordered_get_list():
unpacked_list.append(dresidue)
else:
unpacked_list.append(residue)
return unpacked_list
def has_id(self, id):
"""Return 1 if a residue with given id is present.
The id of a residue is (hetero flag, sequence identifier, insertion code).
If id is an int, it is translated to (" ", id, " ") by the _translate_id
method.
Arguments:
- id - (string, int, string) or int
"""
id = self._translate_id(id)
return Entity.has_id(self, id)
# Public
def get_residues(self):
"""Return residues."""
for r in self:
yield r
def get_atoms(self):
"""Return atoms from residues."""
for r in self.get_residues():
for a in r:
yield a
|