allpy
changeset 500:9665a6acdd53
allpy/structure: fix bugs
* no not use yields
* monomer has not .sequence and .column (!) attributes
* set can not be treated with +=
* continuous_blocks() should return the last batch
* continuous_blocks() has now min_width=1 parameter
* set cannot be sorted with .sort()
author | boris (netbook) <bnagaev@gmail.com> |
---|---|
date | Tue, 22 Feb 2011 19:18:03 +0300 |
parents | 4ecf6476a1c9 |
children | 527b713affaa |
files | allpy/structure.py |
diffstat | 1 files changed, 37 insertions(+), 23 deletions(-) [+] |
line diff
1.1 --- a/allpy/structure.py Tue Feb 22 19:12:36 2011 +0300 1.2 +++ b/allpy/structure.py Tue Feb 22 19:18:03 2011 +0300 1.3 @@ -248,12 +248,19 @@ 1.4 * timeout_2 -- Bron-Kerbosh timeout (blocks) 1.5 * min_width -- min width of each core 1.6 """ 1.7 + result = [] 1.8 Block = self.__class__ 1.9 # for sorting 1.10 - key_column = lambda c: return self.columns.index(c) 1.11 - key_sequence = lambda s: return self.sequences.index(c) 1.12 + key_column = lambda c: self.columns.index(c) 1.13 + key_sequence = lambda s: self.sequences.index(s) 1.14 vertices = sum([seq for seq in self.sequences], []) 1.15 edges = {} 1.16 + monomer2column = {} 1.17 + monomer2sequence = {} 1.18 + for column in self.columns: 1.19 + for sequence, monomer in column.items(): 1.20 + monomer2column[monomer] = column 1.21 + monomer2sequence[monomer] = sequence 1.22 for i, seq1 in enumerate(self.sequences): 1.23 for j, seq2 in enumerate(self.sequences): 1.24 if i < j: 1.25 @@ -264,24 +271,23 @@ 1.26 for core in cores: 1.27 core_block = copy(block) 1.28 core_block.columns = sorted(core, key=key_column) 1.29 - for part_block in core_block.continuous_blocks(): 1.30 - if len(part.columns) >= min_width: 1.31 - monomers = part.monomers() 1.32 - for m1 in monomers: 1.33 - for m2 in monomers: 1.34 - edges 1.35 - edge = Graph.edge(m1, m2) 1.36 - edges[edge] = 1.0 1.37 + for part in core_block.continuous_blocks(min_width): 1.38 + monomers = part.monomers() 1.39 + for m1 in monomers: 1.40 + for m2 in monomers: 1.41 + edges 1.42 + edge = Graph.edge(m1, m2) 1.43 + edges[edge] = 1.0 1.44 graph = Graph(vertices, edges) 1.45 cliques = graph.cliques(minsize=min_width*2, timeout=timeout_2) 1.46 used_monomers = set() 1.47 for clique in cliques: 1.48 clique -= used_monomers 1.49 while clique: 1.50 - sequences = set(m.sequence for m in clique) 1.51 - sequences.sort(key=key_sequence) 1.52 - columns = set(m.column for m in clique) 1.53 - columns.sort(key=key_column) 1.54 + sequences = set(monomer2sequence[m] for m in clique) 1.55 + sequences = sorted(sequences, key=key_sequence) 1.56 + columns = set(monomer2column[m] for m in clique) 1.57 + columns = sorted(columns, key=key_column) 1.58 height = len(sequences) 1.59 if height <= 1: 1.60 break 1.61 @@ -290,31 +296,39 @@ 1.62 block = copy(self) 1.63 block.columns = filled_columns 1.64 block.sequences = sequences 1.65 - for part in block.continuous_blocks(): 1.66 - if len(part.columns) >= min_width: 1.67 - clique -= part.monomers() 1.68 - used_monomers += part.monomers() 1.69 - yield part 1.70 + for part in block.continuous_blocks(min_width): 1.71 + clique -= set(part.monomers()) 1.72 + used_monomers |= set(part.monomers()) 1.73 + result.append(part) 1.74 + return result 1.75 1.76 - def continuous_blocks(self): 1.77 + def continuous_blocks(self, min_width=1): 1.78 """ Return list of continued blocks """ 1.79 + result = [] 1.80 self_columns = set(self.columns) 1.81 columns_batch = [] 1.82 for column in self.alignment.columns: 1.83 if column in self_columns: 1.84 columns_batch.append(column) 1.85 - elif columns_batch: 1.86 + elif len(columns_batch) >= min_width: 1.87 block = copy(self) 1.88 block.columns = columns_batch 1.89 columns_batch = [] 1.90 - yield block 1.91 + result.append(block) 1.92 + if len(columns_batch) >= min_width: 1.93 + block = copy(self) 1.94 + block.columns = columns_batch 1.95 + result.append(block) 1.96 + return result 1.97 1.98 def monomers(self): 1.99 """ Return list of all monomers in this block """ 1.100 + result = [] 1.101 for column in self.columns: 1.102 for sequence in self.sequences: 1.103 if sequence in column: 1.104 - yield column[sequence] 1.105 + result.append(column[sequence]) 1.106 + return result 1.107 1.108 def superimpose(self, gc): 1.109 """ Superimpose monomers from this block at gc positions """