def _make_read_unmapped(rec: AlignedSegment) -> None: """Removes mapping information from a read.""" if rec.is_reverse: quals = rec.query_qualities quals.reverse() rec.query_sequence = dnautils.reverse_complement(rec.query_sequence) rec.query_qualities = quals rec.is_reverse = False rec.reference_id = sam.NO_REF_INDEX rec.reference_start = sam.NO_REF_POS rec.cigar = None rec.mapping_quality = 0 rec.template_length = 0 rec.is_duplicate = False rec.is_secondary = False rec.is_supplementary = False rec.is_proper_pair = False rec.is_unmapped = True
def _set_mate_info(self, r1: pysam.AlignedSegment, r2: pysam.AlignedSegment) -> None: """Sets the mate information on a pair of sam records. Handles cases where both reads are mapped, one of the two reads is unmapped or both reads are unmapped. Args: r1: the first read in the pair r2: the sceond read in the pair """ for rec in r1, r2: rec.template_length = 0 rec.is_proper_pair = False if r1.is_unmapped and r2.is_unmapped: # If they're both unmapped just clean the records up for rec, other in [(r1, r2), (r2, r1)]: rec.reference_id = sam.NO_REF_INDEX rec.next_reference_id = sam.NO_REF_INDEX rec.reference_start = sam.NO_REF_POS rec.next_reference_start = sam.NO_REF_POS rec.is_unmapped = True rec.mate_is_unmapped = True rec.is_proper_pair = False rec.mate_is_reverse = other.is_reverse elif r1.is_unmapped or r2.is_unmapped: # If only one is mapped/unmapped copy over the relevant stuff (m, u) = (r1, r2) if r2.is_unmapped else (r2, r1) u.reference_id = m.reference_id u.reference_start = m.reference_start u.next_reference_id = m.reference_id u.next_reference_start = m.reference_start u.mate_is_reverse = m.is_reverse u.mate_is_unmapped = False u.set_tag("MC", m.cigarstring) m.next_reference_id = u.reference_id m.next_reference_start = u.reference_start m.mate_is_reverse = u.is_reverse m.mate_is_unmapped = True else: # Else they are both mapped for rec, other in [(r1, r2), (r2, r1)]: rec.next_reference_id = other.reference_id rec.next_reference_start = other.reference_start rec.mate_is_reverse = other.is_reverse rec.mate_is_unmapped = False rec.set_tag("MC", other.cigarstring) if r1.reference_id == r2.reference_id: r1p = r1.reference_end if r1.is_reverse else r1.reference_start r2p = r2.reference_end if r2.is_reverse else r2.reference_start r1.template_length = r2p - r1p r2.template_length = r1p - r2p # Arbitrarily set proper pair if the we have an FR pair with isize <= 1000 if r1.is_reverse != r2.is_reverse and abs( r1.template_length) <= 1000: fpos, rpos = (r2p, r1p) if r1.is_reverse else (r1p, r2p) if fpos < rpos: r1.is_proper_pair = True r2.is_proper_pair = True