Exemple #1
0
    def _do_pileups(
        self,
        mids,
        chrom,
        expected=False,
    ):

        if expected:
            data = None
            logging.debug("Doing expected")
        else:
            data = self.get_data(
                chrom
            )  # self.CoolSnipper.select(self.regions[chrom], self.regions[chrom])
        max_right = self.matsizes[chrom]
        mymap = self.make_outmap()
        if self.coverage_norm:
            coverage = self.get_coverage(data)
        cov_start = np.zeros(mymap.shape[0])
        cov_end = np.zeros(mymap.shape[1])
        n = 0
        for stBin, endBin, stPad, endPad in mids:
            rot_flip = False
            rot = False
            if stBin > endBin:
                stBin, stPad, endBin, endPad = endBin, endPad, stBin, stPad
                if self.anchor is None:
                    rot_flip = True
                else:
                    rot = True
            if self.rescale:
                stPad = stPad + int(round(self.rescale_pad * 2 * stPad))
                endPad = endPad + int(round(self.rescale_pad * 2 * endPad))
            else:
                stPad, endPad = self.pad_bins, self.pad_bins
            lo_left = stBin - stPad
            hi_left = stBin + stPad + 1
            lo_right = endBin - endPad
            hi_right = endBin + endPad + 1
            if lo_left < 0 or hi_right > max_right:
                continue
            if (self.mindist <= abs(endBin - stBin) * self.resolution <
                    self.maxdist or self.CC.local):
                if not expected:
                    try:
                        newmap = data[lo_left:hi_left,
                                      lo_right:hi_right].toarray()
                    except (IndexError, ValueError):
                        continue
                else:
                    newmap = self.get_expected_matrix(chrom,
                                                      (lo_left, hi_left),
                                                      (lo_right, hi_right))
                #                if (
                #                    newmap.shape != mymap.shape and not self.rescale
                #                ):  # AFAIK only happens at ends of chroms
                #                    height, width = newmap.shape
                #                    h, w = mymap.shape
                #                    x = w - width
                #                    y = h - height
                #                    newmap = np.pad(
                #                        newmap, [(y, 0), (0, x)], "constant"
                #                    )  # Padding to adjust to the right shape
                if self.rescale:
                    if newmap.size == 0 or np.all(np.isnan(newmap)):
                        newmap = np.zeros(
                            (self.rescale_size, self.rescale_size))
                    else:
                        newmap = numutils.zoom_array(
                            newmap, (self.rescale_size, self.rescale_size))
                if rot_flip:
                    newmap = np.rot90(np.flipud(newmap), 1)
                elif rot:
                    newmap = np.rot90(newmap, -1)

                mymap = np.nansum([mymap, newmap], axis=0)
                if self.coverage_norm and not expected and (self.balance is
                                                            False):
                    new_cov_start = coverage[lo_left:hi_left]
                    new_cov_end = coverage[lo_right:hi_right]
                    if self.rescale:
                        if len(new_cov_start) == 0:
                            new_cov_start = np.zeros(self.rescale_size)
                        if len(new_cov_end) == 0:
                            new_cov_end = np.zeros(self.rescale_size)
                        new_cov_start = numutils.zoom_array(
                            new_cov_start, (self.rescale_size, ))
                        new_cov_end = numutils.zoom_array(
                            new_cov_end, (self.rescale_size, ))
                    else:
                        l = len(new_cov_start)
                        r = len(new_cov_end)
                        new_cov_start = np.pad(new_cov_start,
                                               (mymap.shape[0] - l, 0),
                                               "constant")
                        new_cov_end = np.pad(new_cov_end,
                                             (0, mymap.shape[1] - r),
                                             "constant")
                    cov_start += np.nan_to_num(new_cov_start)
                    cov_end += +np.nan_to_num(new_cov_end)
                n += 1
        if self.CC.local:
            mymap = np.triu(mymap, 0)
            mymap += np.rot90(np.fliplr(np.triu(mymap, 1)))
        return mymap, n, cov_start, cov_end
Exemple #2
0
    def _do_pileups(
        self,
        mids,
        chrom,
        expected=False,
    ):
        mymap = self.make_outmap()
        cov_start = np.zeros(mymap.shape[0])
        cov_end = np.zeros(mymap.shape[1])
        num = np.zeros_like(mymap)
        n = 0
        try:
            mids_row1 = next(mids)
        except StopIteration:
            logging.info(f"Nothing to sum up in chromosome {chrom}")
            return mymap, mymap, cov_start, cov_end, n
        else:
            mids = itertools.chain([mids_row1], mids)

        if expected:
            data = None
            logging.debug("Doing expected")
        else:
            data = self.get_data(
                chrom
            )  # self.CoolSnipper.select(self.regions[chrom], self.regions[chrom])
        max_right = self.matsizes[chrom]

        if self.coverage_norm:
            coverage = self.get_coverage(data)

        for stBin, endBin, stPad, endPad in mids:
            rot_flip = False
            rot = False
            if stBin >= endBin:
                stBin, stPad, endBin, endPad = endBin, endPad, stBin, stPad
                if self.anchor is None:
                    rot_flip = True
                else:
                    rot = True
            if self.rescale:
                stPad = stPad + int(round(self.rescale_pad * 2 * stPad))
                endPad = endPad + int(round(self.rescale_pad * 2 * endPad))
            else:
                stPad, endPad = self.pad_bins, self.pad_bins
            lo_left = stBin - stPad
            hi_left = stBin + stPad + 1
            lo_right = endBin - endPad
            hi_right = endBin + endPad + 1
            if lo_left < 0 or hi_right > max_right:
                continue
            diag = hi_left - lo_right
            if not expected:
                try:
                    newmap = data[lo_left:hi_left, lo_right:hi_right].toarray()
                except (IndexError, ValueError):
                    continue
            else:
                newmap = self.get_expected_matrix(chrom, (lo_left, hi_left),
                                                  (lo_right, hi_right))
            #                if (
            #                    newmap.shape != mymap.shape and not self.rescale
            #                ):  # AFAIK only happens at ends of chroms
            #                    height, width = newmap.shape
            #                    h, w = mymap.shape
            #                    x = w - width
            #                    y = h - height
            #                    newmap = np.pad(
            #                        newmap, [(y, 0), (0, x)], "constant"
            #                    )  # Padding to adjust to the right shape
            newmap = newmap.astype(float)
            if not self.local:
                ignore_indices = np.tril_indices_from(
                    newmap, diag - (stPad * 2 + 1) - 1 + self.ignore_diags)
                newmap[ignore_indices] = np.nan
            else:
                newmap = np.triu(newmap, self.ignore_diags)
                newmap += np.triu(newmap, 1).T
            if self.rescale:
                if newmap.size == 0 or np.all(np.isnan(newmap)):
                    newmap = np.zeros((self.rescale_size, self.rescale_size))
                else:
                    newmap = numutils.zoom_array(
                        newmap, (self.rescale_size, self.rescale_size))
            if rot_flip:
                newmap = np.rot90(np.flipud(newmap), 1)
            elif rot:
                newmap = np.rot90(newmap, -1)

            mymap = np.nansum([mymap, newmap], axis=0)
            if self.coverage_norm and not expected and (self.balance is False):
                new_cov_start = coverage[lo_left:hi_left]
                new_cov_end = coverage[lo_right:hi_right]
                if self.rescale:
                    if len(new_cov_start) == 0:
                        new_cov_start = np.zeros(self.rescale_size)
                    if len(new_cov_end) == 0:
                        new_cov_end = np.zeros(self.rescale_size)
                    new_cov_start = numutils.zoom_array(
                        new_cov_start, (self.rescale_size, ))
                    new_cov_end = numutils.zoom_array(new_cov_end,
                                                      (self.rescale_size, ))
                else:
                    l = len(new_cov_start)
                    r = len(new_cov_end)
                    new_cov_start = np.pad(new_cov_start,
                                           (mymap.shape[0] - l, 0), "constant")
                    new_cov_end = np.pad(new_cov_end, (0, mymap.shape[1] - r),
                                         "constant")
                cov_start += np.nan_to_num(new_cov_start)
                cov_end += +np.nan_to_num(new_cov_end)
            num += np.isfinite(newmap).astype(int)
            n += 1
        return mymap, num, cov_start, cov_end, n
Exemple #3
0
def _do_pileups(mids, data, binsize, pad, expected, mindist, maxdist, local,
                balance, cov_norm, rescale, rescale_pad, rescale_size,
                coverage, anchor):
    mymap = make_outmap(pad, rescale, rescale_size)
    cov_start = np.zeros(mymap.shape[0])
    cov_end = np.zeros(mymap.shape[1])
    n = 0
    for stBin, endBin, stPad, endPad in mids:
        rot_flip = False
        rot = False
        if stBin > endBin:
            stBin, stPad, endBin, endPad = endBin, endPad, stBin, stPad
            if anchor is None:
                rot_flip = True
            else:
                rot = True
        if rescale:
            stPad = stPad + int(round(rescale_pad*2*stPad))
            endPad = endPad + int(round(rescale_pad*2*endPad))
        else:
            stPad = pad
            endPad = pad
        lo_left = stBin - stPad
        hi_left = stBin + stPad + 1
        lo_right = endBin - endPad
        hi_right = endBin + endPad + 1
        if mindist <= abs(endBin - stBin)*binsize < maxdist or local:
            if expected is False:
                try:
                    newmap = np.nan_to_num(data[lo_left:hi_left,
                                                lo_right:hi_right].toarray())
                except (IndexError, ValueError) as e:
                    continue
            else:
                newmap = get_expected_matrix((lo_left, hi_left),
                                             (lo_right, hi_right),
                                              expected, local)
            if newmap.shape != mymap.shape and not rescale: #AFAIK only happens at ends of chroms
                height, width = newmap.shape
                h, w = mymap.shape
                x = w - width
                y = h - height
                newmap = np.pad(newmap, [(y, 0), (0, x)], 'constant') #Padding to adjust to the right shape
            if rescale:
                if newmap.size==0:
                    newmap = np.zeros((rescale_size, rescale_size))
                else:
                    newmap = numutils.zoom_array(newmap, (rescale_size,
                                                          rescale_size))
            if rot_flip:
                newmap = np.rot90(np.flipud(newmap), -1)
            elif rot:
                newmap = np.rot90(newmap, -1)
            mymap += np.nan_to_num(newmap)
            if cov_norm and (expected is False) and (balance is False):
                new_cov_start = coverage[lo_left:hi_left]
                new_cov_end = coverage[lo_right:hi_right]
                if rescale:
                    if len(new_cov_start)==0:
                        new_cov_start = np.zeros(rescale_size)
                    if len(new_cov_end)==0:
                        new_cov_end = np.zeros(rescale_size)
                    new_cov_start = numutils.zoom_array(new_cov_start,
                                                       (rescale_size,))
                    new_cov_end = numutils.zoom_array(new_cov_end,
                                                     (rescale_size,))
                else:
                    l = len(new_cov_start)
                    r = len(new_cov_end)
                    new_cov_start = np.pad(new_cov_start, (mymap.shape[0]-l, 0),
                                                       'constant')
                    new_cov_end = np.pad(new_cov_end,
                                     (0, mymap.shape[1]-r), 'constant')
                cov_start += np.nan_to_num(new_cov_start)
                cov_end += +np.nan_to_num(new_cov_end)
            n += 1
    if local:
        mymap = np.triu(mymap, 0)
        mymap += np.rot90(np.fliplr(np.triu(mymap, 1)))
    return mymap, n, cov_start, cov_end