/*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    nf-core/sarek Nextflow base config file
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    A 'blank slate' config file, appropriate for general use on most high performance
    compute environments. Assumes that all software is installed and available on
    the PATH. Runs in `local` mode - all jobs will be run on the logged in environment.
----------------------------------------------------------------------------------------
*/

process {
    cpus   = { check_max( 1    * task.attempt, 'cpus'   ) }
    memory = { check_max( 6.GB * task.attempt, 'memory' ) }
    time   = { check_max( 4.h  * task.attempt, 'time'   ) }
    shell  = ['/bin/bash', '-euo', 'pipefail']

    // memory errors which should be retried. otherwise error out
    errorStrategy = { task.exitStatus in [143,137,104,134,139,140,247] ? 'retry' : 'finish' }
    maxRetries    = 1
    maxErrors     = '-1'

    // Process-specific resource requirements
    // See https://www.nextflow.io/docs/latest/config.html#config-process-selectors
    withLabel:process_low {
        cpus         = { check_max( 2     * task.attempt, 'cpus'    ) }
        memory       = { check_max( 12.GB * task.attempt, 'memory'  ) }
        time         = { check_max( 4.h   * task.attempt, 'time'    ) }
    }
    withLabel:process_medium {
        cpus         = { check_max( 6     * task.attempt, 'cpus'    ) }
        memory       = { check_max( 36.GB * task.attempt, 'memory'  ) }
        time         = { check_max( 8.h   * task.attempt, 'time'    ) }
    }
    withLabel:process_high {
        cpus         = { check_max( 12    * task.attempt, 'cpus'    ) }
        memory       = { check_max( 72.GB * task.attempt, 'memory'  ) }
        time         = { check_max( 16.h  * task.attempt, 'time'    ) }
    }
    withLabel:process_long {
        time         = { check_max( 20.h  * task.attempt, 'time'    ) }
    }
    withLabel:process_high_memory {
        memory       = { check_max( 200.GB * task.attempt, 'memory' ) }
    }
    withLabel:error_ignore {
        errorStrategy = 'ignore'
    }
    withLabel:error_retry {
        errorStrategy = 'retry'
        maxRetries    = 2
    }
    withName: 'BWAMEM1_MEM|BWAMEM2_MEM' {
        cpus         = { check_max( 24 * task.attempt, 'cpus' ) }
        memory       = { check_max( 72.GB * task.attempt, 'memory' ) }
        time         = { check_max( 48.h  * task.attempt, 'time'    ) }
    }
    withName: 'FASTP'{
        cpus         = { check_max( 12 * task.attempt, 'cpus' ) }
    }
    withName:'FASTQC|FASTP|MOSDEPTH|SAMTOOLS_CONVERT'{
        memory       = { check_max( 4.GB * task.attempt, 'memory' ) }
    }
    withName:'GATK4_APPLYBQSR|GATK4_APPLYBQSR_SPARK|GATK4_BASERECALIBRATOR|SAMTOOLS_STATS'{
        cpus         = { check_max( 4 * task.attempt, 'cpus' ) }
    }
    withName:'GATK4_APPLYBQSR|GATK4_APPLYBQSR_SPARK|GATK4_BASERECALIBRATOR|GATK4_GATHERBQSRREPORTS'{
        memory       = { check_max( 46.GB * task.attempt, 'memory' ) }
    }
    withName: 'GATK4_MARKDUPLICATES'{
        memory       = { check_max( 300.GB * task.attempt, 'memory' ) }
    }
    withName: 'FREEBAYES|SAMTOOLS_STATS|SAMTOOLS_INDEX|UNZIP' {
        cpus         = { check_max( 1 * task.attempt, 'cpus'    ) }
    }

}
