code: def align_bam(in_bam, ref_file, names, align_dir, data):
      config = data["config"]
      out_file = os.path.join(align_dir, "{0}-sort.bam".format(names["lane"]))
      samtools = config_utils.get_program("samtools", config)
      bedtools = config_utils.get_program("bedtools", config)
      resources = config_utils.get_resources("samtools", config)
      num_cores = config["algorithm"].get("num_cores", 1)
      max_mem = config_utils.adjust_memory(resources.get("memory", "1G"),
                                           3, "decrease").upper()
      if not utils.file_exists(out_file):
          with tx_tmpdir(data) as work_dir:
              with postalign.tobam_cl(data, out_file, bam.is_paired(in_bam)) as (tobam_cl, tx_out_file):
                  bwa_cmd = _get_bwa_mem_cmd(data, out_file, ref_file, "-")
                  tx_out_prefix = os.path.splitext(tx_out_file)[0]
                  prefix1 = "%s-in1" % tx_out_prefix
                  cmd = ("unset JAVA_HOME && "
                         "{samtools} sort -n -o -l 1 -@ {num_cores} -m {max_mem} {in_bam} {prefix1} "
                         "| {bedtools} bamtofastq -i /dev/stdin -fq /dev/stdout -fq2 /dev/stdout "
                         "| {bwa_cmd} | ")
                  cmd = cmd.format(**locals()) + tobam_cl
                  do.run(cmd, "bwa mem alignment from BAM: %s" % names["sample"], None,
                         [do.file_nonempty(tx_out_file), do.file_reasonable_size(tx_out_file, in_bam)])
      return out_file