def g_duplex(self): """Generator of duplex by gaps""" segs = self.sgc.segments for i in range(1, len(segs)): lftsgc = SegmentChain(*segs[:i], ID="%dLeft" % i) rgtsgc = SegmentChain(*segs[i:], ID="%dRight" % i) yield Duplex(lftsgc, rgtsgc, self)
def as_bed(self): sc = SegmentChain(self.don, self.acc) ts = sc.spanning_segment.start te = sc.spanning_segment.end b = sc.as_bed(thickstart=ts, thickend=te).strip("\n").split("\t") b.extend(map(str, [self.nevi, self.ntot])) return b
def get_jnc(self, idx): assert 1 <= idx <= self.numjnc segs = self.sgc.segments s = SegmentChain(*segs[:idx]).spanning_segment.end e = SegmentChain(*segs[idx:]).spanning_segment.start gs = GenomicSegment(self.chrom, s, e, self.strand) return Jnc(gs, self, idx)
def __init__(self, r): assert isinstance(r, pysam.AlignedSegment) self.r = r self.chrom = r.reference_name self.strand = '-' if self.r.is_reverse else '+' self.blocks = self.r.blocks self.tags = {tag: val for tag, val in self.r.tags} self.sgc = SegmentChain() for (start, end) in self.r.blocks: self.sgc.add_segments( GenomicSegment(self.chrom, start, end, self.strand))
class JncGroup: """Junction Group""" def __init__(self, js): self.jsli = [js] self.corejs = js self.sc = SegmentChain(js.don, js.acc) self.name = None def distance2(self, js): return max(self.corejs.dist2don(js), self.corejs.dist2acc(js)) def add(self, js): self.jsli.append(js) def merge(self): for i in range(1, len(self.jsli)): js = self.jsli[i] self.sc.add_segments(js.don) self.sc.add_segments(js.acc) def get_ntot(self): return sum(js.ntot for js in self.jsli) def get_nevi(self): return sum(js.nevi for js in self.jsli) def set_name(self, name): self.name = name def as_bed(self): if self.name is not None: self.sc.attr['ID'] = self.name if self.sc.strand == "+": color = "255,0,0" else: color = "0,0,255" self.sc.attr['color'] = color b = self.sc.as_bed().strip("\n").split("\t") b.extend(map(str, [self.get_nevi(), self.get_ntot()])) return b def __str__(self): return "\t".join( map(str, [self.corejs, self.get_ntot(), self.get_nevi()])) def jncsites(self): jncs = [] for i in range(len(self.jsli)): jncs.append([self.name, str(i + 1)] + self.jsli[i].as_bed()) i += 1 return jncs
class ParisRead: """Read from PARIS-seq""" def __init__(self, r): assert isinstance(r, pysam.AlignedSegment) self.r = r self.chrom = r.reference_name self.strand = '-' if self.r.is_reverse else '+' self.blocks = self.r.blocks self.tags = {tag: val for tag, val in self.r.tags} self.sgc = SegmentChain() for (start, end) in self.r.blocks: self.sgc.add_segments( GenomicSegment(self.chrom, start, end, self.strand)) def __str__(self): return "%s\t%s" % (self.r.qname, self.sgc) def g_duplex(self): """Generator of duplex by gaps""" segs = self.sgc.segments for i in range(1, len(segs)): lftsgc = SegmentChain(*segs[:i], ID="%dLeft" % i) rgtsgc = SegmentChain(*segs[i:], ID="%dRight" % i) yield Duplex(lftsgc, rgtsgc, self)
def sgc3(): return SegmentChain(GenomicSegment("chr1", 350, 450, "+"))
def sgc2(): exon1 = GenomicSegment("chr1", 1150, 1200, "+") exon2 = GenomicSegment("chr1", 1300, 1450, "+") return SegmentChain(exon1, exon2, ID="SGC2", alias="SGC2")
def sgc1(): exon1 = GenomicSegment("chr1", 100, 200, "+") exon2 = GenomicSegment("chr1", 300, 400, "+") return SegmentChain(exon1, exon2, ID="SGC1", alias="SGC1")
def sgc(self): sgc = SegmentChain() for (start, end) in self.blocks: sgc.add_segments( GenomicSegment(self.chrom, start, end, self.strand)) return sgc
def __init__(self, js): self.jsli = [js] self.corejs = js self.sc = SegmentChain(js.don, js.acc) self.name = None
def rgt(self): return SegmentChain(*self.segread.sgc.segments[self.idx:])
def lft(self): return SegmentChain(*self.segread.sgc.segments[:self.idx])