def _update_genome_from_delta_data(franken_genome, external_genome, parser_state, distance_covered, is_external_insert): from nasp.nasp_objects import Genome if distance_covered == -1: distance_covered = parser_state['final_pos'] - parser_state[ 'reference_pos'] + 1 is_external_insert = True if distance_covered > 0: if parser_state['external_is_reversed']: matching_segment = Genome.reverse_complement(''.join( external_genome.get_call( (parser_state['external_pos'] - distance_covered + 1), parser_state['external_pos']))) else: matching_segment = ''.join( external_genome.get_call( parser_state['external_pos'], (parser_state['external_pos'] + distance_covered - 1))) franken_genome.set_call(matching_segment, parser_state['reference_pos'], 'X') parser_state[ 'reference_pos'] = parser_state['reference_pos'] + distance_covered parser_state['external_pos'] = parser_state['external_pos'] + ( -distance_covered if parser_state['external_is_reversed'] else distance_covered) if is_external_insert: parser_state['external_pos'] += -1 if parser_state[ 'external_is_reversed'] else 1 else: franken_genome.set_call('.', parser_state['reference_pos'], '!') parser_state['reference_pos'] += 1 return parser_state
def _update_genome_from_delta_data(franken_genome, external_genome, parser_state, distance_covered, is_external_insert): from nasp.nasp_objects import Genome if distance_covered == -1: distance_covered = parser_state['final_pos'] - parser_state['reference_pos'] + 1 is_external_insert = True if distance_covered > 0: if parser_state['external_is_reversed']: matching_segment = Genome.reverse_complement(''.join( external_genome.get_call(( parser_state['external_pos'] - distance_covered + 1 ), parser_state['external_pos']))) else: matching_segment = ''.join(external_genome.get_call(parser_state['external_pos'], ( parser_state['external_pos'] + distance_covered - 1 ))) franken_genome.set_call(matching_segment, parser_state['reference_pos'], 'X') parser_state['reference_pos'] = parser_state['reference_pos'] + distance_covered parser_state['external_pos'] = parser_state['external_pos'] + ( -distance_covered if parser_state['external_is_reversed'] else distance_covered ) if is_external_insert: parser_state['external_pos'] += -1 if parser_state['external_is_reversed'] else 1 else: franken_genome.set_call('.', parser_state['reference_pos'], '!') parser_state['reference_pos'] += 1 return parser_state
class GenomeTestCase(unittest.TestCase): def setUp(self): self.genome = Genome() @unittest.skip("Covered by GenomeStatus.set_value()") def test_set_call(self): pass @unittest.skip("Covered by GenomeStatus.get_value()") def test_get_call(self): pass # FIXME: it should throw an exception or the prefix should be optional # If the prefix is missing, the contig will be appended to the previous contig def test__import_fasta_line_missing_prefix(self): expected = "SEQUENCE" prefix = "prefix" identifier = ">" + expected self.genome._import_fasta_line(identifier, prefix) self.assertListEqual([expected], self.genome.get_contigs()) # FIXME: assertRaises a specific Exception def test__import_fasta_line_missing_identifier(self): sequence = "ABCDGHMNRSTUVWXY" with self.assertRaises(Exception): self.genome._import_fasta_line(sequence) # FIXME: assertRaises a specific Exception def test__import_fasta_line_missing_contig(self): with self.assertRaises(Exception): self.genome._import_fasta_line("SEQUENCE1") self.genome._import_fasta_line("SEQUENCE2") def test__import_fasta_line_identifier_contains_spaces(self): identifier = ">prefixName Description" prefix = "prefix" expected = "Name" self.genome._import_fasta_line(identifier, prefix) self.assertListEqual([expected], self.genome.get_contigs()) @unittest.skip("Covered by _import_fasta_file tests") def test_import_fasta_file(self): pass def test_reverse_complement(self): dna_string = "ABCDGHMNRSTUVWXYabcdghmnrstuvwxy" expected = "rxwbaasynkdchgvtRXWBAASYNKDCHGVT" dna_string2 = "ABCDGHKNRSTTVWXYabcdghknrsttvwxy" self.assertEqual(expected, self.genome.reverse_complement(dna_string)) self.assertEqual(dna_string2, self.genome.reverse_complement(expected)) def test_simple_call(self): expected = ["A", "C", "G", "T"] for expect in expected: self.assertEqual(expect, self.genome.simple_call(expect.lower())) # It should check the base at position one self.assertEqual("A", self.genome.simple_call("agctn")) # It should replace uracil with thymine self.assertEqual("T", self.genome.simple_call("u")) # It should replace X with N if not allowed self.assertEqual("N", self.genome.simple_call("X", allow_x=False)) self.assertEqual("X", self.genome.simple_call("X", allow_x=True)) # It should replace . with N if deletions are not allowed self.assertEqual("N", self.genome.simple_call(".", allow_del=False)) self.assertEqual(".", self.genome.simple_call(".", allow_del=True)) # It should replace degeneracies with N self.assertEqual("N", self.genome.simple_call("d")) def test_simple_call_with_empty(self): self.assertEqual("N", self.genome.simple_call("", allow_del=False)) self.assertEqual(".", self.genome.simple_call("", allow_del=True)) def test_simple_call_with_none(self): self.assertEqual("N", self.genome.simple_call(None, allow_del=False)) self.assertEqual(".", self.genome.simple_call(None, allow_del=True))
class GenomeTestCase(unittest.TestCase): def setUp(self): self.genome = Genome() @unittest.skip("Covered by GenomeStatus.set_value()") def test_set_call(self): pass @unittest.skip("Covered by GenomeStatus.get_value()") def test_get_call(self): pass # FIXME: it should throw an exception or the prefix should be optional # If the prefix is missing, the contig will be appended to the previous contig def test__import_fasta_line_missing_prefix(self): expected = 'SEQUENCE' prefix = 'prefix' identifier = '>' + expected self.genome._import_fasta_line(identifier, prefix) self.assertListEqual([expected], self.genome.get_contigs()) # FIXME: assertRaises a specific Exception def test__import_fasta_line_missing_identifier(self): sequence = 'ABCDGHMNRSTUVWXY' with self.assertRaises(Exception): self.genome._import_fasta_line(sequence) # FIXME: assertRaises a specific Exception def test__import_fasta_line_missing_contig(self): with self.assertRaises(Exception): self.genome._import_fasta_line('SEQUENCE1') self.genome._import_fasta_line('SEQUENCE2') def test__import_fasta_line_identifier_contains_spaces(self): identifier = '>prefixName Description' prefix = 'prefix' expected = 'Name' self.genome._import_fasta_line(identifier, prefix) self.assertListEqual([expected], self.genome.get_contigs()) @unittest.skip("Covered by _import_fasta_file tests") def test_import_fasta_file(self): pass def test_reverse_complement(self): dna_string = 'ABCDGHMNRSTUVWXYabcdghmnrstuvwxy' expected = 'rxwbaasynkdchgvtRXWBAASYNKDCHGVT' dna_string2 = 'ABCDGHKNRSTTVWXYabcdghknrsttvwxy' self.assertEqual(expected, self.genome.reverse_complement(dna_string)) self.assertEqual(dna_string2, self.genome.reverse_complement(expected)) def test_simple_call(self): expected = ['A', 'C', 'G', 'T'] for expect in expected: self.assertEqual(expect, self.genome.simple_call(expect.lower())) # It should check the base at position one self.assertEqual('A', self.genome.simple_call('agctn')) # It should replace uracil with thymine self.assertEqual('T', self.genome.simple_call('u')) # It should replace X with N if not allowed self.assertEqual('N', self.genome.simple_call('X', allow_x=False)) self.assertEqual('X', self.genome.simple_call('X', allow_x=True)) # It should replace . with N if deletions are not allowed self.assertEqual('N', self.genome.simple_call('.', allow_del=False)) self.assertEqual('.', self.genome.simple_call('.', allow_del=True)) # It should replace degeneracies with N self.assertEqual('N', self.genome.simple_call('d')) def test_simple_call_with_empty(self): self.assertEqual('N', self.genome.simple_call('', allow_del=False)) self.assertEqual('.', self.genome.simple_call('', allow_del=True)) def test_simple_call_with_none(self): self.assertEqual('N', self.genome.simple_call(None, allow_del=False)) self.assertEqual('.', self.genome.simple_call(None, allow_del=True))