/*
 * -------------------------------------------------
 *  nf-core/sarek Nextflow config file
 * -------------------------------------------------
 * Default config options for all environments.
 */

// Global default params, used in configs
params {

  // Workflow flags
  annotateTools = null // Only with --step annotate
  genome = 'GRCh38'
  input = null // No default input
  noGVCF = null // g.vcf are produced by HaplotypeCaller
  noStrelkaBP = null // Strelka will use Manta candidateSmallIndels if available
  skipQC = null // All QC tools are used
  step = 'mapping' // Starts with mapping
  tools = null // No default Variant Calling or Annotation tools

  // Workflow settings
  annotation_cache = null // Annotation cache disabled
  cadd_cache = null // CADD cache disabled
  genesplicer = null // genesplicer disabled
  markdup_java_options = '"-Xms4000m -Xmx7g"' //Established values for markDuplicate memory consumption, see https://github.com/SciLifeLab/Sarek/pull/689 for details
  nucleotidesPerSecond = 1000.0 // Default interval size
  outdir = './results'
  publishDirMode = 'copy' // Default PublishDirMode (same as other nf-core pipelines)
  saveGenomeIndex = null // Built Indexes not saved
  sequencing_center = null // No sequencing center to be writen in BAM header in MapReads process

  // Optional files/directory
  cadd_InDels = false // No CADD files
  cadd_InDels_tbi = false // No CADD files
  cadd_WG_SNVs = false // No CADD files
  cadd_WG_SNVs_tbi = false // No CADD files
  pon = false // No default PON file for GATK Mutect2 Panel of Normal
  snpEff_cache = null // No directory for snpEff cache
  targetBED = false // No default TargetBED file for targeted sequencing
  vep_cache = null // No directory for VEP cache

  // AWSBatch
  awsqueue = false
  awsregion = 'eu-west-1'

  // Custom config
  config_profile_contact = false
  config_profile_description = false
  config_profile_url = false
  custom_config_version = 'master'
  custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}"

  // Reference genomes
  igenomesIgnore = false
  igenomes_base = 's3://ngi-igenomes/igenomes/'

  // Default
  help = false
  hostnames = false
  monochrome_logs = false // Monochrome logs disabled
  multiqc_config = "${baseDir}/assets/multiqc_config.yaml" // Default multiqc config
  name = false // No default name
  tracedir = "${params.outdir}/pipeline_info"

  // email
  email = false // No default email
  maxMultiqcEmailFileSize = 25.MB
  plaintext_email = false // Plaintext email disabled

  // Base specifications
  cpus = 8 
  max_cpus = 16
  max_memory = 128.GB
  max_time = 240.h
  singleCPUMem = 7.GB

  // Deprecated params
  annotateVCF = null
  genomeDict = null
  genomeFile = null
  genomeIndex = null
  noReports = null
  sample = null
  sampleDir = null
}

// Container slug. Stable releases should specify release tag!
// Developmental code should specify :dev
process.container = 'nfcore/sarek:2.5'

// Load base.config by default for all pipelines
includeConfig 'conf/base.config'

// Load nf-core custom profiles from different Institutions
try {
  includeConfig "${params.custom_config_base}/nfcore_custom.config"
} catch (Exception e) {
  System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config")
}

profiles {
  awsbatch { includeConfig 'conf/awsbatch.config' }
  conda {
    docker.enabled = false
    process.conda = "$baseDir/environment.yml"
    singularity.enabled = false
  }
  debug { process.beforeScript = 'echo $HOSTNAME' }
  docker {
    docker {
      enabled = true
      fixOwnership = true
      runOptions = "-u \$(id -u):\$(id -g)"
    }
    singularity.enabled = false
  }
  singularity {
    autoMounts = true
    docker.enabled = false
    singularity.enabled = true
  }
  test { includeConfig 'conf/test.config' }
}

// Load genomes.config or igenomes.config
if (!params.igenomesIgnore) {
  includeConfig 'conf/igenomes.config'
} else {
  includeConfig 'conf/genomes.config'
}

// Capture exit codes from upstream processes when piping
process.shell = ['/bin/bash', '-euo', 'pipefail']

timeline {
  enabled = true
  file = "${params.tracedir}/execution_timeline.html"
}
report {
  enabled = true
  file = "${params.tracedir}/execution_report.html"
}
trace {
  enabled = true
  file = "${params.tracedir}/execution_trace.txt"
}
dag {
  enabled = true
  file = "${params.tracedir}/pipeline_dag.svg"
}

manifest {
  name = 'nf-core/sarek'
  author = 'Maxime Garcia, Szilveszter Juhos'
  homePage = 'https://github.com/nf-core/sarek'
  description = 'An open-source analysis pipeline to detect germline or somatic variants from whole genome or targeted sequencing'
  mainScript = 'main.nf'
  nextflowVersion = '>=19.04.0'
  version = '2.5'
}

// Return the minimum between requirements and a maximum limit to ensure that resource requirements don't go over
def check_resource(obj) {
    try {
      if (obj.getClass() == nextflow.util.MemoryUnit && obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1)
        return params.max_memory as nextflow.util.MemoryUnit
      else if (obj.getClass() == nextflow.util.Duration && obj.compareTo(params.max_time as nextflow.util.Duration) == 1)
        return params.max_time as nextflow.util.Duration
      else if (obj.getClass() == java.lang.Integer)
        return Math.min(obj, params.max_cpus as int)
      else
        return obj
    } catch (all) {
        println "   ### ERROR ###   Max params max_memory:'${params.max_memory}', max_time:'${params.max_time}' or max_cpus:'${params.max_cpus}'  is not valid! Using default value: $obj"
    }
}
