let every_vc_on_fastqs ~reference_build ~normal ~tumor =
    let aligner which_one =
      Bfx.lambda (fun fq -> which_one ~reference_build fq) in
    let align_list how (list_of_fastqs : [ `Fastq ] list Bfx.repr) =
      Bfx.list_map list_of_fastqs ~f:how |> Bfx.merge_bams
    in
    let aligners = Bfx.list [
        aligner @@ Bfx.bwa_aln ?configuration: None;
        aligner @@ Bfx.bwa_mem ?configuration: None;
        aligner @@ Bfx.hisat ~configuration:Biokepi.Tools.Hisat.Configuration.default_v1;
        aligner @@ Bfx.hisat ~configuration:Biokepi.Tools.Hisat.Configuration.default_v2;
        aligner @@ Bfx.star ~configuration:Biokepi.Tools.Star.Configuration.Align.default;
        aligner @@ Bfx.mosaik;
        aligner @@ (fun ~reference_build fastq ->
            Bfx.bwa_aln ~reference_build fastq
            |> Bfx.bam_to_fastq ~sample_name:"realigned" `PE
            |> Bfx.bwa_mem ?configuration: None ~reference_build
          );
      ] in
    let somatic_of_pair how =
      Bfx.lambda (fun pair ->
          let normal = Bfx.pair_first pair in
          let tumor = Bfx.pair_second pair in
          how ~normal ~tumor ())
    in
    let somatic_vcs =
      List.map ~f:somatic_of_pair [
        Bfx.mutect
          ~configuration:Biokepi.Tools.Mutect.Configuration.default;
        Bfx.mutect2
          ~configuration:Biokepi.Tools.Gatk.Configuration.Mutect2.default;
        Bfx.somaticsniper
          ~configuration:Biokepi.Tools.Somaticsniper.Configuration.default;
        Bfx.strelka
          ~configuration:Biokepi.Tools.Strelka.Configuration.default;
        Bfx.varscan_somatic ?adjust_mapq:None;
        Bfx.muse
          ~configuration:Biokepi.Tools.Muse.Configuration.wes;
        Bfx.virmid
          ~configuration:Biokepi.Tools.Virmid.Configuration.default;
      ]
    in
    let aligned_pairs
      : (([ `Fastq ] list * [ `Fastq ] list) -> ([ `Bam ] * [ `Bam ]) list) Bfx.repr =
      Bfx.lambda (fun pair ->
          Bfx.list_map aligners ~f:(
            Bfx.lambda (fun (al : ([ `Fastq ] -> [ `Bam ]) Bfx.repr) ->
                Bfx.pair
                  (align_list al (Bfx.pair_first pair : [ `Fastq ] list Bfx.repr))
                  (align_list al (Bfx.pair_second pair))
              )
          )
        )
    in
    let vcfs =
      Bfx.lambda (fun pair ->
          List.map somatic_vcs ~f:(fun vc ->
              Bfx.list_map (Bfx.apply aligned_pairs pair) ~f:(
                Bfx.lambda (fun bam_pair ->
                    let (||>) x f = Bfx.apply f x in
                    let indelreal =
                      Bfx.lambda (fun pair ->
                          Bfx.gatk_indel_realigner_joint
                            ~configuration: Biokepi.Tools.Gatk.Configuration.default_indel_realigner
                            pair)
                    in
                    let map_pair f =
                      Bfx.lambda (fun pair ->
                          let b1 = Bfx.pair_first pair in
                          let b2 = Bfx.pair_second pair in
                          Bfx.pair (f b1) (f b2)
                        )
                    in
                    let bqsr_pair =
                      Bfx.gatk_bqsr
                        ~configuration: Biokepi.Tools.Gatk.Configuration.default_bqsr
                      |> map_pair in
                    let markdups_pair =
                      Bfx.picard_mark_duplicates
                        ~configuration:Biokepi.Tools.Picard.Mark_duplicates_settings.default
                      |> map_pair in
                    bam_pair ||> markdups_pair ||> indelreal ||> bqsr_pair ||> vc
                    ||> Bfx.lambda Bfx.to_unit
                  )
              )
            )
          |> Bfx.list
        )
    in
    let workflow_of_pair =
      Bfx.lambda (fun pair ->
          Bfx.list [
            (Bfx.apply aligned_pairs pair
             |> Bfx.list_map ~f:(Bfx.lambda (fun p ->
                 Bfx.pair_first p
                 |> Bfx.stringtie
                   ~configuration:Biokepi.Tools.Stringtie.Configuration.default)
               )) |> Bfx.to_unit;
            Bfx.apply vcfs pair |> Bfx.to_unit;
            begin
              Bfx.apply
                (Bfx.lambda (fun p -> Bfx.pair_first p |> Bfx.concat |> Bfx.seq2hla))
                pair
              |> Bfx.to_unit
            end;
            begin 
              Bfx.apply
                (Bfx.lambda (fun p -> Bfx.pair_second p |> Bfx.concat |> Bfx.optitype `RNA))
                pair
              |> Bfx.to_unit
            end;
            begin
              Bfx.apply aligned_pairs pair
              |> Bfx.list_map ~f:(Bfx.lambda (fun p ->
                  Bfx.pair_first p
                  |> Bfx.gatk_haplotype_caller
                ))
              |> Bfx.to_unit
            end;
          ]
        |> Bfx.to_unit
        )
    in
    Bfx.apply workflow_of_pair (Bfx.pair normal tumor)