def test_NNC_match(self): """ Example where the transcript is an NNC match to an existing one by virtue of a new splice donor. """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" positions = [1, 110, 900, 1000] edge_IDs = [talon.edge_counter.value() + 1] vertex_IDs = [talon.vertex_counter.value() + 1, 5] strand = "+" v_novelty = [0, 0] gene_ID, transcript_ID, transcript_novelty, start_end_info = talon.process_NNC( chrom, positions, strand, edge_IDs, vertex_IDs, transcript_dict, gene_starts, gene_ends, edge_dict, location_dict, vertex_2_gene, run_info) correct_gene_ID = fetch_correct_ID("TG1", "gene", cursor) assert gene_ID == correct_gene_ID assert start_end_info["vertex_IDs"] == [1] + vertex_IDs + [6] assert transcript_dict[frozenset(start_end_info["edge_IDs"])] != None conn.close()
def test_no_match(self): """ Example with no FSM match """ conn, cursor = get_db_cursor() build = "toy_build" db = "scratch/toy.db" talon.get_counters(db) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(db, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" positions = [1, 100, 500, 600] strand = "+" edge_IDs = [2] vertex_IDs = [2, 3, 4, 5] v_novelty = [0, 0, 0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) gene_ID, transcript_ID, novelty, start_end_info = talon.process_FSM( chrom, positions, strand, edge_IDs, vertex_IDs, all_matches, gene_starts, gene_ends, edge_dict, location_dict, run_info) assert gene_ID == transcript_ID == None conn.close()
def test_no_match(self): """ Example with no ISM match """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" run_info = talon.init_run_info(database, build) talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) transcript_dict = init_refs.make_transcript_dict(cursor, build) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" strand = "+" positions = [ 1, 100, 900, 1000 ] edge_IDs = [200] vertex_IDs = [2, 5] v_novelty = [0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) assert all_matches == None conn.close()
def test_match(self): """ Example where the transcript is a monoexonic match. """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) init_refs.make_temp_novel_gene_table(cursor, build) init_refs.make_temp_monoexonic_transcript_table(cursor, build) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr4" strand = "-" positions = ( 3900, 1100 ) annotation = talon.identify_monoexon_transcript(chrom, positions, strand, cursor, location_dict, edge_dict, transcript_dict, vertex_2_gene, gene_starts, gene_ends, run_info, 'temp_gene', 'temp_monoexon') correct_gene_ID = fetch_correct_ID("TG6", "gene", cursor) correct_transcript_ID = fetch_correct_ID("TG6-001", "transcript", cursor) assert annotation['gene_ID'] == correct_gene_ID assert annotation['start_delta'] == 100 assert annotation['end_delta'] == -100 conn.close()
def test_all_genes(self): """ Get starts and ends for all known genes in the database """ conn, cursor = get_db_cursor() build = "toy_build" starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") conn.close() # Check starts. Field 1: Gene ID, Field 2: start pos, Field 3: vertex ID assert starts == {1: {1: 1}, 2: {2000: 8}, 3: {5000: 9}, 4: {1: 13}, 5: {1: 19, 800: 23}, 6: {4000: 34}} assert ends == {1: {1000: 6}, 2: {900: 5}, 3: {6500: 12}, 4: {1000: 18}, 5: {2200: 30, 2600: 32}, 6: {1000: 33}}
def test_antisense(self): """ Example where the vertices are known but there is no same-strand match """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) locations = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") # Construct temp novel gene db init_refs.make_temp_novel_gene_table(cursor, "toy_build") chrom = "chr1" start = 1000 end = 1 edge_IDs = [talon.edge_counter.value() + 1] positions = [1000, 900, 100, 1] vertex_IDs = [5, 2] strand = "-" anti_strand = "+" v_novelty = (0, 0, 0, 0) # Find antisense match gene_ID, transcript_ID, gene_novelty, transcript_novelty, start_end_info = \ talon.process_spliced_antisense(chrom, positions, strand, edge_IDs, vertex_IDs, transcript_dict, gene_starts, gene_ends, edge_dict, locations, vertex_2_gene, run_info, cursor, "temp_gene") #anti_gene_ID = talon.find_gene_match_on_vertex_basis(vertex_IDs, # anti_strand, # vertex_2_gene) correct_gene_ID = fetch_correct_ID("TG1", "gene", cursor) anti_gene_ID = gene_novelty[-1][-1] assert anti_gene_ID == correct_gene_ID assert start_end_info["vertex_IDs"] == [6, 5, 2, 1] conn.close()
def test_intergenic(self): """ Example where the transcript is an NIC match to an existing one by virtue of a new splice donor. """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") correct_gene_ID = talon.gene_counter.value() + 1 # Construct temp novel gene db init_refs.make_temp_novel_gene_table(cursor, "toy_build") chrom = "chrX" positions = [1, 100, 900, 1000] edge_IDs = [ talon.edge_counter.value() + 1, talon.edge_counter.value() + 2 ] vertex_IDs = [ talon.vertex_counter.value() + 1, talon.vertex_counter.value() + 2 ] strand = "+" gene_ID, transcript_ID, gene_novelty, transcript_novelty, start_end_info = \ talon.process_remaining_mult_cases(chrom, positions, strand, edge_IDs, vertex_IDs, transcript_dict, gene_starts, gene_ends, edge_dict, location_dict, vertex_2_gene, run_info, cursor, "temp_gene") assert gene_ID == correct_gene_ID assert transcript_dict[frozenset(start_end_info["edge_IDs"])] != None assert gene_novelty[0][-2] == "intergenic_novel" conn.close()
def test_genomic(self): """ Example where the transcript overlaps a gene but contains no known splice vertices """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") # Construct temp novel gene db init_refs.make_temp_novel_gene_table(cursor, "toy_build") chrom = "chr1" positions = [1000, 950, 700, 600] edge_IDs = [ talon.edge_counter.value() + 1, talon.edge_counter.value() + 2 ] vertex_IDs = [ talon.vertex_counter.value() + 1, talon.vertex_counter.value() + 2 ] strand = "-" gene_ID, transcript_ID, gene_novelty, transcript_novelty, start_end_info = \ talon.process_remaining_mult_cases(chrom, positions, strand, edge_IDs, vertex_IDs, transcript_dict, gene_starts, gene_ends, edge_dict, location_dict, vertex_2_gene, run_info, cursor, "temp_gene") correct_gene_ID = fetch_correct_ID("TG3", "gene", cursor) assert gene_ID == correct_gene_ID assert transcript_dict[frozenset(start_end_info["edge_IDs"])] != None assert gene_novelty == [] assert transcript_novelty[-1][-2] == "genomic_transcript" conn.close()
def test_ISM_suffix(self): """ Example where the transcript is an ISM with suffix """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" run_info = talon.init_run_info(database, build) talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) transcript_dict = init_refs.make_transcript_dict(cursor, build) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" strand = "+" positions = [ 500, 600, 900, 1000 ] edge_IDs = [4] vertex_IDs = [4, 5] v_novelty = [0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) gene_ID, transcript_ID, novelty, start_end_info = talon.process_ISM(chrom, positions, strand, edge_IDs, vertex_IDs, all_matches, transcript_dict, gene_starts, gene_ends, edge_dict, location_dict, run_info) correct_gene_ID = fetch_correct_ID("TG1", "gene", cursor) assert gene_ID == correct_gene_ID assert start_end_info["vertex_IDs"] == [3, 4, 5, 6] assert start_end_info["edge_IDs"] == [3, 4, 5] assert start_end_info["start_novelty"] == 0 # because the exon is known assert start_end_info["end_novelty"] == 0 assert transcript_dict[frozenset(start_end_info["edge_IDs"])] != None conn.close()
def test_partial_match(self): """ Example where the transcript overlaps a single-exon transcript, but is shorter. In the past, the start would be assigned to the annotated start, and the end would be novel. This is no longer the case- at this time, the transcript will be assigned to the annotated match. """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) init_refs.make_temp_novel_gene_table(cursor, build) init_refs.make_temp_monoexonic_transcript_table(cursor, build) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr4" strand = "-" positions = ( 3900, 2900 ) annotation = talon.identify_monoexon_transcript(chrom, positions, strand, cursor, location_dict, edge_dict, transcript_dict, vertex_2_gene, gene_starts, gene_ends, run_info, 'temp_gene', 'temp_monoexon') correct_gene_ID = fetch_correct_ID("TG6", "gene", cursor) correct_transcript_ID = fetch_correct_ID("TG6-001", "transcript", cursor) assert annotation['gene_ID'] == correct_gene_ID assert annotation['transcript_ID'] == correct_transcript_ID assert annotation['start_delta'] == 100 assert annotation['end_delta'] == -1900 conn.close()
def test_FSM_start_diff(self): """ Example where the transcript is an FSM but has a difference on the start large enough to be novel. """ conn, cursor = get_db_cursor() build = "toy_build" db = "scratch/toy.db" talon.get_counters(db) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(db, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) orig_vertices = talon.vertex_counter.value() gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" positions = [2501, 1500, 1000, 900] #First postion is > 500bp away strand = "-" edge_IDs = [7] vertex_IDs = [7, 6] v_novelty = [0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) gene_ID, transcript_ID, novelty, start_end_info = talon.process_FSM( chrom, positions, strand, edge_IDs, vertex_IDs, all_matches, gene_starts, gene_ends, edge_dict, location_dict, run_info) correct_gene_ID = fetch_correct_ID("TG3", "gene", cursor) correct_transcript_ID = fetch_correct_ID("TG3-001", "transcript", cursor) assert gene_ID == correct_gene_ID assert transcript_ID == correct_transcript_ID assert start_end_info["start_vertex"] == orig_vertices + 1 assert start_end_info["end_vertex"] == 5 conn.close()
def test_interval_1_2000(self): """ Get starts and ends for genes in the database that overlap the interval chr1:1-2000 """ conn, cursor = get_db_cursor() build = "toy_build" starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start", chrom = "chr1", start = 1, end = 2000) ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end", chrom = "chr1", start = 1, end = 2000) conn.close() assert starts == {1: {1: 1}, 2: {2000: 8}} assert ends == {1: {1000: 6}, 2: {900: 5}}
def test_FSM_perfect(self): """ Example where the transcript is a perfect full splice match. """ conn, cursor = get_db_cursor() build = "toy_build" db = "scratch/toy.db" talon.get_counters(db) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(db, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) gene_starts = init_refs.make_gene_start_or_end_dict( cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" positions = [1, 100, 500, 600, 900, 1010] strand = "+" edge_IDs = [2, 3, 4] vertex_IDs = [2, 3, 4, 5] v_novelty = [0, 0, 0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) gene_ID, transcript_ID, novelty, start_end_info = talon.process_FSM( chrom, positions, strand, edge_IDs, vertex_IDs, all_matches, gene_starts, gene_ends, edge_dict, location_dict, run_info) correct_gene_ID = fetch_correct_ID("TG1", "gene", cursor) correct_transcript_ID = fetch_correct_ID("TG1-001", "transcript", cursor) assert gene_ID == correct_gene_ID assert transcript_ID == correct_transcript_ID assert novelty == [] assert start_end_info["start_vertex"] == 1 assert start_end_info["end_vertex"] == 6 assert start_end_info["diff_3p"] == 10 conn.close()
def test_ISM_prefix(self): """ Example where the transcript is a prefix ISM with a novel start """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" run_info = talon.init_run_info(database, build) talon.get_counters(database) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) transcript_dict = init_refs.make_transcript_dict(cursor, build) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr1" strand = "+" positions = [ 1, 100, 500, 600 ] edge_IDs = [2] vertex_IDs = [2, 3] v_novelty = [0, 0] all_matches = talon.search_for_ISM(edge_IDs, transcript_dict) gene_ID, transcript_ID, novelty, start_end_info = talon.process_ISM(chrom, positions, strand, edge_IDs, vertex_IDs, all_matches, transcript_dict, gene_starts, gene_ends, edge_dict, location_dict, run_info) correct_gene_ID = fetch_correct_ID("TG1", "gene", cursor) assert gene_ID == correct_gene_ID assert start_end_info["vertex_IDs"] == [1, 2, 3, 4] assert start_end_info["edge_IDs"] == [1, 2, 3] conn.close()
def test_antisense(self): """ Example where the transcript is antisense """ conn, cursor = get_db_cursor() build = "toy_build" database = "scratch/toy.db" talon.get_counters(database) init_refs.make_temp_novel_gene_table(cursor, build) init_refs.make_temp_monoexonic_transcript_table(cursor, build) edge_dict = init_refs.make_edge_dict(cursor) location_dict = init_refs.make_location_dict(build, cursor) run_info = talon.init_run_info(database, build) transcript_dict = init_refs.make_transcript_dict(cursor, build) vertex_2_gene = init_refs.make_vertex_2_gene_dict(cursor) gene_starts = init_refs.make_gene_start_or_end_dict(cursor, build, "start") gene_ends = init_refs.make_gene_start_or_end_dict(cursor, build, "end") chrom = "chr4" strand = "+" positions = ( 1300, 3900 ) annotation = talon.identify_monoexon_transcript(chrom, positions, strand, cursor, location_dict, edge_dict, transcript_dict, vertex_2_gene, gene_starts, gene_ends, run_info, 'temp_gene', 'temp_monoexon') anti_gene_ID = fetch_correct_ID("TG6", "gene", cursor) gene_novelty_types = [ x[-2] for x in annotation['gene_novelty']] t_novelty_types = [ x[-2] for x in annotation['transcript_novelty']] assert annotation['gene_novelty'][0][-1] == "TRUE" assert "antisense_gene" in gene_novelty_types assert "antisense_transcript" in t_novelty_types conn.close()