let sam_to_bam ~(run_with : Machine.t) ~reference_build file_t =
  let open KEDSL in
  let samtools = Machine.get_tool run_with Machine.Tool.Default.samtools in
  let src = file_t#product#path in
  let dest = sprintf "%s.%s" (Filename.chop_suffix src ".sam""bam" in
  let program =
    Program.(Machine.Tool.(init samtools)
             && exec ["samtools""view""-b""-o"; dest; src])
  in
  let name = sprintf "sam-to-bam-%s" (Filename.chop_suffix src ".sam"in
  let make = Machine.run_program ~name run_with program in
  let host = Machine.(as_host run_with) in
  workflow_node ~name
    (bam_file ~reference_build dest ~host)
    ~make
    ~edges:[
      depends_on file_t;
      depends_on Machine.Tool.(ensure samtools);
      on_failure_activate (Remove.file ~run_with dest);
      on_success_activate (Remove.file ~run_with src);
    ]