docs: def miraligner(args):
      """
      Realign BAM hits to miRBAse to get better accuracy and annotation
      """
      hairpin, mirna = _download_mirbase(args)
      precursors = _read_precursor(args.hairpin, args.sps)
      matures = _read_mature(args.mirna, args.sps)
      gtf = _read_gtf(args.gtf)
      out_dts = []
      out_files = []
      for bam_fn in args.files:
          sample = op.splitext(op.basename(bam_fn))[0]
          logger.info("Reading %s" % bam_fn)
          if bam_fn.endswith("bam") or bam_fn.endswith("sam"):
              bam_fn = _sam_to_bam(bam_fn)
              bam_sort_by_n = op.splitext(bam_fn)[0] + "_sort"
              pysam.sort("-n", bam_fn, bam_sort_by_n)
              reads = _read_bam(bam_sort_by_n + ".bam", precursors)
          elif bam_fn.endswith("fasta") or bam_fn.endswith("fa") or \
                  bam_fn.endswith("fastq"):
              if args.collapse:
                  bam_fn = _collapse_fastq(bam_fn)
              out_file = op.join(args.out, sample + ".premirna")
              bam_fn = _filter_seqs(bam_fn)
              if args.miraligner:
                  _cmd_miraligner(bam_fn, out_file, args.sps, args.hairpin, args.out)
                  reads = _read_miraligner(out_file)
                  out_files.append(out_file)
          else:
              raise ValueError("Format not recognized.")
  
          if args.miraligner:
              _mirtop(out_files, args.hairpin, args.gtf, args.sps, args.out)
  
          if not args.miraligner:
              reads = _annotate(reads, matures, precursors)
  
          out_file = op.join(args.out, sample + ".mirna")
          out_file, dt, dt_pre = _tab_output(reads, out_file, sample)
          try:
              vcf_file = op.join(args.out, sample + ".vcf")
              if not file_exists(vcf_file):
                  # if True:
                  create_vcf(dt_pre, matures, gtf, vcf_file)
              try:
                  import vcf
                  vcf.Reader(filename=vcf_file)
              except Exception as e:
                  logger.warning(e.__doc__)
                  logger.warning(e.message)
          except Exception as e:
              # traceback.print_exc()
              logger.warning(e.__doc__)
              logger.warning(e.message)
          if isinstance(dt, pd.DataFrame):
              out_dts.append(dt)
  
      if out_dts:
          _create_counts(out_dts, args.out)
      else:
          print("No files analyzed!")