aboutsummaryrefslogtreecommitdiff
path: root/pangraph/block.py
diff options
context:
space:
mode:
Diffstat (limited to 'pangraph/block.py')
-rw-r--r--pangraph/block.py16
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