class MapTester(object): "test object that collects results" def __init__(self): self.mappings = [] self.mapper = PslMap(self) def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): self.mappings.append(("blk", psl.qName, blk.iBlk, qRngStart, qRngEnd, tRngStart, tRngEnd)) @staticmethod def __iBlkOrNone(blk): return blk.iBlk if blk != None else None def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): self.mappings.append( ("gap", psl.qName, MapTester.__iBlkOrNone(prevBlk), MapTester.__iBlkOrNone(nextBlk), qRngStart, qRngEnd, tRngStart, tRngEnd)) def __joinMappings(self): "join mappings into a tuple for testing and clear for next test" m = tuple(self.mappings) self.mappings = [] return m def targetToQueryMap(self, psl, tRngStart, tRngEnd): self.mapper.targetToQueryMap(psl, tRngStart, tRngEnd) return self.__joinMappings() def queryToTargetMap(self, psl, qRngStart, qRngEnd): self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) return self.__joinMappings()
class MapTester(object): "test object that collects results" def __init__(self): self.mappings = [] self.mapper = PslMap(self) def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): self.mappings.append(("blk", psl.qName, blk.iBlk, qRngStart, qRngEnd, tRngStart, tRngEnd)) @staticmethod def __iBlkOrNone(blk): return blk.iBlk if blk != None else None def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): self.mappings.append(("gap", psl.qName, MapTester.__iBlkOrNone(prevBlk), MapTester.__iBlkOrNone(nextBlk), qRngStart, qRngEnd, tRngStart, tRngEnd)) def __joinMappings(self): "join mappings into a tuple for testing and clear for next test" m = tuple(self.mappings) self.mappings = [] return m def targetToQueryMap(self, psl, tRngStart, tRngEnd): self.mapper.targetToQueryMap(psl, tRngStart, tRngEnd) return self.__joinMappings() def queryToTargetMap(self, psl, qRngStart, qRngEnd): self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) return self.__joinMappings()
class PslMapBedMaker(object): " object that collects blocks from pslMap and creates a bed in the end" __slots__ = ("chrom", "chromStart", "chromEnd", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts", "mapper") def __init__(self): self.mapper = PslMap(self) self.clear() def clear(self): " reset for next mapping " self.chrom = None self.chromStart = None self.chromEnd = None self.name = None self.score = 0 self.strand = None self.thickStart = None self.thickEnd = None self.itemRgb = "0" self.blockCount = 0 self.blockSizes = [] self.blockStarts = [] def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): " callback for pslMap " self.chromEnd = tRngEnd self.blockCount += 1 self.blockSizes.append(tRngEnd-tRngStart) self.blockStarts.append(tRngStart) def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): " call back pslMap " pass def mapQuery(self, psl, qRngStart, qRngEnd): " call this method to get qRngStart-qRngEnd mapped through the psl as a bed " self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) self.chrom = psl.tName self.name = psl.qName self.strand = psl.strand return self._toBed() def _toBed(self): " return bed feature as row " if len(self.blockStarts)==0: return None self.chromStart = self.blockStarts[0] self.thickStart = self.chromStart self.thickEnd = self.chromEnd self.score = sum(self.blockSizes) blockSizeStr = ",".join([str(x) for x in self.blockSizes]) chromStart = self.chromStart blockStartStr = ",".join([str(x-chromStart) for x in self.blockStarts]) bedRow = [self.chrom, self.chromStart, self.chromEnd, self.name, \ self.score, self.strand, self.thickStart, self.thickEnd, \ self.itemRgb, len(self.blockSizes), blockSizeStr, blockStartStr] bedRow = [str(x) for x in bedRow] return bedRow
def __init__(self): self.mappings = [] self.mapper = PslMap(self)
def __init__(self): self.mapper = PslMap(self) self.clear()
class PslMapBedMaker(object): " object that collects blocks from pslMap and creates a bed in the end" __slots__ = ("chrom", "chromStart", "chromEnd", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts", "mapper") def __init__(self): self.mapper = PslMap(self) self.clear() def clear(self): " reset for next mapping " self.chrom = None self.chromStart = None self.chromEnd = None self.name = None self.score = 0 self.strand = None self.thickStart = None self.thickEnd = None self.itemRgb = "0" self.blockCount = 0 self.blockSizes = [] self.blockStarts = [] def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): " callback for pslMap " self.chromEnd = tRngEnd self.blockCount += 1 self.blockSizes.append(tRngEnd - tRngStart) self.blockStarts.append(tRngStart) def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): " call back pslMap " pass def mapQuery(self, psl, qRngStart, qRngEnd): " call this method to get qRngStart-qRngEnd mapped through the psl as a bed " self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) self.chrom = psl.tName self.name = psl.qName self.strand = psl.strand return self._toBed() def _toBed(self): " return bed feature as row " if len(self.blockStarts) == 0: return None self.chromStart = self.blockStarts[0] self.thickStart = self.chromStart self.thickEnd = self.chromEnd self.score = sum(self.blockSizes) blockSizeStr = ",".join([str(x) for x in self.blockSizes]) chromStart = self.chromStart blockStartStr = ",".join( [str(x - chromStart) for x in self.blockStarts]) bedRow = [self.chrom, self.chromStart, self.chromEnd, self.name, \ self.score, self.strand, self.thickStart, self.thickEnd, \ self.itemRgb, len(self.blockSizes), blockSizeStr, blockStartStr] bedRow = [str(x) for x in bedRow] return bedRow
class PslMapBedMaker(object): " object that collects blocks from pslMap and creates a bed in the end" __slots__ = ("chrom", "chromStart", "chromEnd", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts", "mapper", "chromSize") def __init__(self): self.mapper = PslMap(self) self.clear() def clear(self): " reset for next mapping " self.chrom = None self.chromStart = None self.chromEnd = None self.name = None self.score = 0 self.strand = None self.thickStart = None self.thickEnd = None self.itemRgb = "0" self.blockCount = 0 self.blockSizes = [] self.blockStarts = [] self.chromSize = 0 def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): " callback for pslMap " logging.debug("Got blk: %d-%d, len %d" % (tRngStart, tRngEnd, tRngEnd - tRngStart)) self.blockCount += 1 self.blockSizes.append(tRngEnd - tRngStart) self.blockStarts.append(tRngStart) def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): " call back pslMap " pass def mapQuery(self, psl, qRngStart, qRngEnd): " call this method to get qRngStart-qRngEnd mapped through the psl as a bed " # must be reversed somewhere upstream assert(psl.strand[0] == "+") # if psl.strand=="-": # the +1 here is weird but seems to be true # end = mapPsl.qSize - rnaVar.start + 1 # start = mapPsl.qSize - rnaVar.end + 1 # logging.debug("Inversing map coordinates to %d/%d" % (start, end)) # logging.debug("Reversing map psl") # psl = psl.reverseComplement() self.chromSize = psl.tSize self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) self.chrom = psl.tName self.name = psl.qName self.strand = psl.strand def getBed(self, name=None): " return bed feature as a 12-tuple, default name is query name " if len(self.blockStarts) == 0: return None if self.strand[-1] == "-": logging.debug("Reversing coords") self.blockStarts.reverse() self.blockSizes.reverse() # pslToBed.c: # for (i=0; i<blockCount; ++i) # chromStarts[i] = chromSize - chromStarts[i] - bed->blockSizes[i]; chromSize = self.chromSize chromStarts = self.blockStarts blockSizes = self.blockSizes for i in range(0, len(self.blockStarts)): self.blockStarts[i] = chromSize - chromStarts[i] - blockSizes[i] self.chromStart = self.blockStarts[0] self.chromEnd = self.blockStarts[-1] + self.blockSizes[-1] self.thickStart = self.chromStart self.thickEnd = self.chromEnd self.score = sum(self.blockSizes) blockSizeStr = ",".join([str(x) for x in self.blockSizes]) chromStart = self.chromStart blockStartStr = ",".join([str(x - chromStart) for x in self.blockStarts]) # default bed name is query name if not name: name = self.name bedRow = [self.chrom, self.chromStart, self.chromEnd, name, \ self.score, self.strand[-1], self.thickStart, self.thickEnd, \ self.itemRgb, len(self.blockSizes), blockSizeStr, blockStartStr] bedRow = [str(x) for x in bedRow] return bedRow
class PslMapBedMaker(object): " object that collects blocks from pslMap and creates a bed in the end" __slots__ = ("chrom", "chromStart", "chromEnd", "name", "score", "strand", "thickStart", "thickEnd", "itemRgb", "blockCount", "blockSizes", "blockStarts", "mapper", "chromSize") def __init__(self): self.mapper = PslMap(self) self.clear() def clear(self): " reset for next mapping " self.chrom = None self.chromStart = None self.chromEnd = None self.name = None self.score = 0 self.strand = None self.thickStart = None self.thickEnd = None self.itemRgb = "0" self.blockCount = 0 self.blockSizes = [] self.blockStarts = [] self.chromSize = 0 def mapBlock(self, psl, blk, qRngStart, qRngEnd, tRngStart, tRngEnd): " callback for pslMap " logging.debug("Got blk: %d-%d, len %d" % (tRngStart, tRngEnd, tRngEnd - tRngStart)) self.blockCount += 1 self.blockSizes.append(tRngEnd - tRngStart) self.blockStarts.append(tRngStart) def mapGap(self, psl, prevBlk, nextBlk, qRngStart, qRngEnd, tRngStart, tRngEnd): " call back pslMap " pass def mapQuery(self, psl, qRngStart, qRngEnd): " call this method to get qRngStart-qRngEnd mapped through the psl as a bed " # must be reversed somewhere upstream assert (psl.strand[0] == "+") # if psl.strand=="-": # the +1 here is weird but seems to be true # end = mapPsl.qSize - rnaVar.start + 1 # start = mapPsl.qSize - rnaVar.end + 1 # logging.debug("Inversing map coordinates to %d/%d" % (start, end)) # logging.debug("Reversing map psl") # psl = psl.reverseComplement() self.chromSize = psl.tSize self.mapper.queryToTargetMap(psl, qRngStart, qRngEnd) self.chrom = psl.tName self.name = psl.qName self.strand = psl.strand def getBed(self, name=None): " return bed feature as a 12-tuple, default name is query name " if len(self.blockStarts) == 0: return None if self.strand[-1] == "-": logging.debug("Reversing coords") self.blockStarts.reverse() self.blockSizes.reverse() # pslToBed.c: # for (i=0; i<blockCount; ++i) # chromStarts[i] = chromSize - chromStarts[i] - bed->blockSizes[i]; chromSize = self.chromSize chromStarts = self.blockStarts blockSizes = self.blockSizes for i in range(0, len(self.blockStarts)): self.blockStarts[ i] = chromSize - chromStarts[i] - blockSizes[i] self.chromStart = self.blockStarts[0] self.chromEnd = self.blockStarts[-1] + self.blockSizes[-1] self.thickStart = self.chromStart self.thickEnd = self.chromEnd self.score = sum(self.blockSizes) blockSizeStr = ",".join([str(x) for x in self.blockSizes]) chromStart = self.chromStart blockStartStr = ",".join( [str(x - chromStart) for x in self.blockStarts]) # default bed name is query name if not name: name = self.name bedRow = [self.chrom, self.chromStart, self.chromEnd, name, \ self.score, self.strand[-1], self.thickStart, self.thickEnd, \ self.itemRgb, len(self.blockSizes), blockSizeStr, blockStartStr] bedRow = [str(x) for x in bedRow] return bedRow