def add_graph(graph1: GraphContainer, graph2: GraphContainer): """ Add all nodes, edges and paths from graph2 to graph1 (inplace) """ for node in graph2.refNodes(): graph1.add_refNode( node["chrom"], node["start"], node["end"], node["sequences"]) for node in graph2.altNodes(): graph1.add_altNode( node["chrom"], node["start"], node["end"], node["sequence"], node["sequences"]) for edge in graph2.edges.values(): graph1.add_edge(graph1.nodes[edge["from"]], graph1.nodes[edge["to"]], edge["sequences"]) graph1.paths += graph2.paths
def split_ref_nodes(graph: GraphContainer, max_len=300, padding_len=150): """ Split long reference nodes :param graph: graph to work on :param max_len: max length of reference node with no sequences :param padding_len: length of sequence to keep """ assert max_len >= 2 * padding_len for node in list(graph.refNodes()): if node["end"] - node["start"] + 1 <= max_len: continue logging.info("Splitting long REF node: %s", node['name']) firstEnd = node["start"] + padding_len - 1 n1 = graph.add_refNode(node["chrom"], node["start"], firstEnd, node["sequences"]) sndStart = node["end"] - padding_len + 1 n2 = graph.add_refNode(node["chrom"], sndStart, node["end"], node["sequences"]) for e in list(graph.inEdges(node)): graph.add_edge(graph.nodes[e["from"]], n1, e["sequences"]) for e in list(graph.outEdges(node)): graph.add_edge(n2, graph.nodes[e["to"]], e["sequences"]) graph.del_node(node)