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'
        ]
        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'
        ]
    }

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

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

    //*****************************************
    // 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'
        ]
    }

    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.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 = { "${meta.id}_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'
    }

    //********************************
    // 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'
    }

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