process {

    //Default
    publishDir = [
        path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" },
        mode: 'copy',
        saveAs: { filename -> filename.equals('versions.yml') ? null : filename }
    ]

    withName: 'CUSTOM_DUMPSOFTWAREVERSIONS' {
        publishDir = [
            path: { "${params.outdir}/pipeline_info" },
            mode: 'copy',
            pattern: '*_versions.yml'
        ]
    }

    //**********************************************
    // PREPARE_GENOME
    withName: 'BOWTIE2_BUILD' {
        publishDir = [
            path: { "${params.outdir}/genome/bowtie2" },
            mode: 'copy',
            enabled: params.save_reference
        ]
    }

    withName: 'CUSTOM_GETCHROMSIZES' {
        publishDir = [
            path: { "${params.outdir}/genome" },
            mode: 'copy',
            enabled: params.save_reference
        ]
    }

    withName: 'GET_RESTRICTION_FRAGMENTS' {
        publishDir = [
            path: { "${params.outdir}/genome" },
            mode: 'copy',
            enabled: params.save_reference
        ]
    }

    //*******************************************
    // HICPRO
    withName: 'BOWTIE2_ALIGN' {
        publishDir = [
            path: { "${params.outdir}/hicpro/mapping" },
            mode: 'copy',
            enabled: params.save_aligned_intermediates
        ]
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}" }
        ext.args = params.bwt2_opts_end2end ?: ''
        ext.args2 = !params.dnase ? "-F 4" :""
    }

    withName: 'TRIM_READS' {
        publishDir = [
            path: { "${params.outdir}/hicpro/mapping/" },
            mode: 'copy',
            enabled: params.save_aligned_intermediates
        ]
    }

    withName: 'BOWTIE2_ALIGN_TRIMMED' {
        publishDir = [
            path: { "${params.outdir}/hicpro/mapping" },
            mode: 'copy',
            enabled: params.save_aligned_intermediates
        ]
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}_trimmed" }
        ext.args = params.bwt2_opts_trimmed ?: ''
        ext.args2 = ""
    }

    withName: 'MERGE_BOWTIE2' {
        publishDir = [
            path: { "${params.outdir}/hicpro/mapping" },
            mode: 'copy',
            enabled: params.save_aligned_intermediates
        ]
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}" }
    }

    withName: 'COMBINE_MATES' {
        publishDir = [
            path: { "${params.outdir}/hicpro/mapping" },
            mode: 'copy',
            pattern: '*.bam',
            enabled: params.save_bam
        ]
        ext.args = [
            "-t",
            params.keep_multi ? "--multi" : "",
            params.min_mapq ? "-q ${params.min_mapq}" : ""
        ].join(' ').trim()
        ext.prefix = { "${meta.id}_${meta.chunk}" }
    }

    withName: 'GET_VALID_INTERACTION' {
        publishDir = [
            path: { "${params.outdir}/hicpro/valid_pairs" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename},
            mode: 'copy',
            enabled: params.save_pairs_intermediates
        ]
        ext.args = { [
            params.min_cis_dist > 0 ? " -d ${params.min_cis_dist}" : '',
            params.min_insert_size > 0 ?  " -s ${params.min_insert_size}" : '',
            params.max_insert_size > 0 ? " -l ${params.max_insert_size}" : '',
            params.min_restriction_fragment_size > 0 ? " -t ${params.min_restriction_fragment_size}" : '',
            params.max_restriction_fragment_size > 0 ? " -m ${params.max_restriction_fragment_size}" : '',
            params.save_interaction_bam ? " --sam" : ''
        ].join(' ').trim() }
    }

    withName: 'GET_VALID_INTERACTION_DNASE' {
        publishDir = [
            path: { "${params.outdir}/hicpro/valid_pairs" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy',
            enabled: params.save_pairs_intermediates
        ]
        ext.args = { params.min_cis_dist > 0 ? " -d ${params.min_cis_dist}" : "" }
    }

    withName: 'MERGE_VALID_INTERACTION' {
        publishDir = [
            [
                path: { "${params.outdir}/hicpro/stats/${meta.id}" },
                mode: 'copy',
                pattern: "*stat"
            ],
            [
                path: { "${params.outdir}/hicpro/valid_pairs" },
                mode: 'copy',
                saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
                pattern: "*Pairs"
            ]
        ]
        ext.args = { params.keep_dups ? '' : '-d' }
    }

    withName: 'MERGE_STATS' {
        publishDir = [
            path: { "${params.outdir}/hicpro/stats/${meta.id}" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy',
            pattern: "*stat"
        ]
    }

    withName: 'HICPRO2PAIRS' {
        publishDir = [
            path: { "${params.outdir}/hicpro/valid_pairs/pairix/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy',
            enabled: params.save_pairs
        ]
    }

    withName: 'BUILD_CONTACT_MAPS' {
        publishDir = [
            path: { "${params.outdir}/hicpro/matrix/raw" },
            mode: 'copy',
            enabled: params.hicpro_maps
        ]
        ext.prefix = { "${meta.id}.${resolution}" }
    }

    withName: 'ICE_NORMALIZATION' {
        publishDir = [
            path: { "${params.outdir}/hicpro/matrix/iced" },
            mode: 'copy',
            enabled: params.hicpro_maps
        ]
    }

    //*******************************************
    // HICSTUFF
    withName: 'BOWTIE2_ALIGNMENT' {
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}" }
        ext.args = params.hicstuff_bwt2_align_opts
        publishDir = [
            path: { "${params.outdir}/hicstuff/reads"},
            mode: 'copy',
            enabled: params.save_bam
        ]
    }

    withName: 'FRAGMENT_ENZYME' {
        ext.args = { [
            " -m ${params.hicstuff_min_size}",
            " -c ${params.hicstuff_circular}",
            " -o ${params.hicstuff_output_contigs}",
            " -f ${params.hicstuff_output_frags}",
            " -p ${params.hicstuff_frags_plot}",
            " -g ${params.hicstuff_frags_plot_path}"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/hicstuff/fragment_enzyme" },
            mode: 'copy',
            enabled: params.save_fragments
        ]
    }

    withName: 'BAM2PAIRS' {
        ext.pairs = params.hicstuff_valid_pairs
        ext.index = params.hicstuff_valid_idx
        ext.args = { [
            " -q ${params.min_mapq}",
            " -c ${params.hicstuff_circular}"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/hicstuff/pairs" },
            mode: 'copy',
            enabled: params.save_pairs
        ]
    }

    withName: 'FILTER_EVENT' {
        ext.args = { [
           " -o ${params.hicstuff_valid_idx_filtered}",
           " --plot ${params.hicstuff_plot_events}",
           " -d ${params.hicstuff_dist_plot}",
           " -q ${params.hicstuff_pie_plot}"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/hicstuff/pairs" },
            mode: 'copy',
            enabled: params.save_pairs_intermediates
        ]
    }

    withName: 'DISTANCE_LAW' {
        ext.args = { [
            " -c ${params.hicstuff_centro_file}",
            " -b ${params.hicstuff_base}",
            " -o ${params.hicstuff_distance_out_file}",
            " -u ${params.hicstuff_circular}",
            " -r ${params.hicstuff_rm_centro}",
            " -l ${params.hicstuff_distance_plot}",
            " -d ${params.hicstuff_distance_out_plot}"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/hicstuff/pairs" },
            mode: 'copy',
            enabled: params.save_pairs_intermediates
        ]
    }

    withName: 'FILTER_PCR' {
        ext.args = { [
            "-o ${params.hicstuff_filter_pcr_out_file}"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/hicstuff/pairs" },
            mode: 'copy',
            enabled: params.save_pairs_intermediates
        ]
    }

    withName: 'BUILD_MATRIX' {
        ext.args = params.hicstuff_matrix
        publishDir = [
            path: { "${params.outdir}/hicstuff/matrix" },
            mode: 'copy'
        ]
    }
    withName: 'BUILD_MATRIX_COOL' {
        ext.args = params.hicstuff_matrix
        publishDir = [
            path: { "${params.outdir}/hicstuff/matrix" },
            mode: 'copy'
        ]
    }

    //*****************************************
    // QUALITY METRICS

    withName: 'HIC_PLOT_DIST_VS_COUNTS'{
        publishDir = [
            path: { "${params.outdir}/distance_decay/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
    }

    //*****************************************
    // COOLER

    withName: 'COOLER_MAKEBINS' {
        publishDir = [
            path: { "${params.outdir}/contact_maps/bins/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.prefix={ "cooler_bins_${cool_bin}" }
    }

    withName: 'COOLER_CLOAD' {
        publishDir = [
            path: { "${params.outdir}/contact_maps/cool/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy',
            enabled : params.save_raw_maps
        ]
        ext.prefix = { "${meta.id}.${cool_bin}" }
        ext.args = "pairs -c1 2 -p1 3 -c2 4 -p2 5"
    }

    withName: 'COOLER_BALANCE' {
        publishDir = [
            path: { "${params.outdir}/contact_maps/cool/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.args = '--force'
        ext.prefix = { "${cool.baseName}_balanced" }
    }

    withName: 'COOLER_DUMP' {
        publishDir = [
            enabled: false
        ]
        ext.prefix = { "${cool.baseName}" }
        ext.args = "--one-based-ids --balanced --na-rep 0"
    }

    withName:'SPLIT_COOLER_DUMP' {
        publishDir = [
            [
                path: { "${params.outdir}/contact_maps/txt/" },
                mode: 'copy',
                pattern: "*_raw.txt",
                enabled: params.save_raw_maps
            ],
            [
                path: { "${params.outdir}/contact_maps/txt/" },
                mode: 'copy',
                pattern: "*_balanced.txt"
            ]
        ]
    }

    withName: 'COOLER_ZOOMIFY' {
        publishDir = [
            path: { "${params.outdir}/contact_maps/cool/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.args = "--balance"
    }

    //********************************
    // COMPARTMENTS

    withName: 'COOLTOOLS_EIGSCIS' {
        publishDir = [
            path: { "${params.outdir}/compartments/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.args = '--bigwig'
        ext.prefix = { "${meta.id}.${resolution}" }
    }

    //********************************
    // TADS

    withName: 'COOLTOOLS_INSULATION' {
        publishDir = [
            path: { "${params.outdir}/tads/insulation/" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.args = '15 25 50 --window-pixels'
        ext.prefix = { "${cool.baseName}" }
    }

    withName: 'HIC_FIND_TADS' {
        publishDir = [
            path: { "${params.outdir}/tads/hicExplorer" },
            saveAs: { filename -> filename.equals('versions.yml') ? null : filename },
            mode: 'copy'
        ]
        ext.args = '--correctForMultipleTesting fdr'
        ext.prefix = { "${cool.baseName}" }
    }

    withName: 'HIC_PLOT_MATRIX' {
      publishDir = [
          path: { "${params.outdir}/matrices/" },
          mode: 'copy'
        ]
      ext.args = '--log --perChromosome'
      ext.prefix = { "${cool.baseName}" }
    }

    //********************************
    // FILTER_PCR_DUP

    withName: 'PICARD_MARKDUPLICATES' {
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}" }
        ext.args = { [
            "--REMOVE_DUPLICATES true"
        ].join('').trim() }
        publishDir = [
            path: { "${params.outdir}/picard/bam" },
            mode: 'copy',
            enabled: params.save_bam_intermediates
        ]
    }

    withName: 'SAMTOOLS_SORT' {
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}_sorted" }
        ext.args = { [
            ""
        ].join('').trim() }
    }

    withName: 'SAMTOOLS_SORT_N' {
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}_nsorted" }
        ext.args = { [
            "-n"
        ].join('').trim() }
    }

    //********************************
    withName: 'CUTSITE' {
        ext.output_for = { "${meta1.id}_${meta1.chunk}_${meta1.mates}_digested.fastq" }
        ext.output_rev = { "${meta2.id}_${meta2.chunk}_${meta2.mates}_digested.fastq" }
        ext.args = { [
            " -m ${params.cutsite_mode}",
            " -s ${params.cutsite_seed}"
            ].join('').trim()
        }
        publishDir = [
            path: { "${params.outdir}/cutsite/digested"},
            mode: 'copy',
            enabled: params.save_digested
        ]
    }

    withName: 'ITERALIGN' {
        ext.prefix = { "${meta.id}_${meta.chunk}_${meta.mates}" }
        ext.args = { [
            " -t ${params.hicstuff_tmp_dir}",
            " -m ${params.min_mapq}",
            " -l ${params.hicstuff_read_len}"
            ].join('').trim()
        }
        publishDir = [
            path: { "${params.outdir}/iteralign" },
            mode: 'copy',
            enabled: params.save_bam
        ]
    }
}