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

// Global default params, used in configs
params {

  //--------
  // Workflow flags:
  //--------
  genome_host = false
  genome_pathogen = false
  input = "data/*{1,2}.fastq.gz"
  single_end = false
  outdir = './results'
  publish_dir_mode = 'copy'

  //--------
  // Cutadapt:
  //--------
  run_cutadapt = false
  a = "AGATCGGAAGAGCACACGTCTGAACTCCAGTCA"
  A = "AGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGT"
  quality_cutoff = "10"
  cutadapt_params = ""
  
  
  //--------
  // BBDuk:
  //--------
  run_bbduk = false
  minlen = "18"
  qtrim = "r"
  trimq = "10"
  ktrim = "r"
  k = "17"
  mink = "11"
  hdist = "1"
  adapters = "$projectDir/assets/adapters.fa"
  bbduk_params = ""

  //--------
  // FastQC:
  //--------
  skip_fastqc = false
  fastqc_params = ""
  
  //--------
  // Salmon - general options available for both modes, Selective Alignment and alignment-based mode
  //--------
  libtype = ''
  generate_salmon_uniq_ambig = false
  incompatPrior = 0.0
  gene_attribute_gff_to_create_transcriptome_host = "transcript_id"
  gene_feature_gff_to_create_transcriptome_host = ["exon", "tRNA"]
  gene_attribute_gff_to_create_transcriptome_pathogen = "locus_tag"
  gene_feature_gff_to_create_transcriptome_pathogen = ["gene","sRNA","tRNA","rRNA"]
  read_transcriptome_fasta_host_from_file = false 
  read_transcriptome_fasta_pathogen_from_file = false 

  //--------
  // Salmon Selective Alignment
  //--------
  run_salmon_selective_alignment = false
  kmer_length = 21
  writeUnmappedNames = false
  softclipOverhangs = false
  dumpEq = false
  writeMappings = false
  keepDuplicates = false
  salmon_sa_params_index = ""
  salmon_sa_params_mapping = ""


  //--------
  // STAR - general options available for both modes, genome mapping with HTSeq quantification and salmon - alignment-based mode:
  //--------
  run_star = false
  outSAMunmapped = "Within"
  outSAMattributes = "Standard"
  outFilterMultimapNmax = 999
  outFilterType = "BySJout"
  alignSJoverhangMin = 8
  alignSJDBoverhangMin = 1
  outFilterMismatchNmax = 999
  outFilterMismatchNoverReadLmax = 1
  alignIntronMin = 20
  alignIntronMax = 1000000
  alignMatesGapMax = 1000000
  limitBAMsortRAM = 0
  winAnchorMultimapNmax = 999
  sjdbOverhang = 100


  //--------
  // STAR - additional options available only for genome mapping with HTSeq quantification mode
  //--------
  outWigType = "None"
  outWigStrand = "Stranded"
  star_index_params = ""
  star_alignment_params = ""

  //--------
  // STAR - additional options available only for Salmon - alignment-based mode:
  //--------
  quantTranscriptomeBan = "Singleend"
  star_salmon_index_params = ""
  star_salmon_alignment_params = ""

  //--------
  // Salmon - alignment-based mode:
  //--------
  run_salmon_alignment_based_mode = false
  salmon_alignment_based_params = ""

  //--------
  // HTSeq:
  //--------
  run_htseq_uniquely_mapped = false
  stranded = "yes"
  max_reads_in_buffer = 30000000
  minaqual = 10
  gene_feature_gff_to_quantify_host = ["exon","tRNA"]
  gene_feature_gff_to_quantify_pathogen = ["gene", "sRNA", "tRNA", "rRNA"]
  host_gff_attribute = "gene_id"
  pathogen_gff_attribute = "locus_tag"
  htseq_params = ""
  
  //--------
  // mapping statistics:
  //--------
  mapping_statistics = false
  rna_classes_to_replace_host = "$projectDir/data/RNA_classes_to_replace.tsv"
  
  

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


  //--------
  // Options: Other:
  //--------
  name = false
  multiqc_config = false
  email = false
  email_on_fail = false
  max_multiqc_email_size = 25.MB
  plaintext_email = false
  monochrome_logs = false
  help = false
  tracedir = "${params.outdir}/pipeline_info"
                                                                         
  // Defaults only, expecting to be overwritten
  max_memory = 128.GB
  max_cpus = 16
  max_time = 240.h

}


//--------
// Work directory:
//--------
//This location stores the working temporary files and downloaded images
//Note: If commented out - errors sometimes occur re failing to publish files (although files are published correctly)
workDir = "$projectDir/work"


//--------
// Container:
//--------
process.container = 'nfcore/dualrnaseq:1.0.0'

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


//Option to use a custom configuration file (which is included in conf/genomes.conf)
//false is default and thus the config file will be used. 
//To not use, you can simply pass --genomes_ignore on the command line
genomes_ignore = false 

// Load genomes.config if required 
if (!params.genomes_ignore) {
  includeConfig 'conf/genomes.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/dualrnaseq custom profiles from different Institutions
//try {
//  includeConfig "${params.custom_config_base}/pipeline/dualrnaseq.config"
//} catch (Exception e) {
//  System.err.println("WARNING: Could not load nf-core/config/dualrnaseq profiles: ${params.custom_config_base}/pipeline/dualrnaseq.config")
//}

// to read your own custom genome file named computing_platform.config and saved in conf folder. 
//includeConfig 'conf/computing_platform.config'                                                             


// Load genomes.config if required 
if (!params.genomes_ignore) {
  includeConfig 'conf/genomes.config'
}


profiles {
  conda { process.conda = "$projectDir/environment.yml" }
  debug { process.beforeScript = 'echo $HOSTNAME' }
  docker {
    docker.enabled = true
    // Avoid this error:
    //   WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
    // Testing this in nf-core after discussion here https://github.com/nf-core/tools/pull/351
    // once this is established and works well, nextflow might implement this behavior as new default.
    docker.runOptions = '-u \$(id -u):\$(id -g)'
  }
  singularity {
    singularity.enabled = true
    singularity.autoMounts = true
    singularity.cacheDir = "$projectDir/work/singularity"
  }
  podman {
    podman.enabled = true
  }
  test { includeConfig 'conf/test.config' }
  test_full { includeConfig 'conf/test_full.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"
}

// 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/dualrnaseq'
  author = 'Bozena Mika-Gospodorz and Regan Hayward'
  homePage = 'https://github.com/nf-core/dualrnaseq'
  description = 'Dual RNA-seq pipeline'
  mainScript = 'main.nf'
  nextflowVersion = '>=20.10.0'
  version = '1.0.0'
}

// Function to ensure that resource requirements don't go beyond
// a maximum limit
def check_max(obj, type) {
  if (type == 'memory') {
    try {
      if (obj.compareTo(params.max_memory as nextflow.util.MemoryUnit) == 1)
        return params.max_memory as nextflow.util.MemoryUnit
      else
        return obj
    } catch (all) {
      println "   ### ERROR ###   Max memory '${params.max_memory}' is not valid! Using default value: $obj"
      return obj
    }
  } else if (type == 'time') {
    try {
      if (obj.compareTo(params.max_time as nextflow.util.Duration) == 1)
        return params.max_time as nextflow.util.Duration
      else
        return obj
    } catch (all) {
      println "   ### ERROR ###   Max time '${params.max_time}' is not valid! Using default value: $obj"
      return obj
    }
  } else if (type == 'cpus') {
    try {
      return Math.min( obj, params.max_cpus as int )
    } catch (all) {
      println "   ### ERROR ###   Max cpus '${params.max_cpus}' is not valid! Using default value: $obj"
      return obj
    }
  }
}
