def align2local(self, i, clamp=False): if clamp: return self.align2localLookup[int( util.clamp(i, 0, len(self.align2localLookup) - 1))] else: return self.align2localLookup[i]
def local2align(self, i, clamp=False): if clamp: return self.local2alignLookup[int( util.clamp(i, 0, len(self.local2alignLookup) - 1))] else: return self.local2alignLookup[i]
def percentile(vals, perc, rounding=-1, sort=True): """Give the value at a percentile rounding -- round down if -1 or round up for 1 """ if sort: vals2 = sorted(vals) else: vals2 = vals n = len(vals2) if rounding == -1: return vals2[util.clamp(int(perc * n), 0, n - 1)] elif rounding == 1: return vals2[util.clamp(int(ceil(perc * n)), 0, n - 1)] else: raise Exception("rounding must be 1 or -1")
def percentile(vals, perc, rounding=-1, sort=True): """Give the value at a percentile rounding -- round down if -1 or round up for 1 """ if sort: vals2 = sorted(vals) else: vals2 = vals n = len(vals2) if rounding == -1: return vals2[util.clamp(int(perc * n), 0, n-1)] elif rounding == 1: return vals2[util.clamp(int(ceil(perc * n)), 0, n-1)] else: raise Exception("rounding must be 1 or -1")
def getseq(self, key, start=1, end=None, strand=1): """Get a sequence (or subsequence) by key""" val = SeqDict.__getitem__(self, key) if val is None: # if val == None, then we are using fasta indexing return self.index.get(key, start, end, strand) else: start = util.clamp(start, 1, None) end = util.clamp(end, 1, None) val = val[start - 1:end] # reverse complement if needed if strand == -1: val = _revcomp(val) return val
def getseq(self, key, start=1, end=None, strand=1): """Get a sequence (or subsequence) by key""" val = SeqDict.__getitem__(self, key) if val is None: # if val == None, then we are using fasta indexing return self.index.get(key, start, end, strand) else: start = util.clamp(start, 1, None) end = util.clamp(end, 1, None) val = val[start-1:end] # reverse complement if needed if strand == -1: val = _revcomp(val) return val
def update(self): assert self.view != None, "Track view not initialized" win = self.get_window() if not self.shown or not self.multiscale.same_view(): self.shown = True x, y = self.pos start2 = self.view.start start = int( max(0, start2 - 1, self.multiscale.worldx1 - x + start2)) end = int( min(len(self.xdata), self.view.end, self.multiscale.worldx2 - x + start2)) step = max(1, (end - start) // 400) vis = [] vis2 = [] for i in xrange(start, end, step): dat = self.ydata[i:i + step] assert len(dat) > 0, (start, end, step) y1 = min(dat) y2 = max(dat) #y = self.ydata[i] y1 = (util.clamp(y1, .33, .66) - .33) / .33 y2 = (util.clamp(y2, .33, .66) - .33) / .33 vis.extend([self.xdata[i], y2 * self.size[1]]) vis2.extend([self.xdata[i], y1 * self.size[1]]) # draw curve on middle of base (.5) self.gid = win.replace_group( self.gid, group( translate( x - self.view.start + .5, y, color(0, 1, 0), line_strip(*vis), line_strip(*vis2), color(0, 0, 0), lines(self.view.start - 0.5, 0, self.view.end + 0.5, 0, self.view.start - 0.5, self.size[1], self.view.end + 0.5, self.size[1]))))
def update(self): assert self.view != None, "Track view not initialized" win = self.get_window() if not self.shown or not self.multiscale.same_view(): self.shown = True x, y = self.pos start2 = self.view.start start = int(max(0, start2-1, self.multiscale.worldx1-x+start2)) end = int(min(len(self.xdata), self.view.end, self.multiscale.worldx2-x+start2)) step = max(1, (end - start) // 400) vis = [] vis2 = [] for i in xrange(start, end, step): dat = self.ydata[i:i+step] assert len(dat) > 0, (start, end, step) y1 = min(dat) y2 = max(dat) #y = self.ydata[i] y1 = (util.clamp(y1, .33, .66) - .33) / .33 y2 = (util.clamp(y2, .33, .66) - .33) / .33 vis.extend([self.xdata[i], y2 * self.size[1]]) vis2.extend([self.xdata[i], y1 * self.size[1]]) # draw curve on middle of base (.5) self.gid = win.replace_group(self.gid, group(translate(x - self.view.start + .5, y, color(0,1,0), line_strip(* vis), line_strip(* vis2), color(0,0,0), lines(self.view.start - 0.5, 0, self.view.end + 0.5, 0, self.view.start - 0.5, self.size[1], self.view.end + 0.5, self.size[1]))))
def midroot_recon(tree, stree, recon, events, params, generate): node1, node2 = tree.root.children specs1 = [] specs2 = [] # find nearest specs/genes def walk(node, specs): if events[node] == "dup": for child in node.children: walk(child, specs) else: specs.append(node) #walk(node1, specs1) #walk(node2, specs2) specs1 = node1.leaves() specs2 = node2.leaves() def getDists(start, end): exp_dist = 0 obs_dist = 0 sstart = recon[start] send = recon[end] while sstart != send: exp_dist += params[sstart.name][0] sstart = sstart.parent while start != end: obs_dist += start.dist start = start.parent return exp_dist, obs_dist / generate diffs1 = [] for spec in specs1: if events[tree.root] == "spec": exp_dist1, obs_dist1 = getDists(spec, tree.root) else: exp_dist1, obs_dist1 = getDists(spec, node1) diffs1.append(obs_dist1 - exp_dist1) diffs2 = [] for spec in specs2: if events[tree.root] == "spec": exp_dist2, obs_dist2 = getDists(spec, tree.root) else: exp_dist2, obs_dist2 = getDists(spec, node2) diffs2.append(obs_dist2 - exp_dist2) totdist = (node1.dist + node2.dist) / generate left = node1.dist - stats.mean(diffs1) right = totdist - node2.dist + stats.mean(diffs2) #print diffs1, diffs2 #print stats.mean(diffs1), stats.mean(diffs2) mid = util.clamp((left + right) / 2.0, 0, totdist) node1.dist = mid * generate node2.dist = (totdist - mid) * generate
def align2local(self, i, clamp=False): if clamp: return self.align2localLookup[ int(util.clamp(i, 0, len(self.align2localLookup)-1))] else: return self.align2localLookup[i]
def local2align(self, i, clamp=False): if clamp: return self.local2alignLookup[ int(util.clamp(i, 0, len(self.local2alignLookup)-1))] else: return self.local2alignLookup[i]