code: def prepare_bam(job, uuid, url, config, paired_url=None, rg_line=None):
      if config.run_bwa:
          get_bam = job.wrapJobFn(setup_and_run_bwakit,
                                  uuid,
                                  url,
                                  rg_line,
                                  config,
                                  paired_url=paired_url).encapsulate()
      elif '.bam' in url.lower():
          job.fileStore.logToMaster("Downloading BAM: %s" % uuid)
          get_bam = job.wrapJobFn(download_url_job,
                                  url,
                                  name='toil.bam',
                                  s3_key_path=config.ssec,
                                  disk=config.file_size).encapsulate()
      else:
          raise ValueError('Could not generate BAM file for %s\n'
                           'Provide a FASTQ URL and set run-bwa or '
                           'provide a BAM URL that includes .bam extension.' % uuid)
      if config.sorted and not config.run_bwa:
          sorted_bam = get_bam
      else:
          sorted_bam_disk = PromisedRequirement(lambda bam: 3 * bam.size, get_bam.rv())
          sorted_bam = get_bam.addChildJobFn(run_samtools_sort,
                                             get_bam.rv(),
                                             cores=config.cores,
                                             disk=sorted_bam_disk)
      index_bam_disk = PromisedRequirement(lambda bam: bam.size, sorted_bam.rv())
      index_bam = job.wrapJobFn(run_samtools_index, sorted_bam.rv(), disk=index_bam_disk)
      job.addChild(get_bam)
      sorted_bam.addChild(index_bam)
      if config.preprocess:
          preprocess = job.wrapJobFn(run_gatk_preprocessing,
                                     sorted_bam.rv(),
                                     index_bam.rv(),
                                     config.genome_fasta,
                                     config.genome_dict,
                                     config.genome_fai,
                                     config.g1k_indel,
                                     config.mills,
                                     config.dbsnp,
                                     memory=config.xmx,
                                     cores=config.cores).encapsulate()
          sorted_bam.addChild(preprocess)
          index_bam.addChild(preprocess)
          output_bam_promise = preprocess.rv(0)
          output_bai_promise = preprocess.rv(1)
          output_dir = os.path.join(config.output_dir, uuid)
          filename = '{}.preprocessed{}.bam'.format(uuid, config.suffix)
          output_bam = job.wrapJobFn(output_file_job,
                                     filename,
                                     preprocess.rv(0),
                                     output_dir,
                                     s3_key_path=config.ssec)
          preprocess.addChild(output_bam)
      else:
          output_bam_promise = sorted_bam.rv()
          output_bai_promise = index_bam.rv()
      return output_bam_promise, output_bai_promise