docs: def bamtag(sam):
      ''' Convert a BAM/SAM with fastqtransformed read names to have UMI and
      cellular barcode tags
      '''
      from pysam import AlignmentFile
  
      start_time = time.time()
  
      sam_file = open_bamfile(sam)
      out_file = AlignmentFile("-", "wh", template=sam_file)
      track = sam_file.fetch(until_eof=True)
  
      # peek at first alignment to determine the annotations
      if is_python3():
          queryalignment = next(track)
      else:
          queryalignment = track.next()
      annotations = detect_alignment_annotations(queryalignment)
      track = itertools.chain([queryalignment], track)
  
      re_string = construct_transformed_regex(annotations)
      parser_re = re.compile(re_string)
  
      for count, aln in enumerate(track, start=1):
          if count and not count % 1000000:
              logger.info("Processed %d alignments." % count)
  
          match = parser_re.match(aln.qname)
          tags = aln.tags
  
          if "cellular" in annotations:
              aln.tags += [('XC', match.group('CB'))]
          if "molecular" in annotations:
              aln.tags += [('RX', match.group('MB'))]
          if "sample" in annotations:
              aln.tags += [('XS', match.group('SB'))]
  
          out_file.write(aln)
  
      total_time = time.time() - start_time
      logger.info('BAM tag conversion done - {:.3}s, {:,} alns/min'.format(total_time, int(60. * count / total_time)))
      logger.info("Processed %d alignments." % count)