diff options
Diffstat (limited to 'pangraph/block.py')
-rw-r--r-- | pangraph/block.py | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/pangraph/block.py b/pangraph/block.py index 05b7806..92f9107 100644 --- a/pangraph/block.py +++ b/pangraph/block.py @@ -26,6 +26,7 @@ class Block(object): super(Block, self).__init__() self.id = randomid() if gen else 0 self.seq = None + self.pos = {} self.muts = {} def __str__(self): @@ -49,6 +50,10 @@ class Block(object): def isolates(self): return dict(Counter([k[0] for k in self.muts])) + @property + def positions(self): + return { tag:(pos, pos+self.len_of(*tag)) for tag, pos in self.pos.items() } + # ------------------ # static methods @@ -56,6 +61,7 @@ class Block(object): def from_seq(cls, name, seq): new_blk = cls() new_blk.seq = as_array(seq) + new_blk.pos = {(name, 0): 0} new_blk.muts = {(name, 0):{}} return new_blk @@ -69,6 +75,7 @@ class Block(object): B = Block() B.id = d['id'] B.seq = as_array(d['seq']) + B.pos = {unpack(k):tuple(v) for k, v in d['pos'].items()} B.muts = {unpack(k):v for k, v in d['muts'].items()} return B @@ -85,6 +92,7 @@ class Block(object): for s in nblk.muts: nblk.muts[s].update({p+offset:c for p,c in b.muts[s].items()}) offset += len(b) + nblk.pos = { k:v for k,v in blks[0].pos.items() } return nblk @@ -138,9 +146,11 @@ class Block(object): qryblks = [nb for i, nb in enumerate(newblks) if qrys[i] is not None] if aln['orientation'] == -1: qryblks = qryblks[::-1] - refblks = [nb for i, nb in enumerate(newblks) if refs[i] is not None] - return newblks, qryblks, refblks, isomap + refblks = [nb for i, nb in enumerate(newblks) if refs[i] is not None] + sharedblks = [nb for i, nb in enumerate(newblks) if refs[i] is not None and qrys[i] is not None] + + return newblks, qryblks, refblks, sharedblks, isomap # -------------- # methods @@ -222,6 +232,7 @@ class Block(object): return {'id' : self.id, 'seq' : "".join(str(n) for n in self.seq), + 'pos' : {pack(k) : v for k,v in self.pos.items()}, 'muts' : {pack(k) : fix(v) for k, v in self.muts.items()}} def __len__(self): @@ -233,6 +244,7 @@ class Block(object): start = val.start or 0 stop = val.stop or len(self.seq) b.seq = self.seq[start:stop] + b.pos = { iso : start+val.start for iso,start in self.pos.items() } for s, _ in self.muts.items(): b.muts[s] = {p-start:c for p,c in self.muts[s].items() if p>=start and p<stop} return b |