def add_intervals(graph, exonsDb): iv_tree = IntervalTree() for node in graph.nodes(): exon = exonsDb[node] iv_tree.add_interval(exon) return iv_tree
class TestFindRI(unittest.TestCase): def setUp(self): self.exonsDB = {} self.ex1 = Exon('chrX', 1000, 2000, 'ex1.1', '+') self.ex2 = Exon('chrX', 3000, 4000, 'ex1.1', '+') self.ex3 = Exon('chrX', 5000, 6000, 'ex1.1', '+') self.ex4 = Exon('chrX', 7000, 8000, 'ex1.1', '+') self.exonsDB[str(self.ex1)] = self.ex1 self.exonsDB[str(self.ex2)] = self.ex2 self.exonsDB[str(self.ex3)] = self.ex3 self.exonsDB[str(self.ex4)] = self.ex4 self.tree = IntervalTree() self.tree.add_interval(self.ex1) self.tree.add_interval(self.ex2) self.tree.add_interval(self.ex3) self.tree.add_interval(self.ex4) self.graph = nx.DiGraph() def test_no_retained_introns(self): self.path1 = [str(self.ex1), str(self.ex2), str(self.ex3)] self.path2 = [str(self.ex1), str(self.ex3), str(self.ex4)] self.graph.add_path(self.path1) self.graph.add_path(self.path2) self.events = list(find_RI(self.graph, self.tree, self.exonsDB)) self.assertEqual(len(self.events), 0) def test_one_retained_introns(self): self.ex5 = Exon('chrX', 3000, 6000, 'ex1.1', '+') self.exonsDB[str(self.ex5)] = self.ex5 self.tree.add_interval(self.ex5) self.path1 = [str(self.ex1), str(self.ex2), str(self.ex3), str(self.ex4)] self.path2 = [str(self.ex1), str(self.ex5), str(self.ex4)] self.graph.add_path(self.path1) self.graph.add_path(self.path2) self.events = list(find_RI(self.graph, self.tree, self.exonsDB)) self.assertEqual(len(self.events), 1) def test_two_retained_introns(self): self.ex5 = Exon('chrX', 1000, 4000, 'ex1.1', '+') self.exonsDB[str(self.ex5)] = self.ex5 self.tree.add_interval(self.ex5) self.ex6 = Exon('chrX', 5000, 8000, 'ex1.1', '+') self.exonsDB[str(self.ex6)] = self.ex6 self.tree.add_interval(self.ex6) self.path1 = [str(self.ex1), str(self.ex2), str(self.ex3), str(self.ex4)] self.path2 = [str(self.ex5), str(self.ex6)] self.graph.add_path(self.path1) self.graph.add_path(self.path2) self.events = list(find_RI(self.graph, self.tree, self.exonsDB)) self.assertEqual(len(self.events), 2)
def remove_overlaps(events, exonsDB): tree = IntervalTree() all_nodes = set() for path in events: for node in path: all_nodes.add(node) exon = exonsDB[node] tree.add_interval(exon) overlapped_exons = set() for node in all_nodes: exon = exonsDB[node] for overlap in tree.find(exon.start, exon.end): if (overlap.start != exon.start or overlap.end != exon.end): overlapped_exons.add(node) new_events = [] for path in events: if len(set(path).intersection(overlapped_exons)) == 0: new_events.append(path) return new_events