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
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
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