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

// Global default params, used in configs
params {
  // Workflow flags:

  // Mandatory arguments
  input = null // No default input
  step = 'mapping' // Starts with mapping

  // Genome and references options
  genome = 'GRCh38'
  igenomes_base = 's3://ngi-igenomes/igenomes/'
  igenomes_ignore = false
  genomes_base = null // Disabled by default
  save_reference = null // Built references not saved

  // Main options
  help = false
  no_intervals = null // Intervals will be built from the fasta file
  nucleotides_per_second = 1000 // Default interval size
  sentieon = null // Not using Sentieon by default
  skip_qc = null // All QC tools are used
  target_bed = false // No default TargetBED file for targeted sequencing
  tools = null // No default Variant_Calling or Annotation tools

  // Modify fastqs (trim/split)
  trim_fastq = false // No trimming
  clip_r1 = 0
  clip_r2 = 0
  three_prime_clip_r1 = 0
  three_prime_clip_r2 = 0
  trim_nextseq = 0
  save_trimmed = false
  split_fastq = null // Fastq files will not be split by default

  // Preprocessing
  aligner = 'bwa-mem'
  markdup_java_options = '"-Xms4000m -Xmx7g"' // Established values for markDuplicates memory consumption, see https://github.com/SciLifeLab/Sarek/pull/689 for details
  use_gatk_spark = false // GATK Spark implementation of their tools in local mode not used by default
  save_bam_mapped = null // Mapped BAMs not saved
  skip_markduplicates = null // Do not skip markDuplicates by default

  // Variant Calling
  ascat_ploidy = null // Use default value
  ascat_purity = null // Use default value
  cf_coeff = 0.05                    // default value for Control-FREEC
  cf_contamination = null            // by default not specified in Control-FREEC
  cf_contamination_adjustment = null // by default we are not using this in Control-FREEC
  cf_ploidy = 2                      // you can use 2,3,4
  cf_window = null                   // by default we are not using this in Control-FREEC
  generate_gvcf = null // g.vcf are not produced by HaplotypeCaller by default
  no_strelka_bp = null // Strelka will use Manta candidateSmallIndels if available
  pon = false // No default PON (Panel of Normals) file for GATK Mutect2 / Sentieon TNscope
  pon_index = false // No default PON index for GATK Mutect2 / Sentieon TNscope
  ignore_soft_clipped_bases = null // no --dont-use-soft-clipped-bases for GATK Mutect2
  umi = null // no umi
  read_structure1 = null // no umi
  read_structure2 = null // no umi

  // Annotation
  annotate_tools = null // Only with --step annotate
  annotation_cache = null // Annotation cache disabled
  cadd_cache = null // CADD cache disabled
  cadd_indels = false // No CADD InDels file
  cadd_indels_tbi = false // No CADD InDels index
  cadd_wg_snvs = false // No CADD SNVs file
  cadd_wg_snvs_tbi = false // No CADD SNVs index
  genesplicer = null // genesplicer disabled within VEP
  snpeff_cache = null // No directory for snpEff cache
  vep_cache = null // No directory for VEP cache

  // 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}"

  // Other options
  outdir = './results'
  publish_dir_mode = 'copy' // Default PublishDirMode (same as other nf-core pipelines)
  sequencing_center = null // No sequencing center to be written in BAM header in MapReads process
  multiqc_config = false
  monochrome_logs = false // Monochrome logs disabled
  email = "" // No default email
  email_on_fail = false
  plaintext_email = false // Plaintext email disabled
  max_multiqc_email_size = 25.MB

  hostnames = false
  config_profile_name = null
  config_profile_description = false
  config_profile_contact = false
  config_profile_url = false
  validate_params = true
  show_hidden_params = false
  schema_ignore_params = 'genomes,input_paths'
  tracedir = "${params.outdir}/pipeline_info"

  // Base specifications
  // Defaults only, expecting to be overwritten
  cpus = 8 
  max_cpus = 16
  max_memory = 128.GB
  max_time = 240.h
  single_cpu_mem = 7.GB
}

// Container slug
// Stable releases should specify release tag (ie: `2.5.2`)
// Developmental code should specify dev
process.container = 'nfcore/sarek:2.7.1'

// 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")
}

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

profiles {
  conda {
    docker.enabled = false
    singularity.enabled = false
    podman.enabled = false
    shifter.enabled = false
    charliecloud.enabled = false
    process.conda = "$projectDir/environment.yml"
  }
  debug { process.beforeScript = 'echo $HOSTNAME' }
  docker {
    docker.enabled = true
    singularity.enabled = false
    podman.enabled = false
    shifter.enabled = false
    charliecloud.enabled = false
    docker.userEmulation = true
  }
  singularity {
    docker.enabled = false
    singularity.enabled = true
    podman.enabled = false
    shifter.enabled = false
    charliecloud.enabled = false
    singularity.autoMounts = true
    singularity.enabled = true
  }
  podman {
    singularity.enabled = false
    docker.enabled = false
    podman.enabled = true
    shifter.enabled = false
    charliecloud.enabled = false
  }
  shifter {
    singularity.enabled = false
    docker.enabled = false
    podman.enabled = false
    shifter.enabled = true
    charliecloud.enabled = false
  }
  charliecloud {
    singularity.enabled = false
    docker.enabled = false
    podman.enabled = false
    shifter.enabled = false
    charliecloud.enabled = true
  }
  test                { includeConfig 'conf/test.config' }
  test_annotation     { includeConfig 'conf/test_annotation.config' }
  test_use_gatk_spark { includeConfig 'conf/test_use_gatk_spark.config' }
  test_split_fastq    { includeConfig 'conf/test_split_fastq.config' }
  test_targeted       { includeConfig 'conf/test_targeted.config' }
  test_tool           { includeConfig 'conf/test_tool.config' }
  test_trimming       { includeConfig 'conf/test_trimming.config' }
  test_umi_tso        { includeConfig 'conf/test_umi_tso.config' }
  test_umi_qiaseq     { includeConfig 'conf/test_umi_qiaseq.config' }
}

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

// Export these variables to prevent local Python/R libraries from conflicting with those in the container
env {
  PYTHONNOUSERSITE = 1
  R_PROFILE_USER = "/.Rprofile"
  R_ENVIRON_USER = "/.Renviron"
}

// Export these variables to prevent local Python/R libraries from conflicting with those in the container
env {
  PYTHONNOUSERSITE = 1
  R_PROFILE_USER = "/.Rprofile"
  R_ENVIRON_USER = "/.Renviron"
}

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

def trace_timestamp = new java.util.Date().format( 'yyyy-MM-dd_HH-mm-ss')
timeline {
  enabled = true
  file = "${params.tracedir}/execution_timeline_${trace_timestamp}.html"
}
report {
  enabled = true
  file = "${params.tracedir}/execution_report_${trace_timestamp}.html"
}
timeline {
  enabled = true
  file = "${params.tracedir}/execution_trace_${trace_timestamp}.txt"
}
trace {
  enabled = true
  file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg"
}
dag {
  enabled = true
  file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.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 = '>=20.04.0'
  version = '2.7.1'
}

// 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"
    }
}