Package Bio :: Package PDB :: Module Selection
[hide private]
[frames] | no frames]

Source Code for Module Bio.PDB.Selection

 1  # Copyright (C) 2002, Thomas Hamelryck (thamelry@binf.ku.dk) 
 2  # This code is part of the Biopython distribution and governed by its 
 3  # license.  Please see the LICENSE file that should have been included 
 4  # as part of this package. 
 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   
15 -def uniqueify(items):
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
23 -def get_unique_parents(entity_list):
24 """Translate a list of entities to a list of their (unique) parents.""" 25 parents = [entity.get_parent() for entity in entity_list] 26 return uniqueify(parents)
27 28
29 -def unfold_entities(entity_list, target_level):
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 # single entity 54 entity_list=[entity_list] 55 # level of entity list 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 # already right level 64 return entity_list 65 if level_index>target_index: 66 # we're going down, e.g. S->A 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 # we're going up, e.g. A->S 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 # find unique parents 80 entity_list=uniqueify(new_entity_list) 81 return entity_list
82 83
84 -def _test():
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