def makePathGridlinesGroup(self) -> G: size = self.cn_doc.max_vhelix_length _BW = self._base_width _BH = self._base_height g = G() g.setAttribute('id', "GridLines") for i in range(len(self.cn_doc.vh_order)): id_num = self.cn_doc.vh_order[i] x = self.PATH_X_PADDING + self._path_radius_scaled*3 y = self.PATH_Y_PADDING + self._path_vh_margin*i h_lines = " ".join("M %s,%s h %s" % (x, y-_BH+j*_BH, _BW*size) for j in range(3)) v_lines = " ".join("M %s,%s v %s" % (x+j*_BW, y-_BH, _BH*2) for j in range(int(size)+1)) p = Path(h_lines + " " + v_lines) grid_style = 'fill:none; stroke:#666666; stroke-width:0.25' p.set_style(grid_style) p.setAttribute('id', "grid_"+self.cn_doc.vh_props['name'][id_num]) g.addElement(p) return g
def makePathOligosGroup(self) -> G: id_coords = self.mapIdnumsToYcoords() oligo_list = self.cn_doc.getOligoList() _BW = self._base_width _BH = self._base_height _pX = self.PATH_X_PADDING + self._path_radius_scaled*3 + _BW/2 g = G() g.setAttribute('id', "Oligos") i = 0 for color, is_circular, strands in oligo_list: prev_id, prev5, prev3, prevX, prevY = None, None, None, 0, 0 path_lines = [] if is_circular: strands.append(strands[0]) for id_num, idx5, idx3, isfwd, _ in strands: x = _pX + idx5*_BW if idx5 < idx3: # top strand y = id_coords[id_num] - _BH/2 else: y = id_coords[id_num] + _BH/2 dx = (idx3-idx5)*_BW if prev_id is not None and id_num != prev_id: # c dx1 dy1, dx2 dy2, dx dy if isfwd: x1 = x + abs(y-prevY)*0.03 else: x1 = x - abs(y-prevY)*0.03 y1 = (y+prevY)/2 path_lines.append("Q %s %s, %s %s" % (x1, y1, x, y)) path_lines.append("h %s" % dx) else: path_lines.append("M %s, %s h %s" % (x, y, dx)) prev_id, prev5, prev3, prevX, prevY = id_num, idx5, idx3, x, y p = Path(" ".join(path_lines)) oligo_style = 'fill:none; stroke:%s; stroke-width:2' % color p.set_style(oligo_style) p.setAttribute('id', "oligo_%s" % i) p.setAttribute("stroke-linejoin", "round") i += 1 g.addElement(p) return g