let sort_vcf ~(run_with:Machine.t) ?(sequence_dict) input_vcf =
  let open KEDSL in
  let picard = Machine.get_tool run_with Machine.Tool.Default.picard in
  let sequence_name =
    match sequence_dict with
    | None -> "default"
    | Some d -> Filename.basename d#product#path
  in
  let src = input_vcf#product#path in
  let input_vcf_base = Filename.basename src in
  let dest =
    sprintf "%s.sorted-by-%s.vcf"
      (Filename.chop_suffix src ".vcf") sequence_name in
  let name = sprintf "picard-sort-vcf-%s-by-%s" input_vcf_base sequence_name in
  let sequence_dict_opt =
    match sequence_dict with
    | None -> ""
    | Some d -> sprintf "SEQUENCE_DICTIONARY= %s" (Filename.quote d#product#path)
  in
  let sequence_dict_edge =
    match sequence_dict with
    | None -> []
    | Some d -> [depends_on d]
  in
  let program =
    Program.(Machine.Tool.(init picard) &&
             (shf "java -jar $PICARD_JAR SortVcf %s I= %s O= %s"
                sequence_dict_opt
                (Filename.quote src) (Filename.quote dest)))
  in
  let host = Machine.(as_host run_with) in
  let make =
    Machine.run_stream_processor
      run_with program ~name ~self_ids:["picard""sort-vcf"in
  workflow_node (single_file dest ~host) ~name ~make
    ~edges:([
      depends_on input_vcf; depends_on Machine.Tool.(ensure picard);
      on_failure_activate (Remove.file ~run_with dest)
    ] @ sequence_dict_edge)