Skip to content
Snippets Groups Projects
Select Git revision
  • e55ab8a33cdc6dae24e86148bdfde49411eb9461
  • master default protected
  • fmortreu-master-patch-11d2
  • origin_hicstuff
  • dev
  • modified_containers
  • hicstuff
  • nico
  • TEMPLATE
  • nf-core-template-merge-2.7.2
  • nf-core-template-merge-2.7.1
  • nf-core-template-merge-2.6
  • nf-core-template-merge-2.5.1
  • nf-core-template-merge-2.5
  • nf-core-template-merge-2.4
  • nf-core-template-merge-2.3.2
  • nf-core-template-merge-2.3.1
  • nf-core-template-merge-2.3
  • nf-core-template-merge-2.2
  • nf-core-template-merge-2.1
  • nf-core-template-merge-2.0.1
  • 1.3.0
  • 1.2.2
  • 1.2.1
  • 1.2.0
  • 1.1.0
  • 1.0.0
27 results

hic.nf

Blame
  • Mia Croiset's avatar
    47784de8
    History
    hic.nf 11.23 KiB
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        VALIDATE INPUTS
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params)
    
    // Validate input parameters
    WorkflowHic.initialise(params, log)
    
    // Check input path parameters to see if they exist
    def checkPathParamList = [ params.input ]
    checkPathParamList = [
        params.input, params.multiqc_config,
        params.fasta, params.bwt2_index
    ]
    
    for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } }
    
    // Check mandatory parameters
    if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' }
    
    //*****************************************
    // Digestion parameters
    if (params.digestion){
      restriction_site = params.digestion ? params.digest[ params.digestion ].restriction_site ?: false : false
      ch_restriction_site = Channel.value(restriction_site)
      ligation_site = params.digestion ? params.digest[ params.digestion ].ligation_site ?: false : false
      ch_ligation_site = Channel.value(ligation_site)
    }else if (params.restriction_site && params.ligation_site){
      ch_restriction_site = Channel.value(params.restriction_site)
      ch_ligation_site = Channel.value(params.ligation_site)
    }else if (params.dnase){
      ch_restriction_site = Channel.empty()
      ch_ligation_site = Channel.empty()
    }else{
       exit 1, "Ligation motif not found. Please either use the `--digestion` parameters or specify the `--restriction_site` and `--ligation_site`. For DNase Hi-C, please use '--dnase' option"
    }
    
    //****************************************
    // Combine all maps resolution for downstream analysis
    
    
    ch_map_res = WorkflowHic.checkIfInt(params.bin_size)
    
    if (params.res_zoomify){
      ch_zoom_res = Channel.from( params.res_zoomify ).splitCsv().flatten().toInteger()
      ch_map_res = ch_map_res.concat(ch_zoom_res)
    }
    
    if (params.res_tads && !params.skip_tads){
      ch_tads_res = WorkflowHic.checkIfInt(params.res_tads)
      ch_map_res = ch_map_res.concat(ch_tads_res)
    }else{
      ch_tads_res=Channel.empty()
      if (!params.skip_tads){
        log.warn "[nf-core/hic] Hi-C resolution for TADs calling not specified. See --res_tads"
      }
    }
    
    if (params.res_dist_decay && !params.skip_dist_decay){
      ch_ddecay_res = WorkflowHic.checkIfInt(params.res_dist_decay)
      ch_map_res = ch_map_res.concat(ch_ddecay_res)
    }else{
      ch_ddecay_res = Channel.empty()
      if (!params.skip_dist_decay){
        log.warn "[nf-core/hic] Hi-C resolution for distance decay not specified. See --res_dist_decay"
      }
    }
    
    if (params.res_compartments && !params.skip_compartments){
      ch_comp_res = WorkflowHic.checkIfInt(params.res_compartments)
      ch_map_res = ch_map_res.concat(ch_comp_res)
    }else{
      ch_comp_res = Channel.empty()
      if (!params.skip_compartments){
        log.warn "[nf-core/hic] Hi-C resolution for compartment calling not specified. See --res_compartments"
      }
    }
    
    ch_map_res = ch_map_res.unique()
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        CONFIG FILES
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    ch_multiqc_config          = Channel.fromPath("$projectDir/assets/multiqc_config.yml", checkIfExists: true)
    ch_multiqc_custom_config   = params.multiqc_config ? Channel.fromPath( params.multiqc_config, checkIfExists: true ) : Channel.empty()
    ch_multiqc_logo            = params.multiqc_logo   ? Channel.fromPath( params.multiqc_logo, checkIfExists: true ) : Channel.empty()
    ch_multiqc_custom_methods_description = params.multiqc_methods_description ? file(params.multiqc_methods_description, checkIfExists: true) : file("$projectDir/assets/methods_description_template.yml", checkIfExists: true)
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        IMPORT LOCAL MODULES/SUBWORKFLOWS
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    //
    // MODULE: Local to the pipeline
    //
    include { HIC_PLOT_DIST_VS_COUNTS } from '../modules/local/hicexplorer/hicPlotDistVsCounts'
    include { HIC_PLOT_MATRIX } from '../modules/local/hicexplorer/hicPlotMatrix'
    include { MULTIQC } from '../modules/local/multiqc'
    
    //
    // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules
    //
    include { INPUT_CHECK } from '../subworkflows/local/input_check'
    include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome'
    include { HICSTUFF } from '../subworkflows/local/hicstuff'
    include { HICPRO } from '../subworkflows/local/hicpro'
    include { COOLER } from '../subworkflows/local/cooler'
    include { COMPARTMENTS } from '../subworkflows/local/compartments'
    include { TADS } from '../subworkflows/local/tads'
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        IMPORT NF-CORE MODULES/SUBWORKFLOWS
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    //
    // MODULE: Installed directly from nf-core/modules
    //
    include { FASTQC                      } from '../modules/nf-core/fastqc/main'
    include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/custom/dumpsoftwareversions/main'
    include { CUTSITE }                     from '../modules/local/hicstuff/cutsite'
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      CHANNELS
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    Channel.fromPath( params.fasta )
           .ifEmpty { exit 1, "Genome index: Fasta file not found: ${params.fasta}" }
           .map{it->[[:],it]}
           .set { ch_fasta }
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        RUN MAIN WORKFLOW
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    // Info required for completion email and summary
    def multiqc_report = []
    
    // Paired-end to Single-end
    def pairToSingle(row, mates) {
        def meta = row[0].clone()
        meta.single_end = true
        meta.mates = mates
        if (mates == "R1" | mates == "1") {
            return [meta, [ row[1][0]] ]
        }else if (mates == "R2" | mates == "2"){
            return [meta, [ row[1][1]] ]
        }
    }
    
    workflow HIC {
    
      ch_versions = Channel.empty()
    
      //
      // SUBWORKFLOW: Read in samplesheet, validate and stage input files
      //
      INPUT_CHECK (
        ch_input
      )
      ch_reads = INPUT_CHECK.out.reads
    
      //
      // SUBWORKFLOW: Prepare genome annotation
      //
      PREPARE_GENOME(
        ch_fasta,
        ch_restriction_site
      )
      ch_versions = ch_versions.mix(PREPARE_GENOME.out.versions)
    
      //
      // MODULE: Run FastQC
      //
      FASTQC (
        INPUT_CHECK.out.reads
      )
      ch_versions = ch_versions.mix(FASTQC.out.versions)
    
    
        if (params.cutsite){
            // Align each mates separetly and add mates information in [meta]
            ch_reads_r1 = ch_reads.map{ it -> pairToSingle(it,"R1") }
            ch_reads_r2 = ch_reads.map{ it -> pairToSingle(it,"R2") }
            ch_reads = ch_reads_r1.concat(ch_reads_r2)
    
            ch_reads.combine(ch_reads)
            .map {
                meta1, reads1, meta2, reads2 ->
                    meta1.id == meta2.id && meta1.chunk == meta2.chunk && meta1.mates == "R1" && meta2.mates == "R2" ? [ meta1,  reads1,  meta2, reads2 ] : null
            }.set{ new_ch_reads }
            CUTSITE(
                new_ch_reads,
                params.digestion
            )
            ch_reads = CUTSITE.out.fastq
            ch_versions = ch_versions.mix(CUTSITE.out.versions)
        }
    
      //
      // SUB-WORFLOW: HiC-Pro
      //
      if (params.workflow == "hicpro"){
        HICPRO (
            ch_reads,
            PREPARE_GENOME.out.index,
            PREPARE_GENOME.out.res_frag,
            PREPARE_GENOME.out.chromosome_size,
            ch_ligation_site,
            ch_map_res,
            ch_fasta
        )
        ch_mqc = HICPRO.out.mqc
        ch_versions = ch_versions.mix(HICPRO.out.versions)
    
      //
      // SUB-WORKFLOW: COOLER
      //
      COOLER (
        HICPRO.out.pairs,
        PREPARE_GENOME.out.chromosome_size,
        ch_map_res
      )
      ch_versions = ch_versions.mix(COOLER.out.versions)
    
      //
      // MODULE: HICEXPLORER/HIC_PLOT_DIST_VS_COUNTS
      //
      if (!params.skip_dist_decay){
        COOLER.out.cool
          .combine(ch_ddecay_res)
          .filter{ it[0].resolution == it[2] }
          .map { it -> [it[0], it[1]]}
          .set{ ch_distdecay }
    
        HIC_PLOT_DIST_VS_COUNTS(
          ch_distdecay
        )
        ch_versions = ch_versions.mix(HIC_PLOT_DIST_VS_COUNTS.out.versions)
      }
      ch_cool = COOLER.out.cool
    }
    
      else {
        HICSTUFF(
            ch_reads,
            PREPARE_GENOME.out.index,
            ch_ligation_site,
            params.digestion, //str enzyme
            ch_fasta,
            PREPARE_GENOME.out.chromosome_size
        )
        ch_cool = HICSTUFF.out.cool
        ch_mqc = Channel.empty()
        ch_versions = ch_versions.mix(HICSTUFF.out.versions)
      }
    
      //
      // MODULE: HICEXPLORER/HIC_PLOT_MATRIX
      //
      if (!params.skip_plot_matrix){
        HIC_PLOT_MATRIX(
            ch_cool
        )
      ch_versions = ch_versions.mix(HIC_PLOT_MATRIX.out.versions)
      }
    
      //
      // SUB-WORKFLOW: COMPARTMENT CALLING
      //
      if (!params.skip_compartments){
        ch_cool
          .combine(ch_comp_res)
          .filter{ it[0].resolution == it[2] }
          .map { it -> [it[0], it[1], it[2]]}
          .set{ ch_cool_compartments }
    
        COMPARTMENTS (
          ch_cool_compartments,
          ch_fasta,
          PREPARE_GENOME.out.chromosome_size
        )
        ch_versions = ch_versions.mix(COMPARTMENTS.out.versions)
      }
    
      //
      // SUB-WORKFLOW : TADS CALLING
      //
      if (!params.skip_tads){
        ch_cool
          .combine(ch_tads_res)
          .filter{ it[0].resolution == it[2] }
          .map { it -> [it[0], it[1]]}
          .set{ ch_cool_tads }
    
        TADS(
          ch_cool_tads
        )
        ch_versions = ch_versions.mix(TADS.out.versions)
      }
    
      //
      // SOFTWARE VERSION
      //
      CUSTOM_DUMPSOFTWAREVERSIONS(
        ch_versions.unique().collectFile(name: 'collated_versions.yml')
      )
    
      //
      // MODULE: MultiQC
      //
      workflow_summary    = WorkflowHic.paramsSummaryMultiqc(workflow, summary_params)
      ch_workflow_summary = Channel.value(workflow_summary)
    
      ch_multiqc_files = Channel.empty()
      ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_config)
      ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([]))
      ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'))
      ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.map{it->it[1]})
      ch_multiqc_files = ch_multiqc_files.mix(ch_mqc)
    
      MULTIQC (
        ch_multiqc_config,
        ch_multiqc_custom_config.collect().ifEmpty([]),
        ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml'),
        FASTQC.out.zip.map{it->it[1]},
        ch_mqc.collect()
      )
      multiqc_report = MULTIQC.out.report.toList()
    }
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        COMPLETION EMAIL AND SUMMARY
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */
    
    workflow.onComplete {
        if (params.email || params.email_on_fail) {
            NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report)
        }
        NfcoreTemplate.summary(workflow, params, log)
        if (params.hook_url) {
            NfcoreTemplate.IM_notification(workflow, params, summary_params, projectDir, log)
        }
    }
    
    /*
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        THE END
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    */