1
2
3
4
5
6 """Selection of atoms, residues, etc."""
7
8 from Bio.PDB.Entity import Entity
9 from Bio.PDB.PDBExceptions import PDBException
10
11
12 entity_levels=["A", "R", "C", "M", "S"]
13
14
16 """Return a list of the unique items in the given iterable.
17
18 Order is NOT preserved.
19 """
20 return list(set(items))
21
22
27
28
30 """Unfold entities list to a child level (e.g. residues in chain).
31
32 Unfold a list of entities to a list of entities of another
33 level. E.g.:
34
35 list of atoms -> list of residues
36 list of modules -> list of atoms
37 list of residues -> list of chains
38
39 o entity_list - list of entities or a single entity
40 o target_level - char (A, R, C, M, S)
41
42 Note that if entity_list is an empty list, you get an empty list back:
43
44 >>> unfold_entities([], "A")
45 []
46
47 """
48 if not target_level in entity_levels:
49 raise PDBException("%s: Not an entity level." % target_level)
50 if entity_list == []:
51 return []
52 if isinstance(entity_list, Entity):
53
54 entity_list=[entity_list]
55
56 level=entity_list[0].get_level()
57 for entity in entity_list:
58 if not (entity.get_level()==level):
59 raise PDBException("Entity list is not homogeneous.")
60 target_index=entity_levels.index(target_level)
61 level_index=entity_levels.index(level)
62 if level_index==target_index:
63
64 return entity_list
65 if level_index>target_index:
66
67 for i in range(target_index, level_index):
68 new_entity_list=[]
69 for entity in entity_list:
70 new_entity_list=new_entity_list+entity.get_list()
71 entity_list=new_entity_list
72 else:
73
74 for i in range(level_index, target_index):
75 new_entity_list=[]
76 for entity in entity_list:
77 parent=entity.get_parent()
78 new_entity_list.append(parent)
79
80 entity_list=uniqueify(new_entity_list)
81 return entity_list
82
83
85 """Run the Bio.PDB.Selection module's doctests (PRIVATE)."""
86 import doctest
87 print "Runing doctests ..."
88 doctest.testmod()
89 print "Done"
90
91
92 if __name__ == "__main__":
93 _test()
94