text: user156: Given a BAM file, I'd like to calculate the sum, over all reads, of the mapping quality and the number of mapped bases (i.e. number of M's in the CIGAR string).
  For example, given two reads like this:
  read1: mapq=40, mapped_bases=10
  read2: mapq=20, mapped_bases=50
  
  The number I'm looking for is: 
  (40*10) + (20*50) = 1400
  
  One option here is to stream the file and get the two quantities line-by-line. But this seems likely to be slow. Thoughts welcome.
  
  user77: BAM files are stored line by line, so your only option is to process it that way. In python with pysam:
  import pysam
  
  bam = pysam.AlignmentFile("something.bam")
  tot = 0
  for read in bam.fetch():
      if read.is_unmapped:
          continue
      tl = 0
      for op, l in read.cigartuples:
          if op in [0, 7, 8]:
              tl += l
      tot += tl * read.mapping_quality
  bam.close()
  print("the total is {}".format(tot))
  
  
original_text: 156: <p>Given a BAM file, I'd like to calculate the sum, over all reads, of the mapping quality and the number of mapped bases (i.e. number of M's in the CIGAR string).</p>
  
  <p>For example, given two reads like this:</p>
  
  <pre><code>read1: mapq=40, mapped_bases=10
  read2: mapq=20, mapped_bases=50
  </code></pre>
  
  <p>The number I'm looking for is: </p>
  
  <pre><code>(40*10) + (20*50) = 1400
  </code></pre>
  
  <p>One option here is to stream the file and get the two quantities line-by-line. But this seems likely to be slow. Thoughts welcome.</p>
   77: <p>BAM files are stored line by line, so your only option is to process it that way. In python with <code>pysam</code>:</p>
  
  <pre class="lang-py prettyprint-override"><code>import pysam
  
  bam = pysam.AlignmentFile("something.bam")
  tot = 0
  for read in bam.fetch():
      if read.is_unmapped:
          continue
      tl = 0
      for op, l in read.cigartuples:
          if op in [0, 7, 8]:
              tl += l
      tot += tl * read.mapping_quality
  bam.close()
  print("the total is {}".format(tot))
  </code></pre>
  