#!/usr/bin/env cwl-runner

cwlVersion: v1.0
class: Workflow
label: "Gathered Downsample and HaplotypeCaller"
requirements:
    - class: ScatterFeatureRequirement
    - class: StepInputExpressionRequirement
    - class: SubworkflowFeatureRequirement
inputs:
    reference:
        type:
            - string
            - File
        doc: "The reference that was used for the already-completed alignments"
    crams_to_downsample:
        type:
            type: array
            items:
                type: record
                name: crams
                fields:
                    cram:
                        type: File
                    downsample_ratio:
                        type: float
                        doc: 'the downsample ratio to use when reprocessing this CRAM'
                    contamination:
                        type: float
                        doc: 'contamination score to pass to HaplotypeCaller'
    downsample_strategy:
        type:
            - "null"
            - type: enum
              symbols: ["HighAccuracy", "ConstantMemory", "Chained"]
    downsample_seed:
        type: int?
    emit_reference_confidence:
        type:
            type: enum
            symbols: ['NONE', 'BP_RESOLUTION', 'GVCF']
    max_alternate_alleles:
        type: int?
    variant_index_type:
        type:
            - 'null'
            - type: enum
              symbols: ['DYNAMIC_SEEK', 'DYNAMIC_SIZE', 'LINEAR', 'INTERVAL']
    variant_index_parameter:
        type: string?
    read_filter:
        type: string?
    intervals:
        type:
            type: array
            items:
                type: array
                items: string
        doc: "arrays of intervals to use in each individual run of the haplotypecaller"
    qc_minimum_mapping_quality:
        type: int
    qc_minimum_base_quality:
        type: int
outputs:
    result_directories:
        type: Directory[]
        outputSource: gather_results/gathered_directory
steps:
    downsample_and_recall:
        run: downsample_and_recall.cwl
        in:
            reference: reference
            crams_to_downsample: crams_to_downsample
            downsample_strategy: downsample_strategy
            downsample_seed: downsample_seed
            emit_reference_confidence: emit_reference_confidence
            max_alternate_alleles: max_alternate_alleles
            variant_index_type: variant_index_type
            variant_index_parameter: variant_index_parameter
            read_filter: read_filter
            intervals: intervals
            qc_minimum_mapping_quality: qc_minimum_mapping_quality
            qc_minimum_base_quality: qc_minimum_base_quality
        out: [gvcfs, wgs_metrics]
    join_results:
        in:
            gvcfs: downsample_and_recall/gvcfs
            wgs_metrics: downsample_and_recall/wgs_metrics
        out:
            [results]
        scatter: [gvcfs, wgs_metrics]
        scatterMethod: dotproduct
        run:
            class: ExpressionTool
            requirements:
                - class: InlineJavascriptRequirement
            inputs:
                gvcfs:
                    type: File[]
                wgs_metrics:
                    type: File
            outputs:
                results:
                    type: File[]
            expression: |
                ${
                    var results = [inputs.wgs_metrics];
                    results = results.concat(inputs.gvcfs);
                    return {'results': results};
                }
    gather_results:
        run: ../tools/gather_to_sub_directory.cwl
        scatter: [outdir, files]
        scatterMethod: dotproduct
        in:
            outdir:
                source: crams_to_downsample
                valueFrom: $(self.cram.nameroot)
            files: join_results/results
        out: [gathered_directory]