def test_to_cigar_units(self, to_convert, expected): # We can convert the raw form. to_convert = list(to_convert) expected = list(expected) actual = cigar.to_cigar_units(to_convert) self.assertEqual(actual, expected) # We can also convert the string form by formatting actual. self.assertEqual( cigar.to_cigar_units(cigar.format_cigar_units(actual)), expected)
def test_align_reads_simple(self, read_seq, expected_align_pos, expected_cigar, comment): """Test Aligner.align_reads(). Simple tests. Targets consist of - original reference sequence. - a sequence with 'AA' insertion at position 14 and - 'T' deletion at position 19. Args: read_seq: str, read sequence. expected_align_pos: int, expected aligned position expected_cigar: [(int, str)], expected cigar information. comment: str, test comment. """ ref_seq = 'AAAAAAAAAAAAATGCATGGGGGATTTTTTTTTTT' region = ranges.make_range('ref', 10, 10 + len(ref_seq)) align_reads = self.make_test_aligner(ref_seq, region) # redacted # implemented. For local alignment, it ensures that there are enough exact # matches between the reference and target for end-to-end alignment. targets = [ref_seq, 'AAAAAAAAAAAAATAAGCAGGGGGATTTTTTTTTTT'] read = test_utils.make_read( read_seq, chrom='ref', start=0, cigar=[(len(read_seq), 'M')], quals=[64] * len(read_seq), name='read') aligned_reads = align_reads.align_reads(targets, [read]) self.assertEqual(expected_align_pos, aligned_reads[0].alignment.position.position, comment) self.assertEqual( _cigar.to_cigar_units(expected_cigar), list(aligned_reads[0].alignment.cigar), comment) read = test_utils.make_read( read_seq, chrom='ref', start=0, cigar=[(2, 'H'), (len(read_seq), 'M'), (1, 'H')], quals=[64] * len(read_seq), name='read') aligned_reads = align_reads.align_reads(targets, [read]) expected_cigar_w_hard_clip = [(2, 'H')] + expected_cigar + [(1, 'H')] self.assertEqual( _cigar.to_cigar_units(expected_cigar_w_hard_clip), list(aligned_reads[0].alignment.cigar), comment)
def make_read(bases, quals=None, cigar=None, mapq=50, chrom='chr1', start=1, name='read'): """Makes a third_party.nucleus.protos.Read for testing.""" if quals and len(bases) != len(quals): raise ValueError('Incompatable bases and quals', bases, quals) read = reads_pb2.Read( fragment_name=name, proper_placement=True, read_number=1, number_reads=2, aligned_sequence=bases, aligned_quality=quals, alignment=reads_pb2.LinearAlignment( position=position_pb2.Position(reference_name=chrom, position=start), mapping_quality=mapq, cigar=_cigar.to_cigar_units(cigar) if cigar else [])) return read
def make_read(bases, start, quals=None, cigar=None, mapq=50, chrom='chr1', name=None): """Makes a nucleus.genomics.v1.Read for testing.""" if quals and len(bases) != len(quals): raise ValueError('Incompatable bases and quals', bases, quals) read = reads_pb2.Read( fragment_name=name if name else 'read_' + str(make_read.counter), proper_placement=True, read_number=1, number_reads=2, aligned_sequence=bases, aligned_quality=quals, alignment=reads_pb2.LinearAlignment( position=position_pb2.Position(reference_name=chrom, position=start), mapping_quality=mapq, cigar=_cigar.to_cigar_units(cigar) if cigar else [])) make_read.counter += 1 return read