#
# @include "_make_fastqs_stages.mro"
#

#
# Copyright (c) 2016 10x Genomics, Inc.  All rights reserved.
#
filetype fastq;
filetype json;
filetype csv;

stage MAKE_FASTQS_PREFLIGHT_LOCAL(
    in  path   run_path,
    in  bool   check_executables,
    in  int[]  lanes,
    in  map[]  specs,
    in  string bcl2fastq2_args,
    in  string barcode_whitelist,
    in  string bc_read_type,
    in  int    bc_start_index,
    in  int    bc_length,
    in  string si_read_type,
    in  string umi_read_type,
    in  int    umi_start_index,
    in  int    umi_length,
    in  string bases_mask,
    in  bool   ignore_dual_index,
    in  string all_mkfastq_args,
    src py     "stages/make_fastqs/make_fastqs_preflight_local",
)

stage MAKE_FASTQS_PREFLIGHT(
    in  path   run_path,
    in  path   output_path,
    in  path   interop_output_path,
    in  string barcode_whitelist,
    in  bool   check_executables,
    in  int    max_bcl2fastq_threads,
    src py     "stages/make_fastqs/make_fastqs_preflight",
)

stage PREPARE_SAMPLESHEET(
    in  path   run_path,
    in  map[]  specs,
    in  string project,
    in  string bc_read_type,
    in  int    bc_length,
    in  string si_read_type,
    in  string bcl2fastq2_args,
    out csv    samplesheet,
    out csv    input_samplesheet,
    out bool   dual_indexed_samplesheet,
    src py     "stages/make_fastqs/prepare_samplesheet",
)

stage BCL2FASTQ_WITH_SAMPLESHEET(
    in  path   run_path,
    in  path   output_path,
    in  path   interop_output_path,
    in  csv    samplesheet_path,
    in  string bases_mask,
    in  string si_read_type,
    in  string bcl2fastq1_args,
    in  string bcl2fastq2_args,
    in  int    max_bcl2fastq_threads,
    in  bool   dual_indexed_samplesheet,
    in  bool   ignore_dual_index,
    out path   fastq_path,
    out path   interop_path,
    out bool   rc_i2_read,
    out map    file_read_types_map,
    out string bcl2fastq_version,
    out string bcl2fastq_args,
    src py     "stages/make_fastqs/bcl2fastq_with_samplesheet",
) split (
)

stage MAKE_QC_SUMMARY(
    in  bool     run_qc,
    in  path     run_path,
    in  path     fastq_path,
    in  path     interop_path,
    in  string   barcode_whitelist,
    in  string   bc_read_type,
    in  int      bc_start_index,
    in  int      bc_length,
    in  string   si_read_type,
    in  string   umi_read_type,
    in  int      umi_start_index,
    in  int      umi_length,
    in  bool     rc_i2_read,
    in  map      file_read_types_map,
    in  string   software_version,
    in  string   bcl2fastq_version,
    in  string   bcl2fastq_args,
    out json     qc_summary,
    out bool     completed,
    src py       "stages/make_fastqs/make_qc_summary",
) split (
    in  string   project,
    in  int      lane,
    in  string   sample,
    in  string[] input_files,
    in  string   subfolder,
    out map      summary_chunk,
) using (
    mem_gb = 2,
)

stage MERGE_FASTQS_BY_LANE_SAMPLE(
    in  path     fastq_path,
    in  csv      samplesheet_path,
    in  bool     remove_undetermined_fastqs,
    in  bool     remove_split_fastqs,
    in  string   bcl2fastq_version,
    out bool     files_merged,
    out string[] merged_file_paths,
    src py       "stages/make_fastqs/merge_fastqs_by_lane_sample",
) split (
    in  string   project,
    in  int      lane,
    in  string   sample_id,
    in  string   output_snum,
    in  string[] input_files,
)

#
# @include "make_fastqs.mro"
#

pipeline MAKE_FASTQS(
    in  path   run_path               "Illumina output folder",
    in  int[]  lanes,
    in  map[]  specs,
    in  string project,
    in  string bases_mask             "--use-bases-mask override",
    in  string bcl2fastq1_args        "Bonus arguments to bcl2fastq v1",
    in  string bcl2fastq2_args        "Bonus arguments to bcl2fastq v2",
    in  string barcode_whitelist,
    in  string bc_read_type,
    in  int    bc_start_index,
    in  int    bc_length,
    in  string si_read_type,
    in  string umi_read_type,
    in  int    umi_start_index,
    in  int    umi_length,
    in  path   output_path,
    in  path   interop_output_path,
    in  bool   delete_undetermined,
    in  bool   ignore_dual_index,
    in  int    max_bcl2fastq_threads,
    in  bool   run_qc,
    in  string software_version,
    in  string all_mkfastq_args,
    out path   fastq_path,
    out path   interop_path,
    out json   qc_summary,
    out csv    input_samplesheet,
)
{
    call MAKE_FASTQS_PREFLIGHT_LOCAL(
        run_path          = self.run_path,
        check_executables = false,
        lanes             = self.lanes,
        specs             = self.specs,
        barcode_whitelist = self.barcode_whitelist,
        bc_read_type      = self.bc_read_type,
        bc_start_index    = self.bc_start_index,
        bc_length         = self.bc_length,
        si_read_type      = self.si_read_type,
        umi_read_type     = self.umi_read_type,
        umi_start_index   = self.umi_start_index,
        umi_length        = self.umi_length,
        bcl2fastq2_args   = self.bcl2fastq2_args,
        bases_mask        = self.bases_mask,
        ignore_dual_index = self.ignore_dual_index,
        all_mkfastq_args  = self.all_mkfastq_args,
    ) using (
        local     = true,
        preflight = true,
    )

    call MAKE_FASTQS_PREFLIGHT(
        run_path              = self.run_path,
        output_path           = self.output_path,
        interop_output_path   = self.interop_output_path,
        barcode_whitelist     = self.barcode_whitelist,
        check_executables     = true,
        max_bcl2fastq_threads = self.max_bcl2fastq_threads,
    ) using (
        preflight = true,
    )

    call PREPARE_SAMPLESHEET(
        run_path        = self.run_path,
        specs           = self.specs,
        project         = self.project,
        bc_read_type    = self.bc_read_type,
        bc_length       = self.bc_length,
        si_read_type    = self.si_read_type,
        bcl2fastq2_args = self.bcl2fastq2_args,
    )

    call BCL2FASTQ_WITH_SAMPLESHEET(
        run_path                 = self.run_path,
        output_path              = self.output_path,
        interop_output_path      = self.interop_output_path,
        samplesheet_path         = PREPARE_SAMPLESHEET.samplesheet,
        bases_mask               = self.bases_mask,
        si_read_type             = self.si_read_type,
        bcl2fastq1_args          = self.bcl2fastq1_args,
        bcl2fastq2_args          = self.bcl2fastq2_args,
        max_bcl2fastq_threads    = self.max_bcl2fastq_threads,
        dual_indexed_samplesheet = PREPARE_SAMPLESHEET.dual_indexed_samplesheet,
        ignore_dual_index        = self.ignore_dual_index,
    )

    call MAKE_QC_SUMMARY(
        run_qc              = self.run_qc,
        run_path            = self.run_path,
        barcode_whitelist   = self.barcode_whitelist,
        bc_read_type        = self.bc_read_type,
        bc_start_index      = self.bc_start_index,
        bc_length           = self.bc_length,
        si_read_type        = self.si_read_type,
        umi_read_type       = self.umi_read_type,
        umi_start_index     = self.umi_start_index,
        umi_length          = self.umi_length,
        software_version    = self.software_version,
        bcl2fastq_version   = BCL2FASTQ_WITH_SAMPLESHEET.bcl2fastq_version,
        bcl2fastq_args      = BCL2FASTQ_WITH_SAMPLESHEET.bcl2fastq_args,
        fastq_path          = BCL2FASTQ_WITH_SAMPLESHEET.fastq_path,
        interop_path        = BCL2FASTQ_WITH_SAMPLESHEET.interop_path,
        rc_i2_read          = BCL2FASTQ_WITH_SAMPLESHEET.rc_i2_read,
        file_read_types_map = BCL2FASTQ_WITH_SAMPLESHEET.file_read_types_map,
    )

    call MERGE_FASTQS_BY_LANE_SAMPLE(
        fastq_path                 = BCL2FASTQ_WITH_SAMPLESHEET.fastq_path,
        samplesheet_path           = PREPARE_SAMPLESHEET.samplesheet,
        remove_undetermined_fastqs = self.delete_undetermined,
        remove_split_fastqs        = MAKE_QC_SUMMARY.completed,
        bcl2fastq_version          = BCL2FASTQ_WITH_SAMPLESHEET.bcl2fastq_version,
    )

    return (
        fastq_path        = BCL2FASTQ_WITH_SAMPLESHEET.fastq_path,
        interop_path      = BCL2FASTQ_WITH_SAMPLESHEET.interop_path,
        qc_summary        = MAKE_QC_SUMMARY.qc_summary,
        input_samplesheet = PREPARE_SAMPLESHEET.input_samplesheet,
    )
}

#
# @include "make_fastqs_cs.mro"
#

pipeline MAKE_FASTQS_CS(
    in  path   run_path               "Illumina output folder",
    in  int[]  lanes                  "The lanes to demultiplex",
    in  map[]  specs                  "Demultiplex specification",
    in  string project                "Project name",
    in  string bases_mask             "--use-bases-mask argument",
    in  string bcl2fastq1_args        "Additional arguments to pass to bcl2fastq if RTA needs v1",
    in  string bcl2fastq2_args        "Additional arguments to pass to bcl2fastq if RTA needs v2",
    in  string barcode_whitelist      "Path to barcode whitelist to check matching rates",
    in  string bc_read_type           "Read type containing the barcode (R1, I1, I2, R2)",
    in  int    bc_start_index         "Zero-based index of first base of barcode on read",
    in  int    bc_length              "Length of barcode",
    in  string si_read_type           "Read type containing the sample index (I1, I2)",
    in  string umi_read_type          "Read type containing a UMI (R1, I1, I2, R2)",
    in  int    umi_start_index        "Zero-based index of first base of UMI on read",
    in  int    umi_length             "Length of UMI",
    in  path   output_path            "Override --output-dir argument to bcl2fastq",
    in  path   interop_output_path    "Override --interop-dir argument to bcl2fastq",
    in  bool   delete_undetermined    "Delete FASTQ files not matching a supplied sample index",
    in  bool   ignore_dual_index      "Ignore the second index of a dual-index flowcell",
    in  bool   run_qc                 "Run 10x-specific barcode & UMI quality control",
    in  int    max_bcl2fastq_threads  "Maximum number of threads for bcl2fastq to use",
    in  string software_version       "Enclosing version of software calling this pipeline",
    in  string all_mkfastq_args       "Complete serialized set of arguments passed to mkfastq",
    out json   qc_summary             "Run QC metrics",
    out path   fastq_path             "FASTQ output folder",
    out path   interop_path           "Interop output folder",
    out csv    input_samplesheet      "Input samplesheet",
)
{
    call MAKE_FASTQS(
        run_path              = self.run_path,
        lanes                 = self.lanes,
        specs                 = self.specs,
        project               = self.project,
        bases_mask            = self.bases_mask,
        bcl2fastq1_args       = self.bcl2fastq1_args,
        bcl2fastq2_args       = self.bcl2fastq2_args,
        barcode_whitelist     = self.barcode_whitelist,
        bc_read_type          = self.bc_read_type,
        bc_start_index        = self.bc_start_index,
        bc_length             = self.bc_length,
        si_read_type          = self.si_read_type,
        umi_read_type         = self.umi_read_type,
        umi_start_index       = self.umi_start_index,
        umi_length            = self.umi_length,
        output_path           = self.output_path,
        interop_output_path   = self.interop_output_path,
        delete_undetermined   = self.delete_undetermined,
        ignore_dual_index     = self.ignore_dual_index,
        max_bcl2fastq_threads = self.max_bcl2fastq_threads,
        run_qc                = self.run_qc,
        software_version      = self.software_version,
        all_mkfastq_args      = self.all_mkfastq_args,
    )

    return (
        fastq_path        = MAKE_FASTQS.fastq_path,
        interop_path      = MAKE_FASTQS.interop_path,
        qc_summary        = MAKE_FASTQS.qc_summary,
        input_samplesheet = MAKE_FASTQS.input_samplesheet,
    )
}

#
# @include "__G172_Run2_unlane.mro"
#

call MAKE_FASTQS_CS(
    run_path              = "/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/BCL/",
    lanes                 = null,
    specs                 = [{
        "csv": "/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/G172_v2.csv",
    }],
    project               = "HM3TJBGXC",
    bases_mask            = null,
    barcode_whitelist     = "/share/pkg.7/cellranger/3.1.0/install/bin/cellranger-cs/3.1.0/lib/python/cellranger/barcodes/737K-august-2016.txt,/share/pkg.7/cellranger/3.1.0/install/bin/cellranger-cs/3.1.0/lib/python/cellranger/barcodes/3M-february-2018.txt.gz",
    bcl2fastq1_args       = " --mismatches=1",
    bcl2fastq2_args       = " -p 6 -d 6 -r 6 -w 6 --barcode-mismatches 1",
    bc_read_type          = "R1",
    bc_start_index        = 0,
    bc_length             = 16,
    si_read_type          = "I1",
    umi_read_type         = "R1",
    umi_start_index       = 16,
    umi_length            = 10,
    output_path           = null,
    interop_output_path   = null,
    delete_undetermined   = false,
    ignore_dual_index     = false,
    run_qc                = false,
    max_bcl2fastq_threads = 6,
    software_version      = "cellranger 3.1.0",
    all_mkfastq_args      = "--id=G172_Run2_unlane --run=/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/BCL/ --csv=/net/waxman-server/mnt/data/waxmanlabvm_home/kkarri/G172/G172_v2.csv",
)
