let do_on_bam
    ~(run_with:Machine.t)
    ?(more_depends_on=[]) ~name
    ?(more_requirements: Machine.Make_fun.Requirement.t list = [])
    input_bam ~product ~make_command =
  let open KEDSL in
  let samtools = Machine.get_tool run_with Machine.Tool.Default.samtools in
  let src = input_bam#product#path in
  let sub_command = make_command src product#path in
  let program =
    Program.(Machine.Tool.(init samtools) && exec ("samtools" :: sub_command))
  in
  let make =
    Machine.run_program ~requirements:more_requirements ~name run_with program
  in
  workflow_node product ~name ~make
    ~edges:(
      depends_on Machine.Tool.(ensure samtools)
      :: depends_on input_bam
      :: on_failure_activate (Remove.file ~run_with product#path)
      :: more_depends_on)