def get_module_frames(modules, module_level=0, glyph_size=GLYPHSIZE, space=SPACER, submodule_origin=None, has_frame_box=False): frame_list = [] origins = get_origin_list(modules, module_level, glyph_size, space, submodule_origin) for i, module in enumerate(modules): if len(module.children) != 0.: frame_list += get_module_frames( module.children, module_level + 1, GLYPHSIZE - RECURSE_DECREMENT * 2, space, [origins[i][0] + 2 * space, origins[i][1] + 1.5 * space], True) else: if module.part_list != None: parts_count = len(module.part_list.parts) else: parts_count = 0 width, height = get_module_width_height(parts_count, glyph_size, space, len(module.other_parts)) frame_list.append( rd.Frame(width=width, height=height, origin=origins[i])) module.level = module_level if has_frame_box and len(frame_list) != 0.: frame_list.append(get_biggest_module_frame(frame_list, space)) return frame_list
def get_biggest_module_frame(framelist, space_offset): max_x, max_y = (np.finfo(np.float128).min for i in range(2)) min_x, min_y = (np.finfo(np.float128).max for i in range(2)) for frame in framelist: if min_x > frame.origin[0]: min_x = frame.origin[0] if max_x < frame.origin[0] + frame.width: max_x = frame.origin[0] + frame.width if min_y > frame.origin[1]: min_y = frame.origin[1] if max_y < frame.origin[1] + frame.height: max_y = frame.origin[1] + frame.height return rd.Frame( width=(max_x - min_x) + 4 * space_offset, height=(max_y - min_y) + 3.5 * space_offset, origin=[min_x - 2 * space_offset, min_y - 1.5 * space_offset])
def draw_module(ax, module, module_frame, glyph_size, module_spacer, haveBackbone=True): glyph_pos = [ module_frame.origin[0] + 3 * module_spacer, module_frame.origin[1] + 1.5 * module_spacer ] renderer = rd.GlyphRenderer() strand_rd = rd.StrandRenderer() module_rd = rd.ModuleRenderer() # check whether module is empty or not if module.part_list == None: if len(module.children) != 0: return module_rd.draw_empty_module_box(ax, module_frame) elif len(module.other_parts) == 0: return # draw each glyphs in module part list else: module.part_list.position = glyph_pos for part in module.part_list.parts: part.frame = rd.Frame(width=glyph_size, height=glyph_size, origin=glyph_pos) child = renderer.draw_glyph(ax, part.type, glyph_pos, glyph_size, 0.) strand_rd.add_glyphs(child) module_rd.add_parts(child) glyph_pos = [ glyph_pos[0] + glyph_size + module_spacer, glyph_pos[1] ] # draw backbone if haveBackbone and module.part_list != None: bb = strand_rd.draw_backbone_strand(ax, glyph_pos[1], module_spacer) module_rd.add_parts(bb) module.part_list.position = bb['frame'].origin # draw other parts if len(module.other_parts) != 0: op_pos_list = __get_other_part_pos(len(module.other_parts), module_frame, glyph_size, glyph_size, module_spacer) other_part_frames = [] for i, other_part in enumerate(module.other_parts): other_part.frame = rd.Frame(width=glyph_size, height=glyph_size, origin=op_pos_list[i]) other_part_frames.append(other_part.frame) other_child = renderer.draw_glyph(ax, other_part.type, op_pos_list[i], glyph_size, 0.) module_rd.add_parts(other_child) # do not draw module frame box if only has other part if module.part_list == None: return get_biggest_module_frame(other_part_frames, module_spacer) return module_rd.draw_module_box(ax, module_spacer, module_spacer)
''' import render import matplotlib.pyplot as plt # default setting strand = render.StrandRenderer() renderer = render.GlyphRenderer() module = render.ModuleRenderer() print(renderer.glyphs_library) print('------------') print(renderer.glyph_soterm_map) fig = plt.figure(figsize=(5, 5)) ax = fig.add_subplot(111) # need to set axis first ax.set_xlim(-50.0, 50.0) ax.set_ylim(-50.0, 50.0) p1 = renderer.draw_glyph(ax, 'Promoter', (-20.0, 0.0), 10., 0) ori2 = renderer.draw_glyph(ax, 'OriginOfReplication', (0.0, -5.), 10., 0) i3 = renderer.draw_glyph(ax, 'Insulator', (20.0, -5.), 10., 0.) strand.add_glyphs([p1, ori2, i3]) bb = strand.draw_backbone_strand(ax, 0., 1.5) module.add_parts([p1, ori2, i3, bb]) module_frame = module.draw_module_box( ax, render.Frame(width=70, height=30, origin=(-30, -10))) ax.set_axis_off() plt.show()
def draw_module(ax, module, module_frame, glyph_size, module_spacer, haveBackbone=True, user_spec=None): strand_adjustment = __get_strand_adjustment(module.part_list, user_spec, glyph_size) glyph_pos = [ module_frame.origin[0] + 3 * module_spacer, module_frame.origin[1] + 1.5 * module_spacer + strand_adjustment ] renderer = rd.GlyphRenderer() strand_rd = rd.StrandRenderer() module_rd = rd.ModuleRenderer() # check whether module is empty or not if module.part_list == None: if len(module.children) != 0 and len(module.other_parts) == 0: return module_rd.draw_module_box(ax, module_frame) # draw each glyphs in module part list else: module.part_list.position = glyph_pos custom_glyph_size = glyph_size for part in module.part_list.parts: if part.type in LOWER_ORIGIN_GLYPHS: # adjust for cds etc glyph_pos[1] -= strand_adjustment if __check_custom_size(part.name, user_spec, glyph_size) != glyph_size: # user_param glyph_size *= __check_custom_size(part.name, user_spec) #rendering part.frame = rd.Frame(width=glyph_size, height=glyph_size, origin=glyph_pos) child = renderer.draw_glyph(ax, part.type, glyph_pos, glyph_size, 0., user_parameters=__find_right_spec( part.name, user_spec)) strand_rd.add_glyphs(child) module_rd.add_parts(child) # prepare for next part if part.type in LOWER_ORIGIN_GLYPHS: glyph_pos[1] += strand_adjustment glyph_pos = [ glyph_pos[0] + glyph_size + module_spacer, glyph_pos[1] ] if custom_glyph_size != glyph_size: glyph_size = custom_glyph_size # draw backbone if haveBackbone and module.part_list != None: bb = strand_rd.draw_backbone_strand(ax, glyph_pos[1], module_spacer) module_rd.add_parts(bb) module.part_list.position = bb['frame'].origin # draw other parts if len(module.other_parts) != 0: op_pos_list = __get_other_part_pos(len(module.other_parts), module_frame, glyph_size, glyph_size, module_spacer) other_part_frames = [] for i, other_part in enumerate(module.other_parts): other_part.frame = rd.Frame(width=glyph_size, height=glyph_size, origin=op_pos_list[i]) other_part_frames.append(other_part.frame) other_child = renderer.draw_glyph( ax, other_part.type, op_pos_list[i], glyph_size, user_parameters=__find_right_spec(other_part.name, user_spec)) module_rd.add_parts(other_child) return module_rd.draw_module_box(ax, module_frame)