def test_connected_components(self): '''test connected_components''' self.assertListEqual([['c1'], ['c2'], ['c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components()) self.g.add_edge(edge.Edge('c1', 42, 1, 'c2', 1, 10)) self.assertListEqual([['c1', 'c2'], ['c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components()) self.g.add_edge(edge.Edge('c3', 42, 1, 'c2', 1, 10)) self.assertListEqual([['c1', 'c2', 'c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components())
def to_graph_edge(self, min_overlap_length=200, end_tolerance=50, min_identity=99): if self.percent_identity < min_identity or min(self.hit_length_qry, self.hit_length_ref) < min_overlap_length: return None ref_at_ends = self._is_at_ends(tolerance=end_tolerance) qry_at_ends = self._is_at_ends(use_qry=True, tolerance=end_tolerance) bad_values = set([HIT_NO_ENDS, HIT_AT_BOTH_ENDS]) if ref_at_ends in bad_values or qry_at_ends in bad_values: return None good_values = set([HIT_AT_START, HIT_AT_END]) assert qry_at_ends in good_values assert ref_at_ends in good_values qry_fwd_strand = self.qry_start < self.qry_end ref_fwd_strand = self.ref_start < self.ref_end if ((qry_fwd_strand == ref_fwd_strand) == (qry_at_ends == ref_at_ends)): return None elif qry_fwd_strand: if ref_fwd_strand: if qry_at_ends == HIT_AT_END: assert ref_at_ends == HIT_AT_START qry_first = True elif qry_at_ends == HIT_AT_START: assert ref_at_ends == HIT_AT_END qry_first = False else: raise Error('Error in mummer.to_graph_edge(). Cannot continue') else: if qry_at_ends == HIT_AT_END: assert ref_at_ends == HIT_AT_END qry_first = True elif qry_at_ends == HIT_AT_START: assert ref_at_ends == HIT_AT_START qry_first = False else: raise Error('Error in mummer.to_graph_edge(). Cannot continue') else: if ref_fwd_strand: if qry_at_ends == HIT_AT_END: assert ref_at_ends == HIT_AT_END qry_first = False elif qry_at_ends == HIT_AT_START: assert ref_at_ends == HIT_AT_START qry_first = True else: raise Error('Error in mummer.to_graph_edge(). Cannot continue') else: if qry_at_ends == HIT_AT_END: assert ref_at_ends == HIT_AT_START qry_first = False elif qry_at_ends == HIT_AT_START: assert ref_at_ends == HIT_AT_END qry_first = True else: raise Error('Error in mummer.to_graph_edge(). Cannot continue') if qry_first: return edge.Edge(self.qry_name, self.qry_start, self.qry_end, self.ref_name, self.ref_start, self.ref_end) else: return edge.Edge(self.ref_name, self.ref_start, self.ref_end, self.qry_name, self.qry_start, self.qry_end)
def test_open_end(self): '''test open_end''' e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10) e2 = edge.Edge('c1', 42, 1, 'c2', 1, 10) self.assertEqual(e1.open_end('c1'), edge.LEFT) self.assertEqual(e1.open_end('c2'), edge.LEFT) self.assertEqual(e2.open_end('c1'), edge.RIGHT) self.assertEqual(e2.open_end('c2'), edge.RIGHT)
def test_make_contig_forwards(self): '''test make_contig_forwards''' e = edge.Edge('c1', 1, 42, 'c2', 50, 10) e._make_contig_forwards('c1') self.assertEqual(e, edge.Edge('c1', 1, 42, 'c2', 50, 10)) e._make_contig_forwards('c2') self.assertEqual(e, edge.Edge('c2', 10, 50, 'c1', 42, 1)) e._make_contig_forwards('c1') self.assertEqual(e, edge.Edge('c1', 1, 42, 'c2', 50, 10))
def test_remove_redundant_nodes_from_simple_path(self): '''test remove_redundant_nodes_from_simple_path''' self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 100, 142, 'c3', 1, 42)) new_path = self.g.remove_redundant_nodes_from_simple_path( ['c1', 'c2', 'c3']) self.assertListEqual(['c1', 'c2', 'c3'], new_path) self.assertTrue('c2' in self.g.graph) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50)) self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40)) new_path = self.g.remove_redundant_nodes_from_simple_path( ['c1', 'c2', 'c3']) self.assertListEqual(['c1', 'c3'], new_path) self.assertFalse('c2' in self.g.graph) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50)) self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40)) self.g.add_edge(edge.Edge('c3', 100, 150, 'c4', 1, 50)) self.g.add_edge(edge.Edge('c4', 20, 70, 'c5', 1, 50)) self.g.add_edge(edge.Edge('c5', 40, 90, 'c6', 1, 50)) new_path = self.g.remove_redundant_nodes_from_simple_path( ['c1', 'c2', 'c3', 'c4', 'c5', 'c6']) self.assertListEqual(['c1', 'c3', 'c5', 'c6'], new_path) self.assertFalse('c2' in self.g.graph) self.assertFalse('c4' in self.g.graph)
def test_simple_path_is_consistent(self): '''test simple_path_is_consistent''' self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertTrue(self.g.simple_path_is_consistent(['c1', 'c2'])) self.g.add_edge(edge.Edge('c3', 10, 100, 'c4', 1, 1000)) self.assertTrue(self.g.simple_path_is_consistent(['c1', 'c2', 'c3'])) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 1000, 100, 'c3', 1, 42)) self.assertFalse(self.g.simple_path_is_consistent(['c1', 'c2', 'c3']))
def test_degree(self): '''test degree''' self.assertEqual(0, self.g._degree('c1')) self.assertEqual(0, self.g._degree('c2')) e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10) e2 = edge.Edge('c1', 4, 43, 'c2', 60, 10) self.g.add_edge(e1) self.assertEqual(1, self.g._degree('c1')) self.assertEqual(1, self.g._degree('c2')) self.g.add_edge(e2) self.assertEqual(2, self.g._degree('c1')) self.assertEqual(2, self.g._degree('c2'))
def test_add_and_get_edges(self): '''test adding and getting edges''' self.assertListEqual([], self.g._get_edges('not_in_graph', 'c1')) self.assertListEqual([], self.g._get_edges('not_in_graph', 'c2')) self.assertListEqual([], self.g._get_edges('c1', 'c2')) self.assertListEqual([], self.g._get_edges('c2', 'c1')) e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10) e2 = edge.Edge('c1', 4, 43, 'c2', 60, 10) self.g.add_edge(e1) self.assertListEqual([e1], self.g._get_edges('c1', 'c2')) self.g.add_edge(e2) self.assertListEqual([e1, e2], self.g._get_edges('c1', 'c2')) with self.assertRaises(graph.Error): self.g.add_edge(edge.Edge('c7', 1, 10, 'c8', 42, 84))
def test_node_to_coords(self): '''test _node_to_coords''' self.g.add_edge(edge.Edge('c1', 199, 0, 'c2', 1319, 1119)) nodes = ['c1', 'c2'] self.assertListEqual(['c1', intervals.Interval(200, 659), True], self.g._node_to_coords(nodes, 0)) self.assertListEqual(['c2', intervals.Interval(0, 1319), True], self.g._node_to_coords(nodes, 1)) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c2', 1119, 1319, 'c1', 0, 199)) nodes = ['c1', 'c2'] self.assertListEqual(['c1', intervals.Interval(200, 659), True], self.g._node_to_coords(nodes, 0)) self.assertListEqual(['c2', intervals.Interval(0, 1319), True], self.g._node_to_coords(nodes, 1)) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 551, 650, 'c2', 1, 100)) self.g.add_edge(edge.Edge('c2', 1201, 1300, 'c3', 11, 110)) nodes = ['c1', 'c2', 'c3'] self.assertListEqual(['c1', intervals.Interval(0, 550), False], self.g._node_to_coords(nodes, 0)) self.assertListEqual(['c2', intervals.Interval(1, 1200), False], self.g._node_to_coords(nodes, 1)) self.assertListEqual(['c3', intervals.Interval(11, 2159), False], self.g._node_to_coords(nodes, 2)) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 551, 650, 'c2', 1, 100)) self.g.add_edge(edge.Edge('c3', 110, 11, 'c2', 1300, 1201)) self.g.add_edge(edge.Edge('c3', 2051, 2150, 'c4', 6, 115)) nodes = ['c1', 'c2', 'c3', 'c4'] self.assertListEqual(['c1', intervals.Interval(0, 550), False], self.g._node_to_coords(nodes, 0)) self.assertListEqual(['c2', intervals.Interval(1, 1200), False], self.g._node_to_coords(nodes, 1)) self.assertListEqual(['c3', intervals.Interval(11, 2050), False], self.g._node_to_coords(nodes, 2)) self.assertListEqual(['c4', intervals.Interval(6, 1259), False], self.g._node_to_coords(nodes, 3))
def test_make_contig_first(self): '''test make_contig_first''' e = edge.Edge('c1', 1, 42, 'c2', 50, 10) e_original = copy.copy(e) e.make_contig_first('c1') self.assertEqual(e, e_original) e.make_contig_first('c2') self.assertEqual(e, e_original) e.make_contig_first('c1') self.assertEqual(e, e_original)
def test_merged_coords_from_simple_nonredundant_path(self): '''test merged_coords_from_simple_nonredundant_path''' self.g.add_edge(edge.Edge('c1', 199, 0, 'c2', 1319, 1119)) nodes = ['c1', 'c2'] coords = self.g.merged_coords_from_simple_nonredundant_path(nodes) expected = [ ['c1', intervals.Interval(200, 659), True], ['c2', intervals.Interval(0, 1319), True], ] self.assertListEqual(expected, coords) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 610, 652, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 1250, 1310, 'c3', 5, 65)) nodes = ['c1', 'c2', 'c3'] coords = self.g.merged_coords_from_simple_nonredundant_path(nodes) expected = [['c1', intervals.Interval(0, 609), False], ['c2', intervals.Interval(1, 1249), False], ['c3', intervals.Interval(5, 2159), False]] self.assertListEqual(expected, coords)
def test_to_graph_edge(self): '''Test to_graph_edge''' hits = [ '\t'.join(['781', '981', '10', '210', '200', '200', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # %id too low '\t'.join(['781', '980', '10', '210', '199', '200', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # hit too short '\t'.join(['781', '981', '10', '209', '200', '199', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # hit too short '\t'.join(['1', '200', '1', '200', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation '\t'.join(['200', '1', '200', '1', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation '\t'.join(['800', '1000', '800', '1000', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation '\t'.join(['1000', '800', '1000', '800', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation '\t'.join(['300', '500', '300', '500', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # not at ends '\t'.join(['1', '1000', '1', '1000', '1000', '1000', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # whole contigs hit '\t'.join(['1', '500', '1', '1000', '500', '500', '100.00', '500', '1000', '1', '1', 'ref1', 'qry1']), # contained contig '\t'.join(['1', '200', '791', '991', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref2', 'qry2']), '\t'.join(['781', '981', '10', '210', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref3', 'qry3']), '\t'.join(['991', '791', '781', '981', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref4', 'qry4']), '\t'.join(['210', '10', '15', '215', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref5', 'qry5']), '\t'.join(['781', '981', '991', '791', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref6', 'qry6']), '\t'.join(['10', '210', '215', '5', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref7', 'qry7']), '\t'.join(['210', '10', '980', '780', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref8', 'qry8']), '\t'.join(['995', '795', '215', '15', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref9', 'qry9']), ] expected = [ None, None, None, None, None, None, None, None, None, None, edge.Edge('qry2', 790, 990, 'ref2', 0, 199), edge.Edge('ref3', 780, 980, 'qry3', 9, 209), edge.Edge('qry4', 780, 980, 'ref4', 990, 790), edge.Edge('ref5', 209, 9, 'qry5', 14, 214), edge.Edge('ref6', 780, 980, 'qry6', 990, 790), edge.Edge('qry7', 214, 4, 'ref7', 9, 209), edge.Edge('ref8', 209, 9, 'qry8', 979, 779), edge.Edge('qry9', 214, 14, 'ref9', 994, 794), ] assert len(expected) == len(hits) for i in range(len(hits)): m = mummer.NucmerHit(hits[i]) self.assertEqual(m.to_graph_edge(), expected[i])
def test_find_simple_path(self): '''test find_simple_path''' self.assertListEqual([], self.g.find_simple_path(['c1'])) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.assertListEqual(['c1', 'c2'], self.g.find_simple_path(['c1', 'c2'])) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertListEqual(['c1', 'c2', 'c3'], self.g.find_simple_path(['c1', 'c2', 'c3'])) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertListEqual([], self.g.find_simple_path(['c1', 'c2', 'c3'])) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.assertListEqual([], self.g.find_simple_path(['c1', 'c2'])) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.g.add_edge(edge.Edge('c3', 10, 100, 'c4', 1, 1000)) self.assertListEqual(['c1', 'c2', 'c3', 'c4'], self.g.find_simple_path(['c1', 'c2', 'c3', 'c4'])) self.g.add_edge(edge.Edge('c3', 10, 100, 'c5', 1, 1000)) self.assertListEqual([], self.g.find_simple_path(['c1', 'c2', 'c3']))
def test_remove_middle_node(self): '''test remove_middle_node''' self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 100, 142, 'c3', 1, 42)) self.assertFalse(self.g._remove_middle_node('c1', 'c2', 'c3')) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50)) self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40)) self.assertTrue(self.g._remove_middle_node('c1', 'c2', 'c3')) self.assertTrue('c2' not in self.g.graph) self.assertEqual(1, len(self.g.graph['c1']['c3']['edges'])) self.assertEqual(1, len(self.g.graph['c3']['c1']['edges'])) self.assertEqual(self.g.graph['c1']['c3']['edges'][0], edge.Edge('c1', 91, 100, 'c3', 1, 10)) self.assertEqual(self.g.graph['c3']['c1']['edges'][0], edge.Edge('c1', 91, 100, 'c3', 1, 10))
def test_edges_are_consistent(self): '''test edges_are_consistent''' self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertTrue(self.g._edges_are_consistent('c1', 'c2', 'c3')) self.g.add_edge(edge.Edge('c1', 1, 100, 'c3', 1, 42)) self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3')) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3')) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3')) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42)) self.g.add_edge(edge.Edge('c2', 100, 50, 'c3', 1, 42)) self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3')) self.g = graph.Graph(self.asm) self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 42, 1)) self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42)) self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))
def test_reverse(self): '''test reverse''' e = edge.Edge('c1', 1, 42, 'c2', 50, 10) e.reverse() self.assertEqual(e, edge.Edge('c2', 10, 50, 'c1', 42, 1))
def test_merge_into(self): '''test merge_into''' e1 = edge.Edge('c1', 71, 100, 'c2', 1, 30) e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40) e2_original = copy.copy(e2) self.assertFalse(e1.merge_into(e2, 'c2')) self.assertEqual(e2, e2_original) e1 = edge.Edge('c1', 51, 100, 'c2', 1, 50) e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40) e2_original = copy.copy(e2) self.assertTrue(e1.merge_into(e2, 'c2')) self.assertEqual(e2, e2_original) self.assertEqual(e1, edge.Edge('c1', 91, 100, 'c3', 1, 10)) e2 = edge.Edge('c1', 51, 100, 'c2', 1, 50) e1 = edge.Edge('c2', 41, 80, 'c3', 1, 40) e2_original = copy.copy(e2) self.assertTrue(e1.merge_into(e2, 'c2')) self.assertEqual(e2, e2_original) self.assertEqual(e1, edge.Edge('c1', 91, 100, 'c3', 1, 10)) e1 = edge.Edge('c1', 51, 1, 'c2', 2, 52) e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40) e2_original = copy.copy(e2) self.assertTrue(e1.merge_into(e2, 'c2')) self.assertEqual(e2, e2_original) self.assertEqual(e1, edge.Edge('c1', 12, 1, 'c3', 1, 12)) e2 = edge.Edge('c1', 51, 1, 'c2', 2, 52) e1 = edge.Edge('c2', 41, 80, 'c3', 1, 40) e2_original = copy.copy(e2) self.assertTrue(e1.merge_into(e2, 'c2')) self.assertEqual(e2, e2_original) self.assertEqual(e1, edge.Edge('c1', 12, 1, 'c3', 1, 12))
def test_change_hit_coords_with_intersection(self): '''test test_change_hit_coords_with_intersection''' e = edge.Edge('c1', 1, 42, 'c2', 10, 50) e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 20, 30, 'c2', 29, 38)) e = edge.Edge('c1', 1, 42, 'c2', 10, 50) e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 11, 22, 'c2', 20, 30)) e = edge.Edge('c1', 1, 42, 'c2', 50, 10) e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 20, 30, 'c2', 31, 22)) e = edge.Edge('c1', 1, 42, 'c2', 50, 10) e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 21, 32, 'c2', 30, 20)) e = edge.Edge('c1', 42, 1, 'c2', 10, 50) e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 30, 20, 'c2', 22, 31)) e = edge.Edge('c1', 42, 1, 'c2', 10, 50) e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 32, 21, 'c2', 20, 30)) e = edge.Edge('c1', 42, 1, 'c2', 50, 10) e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 30, 20, 'c2', 38, 29)) e = edge.Edge('c1', 42, 1, 'c2', 50, 10) e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30)) self.assertEqual(e, edge.Edge('c1', 22, 11, 'c2', 30, 20))