This is a test version of Biostars. For the public version, visit https://www.biostars.org.
unmapped reads with pysam

I have a bam file produces by BWA-MEM. It has some unmapped reads, e.g.

D00733:389:CD1T7ANXX:3:1101:1572:2235   77  *   0   0   *   *   0   0   CAGTTTCACTGTATAAATTGCTTATACTTAGACATGCATGGCTTAATCTT  AAB=AFGDGCFFGGGGGGGGGCGGGGGGGGGGGGGGGGGGGGGGGGGGGF  AS:i:0  XS:i:0
D00733:389:CD1T7ANXX:3:1101:1572:2235   141 *   0   0   *   *   0   0   GTATCTTCTAGAGAGAGGGAATGGGCGAGAGAAAAAGAGATTTCGGTTTC  BBB@BGGGGGGGGFGGGGGGGGEGGGGGGDGFGGGGGGGGEGGGGGFGGG  AS:i:0  XS:i:0
D00733:389:CD1T7ANXX:3:1101:6797:2243   77  *   0   0   *   *   0   0   TGTCTGGACCTGGTGAGTTTCCCCGTGTTGAGTCAAATTAAGCCGCAGGC  3A<0BDGGGGGGGGGGGGGFGGGGGFGGGGGGGGGGGGGGGGGGGGGGGG  AS:i:0  XS:i:0

I use pysam to count some stats on the bam file, but for some reason pysam does not find these unmapped reads.

bam=pysam.AlignmentFile(file,"rb")
for line in bam.fetch():
    line=line.tostring(bam)
    line=line.split("\t")
    if  line[2]=="*":
        print(line)

The code does not return anything

Any ideas how to fix this?

Thanks

pysam

2 answers

you should add until_eof=True in the fetch()

You can now get all unmapped read pairs efficiently by running AlignmentFile.fetch('*').

see: https://github.com/pysam-developers/pysam/issues/424#issuecomment-2192755497

AFAIK, fetch('*') only returns reads where both mates are unmapped. When a read pair has 1 mate that's mapped and one that's unmapped, the unmapped mate will be located next to their mapped mate in the file, so should be returned by the regular interval query (ie. fetch('chr1:12345-54321')). In contrast, the unmapped read pairs are located at the end of the BAM/CRAM file, and so require a special query.

Log in to answer this question.